forgeos 0.1.0-alpha.4 → 0.1.0-alpha.41

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 (416) hide show
  1. package/.npmignore +10 -0
  2. package/AGENTS.md +142 -90
  3. package/CHANGELOG.md +433 -0
  4. package/LICENSE +21 -0
  5. package/README.md +67 -8
  6. package/adapters/go/README.md +23 -0
  7. package/adapters/go/go.mod +3 -0
  8. package/adapters/go/http.go +149 -0
  9. package/adapters/go/registry.go +234 -0
  10. package/adapters/go/types.go +136 -0
  11. package/adapters/java/README.md +68 -0
  12. package/adapters/java/pom.xml +34 -0
  13. package/adapters/java/src/main/java/dev/forgeos/adapter/Auth.java +20 -0
  14. package/adapters/java/src/main/java/dev/forgeos/adapter/Diagnostic.java +16 -0
  15. package/adapters/java/src/main/java/dev/forgeos/adapter/Entry.java +38 -0
  16. package/adapters/java/src/main/java/dev/forgeos/adapter/EntryKind.java +16 -0
  17. package/adapters/java/src/main/java/dev/forgeos/adapter/ErrorInfo.java +4 -0
  18. package/adapters/java/src/main/java/dev/forgeos/adapter/Forge.java +94 -0
  19. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeCall.java +12 -0
  20. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeContext.java +11 -0
  21. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHandler.java +8 -0
  22. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHttpHandler.java +179 -0
  23. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeRegistry.java +121 -0
  24. package/adapters/java/src/main/java/dev/forgeos/adapter/Json.java +14 -0
  25. package/adapters/java/src/main/java/dev/forgeos/adapter/Manifest.java +14 -0
  26. package/adapters/java/src/main/java/dev/forgeos/adapter/RequestEnvelope.java +6 -0
  27. package/adapters/java/src/main/java/dev/forgeos/adapter/ResponseEnvelope.java +25 -0
  28. package/adapters/java/src/main/java/dev/forgeos/adapter/Risk.java +18 -0
  29. package/adapters/java/src/main/java/dev/forgeos/adapter/Schemas.java +36 -0
  30. package/adapters/java/src/main/java/dev/forgeos/adapter/Service.java +65 -0
  31. package/adapters/java/src/main/java/dev/forgeos/adapter/TransactionMode.java +18 -0
  32. package/adapters/java/src/main/java/dev/forgeos/adapter/TypedForgeHandler.java +6 -0
  33. package/adapters/java-spring-boot-starter/README.md +32 -0
  34. package/adapters/java-spring-boot-starter/pom.xml +36 -0
  35. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeCommand.java +22 -0
  36. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeExternalService.java +15 -0
  37. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeQuery.java +16 -0
  38. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeServiceBeanCondition.java +18 -0
  39. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringAutoConfiguration.java +16 -0
  40. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringRuntime.java +104 -0
  41. package/adapters/java-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +1 -0
  42. package/bin/forge.mjs +18 -0
  43. package/docs/cair-protocol.md +103 -0
  44. package/docs/changelog.md +548 -0
  45. package/docs/forge-protocol.md +189 -0
  46. package/examples/go-billing/go.mod +7 -0
  47. package/examples/go-billing/main.go +120 -0
  48. package/examples/java-billing/pom.xml +52 -0
  49. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/CreateInvoiceInput.java +4 -0
  50. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Invoice.java +11 -0
  51. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Main.java +127 -0
  52. package/package.json +31 -3
  53. package/schemas/forge-manifest.schema.json +57 -0
  54. package/src/forge/_generated/releaseManifest.json +1 -2
  55. package/src/forge/_generated/releaseManifest.ts +3 -3
  56. package/src/forge/agent-adapters/index.ts +1584 -125
  57. package/src/forge/agent-adapters/types.ts +224 -1
  58. package/src/forge/agent-memory/bridge.ts +1333 -0
  59. package/src/forge/agent-memory/context-pack.ts +277 -0
  60. package/src/forge/agent-memory/hook-runner.ts +312 -0
  61. package/src/forge/agent-memory/mcp.ts +224 -0
  62. package/src/forge/agent-memory/normalize.ts +498 -0
  63. package/src/forge/agent-memory/redaction.ts +103 -0
  64. package/src/forge/agent-memory/sources/claude-code.ts +51 -0
  65. package/src/forge/agent-memory/sources/codex-hook-runner.mjs +273 -0
  66. package/src/forge/agent-memory/sources/codex.ts +119 -0
  67. package/src/forge/agent-memory/sources/cursor.ts +35 -0
  68. package/src/forge/agent-memory/types.ts +204 -0
  69. package/src/forge/bench.ts +248 -0
  70. package/src/forge/brownfield-import/index.ts +801 -0
  71. package/src/forge/brownfield-import/types.ts +127 -0
  72. package/src/forge/cair/action-journal.ts +61 -0
  73. package/src/forge/cair/action-parser.ts +314 -0
  74. package/src/forge/cair/action-validator.ts +40 -0
  75. package/src/forge/cair/actions.ts +1818 -0
  76. package/src/forge/cair/format.ts +77 -0
  77. package/src/forge/cair/index.ts +106 -0
  78. package/src/forge/cair/query.ts +478 -0
  79. package/src/forge/cair/snapshot.ts +315 -0
  80. package/src/forge/cair/types.ts +248 -0
  81. package/src/forge/cli/ai.ts +339 -21
  82. package/src/forge/cli/auth.ts +348 -10
  83. package/src/forge/cli/authmd.ts +441 -0
  84. package/src/forge/cli/baseline.ts +112 -0
  85. package/src/forge/cli/build.ts +20 -4
  86. package/src/forge/cli/changed.ts +437 -0
  87. package/src/forge/cli/codex-app-server.ts +877 -0
  88. package/src/forge/cli/commands.ts +1620 -20
  89. package/src/forge/cli/db.ts +209 -2
  90. package/src/forge/cli/deploy.ts +887 -0
  91. package/src/forge/cli/deps.ts +82 -13
  92. package/src/forge/cli/dev.ts +961 -46
  93. package/src/forge/cli/docs.ts +265 -0
  94. package/src/forge/cli/doctor.ts +297 -0
  95. package/src/forge/cli/field-test.ts +329 -0
  96. package/src/forge/cli/handoff.ts +336 -0
  97. package/src/forge/cli/index.ts +1 -0
  98. package/src/forge/cli/last-run.ts +84 -0
  99. package/src/forge/cli/main.ts +107 -3
  100. package/src/forge/cli/new.ts +152 -13
  101. package/src/forge/cli/next-actions.ts +23 -0
  102. package/src/forge/cli/output.ts +389 -6
  103. package/src/forge/cli/parse.ts +1050 -34
  104. package/src/forge/cli/progress.ts +51 -0
  105. package/src/forge/cli/query.ts +32 -0
  106. package/src/forge/cli/release.ts +35 -11
  107. package/src/forge/cli/rls.ts +43 -4
  108. package/src/forge/cli/run.ts +41 -0
  109. package/src/forge/cli/security.ts +112 -0
  110. package/src/forge/cli/self-host.ts +56 -14
  111. package/src/forge/cli/studio.ts +2218 -0
  112. package/src/forge/cli/verify.ts +1455 -32
  113. package/src/forge/cli/windows.ts +23 -0
  114. package/src/forge/cli/workos.ts +1020 -0
  115. package/src/forge/compiler/agent-contract/build.ts +670 -64
  116. package/src/forge/compiler/agent-contract/types.ts +45 -2
  117. package/src/forge/compiler/ai-registry/parse.ts +71 -2
  118. package/src/forge/compiler/api-surface/build.ts +47 -0
  119. package/src/forge/compiler/app-graph/build.ts +112 -9
  120. package/src/forge/compiler/app-graph/extract.ts +107 -0
  121. package/src/forge/compiler/app-graph/module-graph.ts +73 -78
  122. package/src/forge/compiler/app-graph/parser.ts +24 -24
  123. package/src/forge/compiler/app-graph/profile.ts +26 -0
  124. package/src/forge/compiler/app-graph/versions.ts +1 -1
  125. package/src/forge/compiler/classifier/capabilities.ts +3 -2
  126. package/src/forge/compiler/classifier/classify.ts +32 -8
  127. package/src/forge/compiler/classifier/secrets.ts +3 -2
  128. package/src/forge/compiler/classifier/signals.ts +91 -1
  129. package/src/forge/compiler/client-sdk/build-manifest.ts +59 -0
  130. package/src/forge/compiler/client-sdk/render-client.ts +295 -13
  131. package/src/forge/compiler/data-graph/parse.ts +20 -4
  132. package/src/forge/compiler/data-graph/sql/ddl.ts +144 -31
  133. package/src/forge/compiler/data-graph/sql/serialize.ts +4 -0
  134. package/src/forge/compiler/data-graph/sql/types.ts +1 -0
  135. package/src/forge/compiler/diagnostics/codes.ts +30 -0
  136. package/src/forge/compiler/diagnostics/create.ts +21 -2
  137. package/src/forge/compiler/diagnostics/index.ts +2 -0
  138. package/src/forge/compiler/emitter/barrel.ts +3 -0
  139. package/src/forge/compiler/emitter/render.ts +9 -0
  140. package/src/forge/compiler/external-manifest/registry.ts +205 -0
  141. package/src/forge/compiler/external-manifest/types.ts +91 -0
  142. package/src/forge/compiler/external-manifest/validate.ts +373 -0
  143. package/src/forge/compiler/frontend-graph/build.ts +142 -14
  144. package/src/forge/compiler/integration/add.ts +618 -24
  145. package/src/forge/compiler/integration/plan.ts +43 -12
  146. package/src/forge/compiler/integration/render.ts +29 -0
  147. package/src/forge/compiler/integration/snapshot.ts +2 -0
  148. package/src/forge/compiler/integration/templates/convex.ts +70 -0
  149. package/src/forge/compiler/integration/templates/index.ts +1 -0
  150. package/src/forge/compiler/integration/templates/render.ts +38 -0
  151. package/src/forge/compiler/integration/templates/types.ts +3 -0
  152. package/src/forge/compiler/integration/templates/workos.ts +1219 -0
  153. package/src/forge/compiler/make-registry/build.ts +8 -9
  154. package/src/forge/compiler/orchestrator/fast-check.ts +4 -0
  155. package/src/forge/compiler/orchestrator/generate-lock.ts +14 -3
  156. package/src/forge/compiler/orchestrator/manifest.ts +1 -1
  157. package/src/forge/compiler/orchestrator/plan-profile.ts +23 -0
  158. package/src/forge/compiler/orchestrator/plan.ts +247 -10
  159. package/src/forge/compiler/orchestrator/profile.ts +65 -0
  160. package/src/forge/compiler/orchestrator/run.ts +97 -31
  161. package/src/forge/compiler/orchestrator/serialize.ts +33 -8
  162. package/src/forge/compiler/orchestrator/types.ts +1 -1
  163. package/src/forge/compiler/package-graph/compiler.ts +3 -1
  164. package/src/forge/compiler/package-graph/constants.ts +1 -1
  165. package/src/forge/compiler/package-manager/adapter.ts +4 -1
  166. package/src/forge/compiler/package-manager/commands.ts +4 -0
  167. package/src/forge/compiler/package-manager/executor.ts +30 -1
  168. package/src/forge/compiler/package-manager/version.ts +36 -12
  169. package/src/forge/compiler/package-upgrades/planner.ts +155 -18
  170. package/src/forge/compiler/package-upgrades/types.ts +2 -0
  171. package/src/forge/compiler/policy-registry/build.ts +47 -2
  172. package/src/forge/compiler/policy-registry/parse.ts +32 -2
  173. package/src/forge/compiler/recipes/definitions.ts +63 -0
  174. package/src/forge/compiler/recipes/index.ts +2 -0
  175. package/src/forge/compiler/recipes/registry.ts +6 -0
  176. package/src/forge/compiler/test-graph/build.ts +11 -3
  177. package/src/forge/compiler/types/app-graph.ts +8 -2
  178. package/src/forge/compiler/types/cli.ts +75 -1
  179. package/src/forge/compiler/types/dev-manifest.ts +4 -0
  180. package/src/forge/compiler/types/emit.ts +2 -0
  181. package/src/forge/compiler/types/frontend-graph.ts +2 -2
  182. package/src/forge/compiler/types/integration.ts +1 -0
  183. package/src/forge/compiler/types/package-graph.ts +6 -0
  184. package/src/forge/compiler/types/policy-registry.ts +3 -1
  185. package/src/forge/delta/classifier.ts +52 -0
  186. package/src/forge/delta/explain.ts +238 -0
  187. package/src/forge/delta/git-observer.ts +43 -0
  188. package/src/forge/delta/ids.ts +44 -0
  189. package/src/forge/delta/index.ts +25 -0
  190. package/src/forge/delta/recorder.ts +540 -0
  191. package/src/forge/delta/redaction.ts +50 -0
  192. package/src/forge/delta/schema.ts +240 -0
  193. package/src/forge/delta/session.ts +142 -0
  194. package/src/forge/delta/status.ts +1202 -0
  195. package/src/forge/delta/store.ts +3284 -0
  196. package/src/forge/delta/timeline.ts +178 -0
  197. package/src/forge/dev/server.ts +808 -17
  198. package/src/forge/dev/types.ts +15 -1
  199. package/src/forge/dev/watch.ts +17 -7
  200. package/src/forge/dev-console/cycle.ts +280 -33
  201. package/src/forge/dev-console/types.ts +47 -1
  202. package/src/forge/impact/index.ts +204 -9
  203. package/src/forge/impact/types.ts +33 -1
  204. package/src/forge/intent/index.ts +35 -16
  205. package/src/forge/make/fields.ts +26 -0
  206. package/src/forge/make/index.ts +40 -6
  207. package/src/forge/make/templates.ts +155 -2
  208. package/src/forge/make/types.ts +2 -1
  209. package/src/forge/policy.ts +1 -1
  210. package/src/forge/react/index.ts +160 -2
  211. package/src/forge/refactor/index.ts +1 -0
  212. package/src/forge/repair/rules/index.ts +2 -2
  213. package/src/forge/review/index.ts +158 -12
  214. package/src/forge/review/types.ts +15 -0
  215. package/src/forge/runtime/auth/config.ts +17 -0
  216. package/src/forge/runtime/auth/evaluate.ts +15 -2
  217. package/src/forge/runtime/auth/resolve.ts +61 -6
  218. package/src/forge/runtime/auth/types.ts +1 -0
  219. package/src/forge/runtime/db/factory.ts +1 -3
  220. package/src/forge/runtime/db/generated-client.ts +13 -2
  221. package/src/forge/runtime/db/memory-adapter.ts +139 -32
  222. package/src/forge/runtime/db/pglite-adapter.ts +263 -2
  223. package/src/forge/runtime/db/postgres-adapter.ts +6 -3
  224. package/src/forge/runtime/executor.ts +129 -16
  225. package/src/forge/runtime/external/bridge.ts +649 -0
  226. package/src/forge/runtime/runner/run-entry.ts +16 -7
  227. package/src/forge/runtime/telemetry/buffer.ts +4 -1
  228. package/src/forge/runtime/telemetry/scrubber.ts +35 -5
  229. package/src/forge/runtime/webhooks/security.ts +12 -7
  230. package/src/forge/server.ts +17 -3
  231. package/src/forge/ui/index.ts +209 -0
  232. package/src/forge/ui/types.ts +1 -0
  233. package/src/forge/version.ts +1 -1
  234. package/src/forge/vue/index.ts +422 -0
  235. package/src/forge/workspace/baseline.ts +112 -0
  236. package/src/forge/workspace/change-summary.ts +250 -0
  237. package/src/forge/workspace/forge-cli.ts +42 -0
  238. package/src/forge/workspace/git-summary.ts +391 -0
  239. package/templates/agent-workroom/AGENTS.md +29 -0
  240. package/templates/agent-workroom/README.md +34 -0
  241. package/templates/agent-workroom/forge.config.ts +3 -0
  242. package/templates/agent-workroom/package.json +33 -0
  243. package/templates/agent-workroom/src/actions/indexAgentSignal.ts +10 -0
  244. package/templates/agent-workroom/src/commands/openWorkroom.ts +61 -0
  245. package/templates/agent-workroom/src/commands/recordAgentSignal.ts +119 -0
  246. package/templates/agent-workroom/src/commands/recordCheckRun.ts +52 -0
  247. package/templates/agent-workroom/src/forge/schema.ts +54 -0
  248. package/templates/agent-workroom/src/policies.ts +6 -0
  249. package/templates/agent-workroom/src/queries/listWorkrooms.ts +11 -0
  250. package/templates/agent-workroom/src/queries/liveWorkroom.ts +63 -0
  251. package/templates/agent-workroom/tsconfig.json +16 -0
  252. package/templates/agent-workroom/web/index.html +12 -0
  253. package/templates/agent-workroom/web/package.json +21 -0
  254. package/templates/agent-workroom/web/src/App.tsx +345 -0
  255. package/templates/agent-workroom/web/src/lib/forge.ts +13 -0
  256. package/templates/agent-workroom/web/src/main.tsx +13 -0
  257. package/templates/agent-workroom/web/src/styles.css +545 -0
  258. package/templates/agent-workroom/web/tsconfig.json +27 -0
  259. package/templates/b2b-support-web/package.json +1 -0
  260. package/templates/b2b-support-web/web/package.json +1 -1
  261. package/templates/minimal-web/package.json +1 -1
  262. package/templates/minimal-web/web/package.json +2 -2
  263. package/templates/nuxt-web/.vscode/settings.json +14 -0
  264. package/templates/nuxt-web/README.md +30 -0
  265. package/templates/nuxt-web/forge.config.ts +3 -0
  266. package/templates/nuxt-web/package.json +33 -0
  267. package/templates/nuxt-web/src/actions/logNoteCreated.ts +11 -0
  268. package/templates/nuxt-web/src/commands/createNote.ts +26 -0
  269. package/templates/nuxt-web/src/forge/schema.ts +12 -0
  270. package/templates/nuxt-web/src/policies.ts +6 -0
  271. package/templates/nuxt-web/src/queries/listNotes.ts +8 -0
  272. package/templates/nuxt-web/src/queries/liveNotes.ts +8 -0
  273. package/templates/nuxt-web/tsconfig.json +17 -0
  274. package/templates/nuxt-web/web/app.vue +67 -0
  275. package/templates/nuxt-web/web/components/LiveNotes.vue +89 -0
  276. package/templates/nuxt-web/web/components/NoteComposer.vue +100 -0
  277. package/templates/nuxt-web/web/composables/forge.ts +13 -0
  278. package/templates/nuxt-web/web/composables/useNotes.ts +24 -0
  279. package/templates/nuxt-web/web/nuxt.config.ts +11 -0
  280. package/templates/nuxt-web/web/package.json +18 -0
  281. package/templates/nuxt-web/web/plugins/forge.client.ts +10 -0
  282. package/templates/nuxt-web/web/plugins/forge.server.ts +10 -0
  283. package/templates/nuxt-web/web/server/api/forge-health.get.ts +7 -0
  284. package/templates/nuxt-web/web/tsconfig.json +6 -0
  285. package/src/forge/_generated/actionSubscriptions.json +0 -2
  286. package/src/forge/_generated/actionSubscriptions.ts +0 -10
  287. package/src/forge/_generated/agentAdapterManifest.json +0 -2
  288. package/src/forge/_generated/agentAdapterManifest.ts +0 -73
  289. package/src/forge/_generated/agentContract.json +0 -2
  290. package/src/forge/_generated/agentContract.ts +0 -7829
  291. package/src/forge/_generated/agentQuickstart.md +0 -34
  292. package/src/forge/_generated/agentTools.json +0 -2
  293. package/src/forge/_generated/agentTools.md +0 -16
  294. package/src/forge/_generated/agentTools.ts +0 -12
  295. package/src/forge/_generated/aiContext.ts +0 -125
  296. package/src/forge/_generated/aiModels.json +0 -2
  297. package/src/forge/_generated/aiModels.ts +0 -51
  298. package/src/forge/_generated/aiProviders.json +0 -2
  299. package/src/forge/_generated/aiProviders.ts +0 -23
  300. package/src/forge/_generated/aiRegistry.json +0 -2
  301. package/src/forge/_generated/aiRegistry.ts +0 -31
  302. package/src/forge/_generated/api.json +0 -2
  303. package/src/forge/_generated/api.ts +0 -8
  304. package/src/forge/_generated/appGraph.json +0 -2
  305. package/src/forge/_generated/appGraph.ts +0 -14919
  306. package/src/forge/_generated/appMap.md +0 -55
  307. package/src/forge/_generated/artifactManifest.json +0 -2
  308. package/src/forge/_generated/artifactManifest.ts +0 -7
  309. package/src/forge/_generated/authClaims.json +0 -2
  310. package/src/forge/_generated/authClaims.ts +0 -13
  311. package/src/forge/_generated/authConfig.json +0 -2
  312. package/src/forge/_generated/authConfig.ts +0 -17
  313. package/src/forge/_generated/authContext.ts +0 -23
  314. package/src/forge/_generated/authRegistry.json +0 -2
  315. package/src/forge/_generated/authRegistry.ts +0 -25
  316. package/src/forge/_generated/buildInfo.json +0 -2
  317. package/src/forge/_generated/buildInfo.ts +0 -9
  318. package/src/forge/_generated/capabilityMap.json +0 -2
  319. package/src/forge/_generated/capabilityMap.md +0 -15
  320. package/src/forge/_generated/capabilityMap.ts +0 -17
  321. package/src/forge/_generated/client.ts +0 -282
  322. package/src/forge/_generated/clientApi.ts +0 -9
  323. package/src/forge/_generated/clientManifest.json +0 -2
  324. package/src/forge/_generated/clientManifest.ts +0 -39
  325. package/src/forge/_generated/clientTypes.ts +0 -78
  326. package/src/forge/_generated/configRegistry.json +0 -2
  327. package/src/forge/_generated/configRegistry.ts +0 -4
  328. package/src/forge/_generated/dataGraph.json +0 -2
  329. package/src/forge/_generated/dataGraph.ts +0 -8
  330. package/src/forge/_generated/db.json +0 -2
  331. package/src/forge/_generated/db.ts +0 -2
  332. package/src/forge/_generated/dbSecurityManifest.json +0 -2
  333. package/src/forge/_generated/dbSecurityManifest.ts +0 -15
  334. package/src/forge/_generated/dbSessionContext.json +0 -2
  335. package/src/forge/_generated/dbSessionContext.ts +0 -39
  336. package/src/forge/_generated/deployManifest.json +0 -2
  337. package/src/forge/_generated/deployManifest.ts +0 -14
  338. package/src/forge/_generated/devManifest.json +0 -2
  339. package/src/forge/_generated/devManifest.ts +0 -62
  340. package/src/forge/_generated/envSchema.json +0 -2
  341. package/src/forge/_generated/envSchema.ts +0 -59
  342. package/src/forge/_generated/frontendGraph.json +0 -2
  343. package/src/forge/_generated/frontendGraph.ts +0 -27
  344. package/src/forge/_generated/importGuards.json +0 -2
  345. package/src/forge/_generated/importGuards.ts +0 -686
  346. package/src/forge/_generated/index.ts +0 -68
  347. package/src/forge/_generated/liveProductionManifest.json +0 -2
  348. package/src/forge/_generated/liveProductionManifest.ts +0 -23
  349. package/src/forge/_generated/liveProtocol.json +0 -2
  350. package/src/forge/_generated/liveProtocol.ts +0 -21
  351. package/src/forge/_generated/liveQueryRegistry.json +0 -2
  352. package/src/forge/_generated/liveQueryRegistry.ts +0 -9
  353. package/src/forge/_generated/liveTransportConfig.json +0 -2
  354. package/src/forge/_generated/liveTransportConfig.ts +0 -19
  355. package/src/forge/_generated/makeRegistry.json +0 -2
  356. package/src/forge/_generated/makeRegistry.ts +0 -177
  357. package/src/forge/_generated/makeTemplates.json +0 -2
  358. package/src/forge/_generated/makeTemplates.ts +0 -66
  359. package/src/forge/_generated/mockMap.json +0 -2
  360. package/src/forge/_generated/mockMap.ts +0 -7
  361. package/src/forge/_generated/operationPlaybooks.md +0 -167
  362. package/src/forge/_generated/packageGraph.json +0 -2
  363. package/src/forge/_generated/packageGraph.ts +0 -249334
  364. package/src/forge/_generated/packageUpgradeRegistry.json +0 -2
  365. package/src/forge/_generated/packageUpgradeRegistry.ts +0 -15
  366. package/src/forge/_generated/permissionMatrix.json +0 -2
  367. package/src/forge/_generated/permissionMatrix.ts +0 -7
  368. package/src/forge/_generated/policyRegistry.json +0 -2
  369. package/src/forge/_generated/policyRegistry.ts +0 -11
  370. package/src/forge/_generated/queryRegistry.json +0 -2
  371. package/src/forge/_generated/queryRegistry.ts +0 -9
  372. package/src/forge/_generated/react.d.ts +0 -22
  373. package/src/forge/_generated/react.ts +0 -29
  374. package/src/forge/_generated/reactManifest.json +0 -2
  375. package/src/forge/_generated/reactManifest.ts +0 -19
  376. package/src/forge/_generated/rlsPolicies.json +0 -2
  377. package/src/forge/_generated/rlsPolicies.sql +0 -34
  378. package/src/forge/_generated/rlsPolicies.ts +0 -6
  379. package/src/forge/_generated/runtimeGraph.json +0 -2
  380. package/src/forge/_generated/runtimeGraph.ts +0 -8
  381. package/src/forge/_generated/runtimeMatrix.json +0 -2
  382. package/src/forge/_generated/runtimeMatrix.ts +0 -334130
  383. package/src/forge/_generated/runtimeRegistry.ts +0 -2
  384. package/src/forge/_generated/runtimeRules.md +0 -91
  385. package/src/forge/_generated/secretRegistry.json +0 -2
  386. package/src/forge/_generated/secretRegistry.ts +0 -50
  387. package/src/forge/_generated/secretsContext.ts +0 -11
  388. package/src/forge/_generated/serverApi.ts +0 -10
  389. package/src/forge/_generated/sourceMapManifest.json +0 -2
  390. package/src/forge/_generated/sourceMapManifest.ts +0 -7
  391. package/src/forge/_generated/sqlPlan.json +0 -2
  392. package/src/forge/_generated/sqlPlan.ts +0 -88
  393. package/src/forge/_generated/subscriptionManifest.json +0 -2
  394. package/src/forge/_generated/subscriptionManifest.ts +0 -7
  395. package/src/forge/_generated/symbolicationManifest.json +0 -2
  396. package/src/forge/_generated/symbolicationManifest.ts +0 -17
  397. package/src/forge/_generated/telemetryRegistry.json +0 -2
  398. package/src/forge/_generated/telemetryRegistry.ts +0 -9
  399. package/src/forge/_generated/telemetrySinks.json +0 -2
  400. package/src/forge/_generated/telemetrySinks.ts +0 -11
  401. package/src/forge/_generated/tenantScope.json +0 -2
  402. package/src/forge/_generated/tenantScope.ts +0 -8
  403. package/src/forge/_generated/testGraph.json +0 -2
  404. package/src/forge/_generated/testGraph.ts +0 -3430
  405. package/src/forge/_generated/testPlanRegistry.json +0 -2
  406. package/src/forge/_generated/testPlanRegistry.ts +0 -33
  407. package/src/forge/_generated/uiRoutes.json +0 -2
  408. package/src/forge/_generated/uiRoutes.ts +0 -16
  409. package/src/forge/_generated/uiScenarios.json +0 -2
  410. package/src/forge/_generated/uiScenarios.ts +0 -30
  411. package/src/forge/_generated/uiTestManifest.json +0 -2
  412. package/src/forge/_generated/uiTestManifest.ts +0 -27
  413. package/src/forge/_generated/workflowRegistry.json +0 -2
  414. package/src/forge/_generated/workflowRegistry.ts +0 -9
  415. package/src/forge/_generated/workflowSubscriptions.json +0 -2
  416. package/src/forge/_generated/workflowSubscriptions.ts +0 -10
@@ -21,6 +21,13 @@ import {
21
21
  renderListQuery,
22
22
  renderLiveQuery,
23
23
  renderNextAiPackage,
24
+ renderNuxtApp,
25
+ renderNuxtConfig,
26
+ renderNuxtForgeComposable,
27
+ renderNuxtForgePlugin,
28
+ renderNuxtPackage,
29
+ renderNuxtStatusComponent,
30
+ renderNuxtTsconfig,
24
31
  renderPage,
25
32
  renderPlaceholderTest,
26
33
  renderPolicyFile,
@@ -107,7 +114,7 @@ const EXPLANATIONS: Record<MakeIntent["kind"], string> = {
107
114
  page:
108
115
  "Adds a minimal app page under web/app/<route>/page.tsx.",
109
116
  ui:
110
- "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.",
111
118
  "ai-chat":
112
119
  "Adds a Forge AI agent definition and a React chat component that calls the Forge /ai/agents/run runtime endpoint.",
113
120
  resource:
@@ -193,6 +200,13 @@ function chooseSchemaFile(workspaceRoot: string): string {
193
200
  return "src/forge/schema.ts";
194
201
  }
195
202
 
203
+ function schemaHasTenantsTable(workspaceRoot: string): boolean {
204
+ const schema = readIfExists(workspaceRoot, chooseSchemaFile(workspaceRoot)) ?? "";
205
+ return schema.includes('name: "tenants"') ||
206
+ schema.includes("name: 'tenants'") ||
207
+ /\btenants\s*=\s*(?:defineTable|table)\s*\(/.test(schema);
208
+ }
209
+
196
210
  function choosePolicyFile(workspaceRoot: string): string {
197
211
  if (fileExists(workspaceRoot, "src/policies.ts")) {
198
212
  return "src/policies.ts";
@@ -461,9 +475,14 @@ function parseFieldOptions(options: MakeCommandOptions): {
461
475
  field?: MakeFieldSpec;
462
476
  diagnostics: Diagnostic[];
463
477
  } {
478
+ const fieldSpecs = options.fieldSpecs.map((fieldSpec) =>
479
+ options.values && /^[a-zA-Z][a-zA-Z0-9_]*:enum(?::|$)/.test(fieldSpec)
480
+ ? fieldSpec.replace(":enum", `:enum(${options.values})`)
481
+ : fieldSpec,
482
+ );
464
483
  const rawFields = [
465
484
  ...(options.fieldsRaw ? [options.fieldsRaw] : []),
466
- ...options.fieldSpecs,
485
+ ...fieldSpecs,
467
486
  ];
468
487
  const parsed = parseFields(rawFields);
469
488
  const diagnostics = [...parsed.diagnostics];
@@ -513,7 +532,7 @@ function buildIntent(options: MakeCommandOptions): {
513
532
  const kind = options.primitive as MakeIntent["kind"];
514
533
  const fieldOptions = parseFieldOptions(options);
515
534
  const diagnostics = [...fieldOptions.diagnostics];
516
- if (options.framework && !["vite", "next"].includes(options.framework)) {
535
+ if (options.framework && !["vite", "next", "nuxt"].includes(options.framework)) {
517
536
  diagnostics.push(
518
537
  diagnostic("error", "FORGE_MAKE_PATCH_UNSAFE", `unsupported frontend framework '${options.framework}'`),
519
538
  );
@@ -523,7 +542,7 @@ function buildIntent(options: MakeCommandOptions): {
523
542
  diagnostic(
524
543
  "warning",
525
544
  "FORGE_MAKE_UI_FRAMEWORK_EXPERIMENTAL",
526
- "forge make ui currently generates the Vite React bridge; Next support should use the b2b-support-web template",
545
+ "forge make ui currently generates Vite React and Nuxt Vue bridges; Next support should use the b2b-support-web template",
527
546
  ),
528
547
  );
529
548
  }
@@ -544,6 +563,8 @@ function buildIntent(options: MakeCommandOptions): {
544
563
  kind === "command"
545
564
  ? actionName?.replace(/^(create|update|delete)/, "") || "create"
546
565
  : "read";
566
+ const tenantScoped =
567
+ options.tenantScoped || (kind === "resource" && schemaHasTenantsTable(options.workspaceRoot));
547
568
 
548
569
  return {
549
570
  diagnostics,
@@ -553,7 +574,7 @@ function buildIntent(options: MakeCommandOptions): {
553
574
  table,
554
575
  field: fieldOptions.field,
555
576
  fields,
556
- tenantScoped: options.tenantScoped || kind === "resource",
577
+ tenantScoped,
557
578
  crud: options.withCrud || kind === "resource",
558
579
  liveQuery: options.withLiveQuery || kind === "resource" || kind === "livequery",
559
580
  react:
@@ -574,6 +595,7 @@ function buildIntent(options: MakeCommandOptions): {
574
595
  trigger: options.trigger ?? options.event ?? (table ? `${singular}.created` : undefined),
575
596
  component: options.component,
576
597
  route: options.name ? kebabCase(options.name) : undefined,
598
+ framework: options.framework,
577
599
  withAi: options.withAi || kind === "ai-chat",
578
600
  withCreateForm: options.withCreateForm || kind === "resource",
579
601
  },
@@ -794,6 +816,18 @@ function addFrontendFiles(plan: MakePlan, workspaceRoot: string, intent: MakeInt
794
816
  return;
795
817
  }
796
818
  if (intent.kind === "ui") {
819
+ if (intent.framework === "nuxt") {
820
+ plan.filesToCreate.push(
821
+ createFile(workspaceRoot, "web/package.json", "Add Nuxt web package", renderNuxtPackage(intent.name)),
822
+ createFile(workspaceRoot, "web/nuxt.config.ts", "Add Nuxt runtime config", renderNuxtConfig()),
823
+ createFile(workspaceRoot, "web/tsconfig.json", "Add Nuxt TypeScript config", renderNuxtTsconfig()),
824
+ createFile(workspaceRoot, "web/composables/forge.ts", "Add Forge Vue composable bridge", renderNuxtForgeComposable()),
825
+ createFile(workspaceRoot, "web/plugins/forge.ts", "Add Forge Nuxt plugin", renderNuxtForgePlugin()),
826
+ createFile(workspaceRoot, "web/app.vue", "Add Nuxt app shell", renderNuxtApp()),
827
+ createFile(workspaceRoot, "web/components/ForgeStatus.vue", "Add Forge status component", renderNuxtStatusComponent()),
828
+ );
829
+ return;
830
+ }
797
831
  plan.filesToCreate.push(
798
832
  createFile(workspaceRoot, "web/package.json", "Add Vite React web package", renderVitePackage(intent.name)),
799
833
  createFile(workspaceRoot, "web/tsconfig.json", "Add web TypeScript config", renderViteTsconfig()),
@@ -878,7 +912,7 @@ function buildPlan(options: MakeCommandOptions): MakePlan {
878
912
  kind: "resource" as const,
879
913
  name: options.name ?? "resource",
880
914
  fields: [],
881
- tenantScoped: true,
915
+ tenantScoped: false,
882
916
  crud: true,
883
917
  liveQuery: true,
884
918
  react: true,
@@ -637,9 +637,9 @@ export function renderVitePackage(appName: string): string {
637
637
  },
638
638
  "dependencies": {
639
639
  "@ai-sdk/react": "^3.0.0",
640
- "@vitejs/plugin-react": "^4.3.4",
640
+ "@vitejs/plugin-react": "^6.0.2",
641
641
  "ai": "^6.0.0",
642
- "vite": "^6.0.5",
642
+ "vite": "^8.0.16",
643
643
  "react": "^19.0.0",
644
644
  "react-dom": "^19.0.0"
645
645
  },
@@ -652,6 +652,159 @@ export function renderVitePackage(appName: string): string {
652
652
  `;
653
653
  }
654
654
 
655
+ export function renderNuxtPackage(appName: string): string {
656
+ return `{
657
+ "name": "${kebabCase(appName)}-web",
658
+ "private": true,
659
+ "type": "module",
660
+ "scripts": {
661
+ "dev": "nuxt dev --host 127.0.0.1",
662
+ "build": "nuxt build",
663
+ "typecheck": "nuxt typecheck"
664
+ },
665
+ "dependencies": {
666
+ "nuxt": "^4.0.0",
667
+ "vue": "^3.5.38"
668
+ },
669
+ "devDependencies": {
670
+ "typescript": "^5.7.3"
671
+ }
672
+ }
673
+ `;
674
+ }
675
+
676
+ export function renderNuxtConfig(): string {
677
+ return `export default defineNuxtConfig({
678
+ compatibilityDate: "2026-06-18",
679
+ runtimeConfig: {
680
+ public: {
681
+ forgeUrl: process.env.NUXT_PUBLIC_FORGE_URL ?? "http://127.0.0.1:3765",
682
+ },
683
+ },
684
+ typescript: {
685
+ strict: true,
686
+ },
687
+ });
688
+ `;
689
+ }
690
+
691
+ export function renderNuxtTsconfig(): string {
692
+ return `{
693
+ "extends": "./.nuxt/tsconfig.json"
694
+ }
695
+ `;
696
+ }
697
+
698
+ export function renderNuxtForgeComposable(): string {
699
+ return `export const forgeUrl = "http://127.0.0.1:3765";
700
+
701
+ export { api } from "../../src/forge/_generated/api";
702
+ export { createForgeClient, ForgeError } from "../../src/forge/_generated/client";
703
+ export {
704
+ ForgeVuePlugin,
705
+ provideForge,
706
+ useForgeAuth,
707
+ useForgeClient,
708
+ useForgeCommand,
709
+ useForgeLiveQuery,
710
+ useForgeQuery,
711
+ } from "../../src/forge/_generated/vue";
712
+ `;
713
+ }
714
+
715
+ export function renderNuxtForgePlugin(): string {
716
+ return `import { ForgeVuePlugin } from "../composables/forge";
717
+
718
+ export default defineNuxtPlugin((nuxtApp) => {
719
+ const config = useRuntimeConfig();
720
+
721
+ nuxtApp.vueApp.use(ForgeVuePlugin, {
722
+ url: String(config.public.forgeUrl),
723
+ devAuth: true,
724
+ });
725
+ });
726
+ `;
727
+ }
728
+
729
+ export function renderNuxtApp(): string {
730
+ return `<script setup lang="ts">
731
+ import ForgeStatus from "./components/ForgeStatus.vue";
732
+ </script>
733
+
734
+ <template>
735
+ <main class="shell">
736
+ <p class="eyebrow">ForgeOS Nuxt app</p>
737
+ <h1>Full-stack loop ready</h1>
738
+ <ForgeStatus />
739
+ </main>
740
+ </template>
741
+
742
+ <style scoped>
743
+ .shell {
744
+ width: min(760px, calc(100vw - 32px));
745
+ margin: 0 auto;
746
+ padding: 48px 0;
747
+ }
748
+
749
+ .eyebrow {
750
+ color: #58655f;
751
+ font-size: 0.82rem;
752
+ font-weight: 800;
753
+ text-transform: uppercase;
754
+ }
755
+
756
+ h1 {
757
+ margin: 0 0 12px;
758
+ color: #17211d;
759
+ font-size: 2.2rem;
760
+ }
761
+ </style>
762
+ `;
763
+ }
764
+
765
+ export function renderNuxtStatusComponent(): string {
766
+ return `<script setup lang="ts">
767
+ import { computed } from "vue";
768
+ import { useForgeAuth } from "../composables/forge";
769
+
770
+ const auth = useForgeAuth();
771
+ const tenantLabel = computed(() => auth?.tenantId ?? "dev-tenant");
772
+ const roleLabel = computed(() => auth?.role ?? "owner");
773
+ </script>
774
+
775
+ <template>
776
+ <section class="status-panel">
777
+ <span class="status-dot" aria-hidden="true" />
778
+ <p>
779
+ Connected as <strong>{{ roleLabel }}</strong> on
780
+ <strong>{{ tenantLabel }}</strong>.
781
+ </p>
782
+ </section>
783
+ </template>
784
+
785
+ <style scoped>
786
+ .status-panel {
787
+ display: flex;
788
+ align-items: center;
789
+ gap: 10px;
790
+ margin-top: 24px;
791
+ color: #26332d;
792
+ }
793
+
794
+ .status-dot {
795
+ width: 10px;
796
+ height: 10px;
797
+ border-radius: 999px;
798
+ background: #1f9d55;
799
+ }
800
+
801
+ p {
802
+ margin: 0;
803
+ }
804
+ </style>
805
+ `;
806
+ }
807
+
655
808
  export function renderNextAiPackage(appName: string): string {
656
809
  return `{
657
810
  "name": "${kebabCase(appName)}-web",
@@ -61,6 +61,7 @@ export interface MakeIntent {
61
61
  trigger?: string;
62
62
  component?: string;
63
63
  route?: string;
64
+ framework?: "vite" | "next" | "nuxt";
64
65
  withAi: boolean;
65
66
  withCreateForm: boolean;
66
67
  }
@@ -130,7 +131,7 @@ export interface MakeCommandOptions {
130
131
  event?: string;
131
132
  trigger?: string;
132
133
  component?: string;
133
- framework?: "vite" | "next";
134
+ framework?: "vite" | "next" | "nuxt";
134
135
  withAi: boolean;
135
136
  withCrud: boolean;
136
137
  withLiveQuery: boolean;
@@ -1 +1 @@
1
- export { can, canRole, definePolicies, public_ } from "./server.ts";
1
+ export { can, canPermission, canRole, definePolicies, public_ } from "./server.ts";
@@ -3,7 +3,12 @@ import * as React from "react";
3
3
  export type ForgeReactAuth = {
4
4
  userId?: string;
5
5
  tenantId?: string;
6
+ organizationId?: string;
7
+ organizationMembershipId?: string;
6
8
  role?: string;
9
+ roles?: string[];
10
+ permissions?: string[];
11
+ claims?: Record<string, unknown>;
7
12
  token?: string;
8
13
  getToken?: () => string | Promise<string>;
9
14
  headers?: Record<string, string>;
@@ -24,7 +29,12 @@ export type ForgeDevAuthConfig =
24
29
  | {
25
30
  userId?: string;
26
31
  tenantId?: string;
32
+ organizationId?: string;
33
+ organizationMembershipId?: string;
27
34
  role?: string;
35
+ roles?: string[];
36
+ permissions?: string[];
37
+ claims?: Record<string, unknown>;
28
38
  headers?: Record<string, string>;
29
39
  };
30
40
 
@@ -35,6 +45,22 @@ export type ForgeReactError = Error & {
35
45
  details?: unknown;
36
46
  };
37
47
 
48
+ export type ForgeCommandCallResult<T = unknown> =
49
+ | {
50
+ ok: true;
51
+ result: T;
52
+ status: number;
53
+ traceId?: string;
54
+ diagnostics?: { code: string; message: string }[];
55
+ }
56
+ | {
57
+ ok: false;
58
+ error: { code: string; message: string; details?: unknown };
59
+ status: number;
60
+ traceId?: string;
61
+ diagnostics?: { code: string; message: string }[];
62
+ };
63
+
38
64
  export type LiveSnapshot<T> = {
39
65
  subscriptionId: string;
40
66
  revision: number;
@@ -46,6 +72,7 @@ export type ForgeReactClient = {
46
72
  lastTraceId?: string;
47
73
  query(name: string, args: unknown): Promise<unknown>;
48
74
  command(name: string, args: unknown): Promise<unknown>;
75
+ commandResult?(name: string, args: unknown): Promise<ForgeCommandCallResult<unknown>>;
49
76
  liveQuery(
50
77
  name: string,
51
78
  args: unknown,
@@ -86,6 +113,22 @@ export type UseCommandResult<TArgs, TResult> = {
86
113
  reset: () => void;
87
114
  };
88
115
 
116
+ export type UseCommandResultOptions<TResult> = {
117
+ onSuccess?: (result: TResult) => void;
118
+ onError?: (error: ForgeReactError) => void;
119
+ onSettled?: (result: ForgeCommandCallResult<TResult>) => void;
120
+ };
121
+
122
+ export type UseCommandResultHook<TArgs, TResult> = {
123
+ run: (args: TArgs) => Promise<ForgeCommandCallResult<TResult>>;
124
+ loading: boolean;
125
+ error: ForgeReactError | null;
126
+ result: ForgeCommandCallResult<TResult> | undefined;
127
+ data: TResult | undefined;
128
+ traceId?: string;
129
+ reset: () => void;
130
+ };
131
+
89
132
  export type UseLiveQueryOptions = {
90
133
  enabled?: boolean;
91
134
  };
@@ -113,6 +156,10 @@ export type ForgeReactBindings<TClient extends ForgeReactClient = ForgeReactClie
113
156
  name: string,
114
157
  options?: UseCommandOptions<TResult>,
115
158
  ) => UseCommandResult<TArgs, TResult>;
159
+ useCommandResult: <TArgs = unknown, TResult = unknown>(
160
+ name: string,
161
+ options?: UseCommandResultOptions<TResult>,
162
+ ) => UseCommandResultHook<TArgs, TResult>;
116
163
  useLiveQuery: <TResult = unknown>(
117
164
  name: string,
118
165
  args: unknown,
@@ -155,6 +202,29 @@ function toForgeError(error: unknown): ForgeReactError {
155
202
  return wrapped;
156
203
  }
157
204
 
205
+ function commandErrorToForgeError(result: Extract<ForgeCommandCallResult, { ok: false }>): ForgeReactError {
206
+ const error = new Error(result.error.message) as ForgeReactError;
207
+ error.code = result.error.code;
208
+ error.status = result.status;
209
+ error.traceId = result.traceId;
210
+ error.details = result.error.details ?? result.diagnostics;
211
+ return error;
212
+ }
213
+
214
+ function caughtErrorToCommandResult(error: unknown): ForgeCommandCallResult<never> {
215
+ const forgeError = toForgeError(error);
216
+ return {
217
+ ok: false,
218
+ status: forgeError.status ?? 0,
219
+ traceId: forgeError.traceId,
220
+ error: {
221
+ code: forgeError.code ?? "FORGE_REACT_COMMAND_FAILED",
222
+ message: forgeError.message,
223
+ details: forgeError.details,
224
+ },
225
+ };
226
+ }
227
+
158
228
  function resolveDevAuth(devAuth: ForgeDevAuthConfig | undefined): ForgeReactAuthProvider | undefined {
159
229
  if (!devAuth) {
160
230
  return undefined;
@@ -162,9 +232,16 @@ function resolveDevAuth(devAuth: ForgeDevAuthConfig | undefined): ForgeReactAuth
162
232
  const config = typeof devAuth === "object" ? devAuth : {};
163
233
  return {
164
234
  userId: config.userId ?? "dev-user",
165
- tenantId: config.tenantId ?? "dev-tenant",
235
+ tenantId: config.tenantId ?? config.organizationId ?? "dev-tenant",
166
236
  role: config.role ?? "owner",
167
- headers: config.headers,
237
+ ...(config.organizationId ? { organizationId: config.organizationId } : {}),
238
+ ...(config.organizationMembershipId
239
+ ? { organizationMembershipId: config.organizationMembershipId }
240
+ : {}),
241
+ ...(config.roles ? { roles: config.roles } : {}),
242
+ ...(config.permissions ? { permissions: config.permissions } : {}),
243
+ ...(config.claims ? { claims: config.claims } : {}),
244
+ ...(config.headers ? { headers: config.headers } : {}),
168
245
  };
169
246
  }
170
247
 
@@ -327,6 +404,86 @@ export function createForgeReactBindings<TClient extends ForgeReactClient>(
327
404
  };
328
405
  }
329
406
 
407
+ function useCommandResult<TArgs = unknown, TResult = unknown>(
408
+ name: string,
409
+ options?: UseCommandResultOptions<TResult>,
410
+ ): UseCommandResultHook<TArgs, TResult> {
411
+ const client = useForgeClient();
412
+ const [state, setState] = React.useState<{
413
+ loading: boolean;
414
+ error: ForgeReactError | null;
415
+ result: ForgeCommandCallResult<TResult> | undefined;
416
+ data: TResult | undefined;
417
+ traceId?: string;
418
+ }>({
419
+ loading: false,
420
+ error: null,
421
+ result: undefined,
422
+ data: undefined,
423
+ });
424
+
425
+ const run = React.useCallback(
426
+ async (args: TArgs): Promise<ForgeCommandCallResult<TResult>> => {
427
+ setState((prev) => ({ ...prev, loading: true, error: null }));
428
+ let result: ForgeCommandCallResult<TResult>;
429
+ if (typeof client.commandResult === "function") {
430
+ result = (await client.commandResult(name, args)) as ForgeCommandCallResult<TResult>;
431
+ } else {
432
+ try {
433
+ const data = (await client.command(name, args)) as TResult;
434
+ result = {
435
+ ok: true,
436
+ result: data,
437
+ status: 200,
438
+ traceId: client.lastTraceId,
439
+ };
440
+ } catch (error) {
441
+ result = caughtErrorToCommandResult(error);
442
+ }
443
+ }
444
+
445
+ if (result.ok) {
446
+ setState({
447
+ loading: false,
448
+ error: null,
449
+ result,
450
+ data: result.result,
451
+ traceId: result.traceId ?? client.lastTraceId,
452
+ });
453
+ options?.onSuccess?.(result.result);
454
+ } else {
455
+ const forgeError = commandErrorToForgeError(result);
456
+ setState({
457
+ loading: false,
458
+ error: forgeError,
459
+ result,
460
+ data: undefined,
461
+ traceId: result.traceId,
462
+ });
463
+ options?.onError?.(forgeError);
464
+ }
465
+ options?.onSettled?.(result);
466
+ return result;
467
+ },
468
+ [client, name, options?.onError, options?.onSettled, options?.onSuccess],
469
+ );
470
+
471
+ const reset = React.useCallback(() => {
472
+ setState({
473
+ loading: false,
474
+ error: null,
475
+ result: undefined,
476
+ data: undefined,
477
+ });
478
+ }, []);
479
+
480
+ return {
481
+ ...state,
482
+ run,
483
+ reset,
484
+ };
485
+ }
486
+
330
487
  function useLiveQuery<TResult = unknown>(
331
488
  name: string,
332
489
  args: unknown,
@@ -413,6 +570,7 @@ export function createForgeReactBindings<TClient extends ForgeReactClient>(
413
570
  useAuth,
414
571
  useQuery,
415
572
  useCommand,
573
+ useCommandResult,
416
574
  useLiveQuery,
417
575
  };
418
576
  }
@@ -420,6 +420,7 @@ function createCommandProgram(
420
420
  module: ts.ModuleKind.ESNext,
421
421
  moduleResolution: ts.ModuleResolutionKind.Bundler,
422
422
  noEmit: true,
423
+ noLib: true,
423
424
  skipLibCheck: true,
424
425
  strict: true,
425
426
  target: ts.ScriptTarget.ES2022,
@@ -228,7 +228,7 @@ export const repairRules: RepairRule[] = [
228
228
  failureKind: "secrets",
229
229
  code: "FORGE_SECRET_DIRECT_PROCESS_ENV",
230
230
  summary: `Secret/config usage is unsafe or missing for ${secret}.`,
231
- likelyCause: "Code reads process.env directly, accesses secrets in a forbidden runtime, or the environment lacks a required secret.",
231
+ likelyCause: "Code reads secret/config values through process.env in Forge runtime code, accesses secrets in a forbidden runtime, or the environment lacks a required secret.",
232
232
  confidence: "high",
233
233
  suggestedRepairs: [
234
234
  {
@@ -466,7 +466,7 @@ export function explainDiagnostic(code: string): string {
466
466
  FORGE_GUARD_VIOLATION: "A package or capability is used in a runtime context where it is forbidden. Move side effects to actions/workflows.",
467
467
  FORGE_POLICY_UNKNOWN: "A runtime entry references a missing policy. Create or correct the policy, then simulate expected roles.",
468
468
  FORGE_POLICY_DENIED: "The caller auth context does not satisfy the policy. Fix test auth or intentionally update policy roles.",
469
- FORGE_SECRET_DIRECT_PROCESS_ENV: "Code reads process.env directly. Use ctx.secrets/ctx.config in allowed runtime contexts.",
469
+ FORGE_SECRET_DIRECT_PROCESS_ENV: "Code reads secret/config values through process.env in Forge runtime code. Use ctx.secrets/ctx.config in allowed runtime contexts.",
470
470
  FORGE_AI_FORBIDDEN_CONTEXT: "AI is being used in a deterministic context. Move AI calls to action/workflow/server runtime.",
471
471
  FORGE_WORKFLOW_STEP_FAILED: "A workflow step failed. Inspect the workflow run and trace before retrying.",
472
472
  FORGE_OUTBOX_PROCESS_FAILED: "An outbox delivery failed. Inspect the subscribed action and retry after fixing the cause.",