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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (598) hide show
  1. package/.agents/skills/forge-agent-fabric/SKILL.md +178 -0
  2. package/.agents/skills/forge-agent-fabric/references/managed-workflows.md +95 -0
  3. package/.agents/skills/forge-agent-fabric/references/repository-analysis.md +102 -0
  4. package/.agents/skills/forge-agent-fabric/scripts/fabric.mjs +46 -0
  5. package/.agents/skills/forge-agent-fabric/scripts/repository.mjs +44 -0
  6. package/.npmignore +10 -0
  7. package/AGENTS.md +142 -90
  8. package/CHANGELOG.md +870 -9
  9. package/LICENSE +21 -0
  10. package/README.md +121 -6
  11. package/adapters/go/README.md +23 -0
  12. package/adapters/go/go.mod +3 -0
  13. package/adapters/go/http.go +149 -0
  14. package/adapters/go/registry.go +234 -0
  15. package/adapters/go/types.go +136 -0
  16. package/adapters/java/README.md +68 -0
  17. package/adapters/java/pom.xml +47 -0
  18. package/adapters/java/src/main/java/dev/forgeos/adapter/Auth.java +20 -0
  19. package/adapters/java/src/main/java/dev/forgeos/adapter/Diagnostic.java +16 -0
  20. package/adapters/java/src/main/java/dev/forgeos/adapter/Entry.java +38 -0
  21. package/adapters/java/src/main/java/dev/forgeos/adapter/EntryKind.java +16 -0
  22. package/adapters/java/src/main/java/dev/forgeos/adapter/ErrorInfo.java +4 -0
  23. package/adapters/java/src/main/java/dev/forgeos/adapter/Forge.java +94 -0
  24. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeCall.java +12 -0
  25. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeContext.java +11 -0
  26. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHandler.java +8 -0
  27. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHttpHandler.java +179 -0
  28. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeRegistry.java +121 -0
  29. package/adapters/java/src/main/java/dev/forgeos/adapter/Json.java +14 -0
  30. package/adapters/java/src/main/java/dev/forgeos/adapter/Manifest.java +14 -0
  31. package/adapters/java/src/main/java/dev/forgeos/adapter/RequestEnvelope.java +6 -0
  32. package/adapters/java/src/main/java/dev/forgeos/adapter/ResponseEnvelope.java +25 -0
  33. package/adapters/java/src/main/java/dev/forgeos/adapter/Risk.java +18 -0
  34. package/adapters/java/src/main/java/dev/forgeos/adapter/Schemas.java +36 -0
  35. package/adapters/java/src/main/java/dev/forgeos/adapter/Service.java +65 -0
  36. package/adapters/java/src/main/java/dev/forgeos/adapter/TransactionMode.java +18 -0
  37. package/adapters/java/src/main/java/dev/forgeos/adapter/TypedForgeHandler.java +6 -0
  38. package/adapters/java-spring-boot-starter/README.md +32 -0
  39. package/adapters/java-spring-boot-starter/pom.xml +49 -0
  40. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeCommand.java +22 -0
  41. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeExternalService.java +15 -0
  42. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeQuery.java +16 -0
  43. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeServiceBeanCondition.java +18 -0
  44. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringAutoConfiguration.java +16 -0
  45. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringRuntime.java +104 -0
  46. package/adapters/java-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +1 -0
  47. package/bin/forge.mjs +18 -0
  48. package/docs/agent-fabric-programs.md +151 -0
  49. package/docs/agent-fabric.md +582 -0
  50. package/docs/architecture/agent-fabric/PORTABLE_PROJECTS_PLAN.md +136 -0
  51. package/docs/architecture/agent-fabric/README.md +180 -0
  52. package/docs/architecture/agent-fabric/REPOSITORY_MANIFEST_PLAN.md +284 -0
  53. package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_V2_ADR.md +81 -0
  54. package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_V2_CORRECTIONS.md +39 -0
  55. package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_V2_CORRECTIONS_EVIDENCE.md +53 -0
  56. package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_V2_EVIDENCE.md +49 -0
  57. package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_V2_PLAN.md +590 -0
  58. package/docs/cair-protocol.md +103 -0
  59. package/docs/changelog.md +1070 -0
  60. package/docs/forge-protocol.md +189 -0
  61. package/docs/repository-agent-benchmark.md +179 -0
  62. package/docs/repository-analysis.md +139 -0
  63. package/docs/repository-context-quality.md +179 -0
  64. package/docs/repository-runtime-observation.md +82 -0
  65. package/examples/agent-fabric-v2/README.md +70 -0
  66. package/examples/agent-fabric-v2/item-child.workflow.ts +11 -0
  67. package/examples/agent-fabric-v2/make-request.mjs +4 -0
  68. package/examples/agent-fabric-v2/map-child.workflow.ts +10 -0
  69. package/examples/agent-fabric-v2/migrate.workflow.ts +35 -0
  70. package/examples/agent-fabric-v2/registry.example.json +256 -0
  71. package/examples/agent-fabric-v2/run-ui-fixture.ts +48 -0
  72. package/examples/agent-fabric-v2/ui-audit.workflow.ts +28 -0
  73. package/examples/agent-fabric-v2/ui-fixture-worker.cjs +36 -0
  74. package/examples/agent-fabric-v2/visual-population.json +13 -0
  75. package/examples/agent-fabric-v2/workers/check.mjs +2 -0
  76. package/examples/agent-fabric-v2/workers/common.mjs +7 -0
  77. package/examples/agent-fabric-v2/workers/discover.mjs +2 -0
  78. package/examples/agent-fabric-v2/workers/migrate.mjs +4 -0
  79. package/examples/agent-fabric-v2/workers/review.mjs +3 -0
  80. package/examples/go-billing/go.mod +7 -0
  81. package/examples/go-billing/main.go +120 -0
  82. package/examples/java-billing/pom.xml +60 -0
  83. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/CreateInvoiceInput.java +4 -0
  84. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Invoice.java +11 -0
  85. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Main.java +127 -0
  86. package/package.json +60 -5
  87. package/schemas/agent-fabric/v0.1/control-event.schema.json +281 -0
  88. package/schemas/forge-manifest.schema.json +389 -0
  89. package/scripts/field-test-forgeos.mjs +1021 -0
  90. package/scripts/install-agent-fabric-skill.mjs +105 -0
  91. package/src/forge/_generated/releaseManifest.json +1 -2
  92. package/src/forge/_generated/releaseManifest.ts +3 -3
  93. package/src/forge/agent-adapters/index.ts +1592 -125
  94. package/src/forge/agent-adapters/types.ts +225 -1
  95. package/src/forge/agent-fabric/adapter.ts +131 -0
  96. package/src/forge/agent-fabric/attached-snapshot.ts +55 -0
  97. package/src/forge/agent-fabric/attached-task-contract.ts +105 -0
  98. package/src/forge/agent-fabric/attached-task-service.ts +127 -0
  99. package/src/forge/agent-fabric/attached-task-store.ts +109 -0
  100. package/src/forge/agent-fabric/authority.ts +298 -0
  101. package/src/forge/agent-fabric/canonical.ts +135 -0
  102. package/src/forge/agent-fabric/codex-adversarial-review.ts +229 -0
  103. package/src/forge/agent-fabric/codex-sdk-worker.ts +203 -0
  104. package/src/forge/agent-fabric/conductor.ts +754 -0
  105. package/src/forge/agent-fabric/dictionary.ts +12 -0
  106. package/src/forge/agent-fabric/errors.ts +32 -0
  107. package/src/forge/agent-fabric/hardened-conductor.ts +485 -0
  108. package/src/forge/agent-fabric/hardened-reducer.ts +211 -0
  109. package/src/forge/agent-fabric/index.ts +48 -0
  110. package/src/forge/agent-fabric/journal.ts +116 -0
  111. package/src/forge/agent-fabric/local-adaptive-digest-worker.mjs +26 -0
  112. package/src/forge/agent-fabric/local-adaptive-harness.ts +343 -0
  113. package/src/forge/agent-fabric/local-adaptive-service.ts +398 -0
  114. package/src/forge/agent-fabric/local-adaptive-worker.ts +146 -0
  115. package/src/forge/agent-fabric/local-approval-window.ts +211 -0
  116. package/src/forge/agent-fabric/local-change-review-service.ts +374 -0
  117. package/src/forge/agent-fabric/local-coding-worker.ts +285 -0
  118. package/src/forge/agent-fabric/local-control-store.ts +239 -0
  119. package/src/forge/agent-fabric/local-effect-broker.ts +348 -0
  120. package/src/forge/agent-fabric/local-evolution-approval.ts +81 -0
  121. package/src/forge/agent-fabric/local-evolution-profile.ts +87 -0
  122. package/src/forge/agent-fabric/local-evolution-registry.ts +427 -0
  123. package/src/forge/agent-fabric/local-evolution-service.ts +200 -0
  124. package/src/forge/agent-fabric/local-intelligence.ts +281 -0
  125. package/src/forge/agent-fabric/local-paths.ts +18 -0
  126. package/src/forge/agent-fabric/local-task-contract.ts +203 -0
  127. package/src/forge/agent-fabric/local-task-inbox.ts +543 -0
  128. package/src/forge/agent-fabric/local-task-server.ts +374 -0
  129. package/src/forge/agent-fabric/local-task-service.ts +982 -0
  130. package/src/forge/agent-fabric/local-verification.ts +551 -0
  131. package/src/forge/agent-fabric/managed-environment.ts +205 -0
  132. package/src/forge/agent-fabric/managed-run-contract.ts +103 -0
  133. package/src/forge/agent-fabric/managed-run-service.ts +401 -0
  134. package/src/forge/agent-fabric/managed-run-store.ts +165 -0
  135. package/src/forge/agent-fabric/managed-workspace.ts +253 -0
  136. package/src/forge/agent-fabric/p0a.ts +104 -0
  137. package/src/forge/agent-fabric/p0b-model-adapter.ts +434 -0
  138. package/src/forge/agent-fabric/planning.ts +155 -0
  139. package/src/forge/agent-fabric/program-api.ts +37 -0
  140. package/src/forge/agent-fabric/program-contract.ts +283 -0
  141. package/src/forge/agent-fabric/program-dsl.ts +126 -0
  142. package/src/forge/agent-fabric/program-evidence.ts +22 -0
  143. package/src/forge/agent-fabric/program-image.ts +15 -0
  144. package/src/forge/agent-fabric/program-lock.ts +50 -0
  145. package/src/forge/agent-fabric/program-owner.ts +16 -0
  146. package/src/forge/agent-fabric/program-scheduler.ts +38 -0
  147. package/src/forge/agent-fabric/program-service.ts +793 -0
  148. package/src/forge/agent-fabric/program-store.ts +142 -0
  149. package/src/forge/agent-fabric/program-structure.ts +65 -0
  150. package/src/forge/agent-fabric/program-types.ts +110 -0
  151. package/src/forge/agent-fabric/program-view.ts +12 -0
  152. package/src/forge/agent-fabric/program-worker.ts +108 -0
  153. package/src/forge/agent-fabric/project-profile.ts +50 -0
  154. package/src/forge/agent-fabric/project-registry.ts +120 -0
  155. package/src/forge/agent-fabric/project-runtime.ts +85 -0
  156. package/src/forge/agent-fabric/readiness.ts +26 -0
  157. package/src/forge/agent-fabric/reducer.ts +863 -0
  158. package/src/forge/agent-fabric/repository-context.ts +83 -0
  159. package/src/forge/agent-fabric/resource-ledger.ts +266 -0
  160. package/src/forge/agent-fabric/serialized-local-adapter.ts +60 -0
  161. package/src/forge/agent-fabric/types.ts +424 -0
  162. package/src/forge/agent-fabric/validation.ts +500 -0
  163. package/src/forge/agent-fabric/workflow-engine.ts +218 -0
  164. package/src/forge/agent-fabric/workflow-task-actions.ts +104 -0
  165. package/src/forge/agent-fabric/workflow-templates.ts +11 -0
  166. package/src/forge/agent-memory/bridge.ts +1728 -0
  167. package/src/forge/agent-memory/context-pack.ts +284 -0
  168. package/src/forge/agent-memory/hook-runner.ts +331 -0
  169. package/src/forge/agent-memory/mcp.ts +597 -0
  170. package/src/forge/agent-memory/normalize.ts +498 -0
  171. package/src/forge/agent-memory/redaction.ts +103 -0
  172. package/src/forge/agent-memory/sources/claude-code.ts +51 -0
  173. package/src/forge/agent-memory/sources/codex-hook-runner.mjs +343 -0
  174. package/src/forge/agent-memory/sources/codex.ts +161 -0
  175. package/src/forge/agent-memory/sources/cursor.ts +35 -0
  176. package/src/forge/agent-memory/types.ts +215 -0
  177. package/src/forge/bench.ts +248 -0
  178. package/src/forge/brownfield-import/index.ts +896 -0
  179. package/src/forge/brownfield-import/types.ts +127 -0
  180. package/src/forge/cair/action-journal.ts +61 -0
  181. package/src/forge/cair/action-parser.ts +314 -0
  182. package/src/forge/cair/action-validator.ts +40 -0
  183. package/src/forge/cair/actions.ts +1818 -0
  184. package/src/forge/cair/format.ts +77 -0
  185. package/src/forge/cair/index.ts +118 -0
  186. package/src/forge/cair/query.ts +478 -0
  187. package/src/forge/cair/snapshot.ts +315 -0
  188. package/src/forge/cair/types.ts +255 -0
  189. package/src/forge/cli/adaptive.ts +51 -0
  190. package/src/forge/cli/ai.ts +16 -1
  191. package/src/forge/cli/auth.ts +459 -15
  192. package/src/forge/cli/authmd.ts +441 -0
  193. package/src/forge/cli/baseline.ts +112 -0
  194. package/src/forge/cli/build.ts +20 -4
  195. package/src/forge/cli/changed.ts +418 -0
  196. package/src/forge/cli/codex-app-server.ts +877 -0
  197. package/src/forge/cli/commands.ts +1859 -20
  198. package/src/forge/cli/db.ts +209 -2
  199. package/src/forge/cli/deploy.ts +1339 -0
  200. package/src/forge/cli/deps.ts +150 -23
  201. package/src/forge/cli/dev.ts +1137 -53
  202. package/src/forge/cli/docs.ts +265 -0
  203. package/src/forge/cli/doctor.ts +297 -0
  204. package/src/forge/cli/env-placeholders.ts +62 -0
  205. package/src/forge/cli/evolution.ts +40 -0
  206. package/src/forge/cli/fabric.ts +253 -0
  207. package/src/forge/cli/field-test.ts +568 -0
  208. package/src/forge/cli/golden-path.ts +487 -0
  209. package/src/forge/cli/handoff.ts +336 -0
  210. package/src/forge/cli/index.ts +1 -0
  211. package/src/forge/cli/last-run.ts +84 -0
  212. package/src/forge/cli/main.ts +196 -3
  213. package/src/forge/cli/new.ts +169 -17
  214. package/src/forge/cli/next-actions.ts +23 -0
  215. package/src/forge/cli/output.ts +398 -6
  216. package/src/forge/cli/parse.ts +1377 -38
  217. package/src/forge/cli/progress.ts +51 -0
  218. package/src/forge/cli/query.ts +32 -0
  219. package/src/forge/cli/release.ts +35 -11
  220. package/src/forge/cli/repository.ts +151 -0
  221. package/src/forge/cli/run.ts +42 -0
  222. package/src/forge/cli/secrets.ts +137 -1
  223. package/src/forge/cli/seed.ts +581 -0
  224. package/src/forge/cli/self-host.ts +56 -14
  225. package/src/forge/cli/studio.ts +2282 -0
  226. package/src/forge/cli/verify.ts +1458 -32
  227. package/src/forge/cli/windows.ts +23 -0
  228. package/src/forge/cli/workos.ts +3509 -0
  229. package/src/forge/compiler/agent-contract/build.ts +728 -64
  230. package/src/forge/compiler/agent-contract/types.ts +45 -2
  231. package/src/forge/compiler/ai-registry/parse.ts +71 -2
  232. package/src/forge/compiler/api-surface/build.ts +47 -0
  233. package/src/forge/compiler/app-graph/build.ts +112 -9
  234. package/src/forge/compiler/app-graph/extract.ts +107 -0
  235. package/src/forge/compiler/app-graph/module-graph.ts +73 -78
  236. package/src/forge/compiler/app-graph/parser.ts +24 -24
  237. package/src/forge/compiler/app-graph/profile.ts +26 -0
  238. package/src/forge/compiler/app-graph/tsconfig-hash.ts +41 -4
  239. package/src/forge/compiler/app-graph/versions.ts +1 -1
  240. package/src/forge/compiler/classifier/capabilities.ts +3 -2
  241. package/src/forge/compiler/classifier/classify.ts +32 -8
  242. package/src/forge/compiler/classifier/secrets.ts +3 -2
  243. package/src/forge/compiler/classifier/signals.ts +91 -1
  244. package/src/forge/compiler/client-sdk/build-manifest.ts +59 -0
  245. package/src/forge/compiler/client-sdk/render-client.ts +295 -13
  246. package/src/forge/compiler/data-graph/build.ts +29 -1
  247. package/src/forge/compiler/data-graph/parse.ts +20 -4
  248. package/src/forge/compiler/data-graph/sql/ddl.ts +144 -31
  249. package/src/forge/compiler/data-graph/sql/serialize.ts +4 -0
  250. package/src/forge/compiler/data-graph/sql/types.ts +1 -0
  251. package/src/forge/compiler/diagnostics/codes.ts +38 -0
  252. package/src/forge/compiler/diagnostics/create.ts +28 -2
  253. package/src/forge/compiler/diagnostics/index.ts +2 -0
  254. package/src/forge/compiler/emitter/barrel.ts +3 -0
  255. package/src/forge/compiler/emitter/render.ts +9 -0
  256. package/src/forge/compiler/external-manifest/registry.ts +217 -0
  257. package/src/forge/compiler/external-manifest/types.ts +91 -0
  258. package/src/forge/compiler/external-manifest/validate.ts +373 -0
  259. package/src/forge/compiler/frontend-graph/build.ts +142 -14
  260. package/src/forge/compiler/integration/add.ts +991 -33
  261. package/src/forge/compiler/integration/plan.ts +43 -12
  262. package/src/forge/compiler/integration/render.ts +29 -0
  263. package/src/forge/compiler/integration/snapshot.ts +2 -0
  264. package/src/forge/compiler/integration/templates/convex.ts +70 -0
  265. package/src/forge/compiler/integration/templates/index.ts +1 -0
  266. package/src/forge/compiler/integration/templates/render.ts +38 -0
  267. package/src/forge/compiler/integration/templates/types.ts +3 -0
  268. package/src/forge/compiler/integration/templates/workos.ts +1439 -0
  269. package/src/forge/compiler/make-registry/build.ts +8 -9
  270. package/src/forge/compiler/orchestrator/fast-check.ts +4 -0
  271. package/src/forge/compiler/orchestrator/generate-lock.ts +14 -3
  272. package/src/forge/compiler/orchestrator/manifest.ts +1 -1
  273. package/src/forge/compiler/orchestrator/plan-profile.ts +23 -0
  274. package/src/forge/compiler/orchestrator/plan.ts +249 -10
  275. package/src/forge/compiler/orchestrator/profile.ts +65 -0
  276. package/src/forge/compiler/orchestrator/run.ts +101 -33
  277. package/src/forge/compiler/orchestrator/serialize.ts +33 -8
  278. package/src/forge/compiler/orchestrator/types.ts +1 -1
  279. package/src/forge/compiler/package-graph/compiler.ts +3 -1
  280. package/src/forge/compiler/package-graph/constants.ts +1 -1
  281. package/src/forge/compiler/package-graph/dts-extractor.ts +14 -1
  282. package/src/forge/compiler/package-manager/adapter.ts +4 -1
  283. package/src/forge/compiler/package-manager/commands.ts +4 -0
  284. package/src/forge/compiler/package-manager/executor.ts +30 -1
  285. package/src/forge/compiler/package-manager/version.ts +36 -12
  286. package/src/forge/compiler/package-upgrades/planner.ts +155 -18
  287. package/src/forge/compiler/package-upgrades/types.ts +2 -0
  288. package/src/forge/compiler/policy-registry/build.ts +47 -2
  289. package/src/forge/compiler/policy-registry/parse.ts +32 -2
  290. package/src/forge/compiler/recipes/definitions.ts +63 -0
  291. package/src/forge/compiler/recipes/index.ts +2 -0
  292. package/src/forge/compiler/recipes/profiles.ts +81 -0
  293. package/src/forge/compiler/recipes/registry.ts +6 -0
  294. package/src/forge/compiler/test-graph/build.ts +11 -3
  295. package/src/forge/compiler/types/app-graph.ts +8 -2
  296. package/src/forge/compiler/types/cli.ts +76 -1
  297. package/src/forge/compiler/types/dev-manifest.ts +4 -0
  298. package/src/forge/compiler/types/emit.ts +2 -0
  299. package/src/forge/compiler/types/frontend-graph.ts +2 -2
  300. package/src/forge/compiler/types/integration.ts +1 -0
  301. package/src/forge/compiler/types/package-graph.ts +6 -0
  302. package/src/forge/compiler/types/policy-registry.ts +3 -1
  303. package/src/forge/delta/broker-runner.mjs +5 -0
  304. package/src/forge/delta/broker.ts +429 -0
  305. package/src/forge/delta/classifier.ts +52 -0
  306. package/src/forge/delta/explain.ts +238 -0
  307. package/src/forge/delta/git-observer.ts +67 -0
  308. package/src/forge/delta/ids.ts +44 -0
  309. package/src/forge/delta/index.ts +25 -0
  310. package/src/forge/delta/process-identity.ts +37 -0
  311. package/src/forge/delta/queue-status.ts +190 -0
  312. package/src/forge/delta/recorder.ts +540 -0
  313. package/src/forge/delta/redaction.ts +50 -0
  314. package/src/forge/delta/schema.ts +240 -0
  315. package/src/forge/delta/session.ts +142 -0
  316. package/src/forge/delta/status.ts +1139 -0
  317. package/src/forge/delta/store.ts +3329 -0
  318. package/src/forge/delta/timeline.ts +178 -0
  319. package/src/forge/dev/server.ts +1061 -22
  320. package/src/forge/dev/types.ts +15 -1
  321. package/src/forge/dev/watch.ts +17 -7
  322. package/src/forge/dev-console/cycle.ts +285 -33
  323. package/src/forge/dev-console/types.ts +47 -1
  324. package/src/forge/impact/index.ts +222 -30
  325. package/src/forge/impact/types.ts +33 -1
  326. package/src/forge/intent/index.ts +35 -16
  327. package/src/forge/make/fields.ts +26 -0
  328. package/src/forge/make/index.ts +42 -6
  329. package/src/forge/make/templates.ts +211 -4
  330. package/src/forge/make/types.ts +2 -1
  331. package/src/forge/policy.ts +1 -1
  332. package/src/forge/react/index.ts +160 -2
  333. package/src/forge/refactor/index.ts +1 -0
  334. package/src/forge/repair/rules/index.ts +2 -2
  335. package/src/forge/repository-analysis/adapters/common.ts +72 -0
  336. package/src/forge/repository-analysis/adapters/docker.ts +185 -0
  337. package/src/forge/repository-analysis/adapters/java.ts +133 -0
  338. package/src/forge/repository-analysis/adapters/typescript.ts +350 -0
  339. package/src/forge/repository-analysis/adapters/vue.ts +71 -0
  340. package/src/forge/repository-analysis/analyze.ts +434 -0
  341. package/src/forge/repository-analysis/benchmark.ts +336 -0
  342. package/src/forge/repository-analysis/cache-gc.ts +154 -0
  343. package/src/forge/repository-analysis/check-selection.ts +123 -0
  344. package/src/forge/repository-analysis/context-node.ts +17 -0
  345. package/src/forge/repository-analysis/context.ts +456 -0
  346. package/src/forge/repository-analysis/http-resolution.ts +135 -0
  347. package/src/forge/repository-analysis/identity.ts +45 -0
  348. package/src/forge/repository-analysis/index.ts +18 -0
  349. package/src/forge/repository-analysis/nuxt-resolution.ts +188 -0
  350. package/src/forge/repository-analysis/quality.ts +60 -0
  351. package/src/forge/repository-analysis/retrieval.ts +309 -0
  352. package/src/forge/repository-analysis/runtime-artifacts.ts +195 -0
  353. package/src/forge/repository-analysis/runtime-observation.ts +325 -0
  354. package/src/forge/repository-analysis/scanner.ts +174 -0
  355. package/src/forge/repository-analysis/storage.ts +193 -0
  356. package/src/forge/repository-analysis/test-associations.ts +59 -0
  357. package/src/forge/repository-analysis/types.ts +99 -0
  358. package/src/forge/repository-manifest/index.ts +178 -0
  359. package/src/forge/repository-manifest/types.ts +63 -0
  360. package/src/forge/review/index.ts +162 -12
  361. package/src/forge/review/types.ts +15 -0
  362. package/src/forge/runtime/ai/providers.ts +19 -4
  363. package/src/forge/runtime/auth/config.ts +17 -0
  364. package/src/forge/runtime/auth/evaluate.ts +15 -2
  365. package/src/forge/runtime/auth/resolve.ts +61 -6
  366. package/src/forge/runtime/auth/types.ts +1 -0
  367. package/src/forge/runtime/db/factory.ts +1 -3
  368. package/src/forge/runtime/db/generated-client.ts +13 -2
  369. package/src/forge/runtime/db/memory-adapter.ts +139 -32
  370. package/src/forge/runtime/db/pglite-adapter.ts +285 -2
  371. package/src/forge/runtime/executor.ts +129 -16
  372. package/src/forge/runtime/external/bridge.ts +663 -0
  373. package/src/forge/runtime/runner/run-entry.ts +16 -7
  374. package/src/forge/runtime/telemetry/buffer.ts +4 -1
  375. package/src/forge/runtime/telemetry/scrubber.ts +35 -5
  376. package/src/forge/runtime/webhooks/security.ts +12 -7
  377. package/src/forge/server.ts +71 -7
  378. package/src/forge/ui/index.ts +831 -19
  379. package/src/forge/ui/types.ts +3 -1
  380. package/src/forge/version.ts +1 -1
  381. package/src/forge/vue/index.ts +422 -0
  382. package/src/forge/workspace/baseline.ts +112 -0
  383. package/src/forge/workspace/change-summary.ts +292 -0
  384. package/src/forge/workspace/forge-cli.ts +42 -0
  385. package/src/forge/workspace/git-summary.ts +393 -0
  386. package/templates/agent-workroom/AGENTS.md +29 -0
  387. package/templates/agent-workroom/README.md +34 -0
  388. package/templates/agent-workroom/forge.config.ts +3 -0
  389. package/templates/agent-workroom/package.json +34 -0
  390. package/templates/agent-workroom/pnpm-workspace.yaml +2 -0
  391. package/templates/agent-workroom/src/actions/indexAgentSignal.ts +10 -0
  392. package/templates/agent-workroom/src/commands/openWorkroom.ts +61 -0
  393. package/templates/agent-workroom/src/commands/recordAgentSignal.ts +119 -0
  394. package/templates/agent-workroom/src/commands/recordCheckRun.ts +52 -0
  395. package/templates/agent-workroom/src/forge/schema.ts +54 -0
  396. package/templates/agent-workroom/src/policies.ts +6 -0
  397. package/templates/agent-workroom/src/queries/listWorkrooms.ts +11 -0
  398. package/templates/agent-workroom/src/queries/liveWorkroom.ts +63 -0
  399. package/templates/agent-workroom/tsconfig.json +16 -0
  400. package/templates/agent-workroom/web/index.html +13 -0
  401. package/templates/agent-workroom/web/package.json +21 -0
  402. package/templates/agent-workroom/web/src/App.tsx +345 -0
  403. package/templates/agent-workroom/web/src/lib/forge.ts +20 -0
  404. package/templates/agent-workroom/web/src/main.tsx +13 -0
  405. package/templates/agent-workroom/web/src/styles.css +545 -0
  406. package/templates/agent-workroom/web/tsconfig.json +27 -0
  407. package/templates/agent-workroom/web/vite.config.ts +36 -0
  408. package/templates/b2b-support-web/package.json +2 -0
  409. package/templates/b2b-support-web/pnpm-workspace.yaml +2 -0
  410. package/templates/b2b-support-web/web/app/page.tsx +2 -2
  411. package/templates/b2b-support-web/web/lib/forge.ts +9 -2
  412. package/templates/b2b-support-web/web/next.config.ts +24 -0
  413. package/templates/b2b-support-web/web/package.json +1 -1
  414. package/templates/minimal-web/package.json +2 -1
  415. package/templates/minimal-web/pnpm-workspace.yaml +2 -0
  416. package/templates/minimal-web/web/index.html +1 -0
  417. package/templates/minimal-web/web/src/App.tsx +12 -6
  418. package/templates/minimal-web/web/src/lib/forge.ts +9 -2
  419. package/templates/minimal-web/web/src/styles.css +34 -0
  420. package/templates/minimal-web/web/vite.config.ts +36 -0
  421. package/templates/nuxt-web/.vscode/settings.json +14 -0
  422. package/templates/nuxt-web/.yarnrc.yml +1 -0
  423. package/templates/nuxt-web/README.md +30 -0
  424. package/templates/nuxt-web/forge.config.ts +3 -0
  425. package/templates/nuxt-web/package.json +37 -0
  426. package/templates/nuxt-web/pnpm-workspace.yaml +2 -0
  427. package/templates/nuxt-web/src/actions/logNoteCreated.ts +11 -0
  428. package/templates/nuxt-web/src/commands/createNote.ts +26 -0
  429. package/templates/nuxt-web/src/forge/schema.ts +12 -0
  430. package/templates/nuxt-web/src/policies.ts +6 -0
  431. package/templates/nuxt-web/src/queries/listNotes.ts +8 -0
  432. package/templates/nuxt-web/src/queries/liveNotes.ts +8 -0
  433. package/templates/nuxt-web/tsconfig.json +17 -0
  434. package/templates/nuxt-web/web/app.vue +67 -0
  435. package/templates/nuxt-web/web/components/LiveNotes.vue +89 -0
  436. package/templates/nuxt-web/web/components/NoteComposer.vue +100 -0
  437. package/templates/nuxt-web/web/composables/forge.ts +13 -0
  438. package/templates/nuxt-web/web/composables/useNotes.ts +24 -0
  439. package/templates/nuxt-web/web/nuxt.config.ts +11 -0
  440. package/templates/nuxt-web/web/package.json +22 -0
  441. package/templates/nuxt-web/web/plugins/forge.client.ts +10 -0
  442. package/templates/nuxt-web/web/plugins/forge.server.ts +10 -0
  443. package/templates/nuxt-web/web/server/api/forge-health.get.ts +7 -0
  444. package/templates/nuxt-web/web/tsconfig.json +6 -0
  445. package/templates/vendor-access/.vscode/settings.json +14 -0
  446. package/templates/vendor-access/README.md +30 -0
  447. package/templates/vendor-access/forge.config.ts +3 -0
  448. package/templates/vendor-access/package.json +35 -0
  449. package/templates/vendor-access/pnpm-workspace.yaml +2 -0
  450. package/templates/vendor-access/src/commands/addEvidence.ts +42 -0
  451. package/templates/vendor-access/src/commands/approveAccessRequest.ts +43 -0
  452. package/templates/vendor-access/src/commands/createAccessRequest.ts +49 -0
  453. package/templates/vendor-access/src/commands/seedVendorAccessDemo.ts +200 -0
  454. package/templates/vendor-access/src/forge/schema.ts +74 -0
  455. package/templates/vendor-access/src/policies.ts +11 -0
  456. package/templates/vendor-access/src/queries/listVendorAccessDashboard.ts +24 -0
  457. package/templates/vendor-access/src/queries/liveVendorAccessDashboard.ts +24 -0
  458. package/templates/vendor-access/tsconfig.json +17 -0
  459. package/templates/vendor-access/web/index.html +13 -0
  460. package/templates/vendor-access/web/package.json +21 -0
  461. package/templates/vendor-access/web/src/App.tsx +573 -0
  462. package/templates/vendor-access/web/src/lib/forge.ts +20 -0
  463. package/templates/vendor-access/web/src/main.tsx +205 -0
  464. package/templates/vendor-access/web/src/styles.css +682 -0
  465. package/templates/vendor-access/web/tsconfig.json +18 -0
  466. package/templates/vendor-access/web/vite.config.ts +36 -0
  467. package/src/forge/_generated/actionSubscriptions.json +0 -2
  468. package/src/forge/_generated/actionSubscriptions.ts +0 -10
  469. package/src/forge/_generated/agentAdapterManifest.json +0 -2
  470. package/src/forge/_generated/agentAdapterManifest.ts +0 -73
  471. package/src/forge/_generated/agentContract.json +0 -2
  472. package/src/forge/_generated/agentContract.ts +0 -7829
  473. package/src/forge/_generated/agentQuickstart.md +0 -34
  474. package/src/forge/_generated/agentTools.json +0 -2
  475. package/src/forge/_generated/agentTools.md +0 -16
  476. package/src/forge/_generated/agentTools.ts +0 -12
  477. package/src/forge/_generated/aiContext.ts +0 -125
  478. package/src/forge/_generated/aiModels.json +0 -2
  479. package/src/forge/_generated/aiModels.ts +0 -51
  480. package/src/forge/_generated/aiProviders.json +0 -2
  481. package/src/forge/_generated/aiProviders.ts +0 -23
  482. package/src/forge/_generated/aiRegistry.json +0 -2
  483. package/src/forge/_generated/aiRegistry.ts +0 -31
  484. package/src/forge/_generated/api.json +0 -2
  485. package/src/forge/_generated/api.ts +0 -8
  486. package/src/forge/_generated/appGraph.json +0 -2
  487. package/src/forge/_generated/appGraph.ts +0 -14937
  488. package/src/forge/_generated/appMap.md +0 -55
  489. package/src/forge/_generated/artifactManifest.json +0 -2
  490. package/src/forge/_generated/artifactManifest.ts +0 -7
  491. package/src/forge/_generated/authClaims.json +0 -2
  492. package/src/forge/_generated/authClaims.ts +0 -13
  493. package/src/forge/_generated/authConfig.json +0 -2
  494. package/src/forge/_generated/authConfig.ts +0 -17
  495. package/src/forge/_generated/authContext.ts +0 -23
  496. package/src/forge/_generated/authRegistry.json +0 -2
  497. package/src/forge/_generated/authRegistry.ts +0 -25
  498. package/src/forge/_generated/buildInfo.json +0 -2
  499. package/src/forge/_generated/buildInfo.ts +0 -9
  500. package/src/forge/_generated/capabilityMap.json +0 -2
  501. package/src/forge/_generated/capabilityMap.md +0 -15
  502. package/src/forge/_generated/capabilityMap.ts +0 -17
  503. package/src/forge/_generated/client.ts +0 -282
  504. package/src/forge/_generated/clientApi.ts +0 -9
  505. package/src/forge/_generated/clientManifest.json +0 -2
  506. package/src/forge/_generated/clientManifest.ts +0 -39
  507. package/src/forge/_generated/clientTypes.ts +0 -78
  508. package/src/forge/_generated/configRegistry.json +0 -2
  509. package/src/forge/_generated/configRegistry.ts +0 -4
  510. package/src/forge/_generated/dataGraph.json +0 -2
  511. package/src/forge/_generated/dataGraph.ts +0 -8
  512. package/src/forge/_generated/db.json +0 -2
  513. package/src/forge/_generated/db.ts +0 -2
  514. package/src/forge/_generated/dbSecurityManifest.json +0 -2
  515. package/src/forge/_generated/dbSecurityManifest.ts +0 -15
  516. package/src/forge/_generated/dbSessionContext.json +0 -2
  517. package/src/forge/_generated/dbSessionContext.ts +0 -39
  518. package/src/forge/_generated/deployManifest.json +0 -2
  519. package/src/forge/_generated/deployManifest.ts +0 -14
  520. package/src/forge/_generated/devManifest.json +0 -2
  521. package/src/forge/_generated/devManifest.ts +0 -62
  522. package/src/forge/_generated/envSchema.json +0 -2
  523. package/src/forge/_generated/envSchema.ts +0 -59
  524. package/src/forge/_generated/frontendGraph.json +0 -2
  525. package/src/forge/_generated/frontendGraph.ts +0 -27
  526. package/src/forge/_generated/importGuards.json +0 -2
  527. package/src/forge/_generated/importGuards.ts +0 -686
  528. package/src/forge/_generated/index.ts +0 -68
  529. package/src/forge/_generated/liveProductionManifest.json +0 -2
  530. package/src/forge/_generated/liveProductionManifest.ts +0 -23
  531. package/src/forge/_generated/liveProtocol.json +0 -2
  532. package/src/forge/_generated/liveProtocol.ts +0 -21
  533. package/src/forge/_generated/liveQueryRegistry.json +0 -2
  534. package/src/forge/_generated/liveQueryRegistry.ts +0 -9
  535. package/src/forge/_generated/liveTransportConfig.json +0 -2
  536. package/src/forge/_generated/liveTransportConfig.ts +0 -19
  537. package/src/forge/_generated/makeRegistry.json +0 -2
  538. package/src/forge/_generated/makeRegistry.ts +0 -177
  539. package/src/forge/_generated/makeTemplates.json +0 -2
  540. package/src/forge/_generated/makeTemplates.ts +0 -66
  541. package/src/forge/_generated/mockMap.json +0 -2
  542. package/src/forge/_generated/mockMap.ts +0 -7
  543. package/src/forge/_generated/operationPlaybooks.md +0 -167
  544. package/src/forge/_generated/packageGraph.json +0 -2
  545. package/src/forge/_generated/packageGraph.ts +0 -249334
  546. package/src/forge/_generated/packageUpgradeRegistry.json +0 -2
  547. package/src/forge/_generated/packageUpgradeRegistry.ts +0 -15
  548. package/src/forge/_generated/permissionMatrix.json +0 -2
  549. package/src/forge/_generated/permissionMatrix.ts +0 -7
  550. package/src/forge/_generated/policyRegistry.json +0 -2
  551. package/src/forge/_generated/policyRegistry.ts +0 -11
  552. package/src/forge/_generated/queryRegistry.json +0 -2
  553. package/src/forge/_generated/queryRegistry.ts +0 -9
  554. package/src/forge/_generated/react.d.ts +0 -22
  555. package/src/forge/_generated/react.ts +0 -29
  556. package/src/forge/_generated/reactManifest.json +0 -2
  557. package/src/forge/_generated/reactManifest.ts +0 -19
  558. package/src/forge/_generated/rlsPolicies.json +0 -2
  559. package/src/forge/_generated/rlsPolicies.sql +0 -34
  560. package/src/forge/_generated/rlsPolicies.ts +0 -6
  561. package/src/forge/_generated/runtimeGraph.json +0 -2
  562. package/src/forge/_generated/runtimeGraph.ts +0 -8
  563. package/src/forge/_generated/runtimeMatrix.json +0 -2
  564. package/src/forge/_generated/runtimeMatrix.ts +0 -334130
  565. package/src/forge/_generated/runtimeRegistry.ts +0 -2
  566. package/src/forge/_generated/runtimeRules.md +0 -91
  567. package/src/forge/_generated/secretRegistry.json +0 -2
  568. package/src/forge/_generated/secretRegistry.ts +0 -50
  569. package/src/forge/_generated/secretsContext.ts +0 -11
  570. package/src/forge/_generated/serverApi.ts +0 -10
  571. package/src/forge/_generated/sourceMapManifest.json +0 -2
  572. package/src/forge/_generated/sourceMapManifest.ts +0 -7
  573. package/src/forge/_generated/sqlPlan.json +0 -2
  574. package/src/forge/_generated/sqlPlan.ts +0 -88
  575. package/src/forge/_generated/subscriptionManifest.json +0 -2
  576. package/src/forge/_generated/subscriptionManifest.ts +0 -7
  577. package/src/forge/_generated/symbolicationManifest.json +0 -2
  578. package/src/forge/_generated/symbolicationManifest.ts +0 -17
  579. package/src/forge/_generated/telemetryRegistry.json +0 -2
  580. package/src/forge/_generated/telemetryRegistry.ts +0 -9
  581. package/src/forge/_generated/telemetrySinks.json +0 -2
  582. package/src/forge/_generated/telemetrySinks.ts +0 -11
  583. package/src/forge/_generated/tenantScope.json +0 -2
  584. package/src/forge/_generated/tenantScope.ts +0 -8
  585. package/src/forge/_generated/testGraph.json +0 -2
  586. package/src/forge/_generated/testGraph.ts +0 -3452
  587. package/src/forge/_generated/testPlanRegistry.json +0 -2
  588. package/src/forge/_generated/testPlanRegistry.ts +0 -33
  589. package/src/forge/_generated/uiRoutes.json +0 -2
  590. package/src/forge/_generated/uiRoutes.ts +0 -16
  591. package/src/forge/_generated/uiScenarios.json +0 -2
  592. package/src/forge/_generated/uiScenarios.ts +0 -30
  593. package/src/forge/_generated/uiTestManifest.json +0 -2
  594. package/src/forge/_generated/uiTestManifest.ts +0 -27
  595. package/src/forge/_generated/workflowRegistry.json +0 -2
  596. package/src/forge/_generated/workflowRegistry.ts +0 -9
  597. package/src/forge/_generated/workflowSubscriptions.json +0 -2
  598. package/src/forge/_generated/workflowSubscriptions.ts +0 -10
@@ -21,12 +21,20 @@ 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,
27
34
  renderSchemaTable,
28
35
  renderUpdateCommand,
29
36
  renderViteApp,
37
+ renderViteConfig,
30
38
  renderViteIndex,
31
39
  renderViteMain,
32
40
  renderVitePackage,
@@ -107,7 +115,7 @@ const EXPLANATIONS: Record<MakeIntent["kind"], string> = {
107
115
  page:
108
116
  "Adds a minimal app page under web/app/<route>/page.tsx.",
109
117
  ui:
110
- "Adds a minimal Vite React web app with ForgeProvider devAuth and a generated client bridge.",
118
+ "Adds a minimal Vite React or Nuxt Vue web app with generated Forge client bindings.",
111
119
  "ai-chat":
112
120
  "Adds a Forge AI agent definition and a React chat component that calls the Forge /ai/agents/run runtime endpoint.",
113
121
  resource:
@@ -193,6 +201,13 @@ function chooseSchemaFile(workspaceRoot: string): string {
193
201
  return "src/forge/schema.ts";
194
202
  }
195
203
 
204
+ function schemaHasTenantsTable(workspaceRoot: string): boolean {
205
+ const schema = readIfExists(workspaceRoot, chooseSchemaFile(workspaceRoot)) ?? "";
206
+ return schema.includes('name: "tenants"') ||
207
+ schema.includes("name: 'tenants'") ||
208
+ /\btenants\s*=\s*(?:defineTable|table)\s*\(/.test(schema);
209
+ }
210
+
196
211
  function choosePolicyFile(workspaceRoot: string): string {
197
212
  if (fileExists(workspaceRoot, "src/policies.ts")) {
198
213
  return "src/policies.ts";
@@ -461,9 +476,14 @@ function parseFieldOptions(options: MakeCommandOptions): {
461
476
  field?: MakeFieldSpec;
462
477
  diagnostics: Diagnostic[];
463
478
  } {
479
+ const fieldSpecs = options.fieldSpecs.map((fieldSpec) =>
480
+ options.values && /^[a-zA-Z][a-zA-Z0-9_]*:enum(?::|$)/.test(fieldSpec)
481
+ ? fieldSpec.replace(":enum", `:enum(${options.values})`)
482
+ : fieldSpec,
483
+ );
464
484
  const rawFields = [
465
485
  ...(options.fieldsRaw ? [options.fieldsRaw] : []),
466
- ...options.fieldSpecs,
486
+ ...fieldSpecs,
467
487
  ];
468
488
  const parsed = parseFields(rawFields);
469
489
  const diagnostics = [...parsed.diagnostics];
@@ -513,7 +533,7 @@ function buildIntent(options: MakeCommandOptions): {
513
533
  const kind = options.primitive as MakeIntent["kind"];
514
534
  const fieldOptions = parseFieldOptions(options);
515
535
  const diagnostics = [...fieldOptions.diagnostics];
516
- if (options.framework && !["vite", "next"].includes(options.framework)) {
536
+ if (options.framework && !["vite", "next", "nuxt"].includes(options.framework)) {
517
537
  diagnostics.push(
518
538
  diagnostic("error", "FORGE_MAKE_PATCH_UNSAFE", `unsupported frontend framework '${options.framework}'`),
519
539
  );
@@ -523,7 +543,7 @@ function buildIntent(options: MakeCommandOptions): {
523
543
  diagnostic(
524
544
  "warning",
525
545
  "FORGE_MAKE_UI_FRAMEWORK_EXPERIMENTAL",
526
- "forge make ui currently generates the Vite React bridge; Next support should use the b2b-support-web template",
546
+ "forge make ui currently generates Vite React and Nuxt Vue bridges; Next support should use the b2b-support-web template",
527
547
  ),
528
548
  );
529
549
  }
@@ -544,6 +564,8 @@ function buildIntent(options: MakeCommandOptions): {
544
564
  kind === "command"
545
565
  ? actionName?.replace(/^(create|update|delete)/, "") || "create"
546
566
  : "read";
567
+ const tenantScoped =
568
+ options.tenantScoped || (kind === "resource" && schemaHasTenantsTable(options.workspaceRoot));
547
569
 
548
570
  return {
549
571
  diagnostics,
@@ -553,7 +575,7 @@ function buildIntent(options: MakeCommandOptions): {
553
575
  table,
554
576
  field: fieldOptions.field,
555
577
  fields,
556
- tenantScoped: options.tenantScoped || kind === "resource",
578
+ tenantScoped,
557
579
  crud: options.withCrud || kind === "resource",
558
580
  liveQuery: options.withLiveQuery || kind === "resource" || kind === "livequery",
559
581
  react:
@@ -574,6 +596,7 @@ function buildIntent(options: MakeCommandOptions): {
574
596
  trigger: options.trigger ?? options.event ?? (table ? `${singular}.created` : undefined),
575
597
  component: options.component,
576
598
  route: options.name ? kebabCase(options.name) : undefined,
599
+ framework: options.framework,
577
600
  withAi: options.withAi || kind === "ai-chat",
578
601
  withCreateForm: options.withCreateForm || kind === "resource",
579
602
  },
@@ -794,9 +817,22 @@ function addFrontendFiles(plan: MakePlan, workspaceRoot: string, intent: MakeInt
794
817
  return;
795
818
  }
796
819
  if (intent.kind === "ui") {
820
+ if (intent.framework === "nuxt") {
821
+ plan.filesToCreate.push(
822
+ createFile(workspaceRoot, "web/package.json", "Add Nuxt web package", renderNuxtPackage(intent.name)),
823
+ createFile(workspaceRoot, "web/nuxt.config.ts", "Add Nuxt runtime config", renderNuxtConfig()),
824
+ createFile(workspaceRoot, "web/tsconfig.json", "Add Nuxt TypeScript config", renderNuxtTsconfig()),
825
+ createFile(workspaceRoot, "web/composables/forge.ts", "Add Forge Vue composable bridge", renderNuxtForgeComposable()),
826
+ createFile(workspaceRoot, "web/plugins/forge.ts", "Add Forge Nuxt plugin", renderNuxtForgePlugin()),
827
+ createFile(workspaceRoot, "web/app.vue", "Add Nuxt app shell", renderNuxtApp()),
828
+ createFile(workspaceRoot, "web/components/ForgeStatus.vue", "Add Forge status component", renderNuxtStatusComponent()),
829
+ );
830
+ return;
831
+ }
797
832
  plan.filesToCreate.push(
798
833
  createFile(workspaceRoot, "web/package.json", "Add Vite React web package", renderVitePackage(intent.name)),
799
834
  createFile(workspaceRoot, "web/tsconfig.json", "Add web TypeScript config", renderViteTsconfig()),
835
+ createFile(workspaceRoot, "web/vite.config.ts", "Add Vite Forge API proxy", renderViteConfig()),
800
836
  createFile(workspaceRoot, "web/index.html", "Add web HTML entry", renderViteIndex("ForgeOS App")),
801
837
  createFile(workspaceRoot, "web/src/lib/forge.ts", "Add Forge client bridge", renderWebBridge()),
802
838
  createFile(workspaceRoot, "web/src/main.tsx", "Add React entrypoint", renderViteMain()),
@@ -878,7 +914,7 @@ function buildPlan(options: MakeCommandOptions): MakePlan {
878
914
  kind: "resource" as const,
879
915
  name: options.name ?? "resource",
880
916
  fields: [],
881
- tenantScoped: true,
917
+ tenantScoped: false,
882
918
  crud: true,
883
919
  liveQuery: true,
884
920
  react: true,
@@ -512,8 +512,14 @@ export default function ${pascal}AiPage() {
512
512
  }
513
513
 
514
514
  export function renderWebBridge(): string {
515
- return `export const forgeUrl =
516
- import.meta.env.VITE_FORGE_URL ?? "http://127.0.0.1:3765";
515
+ return `const configuredForgeUrl = import.meta.env.VITE_FORGE_URL as string | undefined;
516
+ const useSameOrigin =
517
+ typeof window !== "undefined" &&
518
+ (!configuredForgeUrl ||
519
+ configuredForgeUrl.includes("127.0.0.1") ||
520
+ configuredForgeUrl.includes("localhost"));
521
+
522
+ export const forgeUrl = useSameOrigin ? "" : (configuredForgeUrl ?? "");
517
523
 
518
524
  export { api } from "../../../src/forge/_generated/api";
519
525
  export { createForgeClient, ForgeError } from "../../../src/forge/_generated/client";
@@ -521,6 +527,7 @@ export {
521
527
  ForgeProvider,
522
528
  useAuth,
523
529
  useCommand,
530
+ useCommandResult,
524
531
  useForgeClient,
525
532
  useLiveQuery,
526
533
  useQuery,
@@ -529,8 +536,14 @@ export {
529
536
  }
530
537
 
531
538
  export function renderWebRootBridge(): string {
532
- return `export const forgeUrl =
533
- process.env.NEXT_PUBLIC_FORGE_URL ?? "http://127.0.0.1:3765";
539
+ return `const configuredForgeUrl = process.env.NEXT_PUBLIC_FORGE_URL;
540
+ const useSameOrigin =
541
+ typeof window !== "undefined" &&
542
+ (!configuredForgeUrl ||
543
+ configuredForgeUrl.includes("127.0.0.1") ||
544
+ configuredForgeUrl.includes("localhost"));
545
+
546
+ export const forgeUrl = useSameOrigin ? "" : (configuredForgeUrl ?? "");
534
547
 
535
548
  export { api } from "../../src/forge/_generated/api";
536
549
  export { createForgeClient, ForgeError } from "../../src/forge/_generated/client";
@@ -538,6 +551,7 @@ export {
538
551
  ForgeProvider,
539
552
  useAuth,
540
553
  useCommand,
554
+ useCommandResult,
541
555
  useForgeClient,
542
556
  useLiveQuery,
543
557
  useQuery,
@@ -562,6 +576,46 @@ createRoot(document.getElementById("root")!).render(
562
576
  `;
563
577
  }
564
578
 
579
+ export function renderViteConfig(): string {
580
+ return `import react from "@vitejs/plugin-react";
581
+ import { defineConfig } from "vite";
582
+
583
+ const forgeApiUrl = process.env.VITE_FORGE_URL ?? "http://127.0.0.1:3765";
584
+
585
+ const forgeProxyPaths = [
586
+ "/.well-known",
587
+ "/ai",
588
+ "/auth.md",
589
+ "/callback",
590
+ "/commands",
591
+ "/entries",
592
+ "/external",
593
+ "/health",
594
+ "/live",
595
+ "/login",
596
+ "/logout",
597
+ "/session",
598
+ "/queries",
599
+ "/webhooks",
600
+ ];
601
+
602
+ export default defineConfig({
603
+ plugins: [react()],
604
+ server: {
605
+ proxy: Object.fromEntries(
606
+ forgeProxyPaths.map((path) => [
607
+ path,
608
+ {
609
+ target: forgeApiUrl,
610
+ changeOrigin: true,
611
+ },
612
+ ]),
613
+ ),
614
+ },
615
+ });
616
+ `;
617
+ }
618
+
565
619
  export function renderViteApp(): string {
566
620
  return `export function App() {
567
621
  return (
@@ -652,6 +706,159 @@ export function renderVitePackage(appName: string): string {
652
706
  `;
653
707
  }
654
708
 
709
+ export function renderNuxtPackage(appName: string): string {
710
+ return `{
711
+ "name": "${kebabCase(appName)}-web",
712
+ "private": true,
713
+ "type": "module",
714
+ "scripts": {
715
+ "dev": "nuxt dev --host 127.0.0.1",
716
+ "build": "nuxt build",
717
+ "typecheck": "nuxt typecheck"
718
+ },
719
+ "dependencies": {
720
+ "nuxt": "^4.0.0",
721
+ "vue": "^3.5.38"
722
+ },
723
+ "devDependencies": {
724
+ "typescript": "^5.7.3"
725
+ }
726
+ }
727
+ `;
728
+ }
729
+
730
+ export function renderNuxtConfig(): string {
731
+ return `export default defineNuxtConfig({
732
+ compatibilityDate: "2026-06-18",
733
+ runtimeConfig: {
734
+ public: {
735
+ forgeUrl: process.env.NUXT_PUBLIC_FORGE_URL ?? "http://127.0.0.1:3765",
736
+ },
737
+ },
738
+ typescript: {
739
+ strict: true,
740
+ },
741
+ });
742
+ `;
743
+ }
744
+
745
+ export function renderNuxtTsconfig(): string {
746
+ return `{
747
+ "extends": "./.nuxt/tsconfig.json"
748
+ }
749
+ `;
750
+ }
751
+
752
+ export function renderNuxtForgeComposable(): string {
753
+ return `export const forgeUrl = "http://127.0.0.1:3765";
754
+
755
+ export { api } from "../../src/forge/_generated/api";
756
+ export { createForgeClient, ForgeError } from "../../src/forge/_generated/client";
757
+ export {
758
+ ForgeVuePlugin,
759
+ provideForge,
760
+ useForgeAuth,
761
+ useForgeClient,
762
+ useForgeCommand,
763
+ useForgeLiveQuery,
764
+ useForgeQuery,
765
+ } from "../../src/forge/_generated/vue";
766
+ `;
767
+ }
768
+
769
+ export function renderNuxtForgePlugin(): string {
770
+ return `import { ForgeVuePlugin } from "../composables/forge";
771
+
772
+ export default defineNuxtPlugin((nuxtApp) => {
773
+ const config = useRuntimeConfig();
774
+
775
+ nuxtApp.vueApp.use(ForgeVuePlugin, {
776
+ url: String(config.public.forgeUrl),
777
+ devAuth: true,
778
+ });
779
+ });
780
+ `;
781
+ }
782
+
783
+ export function renderNuxtApp(): string {
784
+ return `<script setup lang="ts">
785
+ import ForgeStatus from "./components/ForgeStatus.vue";
786
+ </script>
787
+
788
+ <template>
789
+ <main class="shell">
790
+ <p class="eyebrow">ForgeOS Nuxt app</p>
791
+ <h1>Full-stack loop ready</h1>
792
+ <ForgeStatus />
793
+ </main>
794
+ </template>
795
+
796
+ <style scoped>
797
+ .shell {
798
+ width: min(760px, calc(100vw - 32px));
799
+ margin: 0 auto;
800
+ padding: 48px 0;
801
+ }
802
+
803
+ .eyebrow {
804
+ color: #58655f;
805
+ font-size: 0.82rem;
806
+ font-weight: 800;
807
+ text-transform: uppercase;
808
+ }
809
+
810
+ h1 {
811
+ margin: 0 0 12px;
812
+ color: #17211d;
813
+ font-size: 2.2rem;
814
+ }
815
+ </style>
816
+ `;
817
+ }
818
+
819
+ export function renderNuxtStatusComponent(): string {
820
+ return `<script setup lang="ts">
821
+ import { computed } from "vue";
822
+ import { useForgeAuth } from "../composables/forge";
823
+
824
+ const auth = useForgeAuth();
825
+ const tenantLabel = computed(() => auth?.tenantId ?? "dev-tenant");
826
+ const roleLabel = computed(() => auth?.role ?? "owner");
827
+ </script>
828
+
829
+ <template>
830
+ <section class="status-panel">
831
+ <span class="status-dot" aria-hidden="true" />
832
+ <p>
833
+ Connected as <strong>{{ roleLabel }}</strong> on
834
+ <strong>{{ tenantLabel }}</strong>.
835
+ </p>
836
+ </section>
837
+ </template>
838
+
839
+ <style scoped>
840
+ .status-panel {
841
+ display: flex;
842
+ align-items: center;
843
+ gap: 10px;
844
+ margin-top: 24px;
845
+ color: #26332d;
846
+ }
847
+
848
+ .status-dot {
849
+ width: 10px;
850
+ height: 10px;
851
+ border-radius: 999px;
852
+ background: #1f9d55;
853
+ }
854
+
855
+ p {
856
+ margin: 0;
857
+ }
858
+ </style>
859
+ `;
860
+ }
861
+
655
862
  export function renderNextAiPackage(appName: string): string {
656
863
  return `{
657
864
  "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.",