forgeos 0.1.0-alpha.2 → 0.1.0-alpha.21

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 (406) hide show
  1. package/.npmignore +4 -0
  2. package/AGENTS.md +168 -81
  3. package/CHANGELOG.md +211 -0
  4. package/README.md +88 -14
  5. package/adapters/go/README.md +23 -0
  6. package/adapters/go/go.mod +3 -0
  7. package/adapters/go/http.go +149 -0
  8. package/adapters/go/registry.go +234 -0
  9. package/adapters/go/types.go +136 -0
  10. package/adapters/java/README.md +68 -0
  11. package/adapters/java/pom.xml +34 -0
  12. package/adapters/java/src/main/java/dev/forgeos/adapter/Auth.java +20 -0
  13. package/adapters/java/src/main/java/dev/forgeos/adapter/Diagnostic.java +16 -0
  14. package/adapters/java/src/main/java/dev/forgeos/adapter/Entry.java +38 -0
  15. package/adapters/java/src/main/java/dev/forgeos/adapter/EntryKind.java +16 -0
  16. package/adapters/java/src/main/java/dev/forgeos/adapter/ErrorInfo.java +4 -0
  17. package/adapters/java/src/main/java/dev/forgeos/adapter/Forge.java +94 -0
  18. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeCall.java +12 -0
  19. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeContext.java +11 -0
  20. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHandler.java +8 -0
  21. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHttpHandler.java +179 -0
  22. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeRegistry.java +121 -0
  23. package/adapters/java/src/main/java/dev/forgeos/adapter/Json.java +14 -0
  24. package/adapters/java/src/main/java/dev/forgeos/adapter/Manifest.java +14 -0
  25. package/adapters/java/src/main/java/dev/forgeos/adapter/RequestEnvelope.java +6 -0
  26. package/adapters/java/src/main/java/dev/forgeos/adapter/ResponseEnvelope.java +25 -0
  27. package/adapters/java/src/main/java/dev/forgeos/adapter/Risk.java +18 -0
  28. package/adapters/java/src/main/java/dev/forgeos/adapter/Schemas.java +36 -0
  29. package/adapters/java/src/main/java/dev/forgeos/adapter/Service.java +65 -0
  30. package/adapters/java/src/main/java/dev/forgeos/adapter/TransactionMode.java +18 -0
  31. package/adapters/java/src/main/java/dev/forgeos/adapter/TypedForgeHandler.java +6 -0
  32. package/adapters/java/target/classes/dev/forgeos/adapter/Auth.class +0 -0
  33. package/adapters/java/target/classes/dev/forgeos/adapter/Diagnostic.class +0 -0
  34. package/adapters/java/target/classes/dev/forgeos/adapter/Entry.class +0 -0
  35. package/adapters/java/target/classes/dev/forgeos/adapter/EntryKind.class +0 -0
  36. package/adapters/java/target/classes/dev/forgeos/adapter/ErrorInfo.class +0 -0
  37. package/adapters/java/target/classes/dev/forgeos/adapter/Forge.class +0 -0
  38. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeCall.class +0 -0
  39. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeContext.class +0 -0
  40. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeHandler.class +0 -0
  41. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeHttpHandler.class +0 -0
  42. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry$EntryOption.class +0 -0
  43. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry$RegisteredEntry.class +0 -0
  44. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry$RegistryOption.class +0 -0
  45. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry.class +0 -0
  46. package/adapters/java/target/classes/dev/forgeos/adapter/Json.class +0 -0
  47. package/adapters/java/target/classes/dev/forgeos/adapter/Manifest.class +0 -0
  48. package/adapters/java/target/classes/dev/forgeos/adapter/RequestEnvelope.class +0 -0
  49. package/adapters/java/target/classes/dev/forgeos/adapter/ResponseEnvelope.class +0 -0
  50. package/adapters/java/target/classes/dev/forgeos/adapter/Risk.class +0 -0
  51. package/adapters/java/target/classes/dev/forgeos/adapter/Schemas.class +0 -0
  52. package/adapters/java/target/classes/dev/forgeos/adapter/Service.class +0 -0
  53. package/adapters/java/target/classes/dev/forgeos/adapter/TransactionMode.class +0 -0
  54. package/adapters/java/target/classes/dev/forgeos/adapter/TypedForgeHandler.class +0 -0
  55. package/adapters/java/target/forge-java-adapter-0.1.0-alpha.11.jar +0 -0
  56. package/adapters/java/target/maven-archiver/pom.properties +3 -0
  57. package/adapters/java/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +23 -0
  58. package/adapters/java/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +20 -0
  59. package/adapters/java-spring-boot-starter/README.md +32 -0
  60. package/adapters/java-spring-boot-starter/pom.xml +36 -0
  61. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeCommand.java +22 -0
  62. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeExternalService.java +15 -0
  63. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeQuery.java +16 -0
  64. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeServiceBeanCondition.java +18 -0
  65. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringAutoConfiguration.java +16 -0
  66. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringRuntime.java +104 -0
  67. package/adapters/java-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +1 -0
  68. package/adapters/java-spring-boot-starter/target/classes/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +1 -0
  69. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeCommand.class +0 -0
  70. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeExternalService.class +0 -0
  71. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeQuery.class +0 -0
  72. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeServiceBeanCondition.class +0 -0
  73. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeSpringAutoConfiguration.class +0 -0
  74. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeSpringRuntime.class +0 -0
  75. package/adapters/java-spring-boot-starter/target/forge-java-spring-boot-starter-0.1.0-alpha.11.jar +0 -0
  76. package/adapters/java-spring-boot-starter/target/maven-archiver/pom.properties +3 -0
  77. package/adapters/java-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +6 -0
  78. package/adapters/java-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +6 -0
  79. package/bin/forge.mjs +18 -0
  80. package/docs/changelog.md +242 -0
  81. package/docs/forge-protocol.md +189 -0
  82. package/examples/go-billing/go.mod +7 -0
  83. package/examples/go-billing/main.go +120 -0
  84. package/examples/java-billing/pom.xml +52 -0
  85. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/CreateInvoiceInput.java +4 -0
  86. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Invoice.java +11 -0
  87. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Main.java +127 -0
  88. package/examples/java-billing/target/classes/dev/forgeos/examples/billing/CreateInvoiceInput.class +0 -0
  89. package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Invoice.class +0 -0
  90. package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main$EmptyInput.class +0 -0
  91. package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main$Options.class +0 -0
  92. package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main.class +0 -0
  93. package/examples/java-billing/target/java-billing-0.1.0-alpha.11-all.jar +0 -0
  94. package/examples/java-billing/target/java-billing-0.1.0-alpha.11.jar +0 -0
  95. package/examples/java-billing/target/maven-archiver/pom.properties +3 -0
  96. package/examples/java-billing/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +5 -0
  97. package/examples/java-billing/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +3 -0
  98. package/package.json +29 -7
  99. package/schemas/forge-manifest.schema.json +57 -0
  100. package/src/forge/_generated/releaseManifest.json +1 -2
  101. package/src/forge/_generated/releaseManifest.ts +3 -3
  102. package/src/forge/agent-adapters/index.ts +1511 -123
  103. package/src/forge/agent-adapters/types.ts +216 -1
  104. package/src/forge/agent-memory/bridge.ts +1245 -0
  105. package/src/forge/agent-memory/context-pack.ts +151 -0
  106. package/src/forge/agent-memory/hook-runner.ts +312 -0
  107. package/src/forge/agent-memory/mcp.ts +224 -0
  108. package/src/forge/agent-memory/normalize.ts +498 -0
  109. package/src/forge/agent-memory/redaction.ts +103 -0
  110. package/src/forge/agent-memory/sources/claude-code.ts +51 -0
  111. package/src/forge/agent-memory/sources/codex-hook-runner.mjs +273 -0
  112. package/src/forge/agent-memory/sources/codex.ts +119 -0
  113. package/src/forge/agent-memory/sources/cursor.ts +35 -0
  114. package/src/forge/agent-memory/types.ts +191 -0
  115. package/src/forge/bench.ts +248 -0
  116. package/src/forge/brownfield-import/index.ts +801 -0
  117. package/src/forge/brownfield-import/types.ts +127 -0
  118. package/src/forge/cair/action-journal.ts +61 -0
  119. package/src/forge/cair/action-parser.ts +314 -0
  120. package/src/forge/cair/action-validator.ts +40 -0
  121. package/src/forge/cair/actions.ts +1818 -0
  122. package/src/forge/cair/format.ts +77 -0
  123. package/src/forge/cair/index.ts +106 -0
  124. package/src/forge/cair/query.ts +478 -0
  125. package/src/forge/cair/snapshot.ts +315 -0
  126. package/src/forge/cair/types.ts +248 -0
  127. package/src/forge/cli/ai.ts +671 -3
  128. package/src/forge/cli/auth.ts +36 -1
  129. package/src/forge/cli/build.ts +20 -4
  130. package/src/forge/cli/changed.ts +300 -0
  131. package/src/forge/cli/codex-app-server.ts +877 -0
  132. package/src/forge/cli/commands.ts +1285 -7
  133. package/src/forge/cli/db.ts +121 -2
  134. package/src/forge/cli/deps.ts +79 -12
  135. package/src/forge/cli/dev.ts +502 -38
  136. package/src/forge/cli/docs.ts +265 -0
  137. package/src/forge/cli/handoff.ts +250 -0
  138. package/src/forge/cli/index.ts +1 -0
  139. package/src/forge/cli/main.ts +49 -3
  140. package/src/forge/cli/new.ts +3 -1
  141. package/src/forge/cli/next-actions.ts +23 -0
  142. package/src/forge/cli/output.ts +290 -1
  143. package/src/forge/cli/parse.ts +770 -36
  144. package/src/forge/cli/query.ts +32 -0
  145. package/src/forge/cli/release.ts +35 -11
  146. package/src/forge/cli/rls.ts +568 -17
  147. package/src/forge/cli/run.ts +41 -0
  148. package/src/forge/cli/secrets.ts +46 -1
  149. package/src/forge/cli/security.ts +381 -0
  150. package/src/forge/cli/self-host.ts +56 -14
  151. package/src/forge/cli/studio.ts +2163 -0
  152. package/src/forge/cli/verify.ts +1422 -32
  153. package/src/forge/compiler/agent-contract/build.ts +725 -41
  154. package/src/forge/compiler/agent-contract/types.ts +85 -0
  155. package/src/forge/compiler/ai-registry/build.ts +62 -1
  156. package/src/forge/compiler/ai-registry/constants.ts +1 -1
  157. package/src/forge/compiler/ai-registry/parse.ts +168 -5
  158. package/src/forge/compiler/api-surface/build.ts +47 -0
  159. package/src/forge/compiler/app-graph/build.ts +68 -8
  160. package/src/forge/compiler/app-graph/extract.ts +107 -0
  161. package/src/forge/compiler/app-graph/forge-apis.ts +1 -0
  162. package/src/forge/compiler/app-graph/module-graph.ts +73 -78
  163. package/src/forge/compiler/app-graph/parser.ts +24 -24
  164. package/src/forge/compiler/app-graph/profile.ts +26 -0
  165. package/src/forge/compiler/app-graph/versions.ts +1 -1
  166. package/src/forge/compiler/classifier/capabilities.ts +3 -2
  167. package/src/forge/compiler/classifier/classify.ts +32 -8
  168. package/src/forge/compiler/classifier/secrets.ts +3 -2
  169. package/src/forge/compiler/classifier/signals.ts +91 -1
  170. package/src/forge/compiler/client-sdk/build-manifest.ts +59 -0
  171. package/src/forge/compiler/client-sdk/render-client.ts +188 -13
  172. package/src/forge/compiler/data-graph/parse.ts +3 -3
  173. package/src/forge/compiler/data-graph/sql/ddl.ts +60 -2
  174. package/src/forge/compiler/data-graph/sql/serialize.ts +4 -0
  175. package/src/forge/compiler/data-graph/sql/types.ts +1 -0
  176. package/src/forge/compiler/dev-manifest/build.ts +3 -0
  177. package/src/forge/compiler/diagnostics/codes.ts +35 -0
  178. package/src/forge/compiler/diagnostics/create.ts +8 -3
  179. package/src/forge/compiler/diagnostics/index.ts +2 -0
  180. package/src/forge/compiler/emitter/barrel.ts +3 -0
  181. package/src/forge/compiler/emitter/render.ts +5 -0
  182. package/src/forge/compiler/external-manifest/registry.ts +205 -0
  183. package/src/forge/compiler/external-manifest/types.ts +91 -0
  184. package/src/forge/compiler/external-manifest/validate.ts +373 -0
  185. package/src/forge/compiler/frontend-graph/build.ts +85 -13
  186. package/src/forge/compiler/integration/add.ts +498 -22
  187. package/src/forge/compiler/integration/snapshot.ts +2 -0
  188. package/src/forge/compiler/make-registry/build.ts +19 -7
  189. package/src/forge/compiler/orchestrator/plan-profile.ts +23 -0
  190. package/src/forge/compiler/orchestrator/plan.ts +78 -7
  191. package/src/forge/compiler/orchestrator/profile.ts +65 -0
  192. package/src/forge/compiler/orchestrator/run.ts +97 -31
  193. package/src/forge/compiler/orchestrator/serialize.ts +101 -8
  194. package/src/forge/compiler/package-graph/compiler.ts +13 -3
  195. package/src/forge/compiler/package-manager/adapter.ts +4 -1
  196. package/src/forge/compiler/package-manager/commands.ts +4 -0
  197. package/src/forge/compiler/package-manager/executor.ts +30 -1
  198. package/src/forge/compiler/policy-registry/build.ts +44 -1
  199. package/src/forge/compiler/test-graph/build.ts +11 -3
  200. package/src/forge/compiler/types/ai-registry.ts +25 -1
  201. package/src/forge/compiler/types/app-graph.ts +9 -2
  202. package/src/forge/compiler/types/cli.ts +76 -1
  203. package/src/forge/compiler/types/dev-manifest.ts +3 -0
  204. package/src/forge/compiler/types/frontend-graph.ts +2 -2
  205. package/src/forge/delta/classifier.ts +52 -0
  206. package/src/forge/delta/explain.ts +126 -0
  207. package/src/forge/delta/git-observer.ts +43 -0
  208. package/src/forge/delta/ids.ts +44 -0
  209. package/src/forge/delta/index.ts +13 -0
  210. package/src/forge/delta/recorder.ts +402 -0
  211. package/src/forge/delta/redaction.ts +50 -0
  212. package/src/forge/delta/schema.ts +240 -0
  213. package/src/forge/delta/session.ts +142 -0
  214. package/src/forge/delta/status.ts +489 -0
  215. package/src/forge/delta/store.ts +2975 -0
  216. package/src/forge/delta/timeline.ts +104 -0
  217. package/src/forge/dev/server.ts +768 -15
  218. package/src/forge/dev/types.ts +15 -1
  219. package/src/forge/dev/watch.ts +17 -7
  220. package/src/forge/dev-console/cycle.ts +233 -21
  221. package/src/forge/dev-console/types.ts +46 -1
  222. package/src/forge/impact/index.ts +46 -8
  223. package/src/forge/impact/types.ts +6 -0
  224. package/src/forge/intent/index.ts +35 -16
  225. package/src/forge/make/index.ts +149 -6
  226. package/src/forge/make/templates.ts +343 -2
  227. package/src/forge/make/types.ts +3 -1
  228. package/src/forge/refactor/index.ts +1 -0
  229. package/src/forge/repair/rules/index.ts +2 -2
  230. package/src/forge/review/index.ts +158 -12
  231. package/src/forge/review/types.ts +15 -0
  232. package/src/forge/runtime/ai/context.ts +210 -5
  233. package/src/forge/runtime/ai/types.ts +70 -0
  234. package/src/forge/runtime/auth/claims.ts +32 -0
  235. package/src/forge/runtime/auth/errors.ts +2 -0
  236. package/src/forge/runtime/context/create-context.ts +30 -6
  237. package/src/forge/runtime/db/generated-client.ts +13 -2
  238. package/src/forge/runtime/db/memory-adapter.ts +2 -2
  239. package/src/forge/runtime/db/pglite-adapter.ts +77 -2
  240. package/src/forge/runtime/db/postgres-adapter.ts +6 -3
  241. package/src/forge/runtime/executor.ts +112 -2
  242. package/src/forge/runtime/external/bridge.ts +649 -0
  243. package/src/forge/runtime/runner/run-entry.ts +16 -7
  244. package/src/forge/runtime/telemetry/scrubber.ts +91 -10
  245. package/src/forge/runtime/webhooks/security.ts +184 -0
  246. package/src/forge/server.ts +100 -2
  247. package/src/forge/version.ts +1 -1
  248. package/src/forge/vue/index.ts +407 -0
  249. package/src/forge/workspace/change-summary.ts +209 -0
  250. package/src/forge/workspace/forge-cli.ts +14 -0
  251. package/src/forge/workspace/git-summary.ts +279 -0
  252. package/templates/agent-workroom/AGENTS.md +29 -0
  253. package/templates/agent-workroom/README.md +34 -0
  254. package/templates/agent-workroom/forge.config.ts +3 -0
  255. package/templates/agent-workroom/package.json +33 -0
  256. package/templates/agent-workroom/src/actions/indexAgentSignal.ts +10 -0
  257. package/templates/agent-workroom/src/commands/openWorkroom.ts +61 -0
  258. package/templates/agent-workroom/src/commands/recordAgentSignal.ts +119 -0
  259. package/templates/agent-workroom/src/commands/recordCheckRun.ts +52 -0
  260. package/templates/agent-workroom/src/forge/schema.ts +54 -0
  261. package/templates/agent-workroom/src/policies.ts +6 -0
  262. package/templates/agent-workroom/src/queries/listWorkrooms.ts +11 -0
  263. package/templates/agent-workroom/src/queries/liveWorkroom.ts +63 -0
  264. package/templates/agent-workroom/tsconfig.json +16 -0
  265. package/templates/agent-workroom/web/index.html +12 -0
  266. package/templates/agent-workroom/web/package.json +21 -0
  267. package/templates/agent-workroom/web/src/App.tsx +345 -0
  268. package/templates/agent-workroom/web/src/lib/forge.ts +13 -0
  269. package/templates/agent-workroom/web/src/main.tsx +13 -0
  270. package/templates/agent-workroom/web/src/styles.css +545 -0
  271. package/templates/agent-workroom/web/tsconfig.json +27 -0
  272. package/templates/b2b-support-web/package.json +2 -0
  273. package/templates/b2b-support-web/tsconfig.json +4 -1
  274. package/templates/b2b-support-web/web/package.json +1 -1
  275. package/templates/minimal-web/package.json +2 -1
  276. package/templates/minimal-web/tsconfig.json +3 -1
  277. package/templates/minimal-web/web/package.json +2 -2
  278. package/src/forge/_generated/actionSubscriptions.json +0 -2
  279. package/src/forge/_generated/actionSubscriptions.ts +0 -10
  280. package/src/forge/_generated/agentAdapterManifest.json +0 -2
  281. package/src/forge/_generated/agentAdapterManifest.ts +0 -73
  282. package/src/forge/_generated/agentContract.json +0 -2
  283. package/src/forge/_generated/agentContract.ts +0 -7696
  284. package/src/forge/_generated/agentQuickstart.md +0 -32
  285. package/src/forge/_generated/aiContext.ts +0 -59
  286. package/src/forge/_generated/aiModels.json +0 -2
  287. package/src/forge/_generated/aiModels.ts +0 -35
  288. package/src/forge/_generated/aiProviders.json +0 -2
  289. package/src/forge/_generated/aiProviders.ts +0 -23
  290. package/src/forge/_generated/aiRegistry.json +0 -2
  291. package/src/forge/_generated/aiRegistry.ts +0 -29
  292. package/src/forge/_generated/api.json +0 -2
  293. package/src/forge/_generated/api.ts +0 -8
  294. package/src/forge/_generated/appGraph.json +0 -2
  295. package/src/forge/_generated/appGraph.ts +0 -14667
  296. package/src/forge/_generated/appMap.md +0 -35
  297. package/src/forge/_generated/artifactManifest.json +0 -2
  298. package/src/forge/_generated/artifactManifest.ts +0 -7
  299. package/src/forge/_generated/authClaims.json +0 -2
  300. package/src/forge/_generated/authClaims.ts +0 -13
  301. package/src/forge/_generated/authConfig.json +0 -2
  302. package/src/forge/_generated/authConfig.ts +0 -17
  303. package/src/forge/_generated/authContext.ts +0 -23
  304. package/src/forge/_generated/authRegistry.json +0 -2
  305. package/src/forge/_generated/authRegistry.ts +0 -25
  306. package/src/forge/_generated/buildInfo.json +0 -2
  307. package/src/forge/_generated/buildInfo.ts +0 -9
  308. package/src/forge/_generated/capabilityMap.json +0 -2
  309. package/src/forge/_generated/capabilityMap.md +0 -15
  310. package/src/forge/_generated/capabilityMap.ts +0 -17
  311. package/src/forge/_generated/client.ts +0 -282
  312. package/src/forge/_generated/clientApi.ts +0 -9
  313. package/src/forge/_generated/clientManifest.json +0 -2
  314. package/src/forge/_generated/clientManifest.ts +0 -39
  315. package/src/forge/_generated/clientTypes.ts +0 -78
  316. package/src/forge/_generated/configRegistry.json +0 -2
  317. package/src/forge/_generated/configRegistry.ts +0 -4
  318. package/src/forge/_generated/dataGraph.json +0 -2
  319. package/src/forge/_generated/dataGraph.ts +0 -8
  320. package/src/forge/_generated/db.json +0 -2
  321. package/src/forge/_generated/db.ts +0 -2
  322. package/src/forge/_generated/dbSecurityManifest.json +0 -2
  323. package/src/forge/_generated/dbSecurityManifest.ts +0 -15
  324. package/src/forge/_generated/dbSessionContext.json +0 -2
  325. package/src/forge/_generated/dbSessionContext.ts +0 -39
  326. package/src/forge/_generated/deployManifest.json +0 -2
  327. package/src/forge/_generated/deployManifest.ts +0 -14
  328. package/src/forge/_generated/devManifest.json +0 -2
  329. package/src/forge/_generated/devManifest.ts +0 -47
  330. package/src/forge/_generated/envSchema.json +0 -2
  331. package/src/forge/_generated/envSchema.ts +0 -59
  332. package/src/forge/_generated/frontendGraph.json +0 -2
  333. package/src/forge/_generated/frontendGraph.ts +0 -27
  334. package/src/forge/_generated/importGuards.json +0 -2
  335. package/src/forge/_generated/importGuards.ts +0 -686
  336. package/src/forge/_generated/index.ts +0 -67
  337. package/src/forge/_generated/liveProductionManifest.json +0 -2
  338. package/src/forge/_generated/liveProductionManifest.ts +0 -23
  339. package/src/forge/_generated/liveProtocol.json +0 -2
  340. package/src/forge/_generated/liveProtocol.ts +0 -21
  341. package/src/forge/_generated/liveQueryRegistry.json +0 -2
  342. package/src/forge/_generated/liveQueryRegistry.ts +0 -9
  343. package/src/forge/_generated/liveTransportConfig.json +0 -2
  344. package/src/forge/_generated/liveTransportConfig.ts +0 -19
  345. package/src/forge/_generated/makeRegistry.json +0 -2
  346. package/src/forge/_generated/makeRegistry.ts +0 -163
  347. package/src/forge/_generated/makeTemplates.json +0 -2
  348. package/src/forge/_generated/makeTemplates.ts +0 -61
  349. package/src/forge/_generated/mockMap.json +0 -2
  350. package/src/forge/_generated/mockMap.ts +0 -7
  351. package/src/forge/_generated/operationPlaybooks.md +0 -147
  352. package/src/forge/_generated/packageGraph.json +0 -2
  353. package/src/forge/_generated/packageGraph.ts +0 -245249
  354. package/src/forge/_generated/packageUpgradeRegistry.json +0 -2
  355. package/src/forge/_generated/packageUpgradeRegistry.ts +0 -15
  356. package/src/forge/_generated/permissionMatrix.json +0 -2
  357. package/src/forge/_generated/permissionMatrix.ts +0 -7
  358. package/src/forge/_generated/policyRegistry.json +0 -2
  359. package/src/forge/_generated/policyRegistry.ts +0 -11
  360. package/src/forge/_generated/queryRegistry.json +0 -2
  361. package/src/forge/_generated/queryRegistry.ts +0 -9
  362. package/src/forge/_generated/react.d.ts +0 -22
  363. package/src/forge/_generated/react.ts +0 -29
  364. package/src/forge/_generated/reactManifest.json +0 -2
  365. package/src/forge/_generated/reactManifest.ts +0 -19
  366. package/src/forge/_generated/rlsPolicies.json +0 -2
  367. package/src/forge/_generated/rlsPolicies.sql +0 -34
  368. package/src/forge/_generated/rlsPolicies.ts +0 -6
  369. package/src/forge/_generated/runtimeGraph.json +0 -2
  370. package/src/forge/_generated/runtimeGraph.ts +0 -8
  371. package/src/forge/_generated/runtimeMatrix.json +0 -2
  372. package/src/forge/_generated/runtimeMatrix.ts +0 -327385
  373. package/src/forge/_generated/runtimeRegistry.ts +0 -2
  374. package/src/forge/_generated/runtimeRules.md +0 -79
  375. package/src/forge/_generated/secretRegistry.json +0 -2
  376. package/src/forge/_generated/secretRegistry.ts +0 -50
  377. package/src/forge/_generated/secretsContext.ts +0 -11
  378. package/src/forge/_generated/serverApi.ts +0 -10
  379. package/src/forge/_generated/sourceMapManifest.json +0 -2
  380. package/src/forge/_generated/sourceMapManifest.ts +0 -7
  381. package/src/forge/_generated/sqlPlan.json +0 -2
  382. package/src/forge/_generated/sqlPlan.ts +0 -88
  383. package/src/forge/_generated/subscriptionManifest.json +0 -2
  384. package/src/forge/_generated/subscriptionManifest.ts +0 -7
  385. package/src/forge/_generated/symbolicationManifest.json +0 -2
  386. package/src/forge/_generated/symbolicationManifest.ts +0 -17
  387. package/src/forge/_generated/telemetryRegistry.json +0 -2
  388. package/src/forge/_generated/telemetryRegistry.ts +0 -9
  389. package/src/forge/_generated/telemetrySinks.json +0 -2
  390. package/src/forge/_generated/telemetrySinks.ts +0 -11
  391. package/src/forge/_generated/tenantScope.json +0 -2
  392. package/src/forge/_generated/tenantScope.ts +0 -8
  393. package/src/forge/_generated/testGraph.json +0 -2
  394. package/src/forge/_generated/testGraph.ts +0 -3108
  395. package/src/forge/_generated/testPlanRegistry.json +0 -2
  396. package/src/forge/_generated/testPlanRegistry.ts +0 -33
  397. package/src/forge/_generated/uiRoutes.json +0 -2
  398. package/src/forge/_generated/uiRoutes.ts +0 -16
  399. package/src/forge/_generated/uiScenarios.json +0 -2
  400. package/src/forge/_generated/uiScenarios.ts +0 -30
  401. package/src/forge/_generated/uiTestManifest.json +0 -2
  402. package/src/forge/_generated/uiTestManifest.ts +0 -27
  403. package/src/forge/_generated/workflowRegistry.json +0 -2
  404. package/src/forge/_generated/workflowRegistry.ts +0 -9
  405. package/src/forge/_generated/workflowSubscriptions.json +0 -2
  406. package/src/forge/_generated/workflowSubscriptions.ts +0 -10
@@ -14,9 +14,11 @@ 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";
19
20
  import type { RlsSubcommand } from "./rls.ts";
21
+ import type { SecuritySubcommand } from "./security.ts";
20
22
  import type { DepsSubcommand } from "./deps.ts";
21
23
  import type { ReleaseAction, ReleaseArea } from "./release.ts";
22
24
  import type { MakeCommandOptions, MakePrimitive } from "../make/types.ts";
@@ -46,8 +48,12 @@ import type {
46
48
  UiVideoMode,
47
49
  } from "../ui/types.ts";
48
50
  import type { ForgeDoOptions } from "../intent/types.ts";
51
+ import type { BenchCommandOptions, BenchSubcommand } from "../bench.ts";
52
+ import type { BrownfieldImportCommandOptions } from "../brownfield-import/types.ts";
53
+ import type { CairCommandOptions, CairSubcommand } from "../cair/types.ts";
49
54
 
50
55
  export type ForgeCommand =
56
+ | { kind: "version"; json: boolean }
51
57
  | {
52
58
  kind: "new";
53
59
  name: string;
@@ -89,6 +95,15 @@ export type ForgeCommand =
89
95
  postgresVersion: string;
90
96
  runtimePort: number;
91
97
  webPort: number;
98
+ preparedOnly?: boolean;
99
+ workspaceRoot: string;
100
+ }
101
+ | {
102
+ kind: "docs";
103
+ subcommand: DocsSubcommand;
104
+ json: boolean;
105
+ build: boolean;
106
+ installVenv: boolean;
92
107
  workspaceRoot: string;
93
108
  }
94
109
  | {
@@ -97,8 +112,17 @@ export type ForgeCommand =
97
112
  json: boolean;
98
113
  workspaceRoot: string;
99
114
  }
100
- | { kind: "doctor"; target?: "project" | "windows"; json: boolean; workspaceRoot: string }
115
+ | { kind: "doctor"; target?: "project" | "windows" | "agent"; agentTarget?: AgentAdapterTarget; json: boolean; workspaceRoot: string }
101
116
  | { kind: "setup"; target: "windows"; json: boolean; yes: boolean; workspaceRoot: string }
117
+ | {
118
+ kind: "security";
119
+ subcommand: SecuritySubcommand;
120
+ db: DbAdapterKind;
121
+ databaseUrl?: string;
122
+ json: boolean;
123
+ runTests: boolean;
124
+ workspaceRoot: string;
125
+ }
102
126
  | {
103
127
  kind: "auth";
104
128
  subcommand: AuthSubcommand;
@@ -141,6 +165,7 @@ export type ForgeCommand =
141
165
  json: boolean;
142
166
  allowDirty: boolean;
143
167
  allowPublicSourcemaps: boolean;
168
+ allowMissingLocalRelease?: boolean;
144
169
  workspaceRoot: string;
145
170
  }
146
171
  | { kind: "make"; options: MakeCommandOptions }
@@ -150,12 +175,59 @@ export type ForgeCommand =
150
175
  | { kind: "test"; options: TestCommandOptions }
151
176
  | { kind: "repair"; options: RepairCommandOptions }
152
177
  | { kind: "do"; options: ForgeDoOptions }
178
+ | { kind: "bench"; options: BenchCommandOptions }
179
+ | { kind: "cair"; options: CairCommandOptions }
153
180
  | { kind: "agent"; options: AgentCommandOptions }
181
+ | { kind: "mcp"; subcommand: "serve"; workspaceRoot: string }
154
182
  | { kind: "review"; options: ReviewCommandOptions }
155
183
  | { kind: "ui"; options: UiCommandOptions }
156
- | { kind: "generate"; check: boolean; dryRun: boolean; json: boolean; concurrency: number }
184
+ | { kind: "manifest"; subcommand: "validate" | "import"; path: string; json: boolean; workspaceRoot: string }
185
+ | { kind: "import"; options: BrownfieldImportCommandOptions }
186
+ | { kind: "delta"; subcommand: "status" | "repair"; json: boolean; workspaceRoot: string; dryRun: boolean; yes: boolean; verbose: boolean }
187
+ | { kind: "status"; json: boolean; workspaceRoot: string }
188
+ | { kind: "changed"; json: boolean; authoredOnly: boolean; workspaceRoot: string }
189
+ | { kind: "diff"; target: "authored" | "generated" | "full"; json: boolean; workspaceRoot: string }
190
+ | { kind: "handoff"; json: boolean; workspaceRoot: string }
191
+ | {
192
+ kind: "studio";
193
+ subcommand: "attach" | "snapshot" | "watch" | "open" | "doctor" | "bridge" | "codex-server";
194
+ path?: string;
195
+ previewUrl?: string;
196
+ previewPort?: number;
197
+ studioUrl?: string;
198
+ intervalMs?: number;
199
+ once: boolean;
200
+ workspaceId?: string;
201
+ tenantId?: string;
202
+ userId?: string;
203
+ role?: string;
204
+ targets: string[];
205
+ install?: boolean;
206
+ start?: boolean;
207
+ bridge?: boolean;
208
+ writeSchemas?: boolean;
209
+ probeAppServer?: boolean;
210
+ json: boolean;
211
+ dryRun: boolean;
212
+ force: boolean;
213
+ workspaceRoot: string;
214
+ }
215
+ | { kind: "timeline"; target?: string; kindFilter?: string; sessionId?: string; limit?: number; json: boolean; rebuild: boolean; forAgent: boolean; workspaceRoot: string }
216
+ | { kind: "explain"; thing: string; json: boolean; workspaceRoot: string }
217
+ | {
218
+ kind: "session";
219
+ subcommand: "list" | "show" | "rename" | "merge" | "split" | "detach";
220
+ sessionId?: string;
221
+ sourceSessionId?: string;
222
+ operationId?: string;
223
+ title?: string;
224
+ limit?: number;
225
+ json: boolean;
226
+ workspaceRoot: string;
227
+ }
228
+ | { kind: "generate"; check: boolean; dryRun: boolean; json: boolean; concurrency: number; workspaceRoot: string }
157
229
  | { kind: "add"; alias: string; options: AddOptions & { workspaceRoot: string } }
158
- | { kind: "inspect"; target: InspectTarget; json: boolean; dryRun: boolean }
230
+ | { kind: "inspect"; target: InspectTarget; json: boolean; dryRun: boolean; full: boolean; brief: boolean }
159
231
  | { kind: "check"; json: boolean; dryRun: boolean; strictSecrets: boolean }
160
232
  | { kind: "verify"; options: VerifyOptions }
161
233
  | { kind: "run"; name?: string; list: boolean; json: boolean; mock: boolean; userId?: string; tenantId?: string; role?: string; envFile?: string; workspaceRoot: string; queryMode?: boolean; args?: unknown }
@@ -168,7 +240,7 @@ export type ForgeCommand =
168
240
  once: boolean;
169
241
  watch: boolean;
170
242
  json: boolean;
171
- db: "pglite" | "postgres" | "none";
243
+ db: "memory" | "pglite" | "postgres" | "none";
172
244
  databaseUrl?: string;
173
245
  worker: boolean;
174
246
  withWeb: boolean;
@@ -178,6 +250,7 @@ export type ForgeCommand =
178
250
  webPort?: number;
179
251
  telemetry: string[];
180
252
  envFile?: string;
253
+ skipStartupConsole: boolean;
181
254
  workspaceRoot: string;
182
255
  }
183
256
  | {
@@ -284,6 +357,11 @@ export type ForgeCommand =
284
357
  model?: string;
285
358
  prompt?: string;
286
359
  mock: boolean;
360
+ modelLevel: boolean;
361
+ live: boolean;
362
+ traceId?: string;
363
+ db?: DbAdapterKind;
364
+ databaseUrl?: string;
287
365
  workspaceRoot: string;
288
366
  };
289
367
 
@@ -294,17 +372,21 @@ export interface ParsedCli {
294
372
  }
295
373
 
296
374
  export const TOP_LEVEL_COMMANDS = [
375
+ "version",
297
376
  "new",
298
377
  "build",
299
378
  "serve",
300
379
  "worker",
301
380
  "self-host",
381
+ "docs",
302
382
  "agent-contract",
303
383
  "agent",
384
+ "mcp",
304
385
  "review",
305
386
  "ui",
306
387
  "doctor",
307
388
  "setup",
389
+ "security",
308
390
  "auth",
309
391
  "rls",
310
392
  "deps",
@@ -316,6 +398,19 @@ export const TOP_LEVEL_COMMANDS = [
316
398
  "test",
317
399
  "repair",
318
400
  "do",
401
+ "bench",
402
+ "cair",
403
+ "delta",
404
+ "session",
405
+ "timeline",
406
+ "explain",
407
+ "manifest",
408
+ "import",
409
+ "status",
410
+ "changed",
411
+ "diff",
412
+ "handoff",
413
+ "studio",
319
414
  "generate",
320
415
  "add",
321
416
  "inspect",
@@ -352,6 +447,7 @@ export const INSPECT_TARGETS: InspectTarget[] = [
352
447
  "ai",
353
448
  "queries",
354
449
  "api",
450
+ "external",
355
451
  "client",
356
452
  "frontend",
357
453
  "auth",
@@ -367,9 +463,15 @@ export const INSPECT_TARGETS: InspectTarget[] = [
367
463
  "test-graph",
368
464
  "test-plans",
369
465
  "agent-contract",
466
+ "agent-tools",
370
467
  "agent-adapters",
371
468
  "capability-map",
469
+ "summary",
470
+ "schema",
471
+ "drift",
472
+ "handoff",
372
473
  "framework",
474
+ "imported",
373
475
  "ui",
374
476
  "ui-scenarios",
375
477
  "ui-routes",
@@ -378,7 +480,7 @@ export const INSPECT_TARGETS: InspectTarget[] = [
378
480
  "map",
379
481
  ];
380
482
 
381
- const NEW_TEMPLATES: NewTemplateName[] = ["b2b-support-web", "minimal-web"];
483
+ const NEW_TEMPLATES: NewTemplateName[] = ["agent-workroom", "b2b-support-web", "minimal-web"];
382
484
  const NEW_PACKAGE_MANAGERS: NewPackageManager[] = ["bun", "npm", "pnpm", "yarn"];
383
485
  const SELF_HOST_SUBCOMMANDS: SelfHostSubcommand[] = ["compose", "env", "check", "clean"];
384
486
  const AGENT_CONTRACT_SUBCOMMANDS: AgentContractSubcommand[] = [
@@ -392,8 +494,10 @@ const AUTH_SUBCOMMANDS: AuthSubcommand[] = [
392
494
  "decode",
393
495
  "test-token",
394
496
  "jwks",
497
+ "prove",
395
498
  ];
396
- const RLS_SUBCOMMANDS: RlsSubcommand[] = ["generate", "check", "apply", "test"];
499
+ const SECURITY_SUBCOMMANDS: SecuritySubcommand[] = ["prove"];
500
+ const RLS_SUBCOMMANDS: RlsSubcommand[] = ["generate", "check", "apply", "test", "mutate-test"];
397
501
  const DEPS_SUBCOMMANDS: DepsSubcommand[] = [
398
502
  "outdated",
399
503
  "inspect",
@@ -430,6 +534,7 @@ const MAKE_PRIMITIVES: MakePrimitive[] = [
430
534
  "component",
431
535
  "page",
432
536
  "ui",
537
+ "ai-chat",
433
538
  "resource",
434
539
  "apply",
435
540
  "rollback",
@@ -484,10 +589,18 @@ const AGENT_SUBCOMMANDS: AgentSubcommand[] = [
484
589
  "export",
485
590
  "check",
486
591
  "doctor",
592
+ "onboard",
487
593
  "print-context",
488
594
  "clean",
595
+ "prepare",
596
+ "hooks",
597
+ "install",
598
+ "ingest",
599
+ "context",
600
+ "memory",
601
+ "timeline",
489
602
  ];
490
- const REVIEW_SUBCOMMANDS: ReviewSubcommand[] = ["inspect", "list", "explain"];
603
+ const REVIEW_SUBCOMMANDS: ReviewSubcommand[] = ["run", "inspect", "list", "explain"];
491
604
  const REVIEW_MODES: ReviewMode[] = ["quick", "standard", "strict"];
492
605
  const REVIEW_FAIL_ON: ReviewFailOn[] = ["warning", "error", "blocking"];
493
606
  const REVIEW_CATEGORIES: ReviewFindingCategory[] = [
@@ -518,6 +631,18 @@ const UI_BROWSERS: UiBrowserName[] = ["chromium", "firefox", "webkit"];
518
631
  const UI_TRACE_MODES: UiTraceMode[] = ["on", "off", "retain-on-failure"];
519
632
  const UI_SCREENSHOT_MODES: UiScreenshotMode[] = ["on", "off", "only-on-failure"];
520
633
  const UI_VIDEO_MODES: UiVideoMode[] = ["on", "off", "retain-on-failure"];
634
+ const AI_SUBCOMMANDS: AiSubcommand[] = [
635
+ "providers",
636
+ "check",
637
+ "test",
638
+ "models",
639
+ "tools",
640
+ "agents",
641
+ "redteam",
642
+ "trace",
643
+ ];
644
+ const BENCH_SUBCOMMANDS: BenchSubcommand[] = ["compiler"];
645
+ const CAIR_SUBCOMMANDS: CairSubcommand[] = ["snapshot", "query", "action"];
521
646
 
522
647
  function parseFlag(args: string[], flag: string): boolean {
523
648
  return args.includes(flag);
@@ -542,13 +667,17 @@ function parseOptionValues(args: string[], flag: string): string[] {
542
667
  return values;
543
668
  }
544
669
 
545
- function parseDbKind(value: string | undefined): "pglite" | "postgres" | "none" {
546
- if (value === "postgres" || value === "none") {
670
+ function parseDbKind(value: string | undefined): "memory" | "pglite" | "postgres" | "none" {
671
+ if (value === "memory" || value === "postgres" || value === "none") {
547
672
  return value;
548
673
  }
549
674
  return "pglite";
550
675
  }
551
676
 
677
+ function parsePersistentDbKind(value: string | undefined): DbAdapterKind {
678
+ return parseDbKind(value) === "postgres" ? "postgres" : "pglite";
679
+ }
680
+
552
681
  function parseAdapterKind(value: string | undefined): DbAdapterKind {
553
682
  if (value === "postgres" || value === "memory") {
554
683
  return value;
@@ -566,7 +695,10 @@ function parseSandboxBackend(value: string | undefined): SandboxBackend {
566
695
  function parseAddOptions(
567
696
  args: string[],
568
697
  workspaceRoot: string,
698
+ mode: AddOptions["mode"] = "auto",
569
699
  ): AddOptions & { workspaceRoot: string } {
700
+ const frontend = parseFlag(args, "--frontend");
701
+ const backend = parseFlag(args, "--backend");
570
702
  return {
571
703
  workspaceRoot,
572
704
  json: parseFlag(args, "--json"),
@@ -576,6 +708,9 @@ function parseAddOptions(
576
708
  parseOptionValue(args, "--sandbox-backend"),
577
709
  ),
578
710
  allowScripts: parseFlag(args, "--allow-scripts"),
711
+ mode,
712
+ installWorkspace: parseOptionValue(args, "--workspace"),
713
+ packageTarget: frontend && !backend ? "frontend" : backend ? "backend" : undefined,
579
714
  };
580
715
  }
581
716
 
@@ -655,6 +790,14 @@ export function parseCli(argv: string[]): ParsedCli {
655
790
  const positional = argv.filter((arg) => !arg.startsWith("-"));
656
791
  const workspaceRoot = process.cwd().replace(/\\/g, "/");
657
792
 
793
+ if (parseFlag(argv, "--version") || parseFlag(argv, "-v")) {
794
+ return {
795
+ command: { kind: "version", json: parseFlag(argv, "--json") },
796
+ workspaceRoot,
797
+ errors,
798
+ };
799
+ }
800
+
658
801
  if (positional.length === 0) {
659
802
  errors.push(
660
803
  `missing command; expected ${TOP_LEVEL_COMMANDS.join(", ")}`,
@@ -794,6 +937,26 @@ export function parseCli(argv: string[]): ParsedCli {
794
937
  postgresVersion: parseOptionValue(argv, "--postgres-version") ?? "16",
795
938
  runtimePort: Math.floor(runtimePort),
796
939
  webPort: Math.floor(webPort),
940
+ preparedOnly: parseFlag(argv, "--prepared-only"),
941
+ workspaceRoot,
942
+ },
943
+ workspaceRoot,
944
+ errors,
945
+ };
946
+ }
947
+ case "docs": {
948
+ const subcommand = rest[0] as DocsSubcommand | undefined;
949
+ if (subcommand !== "check") {
950
+ errors.push("forge docs requires subcommand: check");
951
+ return { command: null, workspaceRoot, errors };
952
+ }
953
+ return {
954
+ command: {
955
+ kind: "docs",
956
+ subcommand,
957
+ json: parseFlag(argv, "--json"),
958
+ build: parseFlag(argv, "--build"),
959
+ installVenv: parseFlag(argv, "--install-venv"),
797
960
  workspaceRoot,
798
961
  },
799
962
  workspaceRoot,
@@ -820,12 +983,38 @@ export function parseCli(argv: string[]): ParsedCli {
820
983
  case "agent": {
821
984
  const subcommand = rest[0] as AgentSubcommand | undefined;
822
985
  if (!subcommand || !AGENT_SUBCOMMANDS.includes(subcommand)) {
823
- errors.push("forge agent requires subcommand: list-targets, export, check, doctor, print-context, or clean");
986
+ errors.push("forge agent requires subcommand: list-targets, export, check, doctor, onboard, print-context, clean, prepare, hooks, install, ingest, context, memory, or timeline");
824
987
  return { command: null, workspaceRoot, errors };
825
988
  }
989
+ const inputRaw = parseOptionValue(argv, "--input");
990
+ let input: unknown;
991
+ if (inputRaw !== undefined) {
992
+ try {
993
+ input = JSON.parse(inputRaw);
994
+ } catch {
995
+ errors.push("--input must be valid JSON");
996
+ }
997
+ }
998
+ const limitRaw = parseOptionValue(argv, "--limit");
999
+ const limit = limitRaw ? Number(limitRaw) : undefined;
1000
+ const pollIntervalRaw = parseOptionValue(argv, "--poll-interval");
1001
+ const pollIntervalMs = pollIntervalRaw ? Number(pollIntervalRaw) : undefined;
1002
+ if (limitRaw !== undefined && (!Number.isFinite(limit) || limit! < 1)) {
1003
+ errors.push("--limit must be a number >= 1");
1004
+ }
1005
+ if (
1006
+ pollIntervalRaw !== undefined &&
1007
+ (!Number.isFinite(pollIntervalMs) || pollIntervalMs! < 100)
1008
+ ) {
1009
+ errors.push("--poll-interval must be a number >= 100");
1010
+ }
826
1011
  const target =
827
1012
  (parseOptionValue(argv, "--target") as AgentAdapterTarget | undefined) ??
828
- (subcommand === "export" || subcommand === "clean" ? "generic" : "generic");
1013
+ (subcommand === "install" || subcommand === "ingest" ? rest[1] : undefined) ??
1014
+ (subcommand === "hooks" ? rest[2] : undefined) ??
1015
+ (subcommand === "timeline" ? rest[1] : undefined) ??
1016
+ (subcommand === "timeline" ? "all" : undefined) ??
1017
+ (subcommand === "hooks" || subcommand === "onboard" ? "codex" : "generic");
829
1018
  return {
830
1019
  command: {
831
1020
  kind: "agent",
@@ -839,12 +1028,37 @@ export function parseCli(argv: string[]): ParsedCli {
839
1028
  preserveUserSections: !parseFlag(argv, "--no-preserve-user-sections"),
840
1029
  skills: !parseFlag(argv, "--no-skills"),
841
1030
  rules: !parseFlag(argv, "--no-rules"),
1031
+ eventName: parseOptionValue(argv, "--event"),
1032
+ hookAction: subcommand === "hooks" ? rest[1] : undefined,
1033
+ input,
1034
+ entry: parseOptionValue(argv, "--entry") ?? (subcommand === "context" && rest[1] !== "--current" ? rest[1] : undefined),
1035
+ current: parseFlag(argv, "--current"),
1036
+ limit: limit ? Math.floor(limit) : undefined,
1037
+ watch: parseFlag(argv, "--watch"),
1038
+ file: parseOptionValue(argv, "--file"),
1039
+ pollIntervalMs: pollIntervalMs ? Math.floor(pollIntervalMs) : undefined,
842
1040
  },
843
1041
  },
844
1042
  workspaceRoot,
845
1043
  errors,
846
1044
  };
847
1045
  }
1046
+ case "mcp": {
1047
+ const subcommand = rest[0];
1048
+ if (subcommand !== "serve") {
1049
+ errors.push("forge mcp requires subcommand: serve");
1050
+ return { command: null, workspaceRoot, errors };
1051
+ }
1052
+ return {
1053
+ command: {
1054
+ kind: "mcp",
1055
+ subcommand,
1056
+ workspaceRoot,
1057
+ },
1058
+ workspaceRoot,
1059
+ errors,
1060
+ };
1061
+ }
848
1062
  case "review": {
849
1063
  const requested = rest[0] as ReviewSubcommand | undefined;
850
1064
  const subcommand =
@@ -867,6 +1081,7 @@ export function parseCli(argv: string[]): ParsedCli {
867
1081
  json: parseFlag(argv, "--json"),
868
1082
  md: parseFlag(argv, "--md"),
869
1083
  sarif: parseFlag(argv, "--sarif"),
1084
+ full: parseFlag(argv, "--full"),
870
1085
  write: positionalWrite || parseFlag(argv, "--write"),
871
1086
  changed: parseFlag(argv, "--changed") || noSourceFlag,
872
1087
  staged: parseFlag(argv, "--staged"),
@@ -937,14 +1152,17 @@ export function parseCli(argv: string[]): ParsedCli {
937
1152
  };
938
1153
  }
939
1154
  case "doctor":
940
- if (rest[0] && rest[0] !== "windows") {
941
- errors.push("forge doctor supports subcommand: windows");
1155
+ if (rest[0] && rest[0] !== "windows" && rest[0] !== "agent") {
1156
+ errors.push("forge doctor supports subcommand: windows or agent");
942
1157
  return { command: null, workspaceRoot, errors };
943
1158
  }
944
1159
  return {
945
1160
  command: {
946
1161
  kind: "doctor",
947
- target: rest[0] === "windows" ? "windows" : "project",
1162
+ target: rest[0] === "windows" ? "windows" : rest[0] === "agent" ? "agent" : "project",
1163
+ agentTarget: rest[0] === "agent"
1164
+ ? (parseOptionValue(argv, "--target") as AgentAdapterTarget | undefined) ?? (rest[1] as AgentAdapterTarget | undefined) ?? "codex"
1165
+ : undefined,
948
1166
  json: parseFlag(argv, "--json"),
949
1167
  workspaceRoot,
950
1168
  },
@@ -969,10 +1187,30 @@ export function parseCli(argv: string[]): ParsedCli {
969
1187
  errors,
970
1188
  };
971
1189
  }
1190
+ case "security": {
1191
+ const subcommand = rest[0] as SecuritySubcommand | undefined;
1192
+ if (!subcommand || !SECURITY_SUBCOMMANDS.includes(subcommand)) {
1193
+ errors.push("forge security requires subcommand: prove");
1194
+ return { command: null, workspaceRoot, errors };
1195
+ }
1196
+ return {
1197
+ command: {
1198
+ kind: "security",
1199
+ subcommand,
1200
+ db: parseAdapterKind(parseOptionValue(argv, "--db")),
1201
+ databaseUrl: parseOptionValue(argv, "--database-url"),
1202
+ json: parseFlag(argv, "--json"),
1203
+ runTests: parseFlag(argv, "--full") || parseFlag(argv, "--run-tests"),
1204
+ workspaceRoot,
1205
+ },
1206
+ workspaceRoot,
1207
+ errors,
1208
+ };
1209
+ }
972
1210
  case "auth": {
973
1211
  const subcommand = rest[0] as AuthSubcommand | undefined;
974
1212
  if (!subcommand || !AUTH_SUBCOMMANDS.includes(subcommand)) {
975
- errors.push("forge auth requires subcommand: check, config, decode, test-token, or jwks");
1213
+ errors.push("forge auth requires subcommand: check, config, decode, test-token, jwks, or prove");
976
1214
  return { command: null, workspaceRoot, errors };
977
1215
  }
978
1216
  return {
@@ -990,7 +1228,7 @@ export function parseCli(argv: string[]): ParsedCli {
990
1228
  case "rls": {
991
1229
  const subcommand = rest[0] as RlsSubcommand | undefined;
992
1230
  if (!subcommand || !RLS_SUBCOMMANDS.includes(subcommand)) {
993
- errors.push("forge rls requires subcommand: generate, check, apply, or test");
1231
+ errors.push("forge rls requires subcommand: generate, check, apply, test, or mutate-test");
994
1232
  return { command: null, workspaceRoot, errors };
995
1233
  }
996
1234
  return {
@@ -1063,6 +1301,7 @@ export function parseCli(argv: string[]): ParsedCli {
1063
1301
  json: parseFlag(argv, "--json"),
1064
1302
  allowDirty: parseFlag(argv, "--allow-dirty"),
1065
1303
  allowPublicSourcemaps: parseFlag(argv, "--allow-public-sourcemaps"),
1304
+ allowMissingLocalRelease: parseFlag(argv, "--allow-missing-local-release"),
1066
1305
  workspaceRoot,
1067
1306
  },
1068
1307
  workspaceRoot,
@@ -1082,6 +1321,8 @@ export function parseCli(argv: string[]): ParsedCli {
1082
1321
  ? undefined
1083
1322
  : primitive === "ui"
1084
1323
  ? rest[1] ?? "ui"
1324
+ : primitive === "ai-chat"
1325
+ ? rest[1] ?? "support"
1085
1326
  : rest[1];
1086
1327
  const explainPrimitive =
1087
1328
  primitive === "explain" ? (rest[1] as MakePrimitive | undefined) : undefined;
@@ -1092,7 +1333,7 @@ export function parseCli(argv: string[]): ParsedCli {
1092
1333
  errors.push("forge make explain requires a known primitive");
1093
1334
  }
1094
1335
  if (
1095
- !["list", "explain", "ui"].includes(primitive) &&
1336
+ !["list", "explain", "ui", "ai-chat"].includes(primitive) &&
1096
1337
  !name
1097
1338
  ) {
1098
1339
  errors.push(`forge make ${primitive} requires a name or plan id`);
@@ -1132,7 +1373,7 @@ export function parseCli(argv: string[]): ParsedCli {
1132
1373
  event: parseOptionValue(argv, "--event"),
1133
1374
  trigger: parseOptionValue(argv, "--trigger"),
1134
1375
  component: parseOptionValue(argv, "--component"),
1135
- framework: parseOptionValue(argv, "--framework") as "vite" | "next" | undefined,
1376
+ framework: parseOptionValue(argv, "--framework") as "vite" | "next" | "nuxt" | undefined,
1136
1377
  withAi: parseFlag(argv, "--with-ai"),
1137
1378
  withCrud: parseFlag(argv, "--with-crud"),
1138
1379
  withLiveQuery: parseFlag(argv, "--with-livequery"),
@@ -1411,6 +1652,215 @@ export function parseCli(argv: string[]): ParsedCli {
1411
1652
  errors,
1412
1653
  };
1413
1654
  }
1655
+ case "bench": {
1656
+ const subcommand = rest[0] as BenchSubcommand | undefined;
1657
+ if (!subcommand || !BENCH_SUBCOMMANDS.includes(subcommand)) {
1658
+ errors.push("forge bench requires subcommand: compiler");
1659
+ return { command: null, workspaceRoot, errors };
1660
+ }
1661
+ const iterationsRaw = parseOptionValue(argv, "--iterations");
1662
+ const warmupsRaw = parseOptionValue(argv, "--warmups");
1663
+ const concurrencyRaw = parseOptionValue(argv, "--concurrency");
1664
+ const iterations = iterationsRaw !== undefined ? Number(iterationsRaw) : 5;
1665
+ const warmups = warmupsRaw !== undefined ? Number(warmupsRaw) : 1;
1666
+ const concurrency = concurrencyRaw !== undefined ? Number(concurrencyRaw) : 4;
1667
+ if (!Number.isFinite(iterations) || iterations < 1) {
1668
+ errors.push("--iterations must be a number >= 1");
1669
+ }
1670
+ if (!Number.isFinite(warmups) || warmups < 0) {
1671
+ errors.push("--warmups must be a number >= 0");
1672
+ }
1673
+ if (!Number.isFinite(concurrency) || concurrency < 1) {
1674
+ errors.push("--concurrency must be a number >= 1");
1675
+ }
1676
+ return {
1677
+ command: {
1678
+ kind: "bench",
1679
+ options: {
1680
+ subcommand,
1681
+ workspaceRoot,
1682
+ json: parseFlag(argv, "--json"),
1683
+ iterations: Math.floor(iterations),
1684
+ warmups: Math.floor(warmups),
1685
+ concurrency: Math.floor(concurrency),
1686
+ },
1687
+ },
1688
+ workspaceRoot,
1689
+ errors,
1690
+ };
1691
+ }
1692
+ case "cair": {
1693
+ const subcommand = rest[0] as CairSubcommand | undefined;
1694
+ if (!subcommand || !CAIR_SUBCOMMANDS.includes(subcommand)) {
1695
+ errors.push("forge cair requires subcommand: snapshot, query, or action");
1696
+ return { command: null, workspaceRoot, errors };
1697
+ }
1698
+ const formatRaw = parseOptionValue(argv, "--format");
1699
+ if (formatRaw !== undefined && formatRaw !== "text" && formatRaw !== "json") {
1700
+ errors.push("--format must be text or json");
1701
+ }
1702
+ const query = subcommand === "query" ? rest.slice(1).join(" ").trim() : undefined;
1703
+ if (subcommand === "query" && !query) {
1704
+ errors.push("forge cair query requires a CAIR query, for example: forge cair query \"Q STATUS\"");
1705
+ }
1706
+ const inputPath = parseOptionValue(argv, "--input");
1707
+ const action = subcommand === "action"
1708
+ ? rest.slice(1).filter((part, index, parts) => {
1709
+ const previous = parts[index - 1];
1710
+ if (part === "--dry-run" || part === "--plan" || part === "--json" || part === "--include-generated") {
1711
+ return false;
1712
+ }
1713
+ if (part === "--format" || part === "--input") {
1714
+ return false;
1715
+ }
1716
+ if (previous === "--format" || previous === "--input") {
1717
+ return false;
1718
+ }
1719
+ return true;
1720
+ }).join(" ").trim()
1721
+ : undefined;
1722
+ if (subcommand === "action" && !action && !inputPath) {
1723
+ errors.push("forge cair action requires a CAIR action, for example: forge cair action \"A CREATE.FILE path=src/example.ts\"");
1724
+ }
1725
+ return {
1726
+ command: {
1727
+ kind: "cair",
1728
+ options: {
1729
+ subcommand,
1730
+ workspaceRoot,
1731
+ json: parseFlag(argv, "--json"),
1732
+ format: formatRaw === "json" ? "json" : "text",
1733
+ ...(query ? { query } : {}),
1734
+ ...(action ? { action } : {}),
1735
+ ...(inputPath ? { inputPath } : {}),
1736
+ dryRun: parseFlag(argv, "--dry-run"),
1737
+ plan: parseFlag(argv, "--plan"),
1738
+ allowGenerated: parseFlag(argv, "--include-generated"),
1739
+ },
1740
+ },
1741
+ workspaceRoot,
1742
+ errors,
1743
+ };
1744
+ }
1745
+ case "status":
1746
+ return {
1747
+ command: {
1748
+ kind: "status",
1749
+ json: parseFlag(argv, "--json"),
1750
+ workspaceRoot,
1751
+ },
1752
+ workspaceRoot,
1753
+ errors,
1754
+ };
1755
+ case "changed":
1756
+ return {
1757
+ command: {
1758
+ kind: "changed",
1759
+ json: parseFlag(argv, "--json"),
1760
+ authoredOnly: parseFlag(argv, "--authored"),
1761
+ workspaceRoot,
1762
+ },
1763
+ workspaceRoot,
1764
+ errors,
1765
+ };
1766
+ case "diff": {
1767
+ const target = (rest[0] ?? "authored") as "authored" | "generated" | "full";
1768
+ if (!["authored", "generated", "full"].includes(target)) {
1769
+ errors.push("forge diff requires target: authored, generated, or full");
1770
+ return { command: null, workspaceRoot, errors };
1771
+ }
1772
+ return {
1773
+ command: {
1774
+ kind: "diff",
1775
+ target,
1776
+ json: parseFlag(argv, "--json"),
1777
+ workspaceRoot,
1778
+ },
1779
+ workspaceRoot,
1780
+ errors,
1781
+ };
1782
+ }
1783
+ case "handoff":
1784
+ return {
1785
+ command: {
1786
+ kind: "handoff",
1787
+ json: parseFlag(argv, "--json"),
1788
+ workspaceRoot,
1789
+ },
1790
+ workspaceRoot,
1791
+ errors,
1792
+ };
1793
+ case "studio": {
1794
+ const subcommand = rest[0];
1795
+ if (
1796
+ subcommand !== "attach" &&
1797
+ subcommand !== "snapshot" &&
1798
+ subcommand !== "watch" &&
1799
+ subcommand !== "open" &&
1800
+ subcommand !== "doctor" &&
1801
+ subcommand !== "bridge" &&
1802
+ subcommand !== "codex-server"
1803
+ ) {
1804
+ errors.push("forge studio requires subcommand: attach, snapshot, watch, open, doctor, bridge, or codex-server");
1805
+ return { command: null, workspaceRoot, errors };
1806
+ }
1807
+ const previewPortRaw = parseOptionValue(argv, "--preview-port");
1808
+ const previewPort = previewPortRaw !== undefined ? Number(previewPortRaw) : undefined;
1809
+ if (
1810
+ previewPortRaw !== undefined &&
1811
+ (!Number.isInteger(previewPort) || previewPort! < 1)
1812
+ ) {
1813
+ errors.push("--preview-port must be an integer >= 1");
1814
+ }
1815
+ const intervalRaw = parseOptionValue(argv, "--interval-ms");
1816
+ const intervalMs = intervalRaw !== undefined ? Number(intervalRaw) : undefined;
1817
+ if (intervalRaw !== undefined && (!Number.isFinite(intervalMs) || intervalMs! < 1000)) {
1818
+ errors.push("--interval-ms must be a number >= 1000");
1819
+ }
1820
+ const targets = parseOptionValues(argv, "--target");
1821
+ const ignoredOptionValues = new Set(
1822
+ [
1823
+ ...targets,
1824
+ parseOptionValue(argv, "--preview-url"),
1825
+ parseOptionValue(argv, "--studio-url"),
1826
+ parseOptionValue(argv, "--workspace-id"),
1827
+ parseOptionValue(argv, "--tenant-id"),
1828
+ parseOptionValue(argv, "--user-id"),
1829
+ parseOptionValue(argv, "--role"),
1830
+ previewPortRaw,
1831
+ intervalRaw,
1832
+ ].filter((value): value is string => typeof value === "string"),
1833
+ );
1834
+ const studioPath = rest.slice(1).find((item) => !ignoredOptionValues.has(item));
1835
+ return {
1836
+ command: {
1837
+ kind: "studio",
1838
+ subcommand,
1839
+ path: studioPath,
1840
+ previewUrl: parseOptionValue(argv, "--preview-url"),
1841
+ previewPort: previewPort ? Math.floor(previewPort) : undefined,
1842
+ studioUrl: parseOptionValue(argv, "--studio-url"),
1843
+ intervalMs: intervalMs ? Math.floor(intervalMs) : undefined,
1844
+ once: parseFlag(argv, "--once"),
1845
+ workspaceId: parseOptionValue(argv, "--workspace-id"),
1846
+ tenantId: parseOptionValue(argv, "--tenant-id"),
1847
+ userId: parseOptionValue(argv, "--user-id"),
1848
+ role: parseOptionValue(argv, "--role"),
1849
+ targets: targets.length > 0 ? targets : ["codex"],
1850
+ install: parseFlag(argv, "--install"),
1851
+ start: !parseFlag(argv, "--no-start"),
1852
+ bridge: !parseFlag(argv, "--no-bridge"),
1853
+ writeSchemas: parseFlag(argv, "--write"),
1854
+ probeAppServer: parseFlag(argv, "--probe") || parseFlag(argv, "--probe-codex-server"),
1855
+ json: parseFlag(argv, "--json"),
1856
+ dryRun: parseFlag(argv, "--dry-run"),
1857
+ force: parseFlag(argv, "--force"),
1858
+ workspaceRoot,
1859
+ },
1860
+ workspaceRoot,
1861
+ errors,
1862
+ };
1863
+ }
1414
1864
  case "generate": {
1415
1865
  const concurrencyRaw = parseOptionValue(argv, "--concurrency");
1416
1866
  const concurrency = concurrencyRaw ? Number(concurrencyRaw) : 4;
@@ -1424,30 +1874,178 @@ export function parseCli(argv: string[]): ParsedCli {
1424
1874
  dryRun: parseFlag(argv, "--dry-run"),
1425
1875
  json: parseFlag(argv, "--json"),
1426
1876
  concurrency: Math.max(1, Math.floor(concurrency || 4)),
1877
+ workspaceRoot,
1878
+ },
1879
+ workspaceRoot,
1880
+ errors,
1881
+ };
1882
+ }
1883
+ case "delta": {
1884
+ const subcommand = rest[0];
1885
+ if (subcommand !== "status" && subcommand !== "repair") {
1886
+ errors.push("forge delta requires subcommand: status or repair");
1887
+ return { command: null, workspaceRoot, errors };
1888
+ }
1889
+ return {
1890
+ command: {
1891
+ kind: "delta",
1892
+ subcommand,
1893
+ json: parseFlag(argv, "--json"),
1894
+ dryRun: parseFlag(argv, "--dry-run"),
1895
+ yes: parseFlag(argv, "--yes"),
1896
+ verbose: parseFlag(argv, "--verbose"),
1897
+ workspaceRoot,
1898
+ },
1899
+ workspaceRoot,
1900
+ errors,
1901
+ };
1902
+ }
1903
+ case "session": {
1904
+ const subcommand = rest[0];
1905
+ if (subcommand !== "list" && subcommand !== "show" && subcommand !== "rename" && subcommand !== "merge" && subcommand !== "split" && subcommand !== "detach") {
1906
+ errors.push("forge session requires subcommand: list, show, rename, merge, split, or detach");
1907
+ return { command: null, workspaceRoot, errors };
1908
+ }
1909
+ const limitRaw = parseOptionValue(argv, "--limit");
1910
+ const limit = limitRaw ? Number(limitRaw) : undefined;
1911
+ if (limitRaw !== undefined && (!Number.isFinite(limit) || limit! < 1)) {
1912
+ errors.push("--limit must be a number >= 1");
1913
+ }
1914
+ const sessionId = rest[1];
1915
+ return {
1916
+ command: {
1917
+ kind: "session",
1918
+ subcommand,
1919
+ sessionId: subcommand === "detach" ? undefined : sessionId,
1920
+ sourceSessionId: subcommand === "merge" ? rest[2] : undefined,
1921
+ operationId: subcommand === "split" ? rest[2] : subcommand === "detach" ? rest[1] : undefined,
1922
+ title: subcommand === "rename" ? rest.slice(2).join(" ") : undefined,
1923
+ limit: limit ? Math.floor(limit) : undefined,
1924
+ json: parseFlag(argv, "--json"),
1925
+ workspaceRoot,
1926
+ },
1927
+ workspaceRoot,
1928
+ errors,
1929
+ };
1930
+ }
1931
+ case "timeline": {
1932
+ const limitRaw = parseOptionValue(argv, "--limit");
1933
+ const kindFilter = parseOptionValue(argv, "--kind");
1934
+ const sessionId = parseOptionValue(argv, "--session");
1935
+ const rebuild = rest[0] === "rebuild";
1936
+ const target = rebuild ? undefined : rest.find((item) => item !== kindFilter && item !== limitRaw && item !== sessionId);
1937
+ const limit = limitRaw ? Number(limitRaw) : undefined;
1938
+ if (limitRaw !== undefined && (!Number.isFinite(limit) || limit! < 1)) {
1939
+ errors.push("--limit must be a number >= 1");
1940
+ }
1941
+ return {
1942
+ command: {
1943
+ kind: "timeline",
1944
+ target,
1945
+ kindFilter,
1946
+ sessionId,
1947
+ limit: limit ? Math.floor(limit) : undefined,
1948
+ json: parseFlag(argv, "--json"),
1949
+ rebuild,
1950
+ forAgent: parseFlag(argv, "--for-agent"),
1951
+ workspaceRoot,
1952
+ },
1953
+ workspaceRoot,
1954
+ errors,
1955
+ };
1956
+ }
1957
+ case "explain": {
1958
+ const thing = rest[0] === "session" ? `session:${rest[1] ?? "current"}` : rest[0];
1959
+ if (!thing) {
1960
+ errors.push("forge explain requires a target");
1961
+ return { command: null, workspaceRoot, errors };
1962
+ }
1963
+ return {
1964
+ command: {
1965
+ kind: "explain",
1966
+ thing,
1967
+ json: parseFlag(argv, "--json"),
1968
+ workspaceRoot,
1969
+ },
1970
+ workspaceRoot,
1971
+ errors,
1972
+ };
1973
+ }
1974
+ case "manifest": {
1975
+ const subcommand = rest[0];
1976
+ const path = rest[1];
1977
+ if (subcommand !== "validate" && subcommand !== "import") {
1978
+ errors.push("forge manifest requires subcommand validate or import");
1979
+ return { command: null, workspaceRoot, errors };
1980
+ }
1981
+ if (!path) {
1982
+ errors.push(`forge manifest ${subcommand} requires a manifest file path`);
1983
+ return { command: null, workspaceRoot, errors };
1984
+ }
1985
+ return {
1986
+ command: {
1987
+ kind: "manifest",
1988
+ subcommand,
1989
+ path,
1990
+ json: parseFlag(argv, "--json"),
1991
+ workspaceRoot,
1992
+ },
1993
+ workspaceRoot,
1994
+ errors,
1995
+ };
1996
+ }
1997
+ case "import": {
1998
+ const subcommand = rest[0];
1999
+ if (subcommand !== "analyze" && subcommand !== "inspect") {
2000
+ errors.push("forge import requires subcommand analyze or inspect");
2001
+ return { command: null, workspaceRoot, errors };
2002
+ }
2003
+ return {
2004
+ command: {
2005
+ kind: "import",
2006
+ options: {
2007
+ subcommand,
2008
+ json: parseFlag(argv, "--json"),
2009
+ dryRun: parseFlag(argv, "--dry-run"),
2010
+ workspaceRoot,
2011
+ entry: parseOptionValue(argv, "--entry"),
2012
+ target: parseOptionValue(argv, "--target"),
2013
+ },
1427
2014
  },
1428
2015
  workspaceRoot,
1429
2016
  errors,
1430
2017
  };
1431
2018
  }
1432
2019
  case "add": {
1433
- const alias = rest[0];
2020
+ const subcommand = rest[0];
2021
+ const explicitMode =
2022
+ subcommand === "package"
2023
+ ? "package"
2024
+ : subcommand === "integration"
2025
+ ? "integration"
2026
+ : "auto";
2027
+ const alias = explicitMode === "auto" ? rest[0] : rest[1];
1434
2028
  if (!alias) {
1435
- errors.push("forge add requires an integration alias");
2029
+ errors.push(
2030
+ explicitMode === "auto"
2031
+ ? "forge add requires a package name or integration alias"
2032
+ : `forge add ${subcommand} requires a target`,
2033
+ );
1436
2034
  return { command: null, workspaceRoot, errors };
1437
2035
  }
1438
2036
  return {
1439
2037
  command: {
1440
2038
  kind: "add",
1441
2039
  alias,
1442
- options: parseAddOptions(argv, workspaceRoot),
2040
+ options: parseAddOptions(argv, workspaceRoot, explicitMode),
1443
2041
  },
1444
2042
  workspaceRoot,
1445
2043
  errors,
1446
2044
  };
1447
2045
  }
1448
2046
  case "inspect": {
1449
- const target = rest[0] as InspectTarget | undefined;
1450
- if (!target || !INSPECT_TARGETS.includes(target)) {
2047
+ const target = (rest[0] as InspectTarget | undefined) ?? "summary";
2048
+ if (!INSPECT_TARGETS.includes(target)) {
1451
2049
  errors.push(
1452
2050
  `unsupported inspect target; supported: ${INSPECT_TARGETS.join(", ")}`,
1453
2051
  );
@@ -1459,6 +2057,8 @@ export function parseCli(argv: string[]): ParsedCli {
1459
2057
  target,
1460
2058
  json: parseFlag(argv, "--json"),
1461
2059
  dryRun: parseFlag(argv, "--dry-run"),
2060
+ full: parseFlag(argv, "--full"),
2061
+ brief: parseFlag(argv, "--brief"),
1462
2062
  },
1463
2063
  workspaceRoot,
1464
2064
  errors,
@@ -1479,12 +2079,58 @@ export function parseCli(argv: string[]): ParsedCli {
1479
2079
  {
1480
2080
  const scriptTimeoutRaw = parseOptionValue(argv, "--script-timeout-ms");
1481
2081
  const scriptTimeoutMs = scriptTimeoutRaw ? Number(scriptTimeoutRaw) : undefined;
2082
+ const testJobsRaw = parseOptionValue(argv, "--test-jobs");
2083
+ const testJobs = testJobsRaw ? Number(testJobsRaw) : undefined;
2084
+ const typechecker = parseOptionValue(argv, "--typechecker");
2085
+ const verifyOptionValues = new Set(
2086
+ [scriptTimeoutRaw, testJobsRaw, typechecker]
2087
+ .filter((value): value is string => typeof value === "string"),
2088
+ );
2089
+ const profileAlias = rest.find((item) => !verifyOptionValues.has(item));
2090
+ const verifyProfiles = new Set([
2091
+ "quick",
2092
+ "smoke",
2093
+ "agent",
2094
+ "standard",
2095
+ "release",
2096
+ "strict",
2097
+ "changed",
2098
+ "framework",
2099
+ "internal",
2100
+ "maintainer",
2101
+ ]);
2102
+ if (profileAlias && !verifyProfiles.has(profileAlias)) {
2103
+ errors.push(
2104
+ `unknown forge verify profile '${profileAlias}'; expected quick, smoke, agent, standard, release, strict, changed, framework, internal, or maintainer`,
2105
+ );
2106
+ }
2107
+ const internal =
2108
+ parseFlag(argv, "--internal") ||
2109
+ profileAlias === "framework" ||
2110
+ profileAlias === "internal" ||
2111
+ profileAlias === "maintainer";
1482
2112
  if (
1483
2113
  scriptTimeoutRaw !== undefined &&
1484
2114
  (!Number.isFinite(scriptTimeoutMs) || scriptTimeoutMs! < 1)
1485
2115
  ) {
1486
2116
  errors.push("--script-timeout-ms must be a number >= 1");
1487
2117
  }
2118
+ if (
2119
+ testJobsRaw !== undefined &&
2120
+ (!Number.isInteger(testJobs) || testJobs! < 1)
2121
+ ) {
2122
+ errors.push("--test-jobs must be an integer >= 1");
2123
+ }
2124
+ if (
2125
+ typechecker !== undefined &&
2126
+ typechecker !== "tsc" &&
2127
+ typechecker !== "native" &&
2128
+ typechecker !== "ts7" &&
2129
+ typechecker !== "tsgo" &&
2130
+ typechecker !== "auto"
2131
+ ) {
2132
+ errors.push("--typechecker must be one of: tsc, native, ts7, tsgo, auto");
2133
+ }
1488
2134
  return {
1489
2135
  command: {
1490
2136
  kind: "verify",
@@ -1494,12 +2140,17 @@ export function parseCli(argv: string[]): ParsedCli {
1494
2140
  skipTests: parseFlag(argv, "--skip-tests"),
1495
2141
  skipTypecheck: parseFlag(argv, "--skip-typecheck"),
1496
2142
  skipEslint: parseFlag(argv, "--skip-eslint"),
1497
- strict: parseFlag(argv, "--strict"),
1498
- changed: parseFlag(argv, "--changed"),
1499
- fast: parseFlag(argv, "--fast"),
1500
- smoke: parseFlag(argv, "--smoke"),
1501
- standard: parseFlag(argv, "--standard"),
2143
+ strict: internal || parseFlag(argv, "--strict") || profileAlias === "release" || profileAlias === "strict",
2144
+ changed: parseFlag(argv, "--changed") || profileAlias === "changed",
2145
+ fast: parseFlag(argv, "--fast") || profileAlias === "quick",
2146
+ smoke: parseFlag(argv, "--smoke") || profileAlias === "smoke",
2147
+ standard: parseFlag(argv, "--standard") || profileAlias === "agent" || profileAlias === "standard",
1502
2148
  scriptTimeoutMs: scriptTimeoutMs ? Math.floor(scriptTimeoutMs) : undefined,
2149
+ testJobs: testJobs ? Math.floor(testJobs) : undefined,
2150
+ typechecker: typechecker as "tsc" | "native" | "ts7" | "tsgo" | "auto" | undefined,
2151
+ fullTests: parseFlag(argv, "--full"),
2152
+ testPlan: parseFlag(argv, "--test-plan"),
2153
+ internal,
1503
2154
  },
1504
2155
  },
1505
2156
  workspaceRoot,
@@ -1543,6 +2194,15 @@ export function parseCli(argv: string[]): ParsedCli {
1543
2194
 
1544
2195
  const name = rest[0];
1545
2196
  const list = parseFlag(argv, "--list") || !name;
2197
+ const argsRaw = parseOptionValue(argv, "--args");
2198
+ let args: unknown = {};
2199
+ if (argsRaw !== undefined) {
2200
+ try {
2201
+ args = JSON.parse(argsRaw);
2202
+ } catch {
2203
+ errors.push("--args must be valid JSON");
2204
+ }
2205
+ }
1546
2206
  return {
1547
2207
  command: {
1548
2208
  kind: "run",
@@ -1555,19 +2215,30 @@ export function parseCli(argv: string[]): ParsedCli {
1555
2215
  role: parseOptionValue(argv, "--role"),
1556
2216
  envFile: parseOptionValue(argv, "--env-file"),
1557
2217
  workspaceRoot,
2218
+ args,
1558
2219
  },
1559
2220
  workspaceRoot,
1560
2221
  errors,
1561
2222
  };
1562
2223
  }
1563
2224
  case "query": {
1564
- const subcommand = (rest[0] ?? "list") as QuerySubcommand;
2225
+ const requested = rest[0] as QuerySubcommand | undefined;
2226
+ const subcommand =
2227
+ !requested
2228
+ ? "list"
2229
+ : ["list", "run"].includes(requested)
2230
+ ? requested
2231
+ : "run";
1565
2232
  if (!["list", "run"].includes(subcommand)) {
1566
2233
  errors.push("forge query requires subcommand: list or run");
1567
2234
  return { command: null, workspaceRoot, errors };
1568
2235
  }
1569
2236
 
1570
- const queryName = subcommand === "run" ? rest[1] : undefined;
2237
+ const queryName = subcommand === "run"
2238
+ ? requested === "run"
2239
+ ? rest[1]
2240
+ : rest[0]
2241
+ : undefined;
1571
2242
  if (subcommand === "run" && !queryName) {
1572
2243
  errors.push("forge query run requires a query name");
1573
2244
  }
@@ -1676,6 +2347,7 @@ export function parseCli(argv: string[]): ParsedCli {
1676
2347
  .map((value) => value.trim())
1677
2348
  .filter(Boolean),
1678
2349
  envFile: parseOptionValue(argv, "--env-file"),
2350
+ skipStartupConsole: parseFlag(argv, "--skip-startup-console"),
1679
2351
  workspaceRoot,
1680
2352
  },
1681
2353
  workspaceRoot,
@@ -1684,8 +2356,8 @@ export function parseCli(argv: string[]): ParsedCli {
1684
2356
  }
1685
2357
  case "db": {
1686
2358
  const subcommand = rest[0] as DbSubcommand | undefined;
1687
- if (!subcommand || !["diff", "migrate", "reset", "status", "rls-check"].includes(subcommand)) {
1688
- errors.push("forge db requires subcommand: diff, migrate, reset, status, or rls-check");
2359
+ if (!subcommand || !["diff", "migrate", "reset", "status", "doctor", "rls-check"].includes(subcommand)) {
2360
+ errors.push("forge db requires subcommand: diff, migrate, reset, status, doctor, or rls-check");
1689
2361
  return { command: null, workspaceRoot, errors };
1690
2362
  }
1691
2363
  return {
@@ -1882,10 +2554,10 @@ export function parseCli(argv: string[]): ParsedCli {
1882
2554
  const subcommand = rest[0] as SecretsSubcommand | undefined;
1883
2555
  if (
1884
2556
  !subcommand ||
1885
- !["list", "check", "print", "set", "unset"].includes(subcommand)
2557
+ !["list", "check", "print", "set", "unset", "prove"].includes(subcommand)
1886
2558
  ) {
1887
2559
  errors.push(
1888
- "forge secrets requires subcommand: list, check, print, set, or unset",
2560
+ "forge secrets requires subcommand: list, check, print, set, unset, or prove",
1889
2561
  );
1890
2562
  return { command: null, workspaceRoot, errors };
1891
2563
  }
@@ -1925,13 +2597,17 @@ export function parseCli(argv: string[]): ParsedCli {
1925
2597
  }
1926
2598
  case "ai": {
1927
2599
  const subcommand = rest[0] as AiSubcommand | undefined;
1928
- if (!subcommand || !["providers", "check", "test", "models"].includes(subcommand)) {
1929
- errors.push("forge ai requires subcommand: providers, check, test, or models");
2600
+ if (!subcommand || !AI_SUBCOMMANDS.includes(subcommand)) {
2601
+ errors.push("forge ai requires subcommand: providers, check, test, models, tools, agents, redteam, or trace");
1930
2602
  return { command: null, workspaceRoot, errors };
1931
2603
  }
1932
2604
 
1933
2605
  const providerRaw = parseOptionValue(argv, "--provider");
1934
2606
  const provider = providerRaw as ForgeAiProvider | undefined;
2607
+ const traceId = subcommand === "trace" ? rest[1] ?? parseOptionValue(argv, "--trace") : undefined;
2608
+ if (subcommand === "trace" && !traceId) {
2609
+ errors.push("forge ai trace requires a trace id");
2610
+ }
1935
2611
 
1936
2612
  return {
1937
2613
  command: {
@@ -1942,6 +2618,11 @@ export function parseCli(argv: string[]): ParsedCli {
1942
2618
  model: parseOptionValue(argv, "--model"),
1943
2619
  prompt: parseOptionValue(argv, "--prompt"),
1944
2620
  mock: parseFlag(argv, "--mock"),
2621
+ modelLevel: parseFlag(argv, "--model-level"),
2622
+ live: parseFlag(argv, "--live"),
2623
+ traceId,
2624
+ db: parsePersistentDbKind(parseOptionValue(argv, "--db")),
2625
+ databaseUrl: parseOptionValue(argv, "--database-url"),
1945
2626
  workspaceRoot,
1946
2627
  },
1947
2628
  workspaceRoot,
@@ -1956,8 +2637,11 @@ export function parseCli(argv: string[]): ParsedCli {
1956
2637
 
1957
2638
  export function hasUnknownOption(argv: string[]): string | null {
1958
2639
  const known = new Set([
2640
+ "--version",
1959
2641
  "--check",
1960
2642
  "--json",
2643
+ "--human",
2644
+ "--for-agent",
1961
2645
  "--dry-run",
1962
2646
  "--plan",
1963
2647
  "--staged",
@@ -1988,10 +2672,14 @@ export function hasUnknownOption(argv: string[]): string | null {
1988
2672
  "--smoke",
1989
2673
  "--standard",
1990
2674
  "--script-timeout-ms",
2675
+ "--test-plan",
2676
+ "--typechecker",
1991
2677
  "--timeout-ms",
1992
2678
  "--apply",
1993
2679
  "--runtime-inspect",
1994
2680
  "--allow-scripts",
2681
+ "--frontend",
2682
+ "--backend",
1995
2683
  "--yes",
1996
2684
  "--force",
1997
2685
  "--no-generate",
@@ -2009,6 +2697,8 @@ export function hasUnknownOption(argv: string[]): string | null {
2009
2697
  "--policy",
2010
2698
  "--emit",
2011
2699
  "--event",
2700
+ "--entry",
2701
+ "--current",
2012
2702
  "--trigger",
2013
2703
  "--component",
2014
2704
  "--framework",
@@ -2036,6 +2726,7 @@ export function hasUnknownOption(argv: string[]): string | null {
2036
2726
  "--video",
2037
2727
  "--base-url",
2038
2728
  "--runtime-url",
2729
+ "--workspace",
2039
2730
  "--reuse-servers",
2040
2731
  "--start-servers",
2041
2732
  "--scenario",
@@ -2048,6 +2739,7 @@ export function hasUnknownOption(argv: string[]): string | null {
2048
2739
  "--allow-high-risk",
2049
2740
  "--to",
2050
2741
  "--changed",
2742
+ "--authored",
2051
2743
  "--env",
2052
2744
  "--input",
2053
2745
  "--provider",
@@ -2055,10 +2747,17 @@ export function hasUnknownOption(argv: string[]): string | null {
2055
2747
  "--release",
2056
2748
  "--allow-dirty",
2057
2749
  "--allow-public-sourcemaps",
2750
+ "--allow-missing-local-release",
2751
+ "--prepared-only",
2752
+ "--build",
2753
+ "--install-venv",
2058
2754
  "--with-release",
2059
2755
  "--concurrency",
2756
+ "--iterations",
2757
+ "--warmups",
2060
2758
  "--sandbox-backend",
2061
2759
  "--skip-tests",
2760
+ "--test-jobs",
2062
2761
  "--skip-typecheck",
2063
2762
  "--skip-eslint",
2064
2763
  "--mock",
@@ -2071,8 +2770,14 @@ export function hasUnknownOption(argv: string[]): string | null {
2071
2770
  "--database-url",
2072
2771
  "--worker",
2073
2772
  "--no-worker",
2773
+ "--no-start",
2774
+ "--no-bridge",
2775
+ "--probe",
2776
+ "--probe-codex-server",
2074
2777
  "--once",
2075
2778
  "--limit",
2779
+ "--kind",
2780
+ "--session",
2076
2781
  "--input",
2077
2782
  "--args",
2078
2783
  "--step",
@@ -2085,7 +2790,9 @@ export function hasUnknownOption(argv: string[]): string | null {
2085
2790
  "--strict-policies",
2086
2791
  "--strict",
2087
2792
  "--strict-secrets",
2793
+ "--internal",
2088
2794
  "--env-file",
2795
+ "--skip-startup-console",
2089
2796
  "--redacted",
2090
2797
  "--mock-ai",
2091
2798
  "--ai",
@@ -2108,12 +2815,25 @@ export function hasUnknownOption(argv: string[]): string | null {
2108
2815
  "--postgres-version",
2109
2816
  "--runtime-port",
2110
2817
  "--web-port",
2818
+ "--preview-port",
2819
+ "--preview-url",
2820
+ "--studio-url",
2821
+ "--interval-ms",
2822
+ "--workspace-id",
2111
2823
  "--poll-interval",
2112
2824
  "--allow-dev-auth",
2113
2825
  "--token",
2114
2826
  "--no-preserve-user-sections",
2115
2827
  "--no-skills",
2116
2828
  "--no-rules",
2829
+ "--full",
2830
+ "--brief",
2831
+ "--verbose",
2832
+ "--run-tests",
2833
+ "--model-level",
2834
+ "--live",
2835
+ "--no-delta",
2836
+ "--format",
2117
2837
  ]);
2118
2838
 
2119
2839
  for (let index = 0; index < argv.length; index++) {
@@ -2124,6 +2844,8 @@ export function hasUnknownOption(argv: string[]): string | null {
2124
2844
  if (known.has(arg)) {
2125
2845
  if (
2126
2846
  arg === "--concurrency" ||
2847
+ arg === "--iterations" ||
2848
+ arg === "--warmups" ||
2127
2849
  arg === "--field" ||
2128
2850
  arg === "--fields" ||
2129
2851
  arg === "--type" ||
@@ -2134,6 +2856,7 @@ export function hasUnknownOption(argv: string[]): string | null {
2134
2856
  arg === "--policy" ||
2135
2857
  arg === "--emit" ||
2136
2858
  arg === "--event" ||
2859
+ arg === "--entry" ||
2137
2860
  arg === "--trigger" ||
2138
2861
  arg === "--component" ||
2139
2862
  arg === "--package" ||
@@ -2164,9 +2887,12 @@ export function hasUnknownOption(argv: string[]): string | null {
2164
2887
  arg === "--video" ||
2165
2888
  arg === "--base-url" ||
2166
2889
  arg === "--runtime-url" ||
2890
+ arg === "--workspace" ||
2167
2891
  arg === "--scenario" ||
2168
2892
  arg === "--timeout" ||
2169
2893
  arg === "--timeout-ms" ||
2894
+ arg === "--test-jobs" ||
2895
+ arg === "--typechecker" ||
2170
2896
  arg === "--name" ||
2171
2897
  arg === "--auth-token" ||
2172
2898
  arg === "--sandbox-backend" ||
@@ -2175,6 +2901,8 @@ export function hasUnknownOption(argv: string[]): string | null {
2175
2901
  arg === "--db" ||
2176
2902
  arg === "--database-url" ||
2177
2903
  arg === "--limit" ||
2904
+ arg === "--kind" ||
2905
+ arg === "--session" ||
2178
2906
  arg === "--input" ||
2179
2907
  arg === "--args" ||
2180
2908
  arg === "--step" ||
@@ -2190,6 +2918,7 @@ export function hasUnknownOption(argv: string[]): string | null {
2190
2918
  arg === "--provider" ||
2191
2919
  arg === "--model" ||
2192
2920
  arg === "--prompt" ||
2921
+ arg === "--format" ||
2193
2922
  arg === "--url" ||
2194
2923
  arg === "--template" ||
2195
2924
  arg === "--package-manager" ||
@@ -2197,6 +2926,11 @@ export function hasUnknownOption(argv: string[]): string | null {
2197
2926
  arg === "--postgres-version" ||
2198
2927
  arg === "--runtime-port" ||
2199
2928
  arg === "--web-port" ||
2929
+ arg === "--preview-port" ||
2930
+ arg === "--preview-url" ||
2931
+ arg === "--studio-url" ||
2932
+ arg === "--interval-ms" ||
2933
+ arg === "--workspace-id" ||
2200
2934
  arg === "--poll-interval" ||
2201
2935
  arg === "--token"
2202
2936
  || arg === "--to" ||