@moretea-labs/forge 1.5.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (903) hide show
  1. package/AGENTS.md +120 -0
  2. package/CHANGELOG.md +36 -0
  3. package/CLAUDE.md +120 -0
  4. package/CODE_OF_CONDUCT.md +23 -0
  5. package/CONTRIBUTING.md +77 -0
  6. package/LICENSE +22 -0
  7. package/NOTICE +9 -0
  8. package/README.en.md +5 -0
  9. package/README.es.md +12 -0
  10. package/README.fr.md +12 -0
  11. package/README.ja.md +12 -0
  12. package/README.md +132 -0
  13. package/README.zh-CN.md +84 -0
  14. package/SECURITY.md +50 -0
  15. package/SKILL.md +431 -0
  16. package/SUPPORT.md +31 -0
  17. package/THIRD_PARTY_NOTICES.md +18 -0
  18. package/agents/openai.yaml +4 -0
  19. package/assets/AGENTS.md +68 -0
  20. package/assets/CLAUDE.md +68 -0
  21. package/assets/branding/README.md +10 -0
  22. package/assets/branding/forge-controller-flow.mmd +8 -0
  23. package/assets/hooks/AGENTS.md +75 -0
  24. package/assets/hooks/CLAUDE.md +75 -0
  25. package/assets/hooks/anti-simplification.sh +12 -0
  26. package/assets/hooks/changelog-guard.sh +80 -0
  27. package/assets/hooks/codex.hooks.template.json +60 -0
  28. package/assets/hooks/first-principles-guard.sh +72 -0
  29. package/assets/hooks/hook-input.sh +618 -0
  30. package/assets/hooks/lib/session-state.sh +106 -0
  31. package/assets/hooks/lib/workflow-state.sh +1730 -0
  32. package/assets/hooks/post-bash.sh +215 -0
  33. package/assets/hooks/post-edit-guard.sh +256 -0
  34. package/assets/hooks/post-tool-observer.sh +99 -0
  35. package/assets/hooks/pre-edit-guard.sh +240 -0
  36. package/assets/hooks/prompt-guard.sh +1077 -0
  37. package/assets/hooks/run-hook.sh +67 -0
  38. package/assets/hooks/security-sentinel.sh +115 -0
  39. package/assets/hooks/session-start-context.sh +593 -0
  40. package/assets/hooks/settings.template.json +60 -0
  41. package/assets/hooks/stop-orchestrator.sh +171 -0
  42. package/assets/hooks/subagent-return-channel-guard.sh +107 -0
  43. package/assets/hooks/worktree-guard.sh +39 -0
  44. package/assets/initializer-question-pack.v1.json +132 -0
  45. package/assets/initializer-question-pack.v1.schema.json +46 -0
  46. package/assets/initializer-question-pack.v2.json +174 -0
  47. package/assets/initializer-question-pack.v3.json +206 -0
  48. package/assets/initializer-question-pack.v3.schema.json +92 -0
  49. package/assets/initializer-question-pack.v4.json +557 -0
  50. package/assets/initializer-question-pack.v4.schema.json +169 -0
  51. package/assets/partials/01-header.partial.md +10 -0
  52. package/assets/partials/02-iron-rules.partial.md +30 -0
  53. package/assets/partials/03-philosophy.partial.md +32 -0
  54. package/assets/partials/04-project-structure.partial.md +56 -0
  55. package/assets/partials/05-workflow.partial.md +79 -0
  56. package/assets/partials/06-cloudflare.partial.md +20 -0
  57. package/assets/partials/07-footer.partial.md +38 -0
  58. package/assets/partials/08-orchestration.partial.md +49 -0
  59. package/assets/partials/09-compact-instructions.partial.md +11 -0
  60. package/assets/partials/_assembly-order.md +40 -0
  61. package/assets/partials-agents/01-header.partial.md +8 -0
  62. package/assets/partials-agents/02-operating-mode.partial.md +44 -0
  63. package/assets/partials-agents/03-orchestration.partial.md +45 -0
  64. package/assets/partials-agents/04-task-protocol.partial.md +69 -0
  65. package/assets/partials-agents/05-coding-constraints.partial.md +20 -0
  66. package/assets/partials-agents/06-quality-safety.partial.md +23 -0
  67. package/assets/partials-agents/07-cloudflare.partial.md +9 -0
  68. package/assets/partials-agents/08-deep-docs.partial.md +32 -0
  69. package/assets/plan-map.json +301 -0
  70. package/assets/plugin-registry.v1.json +8 -0
  71. package/assets/project-structures/ai-native-collaborative-editor.txt +25 -0
  72. package/assets/project-structures/ai-native-product-copilot.txt +21 -0
  73. package/assets/project-structures/ai-native-runtime-console.txt +25 -0
  74. package/assets/project-structures/ai-native-sidecar-kernel.txt +19 -0
  75. package/assets/project-structures/astro-ssr.txt +25 -0
  76. package/assets/project-structures/expo-nativewind.txt +52 -0
  77. package/assets/project-structures/monorepo.txt +63 -0
  78. package/assets/project-structures/remix.txt +50 -0
  79. package/assets/project-structures/tanstack-start-workers.txt +51 -0
  80. package/assets/project-structures/vite-tanstack.txt +58 -0
  81. package/assets/reference-configs/AGENTS.md +13 -0
  82. package/assets/reference-configs/CLAUDE.md +13 -0
  83. package/assets/reference-configs/agentic-development-flow.md +94 -0
  84. package/assets/reference-configs/ai-workflows.md +14 -0
  85. package/assets/reference-configs/changelog-versioning.md +13 -0
  86. package/assets/reference-configs/coding-standards.md +14 -0
  87. package/assets/reference-configs/development-protocol.md +21 -0
  88. package/assets/reference-configs/document-generation.md +38 -0
  89. package/assets/reference-configs/evaluator-rubric.md +19 -0
  90. package/assets/reference-configs/external-tooling.md +374 -0
  91. package/assets/reference-configs/git-strategy.md +14 -0
  92. package/assets/reference-configs/global-working-rules.md +64 -0
  93. package/assets/reference-configs/handoff-protocol.md +38 -0
  94. package/assets/reference-configs/harness-overview.md +124 -0
  95. package/assets/reference-configs/heartbeat-triage.md +57 -0
  96. package/assets/reference-configs/hook-operations.md +96 -0
  97. package/assets/reference-configs/release-deploy.md +40 -0
  98. package/assets/reference-configs/spa-day-protocol.md +14 -0
  99. package/assets/reference-configs/sprint-contracts.md +89 -0
  100. package/assets/reference-configs/workflow-orchestration.md +14 -0
  101. package/assets/skill-hooks.json +41 -0
  102. package/assets/skill-version.json +189 -0
  103. package/assets/skills/claude-review/SKILL.md +231 -0
  104. package/assets/skills/codex-review/SKILL.md +103 -0
  105. package/assets/templates/AGENTS.md +13 -0
  106. package/assets/templates/CLAUDE.md +13 -0
  107. package/assets/templates/architecture.template.md +80 -0
  108. package/assets/templates/brief.template.md +38 -0
  109. package/assets/templates/contract.template.md +104 -0
  110. package/assets/templates/decisions.template.md +85 -0
  111. package/assets/templates/factor-factory/factor-backtest-report.template.md +36 -0
  112. package/assets/templates/factor-factory/factor-hypothesis.template.md +30 -0
  113. package/assets/templates/factor-factory/factor-registry.template.json +5 -0
  114. package/assets/templates/gitignore.template +53 -0
  115. package/assets/templates/guides/metro-esm-gotchas.template.md +46 -0
  116. package/assets/templates/helpers/architecture-event.ts +822 -0
  117. package/assets/templates/helpers/architecture-queue.sh +647 -0
  118. package/assets/templates/helpers/archive-architecture-request.sh +244 -0
  119. package/assets/templates/helpers/archive-workflow.sh +295 -0
  120. package/assets/templates/helpers/capability-config.ts +394 -0
  121. package/assets/templates/helpers/capability-resolver.ts +505 -0
  122. package/assets/templates/helpers/capture-plan.sh +335 -0
  123. package/assets/templates/helpers/check-agent-tooling.sh +1533 -0
  124. package/assets/templates/helpers/check-architecture-sync.sh +287 -0
  125. package/assets/templates/helpers/check-brain-manifest.sh +255 -0
  126. package/assets/templates/helpers/check-context-files.sh +49 -0
  127. package/assets/templates/helpers/check-deploy-sql-order.sh +117 -0
  128. package/assets/templates/helpers/check-skill-version.ts +193 -0
  129. package/assets/templates/helpers/check-task-sync.sh +65 -0
  130. package/assets/templates/helpers/check-task-workflow.sh +1002 -0
  131. package/assets/templates/helpers/codex-handoff-resume.sh +269 -0
  132. package/assets/templates/helpers/context-contract-sync.sh +516 -0
  133. package/assets/templates/helpers/contract-run.ts +465 -0
  134. package/assets/templates/helpers/contract-worktree.sh +725 -0
  135. package/assets/templates/helpers/ensure-task-workflow.sh +1218 -0
  136. package/assets/templates/helpers/harness-trace-grade.sh +150 -0
  137. package/assets/templates/helpers/heartbeat-triage.sh +361 -0
  138. package/assets/templates/helpers/inspect-project-state.ts +280 -0
  139. package/assets/templates/helpers/maintenance-triage.sh +167 -0
  140. package/assets/templates/helpers/migrate-project-template.sh +54 -0
  141. package/assets/templates/helpers/migrate-workflow-docs.ts +413 -0
  142. package/assets/templates/helpers/new-plan.sh +183 -0
  143. package/assets/templates/helpers/new-spec.sh +50 -0
  144. package/assets/templates/helpers/new-sprint.sh +49 -0
  145. package/assets/templates/helpers/plan-to-todo.sh +799 -0
  146. package/assets/templates/helpers/prepare-codex-handoff.sh +203 -0
  147. package/assets/templates/helpers/prepare-handoff.sh +81 -0
  148. package/assets/templates/helpers/refresh-current-status.sh +469 -0
  149. package/assets/templates/helpers/select-agent-context-blocks.sh +66 -0
  150. package/assets/templates/helpers/ship-worktrees.sh +561 -0
  151. package/assets/templates/helpers/sprint-backlog.sh +837 -0
  152. package/assets/templates/helpers/summarize-failures.sh +125 -0
  153. package/assets/templates/helpers/switch-plan.sh +153 -0
  154. package/assets/templates/helpers/sync-brain-docs.sh +381 -0
  155. package/assets/templates/helpers/verify-contract.sh +705 -0
  156. package/assets/templates/helpers/verify-sprint.sh +680 -0
  157. package/assets/templates/helpers/workflow-contract.ts +202 -0
  158. package/assets/templates/helpers/workstream-sync.sh +263 -0
  159. package/assets/templates/implementation-notes.template.md +37 -0
  160. package/assets/templates/packages.template.md +45 -0
  161. package/assets/templates/plan.template.md +77 -0
  162. package/assets/templates/prd.template.md +165 -0
  163. package/assets/templates/research.template.md +25 -0
  164. package/assets/templates/review.template.md +78 -0
  165. package/assets/templates/spec.template.md +31 -0
  166. package/assets/templates/sprint.template.md +69 -0
  167. package/assets/templates/tech-stack.template.md +57 -0
  168. package/assets/versions.json +77 -0
  169. package/assets/workflow-contract.v1.json +671 -0
  170. package/bin/forge-desktop-helper.mjs +204 -0
  171. package/bin/forge-hook.mjs +32 -0
  172. package/bin/forge-runtime-service.mjs +34 -0
  173. package/bin/forge-runtime.mjs +30 -0
  174. package/bin/forge.mjs +32 -0
  175. package/docs/CHANGELOG.md +978 -0
  176. package/docs/README.md +72 -0
  177. package/docs/README.zh-CN.md +58 -0
  178. package/docs/architecture/chatgpt-handoff-facade.md +393 -0
  179. package/docs/architecture/current/README.md +158 -0
  180. package/docs/architecture/current/approved-target-architecture.zh-CN.md +1501 -0
  181. package/docs/architecture/current/architecture-invariants.md +331 -0
  182. package/docs/architecture/current/automation-and-schedule-engine.md +453 -0
  183. package/docs/architecture/current/codegraph-context-provider.md +226 -0
  184. package/docs/architecture/current/control-plane-authority-inventory.md +82 -0
  185. package/docs/architecture/current/controller-repository-decoupling.md +148 -0
  186. package/docs/architecture/current/dispatch-and-agent-strategy.md +354 -0
  187. package/docs/architecture/current/entity-model.md +619 -0
  188. package/docs/architecture/current/external-plugin-governance.md +396 -0
  189. package/docs/architecture/current/failure-recovery.md +471 -0
  190. package/docs/architecture/current/governance.md +213 -0
  191. package/docs/architecture/current/human-interaction-plane.md +87 -0
  192. package/docs/architecture/current/implementation-status.md +128 -0
  193. package/docs/architecture/current/job-and-run-lifecycle.md +413 -0
  194. package/docs/architecture/current/local-workspace-target-grants.md +70 -0
  195. package/docs/architecture/current/migration-roadmap.md +105 -0
  196. package/docs/architecture/current/multi-repository-execution.md +371 -0
  197. package/docs/architecture/current/operations-runbook.md +45 -0
  198. package/docs/architecture/current/peer-supercontroller-runtime.md +32 -0
  199. package/docs/architecture/current/personal-assistant-plugin-baseline.md +207 -0
  200. package/docs/architecture/current/repository-access-modes.md +102 -0
  201. package/docs/architecture/current/route-policy.md +15 -0
  202. package/docs/architecture/current/route-session-concurrency.md +85 -0
  203. package/docs/architecture/current/runtime-architecture-simplification.md +214 -0
  204. package/docs/architecture/current/runtime-directory-map.md +49 -0
  205. package/docs/architecture/current/runtime-health-and-resource-lifecycle.md +85 -0
  206. package/docs/architecture/current/scheduler-and-resource-claims.md +432 -0
  207. package/docs/architecture/current/session-aware-execution-and-authorization.md +77 -0
  208. package/docs/architecture/current/system-overview.md +144 -0
  209. package/docs/architecture/current/target-requirements-traceability.md +202 -0
  210. package/docs/architecture/current/thin-harness-governance-policy.md +32 -0
  211. package/docs/architecture/current/thin-harness-v1.md +313 -0
  212. package/docs/architecture/current/verification-and-release-gates.md +391 -0
  213. package/docs/architecture/decisions/20260801-controller-home-sqlite-state.md +100 -0
  214. package/docs/architecture/decisions/20260803-canonical-skill-surface.md +40 -0
  215. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +53 -0
  216. package/docs/architecture/diagrams/.gitkeep +1 -0
  217. package/docs/architecture/diagrams/agentic-dev-plugin-architecture.html +186 -0
  218. package/docs/architecture/domains/.gitkeep +0 -0
  219. package/docs/architecture/domains/public-surface.md +30 -0
  220. package/docs/architecture/domains/runtime-harness.md +33 -0
  221. package/docs/architecture/domains/verification.md +33 -0
  222. package/docs/architecture/domains/workflow-engine.md +30 -0
  223. package/docs/architecture/global-hook-runtime.md +162 -0
  224. package/docs/architecture/history.md +38 -0
  225. package/docs/architecture/index.md +114 -0
  226. package/docs/architecture/ios-semantic-automation-provider-v2.md +166 -0
  227. package/docs/architecture/modules/.gitkeep +0 -0
  228. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +24 -0
  229. package/docs/architecture/requests/.gitkeep +1 -0
  230. package/docs/architecture/requests/archive/2026/20260528-154740-ai-hooks-ai-hooks-hook-input-sh.md +59 -0
  231. package/docs/architecture/requests/archive/2026/20260528-154816-assets-hooks-assets-hooks-hook-input-sh.md +59 -0
  232. package/docs/architecture/requests/archive/2026/20260528-161851-ai-harness-workflow-contract-json-ai-harness-workflow-contract-json.md +59 -0
  233. package/docs/architecture/requests/archive/2026/20260528-161853-scripts-check-task-workflow-sh-scripts-check-task-workflow-sh.md +59 -0
  234. package/docs/architecture/requests/archive/2026/20260528-161911-assets-workflow-contract-v1-json-assets-workflow-contract-v1-json.md +59 -0
  235. package/docs/architecture/requests/archive/2026/20260528-222416-ai-hooks-ai-hooks-hook-input-sh.md +59 -0
  236. package/docs/architecture/requests/archive/2026/20260528-222444-ai-hooks-ai-hooks-pre-edit-guard-sh.md +59 -0
  237. package/docs/architecture/requests/archive/2026/20260528-222457-ai-hooks-ai-hooks-pre-edit-guard-sh.md +59 -0
  238. package/docs/architecture/requests/archive/2026/20260528-222648-ai-hooks-ai-hooks-pre-edit-guard-sh.md +59 -0
  239. package/docs/architecture/requests/archive/2026/20260528-222705-ai-hooks-ai-hooks-worktree-guard-sh.md +59 -0
  240. package/docs/architecture/requests/archive/2026/20260528-222726-ai-hooks-ai-hooks-prompt-guard-sh.md +59 -0
  241. package/docs/architecture/requests/archive/2026/20260528-222727-ai-hooks-ai-hooks-prompt-guard-sh.md +59 -0
  242. package/docs/architecture/requests/archive/2026/20260528-224736-ai-hooks-ai-hooks-hook-input-sh.md +59 -0
  243. package/docs/architecture/requests/archive/2026/20260528-233259-ai-hooks-ai-hooks-prompt-guard-sh.md +59 -0
  244. package/docs/architecture/requests/archive/2026/20260528-233335-assets-hooks-assets-hooks-prompt-guard-sh.md +59 -0
  245. package/docs/architecture/requests/archive/2026/20260528-233456-ai-hooks-ai-hooks-prompt-guard-sh.md +59 -0
  246. package/docs/architecture/requests/archive/2026/20260528-233457-assets-hooks-assets-hooks-prompt-guard-sh.md +59 -0
  247. package/docs/architecture/requests/archive/2026/20260528-233637-ai-hooks-ai-hooks-prompt-guard-sh.md +59 -0
  248. package/docs/architecture/requests/archive/2026/20260528-233638-assets-hooks-assets-hooks-prompt-guard-sh.md +59 -0
  249. package/docs/architecture/requests/archive/2026/20260529-000322-root-package-json.md +59 -0
  250. package/docs/architecture/requests/archive/2026/20260529-004238-ai-hooks-ai-hooks-lib-workflow-state-sh.md +59 -0
  251. package/docs/architecture/requests/archive/2026/20260529-020654-ai-harness-policy-json-ai-harness-policy-json.md +63 -0
  252. package/docs/architecture/requests/archive/2026/20260529-094236-ai-hooks-ai-hooks-prompt-guard-sh.md +60 -0
  253. package/docs/architecture/requests/archive/2026/20260529-094323-assets-hooks-assets-hooks-prompt-guard-sh.md +60 -0
  254. package/docs/architecture/requests/archive/2026/20260529-094331-ai-hooks-ai-hooks-prompt-guard-sh.md +60 -0
  255. package/docs/architecture/requests/archive/2026/20260529-094339-assets-hooks-assets-hooks-prompt-guard-sh.md +60 -0
  256. package/docs/architecture/requests/archive/2026/20260529-094430-assets-hooks-assets-hooks-session-start-context-sh.md +60 -0
  257. package/docs/architecture/requests/archive/2026/20260529-094446-ai-hooks-ai-hooks-session-start-context-sh.md +60 -0
  258. package/docs/architecture/requests/archive/2026/20260613-002040-runtime-harness-hook-adapters.md +68 -0
  259. package/docs/architecture/requests/archive/2026/root.md +68 -0
  260. package/docs/architecture/requests/archive/2026/runtime-harness-hook-adapters.md +76 -0
  261. package/docs/architecture/requests/archive/2026/verification-evals-checks.md +68 -0
  262. package/docs/architecture/requests/archive/2026/workflow-engine-contract-assets.md +69 -0
  263. package/docs/architecture/reviews/2026-07-11-access-surface-review.md +99 -0
  264. package/docs/architecture/snapshots/.gitkeep +1 -0
  265. package/docs/forge-autonomous-goal-loop.md +7 -0
  266. package/docs/forge-chatgpt-browser-engine.md +11 -0
  267. package/docs/forge-chatgpt-mcp-setup.md +239 -0
  268. package/docs/forge-chatgpt-supervised-automation.md +11 -0
  269. package/docs/forge-github-issue-launcher.md +7 -0
  270. package/docs/forge-plugin-management.md +95 -0
  271. package/docs/forge-provider-configuration.md +7 -0
  272. package/docs/forge-runtime-self-healing-loop.md +7 -0
  273. package/docs/images/forge-banner-cn.svg +1 -0
  274. package/docs/images/forge-banner.svg +1 -0
  275. package/docs/images/forge-controller-flow.svg +1 -0
  276. package/docs/images/image.png +0 -0
  277. package/docs/images/repo-harness-gptpro-cn.png +0 -0
  278. package/docs/images/repo-harness-gptpro.png +0 -0
  279. package/docs/images/repo-harness-hook-carrot.png +0 -0
  280. package/docs/operations/chatgpt-personal-assistant-runtime.md +83 -0
  281. package/docs/operations/checkout-route-integrity.md +22 -0
  282. package/docs/operations/controller-browser-plugin.md +299 -0
  283. package/docs/operations/controller-desktop-plugin.md +112 -0
  284. package/docs/operations/controller-performance-and-502.md +126 -0
  285. package/docs/operations/controller-reliability-runbook.md +134 -0
  286. package/docs/operations/environment-hardening.md +50 -0
  287. package/docs/operations/features.md +45 -0
  288. package/docs/operations/features.zh-CN.md +45 -0
  289. package/docs/operations/github-repository.md +60 -0
  290. package/docs/operations/gmail-assistant-routines.md +186 -0
  291. package/docs/operations/homebrew.md +26 -0
  292. package/docs/operations/local-system-assistant.md +46 -0
  293. package/docs/operations/local-system-assistant.zh-CN.md +46 -0
  294. package/docs/operations/mcp-tool-exposure.md +58 -0
  295. package/docs/operations/mobile-intents-shortcuts.md +117 -0
  296. package/docs/operations/open-source-release-hygiene.md +31 -0
  297. package/docs/operations/personal-assistant-operator-guide.md +61 -0
  298. package/docs/operations/platform-support.md +62 -0
  299. package/docs/operations/platform-support.zh-CN.md +61 -0
  300. package/docs/operations/provider-configuration.md +31 -0
  301. package/docs/operations/releasing.md +86 -0
  302. package/docs/operations/releasing.zh-CN.md +86 -0
  303. package/docs/operations/route-session-concurrency-baseline.json +893 -0
  304. package/docs/operations/route-session-concurrency-baseline.md +94 -0
  305. package/docs/operations/runtime-performance-diagnostics.md +14 -0
  306. package/docs/operations/sqlite-control-plane-recovery.md +65 -0
  307. package/docs/operations/standalone-disaster-recovery.md +136 -0
  308. package/docs/operations/troubleshooting.md +72 -0
  309. package/docs/operations/troubleshooting.zh-CN.md +70 -0
  310. package/docs/public-usage-guide.md +33 -0
  311. package/docs/public-usage-guide.zh-CN.md +33 -0
  312. package/docs/tutorials/01-install-and-start.md +93 -0
  313. package/docs/tutorials/01-install-and-start.zh-CN.md +93 -0
  314. package/docs/tutorials/02-connect-chatgpt.md +82 -0
  315. package/docs/tutorials/02-connect-chatgpt.zh-CN.md +80 -0
  316. package/docs/tutorials/03-first-repository-task.md +57 -0
  317. package/docs/tutorials/03-first-repository-task.zh-CN.md +57 -0
  318. package/docs/tutorials/README.md +13 -0
  319. package/docs/tutorials/README.zh-CN.md +13 -0
  320. package/docs/wiki/Architecture.md +85 -0
  321. package/docs/wiki/Core-Concepts.md +27 -0
  322. package/docs/wiki/Home.md +36 -0
  323. package/docs/wiki/Implementation.md +172 -0
  324. package/docs/wiki/Installation.md +50 -0
  325. package/docs/wiki/Integrations.md +29 -0
  326. package/docs/wiki/Operations.md +26 -0
  327. package/docs/wiki/Quick-Start.md +46 -0
  328. package/docs/wiki/Releases-and-Upgrades.md +34 -0
  329. package/docs/wiki/Runtime-Architecture.md +50 -0
  330. package/docs/wiki/Security-Model.md +31 -0
  331. package/docs/wiki/Troubleshooting.md +38 -0
  332. package/docs/wiki/Work-Lifecycle.md +31 -0
  333. package/docs/wiki/_Sidebar.md +21 -0
  334. package/install.ps1 +48 -0
  335. package/install.sh +66 -0
  336. package/package.json +156 -0
  337. package/scripts/activate-source-baseline.ts +335 -0
  338. package/scripts/architecture-event.ts +822 -0
  339. package/scripts/architecture-queue.sh +647 -0
  340. package/scripts/archive-architecture-request.sh +244 -0
  341. package/scripts/archive-workflow.sh +295 -0
  342. package/scripts/assemble-template.ts +1172 -0
  343. package/scripts/benchmark-controller-hotpath.ts +212 -0
  344. package/scripts/benchmark-controller-round2.ts +139 -0
  345. package/scripts/benchmark-ios-agent-device.ts +514 -0
  346. package/scripts/benchmark-route-session-concurrency.ts +714 -0
  347. package/scripts/benchmark-thin-harness-gateway-ab.ts +632 -0
  348. package/scripts/benchmark-thin-harness-mcp-e2e.ts +479 -0
  349. package/scripts/benchmark-thin-harness.ts +251 -0
  350. package/scripts/bootstrap-runtime-maintenance-recovery.sh +183 -0
  351. package/scripts/canary-global-hook.sh +263 -0
  352. package/scripts/capability-config.ts +394 -0
  353. package/scripts/capability-resolver.ts +505 -0
  354. package/scripts/capture-plan.sh +335 -0
  355. package/scripts/check-agent-tooling.sh +1549 -0
  356. package/scripts/check-architecture-sync.sh +373 -0
  357. package/scripts/check-brain-manifest.sh +255 -0
  358. package/scripts/check-ci.sh +16 -0
  359. package/scripts/check-context-files.sh +49 -0
  360. package/scripts/check-deploy-sql-order.sh +117 -0
  361. package/scripts/check-mcp-compatibility.ts +93 -0
  362. package/scripts/check-npm-release.sh +32 -0
  363. package/scripts/check-open-source-tracked-surface.sh +146 -0
  364. package/scripts/check-package-identity.mjs +117 -0
  365. package/scripts/check-platform-support.mjs +79 -0
  366. package/scripts/check-public-docs.sh +105 -0
  367. package/scripts/check-public-release-surface.sh +19 -0
  368. package/scripts/check-release-published.sh +57 -0
  369. package/scripts/check-release-readiness.sh +43 -0
  370. package/scripts/check-release-version.mjs +74 -0
  371. package/scripts/check-runtime-architecture.mjs +593 -0
  372. package/scripts/check-runtime-env.mjs +89 -0
  373. package/scripts/check-skill-version.ts +193 -0
  374. package/scripts/check-tarball-install-smoke.sh +66 -0
  375. package/scripts/check-task-sync.sh +65 -0
  376. package/scripts/check-task-workflow.sh +1002 -0
  377. package/scripts/check-third-party-notices.mjs +36 -0
  378. package/scripts/codex-handoff-resume.sh +269 -0
  379. package/scripts/complete-control-plane-cutover.ts +126 -0
  380. package/scripts/context-contract-sync.sh +516 -0
  381. package/scripts/contract-run.ts +465 -0
  382. package/scripts/contract-worktree.sh +725 -0
  383. package/scripts/controller-ngrok-rotation.sh +678 -0
  384. package/scripts/create-project-dirs.sh +282 -0
  385. package/scripts/ensure-codegraph.sh +16 -0
  386. package/scripts/ensure-task-workflow.sh +1218 -0
  387. package/scripts/export-requirement-portfolio.ts +28 -0
  388. package/scripts/factor-lab-check.sh +73 -0
  389. package/scripts/factor-lab-new.sh +96 -0
  390. package/scripts/factor-lab-promote.sh +86 -0
  391. package/scripts/factor-lab-reject.sh +68 -0
  392. package/scripts/harness-trace-grade.sh +150 -0
  393. package/scripts/heartbeat-triage.sh +361 -0
  394. package/scripts/hook-dispatch-diet-report.ts +234 -0
  395. package/scripts/hook-shim.sh +93 -0
  396. package/scripts/init-project.sh +505 -0
  397. package/scripts/initializer-question-pack.ts +200 -0
  398. package/scripts/inspect-project-state.ts +280 -0
  399. package/scripts/install-desktop-operator-registration.ts +45 -0
  400. package/scripts/install-standalone-recovery.ts +74 -0
  401. package/scripts/lib/AGENTS.md +13 -0
  402. package/scripts/lib/CLAUDE.md +13 -0
  403. package/scripts/lib/controller-home-env.sh +69 -0
  404. package/scripts/lib/project-init-lib.sh +2759 -0
  405. package/scripts/load-standalone-recovery.sh +17 -0
  406. package/scripts/loop-engine-cutover-gate.ts +324 -0
  407. package/scripts/maintenance-triage.sh +167 -0
  408. package/scripts/migrate-project-template.sh +1189 -0
  409. package/scripts/migrate-requirement-portfolio.ts +86 -0
  410. package/scripts/migrate-workflow-docs.ts +413 -0
  411. package/scripts/new-plan.sh +183 -0
  412. package/scripts/new-spec.sh +50 -0
  413. package/scripts/new-sprint.sh +49 -0
  414. package/scripts/open-source-audit-allowlist.txt +46 -0
  415. package/scripts/package-source-archive.sh +147 -0
  416. package/scripts/plan-to-todo.sh +799 -0
  417. package/scripts/prepare-codex-handoff.sh +203 -0
  418. package/scripts/prepare-handoff.sh +81 -0
  419. package/scripts/public-release-files.txt +39 -0
  420. package/scripts/public-release.ts +174 -0
  421. package/scripts/publish-release-tarball.sh +27 -0
  422. package/scripts/refresh-current-status.sh +469 -0
  423. package/scripts/refresh-ios-physical-runtime.ts +196 -0
  424. package/scripts/repair-executable-modes.ts +8 -0
  425. package/scripts/rollout-all-registered-repos.sh +7 -0
  426. package/scripts/route-nl-vs-ts-eval.ts +679 -0
  427. package/scripts/run-bun-test-file.ts +182 -0
  428. package/scripts/run-governed-gate.ts +140 -0
  429. package/scripts/run-mobile-monitor-bridge.ts +71 -0
  430. package/scripts/run-skill-evals.ts +1022 -0
  431. package/scripts/run-skill-hook.ts +244 -0
  432. package/scripts/run-supervised-command.ts +24 -0
  433. package/scripts/run-tests-portable.sh +20 -0
  434. package/scripts/select-agent-context-blocks.sh +66 -0
  435. package/scripts/setup-plugins.sh +43 -0
  436. package/scripts/ship-worktrees.sh +561 -0
  437. package/scripts/smoke-browser-cdp-bridge.ts +93 -0
  438. package/scripts/smoke-chatgpt-supervised-automation.ts +208 -0
  439. package/scripts/smoke-ios-physical-device.ts +114 -0
  440. package/scripts/smoke-mcp-http-runtime.ts +216 -0
  441. package/scripts/smoke-mcp-tool-surface.ts +117 -0
  442. package/scripts/smoke-runtime-recovery.ts +220 -0
  443. package/scripts/smoke-schedule-engine.ts +283 -0
  444. package/scripts/sprint-backlog.sh +837 -0
  445. package/scripts/stage-runtime-release.ts +38 -0
  446. package/scripts/summarize-failures.sh +125 -0
  447. package/scripts/switch-plan.sh +153 -0
  448. package/scripts/sync-brain-docs.sh +381 -0
  449. package/scripts/sync-codex-installed-copies.sh +183 -0
  450. package/scripts/test-governance.ts +75 -0
  451. package/scripts/verify-contract.sh +705 -0
  452. package/scripts/verify-forge-runtime.sh +31 -0
  453. package/scripts/verify-sprint.sh +680 -0
  454. package/scripts/windows-paths.d.mts +7 -0
  455. package/scripts/windows-paths.mjs +28 -0
  456. package/scripts/workflow-contract.ts +206 -0
  457. package/scripts/workstream-sync.sh +263 -0
  458. package/src/cli/agent-jobs/executable-resolver.ts +289 -0
  459. package/src/cli/agent-jobs/executor-health.ts +252 -0
  460. package/src/cli/agent-jobs/integration.ts +963 -0
  461. package/src/cli/agent-jobs/job-manager.ts +2030 -0
  462. package/src/cli/agent-jobs/types.ts +219 -0
  463. package/src/cli/agent-jobs/worker-lifecycle.ts +288 -0
  464. package/src/cli/chatgpt-browser/bind-server.ts +504 -0
  465. package/src/cli/chatgpt-browser/binding.ts +140 -0
  466. package/src/cli/chatgpt-browser/bridge-extension.ts +221 -0
  467. package/src/cli/chatgpt-browser/bridge-provider.ts +268 -0
  468. package/src/cli/chatgpt-browser/engine.ts +569 -0
  469. package/src/cli/chatgpt-browser/file-policy.ts +158 -0
  470. package/src/cli/chatgpt-browser/native-provider.ts +553 -0
  471. package/src/cli/chatgpt-browser/oracle-provider.ts +437 -0
  472. package/src/cli/chatgpt-browser/prompt-assembler.ts +29 -0
  473. package/src/cli/chatgpt-browser/session-store.ts +301 -0
  474. package/src/cli/chatgpt-browser/types.ts +172 -0
  475. package/src/cli/commands/adopt-plan.ts +186 -0
  476. package/src/cli/commands/brain-root.ts +132 -0
  477. package/src/cli/commands/brain.ts +609 -0
  478. package/src/cli/commands/capability-context.ts +613 -0
  479. package/src/cli/commands/chatgpt.ts +424 -0
  480. package/src/cli/commands/controller.ts +680 -0
  481. package/src/cli/commands/docs.ts +103 -0
  482. package/src/cli/commands/doctor.ts +476 -0
  483. package/src/cli/commands/global-runtime.ts +323 -0
  484. package/src/cli/commands/hook.ts +34 -0
  485. package/src/cli/commands/init-hook.ts +870 -0
  486. package/src/cli/commands/init.ts +829 -0
  487. package/src/cli/commands/install.ts +86 -0
  488. package/src/cli/commands/mcp.ts +315 -0
  489. package/src/cli/commands/migrate.ts +154 -0
  490. package/src/cli/commands/plugin.ts +74 -0
  491. package/src/cli/commands/prompt-guard-decision.ts +238 -0
  492. package/src/cli/commands/recovery.ts +667 -0
  493. package/src/cli/commands/repository.ts +224 -0
  494. package/src/cli/commands/run.ts +23 -0
  495. package/src/cli/commands/runtime.ts +191 -0
  496. package/src/cli/commands/security.ts +440 -0
  497. package/src/cli/commands/status.ts +137 -0
  498. package/src/cli/commands/tools.ts +167 -0
  499. package/src/cli/controller/check-runner.ts +1022 -0
  500. package/src/cli/controller/codex-continuation.ts +153 -0
  501. package/src/cli/controller/completion-backlog.ts +380 -0
  502. package/src/cli/controller/completion-orchestrator.ts +1807 -0
  503. package/src/cli/controller/completion-target.ts +96 -0
  504. package/src/cli/controller/composite-operations.ts +196 -0
  505. package/src/cli/controller/composite-result.ts +130 -0
  506. package/src/cli/controller/context-pack.ts +652 -0
  507. package/src/cli/controller/execution-completion.ts +175 -0
  508. package/src/cli/controller/execution-policy.ts +392 -0
  509. package/src/cli/controller/governance.ts +594 -0
  510. package/src/cli/controller/issue-store.ts +1421 -0
  511. package/src/cli/controller/launch-agents.ts +410 -0
  512. package/src/cli/controller/legacy-issue-cutover.ts +415 -0
  513. package/src/cli/controller/lifecycle-authority.ts +16 -0
  514. package/src/cli/controller/migrated-issue-decision.ts +237 -0
  515. package/src/cli/controller/operational-plan.ts +226 -0
  516. package/src/cli/controller/postcondition.ts +134 -0
  517. package/src/cli/controller/progress.ts +656 -0
  518. package/src/cli/controller/project-state.ts +147 -0
  519. package/src/cli/controller/requirement-portfolio-export.ts +146 -0
  520. package/src/cli/controller/requirement-portfolio-migration.ts +613 -0
  521. package/src/cli/controller/run-evidence.ts +43 -0
  522. package/src/cli/controller/runtime-config.ts +92 -0
  523. package/src/cli/controller/stuck-state-migration.ts +396 -0
  524. package/src/cli/controller/task-ledger.ts +632 -0
  525. package/src/cli/controller/task-status-resolver.ts +403 -0
  526. package/src/cli/controller/types.ts +273 -0
  527. package/src/cli/controller/work-mode.ts +186 -0
  528. package/src/cli/controller/worklog.ts +201 -0
  529. package/src/cli/diagnostic-entry.ts +39 -0
  530. package/src/cli/editing/edit-session.ts +1606 -0
  531. package/src/cli/editing/executable-modes.ts +70 -0
  532. package/src/cli/github/github.ts +274 -0
  533. package/src/cli/github/plugin.ts +345 -0
  534. package/src/cli/github/session.ts +104 -0
  535. package/src/cli/hook/prompt-guard-decision.ts +238 -0
  536. package/src/cli/hook/prompt-intents.ts +534 -0
  537. package/src/cli/hook/route-registry.ts +107 -0
  538. package/src/cli/hook/runtime.ts +303 -0
  539. package/src/cli/hook/state-snapshot.ts +388 -0
  540. package/src/cli/hook-entry.ts +51 -0
  541. package/src/cli/index.ts +574 -0
  542. package/src/cli/installer/managed-entries.ts +78 -0
  543. package/src/cli/installer/shared.ts +65 -0
  544. package/src/cli/installer/targets/claude.ts +136 -0
  545. package/src/cli/installer/targets/codex.ts +174 -0
  546. package/src/cli/installer/targets/registry.ts +28 -0
  547. package/src/cli/installer/types.ts +72 -0
  548. package/src/cli/local-bridge/connector-freshness.ts +529 -0
  549. package/src/cli/local-bridge/console-view-models.ts +324 -0
  550. package/src/cli/local-bridge/dashboard.ts +1312 -0
  551. package/src/cli/local-bridge/facade-api.ts +1877 -0
  552. package/src/cli/local-bridge/job-store.ts +1451 -0
  553. package/src/cli/local-bridge/mobile-intents.ts +344 -0
  554. package/src/cli/local-bridge/mobile-monitor.ts +209 -0
  555. package/src/cli/local-bridge/server.ts +3183 -0
  556. package/src/cli/local-bridge/types.ts +176 -0
  557. package/src/cli/mcp/access-mode.ts +132 -0
  558. package/src/cli/mcp/access-tools.ts +387 -0
  559. package/src/cli/mcp/audit.ts +32 -0
  560. package/src/cli/mcp/auth.ts +402 -0
  561. package/src/cli/mcp/instructions.ts +33 -0
  562. package/src/cli/mcp/legacy-context.ts +16 -0
  563. package/src/cli/mcp/legacy-tool-service.ts +5516 -0
  564. package/src/cli/mcp/multi-repository.ts +423 -0
  565. package/src/cli/mcp/oauth.ts +226 -0
  566. package/src/cli/mcp/paths.ts +134 -0
  567. package/src/cli/mcp/policy.ts +230 -0
  568. package/src/cli/mcp/proxy-env.ts +62 -0
  569. package/src/cli/mcp/readiness-projection.ts +24 -0
  570. package/src/cli/mcp/redaction.ts +21 -0
  571. package/src/cli/mcp/repo.ts +24 -0
  572. package/src/cli/mcp/repository-tools.ts +1295 -0
  573. package/src/cli/mcp/server.ts +341 -0
  574. package/src/cli/mcp/setup.ts +793 -0
  575. package/src/cli/mcp/tool-capability-cache.ts +87 -0
  576. package/src/cli/mcp/tools.ts +9 -0
  577. package/src/cli/mcp/toolset-names.ts +70 -0
  578. package/src/cli/mcp/toolset-selection.ts +41 -0
  579. package/src/cli/mcp/toolset.ts +300 -0
  580. package/src/cli/mcp/transports/AGENTS.md +39 -0
  581. package/src/cli/mcp/transports/CLAUDE.md +39 -0
  582. package/src/cli/mcp/transports/http.ts +1234 -0
  583. package/src/cli/mcp/transports/session-registry.ts +428 -0
  584. package/src/cli/mcp/transports/stdio.ts +8 -0
  585. package/src/cli/mcp/types.ts +41 -0
  586. package/src/cli/mcp/umbrella-tools.ts +117 -0
  587. package/src/cli/repo-adoption/reclaim-runtime.ts +681 -0
  588. package/src/cli/repositories/branch-name-policy.ts +57 -0
  589. package/src/cli/repositories/command-classifier.ts +600 -0
  590. package/src/cli/repositories/command-executor.ts +1066 -0
  591. package/src/cli/repositories/command-normalization.ts +53 -0
  592. package/src/cli/repositories/command-scope.ts +264 -0
  593. package/src/cli/repositories/controller-home.ts +88 -0
  594. package/src/cli/repositories/entity-migration.ts +199 -0
  595. package/src/cli/repositories/ephemeral-workspace.ts +62 -0
  596. package/src/cli/repositories/git-command-executor.ts +301 -0
  597. package/src/cli/repositories/goal-registry.ts +239 -0
  598. package/src/cli/repositories/identity.ts +64 -0
  599. package/src/cli/repositories/local-project-onboarding.ts +539 -0
  600. package/src/cli/repositories/locks.ts +262 -0
  601. package/src/cli/repositories/registry.ts +1057 -0
  602. package/src/cli/repositories/runtime-storage.ts +411 -0
  603. package/src/cli/repositories/safe-patch.ts +421 -0
  604. package/src/cli/repositories/selected-path-actions.ts +341 -0
  605. package/src/cli/repositories/structured-git.ts +257 -0
  606. package/src/cli/repositories/types.ts +155 -0
  607. package/src/cli/repositories/umbrella.ts +134 -0
  608. package/src/cli/repositories/workbench.ts +140 -0
  609. package/src/cli/repositories/worktree-storage.ts +137 -0
  610. package/src/cli/repository/inspector.ts +637 -0
  611. package/src/cli/repository/session-cache.ts +453 -0
  612. package/src/cli/runtime/helper-runner.ts +172 -0
  613. package/src/cli/runtime-invocation.ts +318 -0
  614. package/src/cli/tools/codegraph.ts +676 -0
  615. package/src/cli/v81-entry.ts +29 -0
  616. package/src/core/adoption/gitignore-plan.ts +127 -0
  617. package/src/core/adoption/helper-wrapper-plan.ts +159 -0
  618. package/src/core/adoption/manifest-templates.ts +60 -0
  619. package/src/core/adoption/modes.ts +7 -0
  620. package/src/core/adoption/operations.ts +126 -0
  621. package/src/core/adoption/plan.ts +149 -0
  622. package/src/core/adoption/render.ts +70 -0
  623. package/src/core/adoption/rollback.ts +62 -0
  624. package/src/core/adoption/summary.ts +43 -0
  625. package/src/core/adoption/workflow-contract-asset.ts +14 -0
  626. package/src/core/adoption/workflow-contract-plan.ts +31 -0
  627. package/src/effects/fs-transaction.ts +540 -0
  628. package/src/effects/git-executable.ts +59 -0
  629. package/src/effects/managed-block.ts +86 -0
  630. package/src/effects/path-safety.ts +47 -0
  631. package/src/effects/process-runner.ts +192 -0
  632. package/src/runtime/assistant/action-proposals.ts +279 -0
  633. package/src/runtime/assistant/intent.ts +395 -0
  634. package/src/runtime/assistant/model-provider.ts +460 -0
  635. package/src/runtime/assistant/openapi.ts +223 -0
  636. package/src/runtime/assistant/policy.ts +89 -0
  637. package/src/runtime/assistant/readiness.ts +258 -0
  638. package/src/runtime/assistant/routine-runtime.ts +477 -0
  639. package/src/runtime/assistant/schedule-binding.ts +171 -0
  640. package/src/runtime/assistant/standing-grants.ts +375 -0
  641. package/src/runtime/assistant/store.ts +243 -0
  642. package/src/runtime/assistant/types.ts +135 -0
  643. package/src/runtime/context/codegraph-read-provider.ts +347 -0
  644. package/src/runtime/context/codegraph-sidecar.cjs +207 -0
  645. package/src/runtime/control-plane/dispatch-priority.ts +67 -0
  646. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +151 -0
  647. package/src/runtime/control-plane/execution/execution-identity.ts +456 -0
  648. package/src/runtime/control-plane/execution/session-store.ts +175 -0
  649. package/src/runtime/control-plane/execution/validation.ts +117 -0
  650. package/src/runtime/control-plane/execution/verification-evidence.ts +191 -0
  651. package/src/runtime/control-plane/execution/work-handle-store.ts +225 -0
  652. package/src/runtime/control-plane/execution/work-prepare-request-store.ts +159 -0
  653. package/src/runtime/control-plane/execution/work-task-receipt.ts +445 -0
  654. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +821 -0
  655. package/src/runtime/control-plane/facade/capability-registry.ts +279 -0
  656. package/src/runtime/control-plane/facade/check-normalization.ts +233 -0
  657. package/src/runtime/control-plane/facade/codex-delegation.ts +196 -0
  658. package/src/runtime/control-plane/facade/controller-session-store.ts +199 -0
  659. package/src/runtime/control-plane/facade/facade-result.ts +41 -0
  660. package/src/runtime/control-plane/facade/goal-workloop-access.ts +177 -0
  661. package/src/runtime/control-plane/facade/goal-workloop.ts +1216 -0
  662. package/src/runtime/control-plane/facade/handoff-inbox-store.ts +221 -0
  663. package/src/runtime/control-plane/facade/index.ts +16 -0
  664. package/src/runtime/control-plane/facade/operation-digest.ts +528 -0
  665. package/src/runtime/control-plane/facade/plan-contract-store.ts +403 -0
  666. package/src/runtime/control-plane/facade/policy-gate.ts +149 -0
  667. package/src/runtime/control-plane/facade/requirement-board.ts +280 -0
  668. package/src/runtime/control-plane/facade/self-healing-loop.ts +555 -0
  669. package/src/runtime/control-plane/facade/suggested-actions.ts +108 -0
  670. package/src/runtime/control-plane/facade/types.ts +729 -0
  671. package/src/runtime/control-plane/facade/work-admission-policy.ts +93 -0
  672. package/src/runtime/control-plane/facade/work-continuation.ts +104 -0
  673. package/src/runtime/control-plane/facade/work-contract-store.ts +1118 -0
  674. package/src/runtime/control-plane/facade/work-task-projection.ts +66 -0
  675. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +365 -0
  676. package/src/runtime/control-plane/global-scheduler/scheduler.ts +920 -0
  677. package/src/runtime/control-plane/global-scheduler/wake-signal.ts +89 -0
  678. package/src/runtime/control-plane/goal-loop/config-facade.ts +700 -0
  679. package/src/runtime/control-plane/goal-loop/config-store.ts +570 -0
  680. package/src/runtime/control-plane/goal-loop/config-types.ts +213 -0
  681. package/src/runtime/control-plane/goal-loop/executor-router.ts +109 -0
  682. package/src/runtime/control-plane/goal-loop/failure-taxonomy.ts +149 -0
  683. package/src/runtime/control-plane/goal-loop/goal-contract-store.ts +304 -0
  684. package/src/runtime/control-plane/goal-loop/goal-loop-engine.ts +1001 -0
  685. package/src/runtime/control-plane/goal-loop/handoff-packet.ts +160 -0
  686. package/src/runtime/control-plane/goal-loop/index.ts +13 -0
  687. package/src/runtime/control-plane/goal-loop/local-tools.ts +290 -0
  688. package/src/runtime/control-plane/goal-loop/policy-gates.ts +203 -0
  689. package/src/runtime/control-plane/goal-loop/provider-dispatch.ts +93 -0
  690. package/src/runtime/control-plane/goal-loop/provider-registry.ts +545 -0
  691. package/src/runtime/control-plane/goal-loop/types.ts +378 -0
  692. package/src/runtime/control-plane/governance/access-policy.ts +147 -0
  693. package/src/runtime/control-plane/governance/authorization.ts +195 -0
  694. package/src/runtime/control-plane/governance/external-effects.ts +43 -0
  695. package/src/runtime/control-plane/launcher/thin-launcher.ts +97 -0
  696. package/src/runtime/control-plane/persistence/metadata-payload-policy.ts +53 -0
  697. package/src/runtime/control-plane/persistence/requirement-store.ts +241 -0
  698. package/src/runtime/control-plane/persistence/sqlite-store.ts +539 -0
  699. package/src/runtime/control-plane/release-retention.ts +447 -0
  700. package/src/runtime/control-plane/repo-actor/actor.ts +181 -0
  701. package/src/runtime/control-plane/repo-actor/registry.ts +20 -0
  702. package/src/runtime/control-plane/routing/index.ts +1 -0
  703. package/src/runtime/control-plane/routing/route-policy.ts +379 -0
  704. package/src/runtime/control-plane/runtime-cleanup.ts +727 -0
  705. package/src/runtime/control-plane/runtime-generation.ts +509 -0
  706. package/src/runtime/control-plane/runtime-pid-ownership.ts +11 -0
  707. package/src/runtime/control-plane/runtime-status-client.ts +90 -0
  708. package/src/runtime/control-plane/startup-recovery.ts +198 -0
  709. package/src/runtime/diagnostics/connectivity-observability.ts +475 -0
  710. package/src/runtime/diagnostics/mcp-timing.ts +64 -0
  711. package/src/runtime/diagnostics/performance.ts +379 -0
  712. package/src/runtime/diagnostics/process-facade.ts +350 -0
  713. package/src/runtime/diagnostics/read-only-tool.ts +226 -0
  714. package/src/runtime/evidence/artifact-store.ts +154 -0
  715. package/src/runtime/evidence/event-ledger.ts +80 -0
  716. package/src/runtime/evidence/evidence-store.ts +68 -0
  717. package/src/runtime/evidence/process-check-receipt.ts +43 -0
  718. package/src/runtime/evidence/result-store.ts +209 -0
  719. package/src/runtime/evidence/sensitive-output.ts +353 -0
  720. package/src/runtime/execution/jobs/child-reference.ts +124 -0
  721. package/src/runtime/execution/jobs/legacy-adapter.ts +22 -0
  722. package/src/runtime/execution/jobs/receipt-recovery.ts +119 -0
  723. package/src/runtime/execution/jobs/receipt-store.ts +243 -0
  724. package/src/runtime/execution/jobs/store.ts +737 -0
  725. package/src/runtime/execution/jobs/timeouts.ts +109 -0
  726. package/src/runtime/execution/jobs/types.ts +230 -0
  727. package/src/runtime/execution/jobs/wait.ts +45 -0
  728. package/src/runtime/execution/process-runtime/canary.ts +26 -0
  729. package/src/runtime/execution/process-runtime/check-facade.ts +272 -0
  730. package/src/runtime/execution/process-runtime/check-receipt.ts +185 -0
  731. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +60 -0
  732. package/src/runtime/execution/process-runtime/command-facade.ts +321 -0
  733. package/src/runtime/execution/process-runtime/gc.ts +171 -0
  734. package/src/runtime/execution/process-runtime/index.ts +9 -0
  735. package/src/runtime/execution/process-runtime/interactive-admission.ts +23 -0
  736. package/src/runtime/execution/process-runtime/process-runner-entry.ts +466 -0
  737. package/src/runtime/execution/process-runtime/resource-claims.ts +440 -0
  738. package/src/runtime/execution/process-runtime/runtime.ts +1816 -0
  739. package/src/runtime/execution/process-runtime/store.ts +687 -0
  740. package/src/runtime/execution/process-runtime/types.ts +352 -0
  741. package/src/runtime/execution/thin-harness/async-process.ts +181 -0
  742. package/src/runtime/execution/thin-harness/batch-executor.ts +671 -0
  743. package/src/runtime/execution/thin-harness/execution-router.ts +700 -0
  744. package/src/runtime/execution/thin-harness/fast-executor.ts +1263 -0
  745. package/src/runtime/execution/thin-harness/fast-receipt.ts +235 -0
  746. package/src/runtime/execution/thin-harness/fingerprint-worker.ts +191 -0
  747. package/src/runtime/execution/thin-harness/index.ts +13 -0
  748. package/src/runtime/execution/thin-harness/latency-trace.ts +107 -0
  749. package/src/runtime/execution/thin-harness/lightweight-lanes.ts +745 -0
  750. package/src/runtime/execution/thin-harness/mutation-gate.ts +578 -0
  751. package/src/runtime/execution/thin-harness/proposal-store.ts +409 -0
  752. package/src/runtime/execution/thin-harness/request-ledger.ts +595 -0
  753. package/src/runtime/execution/thin-harness/search-worker.ts +114 -0
  754. package/src/runtime/execution/thin-harness/types.ts +313 -0
  755. package/src/runtime/execution/thin-harness/workspace-savepoint.ts +333 -0
  756. package/src/runtime/execution/workers/executor.ts +687 -0
  757. package/src/runtime/execution/workers/ownership.ts +94 -0
  758. package/src/runtime/execution/workers/worker-entry.ts +277 -0
  759. package/src/runtime/gateway/mcp/execution-tools.ts +2009 -0
  760. package/src/runtime/gateway/mcp/persisted-check-process.ts +255 -0
  761. package/src/runtime/gateway/mcp/process-tools.ts +230 -0
  762. package/src/runtime/gateway/mcp/resource-policy.ts +195 -0
  763. package/src/runtime/gateway/mcp/router.ts +1088 -0
  764. package/src/runtime/gateway/mcp/runtime-tools.ts +5994 -0
  765. package/src/runtime/gateway/mcp/work-validation-reconciler.ts +219 -0
  766. package/src/runtime/health/evaluator.ts +474 -0
  767. package/src/runtime/health/index.ts +2 -0
  768. package/src/runtime/health/operational-view.ts +198 -0
  769. package/src/runtime/maintenance/cleanup.ts +419 -0
  770. package/src/runtime/model-clients/deepseek-adapter.ts +312 -0
  771. package/src/runtime/model-clients/index.ts +2 -0
  772. package/src/runtime/model-clients/types.ts +101 -0
  773. package/src/runtime/observability/gateway-contention-metrics.ts +129 -0
  774. package/src/runtime/observability/route-session-benchmark.ts +110 -0
  775. package/src/runtime/personal-assistant/gmail-triage-manager.ts +231 -0
  776. package/src/runtime/personal-assistant/reporting-runtime.ts +344 -0
  777. package/src/runtime/personal-assistant/triage-runtime.ts +748 -0
  778. package/src/runtime/plugins/app-store-connect-adapter.ts +868 -0
  779. package/src/runtime/plugins/browser-adapter.ts +2812 -0
  780. package/src/runtime/plugins/browser-automation-service.ts +46 -0
  781. package/src/runtime/plugins/browser-handoff-host.ts +304 -0
  782. package/src/runtime/plugins/browser-handoff.ts +371 -0
  783. package/src/runtime/plugins/browser-macos-bridge.ts +865 -0
  784. package/src/runtime/plugins/browser-node-bridge-host.ts +64 -0
  785. package/src/runtime/plugins/browser-node-bridge.ts +249 -0
  786. package/src/runtime/plugins/desktop-adapter.ts +374 -0
  787. package/src/runtime/plugins/desktop-operator-registration.ts +418 -0
  788. package/src/runtime/plugins/errors.ts +39 -0
  789. package/src/runtime/plugins/execution-origin.ts +26 -0
  790. package/src/runtime/plugins/external-adapter.ts +322 -0
  791. package/src/runtime/plugins/external-registration.ts +308 -0
  792. package/src/runtime/plugins/external-unix-socket-probe.cjs +79 -0
  793. package/src/runtime/plugins/external-unix-socket.ts +238 -0
  794. package/src/runtime/plugins/first-party-registry.ts +37 -0
  795. package/src/runtime/plugins/github-adapter.ts +266 -0
  796. package/src/runtime/plugins/gmail-adapter.ts +729 -0
  797. package/src/runtime/plugins/google-calendar-adapter.ts +468 -0
  798. package/src/runtime/plugins/google-shared.ts +578 -0
  799. package/src/runtime/plugins/google-tasks-adapter.ts +535 -0
  800. package/src/runtime/plugins/interaction-session.ts +252 -0
  801. package/src/runtime/plugins/ios/agent-device-capabilities.ts +258 -0
  802. package/src/runtime/plugins/ios/agent-device-failures.ts +95 -0
  803. package/src/runtime/plugins/ios/agent-device-provider.ts +63 -0
  804. package/src/runtime/plugins/ios/agent-device-typed-provider.ts +268 -0
  805. package/src/runtime/plugins/ios/app-adapters.ts +122 -0
  806. package/src/runtime/plugins/ios-adapter.ts +509 -0
  807. package/src/runtime/plugins/ios-agent-device.ts +2311 -0
  808. package/src/runtime/plugins/ios-physical-device.ts +955 -0
  809. package/src/runtime/plugins/local-system-adapter.ts +1016 -0
  810. package/src/runtime/plugins/macos-capability-broker.ts +73 -0
  811. package/src/runtime/plugins/managed-process-adapter.ts +366 -0
  812. package/src/runtime/plugins/resend-adapter.ts +506 -0
  813. package/src/runtime/plugins/store.ts +1025 -0
  814. package/src/runtime/plugins/types.ts +138 -0
  815. package/src/runtime/projections/controller-context.ts +596 -0
  816. package/src/runtime/projections/git-status-sampler.ts +84 -0
  817. package/src/runtime/projections/invalidation.ts +250 -0
  818. package/src/runtime/projections/materialized-view.ts +694 -0
  819. package/src/runtime/recovery/actions.ts +158 -0
  820. package/src/runtime/recovery/audit.ts +38 -0
  821. package/src/runtime/recovery/classifier.ts +163 -0
  822. package/src/runtime/recovery/index.ts +9 -0
  823. package/src/runtime/recovery/local-jobs-repair.ts +393 -0
  824. package/src/runtime/recovery/maintenance-executor.ts +822 -0
  825. package/src/runtime/recovery/patch-handoff.ts +50 -0
  826. package/src/runtime/recovery/probe.ts +308 -0
  827. package/src/runtime/recovery/store.ts +35 -0
  828. package/src/runtime/recovery/types.ts +175 -0
  829. package/src/runtime/release/identity.ts +101 -0
  830. package/src/runtime/release/release-gate.ts +137 -0
  831. package/src/runtime/resources/claims/conflicts.ts +205 -0
  832. package/src/runtime/resources/index.ts +1 -0
  833. package/src/runtime/resources/leases/store.ts +539 -0
  834. package/src/runtime/resources/leases/types.ts +50 -0
  835. package/src/runtime/resources/ownership.ts +72 -0
  836. package/src/runtime/root/controller-services.ts +42 -0
  837. package/src/runtime/root/entry.ts +70 -0
  838. package/src/runtime/root/gateway-adapter.ts +46 -0
  839. package/src/runtime/root/local-bridge.ts +72 -0
  840. package/src/runtime/root/mcp-transport.ts +198 -0
  841. package/src/runtime/root/ownership.ts +94 -0
  842. package/src/runtime/root/readiness.ts +69 -0
  843. package/src/runtime/root/release-manifest.ts +147 -0
  844. package/src/runtime/root/release-materialize.ts +509 -0
  845. package/src/runtime/root/release-store.ts +236 -0
  846. package/src/runtime/root/runtime.ts +318 -0
  847. package/src/runtime/root/scheduler.ts +58 -0
  848. package/src/runtime/root/service-runner-entry.ts +20 -0
  849. package/src/runtime/root/service-runner.ts +69 -0
  850. package/src/runtime/root/service.ts +291 -0
  851. package/src/runtime/root/status.ts +127 -0
  852. package/src/runtime/root/types.ts +112 -0
  853. package/src/runtime/root/write-fence.ts +309 -0
  854. package/src/runtime/safe-tooling/browser-safe.ts +133 -0
  855. package/src/runtime/safe-tooling/external-filesystem.ts +304 -0
  856. package/src/runtime/safe-tooling/google-credential-store.ts +95 -0
  857. package/src/runtime/safe-tooling/google-oauth-broker.ts +286 -0
  858. package/src/runtime/safe-tooling/index.ts +11 -0
  859. package/src/runtime/safe-tooling/ios-development.ts +1039 -0
  860. package/src/runtime/safe-tooling/job-summary.ts +361 -0
  861. package/src/runtime/safe-tooling/plugin-summary.ts +53 -0
  862. package/src/runtime/safe-tooling/resend-oauth.ts +387 -0
  863. package/src/runtime/safe-tooling/review-artifacts.ts +133 -0
  864. package/src/runtime/safe-tooling/types.ts +103 -0
  865. package/src/runtime/safe-tooling/workspace-auth.ts +116 -0
  866. package/src/runtime/shared/bounded-child-supervisor.ts +235 -0
  867. package/src/runtime/shared/idempotent-retry.ts +128 -0
  868. package/src/runtime/shared/json-files.ts +43 -0
  869. package/src/runtime/shared/local-bridge-surface.ts +231 -0
  870. package/src/runtime/shared/managed-env.ts +154 -0
  871. package/src/runtime/shared/node-ts-loader.mjs +50 -0
  872. package/src/runtime/shared/process-environment.ts +97 -0
  873. package/src/runtime/shared/process-identity.ts +72 -0
  874. package/src/runtime/shared/process-tree.ts +227 -0
  875. package/src/runtime/shared/response-budget.ts +246 -0
  876. package/src/runtime/standalone-recovery/core.ts +2275 -0
  877. package/src/runtime/standalone-recovery/entry.ts +686 -0
  878. package/src/runtime/standalone-recovery/http-transport.ts +317 -0
  879. package/src/runtime/standalone-recovery/installer.ts +747 -0
  880. package/src/runtime/standalone-recovery/release.ts +241 -0
  881. package/src/runtime/watchdog/workflow-watchdog.ts +118 -0
  882. package/src/runtime/workflow/campaigns/cleanup.ts +263 -0
  883. package/src/runtime/workflow/campaigns/engine.ts +112 -0
  884. package/src/runtime/workflow/campaigns/normalize.ts +100 -0
  885. package/src/runtime/workflow/campaigns/review.ts +315 -0
  886. package/src/runtime/workflow/campaigns/store.ts +526 -0
  887. package/src/runtime/workflow/campaigns/supervisor.ts +112 -0
  888. package/src/runtime/workflow/campaigns/types.ts +290 -0
  889. package/src/runtime/workflow/campaigns/workspace-agent.ts +155 -0
  890. package/src/runtime/workflow/campaigns/workspace.ts +200 -0
  891. package/src/runtime/workflow/findings/store.ts +165 -0
  892. package/src/runtime/workflow/findings/types.ts +36 -0
  893. package/src/runtime/workflow/portfolio/engine.ts +20 -0
  894. package/src/runtime/workflow/portfolio/store.ts +185 -0
  895. package/src/runtime/workflow/portfolio/types.ts +29 -0
  896. package/src/runtime/workflow/schedules/engine.ts +620 -0
  897. package/src/runtime/workflow/schedules/settlement.ts +144 -0
  898. package/src/runtime/workflow/schedules/store.ts +417 -0
  899. package/src/runtime/workflow/schedules/types.ts +124 -0
  900. package/src/runtime/workspace-targets/index.ts +24 -0
  901. package/src/runtime/workspace-targets/target-grant.ts +721 -0
  902. package/src/testing/test-governance.ts +626 -0
  903. package/src/version.ts +21 -0
@@ -0,0 +1,1189 @@
1
+ #!/bin/bash
2
+ # Migrate an existing project to the forge tasks-first harness model.
3
+ # - Shared hook source of truth: .ai/hooks/
4
+ # - User-level host adapters: ~/.claude/settings.json and ~/.codex/hooks.json
5
+ # - Stable product truth: docs/spec.md
6
+ # - Active-plan selector: .ai/harness/active-plan, with .claude/.active-plan legacy fallback
7
+ # - Sprint artifacts: plans/sprints/, tasks/contracts/, tasks/reviews/, .ai/context/context-map.json
8
+ # - Harness state: .ai/harness/checks/latest.json, .ai/harness/policy.json,
9
+ # .ai/harness/brain-manifest.json,
10
+ # .ai/harness/events.jsonl, .ai/harness/architecture/events.jsonl,
11
+ # .ai/harness/handoff/current.md,
12
+ # .ai/harness/handoff/resume.md,
13
+ # .ai/harness/failures/latest.jsonl, .ai/harness/security/.gitkeep,
14
+ # .ai/harness/worktrees/.gitkeep, .ai/harness/runs/.gitkeep
15
+ #
16
+ # Usage:
17
+ # bash scripts/migrate-project-template.sh --repo /path/to/repo --dry-run
18
+ # bash scripts/migrate-project-template.sh --repo /path/to/repo --apply
19
+
20
+ set -euo pipefail
21
+
22
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
23
+ SKILL_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
24
+ PI_LIB_DIR="$SCRIPT_DIR/lib"
25
+ if [[ -f "$PI_LIB_DIR/project-init-lib.sh" ]]; then
26
+ # shellcheck source=/dev/null
27
+ . "$PI_LIB_DIR/project-init-lib.sh"
28
+ fi
29
+ HOOK_ASSETS_DIR="$SKILL_ROOT/assets/hooks"
30
+ TEMPLATE_ASSETS_DIR="$SKILL_ROOT/assets/templates"
31
+ HELPER_ASSETS_DIR="$TEMPLATE_ASSETS_DIR/helpers"
32
+ FACTOR_FACTORY_ASSETS_DIR="$TEMPLATE_ASSETS_DIR/factor-factory"
33
+ WORKFLOW_CONTRACT_ASSET="$SKILL_ROOT/assets/workflow-contract.v1.json"
34
+ JQ_BIN="${FORGE_JQ_BIN:-jq}"
35
+
36
+ MODE="dry-run"
37
+ TARGET_REPO=""
38
+ INSPECT_OUTPUT=""
39
+
40
+ usage() {
41
+ cat <<'USAGE_EOF'
42
+ Usage: migrate-project-template.sh --repo <path> [--dry-run|--apply]
43
+
44
+ Options:
45
+ --repo <path> Target repository path
46
+ --dry-run Print planned changes only (default)
47
+ --apply Apply changes
48
+ --help Show help
49
+ USAGE_EOF
50
+ }
51
+
52
+ log() {
53
+ echo "[migrate] $*"
54
+ }
55
+
56
+ has_jq() {
57
+ command -v "$JQ_BIN" >/dev/null 2>&1
58
+ }
59
+
60
+ run_ts_script() {
61
+ local script_path="$1"
62
+ shift
63
+
64
+ if command -v bun >/dev/null 2>&1; then
65
+ bun "$script_path" "$@"
66
+ return $?
67
+ fi
68
+
69
+ if command -v node >/dev/null 2>&1; then
70
+ node --loader "$SKILL_ROOT/src/runtime/shared/node-ts-loader.mjs" "$script_path" "$@"
71
+ return $?
72
+ fi
73
+
74
+ echo "[migrate] Missing bun/node runtime for TypeScript helper: $script_path" >&2
75
+ return 1
76
+ }
77
+
78
+ merge_hook_settings_json() {
79
+ local base_file="$1"
80
+ local patch_file="$2"
81
+ local output_file="$3"
82
+
83
+ node - "$base_file" "$patch_file" "$output_file" <<'NODE_EOF'
84
+ const fs = require("fs");
85
+
86
+ const [, , basePath, patchPath, outputPath] = process.argv;
87
+
88
+ function readJson(path) {
89
+ return JSON.parse(fs.readFileSync(path, "utf8"));
90
+ }
91
+
92
+ function clone(value) {
93
+ return JSON.parse(JSON.stringify(value));
94
+ }
95
+
96
+ function matcherOf(block) {
97
+ return block && Object.prototype.hasOwnProperty.call(block, "matcher")
98
+ ? block.matcher ?? null
99
+ : null;
100
+ }
101
+
102
+ function ensureHooksArray(block) {
103
+ if (!Array.isArray(block.hooks)) {
104
+ block.hooks = [];
105
+ }
106
+ return block.hooks;
107
+ }
108
+
109
+ function hasCommand(block, command) {
110
+ return ensureHooksArray(block).some((hook) => (hook?.command ?? "") === command);
111
+ }
112
+
113
+ function mergeEventBlocks(baseBlocks, patchBlocks) {
114
+ const result = Array.isArray(baseBlocks) ? clone(baseBlocks) : [];
115
+
116
+ for (const patchBlock of Array.isArray(patchBlocks) ? patchBlocks : []) {
117
+ const matcher = matcherOf(patchBlock);
118
+ const patchHooks = Array.isArray(patchBlock?.hooks) ? patchBlock.hooks : [];
119
+
120
+ for (const patchHook of patchHooks) {
121
+ const command = patchHook?.command ?? "";
122
+ if (!command) continue;
123
+
124
+ const existingWithCommand = result.find(
125
+ (block) => matcherOf(block) === matcher && hasCommand(block, command)
126
+ );
127
+ if (existingWithCommand) continue;
128
+
129
+ const targetBlock = result.find((block) => matcherOf(block) === matcher);
130
+ if (targetBlock) {
131
+ ensureHooksArray(targetBlock).push(clone(patchHook));
132
+ continue;
133
+ }
134
+
135
+ const newBlock = matcher === null
136
+ ? { hooks: [clone(patchHook)] }
137
+ : { matcher, hooks: [clone(patchHook)] };
138
+ result.push(newBlock);
139
+ }
140
+ }
141
+
142
+ return result;
143
+ }
144
+
145
+ const base = readJson(basePath);
146
+ const patch = readJson(patchPath);
147
+
148
+ const merged = {
149
+ ...clone(base),
150
+ ...clone(Object.fromEntries(Object.entries(patch).filter(([key]) => key !== "hooks"))),
151
+ };
152
+
153
+ const baseHooks = (base && typeof base.hooks === "object" && base.hooks !== null) ? clone(base.hooks) : {};
154
+ const patchHooks = (patch && typeof patch.hooks === "object" && patch.hooks !== null) ? patch.hooks : {};
155
+
156
+ merged.hooks = baseHooks;
157
+ for (const [eventName, patchBlocks] of Object.entries(patchHooks)) {
158
+ merged.hooks[eventName] = mergeEventBlocks(baseHooks[eventName], patchBlocks);
159
+ }
160
+
161
+ fs.writeFileSync(outputPath, JSON.stringify(merged, null, 2) + "\n");
162
+ NODE_EOF
163
+ }
164
+
165
+ run_or_echo() {
166
+ if [[ "$MODE" == "apply" ]]; then
167
+ "$@"
168
+ else
169
+ printf '[dry-run]'
170
+ printf ' %q' "$@"
171
+ printf '\n'
172
+ fi
173
+ }
174
+
175
+ backup_if_exists() {
176
+ local path="$1"
177
+ if [[ -f "$path" ]]; then
178
+ run_or_echo cp "$path" "$path.bak.$(date +%Y%m%d%H%M%S)"
179
+ fi
180
+ }
181
+
182
+ remove_path_if_exists() {
183
+ local path="$1"
184
+ if [[ "$MODE" != "apply" ]]; then
185
+ echo "[dry-run] remove \"$path\" if it exists"
186
+ return 0
187
+ fi
188
+
189
+ if [[ -e "$path" ]]; then
190
+ rm -rf "$path"
191
+ fi
192
+ }
193
+
194
+ repo_relative_path() {
195
+ local repo="$1"
196
+ local path="$2"
197
+
198
+ if [[ "$path" == "$repo/"* ]]; then
199
+ printf '%s' "${path#"$repo/"}"
200
+ else
201
+ printf '%s' "$path"
202
+ fi
203
+ }
204
+
205
+ file_matches_any_source() {
206
+ local file_path="$1"
207
+ shift
208
+ local source_path
209
+
210
+ [[ -f "$file_path" ]] || return 1
211
+ for source_path in "$@"; do
212
+ [[ -f "$source_path" ]] || continue
213
+ if cmp -s "$file_path" "$source_path"; then
214
+ return 0
215
+ fi
216
+ done
217
+
218
+ return 1
219
+ }
220
+
221
+ file_has_forge_marker() {
222
+ local file_path="$1"
223
+
224
+ [[ -f "$file_path" ]] || return 1
225
+
226
+ grep -Eiq \
227
+ '(forge|claude-runtime-temp|Task Contract|Sprint Review|Deferred Goal Ledger|Workflow Contract|ContractWorktree|SprintBacklog|ArchitectureSync|ArchitectureDrift|BrainSync|CurrentStatus|\.ai/harness|\.claude/templates|tasks/contracts|tasks/reviews)' \
228
+ "$file_path"
229
+ }
230
+
231
+ is_self_host_source_repo() {
232
+ local repo="$1"
233
+ local repo_real
234
+ local source_real
235
+
236
+ repo_real="$(cd "$repo" 2>/dev/null && pwd -P || printf '%s' "$repo")"
237
+ source_real="$(cd "$SKILL_ROOT" 2>/dev/null && pwd -P || printf '%s' "$SKILL_ROOT")"
238
+
239
+ [[ "$repo_real" == "$source_real" ]]
240
+ }
241
+
242
+ is_generated_root_helper() {
243
+ local repo="$1"
244
+ local rel_path="$2"
245
+ local path="$repo/$rel_path"
246
+ local helper_name="${rel_path##*/}"
247
+
248
+ [[ "$rel_path" == scripts/* && -f "$path" ]] || return 1
249
+
250
+ if file_matches_any_source "$path" "$HELPER_ASSETS_DIR/$helper_name" "$SCRIPT_DIR/$helper_name"; then
251
+ return 0
252
+ fi
253
+
254
+ case "$helper_name" in
255
+ skill-factory-create.sh|skill-factory-check.sh|architecture-drift.sh)
256
+ file_has_forge_marker "$path"
257
+ return $?
258
+ ;;
259
+ esac
260
+
261
+ file_has_forge_marker "$path"
262
+ }
263
+
264
+ remove_generated_helper_if_owned() {
265
+ local repo="$1"
266
+ local rel_path="$2"
267
+ local path="$repo/$rel_path"
268
+ local display_path
269
+
270
+ display_path="$(repo_relative_path "$repo" "$path")"
271
+
272
+ if is_self_host_source_repo "$repo"; then
273
+ if [[ "$MODE" != "apply" ]]; then
274
+ echo "[dry-run] preserve self-host source helper \"$path\""
275
+ else
276
+ log "Preserved self-host source helper: $display_path"
277
+ fi
278
+ return 0
279
+ fi
280
+
281
+ if [[ "$MODE" != "apply" ]]; then
282
+ echo "[dry-run] remove generated helper \"$path\" if forge ownership is identifiable"
283
+ return 0
284
+ fi
285
+
286
+ [[ -e "$path" ]] || return 0
287
+
288
+ if is_generated_root_helper "$repo" "$rel_path"; then
289
+ rm -f "$path"
290
+ log "Removed generated legacy root helper: $display_path"
291
+ else
292
+ log "Preserved possible app-owned script: $display_path (not identifiable as forge generated helper)"
293
+ fi
294
+ }
295
+
296
+ prune_removed_hook_commands() {
297
+ local settings_file="$1"
298
+
299
+ if [[ "$MODE" != "apply" || ! -f "$settings_file" ]]; then
300
+ return 0
301
+ fi
302
+
303
+ if ! command -v node >/dev/null 2>&1; then
304
+ log "Skipping removed-hook pruning for $settings_file because node is unavailable"
305
+ return 0
306
+ fi
307
+
308
+ node - "$settings_file" <<'NODE_EOF'
309
+ const fs = require("fs");
310
+ const path = process.argv[2];
311
+ const removedFragments = ["memory-intake.sh", "skill-factory-session-end.sh"];
312
+
313
+ const settings = JSON.parse(fs.readFileSync(path, "utf8"));
314
+ if (!settings.hooks || typeof settings.hooks !== "object") {
315
+ process.exit(0);
316
+ }
317
+
318
+ const nextHooks = {};
319
+ for (const [eventName, blocks] of Object.entries(settings.hooks)) {
320
+ const keptBlocks = (Array.isArray(blocks) ? blocks : [])
321
+ .map((block) => {
322
+ const hooks = (Array.isArray(block.hooks) ? block.hooks : []).filter((hook) => {
323
+ const command = hook?.command ?? "";
324
+ return !removedFragments.some((fragment) => command.includes(fragment));
325
+ });
326
+ return hooks.length > 0 ? { ...block, hooks } : null;
327
+ })
328
+ .filter(Boolean);
329
+
330
+ if (keptBlocks.length > 0) {
331
+ nextHooks[eventName] = keptBlocks;
332
+ }
333
+ }
334
+
335
+ settings.hooks = nextHooks;
336
+ fs.writeFileSync(path, JSON.stringify(settings, null, 2) + "\n");
337
+ NODE_EOF
338
+ }
339
+
340
+ cleanup_removed_workflow_assets() {
341
+ local repo="$1"
342
+ local cleanup_mode
343
+ local rel_path
344
+
345
+ while IFS=$'\t' read -r cleanup_mode rel_path; do
346
+ [[ -z "$rel_path" ]] && continue
347
+ case "$cleanup_mode" in
348
+ generated_helper)
349
+ remove_generated_helper_if_owned "$repo" "$rel_path"
350
+ ;;
351
+ *)
352
+ remove_path_if_exists "$repo/$rel_path"
353
+ ;;
354
+ esac
355
+ done < <(pi_workflow_contract_upgrade_action_entries "$WORKFLOW_CONTRACT_ASSET" "remove" "known_generated")
356
+ }
357
+
358
+ ensure_runtime_gitignore_block() {
359
+ local repo="$1"
360
+ local file_path="$2"
361
+ local extra_entries=""
362
+ local helper_entries=""
363
+ if pi_should_enable_factor_factory "$(pi_plan_type)"; then
364
+ extra_entries="$(pi_factor_factory_gitignore_entries)"
365
+ fi
366
+ if ! is_self_host_source_repo "$repo" && ! pi_repo_pins_helper_source "$repo"; then
367
+ helper_entries="$(pi_helper_wrapper_gitignore_entries "$WORKFLOW_CONTRACT_ASSET")"
368
+ if [[ -n "$helper_entries" ]]; then
369
+ if [[ -n "$extra_entries" ]]; then
370
+ extra_entries="${extra_entries}"$'\n'"${helper_entries}"
371
+ else
372
+ extra_entries="$helper_entries"
373
+ fi
374
+ fi
375
+ fi
376
+ pi_ensure_gitignore_block "$file_path" "" "$extra_entries" "$MODE"
377
+ }
378
+
379
+ generated_helper_wrapper_paths() {
380
+ local helper_name
381
+ while IFS= read -r helper_name; do
382
+ [[ -z "$helper_name" ]] && continue
383
+ printf '%s\n' "$helper_name"
384
+ printf '%s\n' "scripts/forge/${helper_name#scripts/}"
385
+ done < <(pi_helper_wrapper_paths "$WORKFLOW_CONTRACT_ASSET")
386
+ }
387
+
388
+ untrack_generated_helper_wrappers() {
389
+ local repo="$1"
390
+ local rel_path
391
+
392
+ if is_self_host_source_repo "$repo" || pi_repo_pins_helper_source "$repo"; then
393
+ return 0
394
+ fi
395
+
396
+ if [[ "$MODE" != "apply" ]]; then
397
+ echo "[dry-run] untrack forge generated helper wrappers from git index when tracked"
398
+ return 0
399
+ fi
400
+
401
+ if ! git -C "$repo" rev-parse --is-inside-work-tree >/dev/null 2>&1; then
402
+ return 0
403
+ fi
404
+
405
+ while IFS= read -r rel_path; do
406
+ [[ -z "$rel_path" ]] && continue
407
+ if ! git -C "$repo" ls-files --error-unmatch -- "$rel_path" >/dev/null 2>&1; then
408
+ continue
409
+ fi
410
+ if [[ "$rel_path" == scripts/forge/* ]] || is_generated_root_helper "$repo" "$rel_path"; then
411
+ git -C "$repo" rm --cached --force --quiet -- "$rel_path"
412
+ log "Untracked generated helper wrapper: $rel_path"
413
+ else
414
+ log "Preserved tracked app-owned script: $rel_path"
415
+ fi
416
+ done < <(generated_helper_wrapper_paths)
417
+ }
418
+
419
+ migrate_active_plan_marker() {
420
+ local repo="$1"
421
+ local new_marker="$repo/.ai/harness/active-plan"
422
+ local legacy_marker="$repo/.claude/.active-plan"
423
+ local worktree_marker="$repo/.ai/harness/active-worktree"
424
+ local new_value=""
425
+ local legacy_value=""
426
+
427
+ if [[ "$MODE" != "apply" ]]; then
428
+ echo "[dry-run] migrate active-plan marker to .ai/harness/active-plan with .claude/.active-plan compatibility"
429
+ return 0
430
+ fi
431
+
432
+ if [[ -f "$new_marker" ]]; then
433
+ new_value="$(cat "$new_marker" 2>/dev/null | xargs)"
434
+ fi
435
+ if [[ -f "$legacy_marker" ]]; then
436
+ legacy_value="$(cat "$legacy_marker" 2>/dev/null | xargs)"
437
+ fi
438
+
439
+ if [[ -n "$new_value" ]]; then
440
+ mkdir -p "$(dirname "$legacy_marker")"
441
+ printf '%s' "$new_value" > "$legacy_marker"
442
+ mkdir -p "$(dirname "$worktree_marker")"
443
+ (cd "$repo" && pwd -P) > "$worktree_marker"
444
+ return 0
445
+ fi
446
+
447
+ if [[ -n "$legacy_value" ]]; then
448
+ mkdir -p "$(dirname "$new_marker")"
449
+ printf '%s' "$legacy_value" > "$new_marker"
450
+ (cd "$repo" && pwd -P) > "$worktree_marker"
451
+ fi
452
+ }
453
+
454
+ ensure_gitignore_entry() {
455
+ local file_path="$1"
456
+ local entry="$2"
457
+
458
+ if [[ "$MODE" != "apply" ]]; then
459
+ echo "[dry-run] ensure .gitignore entry: $entry"
460
+ return
461
+ fi
462
+
463
+ if ! grep -Fxq "$entry" "$file_path"; then
464
+ printf "%s\n" "$entry" >> "$file_path"
465
+ fi
466
+ }
467
+
468
+ install_templates() {
469
+ local repo="$1"
470
+ pi_install_templates "$repo" "$TEMPLATE_ASSETS_DIR" "$MODE"
471
+ }
472
+
473
+ install_helpers() {
474
+ local repo="$1"
475
+ if [[ -d "$HELPER_ASSETS_DIR" ]]; then
476
+ local helper_names
477
+ helper_names="$(pi_workflow_contract_query_lines "$WORKFLOW_CONTRACT_ASSET" "helpers.scripts" | xargs)"
478
+ pi_install_helpers "$repo" "$HELPER_ASSETS_DIR" "$MODE" "$helper_names"
479
+ else
480
+ log "Helper assets not found at $HELPER_ASSETS_DIR"
481
+ fi
482
+ }
483
+
484
+ install_workflow_contract() {
485
+ local repo="$1"
486
+ pi_install_workflow_contract "$repo" "$WORKFLOW_CONTRACT_ASSET" "$MODE"
487
+ }
488
+
489
+ ensure_task_sync_package_script() {
490
+ local repo="$1"
491
+ local package_file="$repo/package.json"
492
+
493
+ if [[ ! -f "$package_file" ]]; then
494
+ if [[ "$MODE" == "apply" ]]; then
495
+ log "package.json missing; skipped check:task-sync injection"
496
+ else
497
+ echo "[dry-run] package.json missing; skip task workflow script injection"
498
+ fi
499
+ return
500
+ fi
501
+
502
+ pi_ensure_task_sync "$repo" "0" "$MODE"
503
+ if [[ "$MODE" == "apply" ]]; then
504
+ log "Injected task workflow scripts into $package_file"
505
+ fi
506
+ }
507
+
508
+ migrate_legacy_sprint_prds() {
509
+ local repo="$1"
510
+ local legacy_dir="$repo/tasks/sprints"
511
+ local prd_dir="$repo/plans/prds"
512
+ local sprint_dir="$repo/plans/sprints"
513
+ local marker_file="$repo/.ai/harness/sprint/active-sprint"
514
+ local src
515
+ local stem
516
+ local legacy_rel
517
+ local marker_value
518
+
519
+ if [[ "$MODE" != "apply" ]]; then
520
+ echo "[dry-run] migrate legacy sprint files from tasks/sprints/*.sprint.md and sprint-shaped plans/prds/*.prd.md into plans/sprints/*.sprint.md"
521
+ return 0
522
+ fi
523
+
524
+ mkdir -p "$prd_dir" "$sprint_dir"
525
+ shopt -s nullglob
526
+
527
+ move_sprint_file() {
528
+ local src_file="$1"
529
+ local old_rel="$2"
530
+ local stem_name="$3"
531
+ local dest_file
532
+ local dest_rel_file
533
+ local n
534
+
535
+ dest_file="$sprint_dir/${stem_name}.sprint.md"
536
+ n=2
537
+ while [[ -e "$dest_file" ]]; do
538
+ dest_file="$sprint_dir/${stem_name}-v${n}.sprint.md"
539
+ n=$((n + 1))
540
+ done
541
+
542
+ mv "$src_file" "$dest_file"
543
+
544
+ dest_rel_file="plans/sprints/$(basename "$dest_file")"
545
+ if [[ -f "$marker_file" ]]; then
546
+ marker_value="$(tr -d '\r\n' < "$marker_file")"
547
+ if [[ "$marker_value" == "$old_rel" || "$marker_value" == "$src_file" ]]; then
548
+ printf '%s\n' "$dest_rel_file" > "$marker_file"
549
+ fi
550
+ fi
551
+ }
552
+
553
+ for src in "$legacy_dir"/*.sprint.md; do
554
+ stem="$(basename "$src" .sprint.md)"
555
+ legacy_rel="tasks/sprints/${stem}.sprint.md"
556
+ move_sprint_file "$src" "$legacy_rel" "$stem"
557
+ done
558
+
559
+ for src in "$prd_dir"/*.prd.md; do
560
+ if grep -Eq '^(# Sprint:|## Backlog[[:space:]]*$)' "$src"; then
561
+ stem="$(basename "$src" .prd.md)"
562
+ legacy_rel="plans/prds/${stem}.prd.md"
563
+ move_sprint_file "$src" "$legacy_rel" "$stem"
564
+ fi
565
+ done
566
+ shopt -u nullglob
567
+
568
+ rmdir "$legacy_dir" 2>/dev/null || true
569
+ }
570
+
571
+ create_task_files_if_missing() {
572
+ local repo="$1"
573
+ local project_name
574
+ local timestamp
575
+ local todo_file
576
+ local legacy_todo_file
577
+ local legacy_todo_archive
578
+
579
+ project_name="$(basename "$repo")"
580
+ timestamp="$(date '+%Y-%m-%d %H:%M')"
581
+ todo_file="$repo/tasks/todos.md"
582
+ legacy_todo_file="$repo/tasks/todo.md"
583
+ legacy_todo_archive="$repo/tasks/archive/legacy-tasks-todo.md"
584
+
585
+ if [[ "$MODE" != "apply" ]]; then
586
+ echo "[dry-run] ensure docs/spec.md, tasks/*, workstreams, reviews, notes, .ai/context/{capabilities.json,context-map.json}, and .ai/harness/{checks/latest.json,policy.json,brain-manifest.json,events.jsonl,architecture/events.jsonl,handoff/current.md,handoff/resume.md,failures/latest.jsonl,security/.gitkeep,worktrees/.gitkeep,runs/.gitkeep} exist with current workflow guidance"
587
+ return
588
+ fi
589
+
590
+ mkdir -p \
591
+ "$repo/plans" \
592
+ "$repo/plans/archive" \
593
+ "$repo/plans/prds" \
594
+ "$repo/plans/sprints" \
595
+ "$repo/tasks" \
596
+ "$repo/tasks/issues" \
597
+ "$repo/tasks/archive" \
598
+ "$repo/tasks/contracts" \
599
+ "$repo/tasks/reviews" \
600
+ "$repo/tasks/notes" \
601
+ "$repo/tasks/workstreams" \
602
+ "$repo/docs" \
603
+ "$repo/docs/architecture/domains" \
604
+ "$repo/docs/architecture/modules" \
605
+ "$repo/docs/architecture/requests" \
606
+ "$repo/docs/architecture/snapshots" \
607
+ "$repo/docs/architecture/diagrams" \
608
+ "$repo/.ai/context" \
609
+ "$repo/.ai/harness/checks" \
610
+ "$repo/.ai/harness/handoff" \
611
+ "$repo/.ai/harness/failures" \
612
+ "$repo/.ai/harness/architecture" \
613
+ "$repo/.ai/harness/runs" \
614
+ "$repo/.ai/harness/worktrees" \
615
+ "$repo/.ai/harness/jobs" \
616
+ "$repo/.ai/harness/edit-sessions"
617
+
618
+ if [[ ! -f "$repo/docs/spec.md" ]]; then
619
+ if [[ -f "$repo/.claude/templates/spec.template.md" ]]; then
620
+ sed \
621
+ -e "s/{{PROJECT_NAME}}/${project_name}/g" \
622
+ -e "s/{{TIMESTAMP}}/${timestamp}/g" \
623
+ "$repo/.claude/templates/spec.template.md" > "$repo/docs/spec.md"
624
+ else
625
+ cat > "$repo/docs/spec.md" <<EOF_SPEC
626
+ # Product Spec: ${project_name}
627
+
628
+ > **Status**: Draft
629
+ > **Last Updated**: ${timestamp}
630
+ > **Owner**: Planner
631
+ EOF_SPEC
632
+ fi
633
+ fi
634
+
635
+ if [[ -f "$legacy_todo_file" ]]; then
636
+ mkdir -p "$repo/tasks/archive"
637
+ if [[ ! -f "$legacy_todo_archive" ]]; then
638
+ cp "$legacy_todo_file" "$legacy_todo_archive"
639
+ fi
640
+ if [[ ! -f "$todo_file" ]]; then
641
+ if grep -Eq '^# Deferred Goal Ledger[[:space:]]*$' "$legacy_todo_file" \
642
+ && grep -Eq '^> \*\*Status\*\*:[[:space:]]*Backlog[[:space:]]*$' "$legacy_todo_file"; then
643
+ cp "$legacy_todo_file" "$todo_file"
644
+ else
645
+ cat > "$todo_file" <<'TODO_EOF'
646
+ # Deferred Goal Ledger
647
+
648
+ > **Status**: Backlog
649
+ > **Updated**: (migration)
650
+ > **Scope**: Medium/long-term goals deferred from active plan execution
651
+
652
+ Current plan tasks live in the active plan's `## Task Breakdown`.
653
+ Do not duplicate that execution checklist here. Record only work intentionally deferred beyond this slice, with the tradeoff and revisit trigger.
654
+
655
+ ## Deferred Goals
656
+
657
+ | Goal | Why Deferred | Tradeoff | Revisit Trigger |
658
+ |------|--------------|----------|-----------------|
659
+ | Review archived legacy checklist | Legacy tasks/todo.md contained execution checklist content before migration. | Preserve user-authored task text in tasks/archive instead of guessing which items still matter. | Open the archive and promote real follow-up work into a new plan or a deferred-goal row. |
660
+ TODO_EOF
661
+ fi
662
+ fi
663
+ mv "$legacy_todo_file" "$legacy_todo_file.migrated.bak"
664
+ fi
665
+
666
+ if [[ ! -f "$todo_file" ]]; then
667
+ cat > "$todo_file" <<'TODO_EOF'
668
+ # Deferred Goal Ledger
669
+
670
+ > **Status**: Backlog
671
+ > **Updated**: (migration)
672
+ > **Scope**: Medium/long-term goals deferred from active plan execution
673
+
674
+ Current plan tasks live in the active plan's `## Task Breakdown`.
675
+ Do not duplicate that execution checklist here. Record only work intentionally deferred beyond this slice, with the tradeoff and revisit trigger.
676
+
677
+ ## Deferred Goals
678
+
679
+ | Goal | Why Deferred | Tradeoff | Revisit Trigger |
680
+ |------|--------------|----------|-----------------|
681
+ | (none) | No deferred medium/long-term goal recorded yet. | Keep migrated workflow state bounded. | Add a row when a real follow-up is postponed. |
682
+ TODO_EOF
683
+ elif ! grep -Eq '^> \*\*Status\*\*:[[:space:]]*Backlog[[:space:]]*$' "$todo_file"; then
684
+ backup_if_exists "$todo_file"
685
+ cat > "$todo_file" <<'TODO_EOF'
686
+ # Deferred Goal Ledger
687
+
688
+ > **Status**: Backlog
689
+ > **Updated**: (migration)
690
+ > **Scope**: Medium/long-term goals deferred from active plan execution
691
+
692
+ Current plan tasks live in the active plan's `## Task Breakdown`.
693
+ Do not duplicate that execution checklist here. Record only work intentionally deferred beyond this slice, with the tradeoff and revisit trigger.
694
+
695
+ ## Deferred Goals
696
+
697
+ | Goal | Why Deferred | Tradeoff | Revisit Trigger |
698
+ |------|--------------|----------|-----------------|
699
+ | Review archived legacy checklist | Legacy tasks/todos.md contained execution checklist content before migration. | Preserve user-authored task text in tasks/archive instead of guessing which items still matter. | Open the archive and promote real follow-up work into a new plan or a deferred-goal row. |
700
+ TODO_EOF
701
+ fi
702
+
703
+ if [[ ! -f "$repo/tasks/current.md" ]]; then
704
+ cat > "$repo/tasks/current.md" <<'CURRENT_STATUS_EOF'
705
+ # Current Status Snapshot
706
+
707
+ <!-- generated-by: forge refresh-current-status v1 -->
708
+ <!-- updated_at: bootstrap -->
709
+ <!-- stale_after: 24h -->
710
+
711
+ > **Status**: Idle
712
+ > **Updated At**: bootstrap
713
+ > **Source Branch**: main
714
+ > **Source Commit**: bootstrap
715
+ > **Target Branch**: main
716
+ > **Stale After**: 24h
717
+ > **Reason**: bootstrap
718
+ > **Derived From**: active-plan, workstreams, handoff, checks, git status
719
+
720
+ This file is a tracked mainline snapshot derived from repo artifacts. It is not a live lock, not a kanban board, and not an implementation gate. If it is stale, read the source artifacts below.
721
+ CURRENT_STATUS_EOF
722
+ fi
723
+
724
+ if [[ ! -f "$repo/tasks/lessons.md" ]]; then
725
+ cat > "$repo/tasks/lessons.md" <<'LESSONS_EOF'
726
+ # Lessons Learned (Self-Improvement Loop)
727
+
728
+ > Capture correction-derived prevention rules here.
729
+ > Promote repeated patterns into durable project rules during spa day.
730
+
731
+ ## Template
732
+ - Date:
733
+ - Triggered by correction:
734
+ - Mistake pattern:
735
+ - Prevention rule:
736
+ - Where to apply next time:
737
+ LESSONS_EOF
738
+ fi
739
+
740
+ pi_ensure_harness_state_surface "$repo" "apply"
741
+
742
+ }
743
+
744
+ install_reference_configs() {
745
+ local repo="$1"
746
+ local ref_dir="$repo/docs/reference-configs"
747
+ local ref_assets_dir="$SKILL_ROOT/assets/reference-configs"
748
+
749
+ run_or_echo mkdir -p "$ref_dir"
750
+
751
+ if [[ -d "$ref_assets_dir" ]]; then
752
+ if [[ "$MODE" == "apply" ]]; then
753
+ pi_install_reference_configs "$repo" "$ref_assets_dir" "apply"
754
+ else
755
+ pi_install_reference_configs "$repo" "$ref_assets_dir" "dry-run"
756
+ fi
757
+ fi
758
+ }
759
+
760
+ ensure_ops_scaffold() {
761
+ local repo="$1"
762
+ local deploy_readme="$repo/deploy/README.md"
763
+
764
+ run_or_echo mkdir -p "$repo/deploy/env"
765
+ run_or_echo mkdir -p "$repo/deploy/scripts"
766
+ run_or_echo mkdir -p "$repo/deploy/submissions"
767
+ run_or_echo mkdir -p "$repo/deploy/runbooks"
768
+ run_or_echo mkdir -p "$repo/deploy/release-checklists"
769
+ run_or_echo mkdir -p "$repo/deploy/sql"
770
+ run_or_echo mkdir -p "$repo/_ops/env"
771
+ run_or_echo mkdir -p "$repo/_ops/secrets"
772
+ run_or_echo mkdir -p "$repo/_ops/artifacts"
773
+ run_or_echo mkdir -p "$repo/_ops/logs"
774
+ run_or_echo mkdir -p "$repo/_ops/state"
775
+ run_or_echo mkdir -p "$repo/_ops/scratch"
776
+
777
+ if [[ "$MODE" != "apply" ]]; then
778
+ echo "[dry-run] ensure deploy workspace README, tracked placeholders, deploy/sql, and ignored _ops private state"
779
+ echo "[dry-run] migrate legacy _ops runbooks/scripts/submissions/env examples into deploy/"
780
+ return 0
781
+ fi
782
+
783
+ migrate_legacy_ops_asset() {
784
+ local src="$1"
785
+ local dest="$2"
786
+ if [[ -e "$src" && ! -e "$dest" ]]; then
787
+ mv "$src" "$dest"
788
+ fi
789
+ }
790
+
791
+ migrate_legacy_ops_children() {
792
+ local src_dir="$1"
793
+ local dest_dir="$2"
794
+ local src
795
+ local base
796
+ [[ -d "$src_dir" ]] || return 0
797
+ shopt -s nullglob dotglob
798
+ for src in "$src_dir"/*; do
799
+ base="$(basename "$src")"
800
+ [[ "$base" == ".gitkeep" ]] && continue
801
+ migrate_legacy_ops_asset "$src" "$dest_dir/$base"
802
+ done
803
+ shopt -u nullglob dotglob
804
+ }
805
+
806
+ migrate_legacy_ops_asset "$repo/_ops/env/.env.example" "$repo/deploy/env/.env.example"
807
+ migrate_legacy_ops_children "$repo/_ops/scripts" "$repo/deploy/scripts"
808
+ migrate_legacy_ops_children "$repo/_ops/submissions" "$repo/deploy/submissions"
809
+ migrate_legacy_ops_children "$repo/_ops/sql" "$repo/deploy/sql"
810
+
811
+ shopt -s nullglob
812
+ for legacy_doc in "$repo/_ops"/*.md; do
813
+ legacy_base="$(basename "$legacy_doc")"
814
+ [[ "$legacy_base" == "README.md" ]] && continue
815
+ migrate_legacy_ops_asset "$legacy_doc" "$repo/deploy/$legacy_base"
816
+ done
817
+ shopt -u nullglob
818
+
819
+ shopt -s nullglob
820
+ for legacy_sql in "$repo/_ops"/*.sql; do
821
+ legacy_base="$(basename "$legacy_sql")"
822
+ migrate_legacy_ops_asset "$legacy_sql" "$repo/deploy/sql/$legacy_base"
823
+ done
824
+ shopt -u nullglob
825
+
826
+ touch "$repo/deploy/env/.gitkeep"
827
+ touch "$repo/deploy/scripts/.gitkeep"
828
+ touch "$repo/deploy/submissions/.gitkeep"
829
+ touch "$repo/deploy/runbooks/.gitkeep"
830
+ touch "$repo/deploy/release-checklists/.gitkeep"
831
+ touch "$repo/deploy/sql/.gitkeep"
832
+
833
+ if [[ ! -f "$deploy_readme" ]]; then
834
+ cat > "$deploy_readme" <<'DEPLOY_README_EOF'
835
+ # Deployment Operations
836
+
837
+ `deploy/` is a commit-ready surface for deployment and operations runbooks, submission materials, release checklists, helper scripts, and env examples.
838
+
839
+ ## Track
840
+
841
+ - `deploy/scripts/` for operational scripts.
842
+ - `deploy/submissions/` for submission or review materials.
843
+ - `deploy/runbooks/` and `deploy/release-checklists/` for operational documentation.
844
+ - `deploy/sql/` for ordered deployment SQL files named like `0001_create_tables.sql`.
845
+ - `deploy/*.md` for runbooks and operating notes.
846
+ - `deploy/env/.env.example` for documented variable shapes only.
847
+
848
+ ## Do Not Track
849
+
850
+ - `_ops/`
851
+ - private keys, real env files, provider state, production tokens, credential dumps, artifacts, logs, and local-only overrides
852
+
853
+ Keep external upstream checkouts and source references in `_ref/`; `_ref/` is ignored and must stay out of commits.
854
+ DEPLOY_README_EOF
855
+ fi
856
+ }
857
+
858
+ ensure_research_surface() {
859
+ local repo="$1"
860
+ local research_dir="$repo/docs/researches"
861
+ local research_readme="$research_dir/README.md"
862
+ local legacy_research="$repo/tasks/research.md"
863
+ local legacy_archive="$research_dir/legacy-research-notes.md"
864
+
865
+ if [[ "$MODE" != "apply" ]]; then
866
+ echo "[dry-run] ensure research reports directory at $research_dir"
867
+ if [[ -f "$legacy_research" ]]; then
868
+ echo "[dry-run] archive legacy $legacy_research into $legacy_archive and leave a tombstone"
869
+ fi
870
+ return
871
+ fi
872
+
873
+ mkdir -p "$research_dir"
874
+
875
+ if [[ ! -f "$research_readme" ]]; then
876
+ cat > "$research_readme" <<'RESEARCH_README_EOF'
877
+ # Research Reports
878
+
879
+ Durable research reports live in this directory as dated Markdown files.
880
+
881
+ Use `YYYYMMDD-topic.md` names for new reports. Keep task-local implementation
882
+ decisions in `tasks/notes/`, and keep repeated correction-derived rules in
883
+ `tasks/lessons.md`.
884
+ RESEARCH_README_EOF
885
+ fi
886
+
887
+ if [[ -f "$legacy_research" ]]; then
888
+ if [[ ! -f "$legacy_archive" ]]; then
889
+ cp "$legacy_research" "$legacy_archive"
890
+ fi
891
+
892
+ cat > "$legacy_research" <<'RESEARCH_TOMBSTONE_EOF'
893
+ # Research Notes Moved
894
+
895
+ > **Status**: Retired tombstone
896
+ > **Canonical Surface**: `docs/researches/`
897
+ > **Legacy Archive**: `docs/researches/legacy-research-notes.md`
898
+
899
+ Durable research reports now live under `docs/researches/*.md`. This file is
900
+ kept only as a transition pointer for older tooling and historical links; do
901
+ not add new findings here.
902
+ RESEARCH_TOMBSTONE_EOF
903
+ fi
904
+ }
905
+
906
+ parse_args() {
907
+ while [[ $# -gt 0 ]]; do
908
+ case "$1" in
909
+ --repo)
910
+ TARGET_REPO="${2:-}"
911
+ shift 2
912
+ ;;
913
+ --dry-run)
914
+ MODE="dry-run"
915
+ shift
916
+ ;;
917
+ --apply)
918
+ MODE="apply"
919
+ shift
920
+ ;;
921
+ --help)
922
+ usage
923
+ exit 0
924
+ ;;
925
+ *)
926
+ echo "Unknown argument: $1" >&2
927
+ usage
928
+ exit 1
929
+ ;;
930
+ esac
931
+ done
932
+ }
933
+
934
+ require_repo() {
935
+ if [[ -z "$TARGET_REPO" ]]; then
936
+ echo "--repo is required" >&2
937
+ usage
938
+ exit 1
939
+ fi
940
+
941
+ if [[ ! -d "$TARGET_REPO" ]]; then
942
+ echo "Repo path does not exist: $TARGET_REPO" >&2
943
+ exit 1
944
+ fi
945
+
946
+ local target_physical
947
+ target_physical="$(cd "$TARGET_REPO" && pwd -P)"
948
+ local home_physical=""
949
+ if [[ -n "${HOME:-}" && -d "$HOME" ]]; then
950
+ home_physical="$(cd "$HOME" && pwd -P)"
951
+ fi
952
+
953
+ if [[ -n "$home_physical" && "$target_physical" == "$home_physical" ]]; then
954
+ echo "Refusing to migrate HOME as a repo target: $target_physical" >&2
955
+ echo "Run forge adopt --repo <git-repo> from an intended project." >&2
956
+ exit 2
957
+ fi
958
+ }
959
+
960
+ inspect_project_state() {
961
+ local repo="$1"
962
+ local inspector="$SCRIPT_DIR/inspect-project-state.ts"
963
+
964
+ if [[ ! -f "$inspector" ]]; then
965
+ log "Project-state inspector missing: $inspector"
966
+ return 1
967
+ fi
968
+
969
+ INSPECT_OUTPUT="$(run_ts_script "$inspector" --repo "$repo" --format text)"
970
+ printf '%s\n' "$INSPECT_OUTPUT"
971
+ }
972
+
973
+ migrate_hooks() {
974
+ local repo="$1"
975
+ local project_claude_dir="$repo/.claude"
976
+ local project_ai_hooks_dir="$repo/.ai/hooks"
977
+
978
+ run_or_echo mkdir -p "$project_claude_dir" "$project_ai_hooks_dir"
979
+
980
+ cleanup_removed_workflow_assets "$repo"
981
+ pi_install_hook_assets "$repo" "$HOOK_ASSETS_DIR" "$MODE"
982
+ pi_install_hook_adapters "$repo" "$HOOK_ASSETS_DIR" "$MODE"
983
+ }
984
+
985
+ migrate_docs() {
986
+ local repo="$1"
987
+ local migrator="$SCRIPT_DIR/migrate-workflow-docs.ts"
988
+
989
+ if [[ ! -f "$migrator" ]]; then
990
+ log "Legacy-doc migrator missing: $migrator"
991
+ return 1
992
+ fi
993
+
994
+ if [[ "$MODE" == "apply" ]]; then
995
+ run_ts_script "$migrator" --repo "$repo" --apply
996
+ else
997
+ run_ts_script "$migrator" --repo "$repo" --dry-run
998
+ fi
999
+ }
1000
+
1001
+ migrate_workflow() {
1002
+ local repo="$1"
1003
+
1004
+ run_or_echo mkdir -p "$repo/plans/archive"
1005
+ run_or_echo mkdir -p "$repo/plans/prds"
1006
+ run_or_echo mkdir -p "$repo/plans/sprints"
1007
+ run_or_echo mkdir -p "$repo/tasks/archive"
1008
+ run_or_echo mkdir -p "$repo/tasks/contracts"
1009
+ run_or_echo mkdir -p "$repo/tasks/reviews"
1010
+ run_or_echo mkdir -p "$repo/tasks/notes"
1011
+ run_or_echo mkdir -p "$repo/tasks/workstreams"
1012
+ run_or_echo mkdir -p "$repo/docs/reference-configs"
1013
+ run_or_echo mkdir -p "$repo/.ai/harness/checks"
1014
+ run_or_echo mkdir -p "$repo/.ai/harness/handoff"
1015
+ migrate_active_plan_marker "$repo"
1016
+
1017
+ install_templates "$repo"
1018
+ install_helpers "$repo"
1019
+ install_workflow_contract "$repo"
1020
+ if pi_should_enable_factor_factory "$(pi_plan_type)"; then
1021
+ pi_install_factor_factory "$repo" "$FACTOR_FACTORY_ASSETS_DIR" "$SKILL_ROOT/scripts" "$MODE"
1022
+ fi
1023
+ install_reference_configs "$repo"
1024
+ ensure_ops_scaffold "$repo"
1025
+ ensure_research_surface "$repo"
1026
+ migrate_legacy_sprint_prds "$repo"
1027
+ create_task_files_if_missing "$repo"
1028
+ ensure_task_sync_package_script "$repo"
1029
+
1030
+ local repo_gitignore="$repo/.gitignore"
1031
+ run_or_echo touch "$repo_gitignore"
1032
+ ensure_gitignore_entry "$repo_gitignore" "# Project-specific"
1033
+ ensure_gitignore_entry "$repo_gitignore" "artifacts/"
1034
+ ensure_gitignore_entry "$repo_gitignore" "coverage/"
1035
+ ensure_gitignore_entry "$repo_gitignore" "*.tar.gz"
1036
+ ensure_gitignore_entry "$repo_gitignore" "*.tgz"
1037
+ ensure_gitignore_entry "$repo_gitignore" "# External references"
1038
+ ensure_gitignore_entry "$repo_gitignore" "_ref/"
1039
+ ensure_gitignore_entry "$repo_gitignore" ".codegraph/"
1040
+ ensure_gitignore_entry "$repo_gitignore" "# Local operations state"
1041
+ ensure_gitignore_entry "$repo_gitignore" "_ops/"
1042
+ ensure_gitignore_entry "$repo_gitignore" "# Environment"
1043
+ ensure_gitignore_entry "$repo_gitignore" ".env"
1044
+ ensure_gitignore_entry "$repo_gitignore" ".env.*"
1045
+ ensure_gitignore_entry "$repo_gitignore" "!.env.example"
1046
+ ensure_gitignore_entry "$repo_gitignore" "# OS metadata"
1047
+ ensure_gitignore_entry "$repo_gitignore" ".DS_Store"
1048
+ ensure_runtime_gitignore_block "$repo" "$repo_gitignore"
1049
+ untrack_generated_helper_wrappers "$repo"
1050
+
1051
+ }
1052
+
1053
+ verify_migration_contract() {
1054
+ local repo="$1"
1055
+ local check_script="$repo/scripts/check-task-workflow.sh"
1056
+ local handoff_script="$repo/scripts/prepare-codex-handoff.sh"
1057
+
1058
+ if [[ "$MODE" != "apply" ]]; then
1059
+ echo "[dry-run] refresh Codex handoff before workflow verify"
1060
+ echo "[dry-run] verify migrated workflow with forge run check-task-workflow --strict"
1061
+ return 0
1062
+ fi
1063
+
1064
+ if [[ ! -f "$check_script" ]]; then
1065
+ log "Missing workflow check script after migration: $check_script"
1066
+ return 1
1067
+ fi
1068
+
1069
+ if [[ -f "$handoff_script" ]]; then
1070
+ (cd "$repo" && FORGE_SOURCE_ROOT="$SKILL_ROOT" bash "scripts/prepare-codex-handoff.sh" --reason "forge-migration-verify" >/dev/null)
1071
+ log "Refreshed Codex handoff before workflow verify"
1072
+ fi
1073
+
1074
+ (cd "$repo" && FORGE_SOURCE_ROOT="$SKILL_ROOT" bash "scripts/check-task-workflow.sh" --strict)
1075
+ }
1076
+
1077
+ print_report() {
1078
+ local repo="$1"
1079
+ echo
1080
+ echo "=== Migration Report ==="
1081
+ echo "Mode: $MODE"
1082
+ echo "Repo: $repo"
1083
+ if [[ -n "$INSPECT_OUTPUT" ]]; then
1084
+ echo "--- Inspection ---"
1085
+ printf '%s\n' "$INSPECT_OUTPUT"
1086
+ fi
1087
+ echo "- Project hooks synced from: $HOOK_ASSETS_DIR (repo-local fallback; lib-only unless hook_source=repo)"
1088
+ echo "- Host hook config target: user-level ~/.claude/settings.json and ~/.codex/hooks.json"
1089
+ echo "- $(pi_print_codex_hook_trust_notice)"
1090
+ echo "- Legacy docs/TODO.md / docs/plan.md / docs/PROGRESS.md: migrated by scripts/migrate-workflow-docs.ts"
1091
+ echo "- Workflow migration: docs/spec.md + plans/ + tasks/contracts + tasks/reviews + .ai/context/context-map.json + .ai/harness/*"
1092
+ echo "- Workflow contract manifest installed at: .ai/harness/workflow-contract.json"
1093
+ echo "- Helper runtime: package-dispatched through forge run with scripts/* compatibility wrappers"
1094
+ echo "- Upgrade/reconfigure/cleanup plan: generated from workflow contract migrations.upgrade"
1095
+ echo "- Existing external_tooling overrides are preserved; missing defaults are merged into .ai/harness/policy.json"
1096
+ echo "- Runtime temporary ignore block synced to .gitignore"
1097
+ pi_print_external_tooling_report "$repo" "$MODE" "$SCRIPT_DIR/check-agent-tooling.sh"
1098
+ }
1099
+
1100
+ run_skill_hook() {
1101
+ local event="$1"
1102
+ local hook_script="$SCRIPT_DIR/run-skill-hook.ts"
1103
+
1104
+ if command -v bun >/dev/null 2>&1 && [[ -f "$hook_script" ]]; then
1105
+ bun "$hook_script" "$event" --context "{\"repo\":\"$TARGET_REPO\",\"mode\":\"$MODE\"}" 2>&1 || {
1106
+ if [[ "$event" == pre-* ]]; then
1107
+ log "Pre-hook $event failed, aborting."
1108
+ return 1
1109
+ else
1110
+ log "Post-hook $event warning (non-fatal)."
1111
+ fi
1112
+ }
1113
+ fi
1114
+ }
1115
+
1116
+ update_version_stamp() {
1117
+ local repo="$1"
1118
+ local stamp_file="$repo/.claude/.skill-version"
1119
+ local skill_version_file="$SKILL_ROOT/assets/skill-version.json"
1120
+ local sv_version="unknown"
1121
+ local sv_template_version="unknown"
1122
+
1123
+ if [[ -f "$skill_version_file" ]] && command -v bun >/dev/null 2>&1; then
1124
+ sv_version=$(bun -e "console.log(JSON.parse(require('fs').readFileSync('$skill_version_file','utf-8')).version)")
1125
+ sv_template_version=$(bun -e "console.log(JSON.parse(require('fs').readFileSync('$skill_version_file','utf-8')).templateVersion)")
1126
+ elif [[ -f "$skill_version_file" ]] && command -v node >/dev/null 2>&1; then
1127
+ sv_version=$(node -e "console.log(JSON.parse(require('fs').readFileSync('$skill_version_file','utf-8')).version)")
1128
+ sv_template_version=$(node -e "console.log(JSON.parse(require('fs').readFileSync('$skill_version_file','utf-8')).templateVersion)")
1129
+ fi
1130
+
1131
+ if [[ "$MODE" == "apply" ]]; then
1132
+ local existing_skill_version=""
1133
+ local existing_template_version=""
1134
+ local existing_migrated_at=""
1135
+ local migrated_at=""
1136
+
1137
+ if [[ -f "$stamp_file" ]]; then
1138
+ existing_skill_version="$(awk -F= '$1 == "skill_version" { print $2 }' "$stamp_file" 2>/dev/null || true)"
1139
+ existing_template_version="$(awk -F= '$1 == "template_version" { print $2 }' "$stamp_file" 2>/dev/null || true)"
1140
+ existing_migrated_at="$(awk -F= '$1 == "migrated_at" { print $2 }' "$stamp_file" 2>/dev/null || true)"
1141
+ fi
1142
+
1143
+ if [[ "$existing_skill_version" == "$sv_version" && "$existing_template_version" == "$sv_template_version" && -n "$existing_migrated_at" ]]; then
1144
+ migrated_at="$existing_migrated_at"
1145
+ else
1146
+ migrated_at="$(date -u '+%Y-%m-%dT%H:%M:%SZ')"
1147
+ fi
1148
+
1149
+ mkdir -p "$(dirname "$stamp_file")"
1150
+ local stamp_tmp
1151
+ stamp_tmp="$(mktemp)"
1152
+ cat > "$stamp_tmp" <<STAMP_EOF
1153
+ skill_version=$sv_version
1154
+ template_version=$sv_template_version
1155
+ migrated_at=$migrated_at
1156
+ STAMP_EOF
1157
+ if [[ -f "$stamp_file" ]] && cmp -s "$stamp_tmp" "$stamp_file"; then
1158
+ rm -f "$stamp_tmp"
1159
+ log "Version stamp already current: $stamp_file"
1160
+ else
1161
+ mv "$stamp_tmp" "$stamp_file"
1162
+ log "Version stamp updated: $stamp_file"
1163
+ fi
1164
+ else
1165
+ echo "[dry-run] update version stamp at $stamp_file (skill=$sv_version, template=$sv_template_version)"
1166
+ fi
1167
+ }
1168
+
1169
+ main() {
1170
+ parse_args "$@"
1171
+ require_repo
1172
+
1173
+ TARGET_REPO="$(cd "$TARGET_REPO" && pwd)"
1174
+ log "Starting migration ($MODE) for $TARGET_REPO"
1175
+
1176
+ run_skill_hook "pre-migrate" || exit 1
1177
+
1178
+ inspect_project_state "$TARGET_REPO" || exit 1
1179
+ migrate_hooks "$TARGET_REPO"
1180
+ migrate_docs "$TARGET_REPO"
1181
+ migrate_workflow "$TARGET_REPO"
1182
+ update_version_stamp "$TARGET_REPO"
1183
+ verify_migration_contract "$TARGET_REPO" || exit 1
1184
+ print_report "$TARGET_REPO"
1185
+
1186
+ run_skill_hook "post-migrate"
1187
+ }
1188
+
1189
+ main "$@"