{"_id":"@amsterdamdatalabs/enact-factory","_rev":"9-b98bca22188544ce188d2651d7a8d593","name":"@amsterdamdatalabs/enact-factory","dist-tags":{"latest":"0.1.45"},"versions":{"0.1.1":{"name":"@amsterdamdatalabs/enact-factory","version":"0.1.1","license":"UNLICENSED","_id":"@amsterdamdatalabs/enact-factory@0.1.1","maintainers":[{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"}],"bin":{"enact-factory":"dist/cli.js"},"dist":{"shasum":"e2ea39cb6560d5169ca0afee71b1ce15af0a0def","tarball":"https://registry.npmjs.org/@amsterdamdatalabs/enact-factory/-/enact-factory-0.1.1.tgz","fileCount":644,"integrity":"sha512-dmZCcUbtC9Lcsn8BSIyf/bkHh0e7hvtIjQep3cUwLBGre+IWX892X3/4JoTOeYCf3DHnhj5xlHGkI2HMcNeAwQ==","signatures":[{"sig":"MEUCIQDiW00UHezt+8UUwlLIyuaGYhD6MoQdYlyySLkylfHpCwIgOzEjGUDuK6W+kuTOMwyW2r8P+p4vSDa+7sOCcTFD/tc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4175501},"main":"dist/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","esbuild","protobufjs","sharp"]},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"gitHead":"449ee9567603befe5acdf58398faa5008f861776","scripts":{"ci":"npm run validate:yaml && npm run lint && npm run typecheck && npm run build","dev":"node --import=tsx src/index.ts","chat":"node --import=tsx src/support/chat.ts","lint":"oxlint src/","stop":"pkill -f 'node.*enact-factory' 2>/dev/null || echo 'No process running'","test":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run","build":"rm -rf dist && tsc && tsc-alias -p tsconfig.json && node scripts/copy-assets.mjs && chmod +x dist/cli.js","start":"node dist/index.js","predev":"pkill -f 'tsx src/index.ts' 2>/dev/null || true","cli:dev":"node --import=tsx src/cli.ts","prepack":"npm run validate:yaml && npm run build","prestart":"pkill -f 'dist/index.js' 2>/dev/null || true","typecheck":"tsc --noEmit","test:smoke":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run --config vitest.smoke.config.ts --maxWorkers 1 --no-file-parallelism","test:watch":"node --experimental-vm-modules node_modules/vitest/vitest.mjs","perf:measure":"tsx scripts/playwright-rendering-performance.ts","service:logs":"bash scripts/manage-service.sh logs stdout","service:stop":"bash scripts/manage-service.sh stop","service:start":"bash scripts/manage-service.sh start","validate:yaml":"node scripts/validate-yaml.mjs","service:errors":"bash scripts/manage-service.sh logs stderr","service:status":"bash scripts/manage-service.sh status","browser:install":"bash scripts/install-browser-launcher.sh","service:install":"bash scripts/install-service.sh","service:restart":"bash scripts/manage-service.sh restart","browser:uninstall":"bash scripts/uninstall-browser-launcher.sh","service:uninstall":"bash scripts/manage-service.sh uninstall","test:factory-smoke":"npm run test:smoke","sync:ghostty-themes":"node scripts/generate-ghostty-theme-catalog.mjs","eval:codex-ralph-mvp":"tsx scripts/codex-ralph-semantics-mvp.ts","test:factory-codex-e2e":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run src/omx/codexFactoryE2E.test.ts","test:dashboard-shell-smoke":"bash scripts/run-dashboard-theme-smokes.sh","test:dashboard-theme-smoke":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run --config vitest.smoke.config.ts tests/DashboardThemeTerminalBrowserSmoke.test.ts","test:factory-bootstrap-smoke":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run tests/factoryRuntimeBootstrapSmoke.test.ts"},"_npmUser":{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"},"_npmVersion":"10.9.8","description":"Enact Factory — autonomous AI agent orchestrator (Claude, GPT, Codex, local models)","directories":{},"_nodeVersion":"22.22.3","dependencies":{"pg":"^8.20.0","zod":"^4.3.6","yaml":"^2.8.2","croner":"^8.0.0","nanoid":"^5.1.7","blessed":"^0.1.81","commander":"^12.1.0","@iarna/toml":"^2.2.5","apache-arrow":"^18.1.0","@types/blessed":"^0.1.27","better-sqlite3":"^12.8.0","@lancedb/lancedb":"^0.23.0","@anthropic-ai/sdk":"^0.72.1","@xenova/transformers":"^2.17.2","@types/better-sqlite3":"^7.6.13","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","oxlint":"^1.43.0","vitest":"^4.0.18","@types/pg":"^8.20.0","bun-types":"^1.1.0","tsc-alias":"^1.8.17","playwright":"^1.47.0","typescript":"^5.9.3","@types/node":"^22.0.0","@vitest/coverage-v8":"^4.0.18"},"bundleDependencies":[],"_npmOperationalInternal":{"tmp":"tmp/enact-factory_0.1.1_1781821307507_0.5367032570852344","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@amsterdamdatalabs/enact-factory","version":"0.1.7","license":"UNLICENSED","_id":"@amsterdamdatalabs/enact-factory@0.1.7","maintainers":[{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"}],"bin":{"enact-factory":"dist/cli.js"},"dist":{"shasum":"aa564793c5726529dc17786f50b7370b4880cae2","tarball":"https://registry.npmjs.org/@amsterdamdatalabs/enact-factory/-/enact-factory-0.1.7.tgz","fileCount":665,"integrity":"sha512-0xTEgoW/22+gufqEZVLIhjjm/fhmLpNTeVtwoff8GuTJhHaIQDU9plaCaplD0bFULae49JmKo8A6AAT61zJUmQ==","signatures":[{"sig":"MEUCIFbfMnImclSDE5X61hR2vruNXsKVmtKPfq7c36BOYUwWAiEAzpm3LUdStRNYaIt39W4l+tsKgjbYPDjttdeRklBRPfg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4281415},"main":"dist/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","esbuild","protobufjs","sharp"]},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"gitHead":"6413cce956903f9d41815f15e1e81a1c54208e4f","scripts":{"ci":"npm run validate:yaml && npm run lint && npm run typecheck && npm run build","dev":"node --import=tsx src/index.ts","chat":"node --import=tsx src/support/chat.ts","lint":"oxlint src/","stop":"pkill -f 'node.*enact-factory' 2>/dev/null || echo 'No process running'","test":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run","build":"rm -rf dist && tsc && tsc-alias -p tsconfig.json && node scripts/copy-assets.mjs && chmod +x dist/cli.js","start":"node dist/index.js","predev":"pkill -f 'tsx src/index.ts' 2>/dev/null || true","cli:dev":"node --import=tsx src/cli.ts","prepack":"npm run validate:yaml && npm run build","prestart":"pkill -f 'dist/index.js' 2>/dev/null || true","typecheck":"tsc --noEmit","test:smoke":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run --config vitest.smoke.config.ts --maxWorkers 1 --no-file-parallelism","test:watch":"node --experimental-vm-modules node_modules/vitest/vitest.mjs","perf:measure":"tsx scripts/playwright-rendering-performance.ts","service:logs":"bash scripts/manage-service.sh logs stdout","service:stop":"bash scripts/manage-service.sh stop","service:start":"bash scripts/manage-service.sh start","validate:yaml":"node scripts/validate-yaml.mjs","service:errors":"bash scripts/manage-service.sh logs stderr","service:status":"bash scripts/manage-service.sh status","browser:install":"bash scripts/install-browser-launcher.sh","service:install":"bash scripts/install-service.sh","service:restart":"bash scripts/manage-service.sh restart","browser:uninstall":"bash scripts/uninstall-browser-launcher.sh","service:uninstall":"bash scripts/manage-service.sh uninstall","test:factory-smoke":"npm run test:smoke","sync:ghostty-themes":"node scripts/generate-ghostty-theme-catalog.mjs","eval:codex-ralph-mvp":"tsx scripts/codex-ralph-semantics-mvp.ts","test:factory-codex-e2e":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run src/omx/codexFactoryE2E.test.ts","test:dashboard-shell-smoke":"bash scripts/run-dashboard-theme-smokes.sh","test:dashboard-theme-smoke":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run --config vitest.smoke.config.ts tests/DashboardThemeTerminalBrowserSmoke.test.ts","test:factory-bootstrap-smoke":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run tests/factoryRuntimeBootstrapSmoke.test.ts"},"_npmUser":{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"},"_npmVersion":"10.9.8","description":"Enact Factory — autonomous AI agent orchestrator (Claude, GPT, Codex, local models)","directories":{},"_nodeVersion":"22.22.3","dependencies":{"pg":"^8.20.0","zod":"^4.3.6","yaml":"^2.8.2","croner":"^8.0.0","nanoid":"^5.1.7","blessed":"^0.1.81","commander":"^12.1.0","@iarna/toml":"^2.2.5","apache-arrow":"^18.1.0","@types/blessed":"^0.1.27","better-sqlite3":"^12.8.0","@lancedb/lancedb":"^0.23.0","@anthropic-ai/sdk":"^0.72.1","@xenova/transformers":"^2.17.2","@types/better-sqlite3":"^7.6.13","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","oxlint":"^1.43.0","vitest":"^4.0.18","@types/pg":"^8.20.0","bun-types":"^1.1.0","tsc-alias":"^1.8.17","playwright":"^1.47.0","typescript":"^5.9.3","@types/node":"^22.0.0","@vitest/coverage-v8":"^4.0.18"},"_npmOperationalInternal":{"tmp":"tmp/enact-factory_0.1.7_1781900164339_0.30008626177855646","host":"s3://npm-registry-packages-npm-production"}},"0.1.10":{"name":"@amsterdamdatalabs/enact-factory","version":"0.1.10","license":"UNLICENSED","_id":"@amsterdamdatalabs/enact-factory@0.1.10","maintainers":[{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"}],"bin":{"enact-factory":"dist/cli.js"},"dist":{"shasum":"83880888ead42e221de294fce815990f4309466c","tarball":"https://registry.npmjs.org/@amsterdamdatalabs/enact-factory/-/enact-factory-0.1.10.tgz","fileCount":665,"integrity":"sha512-MqloCIfl+hJBzlGxzxC5wTX39cYJDy4lyhcM8tqLlD1eYxUQPkcR2TmhQBSNq2hR65xOP1fOR9BiCZ1gA44+oA==","signatures":[{"sig":"MEYCIQDKykMjwTXeHdYHE9b8eKnK+b+iejxAfhU0QnOyGseJNgIhAOdKNtmqnQ7/922j8GIRrEsh4S+GsDSxpOMvc2KLT7yv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4283458},"main":"dist/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","esbuild","protobufjs","sharp"]},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"gitHead":"b7fe051f9df37c3f29e6f3fd6f1dac5be19d5acd","scripts":{"ci":"npm run validate:yaml && npm run lint && npm run typecheck && npm run build","dev":"node --import=tsx src/index.ts","chat":"node --import=tsx src/support/chat.ts","lint":"oxlint src/","stop":"pkill -f 'node.*enact-factory' 2>/dev/null || echo 'No process running'","test":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run","build":"rm -rf dist && tsc && tsc-alias -p tsconfig.json && node scripts/copy-assets.mjs && chmod +x dist/cli.js","start":"node dist/index.js","predev":"pkill -f 'tsx src/index.ts' 2>/dev/null || true","cli:dev":"node --import=tsx src/cli.ts","prepack":"npm run validate:yaml && npm run build","prestart":"pkill -f 'dist/index.js' 2>/dev/null || true","typecheck":"tsc --noEmit","test:smoke":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run --config vitest.smoke.config.ts --maxWorkers 1 --no-file-parallelism","test:watch":"node --experimental-vm-modules node_modules/vitest/vitest.mjs","perf:measure":"tsx scripts/playwright-rendering-performance.ts","service:logs":"bash scripts/manage-service.sh logs stdout","service:stop":"bash scripts/manage-service.sh stop","service:start":"bash scripts/manage-service.sh start","validate:yaml":"node scripts/validate-yaml.mjs","service:errors":"bash scripts/manage-service.sh logs stderr","service:status":"bash scripts/manage-service.sh status","browser:install":"bash scripts/install-browser-launcher.sh","service:install":"bash scripts/install-service.sh","service:restart":"bash scripts/manage-service.sh restart","browser:uninstall":"bash scripts/uninstall-browser-launcher.sh","service:uninstall":"bash scripts/manage-service.sh uninstall","test:factory-smoke":"npm run test:smoke","sync:ghostty-themes":"node scripts/generate-ghostty-theme-catalog.mjs","eval:codex-ralph-mvp":"tsx scripts/codex-ralph-semantics-mvp.ts","test:factory-codex-e2e":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run src/omx/codexFactoryE2E.test.ts","test:dashboard-shell-smoke":"bash scripts/run-dashboard-theme-smokes.sh","test:dashboard-theme-smoke":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run --config vitest.smoke.config.ts tests/DashboardThemeTerminalBrowserSmoke.test.ts","test:factory-bootstrap-smoke":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run tests/factoryRuntimeBootstrapSmoke.test.ts"},"_npmUser":{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"},"_npmVersion":"10.9.8","description":"Enact Factory — autonomous AI agent orchestrator (Claude, GPT, Codex, local models)","directories":{},"_nodeVersion":"22.22.3","dependencies":{"pg":"^8.20.0","zod":"^4.3.6","yaml":"^2.8.2","croner":"^8.0.0","nanoid":"^5.1.7","blessed":"^0.1.81","commander":"^12.1.0","@iarna/toml":"^2.2.5","apache-arrow":"^18.1.0","@types/blessed":"^0.1.27","better-sqlite3":"^12.8.0","@lancedb/lancedb":"^0.23.0","@anthropic-ai/sdk":"^0.72.1","@xenova/transformers":"^2.17.2","@types/better-sqlite3":"^7.6.13","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","oxlint":"^1.43.0","vitest":"^4.0.18","@types/pg":"^8.20.0","bun-types":"^1.1.0","tsc-alias":"^1.8.17","playwright":"^1.47.0","typescript":"^5.9.3","@types/node":"^22.0.0","@vitest/coverage-v8":"^4.0.18"},"_npmOperationalInternal":{"tmp":"tmp/enact-factory_0.1.10_1781916844749_0.6949854131163151","host":"s3://npm-registry-packages-npm-production"}},"0.1.14":{"name":"@amsterdamdatalabs/enact-factory","version":"0.1.14","license":"UNLICENSED","_id":"@amsterdamdatalabs/enact-factory@0.1.14","maintainers":[{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"}],"bin":{"enact-factory":"dist/cli.js"},"dist":{"shasum":"575e43ccd57fc566a1532eee947815edec5c06a4","tarball":"https://registry.npmjs.org/@amsterdamdatalabs/enact-factory/-/enact-factory-0.1.14.tgz","fileCount":666,"integrity":"sha512-tHL7Q9GU2qwQjMnkvR395OnsCgtsazKfS7e9jSA2oGtK4CvrOSrHuNd3hQnOkTVYxlyUaKzehIEc9i5tkBXLEA==","signatures":[{"sig":"MEUCIQDWRg7MLfKIEtCsINVC1zGaMJ9o/mv33YrWzVpnXc34tAIgbe5fbKc0i8KdevBog/Tvo3bLHczN/MPilNvKkRTyq3o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4292874},"main":"dist/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","esbuild","protobufjs","sharp"]},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"gitHead":"4e68a85d5eeb571c296eac6c1ca646c4901758a6","scripts":{"ci":"npm run validate:yaml && npm run lint && npm run typecheck && npm run build","dev":"node --import=tsx src/index.ts","chat":"node --import=tsx src/support/chat.ts","lint":"oxlint src/","stop":"pkill -f 'node.*enact-factory' 2>/dev/null || echo 'No process running'","test":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run","build":"rm -rf dist && tsc && tsc-alias -p tsconfig.json && node scripts/copy-assets.mjs && chmod +x dist/cli.js","start":"node dist/index.js","predev":"pkill -f 'tsx src/index.ts' 2>/dev/null || true","cli:dev":"node --import=tsx src/cli.ts","prepack":"npm run validate:yaml && npm run build","prestart":"pkill -f 'dist/index.js' 2>/dev/null || true","typecheck":"tsc --noEmit","test:smoke":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run --config vitest.smoke.config.ts --maxWorkers 1 --no-file-parallelism","test:watch":"node --experimental-vm-modules node_modules/vitest/vitest.mjs","perf:measure":"tsx scripts/playwright-rendering-performance.ts","service:logs":"bash scripts/manage-service.sh logs stdout","service:stop":"bash scripts/manage-service.sh stop","service:start":"bash scripts/manage-service.sh start","validate:yaml":"node scripts/validate-yaml.mjs","service:errors":"bash scripts/manage-service.sh logs stderr","service:status":"bash scripts/manage-service.sh status","browser:install":"bash scripts/install-browser-launcher.sh","service:install":"bash scripts/install-service.sh","service:restart":"bash scripts/manage-service.sh restart","browser:uninstall":"bash scripts/uninstall-browser-launcher.sh","service:uninstall":"bash scripts/manage-service.sh uninstall","test:factory-smoke":"npm run test:smoke","sync:ghostty-themes":"node scripts/generate-ghostty-theme-catalog.mjs","eval:codex-ralph-mvp":"tsx scripts/codex-ralph-semantics-mvp.ts","test:factory-codex-e2e":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run src/omx/codexFactoryE2E.test.ts","test:dashboard-shell-smoke":"bash scripts/run-dashboard-theme-smokes.sh","test:dashboard-theme-smoke":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run --config vitest.smoke.config.ts tests/DashboardThemeTerminalBrowserSmoke.test.ts","test:factory-bootstrap-smoke":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run tests/factoryRuntimeBootstrapSmoke.test.ts"},"_npmUser":{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"},"_npmVersion":"10.9.8","description":"Enact Factory — autonomous AI agent orchestrator (Claude, GPT, Codex, local models)","directories":{},"_nodeVersion":"22.22.3","dependencies":{"pg":"^8.20.0","zod":"^4.3.6","yaml":"^2.8.2","croner":"^8.0.0","nanoid":"^5.1.7","blessed":"^0.1.81","commander":"^12.1.0","@iarna/toml":"^2.2.5","apache-arrow":"^18.1.0","@types/blessed":"^0.1.27","better-sqlite3":"^12.8.0","@lancedb/lancedb":"^0.23.0","@anthropic-ai/sdk":"^0.72.1","@xenova/transformers":"^2.17.2","@types/better-sqlite3":"^7.6.13","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","oxlint":"^1.43.0","vitest":"^4.0.18","@types/pg":"^8.20.0","bun-types":"^1.1.0","tsc-alias":"^1.8.17","playwright":"^1.47.0","typescript":"^5.9.3","@types/node":"^22.0.0","@vitest/coverage-v8":"^4.0.18"},"_npmOperationalInternal":{"tmp":"tmp/enact-factory_0.1.14_1781972827347_0.866493530420287","host":"s3://npm-registry-packages-npm-production"}},"0.1.15":{"name":"@amsterdamdatalabs/enact-factory","version":"0.1.15","license":"UNLICENSED","_id":"@amsterdamdatalabs/enact-factory@0.1.15","maintainers":[{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"}],"bin":{"enact-factory":"dist/cli.js"},"dist":{"shasum":"f3804ad19236a81fc3f24a5715bd303bd39a1e77","tarball":"https://registry.npmjs.org/@amsterdamdatalabs/enact-factory/-/enact-factory-0.1.15.tgz","fileCount":670,"integrity":"sha512-Eu8l6bK8heTNB9iCnp7dTAAQVWF3mk6FH0wHT/wExWo9G7Nh7Icrlz2ujNvT9Ri8hEmxLAWt4fNwEqrlKH58/Q==","signatures":[{"sig":"MEUCICJTuiXOmk0ws1uOpISiSJElW7PL8M7jF/MZ8c3zdmixAiEA8XI1bzLpPEZIeLgCH0CUsRrLd5MWBZSVlqdgzwGXFn8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4310391},"main":"dist/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","esbuild","protobufjs","sharp"]},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"gitHead":"cf825737800e173ded7dec259680debdaf8c1601","scripts":{"ci":"npm run validate:yaml && npm run lint && npm run typecheck && npm run build","dev":"node --import=tsx src/index.ts","chat":"node --import=tsx src/support/chat.ts","lint":"oxlint src/","stop":"pkill -f 'node.*enact-factory' 2>/dev/null || echo 'No process running'","test":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run","build":"rm -rf dist && tsc && tsc-alias -p tsconfig.json && node scripts/copy-assets.mjs && chmod +x dist/cli.js","start":"node dist/index.js","predev":"pkill -f 'tsx src/index.ts' 2>/dev/null || true","cli:dev":"node --import=tsx src/cli.ts","prepack":"npm run validate:yaml && npm run build","prestart":"pkill -f 'dist/index.js' 2>/dev/null || true","typecheck":"tsc --noEmit","test:smoke":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run --config vitest.smoke.config.ts --maxWorkers 1 --no-file-parallelism","test:watch":"node --experimental-vm-modules node_modules/vitest/vitest.mjs","perf:measure":"tsx scripts/playwright-rendering-performance.ts","service:logs":"bash scripts/manage-service.sh logs stdout","service:stop":"bash scripts/manage-service.sh stop","service:start":"bash scripts/manage-service.sh start","validate:yaml":"node scripts/validate-yaml.mjs","service:errors":"bash scripts/manage-service.sh logs stderr","service:status":"bash scripts/manage-service.sh status","browser:install":"bash scripts/install-browser-launcher.sh","service:install":"bash scripts/install-service.sh","service:restart":"bash scripts/manage-service.sh restart","browser:uninstall":"bash scripts/uninstall-browser-launcher.sh","service:uninstall":"bash scripts/manage-service.sh uninstall","test:factory-smoke":"npm run test:smoke","sync:ghostty-themes":"node scripts/generate-ghostty-theme-catalog.mjs","eval:codex-ralph-mvp":"tsx scripts/codex-ralph-semantics-mvp.ts","test:factory-codex-e2e":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run src/omx/codexFactoryE2E.test.ts","test:dashboard-shell-smoke":"bash scripts/run-dashboard-theme-smokes.sh","test:dashboard-theme-smoke":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run --config vitest.smoke.config.ts tests/DashboardThemeTerminalBrowserSmoke.test.ts","test:factory-bootstrap-smoke":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run tests/factoryRuntimeBootstrapSmoke.test.ts"},"_npmUser":{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"},"_npmVersion":"10.9.8","description":"Enact Factory — autonomous AI agent orchestrator (Claude, GPT, Codex, local models)","directories":{},"_nodeVersion":"22.22.3","dependencies":{"pg":"^8.20.0","zod":"^4.3.6","yaml":"^2.8.2","croner":"^8.0.0","nanoid":"^5.1.7","blessed":"^0.1.81","commander":"^12.1.0","@iarna/toml":"^2.2.5","apache-arrow":"^18.1.0","@types/blessed":"^0.1.27","better-sqlite3":"^12.8.0","@lancedb/lancedb":"^0.23.0","@anthropic-ai/sdk":"^0.72.1","@xenova/transformers":"^2.17.2","@types/better-sqlite3":"^7.6.13","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","oxlint":"^1.43.0","vitest":"^4.0.18","@types/pg":"^8.20.0","bun-types":"^1.1.0","tsc-alias":"^1.8.17","playwright":"^1.47.0","typescript":"^5.9.3","@types/node":"^22.0.0","@vitest/coverage-v8":"^4.0.18"},"_npmOperationalInternal":{"tmp":"tmp/enact-factory_0.1.15_1781982093863_0.3911318251310001","host":"s3://npm-registry-packages-npm-production"}},"0.1.26":{"name":"@amsterdamdatalabs/enact-factory","version":"0.1.26","license":"UNLICENSED","_id":"@amsterdamdatalabs/enact-factory@0.1.26","maintainers":[{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"}],"bin":{"enact-factory":"dist/cli.js"},"dist":{"shasum":"293701ba8fdbd5f1921a370fd0344852cacc3b6f","tarball":"https://registry.npmjs.org/@amsterdamdatalabs/enact-factory/-/enact-factory-0.1.26.tgz","fileCount":679,"integrity":"sha512-1y9lgEulqBnilnXwgp3KedEWx2dn6NdRKzyLpr5taSKbo3DAbfNYnXcyfx7Jel6N53RBSyo5oe6rH/9S1s+uMg==","signatures":[{"sig":"MEYCIQC6kFf1A+j6YU7AdAMaPqnQehay0CCNP3RmQC4w/7dtVQIhAKXi7H+tkoKMGgOALdDe4obh5CaQuEWThnbgvHtZnFXm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4422436},"main":"dist/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","esbuild","protobufjs","sharp"]},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"gitHead":"672b0a89f7a462eed4ffd1889217fadc8cafa031","scripts":{"ci":"npm run validate:yaml && npm run lint && npm run typecheck && npm run build && npm run typecheck:tests:ci","dev":"node --import=tsx src/index.ts","chat":"node --import=tsx src/support/chat.ts","lint":"oxlint src/","stop":"pkill -f 'node.*enact-factory' 2>/dev/null || echo 'No process running'","test":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run","build":"rm -rf dist && tsc && tsc-alias -p tsconfig.json && node scripts/copy-assets.mjs && chmod +x dist/cli.js","start":"node dist/index.js","predev":"pkill -f 'tsx src/index.ts' 2>/dev/null || true","cli:dev":"node --import=tsx src/cli.ts","prepack":"npm run validate:yaml && npm run build","prestart":"pkill -f 'dist/index.js' 2>/dev/null || true","typecheck":"tsc --noEmit","test:smoke":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run --config vitest.smoke.config.ts --maxWorkers 1 --no-file-parallelism","test:watch":"node --experimental-vm-modules node_modules/vitest/vitest.mjs","perf:measure":"tsx scripts/playwright-rendering-performance.ts","service:logs":"bash scripts/manage-service.sh logs stdout","service:stop":"bash scripts/manage-service.sh stop","service:start":"bash scripts/manage-service.sh start","validate:yaml":"node scripts/validate-yaml.mjs","service:errors":"bash scripts/manage-service.sh logs stderr","service:status":"bash scripts/manage-service.sh status","browser:install":"bash scripts/install-browser-launcher.sh","service:install":"bash scripts/install-service.sh","service:restart":"bash scripts/manage-service.sh restart","typecheck:tests":"tsc -p tsconfig.test.json","browser:uninstall":"bash scripts/uninstall-browser-launcher.sh","service:uninstall":"bash scripts/manage-service.sh uninstall","test:factory-smoke":"npm run test:smoke","typecheck:tests:ci":"npm run typecheck:tests || echo '::warning:: test type-check has known pre-existing errors (non-blocking TODO) — run: npm run typecheck:tests'","sync:ghostty-themes":"node scripts/generate-ghostty-theme-catalog.mjs","eval:codex-ralph-mvp":"tsx scripts/codex-ralph-semantics-mvp.ts","test:factory-codex-e2e":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run src/omx/codexFactoryE2E.test.ts","test:dashboard-shell-smoke":"bash scripts/run-dashboard-theme-smokes.sh","test:dashboard-theme-smoke":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run --config vitest.smoke.config.ts tests/DashboardThemeTerminalBrowserSmoke.test.ts","test:factory-bootstrap-smoke":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run tests/factoryRuntimeBootstrapSmoke.test.ts"},"_npmUser":{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"},"_npmVersion":"10.9.8","description":"Enact Factory — autonomous AI agent orchestrator (Claude, GPT, Codex, local models)","directories":{},"_nodeVersion":"22.22.3","dependencies":{"pg":"^8.20.0","zod":"^4.3.6","yaml":"^2.8.2","croner":"^8.0.0","nanoid":"^5.1.7","blessed":"^0.1.81","commander":"^12.1.0","@iarna/toml":"^2.2.5","apache-arrow":"^18.1.0","@types/blessed":"^0.1.27","better-sqlite3":"^12.8.0","@lancedb/lancedb":"^0.23.0","@anthropic-ai/sdk":"^0.72.1","@xenova/transformers":"^2.17.2","@types/better-sqlite3":"^7.6.13","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","oxlint":"^1.43.0","vitest":"^4.0.18","@types/pg":"^8.20.0","bun-types":"^1.1.0","tsc-alias":"^1.8.17","playwright":"^1.47.0","typescript":"^5.9.3","@types/node":"^22.0.0","@vitest/coverage-v8":"^4.0.18"},"_npmOperationalInternal":{"tmp":"tmp/enact-factory_0.1.26_1782136859776_0.9890224881223479","host":"s3://npm-registry-packages-npm-production"}},"0.1.42":{"name":"@amsterdamdatalabs/enact-factory","version":"0.1.42","license":"UNLICENSED","_id":"@amsterdamdatalabs/enact-factory@0.1.42","maintainers":[{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"}],"bin":{"enact-factory":"dist/cli.js"},"dist":{"shasum":"7980e736fafd11317ecca68b20a862929d98015a","tarball":"https://registry.npmjs.org/@amsterdamdatalabs/enact-factory/-/enact-factory-0.1.42.tgz","fileCount":665,"integrity":"sha512-IRsodsvRbAtX3y/8zMgy6sV2f8g8JjsxJALlwAJrcHfyuVviypOZxqEUa1g1R6tnrP9mmYvOxTN6LCSYidbDkA==","signatures":[{"sig":"MEYCIQCz7n5dF2CJJ50CpvNBNuYWwq7nQbRqinPN9GNVAviHmQIhAMsFvhXjK/d4VxwnFqn0UfkxHyvW5xJkZEaikdygBPox","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4286311},"main":"dist/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","esbuild","protobufjs","sharp"]},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"gitHead":"6f6030dbd0e5e90ba2b041879f796ec804c5fa64","scripts":{"ci":"npm run validate:yaml && npm run lint && npm run typecheck && npm run build && npm run typecheck:tests:ci","dev":"node --import=tsx src/index.ts","chat":"node --import=tsx src/support/chat.ts","lint":"oxlint src/","stop":"pkill -f 'node.*enact-factory' 2>/dev/null || echo 'No process running'","test":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run","build":"rm -rf dist && tsc && tsc-alias -p tsconfig.json && node scripts/copy-assets.mjs && chmod +x dist/cli.js","start":"node dist/index.js","predev":"pkill -f 'tsx src/index.ts' 2>/dev/null || true","cli:dev":"node --import=tsx src/cli.ts","prepack":"npm run validate:yaml && npm run build","prestart":"pkill -f 'dist/index.js' 2>/dev/null || true","test:e2e":"npx playwright test","typecheck":"tsc --noEmit","test:smoke":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run --config vitest.smoke.config.ts --maxWorkers 1 --no-file-parallelism","test:watch":"node --experimental-vm-modules node_modules/vitest/vitest.mjs","perf:measure":"tsx scripts/playwright-rendering-performance.ts","service:logs":"bash scripts/manage-service.sh logs stdout","service:stop":"bash scripts/manage-service.sh stop","service:start":"bash scripts/manage-service.sh start","validate:yaml":"node scripts/validate-yaml.mjs","service:errors":"bash scripts/manage-service.sh logs stderr","service:status":"bash scripts/manage-service.sh status","browser:install":"bash scripts/install-browser-launcher.sh","service:install":"bash scripts/install-service.sh","service:restart":"bash scripts/manage-service.sh restart","typecheck:tests":"tsc -p tsconfig.test.json","test:integration":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run --config vitest.integration.config.ts","browser:uninstall":"bash scripts/uninstall-browser-launcher.sh","service:uninstall":"bash scripts/manage-service.sh uninstall","test:factory-smoke":"npm run test:smoke","typecheck:tests:ci":"npm run typecheck:tests || echo '::warning:: test type-check has known pre-existing errors (non-blocking TODO) — run: npm run typecheck:tests'","sync:ghostty-themes":"node scripts/generate-ghostty-theme-catalog.mjs","test:factory-codex-e2e":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run src/omx/codexFactoryE2E.test.ts","test:dashboard-shell-smoke":"bash scripts/run-dashboard-theme-smokes.sh","test:dashboard-theme-smoke":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run --config vitest.smoke.config.ts tests/DashboardThemeTerminalBrowserSmoke.test.ts","test:factory-bootstrap-smoke":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run tests/factoryRuntimeBootstrapSmoke.test.ts"},"_npmUser":{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"},"_npmVersion":"10.9.8","description":"Enact Factory — autonomous AI agent orchestrator (Claude, GPT, Codex, local models)","directories":{},"_nodeVersion":"22.22.3","dependencies":{"pg":"^8.20.0","zod":"^4.3.6","yaml":"^2.8.2","croner":"^8.0.0","nanoid":"^5.1.7","blessed":"^0.1.81","commander":"^12.1.0","@iarna/toml":"^2.2.5","apache-arrow":"^18.1.0","@types/blessed":"^0.1.27","better-sqlite3":"^12.8.0","@lancedb/lancedb":"^0.23.0","@anthropic-ai/sdk":"^0.72.1","@xenova/transformers":"^2.17.2","@types/better-sqlite3":"^7.6.13","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","oxlint":"^1.43.0","vitest":"^4.0.18","@types/pg":"^8.20.0","bun-types":"^1.1.0","tsc-alias":"^1.8.17","playwright":"^1.47.0","typescript":"^5.9.3","@types/node":"^22.0.0","@playwright/test":"^1.61.0","@vitest/coverage-v8":"^4.0.18"},"_npmOperationalInternal":{"tmp":"tmp/enact-factory_0.1.42_1782209365760_0.36905722610026337","host":"s3://npm-registry-packages-npm-production"}},"0.1.44":{"name":"@amsterdamdatalabs/enact-factory","version":"0.1.44","license":"UNLICENSED","_id":"@amsterdamdatalabs/enact-factory@0.1.44","maintainers":[{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"}],"bin":{"enact-factory":"dist/cli.js"},"dist":{"shasum":"27b71c641daa99d5193ad5b2be38d07abf28f81d","tarball":"https://registry.npmjs.org/@amsterdamdatalabs/enact-factory/-/enact-factory-0.1.44.tgz","fileCount":673,"integrity":"sha512-FRtBOan0yrab673o74rP3lf+5iVvecVrN9D2XUFeWcAj3fQjUkatToTIOHEMXXII4LBSR/c6UtlyQT4xB8EMJQ==","signatures":[{"sig":"MEYCIQDnse/RSJWebxIRfsL5klirwcUQ4Pyd/zHNGvGvXa0h9gIhAPefYrQvGjvobpd8C4bd8gckUC8RhkQmcLvJrJiF5hC0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4328380},"main":"dist/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3","esbuild","protobufjs","sharp"]},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"gitHead":"8bef6340f54de691ad14d61c946ee37368bc784c","scripts":{"ci":"npm run validate:yaml && npm run lint && npm run typecheck && npm run build && npm run typecheck:tests:ci","dev":"node --import=tsx src/index.ts","chat":"node --import=tsx src/support/chat.ts","lint":"oxlint src/","stop":"pkill -f 'node.*enact-factory' 2>/dev/null || echo 'No process running'","test":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run","build":"rm -rf dist && tsc && tsc-alias -p tsconfig.json && node scripts/copy-assets.mjs && chmod +x dist/cli.js","start":"node dist/index.js","predev":"pkill -f 'tsx src/index.ts' 2>/dev/null || true","cli:dev":"node --import=tsx src/cli.ts","prepack":"npm run validate:yaml && npm run build","prestart":"pkill -f 'dist/index.js' 2>/dev/null || true","test:e2e":"npx playwright test","typecheck":"tsc --noEmit","test:smoke":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run --config vitest.smoke.config.ts --maxWorkers 1 --no-file-parallelism","test:watch":"node --experimental-vm-modules node_modules/vitest/vitest.mjs","perf:measure":"tsx scripts/playwright-rendering-performance.ts","service:logs":"bash scripts/manage-service.sh logs stdout","service:stop":"bash scripts/manage-service.sh stop","service:start":"bash scripts/manage-service.sh start","validate:yaml":"node scripts/validate-yaml.mjs","service:errors":"bash scripts/manage-service.sh logs stderr","service:status":"bash scripts/manage-service.sh status","browser:install":"bash scripts/install-browser-launcher.sh","service:install":"bash scripts/install-service.sh","service:restart":"bash scripts/manage-service.sh restart","typecheck:tests":"tsc -p tsconfig.test.json","test:integration":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run --config vitest.integration.config.ts","browser:uninstall":"bash scripts/uninstall-browser-launcher.sh","service:uninstall":"bash scripts/manage-service.sh uninstall","test:factory-smoke":"npm run test:smoke","typecheck:tests:ci":"npm run typecheck:tests || echo '::warning:: test type-check has known pre-existing errors (non-blocking TODO) — run: npm run typecheck:tests'","sync:ghostty-themes":"node scripts/generate-ghostty-theme-catalog.mjs","test:factory-codex-e2e":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run src/omx/codexFactoryE2E.test.ts","test:dashboard-shell-smoke":"bash scripts/run-dashboard-theme-smokes.sh","test:dashboard-theme-smoke":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run --config vitest.smoke.config.ts tests/DashboardThemeTerminalBrowserSmoke.test.ts","test:factory-bootstrap-smoke":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run tests/factoryRuntimeBootstrapSmoke.test.ts"},"_npmUser":{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"},"_npmVersion":"10.9.8","description":"Enact Factory — autonomous AI agent orchestrator (Claude, GPT, Codex, local models)","directories":{},"_nodeVersion":"22.22.3","dependencies":{"pg":"^8.20.0","zod":"^4.3.6","yaml":"^2.8.2","croner":"^8.0.0","nanoid":"^5.1.7","blessed":"^0.1.81","commander":"^12.1.0","@iarna/toml":"^2.2.5","apache-arrow":"^18.1.0","@types/blessed":"^0.1.27","better-sqlite3":"^12.8.0","@lancedb/lancedb":"^0.23.0","@anthropic-ai/sdk":"^0.72.1","@xenova/transformers":"^2.17.2","@types/better-sqlite3":"^7.6.13","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","oxlint":"^1.43.0","vitest":"^4.0.18","@types/pg":"^8.20.0","bun-types":"^1.1.0","tsc-alias":"^1.8.17","playwright":"^1.47.0","typescript":"^5.9.3","@types/node":"^22.0.0","@playwright/test":"^1.61.0","@vitest/coverage-v8":"^4.0.18"},"_npmOperationalInternal":{"tmp":"tmp/enact-factory_0.1.44_1783725389542_0.505690647302476","host":"s3://npm-registry-packages-npm-production"}},"0.1.45":{"name":"@amsterdamdatalabs/enact-factory","version":"0.1.45","description":"Enact Factory — autonomous AI agent orchestrator (Claude, GPT, Codex, local models)","license":"UNLICENSED","type":"module","main":"dist/index.js","bin":{"enact-factory":"dist/cli.js"},"publishConfig":{"access":"public"},"scripts":{"predev":"pkill -f 'tsx src/index.ts' 2>/dev/null || true","dev":"node --import=tsx src/index.ts","sync:ghostty-themes":"node scripts/generate-ghostty-theme-catalog.mjs","prestart":"pkill -f 'dist/index.js' 2>/dev/null || true","build":"rm -rf dist && tsc && tsc-alias -p tsconfig.json && node scripts/copy-assets.mjs && chmod +x dist/cli.js","prepack":"npm run validate:yaml && npm run build","start":"node dist/index.js","stop":"pkill -f 'node.*enact-factory' 2>/dev/null || echo 'No process running'","lint":"oxlint src/","validate:yaml":"node scripts/validate-yaml.mjs","typecheck":"tsc --noEmit","typecheck:tests":"tsc -p tsconfig.test.json","typecheck:tests:ci":"npm run typecheck:tests || echo '::warning:: test type-check has known pre-existing errors (non-blocking TODO) — run: npm run typecheck:tests'","test":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run","test:watch":"node --experimental-vm-modules node_modules/vitest/vitest.mjs","test:factory-codex-e2e":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run src/omx/codexFactoryE2E.test.ts","test:factory-bootstrap-smoke":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run tests/factoryRuntimeBootstrapSmoke.test.ts","test:smoke":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run --config vitest.smoke.config.ts --maxWorkers 1 --no-file-parallelism","test:dashboard-theme-smoke":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run --config vitest.smoke.config.ts tests/DashboardThemeTerminalBrowserSmoke.test.ts","test:dashboard-shell-smoke":"bash scripts/run-dashboard-theme-smokes.sh","test:factory-smoke":"npm run test:smoke","chat":"node --import=tsx src/support/chat.ts","cli:dev":"node --import=tsx src/cli.ts","perf:measure":"tsx scripts/playwright-rendering-performance.ts","test:integration":"node --experimental-vm-modules node_modules/vitest/vitest.mjs run --config vitest.integration.config.ts","test:e2e":"npx playwright test","ci":"npm run validate:yaml && npm run lint && npm run typecheck && npm run build && npm run typecheck:tests:ci","service:install":"bash scripts/install-service.sh","service:start":"bash scripts/manage-service.sh start","service:stop":"bash scripts/manage-service.sh stop","service:restart":"bash scripts/manage-service.sh restart","service:status":"bash scripts/manage-service.sh status","service:uninstall":"bash scripts/manage-service.sh uninstall","service:logs":"bash scripts/manage-service.sh logs stdout","service:errors":"bash scripts/manage-service.sh logs stderr","browser:install":"bash scripts/install-browser-launcher.sh","browser:uninstall":"bash scripts/uninstall-browser-launcher.sh"},"dependencies":{"@anthropic-ai/sdk":"^0.72.1","@iarna/toml":"^2.2.5","@lancedb/lancedb":"^0.23.0","@modelcontextprotocol/sdk":"^1.29.0","@types/better-sqlite3":"^7.6.13","@types/blessed":"^0.1.27","@xenova/transformers":"^2.17.2","apache-arrow":"^18.1.0","better-sqlite3":"^12.8.0","blessed":"^0.1.81","commander":"^12.1.0","croner":"^8.0.0","nanoid":"^5.1.7","pg":"^8.20.0","yaml":"^2.8.2","zod":"^4.3.6"},"devDependencies":{"@playwright/test":"^1.61.0","@types/node":"^22.0.0","@types/pg":"^8.20.0","@vitest/coverage-v8":"^4.0.18","bun-types":"^1.1.0","oxlint":"^1.43.0","playwright":"^1.47.0","tsc-alias":"^1.8.17","tsx":"^4.21.0","typescript":"^5.9.3","vitest":"^4.0.18"},"engines":{"node":">=22"},"pnpm":{"onlyBuiltDependencies":["better-sqlite3","esbuild","protobufjs","sharp"]},"_id":"@amsterdamdatalabs/enact-factory@0.1.45","gitHead":"535320ccabee20449301a5da1626a074140ab1bc","types":"./dist/index.d.ts","_nodeVersion":"22.22.3","_npmVersion":"10.9.8","dist":{"integrity":"sha512-0zIqjVJruWW7QcqX342Yv9BWMMiMIecnzjc0HxHthinHinQ9E4EigBjkjH8uVCHDKGs6zxi7nJIVvnfI7l4sEQ==","shasum":"8d07e6d70f12b2550de4ea4ab825f887eed4bdf6","tarball":"https://registry.npmjs.org/@amsterdamdatalabs/enact-factory/-/enact-factory-0.1.45.tgz","fileCount":677,"unpackedSize":4361193,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDmox/69wuMOzLwUwWbO0b8lzp1oIhcXaSPcX18eY0fxwIhAIHWsKDGT+eAYqM63beV9PJCd8GYfXqIP7oMlCWiGnJV"}]},"_npmUser":{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"},"directories":{},"maintainers":[{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/enact-factory_0.1.45_1785719364253_0.456453424713132"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-18T22:21:47.262Z","modified":"2026-08-03T01:09:24.655Z","0.1.1":"2026-06-18T22:21:47.728Z","0.1.7":"2026-06-19T20:16:04.513Z","0.1.10":"2026-06-20T00:54:04.953Z","0.1.14":"2026-06-20T16:27:07.578Z","0.1.15":"2026-06-20T19:01:34.060Z","0.1.26":"2026-06-22T14:00:59.937Z","0.1.42":"2026-06-23T10:09:25.928Z","0.1.44":"2026-07-10T23:16:29.698Z","0.1.45":"2026-08-03T01:09:24.479Z"},"license":"UNLICENSED","description":"Enact Factory — autonomous AI agent orchestrator (Claude, GPT, Codex, local models)","maintainers":[{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"}],"readme":"# Enact Factory\n\n> Autonomous AI agent orchestrator — Claude, Codex, Cursor-family CLIs, and the Responses API. Part of the [Enact OS](../) product line; replaced OMX-era surfaces with `enact-factory` naming so the pipeline is a Executor/Reviewer/Tester/Documenter assembly line, not a factory.\n\n---\n\nEnact Factory orchestrates multiple AI agents as autonomous code executors. It picks up workItems (from Azdo, GitHub, or a local workItem directory), runs Executor/Reviewer pair pipelines, reports to Discord, and retains long-term memory via LanceDB. Today the HTTP provider seam is the **Responses API**; CLI-backed agent surfaces remain the reference for full agent behavior until the Responses loop contract in [docs/a_proposed/RESPONSES_AGENT_LOOP_SEMANTICS.md](./docs/a_proposed/RESPONSES_AGENT_LOOP_SEMANTICS.md) is implemented end to end.\n\n### Vocabulary\n\nThree nouns keep the system's concepts distinct. New readers should learn these before anything else:\n\n| Noun | Meaning | Cardinality | Persistence |\n|------|---------|-------------|-------------|\n| **Operator** | The lane driving a WorkItem's lifecycle | One per WorkItem | Durable on WorkItem (`operatorLane` field) |\n| **Stage** | What the LLM is currently doing inside the operator | One per active turn | Transient (per-iteration) |\n| **Project** | A sibling repo being orchestrated | N per Factory deployment | Config-defined |\n\n**Operator lanes** (allowlisted values for `operatorLane`):\n- `none` — sentinel: no operator assigned\n- `manual` — operator explicitly opted out of automation\n- `loop` — the WorkItem-aware autonomous loop operator (durable state, stop policy); the only schedulable lane\n- `autopilot` — wraps multiple `loop` phases with transitions, resume, and stop-policy parity after a planning session\n\n**Pipeline stages** (values in `autonomous.defaultStages`):\n- `executor` — LLM generates code (canonical agent name; legacy config key `coder` is migrated at load time)\n- `critic` — LLM reviews code (was `reviewer` in config; the packaged skill named `reviewer` stays unchanged)\n- `tester`, `documenter`, `auditor`, `stage-documenter` — remaining pipeline stages (was `skill-documenter`)\n\n> **Important:** `pipeline`, `swarm`, `ultrapilot`, `executor`, and `reviewer` are NOT operator lane values. `executor` and `reviewer` are pipeline stages (and packaged skill names), not lanes.\n\n## Quick Start\n\nThis repo is internal-only (no npm publish). Build from source:\n\n```bash\ngit clone <azure-devops-url>/enact-factory\ncd enact-factory\nnpm install\nnpm run build\nnode dist/cli.js\n```\n\nThat's it. `enact-factory` with no arguments launches the TUI chat interface immediately.\n\n![TUI Chat Interface](screenshots/tui.png)\n\n### TUI keyboard shortcuts\n\n| Key | Action |\n|-----|--------|\n| `Tab` | Switch tabs (Chat / Projects / Tasks / Stuck / Logs) |\n| `Enter` | Send message |\n| `Shift+Enter` | Newline |\n| `i` | Focus input |\n| `Esc` | Exit input focus |\n| `Ctrl+C` | Quit |\n\nStatus bar shows: provider · model · message count · cumulative cost\n\n---\n\n## CLI Commands\n\n```bash\nenact-factory                        # TUI chat (default)\nenact-factory chat [session]         # Simple readline chat\nenact-factory dash                   # Open dashboard only (UI + AzDO sync, no autonomous runner)\nenact-factory start                  # Start full daemon (reads the root config.toml)\nenact-factory run \"Fix the bug\" -p ~/my-project   # Run a single task\nenact-factory exec \"Run tests\" --local --pipeline # Execute via daemon\nenact-factory init                   # Generate config.toml scaffold\nenact-factory validate               # Validate the active config.toml\n\n# Code Registry & BS Detector\nenact-factory check --scan           # Scan repo → register all entities\nenact-factory check src/foo.ts       # File brief (entities, tests, risk)\nenact-factory check --bs             # BS pattern scan (bad code smells)\nenact-factory check --stats          # Registry statistics\nenact-factory check --high-risk      # High-risk entities\nenact-factory check --search \"name\"  # Full-text search\nenact-factory annotate \"funcName\" --deprecate \"reason\"\nenact-factory annotate \"funcName\" --tag \"needs-refactor\"\nenact-factory annotate \"funcName\" --warn \"error/security: SQL injection\"\n```\n\n### Enact Factory surface\n\n```bash\nenact-factory setup                    # Prepare global ~/.enact/factory state; remove legacy SOUL/USER/MEMORY files\nenact-factory setup --scope global     # Explicit global setup path\nenact-factory setup --no-ask           # Skip prompt; use saved delivery scope or global default\nenact-factory doctor                   # Read readiness + ownership checks\nenact-factory hud                      # Render text HUD from ~/.enact/factory state\nenact-factory task list                # List mirrored Factory tasks\nenact-factory session status           # Show current Factory session\nenact-factory team init                # Initialize tmux/mock team state\nenact-factory team status              # Inspect team + tmux readiness\nenact-factory plugins status           # Inspect plugin marketplace/install state\nenact-factory plugins list             # List repo-local plugin scaffolds under <root>/extensions\nenact-factory audit provider-boundary  # Check memory/knowledge/provider narrowing\nenact-factory uninstall                # Remove Factory-owned Codex-facing setup\n```\n\nThe Factory runtime assets ship from this repo, while host plugin delivery is owned by `enact-extensions`:\n\n- Install host surfaces with `enact-extensions install enact-factory --platform <surface>` or `--platform all`.\n- The canonical host plugin bundle lives in `/Users/tarunrana/Documents/Repos/enact-extensions/extensions/enact-factory`.\n- `.agents/plugins/marketplace.json` provides the local marketplace surface.\n- Provider-boundary and replacement-readiness are enforced by the in-repo audit and doctor surfaces.\n\n### `enact-factory exec` options\n\n| Option | Description |\n|--------|-------------|\n| `--path <path>` | Project path (default: cwd) |\n| `--timeout <seconds>` | Timeout in seconds (default: 600) |\n| `--local` | Execute locally without daemon |\n| `--pipeline` | Full pipeline: executor + reviewer + tester + documenter |\n| `--executor-only` | Executor only, no review |\n| `-m, --model <model>` | Model override for executor |\n\nExit codes: `0` success · `1` failure · `2` timeout\n\n---\n\n## Full Daemon Setup\n\nFor autonomous operation (Azdo workItem processing, Discord control, PR auto-improvement), you need a full config:\n\n### Prerequisites\n\n- **Node.js** >= 22\n- **Claude Code CLI** authenticated (`claude -p`) — default provider\n- **OpenAI Codex CLI** (`codex exec`) — optional alternative provider\n- **Discord Bot** token with message content intent\n- **Azdo** API key and team ID\n- **GitHub CLI** (`gh`) for CI monitoring (optional)\n\n### Configuration\n\n```bash\ngit clone https://github.com/unohee/Enact-Factory.git\ncd Enact-Factory\nnpm install\nedit ../config.toml\n```\n\nCreate a `.env` file:\n\n```bash\nDISCORD_TOKEN=your-discord-bot-token\nDISCORD_CHANNEL_ID=your-channel-id\n\n# AzDo — all four required for live WorkItem round-tripping\nAZDO_ORG=your-azdo-org\nAZDO_PROJECT=your-azdo-project\nAZDO_PAT=your-azdo-personal-access-token\nAZDO_TEAM_ID=your-azdo-team-id\n# AZDO_API_KEY is a legacy alias for AZDO_PAT (some surfaces still read it)\nAZDO_API_KEY=${AZDO_PAT}\n```\n\nThe root `config.toml` supports `${VAR}` / `${VAR:-default}` substitution and is validated with Zod schemas.\n\n### Pre-flight checklist (before first live run)\n\nRun these in order. Each step has a clear failure mode if skipped.\n\n1. **Build the dist tree.** Factory runtime and MCP surfaces read compiled JS from `dist/`. On a fresh clone before build, governance behavior is incomplete.\n   ```bash\n   pnpm build\n   ```\n\n2. **Postgres reachable.** WorkItem store backend is postgres per the root `config.toml` (default `localhost:45432`, db `enact_factory_dev`, user/pw `enact:enact`). The daemon won't start without it.\n   ```bash\n   pg_isready -h localhost -p 45432\n   ```\n\n3. **AzDo env vars present.** All four are required for the sync service and the manual drain MCP tool. Missing vars throw a clear error.\n   ```bash\n   grep -E '^AZDO_(ORG|PROJECT|PAT|TEAM_ID)=' .env\n   # expect 4 lines\n   ```\n\n4. **Tests green.** Sanity check the bridge before pointing it at production AzDo.\n   ```bash\n   pnpm test\n   # expect: Tests <N> passed | 6 skipped, 0 failed\n   ```\n\n5. **Factory plugin installed.** Host plugin delivery is owned by `enact-extensions`; Factory setup prepares global state only.\n   ```bash\n   enact-extensions install enact-factory --platform all\n   enact-factory doctor\n   ```\n\n### What you should see end-to-end\n\n| Action | Expected flow |\n|---|---|\n| Create WorkItem in AzDo | Next `syncOnce` tick → local store gets it → visible via `factory_workItem_get` |\n| Set `operatorLane=loop` in AzDo | Sync detects → observe queue entry → `factory_workitem_observe` proposes `factory_skill_activate skill=loop workItemId=...` |\n| Advance the loop `running → verifying` | Push queue gets `{ implementationComplete: true }` entry → drainer pushes to AzDo on next sync tick → AzDo workItem shows the checkbox |\n| Reviewer approves (lane-local WorkItem) | `recordTeamReview` flips to `completed` + push `reviewPassed: true` → drainer pushes to AzDo |\n| Reviewer approves (cross-repo Epic) | `canAutoClose` guard fires → deferred ledger entry → status stays `review` → operator must call `factory_workitem_acknowledge_close { workItemId, operatorOverrideReason }` to record manual close |\n| Try to stop with pending gates | Operator stop policy denies, writes a verdict, and the next session-start surfaces the warning |\n| Manually drain pending lifecycle pushes | `factory_workitem_drain_push_queue` MCP tool — returns `{ drained, errors[] }`. Requires `AZDO_ORG`/`AZDO_PROJECT`/`AZDO_PAT`/`AZDO_TEAM_ID`. |\n\n### Common failure modes\n\n| Symptom | Likely cause | Fix |\n|---|---|---|\n| Sessions exit without the expected operator guardrails | Operator hooks are not installed or the runtime is stale | Reinstall/refresh Enact Operator and rebuild the runtime |\n| AzDo workItem checkboxes never flip | Drainer can't reach AzDo | Check env vars + AzDo connectivity; `factory_workitem_drain_push_queue` for diagnostics |\n| Cross-repo Epic stuck at `status: review` after reviewer approval | `canAutoClose` guard fired (correct) | Call `factory_workitem_acknowledge_close` with a reason |\n| §I4 closure-evidence-missing blocker fires repeatedly | Cross-repo Epic closed without acknowledgment | Either call `factory_workitem_acknowledge_close`, or use `factory_stop_acknowledge` for the session |\n\n### Key configuration sections\n\n| Section | Description |\n|---------|-------------|\n| `discord` | Bot token, channel ID, webhook URL |\n| `azdo` | API key, team ID |\n| `github` | Repos list for CI monitoring |\n| `projects` | Project definitions (name, projectPath, heartbeat interval) |\n| `autonomous` | Schedule, pair mode, stage models, decomposition settings |\n\n### CLI Adapter (Provider)\n\n```yaml\nadapter: claude   # \"claude\" | \"codex\" | \"responses\" | \"cursor\" | \"hermes\" | \"opencode\"\n```\n\nSwitch at runtime via Discord: `!provider codex` / `!provider claude`\n\n| Adapter | Backend | Models | Auth |\n|---------|---------|--------|------|\n| `claude` | Claude Code CLI | sonnet-4, haiku-4.5, opus-4 | CLI auth |\n| `codex` | OpenAI Codex CLI | o3, o4-mini | CLI auth |\n| `responses` | `/v1/responses` server | auto, gpt-4.1, gpt-4o, gpt-5, o3, o4-mini | Bearer env |\nThe Responses adapter can be configured with `ENACT_GATEWAY_BASE_URL` / `ENACT_GATEWAY_API_KEY`, or provider-specific `ENACT_RESPONSES_*` overrides.\n\nPer-stage adapter overrides:\n\n```yaml\nautonomous:\n  defaultStages:\n    executor:\n      adapter: codex\n      model: o4-mini\n    critic:\n      adapter: claude\n      model: claude-sonnet-4-20250514\n```\n\n### Pipeline Stages\n\n```yaml\nautonomous:\n  defaultStages:\n    executor:\n      model: claude-haiku-4-5-20251001\n      escalateModel: claude-sonnet-4-20250514\n      escalateAfterIteration: 3\n      timeoutMs: 1800000\n    critic:\n      model: claude-haiku-4-5-20251001\n      timeoutMs: 600000\n    tester:\n      enabled: false\n    documenter:\n      enabled: false\n    auditor:\n      enabled: false\n```\n\n### Running the daemon\n\n#### macOS launchd service (recommended)\n\n```bash\nnpm run service:install    # Build and install as system service\nnpm run service:start      # Start\nnpm run service:stop       # Stop\nnpm run service:restart    # Restart\nnpm run service:status     # Status and recent logs\nnpm run service:logs       # stdout (follow mode)\nnpm run service:errors     # stderr (follow mode)\nnpm run service:uninstall  # Uninstall\n```\n\n#### Manual\n\n```bash\nnpm run build && npm start   # Production\nnpm run dev                  # Development (tsx watch)\ndocker compose up -d         # Docker\n```\n\n---\n\n## Architecture\n\n```\n                         ┌──────────────────────────┐\n                         │       Azdo API          │\n                         │   (workItems, state, memory) │\n                         └─────────────┬────────────┘\n                                       │\n                 ┌─────────────────────┼─────────────────────┐\n                 │                     │                     │\n                 v                     v                     v\n  ┌──────────────────┐  ┌──────────────────┐  ┌──────────────────┐\n  │ AutonomousRunner │  │  DecisionEngine  │  │  TaskScheduler   │\n  │ (heartbeat loop) │─>│  (scope guard)   │─>│  (queue + slots) │\n  └────────┬─────────┘  └──────────────────┘  └────────┬─────────┘\n           │                                            │\n           v                                            v\n  ┌──────────────────────────────────────────────────────────────┐\n  │                      PairPipeline                            │\n  │  ┌────────┐   ┌──────────┐   ┌────────┐   ┌─────────────┐  │\n  │  │ Executor │──>│ Reviewer │──>│ Tester │──>│ Documenter  │  │\n  │  │(Adapter│<──│(Adapter) │   │(Adapter│   │  (Adapter)  │  │\n  │  └───┬────┘   └──────────┘   └────────┘   └─────────────┘  │\n  │      │  ↕ StuckDetector                                      │\n  │  ┌───┴────────────────────────────────────────────────────┐  │\n  │  │ Adapters: Claude | Codex | Responses | Cursor | Hermes | Opencode │  │\n  │  └────────────────────────────────────────────────────────┘  │\n  └──────────────────────────────────────────────────────────────┘\n           │                     │                     │\n           v                     v                     v\n  ┌──────────────┐  ┌──────────────────┐  ┌──────────────────┐\n  │  Discord Bot │  │  Memory (LanceDB │  │  Knowledge Graph │\n  │  (commands)  │  │  + Xenova E5)    │  │  (code analysis) │\n  └──────────────┘  └──────────────────┘  └────────┬─────────┘\n                                                    │\n                                           ┌────────┴─────────┐\n                                           │  Code Registry   │\n                                           │  (SQLite + FTS5) │\n                                           │  + BS Detector   │\n                                           └──────────────────┘\n```\n\n## Features\n\n- **Multi-Provider Adapters** — Pluggable adapter system: **Claude Code**, **Codex**, **Responses API**, **Cursor**, **Hermes**, and **Opencode**\n- **Code Registry** — SQLite-backed entity registry tracking every function/class/type across 8 languages, with complexity scoring, test mapping, and risk assessment\n- **WorkItem Store** — PostgreSQL-backed work-item persistence and Kanban UI, with SQLite kept only as a legacy fallback path\n- **BS Detector** — Built-in static analysis engine that detects bad code patterns (empty catch, hardcoded secrets, `as any`, etc.) with pipeline guard integration\n- **Autonomous Pipeline** — Cron-driven heartbeat fetches Azdo workItems, runs Executor/Reviewer pair loops, and updates workItem state automatically\n- **Executor/Reviewer Pairs** — Multi-iteration code generation with automated review, testing, and documentation stages\n- **Decision Engine** — Scope validation, rate limiting, priority-based task selection, and workflow mapping\n- **Cognitive Memory** — LanceDB vector store with Xenova/multilingual-e5-base embeddings for long-term recall across sessions\n- **Knowledge Graph** — Static code analysis, dependency mapping, impact analysis, and file-level conflict detection across concurrent tasks\n- **Discord Control** — Full command interface for monitoring, task dispatch, scheduling, provider switching, and pair session management\n- **Rich TUI Chat** — Claude Code inspired terminal interface with tabs, streaming responses, and geek-themed loading messages\n- **Dynamic Scheduling** — Cron-based job scheduler with Discord management commands\n- **PR Auto-Improvement** — Monitors open PRs, auto-fixes CI failures, auto-resolves merge conflicts, and retries until all checks pass\n- **Long-Running Monitors** — Track external processes (training jobs, batch tasks) and report completion\n- **Web Dashboard** — Real-time pipeline stages, cost tracking, worktree status, and live logs on port 3847\n- **Pace Control** — 5-hour rolling window task caps, per-project limits, turbo mode, exponential backoff on failures\n- **i18n** — English and Korean locale support\n\n---\n\n## How It Works\n\n> How the driver routes work-item types to the right executor, grader, and loop contract shape (Frontend/UI vs Backend vs Docs tiers, Paseo grader operations, and validated learnings) is documented in [`FACTORY_DRIVE_DECISION_TREE.md`](./FACTORY_DRIVE_DECISION_TREE.md). System data-flow is in [`FACTORY_FLOW.md`](./FACTORY_FLOW.md).\n\n```\nAzdo (Todo/In Progress)\n  → Fetch assigned workItems\n  → DecisionEngine filters & prioritizes\n  → Resolve project path via projectMapper\n  → PairPipeline.run()\n    → Executor generates code (Claude CLI)\n    → Reviewer evaluates (APPROVE/REVISE/REJECT)\n    → Loop up to N iterations\n    → Optional: Tester → Documenter stages\n  → Update Azdo workItem state (Done/Blocked)\n  → Report to Discord\n  → Save to cognitive memory\n```\n\n### Memory System\n\nHybrid retrieval: `0.55 × similarity + 0.20 × importance + 0.15 × recency + 0.10 × frequency`\n\nMemory types: `belief` · `strategy` · `user_model` · `system_pattern` · `constraint`\n\nBackground: decay, consolidation, contradiction detection, distillation.\n\n---\n\n## Discord Commands\n\n### Task Dispatch\n| Command | Description |\n|---------|-------------|\n| `!dev <repo> \"<task>\"` | Run a dev task on a repository |\n| `!dev list` | List known repositories |\n| `!tasks` | List running tasks |\n| `!cancel <taskId>` | Cancel a running task |\n\n### Agent Management\n| Command | Description |\n|---------|-------------|\n| `!status` | Agent and system status |\n| `!pause <session>` | Pause autonomous work |\n| `!resume <session>` | Resume autonomous work |\n| `!log <session> [lines]` | View recent output |\n\n### Azdo Integration\n| Command | Description |\n|---------|-------------|\n| `!workItems` | List Azdo workItems |\n| `!workItem <id>` | View workItem details |\n| `!limits` | Agent daily execution limits |\n\n### Autonomous Execution\n| Command | Description |\n|---------|-------------|\n| `!auto` | Execution status |\n| `!auto start [cron] [--pair]` | Start autonomous mode |\n| `!auto stop` | Stop autonomous mode |\n| `!auto run` | Trigger immediate heartbeat |\n| `!approve` / `!reject` | Approve or reject pending task |\n\n### Executor/Reviewer Pair\n| Command | Description |\n|---------|-------------|\n| `!pair` | Pair session status |\n| `!pair start [taskId]` | Start a pair session |\n| `!pair run <taskId> [project]` | Direct pair run |\n| `!pair stop [sessionId]` | Stop a pair session |\n| `!pair history [n]` | View session history |\n| `!pair stats` | View pair statistics |\n\n### Scheduling\n| Command | Description |\n|---------|-------------|\n| `!schedule` | List all schedules |\n| `!schedule run <name>` | Run a schedule immediately |\n| `!schedule toggle <name>` | Enable/disable a schedule |\n| `!schedule add <name> <path> <interval> \"<prompt>\"` | Add a schedule |\n| `!schedule remove <name>` | Remove a schedule |\n\n### Other\n| Command | Description |\n|---------|-------------|\n| `!ci` | GitHub CI failure status |\n| `!provider <claude\\|codex>` | Switch CLI provider at runtime |\n| `!codex` | Recent session records |\n| `!memory search \"<query>\"` | Search cognitive memory |\n| `!help` | Full command reference |\n\n---\n\n## Project Structure\n\n```\nsrc/\n├── index.ts                 # Entry point\n├── cli.ts                   # CLI entry point (run, exec, chat, init, validate, start)\n├── cli/                     # CLI subcommand handlers\n│   └── promptHandler.ts     # exec command: daemon submit, auto-start, polling\n├── core/                    # Config, service lifecycle, types, event hub\n├── adapters/                # CLI/provider adapters (claude, codex, responses), process registry\n├── agents/                  # Executor, reviewer, tester, documenter, auditor\n│   ├── pairPipeline.ts      # Executor → Reviewer → Tester → Documenter pipeline\n│   ├── agentBus.ts          # Inter-agent message bus\n│   └── cliStreamParser.ts   # Claude CLI output parser\n├── orchestration/           # Decision engine, task parser, scheduler, workflow\n├── automation/              # Autonomous runner, cron scheduler, PR processor\n├── memory/                  # LanceDB + Xenova embeddings cognitive memory\n├── knowledge/               # Code knowledge graph (scanner, analyzer, graph)\n├── registry/                # Code entity registry, BS detector, entity scanner\n├── workItems/                  # Postgres-first workItem tracker (GraphQL + Kanban UI)\n├── discord/                 # Bot core, command handlers, pair session UI\n├── azdo/                  # Azdo SDK wrapper, project updater\n├── github/                  # GitHub CLI wrapper for CI monitoring\n├── support/                 # Web dashboard, planner, rollback, git tools\n├── locale/                  # i18n (en/ko) with prompt templates\n└── __tests__/               # Vitest test suite\n```\n\n## State & Data\n\n| Path | Description |\n|------|-------------|\n| `~/.enact/factory/` | Global Factory state directory (cache, logs, plans, reports, research, sessions, state) |\n| `~/.enact/factory/state/registry.db` | Code entity registry (SQLite) |\n| `~/.enact/factory/state/workItems.db` | PostgreSQL workItem store (global config; legacy SQLite fallback only if explicitly configured) |\n| `~/.claude/enact-factory-*.json` | Pipeline history and task state |\n| `../config.toml` | Canonical workspace configuration |\n| `dist/` | Compiled output |\n\n---\n\n\n## Tech Stack\n\n| Category | Technology |\n|----------|-----------|\n| Runtime | Node.js 22+ (ESM) |\n| Language | TypeScript (strict mode) |\n| Build | tsc |\n| Agent Execution | Claude Code, Codex, Responses API, Cursor, Hermes, Opencode |\n| WorkItem Store | PostgreSQL (default) |\n| Code Registry DB | better-sqlite3 (WAL mode, FTS5) |\n| Task Management | Azdo SDK (`@azdo/sdk`) |\n| Communication | Discord.js 14 |\n| Vector DB | LanceDB + Apache Arrow |\n| Embeddings | Xenova/transformers (multilingual-e5-base, 768D) |\n| Scheduling | Croner |\n| Config | YAML + Zod validation |\n| Linting | oxlint |\n| Testing | Vitest |\n\n---\n\n## Changelog\n\n### v0.3.0\n- **Code Registry**: `enact-factory check --scan` scans repo, registers 1000+ entities across 8 languages (TS, Python, Go, Rust, Java, C, C++, C#) with test mapping, complexity scoring, and risk assessment\n- **BS Detector**: `enact-factory check --bs` — built-in static analysis for bad code patterns, pipeline guard integration\n- **Responses Adapter**: Gateway-backed `/v1/responses` execution with env-based bearer auth\n- **Responses Status**: Transport works today, but full agent parity is deferred until the loop semantics in `docs/a_proposed/RESPONSES_AGENT_LOOP_SEMANTICS.md` land\n- **WorkItem Tracker**: PostgreSQL + GraphQL + Kanban web UI at `:3847/workItems`\n- **CLI**: `enact-factory check`, `enact-factory annotate` commands\n\n### v0.2.2\n- `enact-factory` without arguments now launches TUI chat directly\n\n### v0.2.1\n- Security: patched lodash, picomatch, rollup, undici, yaml vulnerabilities\n\n### v0.2.0\n- Multi-project orchestration via Azdo ticket routing\n- Standalone driver module extracted for reuse\n- Autonomous runner hardening and multi-project orchestration\n- Task-state rehydration from Azdo comments\n- `--verbose` flag for detailed execution logging\n- Codex adapter: dropped o-series model override\n\n### v0.1.0\n- Initial release\n- Executor/Reviewer pair pipeline\n- Claude Code CLI, Codex, Cursor-family adapters, and a Responses API seam\n- Discord bot control\n- Azdo integration\n- LanceDB cognitive memory\n- Web dashboard (port 3847)\n- Rich TUI chat interface\n\n---\n\n## License\n\nThis project is licensed under the proprietary **Agent Development License (ADL)**.  \nSee [LICENSE](LICENSE) for full terms.\n\n© Enact Factory. All rights reserved.\n","readmeFilename":"README.md"}