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
@@ -1,4 +1,5 @@
1
1
  import { createDiagnostic } from "../diagnostics/create.ts";
2
+ import { FORGE_DB_INVALID_ID_FIELD } from "../diagnostics/codes.ts";
2
3
  import { hashStable } from "../primitives/hash.ts";
3
4
  import { canonicalJson } from "../primitives/serialize.ts";
4
5
  import type { AppGraph } from "../types/app-graph.ts";
@@ -64,6 +65,32 @@ function detectDuplicateTableNames(tables: DataTable[]): DataGraph["diagnostics"
64
65
  });
65
66
  }
66
67
 
68
+ function detectInvalidIdFields(tables: DataTable[]): DataGraph["diagnostics"] {
69
+ const diagnostics: DataGraph["diagnostics"] = [];
70
+ for (const table of tables) {
71
+ const idField = table.fields.find((field) => field.name === "id");
72
+ if (!idField || idField.type.trim().replace(/\?$/, "").toLowerCase() !== "text") {
73
+ continue;
74
+ }
75
+ diagnostics.push(
76
+ createDiagnostic({
77
+ severity: "error",
78
+ code: FORGE_DB_INVALID_ID_FIELD,
79
+ message: `table '${table.name}' declares id as 'text'; Forge requires id to be omitted or declared as 'uuid' so the database primary key and runtime id semantics stay aligned`,
80
+ file: table.file,
81
+ }),
82
+ );
83
+ }
84
+ return diagnostics.sort((a, b) => {
85
+ const fileA = a.file ?? "";
86
+ const fileB = b.file ?? "";
87
+ if (fileA !== fileB) {
88
+ return fileA < fileB ? -1 : 1;
89
+ }
90
+ return a.message < b.message ? -1 : a.message > b.message ? 1 : 0;
91
+ });
92
+ }
93
+
67
94
  export function buildDataGraph(appGraph: AppGraph): DataGraph {
68
95
  const tables: DataTable[] = [];
69
96
  const diagnostics: DataGraph["diagnostics"] = [];
@@ -114,6 +141,7 @@ export function buildDataGraph(appGraph: AppGraph): DataGraph {
114
141
  }
115
142
 
116
143
  const dupDiagnostics = detectDuplicateTableNames(tables);
144
+ const idDiagnostics = detectInvalidIdFields(tables);
117
145
 
118
146
  return {
119
147
  schemaVersion: DATA_GRAPH_SCHEMA_VERSION,
@@ -126,6 +154,6 @@ export function buildDataGraph(appGraph: AppGraph): DataGraph {
126
154
  }),
127
155
  ),
128
156
  tables: stableSortTables(tables),
129
- diagnostics: [...diagnostics, ...dupDiagnostics],
157
+ diagnostics: [...diagnostics, ...dupDiagnostics, ...idDiagnostics],
130
158
  };
131
159
  }
@@ -36,7 +36,23 @@ function unwrapStringLiteral(node: SyntaxNode): string | null {
36
36
  return null;
37
37
  }
38
38
 
39
- function extractFieldsFromObject(objectNode: SyntaxNode): DataField[] {
39
+ function unwrapNullableType(node: SyntaxNode): string | null {
40
+ if (node.type !== "call_expression") {
41
+ return null;
42
+ }
43
+ const functionNode = node.childForFieldName("function");
44
+ if (functionNode?.type !== "identifier" || functionNode.text !== "nullable") {
45
+ return null;
46
+ }
47
+ const argsNode = node.childForFieldName("arguments");
48
+ const firstArg = argsNode?.namedChildren.find((child) =>
49
+ child.type !== "," && child.type !== "comment" && child.type !== "(" && child.type !== ")"
50
+ );
51
+ const inner = firstArg ? unwrapStringLiteral(firstArg) : null;
52
+ return inner ? `${inner}?` : null;
53
+ }
54
+
55
+ function extractFieldsFromObject(objectNode: SyntaxNode, options: { skipConfigName?: boolean } = {}): DataField[] {
40
56
  const fields: DataField[] = [];
41
57
 
42
58
  for (const child of objectNode.namedChildren) {
@@ -55,7 +71,7 @@ function extractFieldsFromObject(objectNode: SyntaxNode): DataField[] {
55
71
  ? keyNode.text
56
72
  : unwrapStringLiteral(keyNode);
57
73
 
58
- if (!key || key === "name") {
74
+ if (!key || (options.skipConfigName && key === "name")) {
59
75
  continue;
60
76
  }
61
77
 
@@ -64,7 +80,7 @@ function extractFieldsFromObject(objectNode: SyntaxNode): DataField[] {
64
80
  continue;
65
81
  }
66
82
 
67
- const typeValue = unwrapStringLiteral(valueNode);
83
+ const typeValue = unwrapStringLiteral(valueNode) ?? unwrapNullableType(valueNode);
68
84
  if (typeValue !== null) {
69
85
  fields.push({ name: key, type: typeValue });
70
86
  }
@@ -131,7 +147,7 @@ function parseCallArguments(callNode: SyntaxNode): ParsedDefineTable | null {
131
147
 
132
148
  if (first.type === "object") {
133
149
  const tableName = extractNameFromObject(first);
134
- const fields = extractFieldsFromObject(first);
150
+ const fields = extractFieldsFromObject(first, { skipConfigName: true });
135
151
  return { tableName, fields };
136
152
  }
137
153
 
@@ -34,6 +34,7 @@ const SYSTEM_LIVE_SUBSCRIPTION_DEBUG_SQL = `CREATE TABLE IF NOT EXISTS _forge_li
34
34
 
35
35
  interface ParsedFieldType {
36
36
  sqlType: string;
37
+ nullable?: boolean;
37
38
  references?: { table: string; column: string };
38
39
  checkConstraint?: string;
39
40
  }
@@ -42,36 +43,100 @@ function stableSortTables(tables: DataTable[]): DataTable[] {
42
43
  return [...tables].sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
43
44
  }
44
45
 
46
+ function stableSortTableChangesByReferences(tables: SqlChange[]): SqlChange[] {
47
+ const orderedInput = [...tables].sort((a, b) => {
48
+ const tableA = a.table ?? "";
49
+ const tableB = b.table ?? "";
50
+ return tableA < tableB ? -1 : tableA > tableB ? 1 : 0;
51
+ });
52
+ const byName = new Map<string, SqlChange>();
53
+
54
+ for (const table of orderedInput) {
55
+ if (table.table) {
56
+ byName.set(table.table, table);
57
+ }
58
+ }
59
+
60
+ const pending = new Set(byName.keys());
61
+ const emitted = new Set<string>();
62
+ const ordered: SqlChange[] = [];
63
+
64
+ while (pending.size > 0) {
65
+ let progressed = false;
66
+
67
+ for (const tableName of pending) {
68
+ const table = byName.get(tableName);
69
+ if (!table) {
70
+ pending.delete(tableName);
71
+ continue;
72
+ }
73
+
74
+ const dependencies = (table.columns ?? [])
75
+ .map((column) => column.references?.table)
76
+ .filter((dependency): dependency is string => Boolean(dependency))
77
+ .filter((dependency) => dependency !== tableName && byName.has(dependency));
78
+
79
+ if (dependencies.every((dependency) => emitted.has(dependency))) {
80
+ ordered.push(table);
81
+ emitted.add(tableName);
82
+ pending.delete(tableName);
83
+ progressed = true;
84
+ }
85
+ }
86
+
87
+ if (!progressed) {
88
+ for (const tableName of pending) {
89
+ const table = byName.get(tableName);
90
+ if (table) {
91
+ ordered.push(table);
92
+ }
93
+ }
94
+ break;
95
+ }
96
+ }
97
+
98
+ return ordered;
99
+ }
100
+
45
101
  function parseFieldType(
46
102
  field: DataField,
47
103
  tableName: string,
48
104
  diagnostics: Diagnostic[],
105
+ refTables: Map<string, string>,
49
106
  ): ParsedFieldType | null {
50
- const raw = field.type.trim().toLowerCase();
107
+ const declared = field.type.trim();
108
+ const nullable = declared.endsWith("?");
109
+ const raw = (nullable ? declared.slice(0, -1) : declared).trim();
110
+ const lowered = raw.toLowerCase();
111
+
112
+ const withNullability = (parsed: Omit<ParsedFieldType, "nullable">): ParsedFieldType => ({
113
+ ...parsed,
114
+ ...(nullable ? { nullable: true } : {}),
115
+ });
51
116
 
52
- if (raw === "uuid") {
53
- return { sqlType: "uuid" };
117
+ if (lowered === "uuid") {
118
+ return withNullability({ sqlType: "uuid" });
54
119
  }
55
- if (raw === "text" || raw === "string") {
56
- return { sqlType: "text" };
120
+ if (lowered === "text" || lowered === "string") {
121
+ return withNullability({ sqlType: "text" });
57
122
  }
58
- if (raw === "number") {
59
- return { sqlType: "double precision" };
123
+ if (lowered === "number") {
124
+ return withNullability({ sqlType: "double precision" });
60
125
  }
61
- if (raw === "integer" || raw === "int") {
62
- return { sqlType: "integer" };
126
+ if (lowered === "integer" || lowered === "int") {
127
+ return withNullability({ sqlType: "integer" });
63
128
  }
64
- if (raw === "boolean" || raw === "bool") {
65
- return { sqlType: "boolean" };
129
+ if (lowered === "boolean" || lowered === "bool") {
130
+ return withNullability({ sqlType: "boolean" });
66
131
  }
67
- if (raw === "timestamp") {
68
- return { sqlType: "timestamptz" };
132
+ if (lowered === "timestamp" || lowered === "timestamptz") {
133
+ return withNullability({ sqlType: "timestamptz" });
69
134
  }
70
- if (raw === "json") {
71
- return { sqlType: "jsonb" };
135
+ if (lowered === "json") {
136
+ return withNullability({ sqlType: "jsonb" });
72
137
  }
73
138
 
74
- if (raw.startsWith("enum:")) {
139
+ if (lowered.startsWith("enum:")) {
75
140
  const values = raw
76
141
  .slice("enum:".length)
77
142
  .split(",")
@@ -89,16 +154,17 @@ function parseFieldType(
89
154
  }
90
155
  const checkValues = values.map((value) => `'${value.replace(/'/g, "''")}'`).join(", ");
91
156
  return {
157
+ ...(nullable ? { nullable: true } : {}),
92
158
  sqlType: "text",
93
159
  checkConstraint: `${quoteIdent(toSnakeCase(field.name))} IN (${checkValues})`,
94
160
  };
95
161
  }
96
162
 
97
- if (raw.startsWith("enum_")) {
98
- return { sqlType: "text" };
163
+ if (lowered.startsWith("enum_")) {
164
+ return withNullability({ sqlType: "text" });
99
165
  }
100
166
 
101
- if (raw.startsWith("ref:")) {
167
+ if (lowered.startsWith("ref:")) {
102
168
  const refTable = raw.slice("ref:".length).trim();
103
169
  if (!refTable) {
104
170
  diagnostics.push(
@@ -110,14 +176,27 @@ function parseFieldType(
110
176
  );
111
177
  return null;
112
178
  }
179
+ const resolvedRefTable = refTables.get(refTable) ?? refTables.get(toSnakeCase(refTable));
180
+ if (!resolvedRefTable) {
181
+ diagnostics.push(
182
+ createDiagnostic({
183
+ severity: "error",
184
+ code: FORGE_DB_INVALID_SQL_PLAN,
185
+ message: `unknown ref target '${refTable}' on ${tableName}.${field.name}; expected one of ${[...new Set(refTables.values())].sort().join(", ")}`,
186
+ }),
187
+ );
188
+ return null;
189
+ }
113
190
  return {
191
+ ...(nullable ? { nullable: true } : {}),
114
192
  sqlType: "uuid",
115
- references: { table: toSnakeCase(refTable), column: "id" },
193
+ references: { table: resolvedRefTable, column: "id" },
116
194
  };
117
195
  }
118
196
 
119
- if (raw === "ref") {
197
+ if (lowered === "ref") {
120
198
  return {
199
+ ...(nullable ? { nullable: true } : {}),
121
200
  sqlType: "uuid",
122
201
  references: { table: toSnakeCase(field.name.replace(/Id$/i, "")), column: "id" },
123
202
  };
@@ -133,9 +212,21 @@ function parseFieldType(
133
212
  return null;
134
213
  }
135
214
 
215
+ function buildReferenceTableLookup(tables: DataTable[]): Map<string, string> {
216
+ const lookup = new Map<string, string>();
217
+ for (const table of tables) {
218
+ const sqlTableName = toSnakeCase(table.name);
219
+ lookup.set(table.name, sqlTableName);
220
+ lookup.set(table.exportName, sqlTableName);
221
+ lookup.set(sqlTableName, sqlTableName);
222
+ lookup.set(toSnakeCase(table.exportName), sqlTableName);
223
+ }
224
+ return lookup;
225
+ }
226
+
136
227
  function defaultExprForField(field: DataField): string | undefined {
137
228
  const name = field.name;
138
- const type = field.type.trim().toLowerCase();
229
+ const type = field.type.trim().replace(/\?$/, "").toLowerCase();
139
230
 
140
231
  if (name === "id" && type === "uuid") {
141
232
  return "gen_random_uuid()";
@@ -151,7 +242,11 @@ function defaultExprForField(field: DataField): string | undefined {
151
242
  return undefined;
152
243
  }
153
244
 
154
- function buildColumns(table: DataTable, diagnostics: Diagnostic[]): ColumnDef[] {
245
+ function buildColumns(
246
+ table: DataTable,
247
+ diagnostics: Diagnostic[],
248
+ refTables: Map<string, string>,
249
+ ): ColumnDef[] {
155
250
  const columns: ColumnDef[] = [];
156
251
  const fields = [...table.fields].sort((a, b) =>
157
252
  a.name < b.name ? -1 : a.name > b.name ? 1 : 0,
@@ -170,7 +265,7 @@ function buildColumns(table: DataTable, diagnostics: Diagnostic[]): ColumnDef[]
170
265
  }
171
266
 
172
267
  for (const field of fields) {
173
- const parsed = parseFieldType(field, table.name, diagnostics);
268
+ const parsed = parseFieldType(field, table.name, diagnostics, refTables);
174
269
  if (!parsed) {
175
270
  continue;
176
271
  }
@@ -183,7 +278,7 @@ function buildColumns(table: DataTable, diagnostics: Diagnostic[]): ColumnDef[]
183
278
  name: snakeName,
184
279
  fieldName: field.name,
185
280
  sqlType: parsed.sqlType,
186
- nullable: false,
281
+ nullable: isPrimaryKey ? false : parsed.nullable === true,
187
282
  primaryKey: isPrimaryKey,
188
283
  defaultExpr,
189
284
  references: parsed.references,
@@ -191,7 +286,17 @@ function buildColumns(table: DataTable, diagnostics: Diagnostic[]): ColumnDef[]
191
286
  });
192
287
  }
193
288
 
194
- if (!columns.some((column) => column.primaryKey) && columns.length > 0) {
289
+ if (hasIdField && !columns.some((column) => column.name === "id" && column.primaryKey)) {
290
+ const idField = fields.find((field) => field.name === "id");
291
+ diagnostics.push(
292
+ createDiagnostic({
293
+ severity: "warning",
294
+ code: FORGE_DB_INVALID_SQL_PLAN,
295
+ message: `table '${table.name}' declares id as '${idField?.type ?? "unknown"}'; Forge runtime requires id: "uuid" or no id field so Forge can generate one`,
296
+ file: table.file,
297
+ }),
298
+ );
299
+ } else if (!columns.some((column) => column.primaryKey) && columns.length > 0) {
195
300
  columns[0]!.primaryKey = true;
196
301
  }
197
302
 
@@ -235,9 +340,13 @@ function buildForeignKeyIndexes(tableName: string, columns: ColumnDef[]): IndexD
235
340
  return indexes;
236
341
  }
237
342
 
238
- function buildTableChange(table: DataTable, diagnostics: Diagnostic[]): SqlChange | null {
343
+ function buildTableChange(
344
+ table: DataTable,
345
+ diagnostics: Diagnostic[],
346
+ refTables: Map<string, string>,
347
+ ): SqlChange | null {
239
348
  const tableName = toSnakeCase(table.name);
240
- const columns = buildColumns(table, diagnostics);
349
+ const columns = buildColumns(table, diagnostics, refTables);
241
350
 
242
351
  if (columns.length === 0) {
243
352
  diagnostics.push(
@@ -254,6 +363,7 @@ function buildTableChange(table: DataTable, diagnostics: Diagnostic[]): SqlChang
254
363
  return {
255
364
  kind: "create_table",
256
365
  table: tableName,
366
+ accessName: table.name,
257
367
  columns,
258
368
  sql: buildCreateTableSql(tableName, columns),
259
369
  };
@@ -274,6 +384,7 @@ export function buildSqlPlan(dataGraph: DataGraph): SqlPlan {
274
384
  const diagnostics: Diagnostic[] = [];
275
385
  const tables: SqlChange[] = [];
276
386
  const indexes: SqlChange[] = [];
387
+ const refTables = buildReferenceTableLookup(dataGraph.tables);
277
388
 
278
389
  const systemTables: SqlChange[] = [
279
390
  {
@@ -329,7 +440,7 @@ export function buildSqlPlan(dataGraph: DataGraph): SqlPlan {
329
440
  ];
330
441
 
331
442
  for (const table of stableSortTables(dataGraph.tables)) {
332
- const change = buildTableChange(table, diagnostics);
443
+ const change = buildTableChange(table, diagnostics, refTables);
333
444
  if (!change) {
334
445
  continue;
335
446
  }
@@ -342,6 +453,8 @@ export function buildSqlPlan(dataGraph: DataGraph): SqlPlan {
342
453
  }
343
454
  }
344
455
 
456
+ const orderedTables = stableSortTableChangesByReferences(tables);
457
+
345
458
  indexes.sort((a, b) => {
346
459
  const nameA = a.index?.name ?? "";
347
460
  const nameB = b.index?.name ?? "";
@@ -364,7 +477,7 @@ export function buildSqlPlan(dataGraph: DataGraph): SqlPlan {
364
477
  const payload = {
365
478
  schemaVersion: SQL_PLAN_SCHEMA_VERSION,
366
479
  systemTables: systemTables.map((change) => change.sql),
367
- tables: tables.map((change) => change.sql),
480
+ tables: orderedTables.map((change) => change.sql),
368
481
  indexes: indexes.map((change) => change.sql),
369
482
  };
370
483
 
@@ -376,7 +489,7 @@ export function buildSqlPlan(dataGraph: DataGraph): SqlPlan {
376
489
  migrationId,
377
490
  checksum,
378
491
  systemTables,
379
- tables,
492
+ tables: orderedTables,
380
493
  indexes,
381
494
  diagnostics: diagnostics.sort((a, b) => {
382
495
  const fileA = a.file ?? "";
@@ -15,6 +15,7 @@ export function serializeSqlPlanJson(plan: SqlPlan): string {
15
15
  tables: plan.tables.map((change) => ({
16
16
  kind: change.kind,
17
17
  table: change.table,
18
+ accessName: change.accessName,
18
19
  columns: change.columns,
19
20
  sql: change.sql,
20
21
  })),
@@ -69,6 +70,9 @@ export function buildTableMap(
69
70
  ? { tenantScoped: true, tenantIdColumn }
70
71
  : {}),
71
72
  };
73
+ if (change.accessName && change.accessName !== change.table) {
74
+ map[change.accessName] = map[change.table]!;
75
+ }
72
76
  }
73
77
 
74
78
  return map;
@@ -21,6 +21,7 @@ export interface IndexDef {
21
21
  export interface SqlChange {
22
22
  kind: "create_table" | "create_index" | "create_sequence";
23
23
  table?: string;
24
+ accessName?: string;
24
25
  columns?: ColumnDef[];
25
26
  index?: IndexDef;
26
27
  sql: string;
@@ -27,19 +27,36 @@ export const FORGE_DUP_RUNTIME_ENTRY = "FORGE_DUP_RUNTIME_ENTRY" as const;
27
27
  export const FORGE_RUNTIME_UNRESOLVABLE = "FORGE_RUNTIME_UNRESOLVABLE" as const;
28
28
  export const FORGE_RUNTIME_NOT_FOUND = "FORGE_RUNTIME_NOT_FOUND" as const;
29
29
  export const FORGE_RUNTIME_GUARD_BLOCKED = "FORGE_RUNTIME_GUARD_BLOCKED" as const;
30
+ export const FORGE_RUNTIME_EXPORT_NAME_REQUIRED =
31
+ "FORGE_RUNTIME_EXPORT_NAME_REQUIRED" as const;
32
+ export const FORGE_EXTERNAL_RUNTIME_NOT_FOUND =
33
+ "FORGE_EXTERNAL_RUNTIME_NOT_FOUND" as const;
34
+ export const FORGE_EXTERNAL_RUNTIME_UNSUPPORTED =
35
+ "FORGE_EXTERNAL_RUNTIME_UNSUPPORTED" as const;
36
+ export const FORGE_EXTERNAL_RUNTIME_FAILED =
37
+ "FORGE_EXTERNAL_RUNTIME_FAILED" as const;
38
+ export const FORGE_EXTERNAL_RUNTIME_BAD_RESPONSE =
39
+ "FORGE_EXTERNAL_RUNTIME_BAD_RESPONSE" as const;
30
40
  export const FORGE_DEV_SERVER_ERROR = "FORGE_DEV_SERVER_ERROR" as const;
31
41
  export const FORGE_DEV_WATCH_FAILED = "FORGE_DEV_WATCH_FAILED" as const;
32
42
  export const FORGE_DEV_INVOKE_FAILED = "FORGE_DEV_INVOKE_FAILED" as const;
33
43
  export const FORGE_DEV_DOCTOR_MISSING_ARTIFACT =
34
44
  "FORGE_DEV_DOCTOR_MISSING_ARTIFACT" as const;
45
+ export const FORGE_DEV_DB_RESET = "FORGE_DEV_DB_RESET" as const;
35
46
  export const FORGE_DB_CONNECT_FAILED = "FORGE_DB_CONNECT_FAILED" as const;
36
47
  export const FORGE_DB_MIGRATION_FAILED = "FORGE_DB_MIGRATION_FAILED" as const;
37
48
  export const FORGE_DB_UNSUPPORTED_FIELD_TYPE =
38
49
  "FORGE_DB_UNSUPPORTED_FIELD_TYPE" as const;
39
50
  export const FORGE_DB_INVALID_SQL_PLAN = "FORGE_DB_INVALID_SQL_PLAN" as const;
51
+ export const FORGE_DB_INVALID_ID_FIELD =
52
+ "FORGE_DB_INVALID_ID_FIELD" as const;
53
+ export const FORGE_DB_EMPTY_TIMESTAMP_LITERAL =
54
+ "FORGE_DB_EMPTY_TIMESTAMP_LITERAL" as const;
40
55
  export const FORGE_DB_TRANSACTION_FAILED = "FORGE_DB_TRANSACTION_FAILED" as const;
41
56
  export const FORGE_DB_OUTBOX_WRITE_FAILED = "FORGE_DB_OUTBOX_WRITE_FAILED" as const;
42
57
  export const FORGE_DB_ADAPTER_UNAVAILABLE = "FORGE_DB_ADAPTER_UNAVAILABLE" as const;
58
+ export const FORGE_PGLITE_STORE_ABORTED = "FORGE_PGLITE_STORE_ABORTED" as const;
59
+ export const FORGE_PGLITE_STORE_ACTIVE = "FORGE_PGLITE_STORE_ACTIVE" as const;
43
60
  export const FORGE_RLS_POLICY_MISSING = "FORGE_RLS_POLICY_MISSING" as const;
44
61
  export const FORGE_RLS_TENANT_FIELD_MISSING =
45
62
  "FORGE_RLS_TENANT_FIELD_MISSING" as const;
@@ -92,6 +109,12 @@ export const FORGE_RELEASE_DIRTY_WORKTREE =
92
109
  export const FORGE_RELEASE_GENERATED_DRIFT =
93
110
  "FORGE_RELEASE_GENERATED_DRIFT" as const;
94
111
  export const FORGE_RELEASE_ID_MISSING = "FORGE_RELEASE_ID_MISSING" as const;
112
+ export const FORGE_RELEASE_PACKAGE_PACK_FAILED =
113
+ "FORGE_RELEASE_PACKAGE_PACK_FAILED" as const;
114
+ export const FORGE_RELEASE_NPM_DIST_TAG_STALE =
115
+ "FORGE_RELEASE_NPM_DIST_TAG_STALE" as const;
116
+ export const FORGE_RELEASE_NPM_DIST_TAG_CHECK_FAILED =
117
+ "FORGE_RELEASE_NPM_DIST_TAG_CHECK_FAILED" as const;
95
118
  export const FORGE_SOURCEMAP_PUBLIC_EXPOSURE =
96
119
  "FORGE_SOURCEMAP_PUBLIC_EXPOSURE" as const;
97
120
  export const FORGE_SOURCEMAP_UPLOAD_MISSING =
@@ -216,6 +239,8 @@ export const FORGE_TEST_DOCKER_REQUIRED = "FORGE_TEST_DOCKER_REQUIRED" as const;
216
239
  export const FORGE_TEST_BROWSER_REQUIRED = "FORGE_TEST_BROWSER_REQUIRED" as const;
217
240
  export const FORGE_VERIFY_CHANGED_INCOMPLETE =
218
241
  "FORGE_VERIFY_CHANGED_INCOMPLETE" as const;
242
+ export const FORGE_VERIFY_NO_TESTS_SELECTED =
243
+ "FORGE_VERIFY_NO_TESTS_SELECTED" as const;
219
244
  export const FORGE_VERIFY_SCRIPT_TIMEOUT =
220
245
  "FORGE_VERIFY_SCRIPT_TIMEOUT" as const;
221
246
  export const FORGE_REPAIR_SOURCE_NOT_FOUND =
@@ -399,17 +424,26 @@ export const DIAGNOSTIC_CODES = [
399
424
  FORGE_RUNTIME_UNRESOLVABLE,
400
425
  FORGE_RUNTIME_NOT_FOUND,
401
426
  FORGE_RUNTIME_GUARD_BLOCKED,
427
+ FORGE_RUNTIME_EXPORT_NAME_REQUIRED,
428
+ FORGE_EXTERNAL_RUNTIME_NOT_FOUND,
429
+ FORGE_EXTERNAL_RUNTIME_UNSUPPORTED,
430
+ FORGE_EXTERNAL_RUNTIME_FAILED,
431
+ FORGE_EXTERNAL_RUNTIME_BAD_RESPONSE,
402
432
  FORGE_DEV_SERVER_ERROR,
403
433
  FORGE_DEV_WATCH_FAILED,
404
434
  FORGE_DEV_INVOKE_FAILED,
405
435
  FORGE_DEV_DOCTOR_MISSING_ARTIFACT,
436
+ FORGE_DEV_DB_RESET,
406
437
  FORGE_DB_CONNECT_FAILED,
407
438
  FORGE_DB_MIGRATION_FAILED,
408
439
  FORGE_DB_UNSUPPORTED_FIELD_TYPE,
409
440
  FORGE_DB_INVALID_SQL_PLAN,
441
+ FORGE_DB_EMPTY_TIMESTAMP_LITERAL,
410
442
  FORGE_DB_TRANSACTION_FAILED,
411
443
  FORGE_DB_OUTBOX_WRITE_FAILED,
412
444
  FORGE_DB_ADAPTER_UNAVAILABLE,
445
+ FORGE_PGLITE_STORE_ABORTED,
446
+ FORGE_PGLITE_STORE_ACTIVE,
413
447
  FORGE_RLS_POLICY_MISSING,
414
448
  FORGE_RLS_TENANT_FIELD_MISSING,
415
449
  FORGE_RLS_UNSUPPORTED_TENANT_TYPE,
@@ -444,6 +478,9 @@ export const DIAGNOSTIC_CODES = [
444
478
  FORGE_RELEASE_DIRTY_WORKTREE,
445
479
  FORGE_RELEASE_GENERATED_DRIFT,
446
480
  FORGE_RELEASE_ID_MISSING,
481
+ FORGE_RELEASE_PACKAGE_PACK_FAILED,
482
+ FORGE_RELEASE_NPM_DIST_TAG_STALE,
483
+ FORGE_RELEASE_NPM_DIST_TAG_CHECK_FAILED,
447
484
  FORGE_SOURCEMAP_PUBLIC_EXPOSURE,
448
485
  FORGE_SOURCEMAP_UPLOAD_MISSING,
449
486
  FORGE_SOURCEMAP_UPLOAD_FAILED,
@@ -521,6 +558,7 @@ export const DIAGNOSTIC_CODES = [
521
558
  FORGE_TEST_DOCKER_REQUIRED,
522
559
  FORGE_TEST_BROWSER_REQUIRED,
523
560
  FORGE_VERIFY_CHANGED_INCOMPLETE,
561
+ FORGE_VERIFY_NO_TESTS_SELECTED,
524
562
  FORGE_REPAIR_SOURCE_NOT_FOUND,
525
563
  FORGE_REPAIR_UNKNOWN_FAILURE,
526
564
  FORGE_REPAIR_NO_RULE_MATCHED,
@@ -47,9 +47,16 @@ function defaultGuidanceForCode(code: string): DiagnosticGuidance | null {
47
47
  docs: ["src/forge/_generated/runtimeRules.md", "AGENTS.md"],
48
48
  };
49
49
  }
50
+ if (code === "FORGE_RUNTIME_EXPORT_NAME_REQUIRED") {
51
+ return {
52
+ fixHint: "Forge runtime entries must be named exports. Replace `export default command(...)` with `export const createThing = command(...)` so generated API, frontend bindings, and capability maps have a stable name.",
53
+ suggestedCommands: ["forge check --json", "forge generate"],
54
+ docs: ["AGENTS.md", "src/forge/_generated/runtimeRules.md"],
55
+ };
56
+ }
50
57
  if (code === "FORGE_SECRET_DIRECT_PROCESS_ENV") {
51
58
  return {
52
- fixHint: "Use ctx.secrets or ctx.config instead of reading process.env directly from app runtime code.",
59
+ fixHint: "Use ctx.secrets or ctx.config for Forge runtime secrets/config; public frontend bridge env may use the framework's public env surface.",
53
60
  suggestedCommands: ["forge repair diagnose --diagnostic FORGE_SECRET_DIRECT_PROCESS_ENV --json", "forge refactor replace-process-env <ENV_NAME> --dry-run --json"],
54
61
  docs: ["src/forge/_generated/runtimeRules.md"],
55
62
  };
@@ -75,6 +82,20 @@ function defaultGuidanceForCode(code: string): DiagnosticGuidance | null {
75
82
  docs: ["src/forge/_generated/agentContract.json"],
76
83
  };
77
84
  }
85
+ if (code === "FORGE_DB_EMPTY_TIMESTAMP_LITERAL") {
86
+ return {
87
+ fixHint: "Do not use an empty string for timestamp fields. Use a real ISO timestamp, omit an optional timestamp field, declare it as `timestamp?` / `nullable(\"timestamp\")`, or model it as text if empty string is meaningful.",
88
+ suggestedCommands: ["forge check --json", "forge dev --db pglite --once --json"],
89
+ docs: ["AGENTS.md"],
90
+ };
91
+ }
92
+ if (code === "FORGE_DB_INVALID_ID_FIELD") {
93
+ return {
94
+ fixHint: "Do not declare `id: \"text\"` in defineTable. Remove the id field so Forge generates a UUID primary key, or declare `id: \"uuid\"` when you need to provide ids explicitly.",
95
+ suggestedCommands: ["forge check --json", "forge inspect schema --json"],
96
+ docs: ["AGENTS.md"],
97
+ };
98
+ }
78
99
  if (code.startsWith("FORGE_UI_")) {
79
100
  return {
80
101
  fixHint: "Inspect the last UI run and use the UI report as repair input.",
@@ -106,7 +127,12 @@ function defaultGuidanceForCode(code: string): DiagnosticGuidance | null {
106
127
  if (code.startsWith("FORGE_FRONTEND_")) {
107
128
  return {
108
129
  fixHint: "Use the generated frontend bridge and inspect src/forge/_generated/frontendGraph.json before editing UI wiring.",
109
- suggestedCommands: ["forge inspect frontend --json", "forge make ui --framework vite --dry-run --json", "forge generate"],
130
+ suggestedCommands: [
131
+ "forge inspect frontend --json",
132
+ "forge make ui --framework vite --dry-run --json",
133
+ "forge make ui --framework nuxt --dry-run --json",
134
+ "forge generate",
135
+ ],
110
136
  docs: ["src/forge/_generated/frontendGraph.json", "AGENTS.md"],
111
137
  };
112
138
  }
@@ -37,6 +37,8 @@ export {
37
37
  FORGE_LIVEQUERY_UNKNOWN,
38
38
  FORGE_LIVEQUERY_SUBSCRIPTION_FAILED,
39
39
  FORGE_LIVEQUERY_RERUN_FAILED,
40
+ FORGE_RELEASE_PACKAGE_PACK_FAILED,
41
+ FORGE_VERIFY_NO_TESTS_SELECTED,
40
42
  DIAGNOSTIC_CODES,
41
43
  } from "./codes.ts";
42
44
  export type { DiagnosticCode } from "./codes.ts";
@@ -33,6 +33,9 @@ export function buildBarrelIndexBody(exportFilePaths: string[]): string {
33
33
 
34
34
  const lines = unique.map((path) => {
35
35
  const exportPath = toBarrelExportPath(path);
36
+ if (exportPath === "./vue") {
37
+ return `export * as vue from "${exportPath}";`;
38
+ }
36
39
  return `export * from "${exportPath}";`;
37
40
  });
38
41
 
@@ -59,6 +59,7 @@ export function renderBody(file: EmitFile): string {
59
59
  */
60
60
  export function render(file: EmitFile, context: RenderContext): string {
61
61
  const body = renderBody(file);
62
+ const kind = detectArtifactKind(file.path);
62
63
 
63
64
  if (file.contentHash !== hashStable(body)) {
64
65
  throw new Error(
@@ -66,6 +67,14 @@ export function render(file: EmitFile, context: RenderContext): string {
66
67
  );
67
68
  }
68
69
 
70
+ if (kind === "json") {
71
+ return body;
72
+ }
73
+
74
+ if (file.header === "none") {
75
+ return body;
76
+ }
77
+
69
78
  return prependDeterministicHeader(body, {
70
79
  generatorVersion: context.generatorVersion,
71
80
  inputHash: context.inputHash,