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
@@ -18,6 +18,8 @@ import type { WorkflowRegistry, WorkflowSubscriptions } from "../compiler/types/
18
18
  import type { ActionSubscriptions } from "../compiler/types/action-subscriptions.ts";
19
19
  import type { TestCost, TestGraph } from "../compiler/types/test-graph.ts";
20
20
  import { resolveCommandArgv } from "../compiler/package-manager/executor.ts";
21
+ import { categorizeFiles, isVolatileForgeState, type CategorizedFileSummary } from "../workspace/change-summary.ts";
22
+ import { buildWorkspaceGitSummary } from "../workspace/git-summary.ts";
21
23
  import type {
22
24
  ImpactCommandOptions,
23
25
  ImpactReport,
@@ -167,12 +169,6 @@ function untrackedFiles(workspaceRoot: string): string[] {
167
169
  return result.ok ? result.files : [];
168
170
  }
169
171
 
170
- function isVolatileForgeState(file: string): boolean {
171
- const normalized = normalize(file);
172
- return normalized.startsWith(".forge/locks/") ||
173
- normalized.startsWith(".forge/test-runs/");
174
- }
175
-
176
172
  function sourceFromOptions(options: ImpactCommandOptions | TestCommandOptions): ImpactSource {
177
173
  if (options.staged) return { mode: "staged", base: "index" };
178
174
  if (options.since) return { mode: "since", base: options.since };
@@ -506,6 +502,27 @@ function riskFor(impact: ImpactedSystems, files: string[]): ImpactRisk {
506
502
  return { level, reasons: reasons.sort() };
507
503
  }
508
504
 
505
+ function changeSummaryForImpact(
506
+ workspaceRoot: string,
507
+ source: ImpactSource,
508
+ changedFiles: string[],
509
+ ): CategorizedFileSummary {
510
+ if (source.mode === "changed" || source.mode === "staged") {
511
+ const git = buildWorkspaceGitSummary(workspaceRoot);
512
+ if (git.available) {
513
+ return source.mode === "staged" ? git.changeSummary.staged : git.changeSummary.changed;
514
+ }
515
+ }
516
+ return categorizeFiles(changedFiles);
517
+ }
518
+
519
+ function derivedOnlyRisk(): ImpactRisk {
520
+ return {
521
+ level: "low",
522
+ reasons: ["Only derived generated artifacts changed"],
523
+ };
524
+ }
525
+
509
526
  function loadArtifacts(workspaceRoot: string) {
510
527
  return {
511
528
  appGraph: readJson<AppGraph>(workspaceRoot, `${GENERATED}/appGraph.json`, { schemaVersion: "", generatorVersion: "", analyzerVersion: "", inputHash: "", symbols: [], edges: [], moduleGraph: { nodes: [] }, diagnostics: [] }),
@@ -671,6 +688,10 @@ export function analyzeImpact(options: ImpactCommandOptions): ImpactReport {
671
688
  const detected = detectChangedFiles(options.workspaceRoot, source);
672
689
  const artifacts = loadArtifacts(options.workspaceRoot);
673
690
  const changedFiles = detected.files;
691
+ const changeSummary = changeSummaryForImpact(options.workspaceRoot, source, changedFiles);
692
+ const generatedChangedFiles = changeSummary.byType.generated.count;
693
+ const authoredChangedFiles = Math.max(0, changeSummary.total.count - generatedChangedFiles);
694
+ const derivedOnly = changeSummary.total.count > 0 && authoredChangedFiles === 0 && generatedChangedFiles > 0;
674
695
  const impacted = analyzeFiles({
675
696
  workspaceRoot: options.workspaceRoot,
676
697
  files: changedFiles,
@@ -678,12 +699,15 @@ export function analyzeImpact(options: ImpactCommandOptions): ImpactReport {
678
699
  excludeTests: options.excludeTests,
679
700
  ...artifacts,
680
701
  });
681
- const risk = riskFor(impacted, changedFiles);
702
+ const risk = derivedOnly ? derivedOnlyRisk() : riskFor(impacted, changedFiles);
682
703
  const checks = requiredChecks(impacted).map((check) => check.command);
683
704
  return {
684
705
  ok: detected.diagnostics.every((diagnostic) => diagnostic.severity !== "error"),
685
706
  source,
686
707
  changedFiles,
708
+ authoredChangedFiles,
709
+ generatedChangedFiles,
710
+ derivedOnly,
687
711
  impacted,
688
712
  risk,
689
713
  recommendedChecks: checks,
@@ -716,10 +740,24 @@ export function buildImpactTestPlan(options: TestCommandOptions): ImpactTestPlan
716
740
  includeBrowser: options.includeBrowser,
717
741
  lastRunByCommand,
718
742
  });
743
+ const generatedTypeScriptOnly =
744
+ report.changedFiles.length > 0 &&
745
+ report.changedFiles.every((file) =>
746
+ file === "forge.lock" ||
747
+ file.startsWith("src/forge/_generated/") ||
748
+ (file.toLowerCase().endsWith(".md") && report.impacted.generatedArtifacts.length > 0)
749
+ ) &&
750
+ report.impacted.generatedArtifacts.some((file) => file.endsWith(".ts") || file.endsWith(".d.ts"));
751
+ const standardReason = generatedTypeScriptOnly
752
+ ? "generated TypeScript artifacts changed"
753
+ : "TypeScript surface changed";
719
754
  return {
720
755
  schemaVersion: "0.1.0",
721
756
  source: report.source,
722
757
  changedFiles: report.changedFiles,
758
+ authoredChangedFiles: report.authoredChangedFiles,
759
+ generatedChangedFiles: report.generatedChangedFiles,
760
+ derivedOnly: report.derivedOnly,
723
761
  impacted: report.impacted,
724
762
  risk: report.risk,
725
763
  requiredChecks: [
@@ -730,7 +768,7 @@ export function buildImpactTestPlan(options: TestCommandOptions): ImpactTestPlan
730
768
  ),
731
769
  tests,
732
770
  optionalChecks: ([
733
- { kind: "forge", command: "forge verify --standard", cost: "standard", reason: "TypeScript surface changed" },
771
+ { kind: "forge", command: "forge verify --standard", cost: "standard", reason: standardReason },
734
772
  ] satisfies TestPlanCheck[]).filter((check) =>
735
773
  costAllowed(check.cost, options.maxCost, options.includeDocker, options.includeBrowser),
736
774
  ),
@@ -41,6 +41,9 @@ export interface ImpactReport {
41
41
  ok: boolean;
42
42
  source: ImpactSource;
43
43
  changedFiles: string[];
44
+ authoredChangedFiles?: number;
45
+ generatedChangedFiles?: number;
46
+ derivedOnly?: boolean;
44
47
  impacted: ImpactedSystems;
45
48
  risk: ImpactRisk;
46
49
  recommendedChecks: string[];
@@ -70,6 +73,9 @@ export interface ImpactTestPlan {
70
73
  schemaVersion: "0.1.0";
71
74
  source: ImpactSource;
72
75
  changedFiles: string[];
76
+ authoredChangedFiles?: number;
77
+ generatedChangedFiles?: number;
78
+ derivedOnly?: boolean;
73
79
  impacted: ImpactedSystems;
74
80
  risk: ImpactRisk;
75
81
  requiredChecks: TestPlanCheck[];
@@ -195,7 +195,7 @@ function planFor(input: {
195
195
  step(
196
196
  "Inspect current app contract",
197
197
  "The agent should understand existing entries, policies, frontend routes, and generated rules before editing.",
198
- ["forge dev --once --json", "forge inspect all --json"],
198
+ ["forge status --json", "forge changed --json", "forge handoff --json", "forge dev --once --json", "forge agent print-context --json"],
199
199
  files,
200
200
  ["No stale generated artifacts", "Frontend/runtime diagnostics are visible before editing"],
201
201
  ),
@@ -215,7 +215,11 @@ function planFor(input: {
215
215
  ),
216
216
  ],
217
217
  commands: [
218
+ intentCommand("forge status --json", "Read compact project health and handoff state"),
219
+ intentCommand("forge changed --json", "Inspect grouped human and generated changes before opening diffs"),
220
+ intentCommand("forge handoff --json", "Build the compact work handoff for external agents"),
218
221
  intentCommand("forge dev --once --json", "Get the current generated/check/frontend/doctor state"),
222
+ intentCommand("forge agent print-context --json", "Read the agent-facing context"),
219
223
  intentCommand(dryRun, "Preview the feature scaffold"),
220
224
  intentCommand(apply, "Apply the reviewed scaffold", "after-review"),
221
225
  intentCommand("forge generate", "Refresh generated contracts after edits", "after-editing"),
@@ -231,7 +235,7 @@ function planFor(input: {
231
235
  }
232
236
  case "connect-ui":
233
237
  return {
234
- summary: "Inspect and repair the web app bridge, provider, routes, and generated hook usage.",
238
+ summary: "Inspect and repair the web app bridge, provider/plugin, routes, and generated binding usage.",
235
239
  plan: [
236
240
  step(
237
241
  "Read frontend graph",
@@ -242,20 +246,25 @@ function planFor(input: {
242
246
  ),
243
247
  step(
244
248
  "Create or repair UI bridge",
245
- "Forge frontends should use the local bridge and hooks instead of fragile direct runtime fetches.",
246
- ["forge make ui --framework vite --dry-run --json", "forge repair diagnose --diagnostic FORGE_FRONTEND_DIRECT_RUNTIME_FETCH --json"],
247
- ["web/src/lib/forge.ts", "web/src/App.tsx", `${GENERATED_DIR}/frontendGraph.json`],
248
- ["ForgeProvider is mounted when framework needs it", "useQuery/useCommand/useLiveQuery replace raw endpoint fetches"],
249
+ "Forge frontends should use the local bridge and generated hooks/composables instead of fragile direct runtime fetches.",
250
+ [
251
+ "forge make ui --framework vite --dry-run --json",
252
+ "forge make ui --framework nuxt --dry-run --json",
253
+ "forge repair diagnose --diagnostic FORGE_FRONTEND_DIRECT_RUNTIME_FETCH --json",
254
+ ],
255
+ ["web/src/lib/forge.ts", "web/composables/forge.ts", "web/src/App.tsx", "web/app.vue", `${GENERATED_DIR}/frontendGraph.json`],
256
+ ["ForgeProvider or Nuxt plugin is mounted when framework needs it", "generated hooks/composables replace raw endpoint fetches"],
249
257
  ),
250
258
  ],
251
259
  commands: [
252
260
  intentCommand("forge inspect frontend --json", "Inspect frontend wiring"),
253
261
  intentCommand("forge dev --once --json", "Run the central diagnostic loop"),
254
262
  intentCommand("forge make ui --framework vite --dry-run --json", "Preview adding a Forge-ready UI bridge", "after-review"),
263
+ intentCommand("forge make ui --framework nuxt --dry-run --json", "Preview adding a Forge-ready Nuxt UI bridge", "after-review"),
255
264
  intentCommand("forge generate", "Refresh frontendGraph and agentContract", "after-editing"),
256
265
  ],
257
266
  filesToInspect: files,
258
- filesToChange: uniqueSorted(["web", "web/src/lib/forge.ts", "web/src/App.tsx"]),
267
+ filesToChange: uniqueSorted(["web", "web/src/lib/forge.ts", "web/composables/forge.ts", "web/src/App.tsx", "web/app.vue"]),
259
268
  risks: [
260
269
  risk("medium", "UI can appear to work while bypassing generated hooks.", "Treat frontendGraph diagnostics as blocking for agent handoff."),
261
270
  ],
@@ -267,7 +276,7 @@ function planFor(input: {
267
276
  step(
268
277
  "Collect current diagnostics",
269
278
  "The central dev cycle aggregates generated drift, guardrails, frontend wiring, doctor checks, impact, and last reports.",
270
- ["forge dev --once --json"],
279
+ ["forge status --json", "forge changed --json", "forge handoff --json", "forge dev --once --json"],
271
280
  files,
272
281
  ["Diagnostics include codes, fix hints, and suggested commands"],
273
282
  ),
@@ -284,6 +293,9 @@ function planFor(input: {
284
293
  ),
285
294
  ],
286
295
  commands: [
296
+ intentCommand("forge status --json", "Read compact project health before repair"),
297
+ intentCommand("forge changed --json", "Inspect grouped changes and risk buckets before repair"),
298
+ intentCommand("forge handoff --json", "Capture current work state and risks before repair"),
287
299
  intentCommand("forge dev --once --json", "Collect current diagnostics"),
288
300
  intentCommand("forge repair diagnose --from-last-test-run --json", "Diagnose last test failures", "after-review"),
289
301
  intentCommand("forge repair diagnose --from-last-ui-run --json", "Diagnose last UI failures", "after-review"),
@@ -302,7 +314,7 @@ function planFor(input: {
302
314
  step(
303
315
  "Get changed-file impact",
304
316
  "Impact planning keeps verification fast while still choosing relevant checks.",
305
- ["forge dev --once --json", "forge test plan --changed --json"],
317
+ ["forge changed --json", "forge handoff --json", "forge dev --once --json", "forge test plan --changed --json"],
306
318
  files,
307
319
  ["Changed files and recommended checks are listed"],
308
320
  ),
@@ -315,6 +327,8 @@ function planFor(input: {
315
327
  ),
316
328
  ],
317
329
  commands: [
330
+ intentCommand("forge changed --json", "Inspect grouped changes before planning verification"),
331
+ intentCommand("forge handoff --json", "Summarize current work state before verification"),
318
332
  intentCommand("forge dev --once --json", "Run central diagnostics"),
319
333
  intentCommand("forge test plan --changed --json", "Plan targeted checks from changed files"),
320
334
  intentCommand("forge verify --changed", "Run focused verification", "after-editing"),
@@ -333,7 +347,7 @@ function planFor(input: {
333
347
  step(
334
348
  "Review current state",
335
349
  "Handoffs need current generated artifacts, review findings, and changed-file impact.",
336
- ["forge dev --once --json", "forge review --changed --json", "git status --short"],
350
+ ["forge changed --json", "forge handoff --json", "forge dev --once --json", "forge review --changed --json", "git status --short"],
337
351
  files,
338
352
  ["No unexpected generated drift", "Review findings are known before commit"],
339
353
  ),
@@ -346,6 +360,8 @@ function planFor(input: {
346
360
  ),
347
361
  ],
348
362
  commands: [
363
+ intentCommand("forge changed --json", "Inspect grouped changes before review and handoff"),
364
+ intentCommand("forge handoff --json", "Build the work handoff and risk summary"),
349
365
  intentCommand("forge dev --once --json", "Run central diagnostics"),
350
366
  intentCommand("forge review --changed --json", "Review changed files structurally"),
351
367
  intentCommand("forge verify --strict", "Run final strict verification", "before-handoff"),
@@ -359,14 +375,14 @@ function planFor(input: {
359
375
  case "explain":
360
376
  case "inspect":
361
377
  return {
362
- summary: "Read the generated contract and maps before opening individual files.",
378
+ summary: "Read compact project health and generated agent context before opening individual files.",
363
379
  plan: [
364
380
  step(
365
381
  "Load agent context",
366
- "The generated contract is the fastest route to understanding runtime, data, frontend, policies, and commands.",
367
- ["forge inspect all --json", "forge agent print-context --json"],
382
+ "The compact status, grouped diff, and generated context are the fastest route to understanding runtime, data, frontend, policies, and commands.",
383
+ ["forge status --json", "forge changed --json", "forge handoff --json", "forge agent print-context --json", "forge inspect all --brief --json"],
368
384
  files,
369
- ["Contract and maps are available", "Frontend routes and runtime endpoints are known"],
385
+ ["Grouped human and generated changes are visible", "Contract and maps are available", "Frontend routes and runtime endpoints are known"],
370
386
  ),
371
387
  step(
372
388
  "Open the relevant source files",
@@ -377,14 +393,17 @@ function planFor(input: {
377
393
  ),
378
394
  ],
379
395
  commands: [
380
- intentCommand("forge inspect all --json", "Read the aggregate project contract"),
396
+ intentCommand("forge status --json", "Read the compact project health and next actions"),
397
+ intentCommand("forge changed --json", "Inspect grouped human and generated changes before source reads"),
398
+ intentCommand("forge handoff --json", "Read the compact work handoff and resume brief"),
381
399
  intentCommand("forge agent print-context --json", "Read the agent-facing context"),
400
+ intentCommand("forge inspect all --brief --json", "Read the brief aggregate project contract without large nested payloads"),
382
401
  intentCommand("forge inspect frontend --json", "Read frontend routes and bindings"),
383
402
  ],
384
403
  filesToInspect: files,
385
404
  filesToChange: [],
386
405
  risks: [
387
- risk("low", "Reading source before generated maps wastes context.", "Start from AGENTS.md and agentContract.json."),
406
+ risk("low", "Reading source before grouped changes and generated maps wastes context.", "Start from status, changed, AGENTS.md, and agentContract.json."),
388
407
  ],
389
408
  };
390
409
  }
@@ -10,6 +10,9 @@ import { parseFieldSpec, parseFields, splitTopLevel } from "./fields.ts";
10
10
  import { camelCase, kebabCase, pascalCase, singularize, titleCase } from "./naming.ts";
11
11
  import {
12
12
  renderAction,
13
+ renderAiAgentFile,
14
+ renderAiChatComponent,
15
+ renderAiChatPage,
13
16
  renderCreateCommand,
14
17
  renderCreateForm,
15
18
  renderDeleteCommand,
@@ -17,6 +20,14 @@ import {
17
20
  renderListComponent,
18
21
  renderListQuery,
19
22
  renderLiveQuery,
23
+ renderNextAiPackage,
24
+ renderNuxtApp,
25
+ renderNuxtConfig,
26
+ renderNuxtForgeComposable,
27
+ renderNuxtForgePlugin,
28
+ renderNuxtPackage,
29
+ renderNuxtStatusComponent,
30
+ renderNuxtTsconfig,
20
31
  renderPage,
21
32
  renderPlaceholderTest,
22
33
  renderPolicyFile,
@@ -57,6 +68,7 @@ export const MAKE_PRIMITIVES: MakePrimitive[] = [
57
68
  "component",
58
69
  "page",
59
70
  "ui",
71
+ "ai-chat",
60
72
  "resource",
61
73
  "apply",
62
74
  "rollback",
@@ -102,7 +114,9 @@ const EXPLANATIONS: Record<MakeIntent["kind"], string> = {
102
114
  page:
103
115
  "Adds a minimal app page under web/app/<route>/page.tsx.",
104
116
  ui:
105
- "Adds a minimal Vite React web app with ForgeProvider devAuth and a generated client bridge.",
117
+ "Adds a minimal Vite React or Nuxt Vue web app with generated Forge client bindings.",
118
+ "ai-chat":
119
+ "Adds a Forge AI agent definition and a React chat component that calls the Forge /ai/agents/run runtime endpoint.",
106
120
  resource:
107
121
  "Creates a full resource slice: table, policies, CRUD commands, queries, liveQuery, action, optional React, and tests.",
108
122
  };
@@ -506,7 +520,7 @@ function buildIntent(options: MakeCommandOptions): {
506
520
  const kind = options.primitive as MakeIntent["kind"];
507
521
  const fieldOptions = parseFieldOptions(options);
508
522
  const diagnostics = [...fieldOptions.diagnostics];
509
- if (options.framework && !["vite", "next"].includes(options.framework)) {
523
+ if (options.framework && !["vite", "next", "nuxt"].includes(options.framework)) {
510
524
  diagnostics.push(
511
525
  diagnostic("error", "FORGE_MAKE_PATCH_UNSAFE", `unsupported frontend framework '${options.framework}'`),
512
526
  );
@@ -516,12 +530,12 @@ function buildIntent(options: MakeCommandOptions): {
516
530
  diagnostic(
517
531
  "warning",
518
532
  "FORGE_MAKE_UI_FRAMEWORK_EXPERIMENTAL",
519
- "forge make ui currently generates the Vite React bridge; Next support should use the b2b-support-web template",
533
+ "forge make ui currently generates Vite React and Nuxt Vue bridges; Next support should use the b2b-support-web template",
520
534
  ),
521
535
  );
522
536
  }
523
537
  const name = options.name ?? (kind === "field" ? "" : undefined);
524
- if (!name && !["component", "page", "ui"].includes(kind)) {
538
+ if (!name && !["component", "page", "ui", "ai-chat"].includes(kind)) {
525
539
  diagnostics.push(
526
540
  diagnostic("error", "FORGE_MAKE_PATCH_UNSAFE", `forge make ${kind} requires a name`),
527
541
  );
@@ -555,7 +569,8 @@ function buildIntent(options: MakeCommandOptions): {
555
569
  kind === "resource" ||
556
570
  kind === "component" ||
557
571
  kind === "page" ||
558
- kind === "ui",
572
+ kind === "ui" ||
573
+ kind === "ai-chat",
559
574
  tests: options.withTests || kind === "resource",
560
575
  policy:
561
576
  options.policy ??
@@ -566,7 +581,8 @@ function buildIntent(options: MakeCommandOptions): {
566
581
  trigger: options.trigger ?? options.event ?? (table ? `${singular}.created` : undefined),
567
582
  component: options.component,
568
583
  route: options.name ? kebabCase(options.name) : undefined,
569
- withAi: options.withAi,
584
+ framework: options.framework,
585
+ withAi: options.withAi || kind === "ai-chat",
570
586
  withCreateForm: options.withCreateForm || kind === "resource",
571
587
  },
572
588
  };
@@ -600,6 +616,77 @@ function addPolicies(plan: MakePlan, workspaceRoot: string, entries: Record<stri
600
616
  plan.diagnostics.push(...next.diagnostics);
601
617
  }
602
618
 
619
+ function addWebAiDependencies(plan: MakePlan, workspaceRoot: string, appName: string): void {
620
+ const desired: Record<string, string> = {
621
+ "@ai-sdk/react": "^3.0.0",
622
+ ai: "^6.0.0",
623
+ };
624
+ const plannedPackage = plan.filesToCreate.find((file) => file.file === "web/package.json");
625
+ if (plannedPackage) {
626
+ try {
627
+ const parsed = JSON.parse(plannedPackage.content) as { dependencies?: Record<string, string> };
628
+ parsed.dependencies = { ...(parsed.dependencies ?? {}), ...desired };
629
+ plannedPackage.content = `${JSON.stringify(parsed, null, 2)}\n`;
630
+ return;
631
+ } catch {
632
+ plan.diagnostics.push(
633
+ diagnostic(
634
+ "warning",
635
+ "FORGE_MAKE_PACKAGE_JSON_UNSUPPORTED_SHAPE",
636
+ "could not update planned web/package.json with AI SDK dependencies",
637
+ "web/package.json",
638
+ ),
639
+ );
640
+ return;
641
+ }
642
+ }
643
+
644
+ const existing = readIfExists(workspaceRoot, "web/package.json");
645
+ if (!existing) {
646
+ plan.filesToCreate.push(
647
+ createFile(
648
+ workspaceRoot,
649
+ "web/package.json",
650
+ "Add web package with AI SDK dependencies",
651
+ renderNextAiPackage(appName),
652
+ ),
653
+ );
654
+ return;
655
+ }
656
+
657
+ try {
658
+ const parsed = JSON.parse(existing) as { dependencies?: Record<string, string> };
659
+ const dependencies = { ...(parsed.dependencies ?? {}) };
660
+ let changed = false;
661
+ for (const [name, version] of Object.entries(desired)) {
662
+ if (dependencies[name] !== version) {
663
+ dependencies[name] = version;
664
+ changed = true;
665
+ }
666
+ }
667
+ if (!changed) {
668
+ return;
669
+ }
670
+ parsed.dependencies = dependencies;
671
+ plan.filesToModify.push({
672
+ file: "web/package.json",
673
+ kind: "replace-section",
674
+ description: "Add AI SDK dependencies to web package",
675
+ beforeHash: hashStable(existing),
676
+ afterPreview: `${JSON.stringify(parsed, null, 2)}\n`,
677
+ });
678
+ } catch {
679
+ plan.diagnostics.push(
680
+ diagnostic(
681
+ "warning",
682
+ "FORGE_MAKE_PACKAGE_JSON_UNSUPPORTED_SHAPE",
683
+ "could not update web/package.json with AI SDK dependencies",
684
+ "web/package.json",
685
+ ),
686
+ );
687
+ }
688
+ }
689
+
603
690
  function addRuntimeFiles(plan: MakePlan, workspaceRoot: string, intent: MakeIntent): void {
604
691
  const table = intent.table ?? intent.name;
605
692
  const singular = singularize(table);
@@ -670,7 +757,63 @@ function addFrontendFiles(plan: MakePlan, workspaceRoot: string, intent: MakeInt
670
757
  const table = intent.table ?? intent.name;
671
758
  const singular = singularize(table);
672
759
  const pascal = pascalCase(singular);
760
+ if (intent.kind === "ai-chat") {
761
+ const name = intent.name || "support";
762
+ const hasViteSource = fileExists(workspaceRoot, "web/src") || fileExists(workspaceRoot, "web/src/main.tsx");
763
+ const bridgeFile = hasViteSource ? "web/src/lib/forge.ts" : "web/lib/forge.ts";
764
+ const componentFile = hasViteSource
765
+ ? `web/src/components/${pascalCase(name)}AiChat.tsx`
766
+ : `web/components/${pascalCase(name)}AiChat.tsx`;
767
+ addWebAiDependencies(plan, workspaceRoot, name);
768
+ if (!fileExists(workspaceRoot, bridgeFile)) {
769
+ plan.filesToCreate.push(
770
+ createFile(
771
+ workspaceRoot,
772
+ bridgeFile,
773
+ "Add Forge client bridge",
774
+ hasViteSource ? renderWebBridge() : renderWebRootBridge(),
775
+ ),
776
+ );
777
+ }
778
+ plan.filesToCreate.push(
779
+ createFile(
780
+ workspaceRoot,
781
+ `src/ai/${camelCase(name)}Agent.ts`,
782
+ `Add AI agent '${name}'`,
783
+ renderAiAgentFile(name),
784
+ ),
785
+ createFile(
786
+ workspaceRoot,
787
+ componentFile,
788
+ `Add AI chat component '${name}'`,
789
+ renderAiChatComponent(name),
790
+ ),
791
+ );
792
+ if (fileExists(workspaceRoot, "web/app") || fileExists(workspaceRoot, "web/app/layout.tsx")) {
793
+ plan.filesToCreate.push(
794
+ createFile(
795
+ workspaceRoot,
796
+ `web/app/${kebabCase(name)}-ai/page.tsx`,
797
+ `Add AI chat page '${name}'`,
798
+ renderAiChatPage(name),
799
+ ),
800
+ );
801
+ }
802
+ return;
803
+ }
673
804
  if (intent.kind === "ui") {
805
+ if (intent.framework === "nuxt") {
806
+ plan.filesToCreate.push(
807
+ createFile(workspaceRoot, "web/package.json", "Add Nuxt web package", renderNuxtPackage(intent.name)),
808
+ createFile(workspaceRoot, "web/nuxt.config.ts", "Add Nuxt runtime config", renderNuxtConfig()),
809
+ createFile(workspaceRoot, "web/tsconfig.json", "Add Nuxt TypeScript config", renderNuxtTsconfig()),
810
+ createFile(workspaceRoot, "web/composables/forge.ts", "Add Forge Vue composable bridge", renderNuxtForgeComposable()),
811
+ createFile(workspaceRoot, "web/plugins/forge.ts", "Add Forge Nuxt plugin", renderNuxtForgePlugin()),
812
+ createFile(workspaceRoot, "web/app.vue", "Add Nuxt app shell", renderNuxtApp()),
813
+ createFile(workspaceRoot, "web/components/ForgeStatus.vue", "Add Forge status component", renderNuxtStatusComponent()),
814
+ );
815
+ return;
816
+ }
674
817
  plan.filesToCreate.push(
675
818
  createFile(workspaceRoot, "web/package.json", "Add Vite React web package", renderVitePackage(intent.name)),
676
819
  createFile(workspaceRoot, "web/tsconfig.json", "Add web TypeScript config", renderViteTsconfig()),