forgeos 0.1.0-alpha.4 → 0.1.0-alpha.40

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 (415) hide show
  1. package/.npmignore +10 -0
  2. package/AGENTS.md +142 -90
  3. package/CHANGELOG.md +418 -0
  4. package/LICENSE +21 -0
  5. package/README.md +67 -8
  6. package/adapters/go/README.md +23 -0
  7. package/adapters/go/go.mod +3 -0
  8. package/adapters/go/http.go +149 -0
  9. package/adapters/go/registry.go +234 -0
  10. package/adapters/go/types.go +136 -0
  11. package/adapters/java/README.md +68 -0
  12. package/adapters/java/pom.xml +34 -0
  13. package/adapters/java/src/main/java/dev/forgeos/adapter/Auth.java +20 -0
  14. package/adapters/java/src/main/java/dev/forgeos/adapter/Diagnostic.java +16 -0
  15. package/adapters/java/src/main/java/dev/forgeos/adapter/Entry.java +38 -0
  16. package/adapters/java/src/main/java/dev/forgeos/adapter/EntryKind.java +16 -0
  17. package/adapters/java/src/main/java/dev/forgeos/adapter/ErrorInfo.java +4 -0
  18. package/adapters/java/src/main/java/dev/forgeos/adapter/Forge.java +94 -0
  19. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeCall.java +12 -0
  20. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeContext.java +11 -0
  21. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHandler.java +8 -0
  22. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHttpHandler.java +179 -0
  23. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeRegistry.java +121 -0
  24. package/adapters/java/src/main/java/dev/forgeos/adapter/Json.java +14 -0
  25. package/adapters/java/src/main/java/dev/forgeos/adapter/Manifest.java +14 -0
  26. package/adapters/java/src/main/java/dev/forgeos/adapter/RequestEnvelope.java +6 -0
  27. package/adapters/java/src/main/java/dev/forgeos/adapter/ResponseEnvelope.java +25 -0
  28. package/adapters/java/src/main/java/dev/forgeos/adapter/Risk.java +18 -0
  29. package/adapters/java/src/main/java/dev/forgeos/adapter/Schemas.java +36 -0
  30. package/adapters/java/src/main/java/dev/forgeos/adapter/Service.java +65 -0
  31. package/adapters/java/src/main/java/dev/forgeos/adapter/TransactionMode.java +18 -0
  32. package/adapters/java/src/main/java/dev/forgeos/adapter/TypedForgeHandler.java +6 -0
  33. package/adapters/java-spring-boot-starter/README.md +32 -0
  34. package/adapters/java-spring-boot-starter/pom.xml +36 -0
  35. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeCommand.java +22 -0
  36. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeExternalService.java +15 -0
  37. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeQuery.java +16 -0
  38. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeServiceBeanCondition.java +18 -0
  39. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringAutoConfiguration.java +16 -0
  40. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringRuntime.java +104 -0
  41. package/adapters/java-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +1 -0
  42. package/bin/forge.mjs +18 -0
  43. package/docs/cair-protocol.md +103 -0
  44. package/docs/changelog.md +534 -0
  45. package/docs/forge-protocol.md +189 -0
  46. package/examples/go-billing/go.mod +7 -0
  47. package/examples/go-billing/main.go +120 -0
  48. package/examples/java-billing/pom.xml +52 -0
  49. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/CreateInvoiceInput.java +4 -0
  50. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Invoice.java +11 -0
  51. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Main.java +127 -0
  52. package/package.json +31 -3
  53. package/schemas/forge-manifest.schema.json +57 -0
  54. package/src/forge/_generated/releaseManifest.json +1 -2
  55. package/src/forge/_generated/releaseManifest.ts +3 -3
  56. package/src/forge/agent-adapters/index.ts +1584 -125
  57. package/src/forge/agent-adapters/types.ts +224 -1
  58. package/src/forge/agent-memory/bridge.ts +1333 -0
  59. package/src/forge/agent-memory/context-pack.ts +277 -0
  60. package/src/forge/agent-memory/hook-runner.ts +312 -0
  61. package/src/forge/agent-memory/mcp.ts +224 -0
  62. package/src/forge/agent-memory/normalize.ts +498 -0
  63. package/src/forge/agent-memory/redaction.ts +103 -0
  64. package/src/forge/agent-memory/sources/claude-code.ts +51 -0
  65. package/src/forge/agent-memory/sources/codex-hook-runner.mjs +273 -0
  66. package/src/forge/agent-memory/sources/codex.ts +119 -0
  67. package/src/forge/agent-memory/sources/cursor.ts +35 -0
  68. package/src/forge/agent-memory/types.ts +204 -0
  69. package/src/forge/bench.ts +248 -0
  70. package/src/forge/brownfield-import/index.ts +801 -0
  71. package/src/forge/brownfield-import/types.ts +127 -0
  72. package/src/forge/cair/action-journal.ts +61 -0
  73. package/src/forge/cair/action-parser.ts +314 -0
  74. package/src/forge/cair/action-validator.ts +40 -0
  75. package/src/forge/cair/actions.ts +1818 -0
  76. package/src/forge/cair/format.ts +77 -0
  77. package/src/forge/cair/index.ts +106 -0
  78. package/src/forge/cair/query.ts +478 -0
  79. package/src/forge/cair/snapshot.ts +315 -0
  80. package/src/forge/cair/types.ts +248 -0
  81. package/src/forge/cli/ai.ts +339 -21
  82. package/src/forge/cli/auth.ts +348 -10
  83. package/src/forge/cli/authmd.ts +441 -0
  84. package/src/forge/cli/baseline.ts +112 -0
  85. package/src/forge/cli/build.ts +20 -4
  86. package/src/forge/cli/changed.ts +437 -0
  87. package/src/forge/cli/codex-app-server.ts +877 -0
  88. package/src/forge/cli/commands.ts +1620 -20
  89. package/src/forge/cli/db.ts +209 -2
  90. package/src/forge/cli/deploy.ts +887 -0
  91. package/src/forge/cli/deps.ts +82 -13
  92. package/src/forge/cli/dev.ts +961 -46
  93. package/src/forge/cli/docs.ts +265 -0
  94. package/src/forge/cli/doctor.ts +297 -0
  95. package/src/forge/cli/field-test.ts +329 -0
  96. package/src/forge/cli/handoff.ts +336 -0
  97. package/src/forge/cli/index.ts +1 -0
  98. package/src/forge/cli/last-run.ts +84 -0
  99. package/src/forge/cli/main.ts +107 -3
  100. package/src/forge/cli/new.ts +152 -13
  101. package/src/forge/cli/next-actions.ts +23 -0
  102. package/src/forge/cli/output.ts +389 -6
  103. package/src/forge/cli/parse.ts +1050 -34
  104. package/src/forge/cli/progress.ts +51 -0
  105. package/src/forge/cli/query.ts +32 -0
  106. package/src/forge/cli/release.ts +35 -11
  107. package/src/forge/cli/rls.ts +43 -4
  108. package/src/forge/cli/run.ts +41 -0
  109. package/src/forge/cli/security.ts +112 -0
  110. package/src/forge/cli/self-host.ts +56 -14
  111. package/src/forge/cli/studio.ts +2218 -0
  112. package/src/forge/cli/verify.ts +1455 -32
  113. package/src/forge/cli/windows.ts +23 -0
  114. package/src/forge/cli/workos.ts +1020 -0
  115. package/src/forge/compiler/agent-contract/build.ts +670 -64
  116. package/src/forge/compiler/agent-contract/types.ts +45 -2
  117. package/src/forge/compiler/ai-registry/parse.ts +71 -2
  118. package/src/forge/compiler/api-surface/build.ts +47 -0
  119. package/src/forge/compiler/app-graph/build.ts +112 -9
  120. package/src/forge/compiler/app-graph/extract.ts +107 -0
  121. package/src/forge/compiler/app-graph/module-graph.ts +73 -78
  122. package/src/forge/compiler/app-graph/parser.ts +24 -24
  123. package/src/forge/compiler/app-graph/profile.ts +26 -0
  124. package/src/forge/compiler/app-graph/versions.ts +1 -1
  125. package/src/forge/compiler/classifier/capabilities.ts +3 -2
  126. package/src/forge/compiler/classifier/classify.ts +32 -8
  127. package/src/forge/compiler/classifier/secrets.ts +3 -2
  128. package/src/forge/compiler/classifier/signals.ts +91 -1
  129. package/src/forge/compiler/client-sdk/build-manifest.ts +59 -0
  130. package/src/forge/compiler/client-sdk/render-client.ts +295 -13
  131. package/src/forge/compiler/data-graph/parse.ts +20 -4
  132. package/src/forge/compiler/data-graph/sql/ddl.ts +144 -31
  133. package/src/forge/compiler/data-graph/sql/serialize.ts +4 -0
  134. package/src/forge/compiler/data-graph/sql/types.ts +1 -0
  135. package/src/forge/compiler/diagnostics/codes.ts +30 -0
  136. package/src/forge/compiler/diagnostics/create.ts +21 -2
  137. package/src/forge/compiler/diagnostics/index.ts +2 -0
  138. package/src/forge/compiler/emitter/barrel.ts +3 -0
  139. package/src/forge/compiler/emitter/render.ts +9 -0
  140. package/src/forge/compiler/external-manifest/registry.ts +205 -0
  141. package/src/forge/compiler/external-manifest/types.ts +91 -0
  142. package/src/forge/compiler/external-manifest/validate.ts +373 -0
  143. package/src/forge/compiler/frontend-graph/build.ts +142 -14
  144. package/src/forge/compiler/integration/add.ts +618 -24
  145. package/src/forge/compiler/integration/plan.ts +43 -12
  146. package/src/forge/compiler/integration/render.ts +29 -0
  147. package/src/forge/compiler/integration/snapshot.ts +2 -0
  148. package/src/forge/compiler/integration/templates/convex.ts +70 -0
  149. package/src/forge/compiler/integration/templates/index.ts +1 -0
  150. package/src/forge/compiler/integration/templates/render.ts +38 -0
  151. package/src/forge/compiler/integration/templates/types.ts +3 -0
  152. package/src/forge/compiler/integration/templates/workos.ts +1219 -0
  153. package/src/forge/compiler/make-registry/build.ts +8 -9
  154. package/src/forge/compiler/orchestrator/fast-check.ts +4 -0
  155. package/src/forge/compiler/orchestrator/generate-lock.ts +14 -3
  156. package/src/forge/compiler/orchestrator/manifest.ts +1 -1
  157. package/src/forge/compiler/orchestrator/plan-profile.ts +23 -0
  158. package/src/forge/compiler/orchestrator/plan.ts +247 -10
  159. package/src/forge/compiler/orchestrator/profile.ts +65 -0
  160. package/src/forge/compiler/orchestrator/run.ts +97 -31
  161. package/src/forge/compiler/orchestrator/serialize.ts +33 -8
  162. package/src/forge/compiler/orchestrator/types.ts +1 -1
  163. package/src/forge/compiler/package-graph/compiler.ts +3 -1
  164. package/src/forge/compiler/package-graph/constants.ts +1 -1
  165. package/src/forge/compiler/package-manager/adapter.ts +4 -1
  166. package/src/forge/compiler/package-manager/commands.ts +4 -0
  167. package/src/forge/compiler/package-manager/executor.ts +30 -1
  168. package/src/forge/compiler/package-upgrades/planner.ts +155 -18
  169. package/src/forge/compiler/package-upgrades/types.ts +2 -0
  170. package/src/forge/compiler/policy-registry/build.ts +47 -2
  171. package/src/forge/compiler/policy-registry/parse.ts +32 -2
  172. package/src/forge/compiler/recipes/definitions.ts +63 -0
  173. package/src/forge/compiler/recipes/index.ts +2 -0
  174. package/src/forge/compiler/recipes/registry.ts +6 -0
  175. package/src/forge/compiler/test-graph/build.ts +11 -3
  176. package/src/forge/compiler/types/app-graph.ts +8 -2
  177. package/src/forge/compiler/types/cli.ts +75 -1
  178. package/src/forge/compiler/types/dev-manifest.ts +4 -0
  179. package/src/forge/compiler/types/emit.ts +2 -0
  180. package/src/forge/compiler/types/frontend-graph.ts +2 -2
  181. package/src/forge/compiler/types/integration.ts +1 -0
  182. package/src/forge/compiler/types/package-graph.ts +6 -0
  183. package/src/forge/compiler/types/policy-registry.ts +3 -1
  184. package/src/forge/delta/classifier.ts +52 -0
  185. package/src/forge/delta/explain.ts +238 -0
  186. package/src/forge/delta/git-observer.ts +43 -0
  187. package/src/forge/delta/ids.ts +44 -0
  188. package/src/forge/delta/index.ts +25 -0
  189. package/src/forge/delta/recorder.ts +540 -0
  190. package/src/forge/delta/redaction.ts +50 -0
  191. package/src/forge/delta/schema.ts +240 -0
  192. package/src/forge/delta/session.ts +142 -0
  193. package/src/forge/delta/status.ts +1202 -0
  194. package/src/forge/delta/store.ts +3284 -0
  195. package/src/forge/delta/timeline.ts +178 -0
  196. package/src/forge/dev/server.ts +808 -17
  197. package/src/forge/dev/types.ts +15 -1
  198. package/src/forge/dev/watch.ts +17 -7
  199. package/src/forge/dev-console/cycle.ts +280 -33
  200. package/src/forge/dev-console/types.ts +47 -1
  201. package/src/forge/impact/index.ts +204 -9
  202. package/src/forge/impact/types.ts +33 -1
  203. package/src/forge/intent/index.ts +35 -16
  204. package/src/forge/make/fields.ts +26 -0
  205. package/src/forge/make/index.ts +40 -6
  206. package/src/forge/make/templates.ts +155 -2
  207. package/src/forge/make/types.ts +2 -1
  208. package/src/forge/policy.ts +1 -1
  209. package/src/forge/react/index.ts +160 -2
  210. package/src/forge/refactor/index.ts +1 -0
  211. package/src/forge/repair/rules/index.ts +2 -2
  212. package/src/forge/review/index.ts +158 -12
  213. package/src/forge/review/types.ts +15 -0
  214. package/src/forge/runtime/auth/config.ts +17 -0
  215. package/src/forge/runtime/auth/evaluate.ts +15 -2
  216. package/src/forge/runtime/auth/resolve.ts +61 -6
  217. package/src/forge/runtime/auth/types.ts +1 -0
  218. package/src/forge/runtime/db/factory.ts +1 -3
  219. package/src/forge/runtime/db/generated-client.ts +13 -2
  220. package/src/forge/runtime/db/memory-adapter.ts +139 -32
  221. package/src/forge/runtime/db/pglite-adapter.ts +263 -2
  222. package/src/forge/runtime/db/postgres-adapter.ts +6 -3
  223. package/src/forge/runtime/executor.ts +129 -16
  224. package/src/forge/runtime/external/bridge.ts +649 -0
  225. package/src/forge/runtime/runner/run-entry.ts +16 -7
  226. package/src/forge/runtime/telemetry/buffer.ts +4 -1
  227. package/src/forge/runtime/telemetry/scrubber.ts +35 -5
  228. package/src/forge/runtime/webhooks/security.ts +12 -7
  229. package/src/forge/server.ts +17 -3
  230. package/src/forge/ui/index.ts +209 -0
  231. package/src/forge/ui/types.ts +1 -0
  232. package/src/forge/version.ts +1 -1
  233. package/src/forge/vue/index.ts +422 -0
  234. package/src/forge/workspace/baseline.ts +112 -0
  235. package/src/forge/workspace/change-summary.ts +250 -0
  236. package/src/forge/workspace/forge-cli.ts +42 -0
  237. package/src/forge/workspace/git-summary.ts +391 -0
  238. package/templates/agent-workroom/AGENTS.md +29 -0
  239. package/templates/agent-workroom/README.md +34 -0
  240. package/templates/agent-workroom/forge.config.ts +3 -0
  241. package/templates/agent-workroom/package.json +33 -0
  242. package/templates/agent-workroom/src/actions/indexAgentSignal.ts +10 -0
  243. package/templates/agent-workroom/src/commands/openWorkroom.ts +61 -0
  244. package/templates/agent-workroom/src/commands/recordAgentSignal.ts +119 -0
  245. package/templates/agent-workroom/src/commands/recordCheckRun.ts +52 -0
  246. package/templates/agent-workroom/src/forge/schema.ts +54 -0
  247. package/templates/agent-workroom/src/policies.ts +6 -0
  248. package/templates/agent-workroom/src/queries/listWorkrooms.ts +11 -0
  249. package/templates/agent-workroom/src/queries/liveWorkroom.ts +63 -0
  250. package/templates/agent-workroom/tsconfig.json +16 -0
  251. package/templates/agent-workroom/web/index.html +12 -0
  252. package/templates/agent-workroom/web/package.json +21 -0
  253. package/templates/agent-workroom/web/src/App.tsx +345 -0
  254. package/templates/agent-workroom/web/src/lib/forge.ts +13 -0
  255. package/templates/agent-workroom/web/src/main.tsx +13 -0
  256. package/templates/agent-workroom/web/src/styles.css +545 -0
  257. package/templates/agent-workroom/web/tsconfig.json +27 -0
  258. package/templates/b2b-support-web/package.json +1 -0
  259. package/templates/b2b-support-web/web/package.json +1 -1
  260. package/templates/minimal-web/package.json +1 -1
  261. package/templates/minimal-web/web/package.json +2 -2
  262. package/templates/nuxt-web/.vscode/settings.json +14 -0
  263. package/templates/nuxt-web/README.md +30 -0
  264. package/templates/nuxt-web/forge.config.ts +3 -0
  265. package/templates/nuxt-web/package.json +33 -0
  266. package/templates/nuxt-web/src/actions/logNoteCreated.ts +11 -0
  267. package/templates/nuxt-web/src/commands/createNote.ts +26 -0
  268. package/templates/nuxt-web/src/forge/schema.ts +12 -0
  269. package/templates/nuxt-web/src/policies.ts +6 -0
  270. package/templates/nuxt-web/src/queries/listNotes.ts +8 -0
  271. package/templates/nuxt-web/src/queries/liveNotes.ts +8 -0
  272. package/templates/nuxt-web/tsconfig.json +17 -0
  273. package/templates/nuxt-web/web/app.vue +67 -0
  274. package/templates/nuxt-web/web/components/LiveNotes.vue +89 -0
  275. package/templates/nuxt-web/web/components/NoteComposer.vue +100 -0
  276. package/templates/nuxt-web/web/composables/forge.ts +13 -0
  277. package/templates/nuxt-web/web/composables/useNotes.ts +24 -0
  278. package/templates/nuxt-web/web/nuxt.config.ts +11 -0
  279. package/templates/nuxt-web/web/package.json +18 -0
  280. package/templates/nuxt-web/web/plugins/forge.client.ts +10 -0
  281. package/templates/nuxt-web/web/plugins/forge.server.ts +10 -0
  282. package/templates/nuxt-web/web/server/api/forge-health.get.ts +7 -0
  283. package/templates/nuxt-web/web/tsconfig.json +6 -0
  284. package/src/forge/_generated/actionSubscriptions.json +0 -2
  285. package/src/forge/_generated/actionSubscriptions.ts +0 -10
  286. package/src/forge/_generated/agentAdapterManifest.json +0 -2
  287. package/src/forge/_generated/agentAdapterManifest.ts +0 -73
  288. package/src/forge/_generated/agentContract.json +0 -2
  289. package/src/forge/_generated/agentContract.ts +0 -7829
  290. package/src/forge/_generated/agentQuickstart.md +0 -34
  291. package/src/forge/_generated/agentTools.json +0 -2
  292. package/src/forge/_generated/agentTools.md +0 -16
  293. package/src/forge/_generated/agentTools.ts +0 -12
  294. package/src/forge/_generated/aiContext.ts +0 -125
  295. package/src/forge/_generated/aiModels.json +0 -2
  296. package/src/forge/_generated/aiModels.ts +0 -51
  297. package/src/forge/_generated/aiProviders.json +0 -2
  298. package/src/forge/_generated/aiProviders.ts +0 -23
  299. package/src/forge/_generated/aiRegistry.json +0 -2
  300. package/src/forge/_generated/aiRegistry.ts +0 -31
  301. package/src/forge/_generated/api.json +0 -2
  302. package/src/forge/_generated/api.ts +0 -8
  303. package/src/forge/_generated/appGraph.json +0 -2
  304. package/src/forge/_generated/appGraph.ts +0 -14919
  305. package/src/forge/_generated/appMap.md +0 -55
  306. package/src/forge/_generated/artifactManifest.json +0 -2
  307. package/src/forge/_generated/artifactManifest.ts +0 -7
  308. package/src/forge/_generated/authClaims.json +0 -2
  309. package/src/forge/_generated/authClaims.ts +0 -13
  310. package/src/forge/_generated/authConfig.json +0 -2
  311. package/src/forge/_generated/authConfig.ts +0 -17
  312. package/src/forge/_generated/authContext.ts +0 -23
  313. package/src/forge/_generated/authRegistry.json +0 -2
  314. package/src/forge/_generated/authRegistry.ts +0 -25
  315. package/src/forge/_generated/buildInfo.json +0 -2
  316. package/src/forge/_generated/buildInfo.ts +0 -9
  317. package/src/forge/_generated/capabilityMap.json +0 -2
  318. package/src/forge/_generated/capabilityMap.md +0 -15
  319. package/src/forge/_generated/capabilityMap.ts +0 -17
  320. package/src/forge/_generated/client.ts +0 -282
  321. package/src/forge/_generated/clientApi.ts +0 -9
  322. package/src/forge/_generated/clientManifest.json +0 -2
  323. package/src/forge/_generated/clientManifest.ts +0 -39
  324. package/src/forge/_generated/clientTypes.ts +0 -78
  325. package/src/forge/_generated/configRegistry.json +0 -2
  326. package/src/forge/_generated/configRegistry.ts +0 -4
  327. package/src/forge/_generated/dataGraph.json +0 -2
  328. package/src/forge/_generated/dataGraph.ts +0 -8
  329. package/src/forge/_generated/db.json +0 -2
  330. package/src/forge/_generated/db.ts +0 -2
  331. package/src/forge/_generated/dbSecurityManifest.json +0 -2
  332. package/src/forge/_generated/dbSecurityManifest.ts +0 -15
  333. package/src/forge/_generated/dbSessionContext.json +0 -2
  334. package/src/forge/_generated/dbSessionContext.ts +0 -39
  335. package/src/forge/_generated/deployManifest.json +0 -2
  336. package/src/forge/_generated/deployManifest.ts +0 -14
  337. package/src/forge/_generated/devManifest.json +0 -2
  338. package/src/forge/_generated/devManifest.ts +0 -62
  339. package/src/forge/_generated/envSchema.json +0 -2
  340. package/src/forge/_generated/envSchema.ts +0 -59
  341. package/src/forge/_generated/frontendGraph.json +0 -2
  342. package/src/forge/_generated/frontendGraph.ts +0 -27
  343. package/src/forge/_generated/importGuards.json +0 -2
  344. package/src/forge/_generated/importGuards.ts +0 -686
  345. package/src/forge/_generated/index.ts +0 -68
  346. package/src/forge/_generated/liveProductionManifest.json +0 -2
  347. package/src/forge/_generated/liveProductionManifest.ts +0 -23
  348. package/src/forge/_generated/liveProtocol.json +0 -2
  349. package/src/forge/_generated/liveProtocol.ts +0 -21
  350. package/src/forge/_generated/liveQueryRegistry.json +0 -2
  351. package/src/forge/_generated/liveQueryRegistry.ts +0 -9
  352. package/src/forge/_generated/liveTransportConfig.json +0 -2
  353. package/src/forge/_generated/liveTransportConfig.ts +0 -19
  354. package/src/forge/_generated/makeRegistry.json +0 -2
  355. package/src/forge/_generated/makeRegistry.ts +0 -177
  356. package/src/forge/_generated/makeTemplates.json +0 -2
  357. package/src/forge/_generated/makeTemplates.ts +0 -66
  358. package/src/forge/_generated/mockMap.json +0 -2
  359. package/src/forge/_generated/mockMap.ts +0 -7
  360. package/src/forge/_generated/operationPlaybooks.md +0 -167
  361. package/src/forge/_generated/packageGraph.json +0 -2
  362. package/src/forge/_generated/packageGraph.ts +0 -249334
  363. package/src/forge/_generated/packageUpgradeRegistry.json +0 -2
  364. package/src/forge/_generated/packageUpgradeRegistry.ts +0 -15
  365. package/src/forge/_generated/permissionMatrix.json +0 -2
  366. package/src/forge/_generated/permissionMatrix.ts +0 -7
  367. package/src/forge/_generated/policyRegistry.json +0 -2
  368. package/src/forge/_generated/policyRegistry.ts +0 -11
  369. package/src/forge/_generated/queryRegistry.json +0 -2
  370. package/src/forge/_generated/queryRegistry.ts +0 -9
  371. package/src/forge/_generated/react.d.ts +0 -22
  372. package/src/forge/_generated/react.ts +0 -29
  373. package/src/forge/_generated/reactManifest.json +0 -2
  374. package/src/forge/_generated/reactManifest.ts +0 -19
  375. package/src/forge/_generated/rlsPolicies.json +0 -2
  376. package/src/forge/_generated/rlsPolicies.sql +0 -34
  377. package/src/forge/_generated/rlsPolicies.ts +0 -6
  378. package/src/forge/_generated/runtimeGraph.json +0 -2
  379. package/src/forge/_generated/runtimeGraph.ts +0 -8
  380. package/src/forge/_generated/runtimeMatrix.json +0 -2
  381. package/src/forge/_generated/runtimeMatrix.ts +0 -334130
  382. package/src/forge/_generated/runtimeRegistry.ts +0 -2
  383. package/src/forge/_generated/runtimeRules.md +0 -91
  384. package/src/forge/_generated/secretRegistry.json +0 -2
  385. package/src/forge/_generated/secretRegistry.ts +0 -50
  386. package/src/forge/_generated/secretsContext.ts +0 -11
  387. package/src/forge/_generated/serverApi.ts +0 -10
  388. package/src/forge/_generated/sourceMapManifest.json +0 -2
  389. package/src/forge/_generated/sourceMapManifest.ts +0 -7
  390. package/src/forge/_generated/sqlPlan.json +0 -2
  391. package/src/forge/_generated/sqlPlan.ts +0 -88
  392. package/src/forge/_generated/subscriptionManifest.json +0 -2
  393. package/src/forge/_generated/subscriptionManifest.ts +0 -7
  394. package/src/forge/_generated/symbolicationManifest.json +0 -2
  395. package/src/forge/_generated/symbolicationManifest.ts +0 -17
  396. package/src/forge/_generated/telemetryRegistry.json +0 -2
  397. package/src/forge/_generated/telemetryRegistry.ts +0 -9
  398. package/src/forge/_generated/telemetrySinks.json +0 -2
  399. package/src/forge/_generated/telemetrySinks.ts +0 -11
  400. package/src/forge/_generated/tenantScope.json +0 -2
  401. package/src/forge/_generated/tenantScope.ts +0 -8
  402. package/src/forge/_generated/testGraph.json +0 -2
  403. package/src/forge/_generated/testGraph.ts +0 -3430
  404. package/src/forge/_generated/testPlanRegistry.json +0 -2
  405. package/src/forge/_generated/testPlanRegistry.ts +0 -33
  406. package/src/forge/_generated/uiRoutes.json +0 -2
  407. package/src/forge/_generated/uiRoutes.ts +0 -16
  408. package/src/forge/_generated/uiScenarios.json +0 -2
  409. package/src/forge/_generated/uiScenarios.ts +0 -30
  410. package/src/forge/_generated/uiTestManifest.json +0 -2
  411. package/src/forge/_generated/uiTestManifest.ts +0 -27
  412. package/src/forge/_generated/workflowRegistry.json +0 -2
  413. package/src/forge/_generated/workflowRegistry.ts +0 -9
  414. package/src/forge/_generated/workflowSubscriptions.json +0 -2
  415. package/src/forge/_generated/workflowSubscriptions.ts +0 -10
@@ -14,8 +14,14 @@ import type { LiveSubcommand } from "./live.ts";
14
14
  import type { ForgeAiProvider } from "../runtime/ai/types.ts";
15
15
  import type { NewPackageManager, NewTemplateName } from "./new.ts";
16
16
  import type { SelfHostSubcommand } from "./self-host.ts";
17
+ import type { DocsSubcommand } from "./docs.ts";
17
18
  import type { AgentContractSubcommand } from "./agent-contract.ts";
18
19
  import type { AuthSubcommand } from "./auth.ts";
20
+ import type { BaselineSubcommand } from "./baseline.ts";
21
+ import type { AuthMdSubcommand } from "./authmd.ts";
22
+ import type { WorkOSSubcommand } from "./workos.ts";
23
+ import type { DeploySubcommand, DeployTarget } from "./deploy.ts";
24
+ import type { FieldTestSubcommand } from "./field-test.ts";
19
25
  import type { RlsSubcommand } from "./rls.ts";
20
26
  import type { SecuritySubcommand } from "./security.ts";
21
27
  import type { DepsSubcommand } from "./deps.ts";
@@ -47,8 +53,14 @@ import type {
47
53
  UiVideoMode,
48
54
  } from "../ui/types.ts";
49
55
  import type { ForgeDoOptions } from "../intent/types.ts";
56
+ import type { BenchCommandOptions, BenchSubcommand } from "../bench.ts";
57
+ import type { BrownfieldImportCommandOptions } from "../brownfield-import/types.ts";
58
+ import type { CairCommandOptions, CairSubcommand } from "../cair/types.ts";
50
59
 
51
60
  export type ForgeCommand =
61
+ | { kind: "version"; json: boolean }
62
+ | { kind: "last"; json: boolean; workspaceRoot: string }
63
+ | { kind: "baseline"; subcommand: BaselineSubcommand; json: boolean; reason?: string; workspaceRoot: string }
52
64
  | {
53
65
  kind: "new";
54
66
  name: string;
@@ -58,6 +70,8 @@ export type ForgeCommand =
58
70
  git: boolean;
59
71
  forgePackageSpec?: string;
60
72
  localForge: boolean;
73
+ json: boolean;
74
+ fieldTest: boolean;
61
75
  workspaceRoot: string;
62
76
  }
63
77
  | { kind: "build"; json: boolean; workspaceRoot: string }
@@ -90,6 +104,15 @@ export type ForgeCommand =
90
104
  postgresVersion: string;
91
105
  runtimePort: number;
92
106
  webPort: number;
107
+ preparedOnly?: boolean;
108
+ workspaceRoot: string;
109
+ }
110
+ | {
111
+ kind: "docs";
112
+ subcommand: DocsSubcommand;
113
+ json: boolean;
114
+ build: boolean;
115
+ installVenv: boolean;
93
116
  workspaceRoot: string;
94
117
  }
95
118
  | {
@@ -98,7 +121,7 @@ export type ForgeCommand =
98
121
  json: boolean;
99
122
  workspaceRoot: string;
100
123
  }
101
- | { kind: "doctor"; target?: "project" | "windows"; json: boolean; workspaceRoot: string }
124
+ | { kind: "doctor"; target?: "project" | "windows" | "agent" | "delta" | "pglite" | "runtime"; agentTarget?: AgentAdapterTarget; json: boolean; workspaceRoot: string }
102
125
  | { kind: "setup"; target: "windows"; json: boolean; yes: boolean; workspaceRoot: string }
103
126
  | {
104
127
  kind: "security";
@@ -106,6 +129,7 @@ export type ForgeCommand =
106
129
  db: DbAdapterKind;
107
130
  databaseUrl?: string;
108
131
  json: boolean;
132
+ runTests: boolean;
109
133
  workspaceRoot: string;
110
134
  }
111
135
  | {
@@ -113,6 +137,53 @@ export type ForgeCommand =
113
137
  subcommand: AuthSubcommand;
114
138
  json: boolean;
115
139
  token?: string;
140
+ prod?: boolean;
141
+ scenario?: string;
142
+ workspaceRoot: string;
143
+ }
144
+ | {
145
+ kind: "authmd";
146
+ subcommand: AuthMdSubcommand;
147
+ json: boolean;
148
+ output?: string;
149
+ workspaceRoot: string;
150
+ }
151
+ | {
152
+ kind: "workos";
153
+ subcommand: WorkOSSubcommand;
154
+ json: boolean;
155
+ file?: string;
156
+ yes: boolean;
157
+ dryRun: boolean;
158
+ real?: boolean;
159
+ workspaceRoot: string;
160
+ }
161
+ | {
162
+ kind: "deploy";
163
+ subcommand: DeploySubcommand;
164
+ target: DeployTarget;
165
+ production: boolean;
166
+ url?: string;
167
+ json: boolean;
168
+ workspaceRoot: string;
169
+ }
170
+ | {
171
+ kind: "field-test";
172
+ subcommand: FieldTestSubcommand;
173
+ name?: string;
174
+ template: NewTemplateName;
175
+ templates?: NewTemplateName[];
176
+ packageManager: NewPackageManager;
177
+ packageManagers?: NewPackageManager[];
178
+ forgeSpec?: string;
179
+ auth?: "none" | "workos";
180
+ dryRun: boolean;
181
+ keep: boolean;
182
+ runtimeProbes: boolean;
183
+ authProbes: boolean;
184
+ timeoutMs: number;
185
+ writeReport?: string;
186
+ json: boolean;
116
187
  workspaceRoot: string;
117
188
  }
118
189
  | {
@@ -150,6 +221,7 @@ export type ForgeCommand =
150
221
  json: boolean;
151
222
  allowDirty: boolean;
152
223
  allowPublicSourcemaps: boolean;
224
+ allowMissingLocalRelease?: boolean;
153
225
  workspaceRoot: string;
154
226
  }
155
227
  | { kind: "make"; options: MakeCommandOptions }
@@ -159,12 +231,71 @@ export type ForgeCommand =
159
231
  | { kind: "test"; options: TestCommandOptions }
160
232
  | { kind: "repair"; options: RepairCommandOptions }
161
233
  | { kind: "do"; options: ForgeDoOptions }
234
+ | { kind: "bench"; options: BenchCommandOptions }
235
+ | { kind: "cair"; options: CairCommandOptions }
162
236
  | { kind: "agent"; options: AgentCommandOptions }
237
+ | { kind: "mcp"; subcommand: "serve"; workspaceRoot: string }
163
238
  | { kind: "review"; options: ReviewCommandOptions }
164
239
  | { kind: "ui"; options: UiCommandOptions }
165
- | { kind: "generate"; check: boolean; dryRun: boolean; json: boolean; concurrency: number }
240
+ | { kind: "manifest"; subcommand: "validate" | "import"; path: string; json: boolean; workspaceRoot: string }
241
+ | { kind: "import"; options: BrownfieldImportCommandOptions }
242
+ | {
243
+ kind: "delta";
244
+ subcommand: "status" | "repair" | "compact" | "prune" | "export";
245
+ json: boolean;
246
+ workspaceRoot: string;
247
+ dryRun: boolean;
248
+ yes: boolean;
249
+ verbose: boolean;
250
+ olderThan?: string;
251
+ output?: string;
252
+ limit?: number;
253
+ redacted: boolean;
254
+ }
255
+ | { kind: "status"; json: boolean; workspaceRoot: string }
256
+ | { kind: "changed"; json: boolean; authoredOnly: boolean; reviewOnly: boolean; commitReady: boolean; workspaceRoot: string }
257
+ | { kind: "diff"; target: "authored" | "generated" | "full"; json: boolean; workspaceRoot: string }
258
+ | { kind: "handoff"; json: boolean; commitReady: boolean; workspaceRoot: string }
259
+ | {
260
+ kind: "studio";
261
+ subcommand: "attach" | "snapshot" | "watch" | "open" | "doctor" | "bridge" | "codex-server";
262
+ path?: string;
263
+ previewUrl?: string;
264
+ previewPort?: number;
265
+ studioUrl?: string;
266
+ intervalMs?: number;
267
+ once: boolean;
268
+ workspaceId?: string;
269
+ tenantId?: string;
270
+ userId?: string;
271
+ role?: string;
272
+ targets: string[];
273
+ install?: boolean;
274
+ start?: boolean;
275
+ bridge?: boolean;
276
+ writeSchemas?: boolean;
277
+ probeAppServer?: boolean;
278
+ json: boolean;
279
+ dryRun: boolean;
280
+ force: boolean;
281
+ workspaceRoot: string;
282
+ }
283
+ | { kind: "timeline"; target?: string; kindFilter?: string; sessionId?: string; limit?: number; json: boolean; rebuild: boolean; forAgent: boolean; causal: boolean; staleProofs: boolean; workspaceRoot: string }
284
+ | { kind: "explain"; thing: string; json: boolean; workspaceRoot: string }
285
+ | {
286
+ kind: "session";
287
+ subcommand: "list" | "show" | "rename" | "merge" | "split" | "detach";
288
+ sessionId?: string;
289
+ sourceSessionId?: string;
290
+ operationId?: string;
291
+ title?: string;
292
+ limit?: number;
293
+ json: boolean;
294
+ workspaceRoot: string;
295
+ }
296
+ | { kind: "generate"; check: boolean; dryRun: boolean; json: boolean; concurrency: number; workspaceRoot: string }
166
297
  | { kind: "add"; alias: string; options: AddOptions & { workspaceRoot: string } }
167
- | { kind: "inspect"; target: InspectTarget; json: boolean; dryRun: boolean }
298
+ | { kind: "inspect"; target: InspectTarget; json: boolean; dryRun: boolean; full: boolean; brief: boolean; ergonomics: boolean; workspaceRoot: string }
168
299
  | { kind: "check"; json: boolean; dryRun: boolean; strictSecrets: boolean }
169
300
  | { kind: "verify"; options: VerifyOptions }
170
301
  | { kind: "run"; name?: string; list: boolean; json: boolean; mock: boolean; userId?: string; tenantId?: string; role?: string; envFile?: string; workspaceRoot: string; queryMode?: boolean; args?: unknown }
@@ -177,7 +308,7 @@ export type ForgeCommand =
177
308
  once: boolean;
178
309
  watch: boolean;
179
310
  json: boolean;
180
- db: "pglite" | "postgres" | "none";
311
+ db: "memory" | "pglite" | "postgres" | "none";
181
312
  databaseUrl?: string;
182
313
  worker: boolean;
183
314
  withWeb: boolean;
@@ -187,6 +318,9 @@ export type ForgeCommand =
187
318
  webPort?: number;
188
319
  telemetry: string[];
189
320
  envFile?: string;
321
+ skipStartupConsole: boolean;
322
+ detach: boolean;
323
+ lifecycle?: "status" | "stop";
190
324
  workspaceRoot: string;
191
325
  }
192
326
  | {
@@ -194,6 +328,7 @@ export type ForgeCommand =
194
328
  subcommand: DbSubcommand;
195
329
  db: DbAdapterKind;
196
330
  databaseUrl?: string;
331
+ local?: boolean;
197
332
  json: boolean;
198
333
  workspaceRoot: string;
199
334
  }
@@ -293,6 +428,8 @@ export type ForgeCommand =
293
428
  model?: string;
294
429
  prompt?: string;
295
430
  mock: boolean;
431
+ modelLevel: boolean;
432
+ live: boolean;
296
433
  traceId?: string;
297
434
  db?: DbAdapterKind;
298
435
  databaseUrl?: string;
@@ -306,19 +443,28 @@ export interface ParsedCli {
306
443
  }
307
444
 
308
445
  export const TOP_LEVEL_COMMANDS = [
446
+ "version",
447
+ "last",
448
+ "baseline",
309
449
  "new",
310
450
  "build",
311
451
  "serve",
312
452
  "worker",
313
453
  "self-host",
454
+ "docs",
314
455
  "agent-contract",
315
456
  "agent",
457
+ "mcp",
316
458
  "review",
317
459
  "ui",
318
460
  "doctor",
319
461
  "setup",
320
462
  "security",
321
463
  "auth",
464
+ "authmd",
465
+ "workos",
466
+ "deploy",
467
+ "field-test",
322
468
  "rls",
323
469
  "deps",
324
470
  "release",
@@ -329,6 +475,19 @@ export const TOP_LEVEL_COMMANDS = [
329
475
  "test",
330
476
  "repair",
331
477
  "do",
478
+ "bench",
479
+ "cair",
480
+ "delta",
481
+ "session",
482
+ "timeline",
483
+ "explain",
484
+ "manifest",
485
+ "import",
486
+ "status",
487
+ "changed",
488
+ "diff",
489
+ "handoff",
490
+ "studio",
332
491
  "generate",
333
492
  "add",
334
493
  "inspect",
@@ -365,6 +524,7 @@ export const INSPECT_TARGETS: InspectTarget[] = [
365
524
  "ai",
366
525
  "queries",
367
526
  "api",
527
+ "external",
368
528
  "client",
369
529
  "frontend",
370
530
  "auth",
@@ -383,7 +543,12 @@ export const INSPECT_TARGETS: InspectTarget[] = [
383
543
  "agent-tools",
384
544
  "agent-adapters",
385
545
  "capability-map",
546
+ "summary",
547
+ "schema",
548
+ "drift",
549
+ "handoff",
386
550
  "framework",
551
+ "imported",
387
552
  "ui",
388
553
  "ui-scenarios",
389
554
  "ui-routes",
@@ -392,7 +557,7 @@ export const INSPECT_TARGETS: InspectTarget[] = [
392
557
  "map",
393
558
  ];
394
559
 
395
- const NEW_TEMPLATES: NewTemplateName[] = ["b2b-support-web", "minimal-web"];
560
+ const NEW_TEMPLATES: NewTemplateName[] = ["agent-workroom", "b2b-support-web", "minimal-web", "nuxt-web"];
396
561
  const NEW_PACKAGE_MANAGERS: NewPackageManager[] = ["bun", "npm", "pnpm", "yarn"];
397
562
  const SELF_HOST_SUBCOMMANDS: SelfHostSubcommand[] = ["compose", "env", "check", "clean"];
398
563
  const AGENT_CONTRACT_SUBCOMMANDS: AgentContractSubcommand[] = [
@@ -407,7 +572,13 @@ const AUTH_SUBCOMMANDS: AuthSubcommand[] = [
407
572
  "test-token",
408
573
  "jwks",
409
574
  "prove",
575
+ "status",
410
576
  ];
577
+ const BASELINE_SUBCOMMANDS: BaselineSubcommand[] = ["create", "status"];
578
+ const AUTHMD_SUBCOMMANDS: AuthMdSubcommand[] = ["generate", "check"];
579
+ const WORKOS_SUBCOMMANDS: WorkOSSubcommand[] = ["install", "doctor", "seed", "setup"];
580
+ const DEPLOY_SUBCOMMANDS: DeploySubcommand[] = ["plan", "check", "render", "verify"];
581
+ const FIELD_TEST_SUBCOMMANDS: FieldTestSubcommand[] = ["create", "run", "report"];
411
582
  const SECURITY_SUBCOMMANDS: SecuritySubcommand[] = ["prove"];
412
583
  const RLS_SUBCOMMANDS: RlsSubcommand[] = ["generate", "check", "apply", "test", "mutate-test"];
413
584
  const DEPS_SUBCOMMANDS: DepsSubcommand[] = [
@@ -484,7 +655,7 @@ const RENAME_TARGETS: RenameTarget[] = [
484
655
  "workflow",
485
656
  "event",
486
657
  ];
487
- const TEST_SUBCOMMANDS: TestSubcommand[] = ["plan", "run", "explain"];
658
+ const TEST_SUBCOMMANDS: TestSubcommand[] = ["plan", "run", "explain", "authz"];
488
659
  const TEST_COSTS: TestCost[] = ["instant", "fast", "standard", "slow", "docker", "browser"];
489
660
  const REPAIR_SUBCOMMANDS: RepairSubcommand[] = [
490
661
  "diagnose",
@@ -501,10 +672,18 @@ const AGENT_SUBCOMMANDS: AgentSubcommand[] = [
501
672
  "export",
502
673
  "check",
503
674
  "doctor",
675
+ "onboard",
504
676
  "print-context",
505
677
  "clean",
678
+ "prepare",
679
+ "hooks",
680
+ "install",
681
+ "ingest",
682
+ "context",
683
+ "memory",
684
+ "timeline",
506
685
  ];
507
- const REVIEW_SUBCOMMANDS: ReviewSubcommand[] = ["inspect", "list", "explain"];
686
+ const REVIEW_SUBCOMMANDS: ReviewSubcommand[] = ["run", "inspect", "list", "explain"];
508
687
  const REVIEW_MODES: ReviewMode[] = ["quick", "standard", "strict"];
509
688
  const REVIEW_FAIL_ON: ReviewFailOn[] = ["warning", "error", "blocking"];
510
689
  const REVIEW_CATEGORIES: ReviewFindingCategory[] = [
@@ -522,6 +701,7 @@ const REVIEW_CATEGORIES: ReviewFindingCategory[] = [
522
701
  "agent",
523
702
  ];
524
703
  const UI_SUBCOMMANDS: UiSubcommand[] = [
704
+ "audit",
525
705
  "smoke",
526
706
  "test",
527
707
  "scenario",
@@ -545,6 +725,8 @@ const AI_SUBCOMMANDS: AiSubcommand[] = [
545
725
  "redteam",
546
726
  "trace",
547
727
  ];
728
+ const BENCH_SUBCOMMANDS: BenchSubcommand[] = ["compiler"];
729
+ const CAIR_SUBCOMMANDS: CairSubcommand[] = ["snapshot", "query", "action"];
548
730
 
549
731
  function parseFlag(args: string[], flag: string): boolean {
550
732
  return args.includes(flag);
@@ -569,8 +751,8 @@ function parseOptionValues(args: string[], flag: string): string[] {
569
751
  return values;
570
752
  }
571
753
 
572
- function parseDbKind(value: string | undefined): "pglite" | "postgres" | "none" {
573
- if (value === "postgres" || value === "none") {
754
+ function parseDbKind(value: string | undefined): "memory" | "pglite" | "postgres" | "none" {
755
+ if (value === "memory" || value === "postgres" || value === "none") {
574
756
  return value;
575
757
  }
576
758
  return "pglite";
@@ -597,7 +779,10 @@ function parseSandboxBackend(value: string | undefined): SandboxBackend {
597
779
  function parseAddOptions(
598
780
  args: string[],
599
781
  workspaceRoot: string,
782
+ mode: AddOptions["mode"] = "auto",
600
783
  ): AddOptions & { workspaceRoot: string } {
784
+ const frontend = parseFlag(args, "--frontend");
785
+ const backend = parseFlag(args, "--backend");
601
786
  return {
602
787
  workspaceRoot,
603
788
  json: parseFlag(args, "--json"),
@@ -607,6 +792,9 @@ function parseAddOptions(
607
792
  parseOptionValue(args, "--sandbox-backend"),
608
793
  ),
609
794
  allowScripts: parseFlag(args, "--allow-scripts"),
795
+ mode,
796
+ installWorkspace: parseOptionValue(args, "--workspace"),
797
+ packageTarget: frontend && !backend ? "frontend" : backend ? "backend" : undefined,
610
798
  };
611
799
  }
612
800
 
@@ -658,6 +846,33 @@ function parseNewPackageManager(value: string | undefined): NewPackageManager {
658
846
  : "bun";
659
847
  }
660
848
 
849
+ function parseCommaList(value: string | undefined): string[] {
850
+ return String(value ?? "")
851
+ .split(",")
852
+ .map((item) => item.trim())
853
+ .filter(Boolean);
854
+ }
855
+
856
+ function parseTemplateList(value: string | undefined, errors: string[], optionName: string): NewTemplateName[] | undefined {
857
+ if (!value) return undefined;
858
+ const values = parseCommaList(value);
859
+ const unsupported = values.filter((item) => !NEW_TEMPLATES.includes(item as NewTemplateName));
860
+ if (unsupported.length > 0) {
861
+ errors.push(`${optionName} contains unsupported template(s): ${unsupported.join(", ")}; supported: ${NEW_TEMPLATES.join(", ")}`);
862
+ }
863
+ return values.filter((item) => NEW_TEMPLATES.includes(item as NewTemplateName)) as NewTemplateName[];
864
+ }
865
+
866
+ function parsePackageManagerList(value: string | undefined, errors: string[], optionName: string): NewPackageManager[] | undefined {
867
+ if (!value) return undefined;
868
+ const values = parseCommaList(value);
869
+ const unsupported = values.filter((item) => !NEW_PACKAGE_MANAGERS.includes(item as NewPackageManager));
870
+ if (unsupported.length > 0) {
871
+ errors.push(`${optionName} contains unsupported package manager(s): ${unsupported.join(", ")}; supported: ${NEW_PACKAGE_MANAGERS.join(", ")}`);
872
+ }
873
+ return values.filter((item) => NEW_PACKAGE_MANAGERS.includes(item as NewPackageManager)) as NewPackageManager[];
874
+ }
875
+
661
876
  function parseDoObjective(rest: string[], argv: string[]): string {
662
877
  const [action, name, ...tail] = rest;
663
878
  if (action === "add-resource") {
@@ -686,6 +901,14 @@ export function parseCli(argv: string[]): ParsedCli {
686
901
  const positional = argv.filter((arg) => !arg.startsWith("-"));
687
902
  const workspaceRoot = process.cwd().replace(/\\/g, "/");
688
903
 
904
+ if (parseFlag(argv, "--version") || parseFlag(argv, "-v")) {
905
+ return {
906
+ command: { kind: "version", json: parseFlag(argv, "--json") },
907
+ workspaceRoot,
908
+ errors,
909
+ };
910
+ }
911
+
689
912
  if (positional.length === 0) {
690
913
  errors.push(
691
914
  `missing command; expected ${TOP_LEVEL_COMMANDS.join(", ")}`,
@@ -696,6 +919,36 @@ export function parseCli(argv: string[]): ParsedCli {
696
919
  const [commandName, ...rest] = positional;
697
920
 
698
921
  switch (commandName) {
922
+ case "version":
923
+ return {
924
+ command: { kind: "version", json: parseFlag(argv, "--json") },
925
+ workspaceRoot,
926
+ errors,
927
+ };
928
+ case "last":
929
+ return {
930
+ command: { kind: "last", json: parseFlag(argv, "--json"), workspaceRoot },
931
+ workspaceRoot,
932
+ errors,
933
+ };
934
+ case "baseline": {
935
+ const subcommand = (rest[0] ?? "status") as BaselineSubcommand;
936
+ if (!BASELINE_SUBCOMMANDS.includes(subcommand)) {
937
+ errors.push("forge baseline requires subcommand: create or status");
938
+ return { command: null, workspaceRoot, errors };
939
+ }
940
+ return {
941
+ command: {
942
+ kind: "baseline",
943
+ subcommand,
944
+ reason: parseOptionValue(argv, "--reason"),
945
+ json: parseFlag(argv, "--json"),
946
+ workspaceRoot,
947
+ },
948
+ workspaceRoot,
949
+ errors,
950
+ };
951
+ }
699
952
  case "new": {
700
953
  const name = rest[0];
701
954
  if (!name) {
@@ -725,6 +978,9 @@ export function parseCli(argv: string[]): ParsedCli {
725
978
  if (install && noInstall) {
726
979
  errors.push("use either --install or --no-install, not both");
727
980
  }
981
+ if (parseFlag(argv, "--field-test") && noInstall) {
982
+ errors.push("forge new --field-test requires installation; remove --no-install");
983
+ }
728
984
 
729
985
  return {
730
986
  command: {
@@ -736,6 +992,8 @@ export function parseCli(argv: string[]): ParsedCli {
736
992
  git: !parseFlag(argv, "--no-git"),
737
993
  forgePackageSpec,
738
994
  localForge,
995
+ json: parseFlag(argv, "--json"),
996
+ fieldTest: parseFlag(argv, "--field-test"),
739
997
  workspaceRoot,
740
998
  },
741
999
  workspaceRoot,
@@ -825,6 +1083,26 @@ export function parseCli(argv: string[]): ParsedCli {
825
1083
  postgresVersion: parseOptionValue(argv, "--postgres-version") ?? "16",
826
1084
  runtimePort: Math.floor(runtimePort),
827
1085
  webPort: Math.floor(webPort),
1086
+ preparedOnly: parseFlag(argv, "--prepared-only"),
1087
+ workspaceRoot,
1088
+ },
1089
+ workspaceRoot,
1090
+ errors,
1091
+ };
1092
+ }
1093
+ case "docs": {
1094
+ const subcommand = rest[0] as DocsSubcommand | undefined;
1095
+ if (subcommand !== "check") {
1096
+ errors.push("forge docs requires subcommand: check");
1097
+ return { command: null, workspaceRoot, errors };
1098
+ }
1099
+ return {
1100
+ command: {
1101
+ kind: "docs",
1102
+ subcommand,
1103
+ json: parseFlag(argv, "--json"),
1104
+ build: parseFlag(argv, "--build"),
1105
+ installVenv: parseFlag(argv, "--install-venv"),
828
1106
  workspaceRoot,
829
1107
  },
830
1108
  workspaceRoot,
@@ -851,12 +1129,54 @@ export function parseCli(argv: string[]): ParsedCli {
851
1129
  case "agent": {
852
1130
  const subcommand = rest[0] as AgentSubcommand | undefined;
853
1131
  if (!subcommand || !AGENT_SUBCOMMANDS.includes(subcommand)) {
854
- errors.push("forge agent requires subcommand: list-targets, export, check, doctor, print-context, or clean");
1132
+ errors.push("forge agent requires subcommand: list-targets, export, check, doctor, onboard, print-context, clean, prepare, hooks, install, ingest, context, memory, or timeline");
855
1133
  return { command: null, workspaceRoot, errors };
856
1134
  }
1135
+ const inputRaw = parseOptionValue(argv, "--input");
1136
+ let input: unknown;
1137
+ if (inputRaw !== undefined) {
1138
+ try {
1139
+ input = JSON.parse(inputRaw);
1140
+ } catch {
1141
+ errors.push("--input must be valid JSON");
1142
+ }
1143
+ }
1144
+ const limitRaw = parseOptionValue(argv, "--limit");
1145
+ const limit = limitRaw ? Number(limitRaw) : undefined;
1146
+ const pollIntervalRaw = parseOptionValue(argv, "--poll-interval");
1147
+ const pollIntervalMs = pollIntervalRaw ? Number(pollIntervalRaw) : undefined;
1148
+ if (limitRaw !== undefined && (!Number.isFinite(limit) || limit! < 1)) {
1149
+ errors.push("--limit must be a number >= 1");
1150
+ }
1151
+ if (
1152
+ pollIntervalRaw !== undefined &&
1153
+ (!Number.isFinite(pollIntervalMs) || pollIntervalMs! < 100)
1154
+ ) {
1155
+ errors.push("--poll-interval must be a number >= 100");
1156
+ }
857
1157
  const target =
858
1158
  (parseOptionValue(argv, "--target") as AgentAdapterTarget | undefined) ??
859
- (subcommand === "export" || subcommand === "clean" ? "generic" : "generic");
1159
+ (subcommand === "install" || subcommand === "ingest" ? rest[1] : undefined) ??
1160
+ (subcommand === "hooks" ? rest[2] : undefined) ??
1161
+ (subcommand === "timeline" ? rest[1] : undefined) ??
1162
+ (subcommand === "timeline" ? "all" : undefined) ??
1163
+ (subcommand === "hooks" || subcommand === "onboard" ? "codex" : "generic");
1164
+ const contextOptionValues = new Set(
1165
+ [
1166
+ parseOptionValue(argv, "--entry"),
1167
+ parseOptionValue(argv, "--change"),
1168
+ parseOptionValue(argv, "--proof"),
1169
+ parseOptionValue(argv, "--event"),
1170
+ parseOptionValue(argv, "--input"),
1171
+ parseOptionValue(argv, "--target"),
1172
+ parseOptionValue(argv, "--file"),
1173
+ limitRaw,
1174
+ pollIntervalRaw,
1175
+ ].filter((value): value is string => typeof value === "string"),
1176
+ );
1177
+ const contextEntry = subcommand === "context"
1178
+ ? rest.slice(1).find((part) => !part.startsWith("--") && !contextOptionValues.has(part))
1179
+ : undefined;
860
1180
  return {
861
1181
  command: {
862
1182
  kind: "agent",
@@ -870,12 +1190,40 @@ export function parseCli(argv: string[]): ParsedCli {
870
1190
  preserveUserSections: !parseFlag(argv, "--no-preserve-user-sections"),
871
1191
  skills: !parseFlag(argv, "--no-skills"),
872
1192
  rules: !parseFlag(argv, "--no-rules"),
1193
+ eventName: parseOptionValue(argv, "--event"),
1194
+ hookAction: subcommand === "hooks" ? rest[1] : undefined,
1195
+ input,
1196
+ entry: parseOptionValue(argv, "--entry") ?? contextEntry,
1197
+ change: parseOptionValue(argv, "--change"),
1198
+ proof: parseOptionValue(argv, "--proof"),
1199
+ handoff: parseFlag(argv, "--handoff"),
1200
+ current: parseFlag(argv, "--current"),
1201
+ limit: limit ? Math.floor(limit) : undefined,
1202
+ watch: parseFlag(argv, "--watch"),
1203
+ file: parseOptionValue(argv, "--file"),
1204
+ pollIntervalMs: pollIntervalMs ? Math.floor(pollIntervalMs) : undefined,
873
1205
  },
874
1206
  },
875
1207
  workspaceRoot,
876
1208
  errors,
877
1209
  };
878
1210
  }
1211
+ case "mcp": {
1212
+ const subcommand = rest[0];
1213
+ if (subcommand !== "serve") {
1214
+ errors.push("forge mcp requires subcommand: serve");
1215
+ return { command: null, workspaceRoot, errors };
1216
+ }
1217
+ return {
1218
+ command: {
1219
+ kind: "mcp",
1220
+ subcommand,
1221
+ workspaceRoot,
1222
+ },
1223
+ workspaceRoot,
1224
+ errors,
1225
+ };
1226
+ }
879
1227
  case "review": {
880
1228
  const requested = rest[0] as ReviewSubcommand | undefined;
881
1229
  const subcommand =
@@ -898,6 +1246,7 @@ export function parseCli(argv: string[]): ParsedCli {
898
1246
  json: parseFlag(argv, "--json"),
899
1247
  md: parseFlag(argv, "--md"),
900
1248
  sarif: parseFlag(argv, "--sarif"),
1249
+ full: parseFlag(argv, "--full"),
901
1250
  write: positionalWrite || parseFlag(argv, "--write"),
902
1251
  changed: parseFlag(argv, "--changed") || noSourceFlag,
903
1252
  staged: parseFlag(argv, "--staged"),
@@ -921,7 +1270,7 @@ export function parseCli(argv: string[]): ParsedCli {
921
1270
  case "ui": {
922
1271
  const subcommand = (rest[0] ?? "smoke") as UiSubcommand;
923
1272
  if (!UI_SUBCOMMANDS.includes(subcommand)) {
924
- errors.push("forge ui requires subcommand: smoke, test, scenario, route, snapshot, report, doctor, or list");
1273
+ errors.push("forge ui requires subcommand: audit, smoke, test, scenario, route, snapshot, report, doctor, or list");
925
1274
  return { command: null, workspaceRoot, errors };
926
1275
  }
927
1276
  const timeoutRaw = parseOptionValue(argv, "--timeout");
@@ -968,14 +1317,27 @@ export function parseCli(argv: string[]): ParsedCli {
968
1317
  };
969
1318
  }
970
1319
  case "doctor":
971
- if (rest[0] && rest[0] !== "windows") {
972
- errors.push("forge doctor supports subcommand: windows");
1320
+ if (rest[0] && rest[0] !== "windows" && rest[0] !== "agent" && rest[0] !== "delta" && rest[0] !== "pglite" && rest[0] !== "runtime") {
1321
+ errors.push("forge doctor supports subcommand: windows, agent, delta, pglite, or runtime");
973
1322
  return { command: null, workspaceRoot, errors };
974
1323
  }
975
1324
  return {
976
1325
  command: {
977
1326
  kind: "doctor",
978
- target: rest[0] === "windows" ? "windows" : "project",
1327
+ target: rest[0] === "windows"
1328
+ ? "windows"
1329
+ : rest[0] === "agent"
1330
+ ? "agent"
1331
+ : rest[0] === "delta"
1332
+ ? "delta"
1333
+ : rest[0] === "pglite"
1334
+ ? "pglite"
1335
+ : rest[0] === "runtime"
1336
+ ? "runtime"
1337
+ : "project",
1338
+ agentTarget: rest[0] === "agent"
1339
+ ? (parseOptionValue(argv, "--target") as AgentAdapterTarget | undefined) ?? (rest[1] as AgentAdapterTarget | undefined) ?? "codex"
1340
+ : undefined,
979
1341
  json: parseFlag(argv, "--json"),
980
1342
  workspaceRoot,
981
1343
  },
@@ -1013,6 +1375,7 @@ export function parseCli(argv: string[]): ParsedCli {
1013
1375
  db: parseAdapterKind(parseOptionValue(argv, "--db")),
1014
1376
  databaseUrl: parseOptionValue(argv, "--database-url"),
1015
1377
  json: parseFlag(argv, "--json"),
1378
+ runTests: parseFlag(argv, "--full") || parseFlag(argv, "--run-tests"),
1016
1379
  workspaceRoot,
1017
1380
  },
1018
1381
  workspaceRoot,
@@ -1022,7 +1385,7 @@ export function parseCli(argv: string[]): ParsedCli {
1022
1385
  case "auth": {
1023
1386
  const subcommand = rest[0] as AuthSubcommand | undefined;
1024
1387
  if (!subcommand || !AUTH_SUBCOMMANDS.includes(subcommand)) {
1025
- errors.push("forge auth requires subcommand: check, config, decode, test-token, jwks, or prove");
1388
+ errors.push("forge auth requires subcommand: check, config, decode, test-token, jwks, prove, or status");
1026
1389
  return { command: null, workspaceRoot, errors };
1027
1390
  }
1028
1391
  return {
@@ -1031,6 +1394,112 @@ export function parseCli(argv: string[]): ParsedCli {
1031
1394
  subcommand,
1032
1395
  json: parseFlag(argv, "--json"),
1033
1396
  token: parseOptionValue(argv, "--token"),
1397
+ prod: parseFlag(argv, "--prod") || parseFlag(argv, "--production"),
1398
+ scenario: parseOptionValue(argv, "--scenario"),
1399
+ workspaceRoot,
1400
+ },
1401
+ workspaceRoot,
1402
+ errors,
1403
+ };
1404
+ }
1405
+ case "authmd": {
1406
+ const subcommand = rest[0] as AuthMdSubcommand | undefined;
1407
+ if (!subcommand || !AUTHMD_SUBCOMMANDS.includes(subcommand)) {
1408
+ errors.push("forge authmd requires subcommand: generate or check");
1409
+ return { command: null, workspaceRoot, errors };
1410
+ }
1411
+ return {
1412
+ command: {
1413
+ kind: "authmd",
1414
+ subcommand,
1415
+ json: parseFlag(argv, "--json"),
1416
+ output: parseOptionValue(argv, "--output"),
1417
+ workspaceRoot,
1418
+ },
1419
+ workspaceRoot,
1420
+ errors,
1421
+ };
1422
+ }
1423
+ case "workos": {
1424
+ const subcommand = rest[0] as WorkOSSubcommand | undefined;
1425
+ if (!subcommand || !WORKOS_SUBCOMMANDS.includes(subcommand)) {
1426
+ errors.push("forge workos requires subcommand: install, doctor, seed, or setup");
1427
+ return { command: null, workspaceRoot, errors };
1428
+ }
1429
+ return {
1430
+ command: {
1431
+ kind: "workos",
1432
+ subcommand,
1433
+ json: parseFlag(argv, "--json"),
1434
+ file: parseOptionValue(argv, "--file"),
1435
+ yes: parseFlag(argv, "--yes"),
1436
+ dryRun: parseFlag(argv, "--dry-run"),
1437
+ real: parseFlag(argv, "--real"),
1438
+ workspaceRoot,
1439
+ },
1440
+ workspaceRoot,
1441
+ errors,
1442
+ };
1443
+ }
1444
+ case "deploy": {
1445
+ const subcommand = rest[0] as DeploySubcommand | undefined;
1446
+ if (!subcommand || !DEPLOY_SUBCOMMANDS.includes(subcommand)) {
1447
+ errors.push("forge deploy requires subcommand: plan, check, render, or verify");
1448
+ return { command: null, workspaceRoot, errors };
1449
+ }
1450
+ const targetRaw = parseOptionValue(argv, "--target") ?? (subcommand === "render" ? rest[1] : undefined) ?? "docker";
1451
+ if (targetRaw !== "docker" && targetRaw !== "forge-cloud") {
1452
+ errors.push("forge deploy --target must be docker or forge-cloud");
1453
+ }
1454
+ return {
1455
+ command: {
1456
+ kind: "deploy",
1457
+ subcommand,
1458
+ target: targetRaw as DeployTarget,
1459
+ production: parseFlag(argv, "--production") || parseFlag(argv, "--prod"),
1460
+ url: parseOptionValue(argv, "--url"),
1461
+ json: parseFlag(argv, "--json"),
1462
+ workspaceRoot,
1463
+ },
1464
+ workspaceRoot,
1465
+ errors,
1466
+ };
1467
+ }
1468
+ case "field-test": {
1469
+ const subcommand = rest[0] as FieldTestSubcommand | undefined;
1470
+ if (!subcommand || !FIELD_TEST_SUBCOMMANDS.includes(subcommand)) {
1471
+ errors.push("forge field-test requires subcommand: create, run, or report");
1472
+ return { command: null, workspaceRoot, errors };
1473
+ }
1474
+ const timeoutRaw = parseOptionValue(argv, "--timeout-ms");
1475
+ const timeoutMs = timeoutRaw ? Number(timeoutRaw) : 180_000;
1476
+ if (!Number.isFinite(timeoutMs) || timeoutMs < 1) {
1477
+ errors.push("--timeout-ms must be a positive integer");
1478
+ }
1479
+ const authRaw = parseOptionValue(argv, "--auth") ?? "none";
1480
+ if (authRaw !== "none" && authRaw !== "workos") {
1481
+ errors.push("forge field-test --auth must be none or workos");
1482
+ }
1483
+ const templates = parseTemplateList(parseOptionValue(argv, "--templates"), errors, "--templates");
1484
+ const packageManagers = parsePackageManagerList(parseOptionValue(argv, "--package-managers"), errors, "--package-managers");
1485
+ return {
1486
+ command: {
1487
+ kind: "field-test",
1488
+ subcommand,
1489
+ name: subcommand === "create" ? rest[1] : undefined,
1490
+ template: parseNewTemplate(parseOptionValue(argv, "--template") ?? "minimal-web"),
1491
+ templates,
1492
+ packageManager: parseNewPackageManager(parseOptionValue(argv, "--package-manager") ?? "npm"),
1493
+ packageManagers,
1494
+ forgeSpec: parseOptionValue(argv, "--forge-spec"),
1495
+ auth: authRaw as "none" | "workos",
1496
+ dryRun: parseFlag(argv, "--dry-run"),
1497
+ keep: parseFlag(argv, "--keep"),
1498
+ runtimeProbes: parseFlag(argv, "--runtime-probes"),
1499
+ authProbes: parseFlag(argv, "--auth-probes"),
1500
+ timeoutMs: Math.floor(timeoutMs),
1501
+ writeReport: parseOptionValue(argv, "--write-report") ?? parseOptionValue(argv, "--file"),
1502
+ json: parseFlag(argv, "--json"),
1034
1503
  workspaceRoot,
1035
1504
  },
1036
1505
  workspaceRoot,
@@ -1113,6 +1582,7 @@ export function parseCli(argv: string[]): ParsedCli {
1113
1582
  json: parseFlag(argv, "--json"),
1114
1583
  allowDirty: parseFlag(argv, "--allow-dirty"),
1115
1584
  allowPublicSourcemaps: parseFlag(argv, "--allow-public-sourcemaps"),
1585
+ allowMissingLocalRelease: parseFlag(argv, "--allow-missing-local-release"),
1116
1586
  workspaceRoot,
1117
1587
  },
1118
1588
  workspaceRoot,
@@ -1184,7 +1654,7 @@ export function parseCli(argv: string[]): ParsedCli {
1184
1654
  event: parseOptionValue(argv, "--event"),
1185
1655
  trigger: parseOptionValue(argv, "--trigger"),
1186
1656
  component: parseOptionValue(argv, "--component"),
1187
- framework: parseOptionValue(argv, "--framework") as "vite" | "next" | undefined,
1657
+ framework: parseOptionValue(argv, "--framework") as "vite" | "next" | "nuxt" | undefined,
1188
1658
  withAi: parseFlag(argv, "--with-ai"),
1189
1659
  withCrud: parseFlag(argv, "--with-crud"),
1190
1660
  withLiveQuery: parseFlag(argv, "--with-livequery"),
@@ -1358,7 +1828,7 @@ export function parseCli(argv: string[]): ParsedCli {
1358
1828
  case "test": {
1359
1829
  const subcommand = rest[0] as TestSubcommand | undefined;
1360
1830
  if (!subcommand || !TEST_SUBCOMMANDS.includes(subcommand)) {
1361
- errors.push("forge test requires subcommand: plan, run, or explain");
1831
+ errors.push("forge test requires subcommand: plan, run, explain, or authz");
1362
1832
  return { command: null, workspaceRoot, errors };
1363
1833
  }
1364
1834
  const timeoutRaw = parseOptionValue(argv, "--timeout-ms");
@@ -1377,7 +1847,7 @@ export function parseCli(argv: string[]): ParsedCli {
1377
1847
  workspaceRoot,
1378
1848
  json: parseFlag(argv, "--json"),
1379
1849
  write: parseFlag(argv, "--write"),
1380
- changed: parseFlag(argv, "--changed") || (!parseFlag(argv, "--staged") && !parseOptionValue(argv, "--since") && !parseOptionValue(argv, "--feature") && !parseOptionValue(argv, "--refactor") && !parseOptionValue(argv, "--upgrade") && !parseOptionValue(argv, "--plan") && subcommand !== "explain"),
1850
+ changed: parseFlag(argv, "--changed") || (!parseFlag(argv, "--staged") && !parseOptionValue(argv, "--since") && !parseOptionValue(argv, "--feature") && !parseOptionValue(argv, "--refactor") && !parseOptionValue(argv, "--upgrade") && !parseOptionValue(argv, "--plan") && subcommand !== "explain" && subcommand !== "authz"),
1381
1851
  staged: parseFlag(argv, "--staged"),
1382
1852
  since: parseOptionValue(argv, "--since"),
1383
1853
  featureId: parseOptionValue(argv, "--feature"),
@@ -1391,6 +1861,8 @@ export function parseCli(argv: string[]): ParsedCli {
1391
1861
  bail: parseFlag(argv, "--bail"),
1392
1862
  report: parseOptionValue(argv, "--report"),
1393
1863
  timeoutMs: timeoutMs ? Math.floor(timeoutMs) : undefined,
1864
+ tenant: parseOptionValue(argv, "--tenant") ?? "acme",
1865
+ otherTenant: parseOptionValue(argv, "--other-tenant") ?? "globex",
1394
1866
  },
1395
1867
  },
1396
1868
  workspaceRoot,
@@ -1463,6 +1935,218 @@ export function parseCli(argv: string[]): ParsedCli {
1463
1935
  errors,
1464
1936
  };
1465
1937
  }
1938
+ case "bench": {
1939
+ const subcommand = rest[0] as BenchSubcommand | undefined;
1940
+ if (!subcommand || !BENCH_SUBCOMMANDS.includes(subcommand)) {
1941
+ errors.push("forge bench requires subcommand: compiler");
1942
+ return { command: null, workspaceRoot, errors };
1943
+ }
1944
+ const iterationsRaw = parseOptionValue(argv, "--iterations");
1945
+ const warmupsRaw = parseOptionValue(argv, "--warmups");
1946
+ const concurrencyRaw = parseOptionValue(argv, "--concurrency");
1947
+ const iterations = iterationsRaw !== undefined ? Number(iterationsRaw) : 5;
1948
+ const warmups = warmupsRaw !== undefined ? Number(warmupsRaw) : 1;
1949
+ const concurrency = concurrencyRaw !== undefined ? Number(concurrencyRaw) : 4;
1950
+ if (!Number.isFinite(iterations) || iterations < 1) {
1951
+ errors.push("--iterations must be a number >= 1");
1952
+ }
1953
+ if (!Number.isFinite(warmups) || warmups < 0) {
1954
+ errors.push("--warmups must be a number >= 0");
1955
+ }
1956
+ if (!Number.isFinite(concurrency) || concurrency < 1) {
1957
+ errors.push("--concurrency must be a number >= 1");
1958
+ }
1959
+ return {
1960
+ command: {
1961
+ kind: "bench",
1962
+ options: {
1963
+ subcommand,
1964
+ workspaceRoot,
1965
+ json: parseFlag(argv, "--json"),
1966
+ iterations: Math.floor(iterations),
1967
+ warmups: Math.floor(warmups),
1968
+ concurrency: Math.floor(concurrency),
1969
+ },
1970
+ },
1971
+ workspaceRoot,
1972
+ errors,
1973
+ };
1974
+ }
1975
+ case "cair": {
1976
+ const subcommand = rest[0] as CairSubcommand | undefined;
1977
+ if (!subcommand || !CAIR_SUBCOMMANDS.includes(subcommand)) {
1978
+ errors.push("forge cair requires subcommand: snapshot, query, or action");
1979
+ return { command: null, workspaceRoot, errors };
1980
+ }
1981
+ const formatRaw = parseOptionValue(argv, "--format");
1982
+ if (formatRaw !== undefined && formatRaw !== "text" && formatRaw !== "json") {
1983
+ errors.push("--format must be text or json");
1984
+ }
1985
+ const query = subcommand === "query" ? rest.slice(1).join(" ").trim() : undefined;
1986
+ if (subcommand === "query" && !query) {
1987
+ errors.push("forge cair query requires a CAIR query, for example: forge cair query \"Q STATUS\"");
1988
+ }
1989
+ const inputPath = parseOptionValue(argv, "--input");
1990
+ const action = subcommand === "action"
1991
+ ? rest.slice(1).filter((part, index, parts) => {
1992
+ const previous = parts[index - 1];
1993
+ if (part === "--dry-run" || part === "--plan" || part === "--json" || part === "--include-generated") {
1994
+ return false;
1995
+ }
1996
+ if (part === "--format" || part === "--input") {
1997
+ return false;
1998
+ }
1999
+ if (previous === "--format" || previous === "--input") {
2000
+ return false;
2001
+ }
2002
+ return true;
2003
+ }).join(" ").trim()
2004
+ : undefined;
2005
+ if (subcommand === "action" && !action && !inputPath) {
2006
+ errors.push("forge cair action requires a CAIR action, for example: forge cair action \"A CREATE.FILE path=src/example.ts\"");
2007
+ }
2008
+ return {
2009
+ command: {
2010
+ kind: "cair",
2011
+ options: {
2012
+ subcommand,
2013
+ workspaceRoot,
2014
+ json: parseFlag(argv, "--json"),
2015
+ format: formatRaw === "json" ? "json" : "text",
2016
+ ...(query ? { query } : {}),
2017
+ ...(action ? { action } : {}),
2018
+ ...(inputPath ? { inputPath } : {}),
2019
+ dryRun: parseFlag(argv, "--dry-run"),
2020
+ plan: parseFlag(argv, "--plan"),
2021
+ allowGenerated: parseFlag(argv, "--include-generated"),
2022
+ },
2023
+ },
2024
+ workspaceRoot,
2025
+ errors,
2026
+ };
2027
+ }
2028
+ case "status":
2029
+ return {
2030
+ command: {
2031
+ kind: "status",
2032
+ json: parseFlag(argv, "--json"),
2033
+ workspaceRoot,
2034
+ },
2035
+ workspaceRoot,
2036
+ errors,
2037
+ };
2038
+ case "changed":
2039
+ return {
2040
+ command: {
2041
+ kind: "changed",
2042
+ json: parseFlag(argv, "--json"),
2043
+ authoredOnly: parseFlag(argv, "--authored"),
2044
+ reviewOnly: parseFlag(argv, "--review"),
2045
+ commitReady: parseFlag(argv, "--commit-ready"),
2046
+ workspaceRoot,
2047
+ },
2048
+ workspaceRoot,
2049
+ errors,
2050
+ };
2051
+ case "diff": {
2052
+ const target = (rest[0] ?? "authored") as "authored" | "generated" | "full";
2053
+ if (!["authored", "generated", "full"].includes(target)) {
2054
+ errors.push("forge diff requires target: authored, generated, or full");
2055
+ return { command: null, workspaceRoot, errors };
2056
+ }
2057
+ return {
2058
+ command: {
2059
+ kind: "diff",
2060
+ target,
2061
+ json: parseFlag(argv, "--json"),
2062
+ workspaceRoot,
2063
+ },
2064
+ workspaceRoot,
2065
+ errors,
2066
+ };
2067
+ }
2068
+ case "handoff":
2069
+ return {
2070
+ command: {
2071
+ kind: "handoff",
2072
+ json: parseFlag(argv, "--json"),
2073
+ commitReady: parseFlag(argv, "--commit-ready"),
2074
+ workspaceRoot,
2075
+ },
2076
+ workspaceRoot,
2077
+ errors,
2078
+ };
2079
+ case "studio": {
2080
+ const subcommand = rest[0];
2081
+ if (
2082
+ subcommand !== "attach" &&
2083
+ subcommand !== "snapshot" &&
2084
+ subcommand !== "watch" &&
2085
+ subcommand !== "open" &&
2086
+ subcommand !== "doctor" &&
2087
+ subcommand !== "bridge" &&
2088
+ subcommand !== "codex-server"
2089
+ ) {
2090
+ errors.push("forge studio requires subcommand: attach, snapshot, watch, open, doctor, bridge, or codex-server");
2091
+ return { command: null, workspaceRoot, errors };
2092
+ }
2093
+ const previewPortRaw = parseOptionValue(argv, "--preview-port");
2094
+ const previewPort = previewPortRaw !== undefined ? Number(previewPortRaw) : undefined;
2095
+ if (
2096
+ previewPortRaw !== undefined &&
2097
+ (!Number.isInteger(previewPort) || previewPort! < 1)
2098
+ ) {
2099
+ errors.push("--preview-port must be an integer >= 1");
2100
+ }
2101
+ const intervalRaw = parseOptionValue(argv, "--interval-ms");
2102
+ const intervalMs = intervalRaw !== undefined ? Number(intervalRaw) : undefined;
2103
+ if (intervalRaw !== undefined && (!Number.isFinite(intervalMs) || intervalMs! < 1000)) {
2104
+ errors.push("--interval-ms must be a number >= 1000");
2105
+ }
2106
+ const targets = parseOptionValues(argv, "--target");
2107
+ const ignoredOptionValues = new Set(
2108
+ [
2109
+ ...targets,
2110
+ parseOptionValue(argv, "--preview-url"),
2111
+ parseOptionValue(argv, "--studio-url"),
2112
+ parseOptionValue(argv, "--workspace-id"),
2113
+ parseOptionValue(argv, "--tenant-id"),
2114
+ parseOptionValue(argv, "--user-id"),
2115
+ parseOptionValue(argv, "--role"),
2116
+ previewPortRaw,
2117
+ intervalRaw,
2118
+ ].filter((value): value is string => typeof value === "string"),
2119
+ );
2120
+ const studioPath = rest.slice(1).find((item) => !ignoredOptionValues.has(item));
2121
+ return {
2122
+ command: {
2123
+ kind: "studio",
2124
+ subcommand,
2125
+ path: studioPath,
2126
+ previewUrl: parseOptionValue(argv, "--preview-url"),
2127
+ previewPort: previewPort ? Math.floor(previewPort) : undefined,
2128
+ studioUrl: parseOptionValue(argv, "--studio-url"),
2129
+ intervalMs: intervalMs ? Math.floor(intervalMs) : undefined,
2130
+ once: parseFlag(argv, "--once"),
2131
+ workspaceId: parseOptionValue(argv, "--workspace-id"),
2132
+ tenantId: parseOptionValue(argv, "--tenant-id"),
2133
+ userId: parseOptionValue(argv, "--user-id"),
2134
+ role: parseOptionValue(argv, "--role"),
2135
+ targets: targets.length > 0 ? targets : ["codex"],
2136
+ install: parseFlag(argv, "--install"),
2137
+ start: !parseFlag(argv, "--no-start"),
2138
+ bridge: !parseFlag(argv, "--no-bridge"),
2139
+ writeSchemas: parseFlag(argv, "--write"),
2140
+ probeAppServer: parseFlag(argv, "--probe") || parseFlag(argv, "--probe-codex-server"),
2141
+ json: parseFlag(argv, "--json"),
2142
+ dryRun: parseFlag(argv, "--dry-run"),
2143
+ force: parseFlag(argv, "--force"),
2144
+ workspaceRoot,
2145
+ },
2146
+ workspaceRoot,
2147
+ errors,
2148
+ };
2149
+ }
1466
2150
  case "generate": {
1467
2151
  const concurrencyRaw = parseOptionValue(argv, "--concurrency");
1468
2152
  const concurrency = concurrencyRaw ? Number(concurrencyRaw) : 4;
@@ -1476,30 +2160,189 @@ export function parseCli(argv: string[]): ParsedCli {
1476
2160
  dryRun: parseFlag(argv, "--dry-run"),
1477
2161
  json: parseFlag(argv, "--json"),
1478
2162
  concurrency: Math.max(1, Math.floor(concurrency || 4)),
2163
+ workspaceRoot,
2164
+ },
2165
+ workspaceRoot,
2166
+ errors,
2167
+ };
2168
+ }
2169
+ case "delta": {
2170
+ const subcommand = rest[0];
2171
+ if (subcommand !== "status" && subcommand !== "repair" && subcommand !== "compact" && subcommand !== "prune" && subcommand !== "export") {
2172
+ errors.push("forge delta requires subcommand: status, repair, compact, prune, or export");
2173
+ return { command: null, workspaceRoot, errors };
2174
+ }
2175
+ const limitRaw = parseOptionValue(argv, "--limit");
2176
+ const limit = limitRaw ? Number(limitRaw) : undefined;
2177
+ return {
2178
+ command: {
2179
+ kind: "delta",
2180
+ subcommand,
2181
+ json: parseFlag(argv, "--json"),
2182
+ dryRun: parseFlag(argv, "--dry-run"),
2183
+ yes: parseFlag(argv, "--yes"),
2184
+ verbose: parseFlag(argv, "--verbose"),
2185
+ olderThan: parseOptionValue(argv, "--older-than"),
2186
+ output: parseOptionValue(argv, "--output"),
2187
+ limit: Number.isFinite(limit) ? limit : undefined,
2188
+ redacted: parseFlag(argv, "--redacted"),
2189
+ workspaceRoot,
2190
+ },
2191
+ workspaceRoot,
2192
+ errors,
2193
+ };
2194
+ }
2195
+ case "session": {
2196
+ const subcommand = rest[0];
2197
+ if (subcommand !== "list" && subcommand !== "show" && subcommand !== "rename" && subcommand !== "merge" && subcommand !== "split" && subcommand !== "detach") {
2198
+ errors.push("forge session requires subcommand: list, show, rename, merge, split, or detach");
2199
+ return { command: null, workspaceRoot, errors };
2200
+ }
2201
+ const limitRaw = parseOptionValue(argv, "--limit");
2202
+ const limit = limitRaw ? Number(limitRaw) : undefined;
2203
+ if (limitRaw !== undefined && (!Number.isFinite(limit) || limit! < 1)) {
2204
+ errors.push("--limit must be a number >= 1");
2205
+ }
2206
+ const sessionId = rest[1];
2207
+ return {
2208
+ command: {
2209
+ kind: "session",
2210
+ subcommand,
2211
+ sessionId: subcommand === "detach" ? undefined : sessionId,
2212
+ sourceSessionId: subcommand === "merge" ? rest[2] : undefined,
2213
+ operationId: subcommand === "split" ? rest[2] : subcommand === "detach" ? rest[1] : undefined,
2214
+ title: subcommand === "rename" ? rest.slice(2).join(" ") : undefined,
2215
+ limit: limit ? Math.floor(limit) : undefined,
2216
+ json: parseFlag(argv, "--json"),
2217
+ workspaceRoot,
2218
+ },
2219
+ workspaceRoot,
2220
+ errors,
2221
+ };
2222
+ }
2223
+ case "timeline": {
2224
+ const limitRaw = parseOptionValue(argv, "--limit");
2225
+ const kindFilter = parseOptionValue(argv, "--kind");
2226
+ const sessionId = parseOptionValue(argv, "--session");
2227
+ const rebuild = rest[0] === "rebuild";
2228
+ const optionValues = new Set([limitRaw, kindFilter, sessionId].filter((value): value is string => typeof value === "string"));
2229
+ const target = rebuild
2230
+ ? undefined
2231
+ : rest.find((item) => !item.startsWith("--") && !optionValues.has(item));
2232
+ const limit = limitRaw ? Number(limitRaw) : undefined;
2233
+ if (limitRaw !== undefined && (!Number.isFinite(limit) || limit! < 1)) {
2234
+ errors.push("--limit must be a number >= 1");
2235
+ }
2236
+ return {
2237
+ command: {
2238
+ kind: "timeline",
2239
+ target,
2240
+ kindFilter,
2241
+ sessionId,
2242
+ limit: limit ? Math.floor(limit) : undefined,
2243
+ json: parseFlag(argv, "--json"),
2244
+ rebuild,
2245
+ forAgent: parseFlag(argv, "--for-agent"),
2246
+ causal: parseFlag(argv, "--causal"),
2247
+ staleProofs: parseFlag(argv, "--stale-proofs"),
2248
+ workspaceRoot,
2249
+ },
2250
+ workspaceRoot,
2251
+ errors,
2252
+ };
2253
+ }
2254
+ case "explain": {
2255
+ const thing = rest[0] === "session" ? `session:${rest[1] ?? "current"}` : rest[0];
2256
+ if (!thing) {
2257
+ errors.push("forge explain requires a target");
2258
+ return { command: null, workspaceRoot, errors };
2259
+ }
2260
+ return {
2261
+ command: {
2262
+ kind: "explain",
2263
+ thing,
2264
+ json: parseFlag(argv, "--json"),
2265
+ workspaceRoot,
2266
+ },
2267
+ workspaceRoot,
2268
+ errors,
2269
+ };
2270
+ }
2271
+ case "manifest": {
2272
+ const subcommand = rest[0];
2273
+ const path = rest[1];
2274
+ if (subcommand !== "validate" && subcommand !== "import") {
2275
+ errors.push("forge manifest requires subcommand validate or import");
2276
+ return { command: null, workspaceRoot, errors };
2277
+ }
2278
+ if (!path) {
2279
+ errors.push(`forge manifest ${subcommand} requires a manifest file path`);
2280
+ return { command: null, workspaceRoot, errors };
2281
+ }
2282
+ return {
2283
+ command: {
2284
+ kind: "manifest",
2285
+ subcommand,
2286
+ path,
2287
+ json: parseFlag(argv, "--json"),
2288
+ workspaceRoot,
2289
+ },
2290
+ workspaceRoot,
2291
+ errors,
2292
+ };
2293
+ }
2294
+ case "import": {
2295
+ const subcommand = rest[0];
2296
+ if (subcommand !== "analyze" && subcommand !== "inspect") {
2297
+ errors.push("forge import requires subcommand analyze or inspect");
2298
+ return { command: null, workspaceRoot, errors };
2299
+ }
2300
+ return {
2301
+ command: {
2302
+ kind: "import",
2303
+ options: {
2304
+ subcommand,
2305
+ json: parseFlag(argv, "--json"),
2306
+ dryRun: parseFlag(argv, "--dry-run"),
2307
+ workspaceRoot,
2308
+ entry: parseOptionValue(argv, "--entry"),
2309
+ target: parseOptionValue(argv, "--target"),
2310
+ },
1479
2311
  },
1480
2312
  workspaceRoot,
1481
2313
  errors,
1482
2314
  };
1483
2315
  }
1484
2316
  case "add": {
1485
- const alias = rest[0];
2317
+ const subcommand = rest[0];
2318
+ const explicitMode =
2319
+ subcommand === "package"
2320
+ ? "package"
2321
+ : subcommand === "integration" || subcommand === "auth"
2322
+ ? "integration"
2323
+ : "auto";
2324
+ const alias = explicitMode === "auto" ? rest[0] : rest[1];
1486
2325
  if (!alias) {
1487
- errors.push("forge add requires an integration alias");
2326
+ errors.push(
2327
+ explicitMode === "auto"
2328
+ ? "forge add requires a package name or integration alias"
2329
+ : `forge add ${subcommand} requires a target`,
2330
+ );
1488
2331
  return { command: null, workspaceRoot, errors };
1489
2332
  }
1490
2333
  return {
1491
2334
  command: {
1492
2335
  kind: "add",
1493
2336
  alias,
1494
- options: parseAddOptions(argv, workspaceRoot),
2337
+ options: parseAddOptions(argv, workspaceRoot, explicitMode),
1495
2338
  },
1496
2339
  workspaceRoot,
1497
2340
  errors,
1498
2341
  };
1499
2342
  }
1500
2343
  case "inspect": {
1501
- const target = rest[0] as InspectTarget | undefined;
1502
- if (!target || !INSPECT_TARGETS.includes(target)) {
2344
+ const target = (rest[0] as InspectTarget | undefined) ?? "summary";
2345
+ if (!INSPECT_TARGETS.includes(target)) {
1503
2346
  errors.push(
1504
2347
  `unsupported inspect target; supported: ${INSPECT_TARGETS.join(", ")}`,
1505
2348
  );
@@ -1511,6 +2354,10 @@ export function parseCli(argv: string[]): ParsedCli {
1511
2354
  target,
1512
2355
  json: parseFlag(argv, "--json"),
1513
2356
  dryRun: parseFlag(argv, "--dry-run"),
2357
+ full: parseFlag(argv, "--full"),
2358
+ brief: parseFlag(argv, "--brief"),
2359
+ ergonomics: parseFlag(argv, "--ergonomics"),
2360
+ workspaceRoot,
1514
2361
  },
1515
2362
  workspaceRoot,
1516
2363
  errors,
@@ -1531,12 +2378,58 @@ export function parseCli(argv: string[]): ParsedCli {
1531
2378
  {
1532
2379
  const scriptTimeoutRaw = parseOptionValue(argv, "--script-timeout-ms");
1533
2380
  const scriptTimeoutMs = scriptTimeoutRaw ? Number(scriptTimeoutRaw) : undefined;
2381
+ const testJobsRaw = parseOptionValue(argv, "--test-jobs");
2382
+ const testJobs = testJobsRaw ? Number(testJobsRaw) : undefined;
2383
+ const typechecker = parseOptionValue(argv, "--typechecker");
2384
+ const verifyOptionValues = new Set(
2385
+ [scriptTimeoutRaw, testJobsRaw, typechecker]
2386
+ .filter((value): value is string => typeof value === "string"),
2387
+ );
2388
+ const profileAlias = rest.find((item) => !verifyOptionValues.has(item));
2389
+ const verifyProfiles = new Set([
2390
+ "quick",
2391
+ "smoke",
2392
+ "agent",
2393
+ "standard",
2394
+ "release",
2395
+ "strict",
2396
+ "changed",
2397
+ "framework",
2398
+ "internal",
2399
+ "maintainer",
2400
+ ]);
2401
+ if (profileAlias && !verifyProfiles.has(profileAlias)) {
2402
+ errors.push(
2403
+ `unknown forge verify profile '${profileAlias}'; expected quick, smoke, agent, standard, release, strict, changed, framework, internal, or maintainer`,
2404
+ );
2405
+ }
2406
+ const internal =
2407
+ parseFlag(argv, "--internal") ||
2408
+ profileAlias === "framework" ||
2409
+ profileAlias === "internal" ||
2410
+ profileAlias === "maintainer";
1534
2411
  if (
1535
2412
  scriptTimeoutRaw !== undefined &&
1536
2413
  (!Number.isFinite(scriptTimeoutMs) || scriptTimeoutMs! < 1)
1537
2414
  ) {
1538
2415
  errors.push("--script-timeout-ms must be a number >= 1");
1539
2416
  }
2417
+ if (
2418
+ testJobsRaw !== undefined &&
2419
+ (!Number.isInteger(testJobs) || testJobs! < 1)
2420
+ ) {
2421
+ errors.push("--test-jobs must be an integer >= 1");
2422
+ }
2423
+ if (
2424
+ typechecker !== undefined &&
2425
+ typechecker !== "tsc" &&
2426
+ typechecker !== "native" &&
2427
+ typechecker !== "ts7" &&
2428
+ typechecker !== "tsgo" &&
2429
+ typechecker !== "auto"
2430
+ ) {
2431
+ errors.push("--typechecker must be one of: tsc, native, ts7, tsgo, auto");
2432
+ }
1540
2433
  return {
1541
2434
  command: {
1542
2435
  kind: "verify",
@@ -1546,12 +2439,17 @@ export function parseCli(argv: string[]): ParsedCli {
1546
2439
  skipTests: parseFlag(argv, "--skip-tests"),
1547
2440
  skipTypecheck: parseFlag(argv, "--skip-typecheck"),
1548
2441
  skipEslint: parseFlag(argv, "--skip-eslint"),
1549
- strict: parseFlag(argv, "--strict"),
1550
- changed: parseFlag(argv, "--changed"),
1551
- fast: parseFlag(argv, "--fast"),
1552
- smoke: parseFlag(argv, "--smoke"),
1553
- standard: parseFlag(argv, "--standard"),
2442
+ strict: internal || parseFlag(argv, "--strict") || profileAlias === "release" || profileAlias === "strict",
2443
+ changed: parseFlag(argv, "--changed") || profileAlias === "changed",
2444
+ fast: parseFlag(argv, "--fast") || profileAlias === "quick",
2445
+ smoke: parseFlag(argv, "--smoke") || profileAlias === "smoke",
2446
+ standard: parseFlag(argv, "--standard") || profileAlias === "agent" || profileAlias === "standard",
1554
2447
  scriptTimeoutMs: scriptTimeoutMs ? Math.floor(scriptTimeoutMs) : undefined,
2448
+ testJobs: testJobs ? Math.floor(testJobs) : undefined,
2449
+ typechecker: typechecker as "tsc" | "native" | "ts7" | "tsgo" | "auto" | undefined,
2450
+ fullTests: parseFlag(argv, "--full"),
2451
+ testPlan: parseFlag(argv, "--test-plan"),
2452
+ internal,
1555
2453
  },
1556
2454
  },
1557
2455
  workspaceRoot,
@@ -1595,6 +2493,15 @@ export function parseCli(argv: string[]): ParsedCli {
1595
2493
 
1596
2494
  const name = rest[0];
1597
2495
  const list = parseFlag(argv, "--list") || !name;
2496
+ const argsRaw = parseOptionValue(argv, "--args");
2497
+ let args: unknown = {};
2498
+ if (argsRaw !== undefined) {
2499
+ try {
2500
+ args = JSON.parse(argsRaw);
2501
+ } catch {
2502
+ errors.push("--args must be valid JSON");
2503
+ }
2504
+ }
1598
2505
  return {
1599
2506
  command: {
1600
2507
  kind: "run",
@@ -1607,19 +2514,30 @@ export function parseCli(argv: string[]): ParsedCli {
1607
2514
  role: parseOptionValue(argv, "--role"),
1608
2515
  envFile: parseOptionValue(argv, "--env-file"),
1609
2516
  workspaceRoot,
2517
+ args,
1610
2518
  },
1611
2519
  workspaceRoot,
1612
2520
  errors,
1613
2521
  };
1614
2522
  }
1615
2523
  case "query": {
1616
- const subcommand = (rest[0] ?? "list") as QuerySubcommand;
2524
+ const requested = rest[0] as QuerySubcommand | undefined;
2525
+ const subcommand =
2526
+ !requested
2527
+ ? "list"
2528
+ : ["list", "run"].includes(requested)
2529
+ ? requested
2530
+ : "run";
1617
2531
  if (!["list", "run"].includes(subcommand)) {
1618
2532
  errors.push("forge query requires subcommand: list or run");
1619
2533
  return { command: null, workspaceRoot, errors };
1620
2534
  }
1621
2535
 
1622
- const queryName = subcommand === "run" ? rest[1] : undefined;
2536
+ const queryName = subcommand === "run"
2537
+ ? requested === "run"
2538
+ ? rest[1]
2539
+ : rest[0]
2540
+ : undefined;
1623
2541
  if (subcommand === "run" && !queryName) {
1624
2542
  errors.push("forge query run requires a query name");
1625
2543
  }
@@ -1692,6 +2610,7 @@ export function parseCli(argv: string[]): ParsedCli {
1692
2610
  };
1693
2611
  }
1694
2612
  case "dev": {
2613
+ const lifecycle = rest[0] === "status" || rest[0] === "stop" ? rest[0] : undefined;
1695
2614
  const portRaw = parseOptionValue(argv, "--port");
1696
2615
  const port = portRaw !== undefined ? Number(portRaw) : undefined;
1697
2616
  if (portRaw !== undefined && (!Number.isFinite(port) || port! < 0)) {
@@ -1728,6 +2647,9 @@ export function parseCli(argv: string[]): ParsedCli {
1728
2647
  .map((value) => value.trim())
1729
2648
  .filter(Boolean),
1730
2649
  envFile: parseOptionValue(argv, "--env-file"),
2650
+ skipStartupConsole: parseFlag(argv, "--skip-startup-console"),
2651
+ detach: parseFlag(argv, "--detach"),
2652
+ lifecycle,
1731
2653
  workspaceRoot,
1732
2654
  },
1733
2655
  workspaceRoot,
@@ -1736,16 +2658,17 @@ export function parseCli(argv: string[]): ParsedCli {
1736
2658
  }
1737
2659
  case "db": {
1738
2660
  const subcommand = rest[0] as DbSubcommand | undefined;
1739
- if (!subcommand || !["diff", "migrate", "reset", "status", "rls-check"].includes(subcommand)) {
1740
- errors.push("forge db requires subcommand: diff, migrate, reset, status, or rls-check");
2661
+ if (!subcommand || !["diff", "migrate", "reset", "status", "doctor", "repair", "rls-check"].includes(subcommand)) {
2662
+ errors.push("forge db requires subcommand: diff, migrate, reset, status, doctor, repair, or rls-check");
1741
2663
  return { command: null, workspaceRoot, errors };
1742
2664
  }
1743
2665
  return {
1744
2666
  command: {
1745
2667
  kind: "db",
1746
2668
  subcommand,
1747
- db: parseAdapterKind(parseOptionValue(argv, "--db")),
2669
+ db: parseAdapterKind(parseOptionValue(argv, "--adapter") ?? parseOptionValue(argv, "--db")),
1748
2670
  databaseUrl: parseOptionValue(argv, "--database-url"),
2671
+ local: parseFlag(argv, "--local"),
1749
2672
  json: parseFlag(argv, "--json"),
1750
2673
  workspaceRoot,
1751
2674
  },
@@ -1998,6 +2921,8 @@ export function parseCli(argv: string[]): ParsedCli {
1998
2921
  model: parseOptionValue(argv, "--model"),
1999
2922
  prompt: parseOptionValue(argv, "--prompt"),
2000
2923
  mock: parseFlag(argv, "--mock"),
2924
+ modelLevel: parseFlag(argv, "--model-level"),
2925
+ live: parseFlag(argv, "--live"),
2001
2926
  traceId,
2002
2927
  db: parsePersistentDbKind(parseOptionValue(argv, "--db")),
2003
2928
  databaseUrl: parseOptionValue(argv, "--database-url"),
@@ -2015,8 +2940,13 @@ export function parseCli(argv: string[]): ParsedCli {
2015
2940
 
2016
2941
  export function hasUnknownOption(argv: string[]): string | null {
2017
2942
  const known = new Set([
2943
+ "--version",
2018
2944
  "--check",
2019
2945
  "--json",
2946
+ "--human",
2947
+ "--for-agent",
2948
+ "--causal",
2949
+ "--stale-proofs",
2020
2950
  "--dry-run",
2021
2951
  "--plan",
2022
2952
  "--staged",
@@ -2047,15 +2977,23 @@ export function hasUnknownOption(argv: string[]): string | null {
2047
2977
  "--smoke",
2048
2978
  "--standard",
2049
2979
  "--script-timeout-ms",
2980
+ "--test-plan",
2981
+ "--typechecker",
2050
2982
  "--timeout-ms",
2051
2983
  "--apply",
2052
2984
  "--runtime-inspect",
2053
2985
  "--allow-scripts",
2986
+ "--frontend",
2987
+ "--backend",
2054
2988
  "--yes",
2055
2989
  "--force",
2056
2990
  "--no-generate",
2057
2991
  "--no-verify",
2058
2992
  "--keep-failed",
2993
+ "--keep",
2994
+ "--runtime-probes",
2995
+ "--auth-probes",
2996
+ "--write-report",
2059
2997
  "--tenant-scoped",
2060
2998
  "--field",
2061
2999
  "--fields",
@@ -2068,6 +3006,11 @@ export function hasUnknownOption(argv: string[]): string | null {
2068
3006
  "--policy",
2069
3007
  "--emit",
2070
3008
  "--event",
3009
+ "--entry",
3010
+ "--change",
3011
+ "--proof",
3012
+ "--handoff",
3013
+ "--current",
2071
3014
  "--trigger",
2072
3015
  "--component",
2073
3016
  "--framework",
@@ -2095,6 +3038,7 @@ export function hasUnknownOption(argv: string[]): string | null {
2095
3038
  "--video",
2096
3039
  "--base-url",
2097
3040
  "--runtime-url",
3041
+ "--workspace",
2098
3042
  "--reuse-servers",
2099
3043
  "--start-servers",
2100
3044
  "--scenario",
@@ -2103,10 +3047,13 @@ export function hasUnknownOption(argv: string[]): string | null {
2103
3047
  "--timeout",
2104
3048
  "--name",
2105
3049
  "--auth-token",
3050
+ "--auth",
2106
3051
  "--update",
2107
3052
  "--allow-high-risk",
2108
3053
  "--to",
2109
3054
  "--changed",
3055
+ "--authored",
3056
+ "--review",
2110
3057
  "--env",
2111
3058
  "--input",
2112
3059
  "--provider",
@@ -2114,10 +3061,17 @@ export function hasUnknownOption(argv: string[]): string | null {
2114
3061
  "--release",
2115
3062
  "--allow-dirty",
2116
3063
  "--allow-public-sourcemaps",
3064
+ "--allow-missing-local-release",
3065
+ "--prepared-only",
3066
+ "--build",
3067
+ "--install-venv",
2117
3068
  "--with-release",
2118
3069
  "--concurrency",
3070
+ "--iterations",
3071
+ "--warmups",
2119
3072
  "--sandbox-backend",
2120
3073
  "--skip-tests",
3074
+ "--test-jobs",
2121
3075
  "--skip-typecheck",
2122
3076
  "--skip-eslint",
2123
3077
  "--mock",
@@ -2127,11 +3081,19 @@ export function hasUnknownOption(argv: string[]): string | null {
2127
3081
  "--watch",
2128
3082
  "--no-watch",
2129
3083
  "--db",
3084
+ "--adapter",
3085
+ "--local",
2130
3086
  "--database-url",
2131
3087
  "--worker",
2132
3088
  "--no-worker",
3089
+ "--no-start",
3090
+ "--no-bridge",
3091
+ "--probe",
3092
+ "--probe-codex-server",
2133
3093
  "--once",
2134
3094
  "--limit",
3095
+ "--kind",
3096
+ "--session",
2135
3097
  "--input",
2136
3098
  "--args",
2137
3099
  "--step",
@@ -2140,12 +3102,18 @@ export function hasUnknownOption(argv: string[]): string | null {
2140
3102
  "--telemetry",
2141
3103
  "--user-id",
2142
3104
  "--tenant-id",
3105
+ "--tenant",
3106
+ "--other-tenant",
2143
3107
  "--role",
2144
3108
  "--strict-policies",
2145
3109
  "--strict",
2146
3110
  "--strict-secrets",
3111
+ "--internal",
2147
3112
  "--env-file",
3113
+ "--skip-startup-console",
2148
3114
  "--redacted",
3115
+ "--older-than",
3116
+ "--output",
2149
3117
  "--mock-ai",
2150
3118
  "--ai",
2151
3119
  "--provider",
@@ -2153,12 +3121,19 @@ export function hasUnknownOption(argv: string[]): string | null {
2153
3121
  "--prompt",
2154
3122
  "--url",
2155
3123
  "--template",
3124
+ "--templates",
2156
3125
  "--package-manager",
3126
+ "--package-managers",
2157
3127
  "--forge-spec",
2158
3128
  "--local-forge",
2159
3129
  "--install",
2160
3130
  "--no-install",
3131
+ "--git",
2161
3132
  "--no-git",
3133
+ "--field-test",
3134
+ "--commit-ready",
3135
+ "--detach",
3136
+ "--ergonomics",
2162
3137
  "--with-web",
2163
3138
  "--no-web",
2164
3139
  "--api-only",
@@ -2167,12 +3142,29 @@ export function hasUnknownOption(argv: string[]): string | null {
2167
3142
  "--postgres-version",
2168
3143
  "--runtime-port",
2169
3144
  "--web-port",
3145
+ "--preview-port",
3146
+ "--preview-url",
3147
+ "--studio-url",
3148
+ "--interval-ms",
3149
+ "--workspace-id",
2170
3150
  "--poll-interval",
2171
3151
  "--allow-dev-auth",
2172
3152
  "--token",
3153
+ "--prod",
3154
+ "--production",
3155
+ "--scenario",
3156
+ "--reason",
2173
3157
  "--no-preserve-user-sections",
2174
3158
  "--no-skills",
2175
3159
  "--no-rules",
3160
+ "--full",
3161
+ "--brief",
3162
+ "--verbose",
3163
+ "--run-tests",
3164
+ "--model-level",
3165
+ "--live",
3166
+ "--no-delta",
3167
+ "--format",
2176
3168
  ]);
2177
3169
 
2178
3170
  for (let index = 0; index < argv.length; index++) {
@@ -2183,6 +3175,8 @@ export function hasUnknownOption(argv: string[]): string | null {
2183
3175
  if (known.has(arg)) {
2184
3176
  if (
2185
3177
  arg === "--concurrency" ||
3178
+ arg === "--iterations" ||
3179
+ arg === "--warmups" ||
2186
3180
  arg === "--field" ||
2187
3181
  arg === "--fields" ||
2188
3182
  arg === "--type" ||
@@ -2193,6 +3187,9 @@ export function hasUnknownOption(argv: string[]): string | null {
2193
3187
  arg === "--policy" ||
2194
3188
  arg === "--emit" ||
2195
3189
  arg === "--event" ||
3190
+ arg === "--entry" ||
3191
+ arg === "--change" ||
3192
+ arg === "--proof" ||
2196
3193
  arg === "--trigger" ||
2197
3194
  arg === "--component" ||
2198
3195
  arg === "--package" ||
@@ -2223,24 +3220,37 @@ export function hasUnknownOption(argv: string[]): string | null {
2223
3220
  arg === "--video" ||
2224
3221
  arg === "--base-url" ||
2225
3222
  arg === "--runtime-url" ||
3223
+ arg === "--workspace" ||
2226
3224
  arg === "--scenario" ||
2227
3225
  arg === "--timeout" ||
2228
3226
  arg === "--timeout-ms" ||
3227
+ arg === "--test-jobs" ||
3228
+ arg === "--typechecker" ||
2229
3229
  arg === "--name" ||
3230
+ arg === "--reason" ||
2230
3231
  arg === "--auth-token" ||
3232
+ arg === "--auth" ||
2231
3233
  arg === "--sandbox-backend" ||
2232
3234
  arg === "--port" ||
2233
3235
  arg === "--host" ||
2234
3236
  arg === "--db" ||
3237
+ arg === "--adapter" ||
2235
3238
  arg === "--database-url" ||
2236
3239
  arg === "--limit" ||
3240
+ arg === "--older-than" ||
3241
+ arg === "--output" ||
3242
+ arg === "--kind" ||
3243
+ arg === "--session" ||
2237
3244
  arg === "--input" ||
2238
3245
  arg === "--args" ||
2239
3246
  arg === "--step" ||
2240
3247
  arg === "--sink" ||
2241
3248
  arg === "--file" ||
3249
+ arg === "--write-report" ||
2242
3250
  arg === "--telemetry" ||
2243
3251
  arg === "--user-id" ||
3252
+ arg === "--tenant" ||
3253
+ arg === "--other-tenant" ||
2244
3254
  arg === "--tenant-id" ||
2245
3255
  arg === "--role" ||
2246
3256
  arg === "--strict-policies" ||
@@ -2249,6 +3259,7 @@ export function hasUnknownOption(argv: string[]): string | null {
2249
3259
  arg === "--provider" ||
2250
3260
  arg === "--model" ||
2251
3261
  arg === "--prompt" ||
3262
+ arg === "--format" ||
2252
3263
  arg === "--url" ||
2253
3264
  arg === "--template" ||
2254
3265
  arg === "--package-manager" ||
@@ -2256,6 +3267,11 @@ export function hasUnknownOption(argv: string[]): string | null {
2256
3267
  arg === "--postgres-version" ||
2257
3268
  arg === "--runtime-port" ||
2258
3269
  arg === "--web-port" ||
3270
+ arg === "--preview-port" ||
3271
+ arg === "--preview-url" ||
3272
+ arg === "--studio-url" ||
3273
+ arg === "--interval-ms" ||
3274
+ arg === "--workspace-id" ||
2259
3275
  arg === "--poll-interval" ||
2260
3276
  arg === "--token"
2261
3277
  || arg === "--to" ||