forgeos 0.1.0-alpha.7 → 0.1.0-alpha.71

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 (598) hide show
  1. package/.agents/skills/forge-agent-fabric/SKILL.md +178 -0
  2. package/.agents/skills/forge-agent-fabric/references/managed-workflows.md +95 -0
  3. package/.agents/skills/forge-agent-fabric/references/repository-analysis.md +102 -0
  4. package/.agents/skills/forge-agent-fabric/scripts/fabric.mjs +46 -0
  5. package/.agents/skills/forge-agent-fabric/scripts/repository.mjs +44 -0
  6. package/.npmignore +10 -0
  7. package/AGENTS.md +142 -90
  8. package/CHANGELOG.md +870 -9
  9. package/LICENSE +21 -0
  10. package/README.md +121 -6
  11. package/adapters/go/README.md +23 -0
  12. package/adapters/go/go.mod +3 -0
  13. package/adapters/go/http.go +149 -0
  14. package/adapters/go/registry.go +234 -0
  15. package/adapters/go/types.go +136 -0
  16. package/adapters/java/README.md +68 -0
  17. package/adapters/java/pom.xml +47 -0
  18. package/adapters/java/src/main/java/dev/forgeos/adapter/Auth.java +20 -0
  19. package/adapters/java/src/main/java/dev/forgeos/adapter/Diagnostic.java +16 -0
  20. package/adapters/java/src/main/java/dev/forgeos/adapter/Entry.java +38 -0
  21. package/adapters/java/src/main/java/dev/forgeos/adapter/EntryKind.java +16 -0
  22. package/adapters/java/src/main/java/dev/forgeos/adapter/ErrorInfo.java +4 -0
  23. package/adapters/java/src/main/java/dev/forgeos/adapter/Forge.java +94 -0
  24. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeCall.java +12 -0
  25. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeContext.java +11 -0
  26. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHandler.java +8 -0
  27. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHttpHandler.java +179 -0
  28. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeRegistry.java +121 -0
  29. package/adapters/java/src/main/java/dev/forgeos/adapter/Json.java +14 -0
  30. package/adapters/java/src/main/java/dev/forgeos/adapter/Manifest.java +14 -0
  31. package/adapters/java/src/main/java/dev/forgeos/adapter/RequestEnvelope.java +6 -0
  32. package/adapters/java/src/main/java/dev/forgeos/adapter/ResponseEnvelope.java +25 -0
  33. package/adapters/java/src/main/java/dev/forgeos/adapter/Risk.java +18 -0
  34. package/adapters/java/src/main/java/dev/forgeos/adapter/Schemas.java +36 -0
  35. package/adapters/java/src/main/java/dev/forgeos/adapter/Service.java +65 -0
  36. package/adapters/java/src/main/java/dev/forgeos/adapter/TransactionMode.java +18 -0
  37. package/adapters/java/src/main/java/dev/forgeos/adapter/TypedForgeHandler.java +6 -0
  38. package/adapters/java-spring-boot-starter/README.md +32 -0
  39. package/adapters/java-spring-boot-starter/pom.xml +49 -0
  40. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeCommand.java +22 -0
  41. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeExternalService.java +15 -0
  42. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeQuery.java +16 -0
  43. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeServiceBeanCondition.java +18 -0
  44. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringAutoConfiguration.java +16 -0
  45. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringRuntime.java +104 -0
  46. package/adapters/java-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +1 -0
  47. package/bin/forge.mjs +18 -0
  48. package/docs/agent-fabric-programs.md +151 -0
  49. package/docs/agent-fabric.md +582 -0
  50. package/docs/architecture/agent-fabric/PORTABLE_PROJECTS_PLAN.md +136 -0
  51. package/docs/architecture/agent-fabric/README.md +180 -0
  52. package/docs/architecture/agent-fabric/REPOSITORY_MANIFEST_PLAN.md +284 -0
  53. package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_V2_ADR.md +81 -0
  54. package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_V2_CORRECTIONS.md +39 -0
  55. package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_V2_CORRECTIONS_EVIDENCE.md +53 -0
  56. package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_V2_EVIDENCE.md +49 -0
  57. package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_V2_PLAN.md +590 -0
  58. package/docs/cair-protocol.md +103 -0
  59. package/docs/changelog.md +1070 -0
  60. package/docs/forge-protocol.md +189 -0
  61. package/docs/repository-agent-benchmark.md +179 -0
  62. package/docs/repository-analysis.md +139 -0
  63. package/docs/repository-context-quality.md +179 -0
  64. package/docs/repository-runtime-observation.md +82 -0
  65. package/examples/agent-fabric-v2/README.md +70 -0
  66. package/examples/agent-fabric-v2/item-child.workflow.ts +11 -0
  67. package/examples/agent-fabric-v2/make-request.mjs +4 -0
  68. package/examples/agent-fabric-v2/map-child.workflow.ts +10 -0
  69. package/examples/agent-fabric-v2/migrate.workflow.ts +35 -0
  70. package/examples/agent-fabric-v2/registry.example.json +256 -0
  71. package/examples/agent-fabric-v2/run-ui-fixture.ts +48 -0
  72. package/examples/agent-fabric-v2/ui-audit.workflow.ts +28 -0
  73. package/examples/agent-fabric-v2/ui-fixture-worker.cjs +36 -0
  74. package/examples/agent-fabric-v2/visual-population.json +13 -0
  75. package/examples/agent-fabric-v2/workers/check.mjs +2 -0
  76. package/examples/agent-fabric-v2/workers/common.mjs +7 -0
  77. package/examples/agent-fabric-v2/workers/discover.mjs +2 -0
  78. package/examples/agent-fabric-v2/workers/migrate.mjs +4 -0
  79. package/examples/agent-fabric-v2/workers/review.mjs +3 -0
  80. package/examples/go-billing/go.mod +7 -0
  81. package/examples/go-billing/main.go +120 -0
  82. package/examples/java-billing/pom.xml +60 -0
  83. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/CreateInvoiceInput.java +4 -0
  84. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Invoice.java +11 -0
  85. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Main.java +127 -0
  86. package/package.json +60 -5
  87. package/schemas/agent-fabric/v0.1/control-event.schema.json +281 -0
  88. package/schemas/forge-manifest.schema.json +389 -0
  89. package/scripts/field-test-forgeos.mjs +1021 -0
  90. package/scripts/install-agent-fabric-skill.mjs +105 -0
  91. package/src/forge/_generated/releaseManifest.json +1 -2
  92. package/src/forge/_generated/releaseManifest.ts +3 -3
  93. package/src/forge/agent-adapters/index.ts +1592 -125
  94. package/src/forge/agent-adapters/types.ts +225 -1
  95. package/src/forge/agent-fabric/adapter.ts +131 -0
  96. package/src/forge/agent-fabric/attached-snapshot.ts +55 -0
  97. package/src/forge/agent-fabric/attached-task-contract.ts +105 -0
  98. package/src/forge/agent-fabric/attached-task-service.ts +127 -0
  99. package/src/forge/agent-fabric/attached-task-store.ts +109 -0
  100. package/src/forge/agent-fabric/authority.ts +298 -0
  101. package/src/forge/agent-fabric/canonical.ts +135 -0
  102. package/src/forge/agent-fabric/codex-adversarial-review.ts +229 -0
  103. package/src/forge/agent-fabric/codex-sdk-worker.ts +203 -0
  104. package/src/forge/agent-fabric/conductor.ts +754 -0
  105. package/src/forge/agent-fabric/dictionary.ts +12 -0
  106. package/src/forge/agent-fabric/errors.ts +32 -0
  107. package/src/forge/agent-fabric/hardened-conductor.ts +485 -0
  108. package/src/forge/agent-fabric/hardened-reducer.ts +211 -0
  109. package/src/forge/agent-fabric/index.ts +48 -0
  110. package/src/forge/agent-fabric/journal.ts +116 -0
  111. package/src/forge/agent-fabric/local-adaptive-digest-worker.mjs +26 -0
  112. package/src/forge/agent-fabric/local-adaptive-harness.ts +343 -0
  113. package/src/forge/agent-fabric/local-adaptive-service.ts +398 -0
  114. package/src/forge/agent-fabric/local-adaptive-worker.ts +146 -0
  115. package/src/forge/agent-fabric/local-approval-window.ts +211 -0
  116. package/src/forge/agent-fabric/local-change-review-service.ts +374 -0
  117. package/src/forge/agent-fabric/local-coding-worker.ts +285 -0
  118. package/src/forge/agent-fabric/local-control-store.ts +239 -0
  119. package/src/forge/agent-fabric/local-effect-broker.ts +348 -0
  120. package/src/forge/agent-fabric/local-evolution-approval.ts +81 -0
  121. package/src/forge/agent-fabric/local-evolution-profile.ts +87 -0
  122. package/src/forge/agent-fabric/local-evolution-registry.ts +427 -0
  123. package/src/forge/agent-fabric/local-evolution-service.ts +200 -0
  124. package/src/forge/agent-fabric/local-intelligence.ts +281 -0
  125. package/src/forge/agent-fabric/local-paths.ts +18 -0
  126. package/src/forge/agent-fabric/local-task-contract.ts +203 -0
  127. package/src/forge/agent-fabric/local-task-inbox.ts +543 -0
  128. package/src/forge/agent-fabric/local-task-server.ts +374 -0
  129. package/src/forge/agent-fabric/local-task-service.ts +982 -0
  130. package/src/forge/agent-fabric/local-verification.ts +551 -0
  131. package/src/forge/agent-fabric/managed-environment.ts +205 -0
  132. package/src/forge/agent-fabric/managed-run-contract.ts +103 -0
  133. package/src/forge/agent-fabric/managed-run-service.ts +401 -0
  134. package/src/forge/agent-fabric/managed-run-store.ts +165 -0
  135. package/src/forge/agent-fabric/managed-workspace.ts +253 -0
  136. package/src/forge/agent-fabric/p0a.ts +104 -0
  137. package/src/forge/agent-fabric/p0b-model-adapter.ts +434 -0
  138. package/src/forge/agent-fabric/planning.ts +155 -0
  139. package/src/forge/agent-fabric/program-api.ts +37 -0
  140. package/src/forge/agent-fabric/program-contract.ts +283 -0
  141. package/src/forge/agent-fabric/program-dsl.ts +126 -0
  142. package/src/forge/agent-fabric/program-evidence.ts +22 -0
  143. package/src/forge/agent-fabric/program-image.ts +15 -0
  144. package/src/forge/agent-fabric/program-lock.ts +50 -0
  145. package/src/forge/agent-fabric/program-owner.ts +16 -0
  146. package/src/forge/agent-fabric/program-scheduler.ts +38 -0
  147. package/src/forge/agent-fabric/program-service.ts +793 -0
  148. package/src/forge/agent-fabric/program-store.ts +142 -0
  149. package/src/forge/agent-fabric/program-structure.ts +65 -0
  150. package/src/forge/agent-fabric/program-types.ts +110 -0
  151. package/src/forge/agent-fabric/program-view.ts +12 -0
  152. package/src/forge/agent-fabric/program-worker.ts +108 -0
  153. package/src/forge/agent-fabric/project-profile.ts +50 -0
  154. package/src/forge/agent-fabric/project-registry.ts +120 -0
  155. package/src/forge/agent-fabric/project-runtime.ts +85 -0
  156. package/src/forge/agent-fabric/readiness.ts +26 -0
  157. package/src/forge/agent-fabric/reducer.ts +863 -0
  158. package/src/forge/agent-fabric/repository-context.ts +83 -0
  159. package/src/forge/agent-fabric/resource-ledger.ts +266 -0
  160. package/src/forge/agent-fabric/serialized-local-adapter.ts +60 -0
  161. package/src/forge/agent-fabric/types.ts +424 -0
  162. package/src/forge/agent-fabric/validation.ts +500 -0
  163. package/src/forge/agent-fabric/workflow-engine.ts +218 -0
  164. package/src/forge/agent-fabric/workflow-task-actions.ts +104 -0
  165. package/src/forge/agent-fabric/workflow-templates.ts +11 -0
  166. package/src/forge/agent-memory/bridge.ts +1728 -0
  167. package/src/forge/agent-memory/context-pack.ts +284 -0
  168. package/src/forge/agent-memory/hook-runner.ts +331 -0
  169. package/src/forge/agent-memory/mcp.ts +597 -0
  170. package/src/forge/agent-memory/normalize.ts +498 -0
  171. package/src/forge/agent-memory/redaction.ts +103 -0
  172. package/src/forge/agent-memory/sources/claude-code.ts +51 -0
  173. package/src/forge/agent-memory/sources/codex-hook-runner.mjs +343 -0
  174. package/src/forge/agent-memory/sources/codex.ts +161 -0
  175. package/src/forge/agent-memory/sources/cursor.ts +35 -0
  176. package/src/forge/agent-memory/types.ts +215 -0
  177. package/src/forge/bench.ts +248 -0
  178. package/src/forge/brownfield-import/index.ts +896 -0
  179. package/src/forge/brownfield-import/types.ts +127 -0
  180. package/src/forge/cair/action-journal.ts +61 -0
  181. package/src/forge/cair/action-parser.ts +314 -0
  182. package/src/forge/cair/action-validator.ts +40 -0
  183. package/src/forge/cair/actions.ts +1818 -0
  184. package/src/forge/cair/format.ts +77 -0
  185. package/src/forge/cair/index.ts +118 -0
  186. package/src/forge/cair/query.ts +478 -0
  187. package/src/forge/cair/snapshot.ts +315 -0
  188. package/src/forge/cair/types.ts +255 -0
  189. package/src/forge/cli/adaptive.ts +51 -0
  190. package/src/forge/cli/ai.ts +16 -1
  191. package/src/forge/cli/auth.ts +459 -15
  192. package/src/forge/cli/authmd.ts +441 -0
  193. package/src/forge/cli/baseline.ts +112 -0
  194. package/src/forge/cli/build.ts +20 -4
  195. package/src/forge/cli/changed.ts +418 -0
  196. package/src/forge/cli/codex-app-server.ts +877 -0
  197. package/src/forge/cli/commands.ts +1859 -20
  198. package/src/forge/cli/db.ts +209 -2
  199. package/src/forge/cli/deploy.ts +1339 -0
  200. package/src/forge/cli/deps.ts +150 -23
  201. package/src/forge/cli/dev.ts +1137 -53
  202. package/src/forge/cli/docs.ts +265 -0
  203. package/src/forge/cli/doctor.ts +297 -0
  204. package/src/forge/cli/env-placeholders.ts +62 -0
  205. package/src/forge/cli/evolution.ts +40 -0
  206. package/src/forge/cli/fabric.ts +253 -0
  207. package/src/forge/cli/field-test.ts +568 -0
  208. package/src/forge/cli/golden-path.ts +487 -0
  209. package/src/forge/cli/handoff.ts +336 -0
  210. package/src/forge/cli/index.ts +1 -0
  211. package/src/forge/cli/last-run.ts +84 -0
  212. package/src/forge/cli/main.ts +196 -3
  213. package/src/forge/cli/new.ts +169 -17
  214. package/src/forge/cli/next-actions.ts +23 -0
  215. package/src/forge/cli/output.ts +398 -6
  216. package/src/forge/cli/parse.ts +1377 -38
  217. package/src/forge/cli/progress.ts +51 -0
  218. package/src/forge/cli/query.ts +32 -0
  219. package/src/forge/cli/release.ts +35 -11
  220. package/src/forge/cli/repository.ts +151 -0
  221. package/src/forge/cli/run.ts +42 -0
  222. package/src/forge/cli/secrets.ts +137 -1
  223. package/src/forge/cli/seed.ts +581 -0
  224. package/src/forge/cli/self-host.ts +56 -14
  225. package/src/forge/cli/studio.ts +2282 -0
  226. package/src/forge/cli/verify.ts +1458 -32
  227. package/src/forge/cli/windows.ts +23 -0
  228. package/src/forge/cli/workos.ts +3509 -0
  229. package/src/forge/compiler/agent-contract/build.ts +728 -64
  230. package/src/forge/compiler/agent-contract/types.ts +45 -2
  231. package/src/forge/compiler/ai-registry/parse.ts +71 -2
  232. package/src/forge/compiler/api-surface/build.ts +47 -0
  233. package/src/forge/compiler/app-graph/build.ts +112 -9
  234. package/src/forge/compiler/app-graph/extract.ts +107 -0
  235. package/src/forge/compiler/app-graph/module-graph.ts +73 -78
  236. package/src/forge/compiler/app-graph/parser.ts +24 -24
  237. package/src/forge/compiler/app-graph/profile.ts +26 -0
  238. package/src/forge/compiler/app-graph/tsconfig-hash.ts +41 -4
  239. package/src/forge/compiler/app-graph/versions.ts +1 -1
  240. package/src/forge/compiler/classifier/capabilities.ts +3 -2
  241. package/src/forge/compiler/classifier/classify.ts +32 -8
  242. package/src/forge/compiler/classifier/secrets.ts +3 -2
  243. package/src/forge/compiler/classifier/signals.ts +91 -1
  244. package/src/forge/compiler/client-sdk/build-manifest.ts +59 -0
  245. package/src/forge/compiler/client-sdk/render-client.ts +295 -13
  246. package/src/forge/compiler/data-graph/build.ts +29 -1
  247. package/src/forge/compiler/data-graph/parse.ts +20 -4
  248. package/src/forge/compiler/data-graph/sql/ddl.ts +144 -31
  249. package/src/forge/compiler/data-graph/sql/serialize.ts +4 -0
  250. package/src/forge/compiler/data-graph/sql/types.ts +1 -0
  251. package/src/forge/compiler/diagnostics/codes.ts +38 -0
  252. package/src/forge/compiler/diagnostics/create.ts +28 -2
  253. package/src/forge/compiler/diagnostics/index.ts +2 -0
  254. package/src/forge/compiler/emitter/barrel.ts +3 -0
  255. package/src/forge/compiler/emitter/render.ts +9 -0
  256. package/src/forge/compiler/external-manifest/registry.ts +217 -0
  257. package/src/forge/compiler/external-manifest/types.ts +91 -0
  258. package/src/forge/compiler/external-manifest/validate.ts +373 -0
  259. package/src/forge/compiler/frontend-graph/build.ts +142 -14
  260. package/src/forge/compiler/integration/add.ts +991 -33
  261. package/src/forge/compiler/integration/plan.ts +43 -12
  262. package/src/forge/compiler/integration/render.ts +29 -0
  263. package/src/forge/compiler/integration/snapshot.ts +2 -0
  264. package/src/forge/compiler/integration/templates/convex.ts +70 -0
  265. package/src/forge/compiler/integration/templates/index.ts +1 -0
  266. package/src/forge/compiler/integration/templates/render.ts +38 -0
  267. package/src/forge/compiler/integration/templates/types.ts +3 -0
  268. package/src/forge/compiler/integration/templates/workos.ts +1439 -0
  269. package/src/forge/compiler/make-registry/build.ts +8 -9
  270. package/src/forge/compiler/orchestrator/fast-check.ts +4 -0
  271. package/src/forge/compiler/orchestrator/generate-lock.ts +14 -3
  272. package/src/forge/compiler/orchestrator/manifest.ts +1 -1
  273. package/src/forge/compiler/orchestrator/plan-profile.ts +23 -0
  274. package/src/forge/compiler/orchestrator/plan.ts +249 -10
  275. package/src/forge/compiler/orchestrator/profile.ts +65 -0
  276. package/src/forge/compiler/orchestrator/run.ts +101 -33
  277. package/src/forge/compiler/orchestrator/serialize.ts +33 -8
  278. package/src/forge/compiler/orchestrator/types.ts +1 -1
  279. package/src/forge/compiler/package-graph/compiler.ts +3 -1
  280. package/src/forge/compiler/package-graph/constants.ts +1 -1
  281. package/src/forge/compiler/package-graph/dts-extractor.ts +14 -1
  282. package/src/forge/compiler/package-manager/adapter.ts +4 -1
  283. package/src/forge/compiler/package-manager/commands.ts +4 -0
  284. package/src/forge/compiler/package-manager/executor.ts +30 -1
  285. package/src/forge/compiler/package-manager/version.ts +36 -12
  286. package/src/forge/compiler/package-upgrades/planner.ts +155 -18
  287. package/src/forge/compiler/package-upgrades/types.ts +2 -0
  288. package/src/forge/compiler/policy-registry/build.ts +47 -2
  289. package/src/forge/compiler/policy-registry/parse.ts +32 -2
  290. package/src/forge/compiler/recipes/definitions.ts +63 -0
  291. package/src/forge/compiler/recipes/index.ts +2 -0
  292. package/src/forge/compiler/recipes/profiles.ts +81 -0
  293. package/src/forge/compiler/recipes/registry.ts +6 -0
  294. package/src/forge/compiler/test-graph/build.ts +11 -3
  295. package/src/forge/compiler/types/app-graph.ts +8 -2
  296. package/src/forge/compiler/types/cli.ts +76 -1
  297. package/src/forge/compiler/types/dev-manifest.ts +4 -0
  298. package/src/forge/compiler/types/emit.ts +2 -0
  299. package/src/forge/compiler/types/frontend-graph.ts +2 -2
  300. package/src/forge/compiler/types/integration.ts +1 -0
  301. package/src/forge/compiler/types/package-graph.ts +6 -0
  302. package/src/forge/compiler/types/policy-registry.ts +3 -1
  303. package/src/forge/delta/broker-runner.mjs +5 -0
  304. package/src/forge/delta/broker.ts +429 -0
  305. package/src/forge/delta/classifier.ts +52 -0
  306. package/src/forge/delta/explain.ts +238 -0
  307. package/src/forge/delta/git-observer.ts +67 -0
  308. package/src/forge/delta/ids.ts +44 -0
  309. package/src/forge/delta/index.ts +25 -0
  310. package/src/forge/delta/process-identity.ts +37 -0
  311. package/src/forge/delta/queue-status.ts +190 -0
  312. package/src/forge/delta/recorder.ts +540 -0
  313. package/src/forge/delta/redaction.ts +50 -0
  314. package/src/forge/delta/schema.ts +240 -0
  315. package/src/forge/delta/session.ts +142 -0
  316. package/src/forge/delta/status.ts +1139 -0
  317. package/src/forge/delta/store.ts +3329 -0
  318. package/src/forge/delta/timeline.ts +178 -0
  319. package/src/forge/dev/server.ts +1061 -22
  320. package/src/forge/dev/types.ts +15 -1
  321. package/src/forge/dev/watch.ts +17 -7
  322. package/src/forge/dev-console/cycle.ts +285 -33
  323. package/src/forge/dev-console/types.ts +47 -1
  324. package/src/forge/impact/index.ts +222 -30
  325. package/src/forge/impact/types.ts +33 -1
  326. package/src/forge/intent/index.ts +35 -16
  327. package/src/forge/make/fields.ts +26 -0
  328. package/src/forge/make/index.ts +42 -6
  329. package/src/forge/make/templates.ts +211 -4
  330. package/src/forge/make/types.ts +2 -1
  331. package/src/forge/policy.ts +1 -1
  332. package/src/forge/react/index.ts +160 -2
  333. package/src/forge/refactor/index.ts +1 -0
  334. package/src/forge/repair/rules/index.ts +2 -2
  335. package/src/forge/repository-analysis/adapters/common.ts +72 -0
  336. package/src/forge/repository-analysis/adapters/docker.ts +185 -0
  337. package/src/forge/repository-analysis/adapters/java.ts +133 -0
  338. package/src/forge/repository-analysis/adapters/typescript.ts +350 -0
  339. package/src/forge/repository-analysis/adapters/vue.ts +71 -0
  340. package/src/forge/repository-analysis/analyze.ts +434 -0
  341. package/src/forge/repository-analysis/benchmark.ts +336 -0
  342. package/src/forge/repository-analysis/cache-gc.ts +154 -0
  343. package/src/forge/repository-analysis/check-selection.ts +123 -0
  344. package/src/forge/repository-analysis/context-node.ts +17 -0
  345. package/src/forge/repository-analysis/context.ts +456 -0
  346. package/src/forge/repository-analysis/http-resolution.ts +135 -0
  347. package/src/forge/repository-analysis/identity.ts +45 -0
  348. package/src/forge/repository-analysis/index.ts +18 -0
  349. package/src/forge/repository-analysis/nuxt-resolution.ts +188 -0
  350. package/src/forge/repository-analysis/quality.ts +60 -0
  351. package/src/forge/repository-analysis/retrieval.ts +309 -0
  352. package/src/forge/repository-analysis/runtime-artifacts.ts +195 -0
  353. package/src/forge/repository-analysis/runtime-observation.ts +325 -0
  354. package/src/forge/repository-analysis/scanner.ts +174 -0
  355. package/src/forge/repository-analysis/storage.ts +193 -0
  356. package/src/forge/repository-analysis/test-associations.ts +59 -0
  357. package/src/forge/repository-analysis/types.ts +99 -0
  358. package/src/forge/repository-manifest/index.ts +178 -0
  359. package/src/forge/repository-manifest/types.ts +63 -0
  360. package/src/forge/review/index.ts +162 -12
  361. package/src/forge/review/types.ts +15 -0
  362. package/src/forge/runtime/ai/providers.ts +19 -4
  363. package/src/forge/runtime/auth/config.ts +17 -0
  364. package/src/forge/runtime/auth/evaluate.ts +15 -2
  365. package/src/forge/runtime/auth/resolve.ts +61 -6
  366. package/src/forge/runtime/auth/types.ts +1 -0
  367. package/src/forge/runtime/db/factory.ts +1 -3
  368. package/src/forge/runtime/db/generated-client.ts +13 -2
  369. package/src/forge/runtime/db/memory-adapter.ts +139 -32
  370. package/src/forge/runtime/db/pglite-adapter.ts +285 -2
  371. package/src/forge/runtime/executor.ts +129 -16
  372. package/src/forge/runtime/external/bridge.ts +663 -0
  373. package/src/forge/runtime/runner/run-entry.ts +16 -7
  374. package/src/forge/runtime/telemetry/buffer.ts +4 -1
  375. package/src/forge/runtime/telemetry/scrubber.ts +35 -5
  376. package/src/forge/runtime/webhooks/security.ts +12 -7
  377. package/src/forge/server.ts +71 -7
  378. package/src/forge/ui/index.ts +831 -19
  379. package/src/forge/ui/types.ts +3 -1
  380. package/src/forge/version.ts +1 -1
  381. package/src/forge/vue/index.ts +422 -0
  382. package/src/forge/workspace/baseline.ts +112 -0
  383. package/src/forge/workspace/change-summary.ts +292 -0
  384. package/src/forge/workspace/forge-cli.ts +42 -0
  385. package/src/forge/workspace/git-summary.ts +393 -0
  386. package/templates/agent-workroom/AGENTS.md +29 -0
  387. package/templates/agent-workroom/README.md +34 -0
  388. package/templates/agent-workroom/forge.config.ts +3 -0
  389. package/templates/agent-workroom/package.json +34 -0
  390. package/templates/agent-workroom/pnpm-workspace.yaml +2 -0
  391. package/templates/agent-workroom/src/actions/indexAgentSignal.ts +10 -0
  392. package/templates/agent-workroom/src/commands/openWorkroom.ts +61 -0
  393. package/templates/agent-workroom/src/commands/recordAgentSignal.ts +119 -0
  394. package/templates/agent-workroom/src/commands/recordCheckRun.ts +52 -0
  395. package/templates/agent-workroom/src/forge/schema.ts +54 -0
  396. package/templates/agent-workroom/src/policies.ts +6 -0
  397. package/templates/agent-workroom/src/queries/listWorkrooms.ts +11 -0
  398. package/templates/agent-workroom/src/queries/liveWorkroom.ts +63 -0
  399. package/templates/agent-workroom/tsconfig.json +16 -0
  400. package/templates/agent-workroom/web/index.html +13 -0
  401. package/templates/agent-workroom/web/package.json +21 -0
  402. package/templates/agent-workroom/web/src/App.tsx +345 -0
  403. package/templates/agent-workroom/web/src/lib/forge.ts +20 -0
  404. package/templates/agent-workroom/web/src/main.tsx +13 -0
  405. package/templates/agent-workroom/web/src/styles.css +545 -0
  406. package/templates/agent-workroom/web/tsconfig.json +27 -0
  407. package/templates/agent-workroom/web/vite.config.ts +36 -0
  408. package/templates/b2b-support-web/package.json +2 -0
  409. package/templates/b2b-support-web/pnpm-workspace.yaml +2 -0
  410. package/templates/b2b-support-web/web/app/page.tsx +2 -2
  411. package/templates/b2b-support-web/web/lib/forge.ts +9 -2
  412. package/templates/b2b-support-web/web/next.config.ts +24 -0
  413. package/templates/b2b-support-web/web/package.json +1 -1
  414. package/templates/minimal-web/package.json +2 -1
  415. package/templates/minimal-web/pnpm-workspace.yaml +2 -0
  416. package/templates/minimal-web/web/index.html +1 -0
  417. package/templates/minimal-web/web/src/App.tsx +12 -6
  418. package/templates/minimal-web/web/src/lib/forge.ts +9 -2
  419. package/templates/minimal-web/web/src/styles.css +34 -0
  420. package/templates/minimal-web/web/vite.config.ts +36 -0
  421. package/templates/nuxt-web/.vscode/settings.json +14 -0
  422. package/templates/nuxt-web/.yarnrc.yml +1 -0
  423. package/templates/nuxt-web/README.md +30 -0
  424. package/templates/nuxt-web/forge.config.ts +3 -0
  425. package/templates/nuxt-web/package.json +37 -0
  426. package/templates/nuxt-web/pnpm-workspace.yaml +2 -0
  427. package/templates/nuxt-web/src/actions/logNoteCreated.ts +11 -0
  428. package/templates/nuxt-web/src/commands/createNote.ts +26 -0
  429. package/templates/nuxt-web/src/forge/schema.ts +12 -0
  430. package/templates/nuxt-web/src/policies.ts +6 -0
  431. package/templates/nuxt-web/src/queries/listNotes.ts +8 -0
  432. package/templates/nuxt-web/src/queries/liveNotes.ts +8 -0
  433. package/templates/nuxt-web/tsconfig.json +17 -0
  434. package/templates/nuxt-web/web/app.vue +67 -0
  435. package/templates/nuxt-web/web/components/LiveNotes.vue +89 -0
  436. package/templates/nuxt-web/web/components/NoteComposer.vue +100 -0
  437. package/templates/nuxt-web/web/composables/forge.ts +13 -0
  438. package/templates/nuxt-web/web/composables/useNotes.ts +24 -0
  439. package/templates/nuxt-web/web/nuxt.config.ts +11 -0
  440. package/templates/nuxt-web/web/package.json +22 -0
  441. package/templates/nuxt-web/web/plugins/forge.client.ts +10 -0
  442. package/templates/nuxt-web/web/plugins/forge.server.ts +10 -0
  443. package/templates/nuxt-web/web/server/api/forge-health.get.ts +7 -0
  444. package/templates/nuxt-web/web/tsconfig.json +6 -0
  445. package/templates/vendor-access/.vscode/settings.json +14 -0
  446. package/templates/vendor-access/README.md +30 -0
  447. package/templates/vendor-access/forge.config.ts +3 -0
  448. package/templates/vendor-access/package.json +35 -0
  449. package/templates/vendor-access/pnpm-workspace.yaml +2 -0
  450. package/templates/vendor-access/src/commands/addEvidence.ts +42 -0
  451. package/templates/vendor-access/src/commands/approveAccessRequest.ts +43 -0
  452. package/templates/vendor-access/src/commands/createAccessRequest.ts +49 -0
  453. package/templates/vendor-access/src/commands/seedVendorAccessDemo.ts +200 -0
  454. package/templates/vendor-access/src/forge/schema.ts +74 -0
  455. package/templates/vendor-access/src/policies.ts +11 -0
  456. package/templates/vendor-access/src/queries/listVendorAccessDashboard.ts +24 -0
  457. package/templates/vendor-access/src/queries/liveVendorAccessDashboard.ts +24 -0
  458. package/templates/vendor-access/tsconfig.json +17 -0
  459. package/templates/vendor-access/web/index.html +13 -0
  460. package/templates/vendor-access/web/package.json +21 -0
  461. package/templates/vendor-access/web/src/App.tsx +573 -0
  462. package/templates/vendor-access/web/src/lib/forge.ts +20 -0
  463. package/templates/vendor-access/web/src/main.tsx +205 -0
  464. package/templates/vendor-access/web/src/styles.css +682 -0
  465. package/templates/vendor-access/web/tsconfig.json +18 -0
  466. package/templates/vendor-access/web/vite.config.ts +36 -0
  467. package/src/forge/_generated/actionSubscriptions.json +0 -2
  468. package/src/forge/_generated/actionSubscriptions.ts +0 -10
  469. package/src/forge/_generated/agentAdapterManifest.json +0 -2
  470. package/src/forge/_generated/agentAdapterManifest.ts +0 -73
  471. package/src/forge/_generated/agentContract.json +0 -2
  472. package/src/forge/_generated/agentContract.ts +0 -7829
  473. package/src/forge/_generated/agentQuickstart.md +0 -34
  474. package/src/forge/_generated/agentTools.json +0 -2
  475. package/src/forge/_generated/agentTools.md +0 -16
  476. package/src/forge/_generated/agentTools.ts +0 -12
  477. package/src/forge/_generated/aiContext.ts +0 -125
  478. package/src/forge/_generated/aiModels.json +0 -2
  479. package/src/forge/_generated/aiModels.ts +0 -51
  480. package/src/forge/_generated/aiProviders.json +0 -2
  481. package/src/forge/_generated/aiProviders.ts +0 -23
  482. package/src/forge/_generated/aiRegistry.json +0 -2
  483. package/src/forge/_generated/aiRegistry.ts +0 -31
  484. package/src/forge/_generated/api.json +0 -2
  485. package/src/forge/_generated/api.ts +0 -8
  486. package/src/forge/_generated/appGraph.json +0 -2
  487. package/src/forge/_generated/appGraph.ts +0 -14937
  488. package/src/forge/_generated/appMap.md +0 -55
  489. package/src/forge/_generated/artifactManifest.json +0 -2
  490. package/src/forge/_generated/artifactManifest.ts +0 -7
  491. package/src/forge/_generated/authClaims.json +0 -2
  492. package/src/forge/_generated/authClaims.ts +0 -13
  493. package/src/forge/_generated/authConfig.json +0 -2
  494. package/src/forge/_generated/authConfig.ts +0 -17
  495. package/src/forge/_generated/authContext.ts +0 -23
  496. package/src/forge/_generated/authRegistry.json +0 -2
  497. package/src/forge/_generated/authRegistry.ts +0 -25
  498. package/src/forge/_generated/buildInfo.json +0 -2
  499. package/src/forge/_generated/buildInfo.ts +0 -9
  500. package/src/forge/_generated/capabilityMap.json +0 -2
  501. package/src/forge/_generated/capabilityMap.md +0 -15
  502. package/src/forge/_generated/capabilityMap.ts +0 -17
  503. package/src/forge/_generated/client.ts +0 -282
  504. package/src/forge/_generated/clientApi.ts +0 -9
  505. package/src/forge/_generated/clientManifest.json +0 -2
  506. package/src/forge/_generated/clientManifest.ts +0 -39
  507. package/src/forge/_generated/clientTypes.ts +0 -78
  508. package/src/forge/_generated/configRegistry.json +0 -2
  509. package/src/forge/_generated/configRegistry.ts +0 -4
  510. package/src/forge/_generated/dataGraph.json +0 -2
  511. package/src/forge/_generated/dataGraph.ts +0 -8
  512. package/src/forge/_generated/db.json +0 -2
  513. package/src/forge/_generated/db.ts +0 -2
  514. package/src/forge/_generated/dbSecurityManifest.json +0 -2
  515. package/src/forge/_generated/dbSecurityManifest.ts +0 -15
  516. package/src/forge/_generated/dbSessionContext.json +0 -2
  517. package/src/forge/_generated/dbSessionContext.ts +0 -39
  518. package/src/forge/_generated/deployManifest.json +0 -2
  519. package/src/forge/_generated/deployManifest.ts +0 -14
  520. package/src/forge/_generated/devManifest.json +0 -2
  521. package/src/forge/_generated/devManifest.ts +0 -62
  522. package/src/forge/_generated/envSchema.json +0 -2
  523. package/src/forge/_generated/envSchema.ts +0 -59
  524. package/src/forge/_generated/frontendGraph.json +0 -2
  525. package/src/forge/_generated/frontendGraph.ts +0 -27
  526. package/src/forge/_generated/importGuards.json +0 -2
  527. package/src/forge/_generated/importGuards.ts +0 -686
  528. package/src/forge/_generated/index.ts +0 -68
  529. package/src/forge/_generated/liveProductionManifest.json +0 -2
  530. package/src/forge/_generated/liveProductionManifest.ts +0 -23
  531. package/src/forge/_generated/liveProtocol.json +0 -2
  532. package/src/forge/_generated/liveProtocol.ts +0 -21
  533. package/src/forge/_generated/liveQueryRegistry.json +0 -2
  534. package/src/forge/_generated/liveQueryRegistry.ts +0 -9
  535. package/src/forge/_generated/liveTransportConfig.json +0 -2
  536. package/src/forge/_generated/liveTransportConfig.ts +0 -19
  537. package/src/forge/_generated/makeRegistry.json +0 -2
  538. package/src/forge/_generated/makeRegistry.ts +0 -177
  539. package/src/forge/_generated/makeTemplates.json +0 -2
  540. package/src/forge/_generated/makeTemplates.ts +0 -66
  541. package/src/forge/_generated/mockMap.json +0 -2
  542. package/src/forge/_generated/mockMap.ts +0 -7
  543. package/src/forge/_generated/operationPlaybooks.md +0 -167
  544. package/src/forge/_generated/packageGraph.json +0 -2
  545. package/src/forge/_generated/packageGraph.ts +0 -249334
  546. package/src/forge/_generated/packageUpgradeRegistry.json +0 -2
  547. package/src/forge/_generated/packageUpgradeRegistry.ts +0 -15
  548. package/src/forge/_generated/permissionMatrix.json +0 -2
  549. package/src/forge/_generated/permissionMatrix.ts +0 -7
  550. package/src/forge/_generated/policyRegistry.json +0 -2
  551. package/src/forge/_generated/policyRegistry.ts +0 -11
  552. package/src/forge/_generated/queryRegistry.json +0 -2
  553. package/src/forge/_generated/queryRegistry.ts +0 -9
  554. package/src/forge/_generated/react.d.ts +0 -22
  555. package/src/forge/_generated/react.ts +0 -29
  556. package/src/forge/_generated/reactManifest.json +0 -2
  557. package/src/forge/_generated/reactManifest.ts +0 -19
  558. package/src/forge/_generated/rlsPolicies.json +0 -2
  559. package/src/forge/_generated/rlsPolicies.sql +0 -34
  560. package/src/forge/_generated/rlsPolicies.ts +0 -6
  561. package/src/forge/_generated/runtimeGraph.json +0 -2
  562. package/src/forge/_generated/runtimeGraph.ts +0 -8
  563. package/src/forge/_generated/runtimeMatrix.json +0 -2
  564. package/src/forge/_generated/runtimeMatrix.ts +0 -334130
  565. package/src/forge/_generated/runtimeRegistry.ts +0 -2
  566. package/src/forge/_generated/runtimeRules.md +0 -91
  567. package/src/forge/_generated/secretRegistry.json +0 -2
  568. package/src/forge/_generated/secretRegistry.ts +0 -50
  569. package/src/forge/_generated/secretsContext.ts +0 -11
  570. package/src/forge/_generated/serverApi.ts +0 -10
  571. package/src/forge/_generated/sourceMapManifest.json +0 -2
  572. package/src/forge/_generated/sourceMapManifest.ts +0 -7
  573. package/src/forge/_generated/sqlPlan.json +0 -2
  574. package/src/forge/_generated/sqlPlan.ts +0 -88
  575. package/src/forge/_generated/subscriptionManifest.json +0 -2
  576. package/src/forge/_generated/subscriptionManifest.ts +0 -7
  577. package/src/forge/_generated/symbolicationManifest.json +0 -2
  578. package/src/forge/_generated/symbolicationManifest.ts +0 -17
  579. package/src/forge/_generated/telemetryRegistry.json +0 -2
  580. package/src/forge/_generated/telemetryRegistry.ts +0 -9
  581. package/src/forge/_generated/telemetrySinks.json +0 -2
  582. package/src/forge/_generated/telemetrySinks.ts +0 -11
  583. package/src/forge/_generated/tenantScope.json +0 -2
  584. package/src/forge/_generated/tenantScope.ts +0 -8
  585. package/src/forge/_generated/testGraph.json +0 -2
  586. package/src/forge/_generated/testGraph.ts +0 -3452
  587. package/src/forge/_generated/testPlanRegistry.json +0 -2
  588. package/src/forge/_generated/testPlanRegistry.ts +0 -33
  589. package/src/forge/_generated/uiRoutes.json +0 -2
  590. package/src/forge/_generated/uiRoutes.ts +0 -16
  591. package/src/forge/_generated/uiScenarios.json +0 -2
  592. package/src/forge/_generated/uiScenarios.ts +0 -30
  593. package/src/forge/_generated/uiTestManifest.json +0 -2
  594. package/src/forge/_generated/uiTestManifest.ts +0 -27
  595. package/src/forge/_generated/workflowRegistry.json +0 -2
  596. package/src/forge/_generated/workflowRegistry.ts +0 -9
  597. package/src/forge/_generated/workflowSubscriptions.json +0 -2
  598. package/src/forge/_generated/workflowSubscriptions.ts +0 -10
@@ -0,0 +1,336 @@
1
+ import { join } from "node:path";
2
+ import { nodeFileSystem } from "../compiler/fs/index.ts";
3
+ import type { Diagnostic } from "../compiler/types/diagnostic.ts";
4
+ import { runDevConsoleCycle } from "../dev-console/cycle.ts";
5
+ import type { DevConsoleCycle, DevConsolePhase } from "../dev-console/types.ts";
6
+ import type { TestRunRecord } from "../impact/types.ts";
7
+ import type { UiRunReport } from "../ui/types.ts";
8
+ import { summarizeChangeTypes, type CategorizedFileSummary } from "../workspace/change-summary.ts";
9
+ import { forgeCliCommandsForWorkspace } from "../workspace/forge-cli.ts";
10
+ import { buildWorkspaceGitSummary } from "../workspace/git-summary.ts";
11
+ import { runChangedCommand } from "./changed.ts";
12
+
13
+ export interface HandoffCommandOptions {
14
+ workspaceRoot: string;
15
+ json: boolean;
16
+ commitReady?: boolean;
17
+ }
18
+
19
+ export interface HandoffCommandResult {
20
+ schemaVersion: "0.1.0";
21
+ ok: boolean;
22
+ summary: {
23
+ projectRoot: string;
24
+ safeToEdit: boolean;
25
+ generatedFresh: boolean;
26
+ generatedChanged: boolean;
27
+ generatedChangedFiles: number;
28
+ frontendReady: boolean;
29
+ changedFiles: number;
30
+ commitReadyFiles: number;
31
+ stagedFiles: number;
32
+ unstagedFiles: number;
33
+ untrackedFiles: number;
34
+ lastTestRun: "passed" | "failed" | "missing";
35
+ lastUiRun: "passed" | "failed" | "missing";
36
+ workspaceMode: "git" | "nonGit";
37
+ tracking: string;
38
+ };
39
+ dev: {
40
+ ok: boolean;
41
+ primaryAction?: DevConsoleCycle["summary"]["primaryAction"];
42
+ agentContext: DevConsoleCycle["summary"]["agentContext"];
43
+ phases: Array<Pick<DevConsolePhase, "name" | "status" | "message">>;
44
+ };
45
+ git: {
46
+ available: boolean;
47
+ branch?: string;
48
+ commit?: string;
49
+ changed: {
50
+ count: number;
51
+ sample: string[];
52
+ hidden: number;
53
+ };
54
+ staged: {
55
+ count: number;
56
+ sample: string[];
57
+ hidden: number;
58
+ };
59
+ unstaged: {
60
+ count: number;
61
+ sample: string[];
62
+ hidden: number;
63
+ };
64
+ untracked: {
65
+ count: number;
66
+ sample: string[];
67
+ hidden: number;
68
+ };
69
+ changeSummary: {
70
+ changed: CategorizedFileSummary;
71
+ staged: CategorizedFileSummary;
72
+ unstaged: CategorizedFileSummary;
73
+ untracked: CategorizedFileSummary;
74
+ };
75
+ workspaceMode?: string;
76
+ tracking?: string;
77
+ baseline?: unknown;
78
+ error?: string;
79
+ };
80
+ recentRuns: {
81
+ test?: {
82
+ id?: string;
83
+ ok: boolean;
84
+ failed: string[];
85
+ durationMs?: number;
86
+ };
87
+ ui?: {
88
+ id?: string;
89
+ ok: boolean;
90
+ failedScenarios: string[];
91
+ };
92
+ };
93
+ nextAgent: {
94
+ openingBrief: string;
95
+ recommendedReadFiles: string[];
96
+ recommendedCommands: string[];
97
+ risks: string[];
98
+ };
99
+ commitReady?: {
100
+ count: number;
101
+ files: string[];
102
+ };
103
+ diagnosticSummary: {
104
+ total: number;
105
+ sample: Diagnostic[];
106
+ hidden: number;
107
+ bySeverity: Record<string, number>;
108
+ byCode: Record<string, number>;
109
+ fullDiagnosticsCommands: string[];
110
+ };
111
+ diagnostics: Diagnostic[];
112
+ nextActions: string[];
113
+ exitCode: 0 | 1;
114
+ }
115
+
116
+ function readJson<T>(workspaceRoot: string, relativePath: string): T | null {
117
+ const absolute = join(workspaceRoot, relativePath);
118
+ if (!nodeFileSystem.exists(absolute)) {
119
+ return null;
120
+ }
121
+ try {
122
+ return JSON.parse(nodeFileSystem.readText(absolute) ?? "null") as T;
123
+ } catch {
124
+ return null;
125
+ }
126
+ }
127
+
128
+ function summarizeRecentRuns(workspaceRoot: string): HandoffCommandResult["recentRuns"] {
129
+ const test = readJson<TestRunRecord>(workspaceRoot, ".forge/test-runs/last.json");
130
+ const ui = readJson<UiRunReport>(workspaceRoot, ".forge/ui-runs/last.json");
131
+ const failedScenarios = (ui?.scenarios ?? [])
132
+ .filter((scenario) => !scenario.ok)
133
+ .map((scenario) => scenario.name);
134
+ return {
135
+ ...(test
136
+ ? {
137
+ test: {
138
+ id: test.id,
139
+ ok: test.failed.length === 0,
140
+ failed: test.failed,
141
+ durationMs: test.durationMs,
142
+ },
143
+ }
144
+ : {}),
145
+ ...(ui
146
+ ? {
147
+ ui: {
148
+ id: ui.id,
149
+ ok: failedScenarios.length === 0 && ui.diagnostics.every((diagnostic) => diagnostic.severity !== "error"),
150
+ failedScenarios,
151
+ },
152
+ }
153
+ : {}),
154
+ };
155
+ }
156
+
157
+ function buildOpeningBrief(input: {
158
+ dev: DevConsoleCycle;
159
+ git: HandoffCommandResult["git"];
160
+ recentRuns: HandoffCommandResult["recentRuns"];
161
+ commitReady?: HandoffCommandResult["commitReady"];
162
+ }): string {
163
+ const agent = input.dev.summary.agentContext;
164
+ const changedByType = summarizeChangeTypes(input.git.changeSummary.changed);
165
+ const changedFiles = Math.max(agent.changedFiles, input.git.changed.count);
166
+ const commitReadyNote = input.commitReady && input.commitReady.count !== changedFiles
167
+ ? `; ${input.commitReady.count} commit-ready file(s) after excluding generated/operational artifacts`
168
+ : "";
169
+ const tests = input.recentRuns.test
170
+ ? input.recentRuns.test.ok
171
+ ? "last test run passed"
172
+ : "last test run failed"
173
+ : "no last test run";
174
+ const blockers = agent.blockingIssues.length > 0
175
+ ? `${agent.blockingIssues.length} blocking issue(s)`
176
+ : "no blocking issues";
177
+ return [
178
+ `ForgeOS handoff: ${input.dev.ok ? "dev diagnostics are clean" : "dev diagnostics need attention"}.`,
179
+ `${changedFiles} changed file(s)${changedByType ? `: ${changedByType}` : ""}${commitReadyNote}; ${input.git.staged.count} staged, ${input.git.untracked.count} untracked.`,
180
+ `${tests}; ${blockers}.`,
181
+ `Next command: ${input.dev.summary.primaryAction?.command ?? input.dev.nextActions[0]?.command ?? "forge dev"}.`,
182
+ ].join(" ");
183
+ }
184
+
185
+ function compactDiagnostics(
186
+ workspaceRoot: string,
187
+ diagnostics: Diagnostic[],
188
+ sampleSize = 8,
189
+ ): HandoffCommandResult["diagnosticSummary"] {
190
+ const bySeverity: Record<string, number> = {};
191
+ const byCode: Record<string, number> = {};
192
+ for (const diagnostic of diagnostics) {
193
+ bySeverity[diagnostic.severity] = (bySeverity[diagnostic.severity] ?? 0) + 1;
194
+ byCode[diagnostic.code] = (byCode[diagnostic.code] ?? 0) + 1;
195
+ }
196
+ return {
197
+ total: diagnostics.length,
198
+ sample: diagnostics.slice(0, sampleSize),
199
+ hidden: Math.max(0, diagnostics.length - sampleSize),
200
+ bySeverity,
201
+ byCode,
202
+ fullDiagnosticsCommands: forgeCliCommandsForWorkspace(workspaceRoot, [
203
+ "forge dev --once --json",
204
+ "forge inspect all --full --json",
205
+ "forge generate --check --json",
206
+ ]),
207
+ };
208
+ }
209
+
210
+ export async function runHandoffCommand(options: HandoffCommandOptions): Promise<HandoffCommandResult> {
211
+ const workspaceRoot = options.workspaceRoot.replace(/\\/g, "/");
212
+ const dev = await runDevConsoleCycle({
213
+ workspaceRoot,
214
+ mode: "once",
215
+ generatedMode: "check",
216
+ includeImpact: true,
217
+ });
218
+ const git = buildWorkspaceGitSummary(workspaceRoot);
219
+ const commitReady = runChangedCommand(workspaceRoot, { commitReady: true }).data.commitReady as { count: number; files: string[] } | undefined;
220
+ const recentRuns = summarizeRecentRuns(workspaceRoot);
221
+ const agent = dev.summary.agentContext;
222
+ const risks = [
223
+ ...agent.blockingIssues,
224
+ ...(!git.available && git.source === "forge-baseline"
225
+ ? ["git status is unavailable; using Forge workspace baseline for non-git change tracking"]
226
+ : !git.available
227
+ ? ["git status is unavailable; using filesystem inventory as untracked-file analysis"]
228
+ : []),
229
+ ...(git.untracked.count > 0 && git.source !== "forge-baseline" ? [`${git.untracked.count} untracked file(s) are not in git history`] : []),
230
+ ...(commitReady && git.changed.count > commitReady.count
231
+ ? [`${git.changed.count - commitReady.count} generated or operational file(s) are excluded from the commit-ready view`]
232
+ : []),
233
+ ...(recentRuns.test && !recentRuns.test.ok ? ["last test run failed"] : []),
234
+ ...(recentRuns.ui && !recentRuns.ui.ok ? ["last UI run failed"] : []),
235
+ ];
236
+ const nextActions = [
237
+ ...agent.recommendedCommands,
238
+ ...forgeCliCommandsForWorkspace(workspaceRoot, [
239
+ ...(git.changed.count > 0 ? ["forge review run --changed --json"] : []),
240
+ ...(git.changed.count > 0 ? ["forge changed --commit-ready --json"] : []),
241
+ "forge handoff --json",
242
+ ]),
243
+ ];
244
+ const ok = dev.ok &&
245
+ agent.blockingIssues.length === 0 &&
246
+ (!recentRuns.test || recentRuns.test.ok) &&
247
+ (!recentRuns.ui || recentRuns.ui.ok);
248
+ const changedFiles = Math.max(agent.changedFiles, git.changed.count);
249
+ const diagnosticSummary = compactDiagnostics(workspaceRoot, dev.diagnostics);
250
+
251
+ return {
252
+ schemaVersion: "0.1.0",
253
+ ok,
254
+ summary: {
255
+ projectRoot: workspaceRoot,
256
+ safeToEdit: agent.safeToEdit,
257
+ generatedFresh: agent.generatedFresh,
258
+ generatedChanged: agent.generatedChanged,
259
+ generatedChangedFiles: agent.generatedChangedFiles,
260
+ frontendReady: agent.frontendReady,
261
+ changedFiles,
262
+ commitReadyFiles: commitReady?.count ?? changedFiles,
263
+ stagedFiles: git.staged.count,
264
+ unstagedFiles: git.unstaged.count,
265
+ untrackedFiles: git.untracked.count,
266
+ lastTestRun: recentRuns.test ? (recentRuns.test.ok ? "passed" : "failed") : "missing",
267
+ lastUiRun: recentRuns.ui ? (recentRuns.ui.ok ? "passed" : "failed") : "missing",
268
+ workspaceMode: git.workspaceMode ?? (git.available ? "git" : "nonGit"),
269
+ tracking: git.tracking ?? git.source ?? "git",
270
+ },
271
+ dev: {
272
+ ok: dev.ok,
273
+ ...(dev.summary.primaryAction ? { primaryAction: dev.summary.primaryAction } : {}),
274
+ agentContext: agent,
275
+ phases: dev.phases.map((phase) => ({
276
+ name: phase.name,
277
+ status: phase.status,
278
+ ...(phase.message ? { message: phase.message } : {}),
279
+ })),
280
+ },
281
+ git,
282
+ recentRuns,
283
+ nextAgent: {
284
+ openingBrief: buildOpeningBrief({ dev, git, recentRuns, commitReady }),
285
+ recommendedReadFiles: agent.recommendedReadFiles,
286
+ recommendedCommands: [...new Set(nextActions)].slice(0, 10),
287
+ risks,
288
+ },
289
+ ...(commitReady ? { commitReady } : {}),
290
+ diagnosticSummary,
291
+ diagnostics: diagnosticSummary.sample,
292
+ nextActions: [...new Set(nextActions)].slice(0, 10),
293
+ exitCode: ok ? 0 : 1,
294
+ };
295
+ }
296
+
297
+ export function formatHandoffJson(result: HandoffCommandResult): string {
298
+ return `${JSON.stringify(result, null, 2)}\n`;
299
+ }
300
+
301
+ export function formatHandoffHuman(result: HandoffCommandResult): string {
302
+ const lines = [
303
+ `Forge handoff: ${result.ok ? "ready" : "needs attention"}`,
304
+ result.nextAgent.openingBrief,
305
+ "",
306
+ "Read first:",
307
+ ...result.nextAgent.recommendedReadFiles.slice(0, 6).map((file) => ` ${file}`),
308
+ "",
309
+ "Next commands:",
310
+ ...result.nextActions.slice(0, 6).map((command) => ` ${command}`),
311
+ ];
312
+ if (result.nextAgent.risks.length > 0) {
313
+ lines.push("", "Risks:");
314
+ lines.push(...result.nextAgent.risks.slice(0, 6).map((risk) => ` ${risk}`));
315
+ }
316
+ if (result.diagnosticSummary.total > 0) {
317
+ lines.push(
318
+ "",
319
+ "Diagnostics:",
320
+ ` ${result.diagnosticSummary.total} total` +
321
+ (result.diagnosticSummary.hidden > 0 ? ` (${result.diagnosticSummary.hidden} hidden in compact handoff)` : ""),
322
+ );
323
+ }
324
+ if (result.commitReady) {
325
+ lines.push("", "Commit-ready files:", ` ${result.commitReady.count}`);
326
+ lines.push(...result.commitReady.files.slice(0, 8).map((file) => ` ${file}`));
327
+ if (result.commitReady.files.length > 8) {
328
+ lines.push(` ... ${result.commitReady.files.length - 8} more`);
329
+ }
330
+ }
331
+ const changedTypes = summarizeChangeTypes(result.git.changeSummary.changed);
332
+ if (changedTypes) {
333
+ lines.push("", "Change types:", ` ${changedTypes}`);
334
+ }
335
+ return `${lines.join("\n")}\n`;
336
+ }
@@ -2,6 +2,7 @@ export { CLI_VERSION } from "./version.ts";
2
2
  export { parseCli, hasUnknownOption, type ParsedCli, type ForgeCommand } from "./parse.ts";
3
3
  export { runNewCommand, type NewCommandOptions, type NewCommandResult } from "./new.ts";
4
4
  export { runSelfHostCommand, type SelfHostCommandOptions } from "./self-host.ts";
5
+ export { runDocsCheckCommand, type DocsCheckResult } from "./docs.ts";
5
6
  export { runBuildCommand, type BuildCommandOptions } from "./build.ts";
6
7
  export { runServeCommand, type ServeCommandOptions } from "./serve.ts";
7
8
  export { runWorkerCommand, type WorkerCommandOptions } from "./worker.ts";
@@ -0,0 +1,84 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+
4
+ export interface LastRunRecord {
5
+ schemaVersion: "0.1.0";
6
+ command: string;
7
+ ok: boolean;
8
+ startedAt: string;
9
+ finishedAt: string;
10
+ durationMs: number;
11
+ code?: string;
12
+ failureKind?: string;
13
+ message?: string;
14
+ nextActions: string[];
15
+ details?: Record<string, unknown>;
16
+ }
17
+
18
+ export interface LastRunCommandResult {
19
+ ok: boolean;
20
+ record: LastRunRecord | null;
21
+ path: string;
22
+ exitCode: 0 | 1;
23
+ }
24
+
25
+ function lastRunPath(workspaceRoot: string): string {
26
+ return join(workspaceRoot, ".forge", "last-run.json");
27
+ }
28
+
29
+ export function writeLastRunRecord(workspaceRoot: string, record: LastRunRecord): void {
30
+ const file = lastRunPath(workspaceRoot);
31
+ mkdirSync(join(workspaceRoot, ".forge"), { recursive: true });
32
+ writeFileSync(file, `${JSON.stringify(record, null, 2)}\n`, "utf8");
33
+ }
34
+
35
+ export function readLastRunRecord(workspaceRoot: string): LastRunRecord | null {
36
+ const file = lastRunPath(workspaceRoot);
37
+ if (!existsSync(file)) {
38
+ return null;
39
+ }
40
+ return JSON.parse(readFileSync(file, "utf8")) as LastRunRecord;
41
+ }
42
+
43
+ export function runLastCommand(options: { workspaceRoot: string }): LastRunCommandResult {
44
+ const path = lastRunPath(options.workspaceRoot);
45
+ const record = readLastRunRecord(options.workspaceRoot);
46
+ return {
47
+ ok: record !== null,
48
+ record,
49
+ path,
50
+ exitCode: record ? 0 : 1,
51
+ };
52
+ }
53
+
54
+ export function formatLastJson(result: LastRunCommandResult): string {
55
+ return `${JSON.stringify(result, null, 2)}\n`;
56
+ }
57
+
58
+ export function formatLastHuman(result: LastRunCommandResult): string {
59
+ if (!result.record) {
60
+ return `No last run record found at ${result.path}\n`;
61
+ }
62
+ const lines = [
63
+ `Last Forge run: ${result.record.command}`,
64
+ `OK: ${result.record.ok}`,
65
+ `Finished: ${result.record.finishedAt}`,
66
+ `Duration: ${result.record.durationMs}ms`,
67
+ ];
68
+ if (result.record.code) {
69
+ lines.push(`Code: ${result.record.code}`);
70
+ }
71
+ if (result.record.failureKind) {
72
+ lines.push(`Failure: ${result.record.failureKind}`);
73
+ }
74
+ if (result.record.message) {
75
+ lines.push(`Message: ${result.record.message}`);
76
+ }
77
+ if (result.record.nextActions.length > 0) {
78
+ lines.push("Next actions:");
79
+ for (const action of result.record.nextActions) {
80
+ lines.push(` ${action}`);
81
+ }
82
+ }
83
+ return `${lines.join("\n")}\n`;
84
+ }
@@ -4,28 +4,209 @@ import { isMainModule } from "../platform/module.ts";
4
4
  import { executeCommand } from "./commands.ts";
5
5
  import { hasUnknownOption, parseCli } from "./parse.ts";
6
6
  import { formatJsonResult } from "./output.ts";
7
+ import { recordParsedCliCommand } from "../delta/index.ts";
8
+ import { readRepositoryManifest } from "../repository-manifest/index.ts";
7
9
 
8
10
  function formatHelp(): string {
9
11
  return [
10
12
  "ForgeOS",
13
+ " forge manifest discover --root <path> --json Propose a repository manifest without writing",
14
+ " forge repository analyze --write --json Analyze Vue/Java/Docker and save a coherent local map",
15
+ " forge repository context --query routes --json Read snapshot-bound repository context",
16
+ " forge repository quality --cases tasks.json --json Evaluate reviewed static task fixtures without running a model",
17
+ " forge repository cache-gc --json Preview cache cleanup; --write applies after retention",
18
+ " forge repository benchmark-plan --cases tasks.json --model-config model.json --json Prepare paired agent experiment",
19
+ " forge repository benchmark-report --plan plan.json --observations observations.json --json Compare supplied evidence",
20
+ " forge repository runtime-plan --environment-id local --json Review declared runtime commands without executing",
21
+ " forge repository runtime-observe --environment-id local --execute --write --json Execute in a temporary source copy and save observations",
22
+ " forge repository runtime-context --environment-id local --query checkout --json Read current, bounded runtime evidence",
11
23
  "",
12
24
  "Start with one of these:",
25
+ " forge status --json Compact project health, handoff state, and next actions",
26
+ " forge changed --json Group changed files into human, generated, and risk buckets",
27
+ " forge changed --authored --json Show only authored changed files, excluding generated artifacts",
28
+ " forge changed --review --json Show review-focused app/config/docs changes, excluding local agent/browser artifacts",
29
+ " forge changed --commit-ready --json Show files suitable for git add, excluding generated and operational artifacts",
30
+ " forge new my-app --template vendor-access --field-test Create an installed WorkOS/auth.md field-test app",
31
+ " forge golden-path plan --auth workos --target docker --forge-spec npm:forgeos@alpha --json Print the official create -> auth -> field-test -> deploy path",
32
+ " forge golden-path status --real --production --client-id client_... --json Read current app evidence and return the next blocking command",
33
+ " forge field-test create vendor-access --auth workos --install --git --json Create a real field-test app",
34
+ " forge field-test run --realistic --templates vendor-access --package-managers npm --json",
35
+ " forge field-test report --json Summarize the machine-readable field-test report",
36
+ " forge deploy init --target docker --json Generate Docker production files, env template, and deploy README",
37
+ " forge deploy readiness --production --json Answer whether the app can publish, what blocks it, and the next command",
38
+ " forge env doctor --target production --json Show production env sources, missing keys, auth mode, database, and provider",
39
+ " forge seed status --json Discover app seed commands from the generated runtime graph",
40
+ " forge seed dev --json Run the app seed command against the local Forge dev runtime",
41
+ " forge seed dev --all-tenants --json Seed every discovered local tenant/persona profile",
42
+ " forge seed reset --json Run the seed command with args.reset=true against the local dev runtime",
43
+ " forge diff authored Run the authored-only git diff pathspec",
44
+ " forge handoff --json Compact work handoff for the next external code agent",
45
+ " forge agent onboard --target codex --json Prepare adapter, hooks, memory, and dev snapshot",
46
+ " forge doctor agent --target codex --json Check adapter, hooks, and Agent Memory readiness",
47
+ " forge doctor delta --json Check DeltaDB writability, queue drain, redaction, and gitignore posture",
48
+ " forge doctor runtime --json Check generated freshness, local dev lifecycle, and PGlite posture",
49
+ " forge agent ingest codex --watch --file .forge/agent/events.ndjson --json Explicit queue watcher for debugging",
50
+ " forge fabric install-skill [--dry-run] --json Install the portable personal skill for this runtime",
51
+ " forge fabric doctor --json Diagnose the current Git project and its owner without starting workers",
52
+ " forge fabric ensure-owner --json Reuse or start the current Git project owner",
53
+ " forge fabric project-register [--project-id <id>] --json Register this Git root for MCP routing",
54
+ " forge fabric project-list --json List registered projects",
55
+ " forge fabric capabilities --json Report the connected Agent Fabric local capabilities",
56
+ " forge fabric propose --file task.json --json Record an untrusted coding task proposal",
57
+ " forge fabric memory-add --file note.json --json Retain a bounded private note for a source snapshot",
58
+ " forge fabric memory-list --file paths.json --json List current notes for a source snapshot",
59
+ " forge fabric memory-delete <memory-id> --json Delete a private note",
60
+ " forge fabric status <task-id> --json Read durable task control state",
61
+ " forge fabric evidence <task-id> --json Read bounded task provenance and result digests",
62
+ " forge fabric change-propose --file request.json --json Register a change request for independent review",
63
+ " forge fabric change-status --task-id <change-id> --json Read pinned change review state",
64
+ " forge fabric change-evidence --task-id <change-id> --json Read exact-diff review evidence",
65
+ " forge fabric change-review --task-id <change-id> --json Run the owner-invoked Codex CLI reviewer (uses Codex credits)",
66
+ " forge fabric review <task-id> --json Open the local owner review window",
67
+ " forge fabric run <task-id> --json Run one approved local Ollama attempt",
68
+ " forge fabric cancel <task-id> --json Request best-effort task cancellation",
69
+ " forge fabric reconcile <task-id> --json Read back an uncertain patch effect without rerunning it",
70
+ " forge fabric verify <task-id> --json Run owner-approved local checks in Docker Desktop",
71
+ " forge fabric recover-verification <task-id> --json Ask owner to clear a pre-container verification intent",
72
+ " forge fabric review-result <task-id> --json Review and record a local diff decision",
73
+ " forge fabric attached-propose --file request.json --json Register a Codex accompanied task (owner required)",
74
+ " forge fabric attached-status --task-id <task-id> --json Read snapshot-bound readiness",
75
+ " forge fabric attached-context --task-id <task-id> --json Recover accompanied task context",
76
+ " forge fabric attached-<mutation> --file request.json --json Record sessions, attempts, reviews and evidence",
77
+ " forge fabric workflow-next --task-id <task-id> --json Read eligible caller-driven workflow nodes",
78
+ " forge fabric workflow-<mutation> --file request.json --json Plan, claim, result, replan, reconcile or recover",
79
+ " forge fabric run-start --file run.json --json Start managed workflow workers (Codex can consume credits)",
80
+ " forge fabric program-validate --file request.json --json Lower/validate opt-in static workflow DSL against owner registry",
81
+ " forge fabric program-start --file request.json --json Start a durable v2 program (Codex can consume credits)",
82
+ " forge fabric program-status --run-id <id> --json Inspect v2 templates, attempts, candidates and gates",
83
+ " forge fabric program-history|program-explain --run-id <id> --json Inspect journal, scopes and admission",
84
+ " forge fabric program-artifact-get|program-diff --file request.json --json Read artifacts or inspect plan changes",
85
+ " forge fabric program-<control> --file request.json --json Pause, resume, signal, replan, reconcile, cancel or apply v2 work",
86
+ " forge fabric run-status --run-id <run-id> --json Read durable managed execution state",
87
+ " forge fabric run-wait --file wait.json --json Wait for managed events up to 30 seconds",
88
+ " forge fabric run-<control> --file request.json --json Steer, pause, resume, cancel or reconcile managed work",
89
+ " forge fabric serve --json Start the single local task owner for CLI and MCP clients",
90
+ " forge fabric adaptive-propose --file input.json [--channel canary|stable] --json Propose two bounded data-only workers",
91
+ " forge fabric adaptive-review <run-id> --json Open the local owner approval window",
92
+ " forge fabric adaptive-run <run-id> --json Run two permitted processes and join once",
93
+ " forge fabric adaptive-status <run-id> --json Read durable result after restart",
94
+ " forge evolution register --manifest extension.json --json Pin local extension bytes as an immutable candidate",
95
+ " forge evolution evaluate <version-id> --json Run the fixed local integrity suite",
96
+ " forge evolution status <version-id> --json Read bounded version and decision status",
97
+ " forge evolution review canary|promote|rollback|revoke <version-id> --json Open owner decision window",
98
+ " forge evolution load <extension-key> --channel canary|stable --json Verify selected loadability",
99
+ " forge docs check --json Check public docs, ReadTheDocs config, links, and local MkDocs tooling",
100
+ " forge docs check --build --install-venv --json Build docs strictly in a local RTD-style venv",
101
+ " forge release doctor --json Check npm publish readiness plus separate production deploy readiness",
102
+ " forge authmd generate Write public/auth.md from the generated agent/auth contract",
103
+ " forge auth check --production --json Fail unless auth is jwt/oidc production-ready",
104
+ " forge auth prove --provider workos --real --client-id client_... --file workos-seed.yml --json Prove real WorkOS auth/setup evidence without opening the dashboard",
105
+ " forge authmd check --json Check public/auth.md drift for CI and agent-ready apps",
106
+ " forge workos install --yes --json Delegate AuthKit setup to npx --yes workos@latest install",
107
+ " forge workos doctor --json Check WorkOS AuthKit/RBAC files, claims, seed, webhook, and tenant guards",
108
+ " forge workos doctor --yes --json Run local checks, then delegate to npx --yes workos@latest doctor",
109
+ " forge workos env --client-id client_... --write --json Create/update .env.local and web/.env.local for real WorkOS AuthKit proof",
110
+ " forge workos seed --file workos-seed.yml --dry-run --json Validate WorkOS seed without hosted changes",
111
+ " forge workos prove --file workos-seed.yml --json Prove local WorkOS/AuthKit/RBAC/seed readiness without dashboard changes",
112
+ " forge workos setup --real --file workos-seed.yml --json Apply redirect/CORS/homepage config and seed WorkOS without dashboard",
113
+ " forge add auth workos --with-fga Add optional WorkOS FGA resource-level authorization helpers",
114
+ " forge workos fga plan --json Derive the WorkOS FGA resource graph and proof scenarios from the app",
115
+ " forge workos fga plan --write --json Write .forge/workos-fga-setup.md for hosted FGA resource type setup",
116
+ " forge workos fga sync --json Record an idempotent local FGA graph state for deploy gates",
117
+ " forge workos fga prove --json Prove local FGA graph, cross-tenant denials, and state freshness",
118
+ " forge deploy plan --target docker --json Explain production deploy gates and commands",
119
+ " forge deploy check --production --json Gate auth, DB, metadata, generated artifacts, and liveQuery readiness",
120
+ " forge deploy package --target docker Write Docker production deploy files under deploy/",
121
+ " forge deploy verify --production --url https://app.example.com --json Probe health, public auth metadata, and optional runtime endpoints",
122
+ " forge release check --allow-missing-local-release --json Gate release readiness without failing on unprepared local artifacts",
123
+ " forge self-host check --prepared-only --json Report compose readiness without creating deploy files",
124
+ " forge delta status --verbose --json Include Delta schema, lock, and aggregate count details",
125
+ " forge delta compact --json Compact redacted local agent queue history",
126
+ " forge delta prune --older-than 30d --dry-run --json Plan local Delta operational retention",
127
+ " forge delta export --redacted --json Export redacted Delta status, timeline, and agent memory",
128
+ " forge studio open <app-path> --preview-port 5174 --target codex --json",
129
+ " forge studio snapshot <app-path> --preview-port 5174 --target codex --probe-codex-server --json",
130
+ " forge studio bridge <app-path> --preview-port 5174 --target codex --studio-url http://127.0.0.1:3765 --probe-codex-server --json",
131
+ " forge studio doctor <app-path> --preview-port 5174 --target codex --json",
132
+ " forge studio codex-server <app-path> --probe --json",
133
+ " forge studio watch <app-path> --preview-port 5174 --target codex --json",
13
134
  " forge dev Run API, DB/worker, watch, and web app when present",
14
135
  " forge dev --once --json One-shot health/diagnostic loop for agents and CI",
15
136
  " forge do \"fix\" --json Ask ForgeOS for the right workflow and commands",
16
- " forge inspect all --json Read the generated machine contract",
137
+ " forge cair snapshot Compact CAIR project snapshot for agents",
138
+ " forge cair query \"Q REFS S#1\" Run a semantic CAIR query",
139
+ " forge cair action --plan \"A RN t=S#1 nn=renamed\" Plan a guarded semantic edit",
140
+ " forge cair action \"A APPLY plan=<P#|path>\" Apply a guarded CAIR plan",
141
+ " forge agent print-context --json Read the generated agent context pack",
142
+ " forge inspect all --brief --json Read the smallest aggregate project contract",
143
+ " forge inspect all --json Read the compact generated machine contract",
144
+ " forge mcp serve Serve ForgeOS Agent Memory tools over MCP stdio",
145
+ " forge agent context --current --json Read the Agent Memory context pack",
146
+ " forge agent timeline --json Read external-agent hook activity as a compact timeline",
17
147
  " forge doctor windows --json Diagnose native Windows setup and Bun shims",
148
+ " forge bench compiler --json Measure public compiler phase timings",
149
+ " forge manifest validate ./forge.manifest.json --json Validate an external runtime manifest",
18
150
  "",
19
151
  "Useful next commands:",
20
152
  " forge generate",
21
153
  " forge check --json",
154
+ " forge verify App-level default verification for the current project",
22
155
  " forge verify --standard",
23
- " forge verify --strict",
156
+ " forge verify quick Alias for smoke/fast local checks",
157
+ " forge verify agent Alias for standard agent-loop verification",
158
+ " forge verify release Alias for strict app release verification",
159
+ " forge verify framework Maintainer-only ForgeOS framework test gate",
160
+ " forge verify --strict --typechecker native --test-jobs 6",
161
+ " forge verify framework --test-plan --json",
162
+ "",
163
+ ].join("\n");
164
+ }
165
+
166
+ function formatDevHelp(): string {
167
+ return [
168
+ "ForgeOS dev",
169
+ "",
170
+ "Usage:",
171
+ " forge dev [status|stop] [options]",
172
+ "",
173
+ "Options:",
174
+ " --db memory|pglite|postgres|none Choose the development database adapter",
175
+ " --port <port> API runtime port; use 0 for an ephemeral port",
176
+ " --web-port <port> Web dev server port; use 0 for an ephemeral port",
177
+ " --public-api-url <url> Browser-facing API URL injected into web env, useful for tunnels",
178
+ " --host <host> Bind host, default 127.0.0.1",
179
+ " --no-web Start API/runtime only",
180
+ " --api-only Start API/runtime only",
181
+ " --web-only Start web server only, expecting an API runtime",
182
+ " --no-worker Disable local worker",
183
+ " --no-watch Disable file watching",
184
+ " --seed Run the discovered seed command after the API runtime starts",
185
+ " --seed-command <name> Select a specific seed command for --seed",
186
+ " --all-tenants With --seed, seed every discovered local tenant/persona",
187
+ " --once --json Run one-shot diagnostics without starting servers",
188
+ " --detach --json Start dev in the background with .forge/dev/dev.pid and .forge/dev/dev.log",
189
+ "",
190
+ "Examples:",
191
+ " forge dev --db memory --port 3777 --web-port 5174",
192
+ " forge dev --public-api-url http://localhost:3765",
193
+ " forge dev --db memory --port 0 --web-port 0",
194
+ " forge dev --seed --db pglite",
195
+ " forge dev --seed --all-tenants --db pglite",
196
+ " forge dev --db pglite --once --json",
197
+ " forge dev --detach --db memory --port 0 --json",
198
+ " forge dev status --json",
199
+ " forge dev stop --json",
24
200
  "",
25
201
  ].join("\n");
26
202
  }
27
203
 
28
204
  export async function main(argv: string[] = process.argv.slice(2)): Promise<number> {
205
+ if (argv[0] === "dev" && (argv.includes("--help") || argv.includes("-h"))) {
206
+ process.stdout.write(formatDevHelp());
207
+ return 0;
208
+ }
209
+
29
210
  if (argv.length === 0 || argv.includes("--help") || argv.includes("-h")) {
30
211
  process.stdout.write(formatHelp());
31
212
  return 0;
@@ -83,7 +264,19 @@ export async function main(argv: string[] = process.argv.slice(2)): Promise<numb
83
264
  return 1;
84
265
  }
85
266
 
86
- return executeCommand(parsed.command);
267
+ const startedAt = Date.now();
268
+ const exitCode = await executeCommand(parsed.command);
269
+ const repositoryRead = parsed.command.kind === "repository" ||
270
+ (parsed.command.kind === "manifest" && parsed.command.subcommand === "validate") ||
271
+ (parsed.command.kind === "cair" && (() => { const repository = readRepositoryManifest(parsed.command.options.workspaceRoot, { manifestPath: parsed.command.options.manifestPath }); return !!repository.manifest || repository.diagnostics.length > 0; })());
272
+ if (repositoryRead) return exitCode;
273
+ await recordParsedCliCommand({
274
+ command: parsed.command,
275
+ argv,
276
+ exitCode,
277
+ durationMs: Date.now() - startedAt,
278
+ });
279
+ return exitCode;
87
280
  }
88
281
 
89
282
  if (isMainModule(import.meta)) {