fix(deps): move ai-factory to dependencies, probe at agent boot#114
Conversation
The agent invokes the ai-factory CLI at task-run time to scaffold
.ai-factory/ inside every user project (packages/runtime/projectInit.ts).
This is a hard runtime requirement, not a developer-only convenience —
yet the package was declared in devDependencies. With npm ci --omit=dev
or NODE_ENV=production npm install, ai-factory is not installed; the
runtime then falls back to `npx ai-factory ...`, which silently requires
network access to the npm registry at task time. In air-gapped or
offline-deployed installations every task fails with a buried
"Project .ai-factory/ scaffold missing" warning.
Changes:
- Move `ai-factory` from devDependencies to dependencies in root
package.json. Reflowed package-lock.json: lines that look unrelated
(libc array drops, dev→peer flag flips on optional native binaries)
come from npm 10.9.7 normalising the existing lockfile and are not
deliberate edits.
- Probe `require.resolve('ai-factory/bin/ai-factory.js')` at agent boot
(packages/agent/src/index.ts). Log a clear warning if the CLI is not
resolvable so the failure is diagnosable from the first agent log
line, instead of surfacing later as a per-task skip.
- Document the requirement in the README Quick Start so installers know
why ai-factory must be in node_modules and what happens otherwise.
No behavioural change for default `npm install` flows — ai-factory was
already resolvable; this PR makes it resolvable for production install
modes as well.
Code reviewThis PR moves Must fixNone. Should fixNone. NitsNone. Context gates
Verification
Verdict: COMMENT - no blocking findings, but GitHub reports no CI check rollup for this PR. |
Code reviewThe PR appears to close #113 by moving Response pass
What looks good
Must fix
Should fix
NitsNone. Context gates
VerdictVerdict: REQUEST_CHANGES until the branch is rebased onto current |
|
@sochkasov ping |
Stale after maintainer update: branch merged current main, lockfile resolved, and CI is green.
Closes #113.
Что и зачем
Цель — сделать
ai-factoryкорректной runtime-зависимостью и превратить silent task-skip в видимую boot-time диагностику.Проблема
ai-factory@^2.10.0лежит вdevDependenciesкорневогоpackage.json, но фактически вызывается из production-runtime:packages/runtime/src/projectInit.ts:41резолвитai-factory/bin/ai-factory.jsдля каждого нового проекта, чтобы создать.ai-factory/scaffold. Сnpm ci --omit=devилиNODE_ENV=production npm installпакет не попадает вnode_modules; runtime тихо падает на fallbacknpx ai-factory ..., который требует сетевой доступ к npm registry на каждый task.Полное описание и сценарий — в #113.
Изменения
package.jsonai-factoryперенесён изdevDependenciesвdependenciesdependenciespackage-lock.jsonnpm installпод Node 22 / npm 10.9.7libc: glibcмассивов иdev:true → peer:trueна optional native binaries — это нормализация npm 10.9.7 существующего lockfile, не deliberate editspackages/agent/src/index.tsprobeAiFactory()в boot —require.resolve(\"ai-factory/bin/ai-factory.js\")с warning'омREADME.md--omit=devОбоснование выбранных решений
dependenciesкорректнее.agent/src/index.ts, а неdev.mjs.dev.mjsисполняется только в dev. Production-runtime (Docker / standalone) запускает агента напрямую. Probe вindex.tsсрабатывает в обоих сценариях.npxвсё ещё технически работает в средах с сетевым доступом. Принудительный exit сломал бы инсталляции, где админ сознательно полагается на npx (CI с агрессивным кэшем). Warning + явное упоминание dependency-перемещения даёт actionable путь без breaking-change.libc:[\"glibc\"]блоки иdev:true → peer:trueнормализация на optional native binaries (sharp, swc, esbuild platform-deps). Это побочный эффект npm 10.9.7, не deliberate. Если у maintainer'а другой npm, можно сделатьrm package-lock.json && npm installпод их версией — мой коммит не зависит от конкретного формата нормализации.Backward compatibility
npm installflow: без изменений — ai-factory как был, так и остаётся в node_modules.npm ci --omit=devflow: исправляется — ai-factory теперь устанавливается, агент работает offline-safe..docker/Dockerfile): без изменений —npm ci --ignore-scriptsуже не использовал--omit=dev, поведение идентичное.Проверка
node -e \"console.log(require.resolve('ai-factory/bin/ai-factory.js'))\"послеnpm install— резолвится вnode_modules/ai-factory/bin/ai-factory.js.npm run build --workspace=@aif/agent— зелёный.index.ts: визуально проверен через временный renamenode_modules/ai-factory→ старт агента → лог\"ai-factory CLI is not installed locally...\"появляется первой строкой послеgetEnv().Не вошло
claude,codex, etc.) — потенциально полезно, но scope другой.