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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (416) hide show
  1. package/.npmignore +10 -0
  2. package/AGENTS.md +142 -90
  3. package/CHANGELOG.md +433 -0
  4. package/LICENSE +21 -0
  5. package/README.md +67 -8
  6. package/adapters/go/README.md +23 -0
  7. package/adapters/go/go.mod +3 -0
  8. package/adapters/go/http.go +149 -0
  9. package/adapters/go/registry.go +234 -0
  10. package/adapters/go/types.go +136 -0
  11. package/adapters/java/README.md +68 -0
  12. package/adapters/java/pom.xml +34 -0
  13. package/adapters/java/src/main/java/dev/forgeos/adapter/Auth.java +20 -0
  14. package/adapters/java/src/main/java/dev/forgeos/adapter/Diagnostic.java +16 -0
  15. package/adapters/java/src/main/java/dev/forgeos/adapter/Entry.java +38 -0
  16. package/adapters/java/src/main/java/dev/forgeos/adapter/EntryKind.java +16 -0
  17. package/adapters/java/src/main/java/dev/forgeos/adapter/ErrorInfo.java +4 -0
  18. package/adapters/java/src/main/java/dev/forgeos/adapter/Forge.java +94 -0
  19. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeCall.java +12 -0
  20. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeContext.java +11 -0
  21. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHandler.java +8 -0
  22. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHttpHandler.java +179 -0
  23. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeRegistry.java +121 -0
  24. package/adapters/java/src/main/java/dev/forgeos/adapter/Json.java +14 -0
  25. package/adapters/java/src/main/java/dev/forgeos/adapter/Manifest.java +14 -0
  26. package/adapters/java/src/main/java/dev/forgeos/adapter/RequestEnvelope.java +6 -0
  27. package/adapters/java/src/main/java/dev/forgeos/adapter/ResponseEnvelope.java +25 -0
  28. package/adapters/java/src/main/java/dev/forgeos/adapter/Risk.java +18 -0
  29. package/adapters/java/src/main/java/dev/forgeos/adapter/Schemas.java +36 -0
  30. package/adapters/java/src/main/java/dev/forgeos/adapter/Service.java +65 -0
  31. package/adapters/java/src/main/java/dev/forgeos/adapter/TransactionMode.java +18 -0
  32. package/adapters/java/src/main/java/dev/forgeos/adapter/TypedForgeHandler.java +6 -0
  33. package/adapters/java-spring-boot-starter/README.md +32 -0
  34. package/adapters/java-spring-boot-starter/pom.xml +36 -0
  35. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeCommand.java +22 -0
  36. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeExternalService.java +15 -0
  37. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeQuery.java +16 -0
  38. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeServiceBeanCondition.java +18 -0
  39. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringAutoConfiguration.java +16 -0
  40. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringRuntime.java +104 -0
  41. package/adapters/java-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +1 -0
  42. package/bin/forge.mjs +18 -0
  43. package/docs/cair-protocol.md +103 -0
  44. package/docs/changelog.md +548 -0
  45. package/docs/forge-protocol.md +189 -0
  46. package/examples/go-billing/go.mod +7 -0
  47. package/examples/go-billing/main.go +120 -0
  48. package/examples/java-billing/pom.xml +52 -0
  49. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/CreateInvoiceInput.java +4 -0
  50. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Invoice.java +11 -0
  51. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Main.java +127 -0
  52. package/package.json +31 -3
  53. package/schemas/forge-manifest.schema.json +57 -0
  54. package/src/forge/_generated/releaseManifest.json +1 -2
  55. package/src/forge/_generated/releaseManifest.ts +3 -3
  56. package/src/forge/agent-adapters/index.ts +1584 -125
  57. package/src/forge/agent-adapters/types.ts +224 -1
  58. package/src/forge/agent-memory/bridge.ts +1333 -0
  59. package/src/forge/agent-memory/context-pack.ts +277 -0
  60. package/src/forge/agent-memory/hook-runner.ts +312 -0
  61. package/src/forge/agent-memory/mcp.ts +224 -0
  62. package/src/forge/agent-memory/normalize.ts +498 -0
  63. package/src/forge/agent-memory/redaction.ts +103 -0
  64. package/src/forge/agent-memory/sources/claude-code.ts +51 -0
  65. package/src/forge/agent-memory/sources/codex-hook-runner.mjs +273 -0
  66. package/src/forge/agent-memory/sources/codex.ts +119 -0
  67. package/src/forge/agent-memory/sources/cursor.ts +35 -0
  68. package/src/forge/agent-memory/types.ts +204 -0
  69. package/src/forge/bench.ts +248 -0
  70. package/src/forge/brownfield-import/index.ts +801 -0
  71. package/src/forge/brownfield-import/types.ts +127 -0
  72. package/src/forge/cair/action-journal.ts +61 -0
  73. package/src/forge/cair/action-parser.ts +314 -0
  74. package/src/forge/cair/action-validator.ts +40 -0
  75. package/src/forge/cair/actions.ts +1818 -0
  76. package/src/forge/cair/format.ts +77 -0
  77. package/src/forge/cair/index.ts +106 -0
  78. package/src/forge/cair/query.ts +478 -0
  79. package/src/forge/cair/snapshot.ts +315 -0
  80. package/src/forge/cair/types.ts +248 -0
  81. package/src/forge/cli/ai.ts +339 -21
  82. package/src/forge/cli/auth.ts +348 -10
  83. package/src/forge/cli/authmd.ts +441 -0
  84. package/src/forge/cli/baseline.ts +112 -0
  85. package/src/forge/cli/build.ts +20 -4
  86. package/src/forge/cli/changed.ts +437 -0
  87. package/src/forge/cli/codex-app-server.ts +877 -0
  88. package/src/forge/cli/commands.ts +1620 -20
  89. package/src/forge/cli/db.ts +209 -2
  90. package/src/forge/cli/deploy.ts +887 -0
  91. package/src/forge/cli/deps.ts +82 -13
  92. package/src/forge/cli/dev.ts +961 -46
  93. package/src/forge/cli/docs.ts +265 -0
  94. package/src/forge/cli/doctor.ts +297 -0
  95. package/src/forge/cli/field-test.ts +329 -0
  96. package/src/forge/cli/handoff.ts +336 -0
  97. package/src/forge/cli/index.ts +1 -0
  98. package/src/forge/cli/last-run.ts +84 -0
  99. package/src/forge/cli/main.ts +107 -3
  100. package/src/forge/cli/new.ts +152 -13
  101. package/src/forge/cli/next-actions.ts +23 -0
  102. package/src/forge/cli/output.ts +389 -6
  103. package/src/forge/cli/parse.ts +1050 -34
  104. package/src/forge/cli/progress.ts +51 -0
  105. package/src/forge/cli/query.ts +32 -0
  106. package/src/forge/cli/release.ts +35 -11
  107. package/src/forge/cli/rls.ts +43 -4
  108. package/src/forge/cli/run.ts +41 -0
  109. package/src/forge/cli/security.ts +112 -0
  110. package/src/forge/cli/self-host.ts +56 -14
  111. package/src/forge/cli/studio.ts +2218 -0
  112. package/src/forge/cli/verify.ts +1455 -32
  113. package/src/forge/cli/windows.ts +23 -0
  114. package/src/forge/cli/workos.ts +1020 -0
  115. package/src/forge/compiler/agent-contract/build.ts +670 -64
  116. package/src/forge/compiler/agent-contract/types.ts +45 -2
  117. package/src/forge/compiler/ai-registry/parse.ts +71 -2
  118. package/src/forge/compiler/api-surface/build.ts +47 -0
  119. package/src/forge/compiler/app-graph/build.ts +112 -9
  120. package/src/forge/compiler/app-graph/extract.ts +107 -0
  121. package/src/forge/compiler/app-graph/module-graph.ts +73 -78
  122. package/src/forge/compiler/app-graph/parser.ts +24 -24
  123. package/src/forge/compiler/app-graph/profile.ts +26 -0
  124. package/src/forge/compiler/app-graph/versions.ts +1 -1
  125. package/src/forge/compiler/classifier/capabilities.ts +3 -2
  126. package/src/forge/compiler/classifier/classify.ts +32 -8
  127. package/src/forge/compiler/classifier/secrets.ts +3 -2
  128. package/src/forge/compiler/classifier/signals.ts +91 -1
  129. package/src/forge/compiler/client-sdk/build-manifest.ts +59 -0
  130. package/src/forge/compiler/client-sdk/render-client.ts +295 -13
  131. package/src/forge/compiler/data-graph/parse.ts +20 -4
  132. package/src/forge/compiler/data-graph/sql/ddl.ts +144 -31
  133. package/src/forge/compiler/data-graph/sql/serialize.ts +4 -0
  134. package/src/forge/compiler/data-graph/sql/types.ts +1 -0
  135. package/src/forge/compiler/diagnostics/codes.ts +30 -0
  136. package/src/forge/compiler/diagnostics/create.ts +21 -2
  137. package/src/forge/compiler/diagnostics/index.ts +2 -0
  138. package/src/forge/compiler/emitter/barrel.ts +3 -0
  139. package/src/forge/compiler/emitter/render.ts +9 -0
  140. package/src/forge/compiler/external-manifest/registry.ts +205 -0
  141. package/src/forge/compiler/external-manifest/types.ts +91 -0
  142. package/src/forge/compiler/external-manifest/validate.ts +373 -0
  143. package/src/forge/compiler/frontend-graph/build.ts +142 -14
  144. package/src/forge/compiler/integration/add.ts +618 -24
  145. package/src/forge/compiler/integration/plan.ts +43 -12
  146. package/src/forge/compiler/integration/render.ts +29 -0
  147. package/src/forge/compiler/integration/snapshot.ts +2 -0
  148. package/src/forge/compiler/integration/templates/convex.ts +70 -0
  149. package/src/forge/compiler/integration/templates/index.ts +1 -0
  150. package/src/forge/compiler/integration/templates/render.ts +38 -0
  151. package/src/forge/compiler/integration/templates/types.ts +3 -0
  152. package/src/forge/compiler/integration/templates/workos.ts +1219 -0
  153. package/src/forge/compiler/make-registry/build.ts +8 -9
  154. package/src/forge/compiler/orchestrator/fast-check.ts +4 -0
  155. package/src/forge/compiler/orchestrator/generate-lock.ts +14 -3
  156. package/src/forge/compiler/orchestrator/manifest.ts +1 -1
  157. package/src/forge/compiler/orchestrator/plan-profile.ts +23 -0
  158. package/src/forge/compiler/orchestrator/plan.ts +247 -10
  159. package/src/forge/compiler/orchestrator/profile.ts +65 -0
  160. package/src/forge/compiler/orchestrator/run.ts +97 -31
  161. package/src/forge/compiler/orchestrator/serialize.ts +33 -8
  162. package/src/forge/compiler/orchestrator/types.ts +1 -1
  163. package/src/forge/compiler/package-graph/compiler.ts +3 -1
  164. package/src/forge/compiler/package-graph/constants.ts +1 -1
  165. package/src/forge/compiler/package-manager/adapter.ts +4 -1
  166. package/src/forge/compiler/package-manager/commands.ts +4 -0
  167. package/src/forge/compiler/package-manager/executor.ts +30 -1
  168. package/src/forge/compiler/package-manager/version.ts +36 -12
  169. package/src/forge/compiler/package-upgrades/planner.ts +155 -18
  170. package/src/forge/compiler/package-upgrades/types.ts +2 -0
  171. package/src/forge/compiler/policy-registry/build.ts +47 -2
  172. package/src/forge/compiler/policy-registry/parse.ts +32 -2
  173. package/src/forge/compiler/recipes/definitions.ts +63 -0
  174. package/src/forge/compiler/recipes/index.ts +2 -0
  175. package/src/forge/compiler/recipes/registry.ts +6 -0
  176. package/src/forge/compiler/test-graph/build.ts +11 -3
  177. package/src/forge/compiler/types/app-graph.ts +8 -2
  178. package/src/forge/compiler/types/cli.ts +75 -1
  179. package/src/forge/compiler/types/dev-manifest.ts +4 -0
  180. package/src/forge/compiler/types/emit.ts +2 -0
  181. package/src/forge/compiler/types/frontend-graph.ts +2 -2
  182. package/src/forge/compiler/types/integration.ts +1 -0
  183. package/src/forge/compiler/types/package-graph.ts +6 -0
  184. package/src/forge/compiler/types/policy-registry.ts +3 -1
  185. package/src/forge/delta/classifier.ts +52 -0
  186. package/src/forge/delta/explain.ts +238 -0
  187. package/src/forge/delta/git-observer.ts +43 -0
  188. package/src/forge/delta/ids.ts +44 -0
  189. package/src/forge/delta/index.ts +25 -0
  190. package/src/forge/delta/recorder.ts +540 -0
  191. package/src/forge/delta/redaction.ts +50 -0
  192. package/src/forge/delta/schema.ts +240 -0
  193. package/src/forge/delta/session.ts +142 -0
  194. package/src/forge/delta/status.ts +1202 -0
  195. package/src/forge/delta/store.ts +3284 -0
  196. package/src/forge/delta/timeline.ts +178 -0
  197. package/src/forge/dev/server.ts +808 -17
  198. package/src/forge/dev/types.ts +15 -1
  199. package/src/forge/dev/watch.ts +17 -7
  200. package/src/forge/dev-console/cycle.ts +280 -33
  201. package/src/forge/dev-console/types.ts +47 -1
  202. package/src/forge/impact/index.ts +204 -9
  203. package/src/forge/impact/types.ts +33 -1
  204. package/src/forge/intent/index.ts +35 -16
  205. package/src/forge/make/fields.ts +26 -0
  206. package/src/forge/make/index.ts +40 -6
  207. package/src/forge/make/templates.ts +155 -2
  208. package/src/forge/make/types.ts +2 -1
  209. package/src/forge/policy.ts +1 -1
  210. package/src/forge/react/index.ts +160 -2
  211. package/src/forge/refactor/index.ts +1 -0
  212. package/src/forge/repair/rules/index.ts +2 -2
  213. package/src/forge/review/index.ts +158 -12
  214. package/src/forge/review/types.ts +15 -0
  215. package/src/forge/runtime/auth/config.ts +17 -0
  216. package/src/forge/runtime/auth/evaluate.ts +15 -2
  217. package/src/forge/runtime/auth/resolve.ts +61 -6
  218. package/src/forge/runtime/auth/types.ts +1 -0
  219. package/src/forge/runtime/db/factory.ts +1 -3
  220. package/src/forge/runtime/db/generated-client.ts +13 -2
  221. package/src/forge/runtime/db/memory-adapter.ts +139 -32
  222. package/src/forge/runtime/db/pglite-adapter.ts +263 -2
  223. package/src/forge/runtime/db/postgres-adapter.ts +6 -3
  224. package/src/forge/runtime/executor.ts +129 -16
  225. package/src/forge/runtime/external/bridge.ts +649 -0
  226. package/src/forge/runtime/runner/run-entry.ts +16 -7
  227. package/src/forge/runtime/telemetry/buffer.ts +4 -1
  228. package/src/forge/runtime/telemetry/scrubber.ts +35 -5
  229. package/src/forge/runtime/webhooks/security.ts +12 -7
  230. package/src/forge/server.ts +17 -3
  231. package/src/forge/ui/index.ts +209 -0
  232. package/src/forge/ui/types.ts +1 -0
  233. package/src/forge/version.ts +1 -1
  234. package/src/forge/vue/index.ts +422 -0
  235. package/src/forge/workspace/baseline.ts +112 -0
  236. package/src/forge/workspace/change-summary.ts +250 -0
  237. package/src/forge/workspace/forge-cli.ts +42 -0
  238. package/src/forge/workspace/git-summary.ts +391 -0
  239. package/templates/agent-workroom/AGENTS.md +29 -0
  240. package/templates/agent-workroom/README.md +34 -0
  241. package/templates/agent-workroom/forge.config.ts +3 -0
  242. package/templates/agent-workroom/package.json +33 -0
  243. package/templates/agent-workroom/src/actions/indexAgentSignal.ts +10 -0
  244. package/templates/agent-workroom/src/commands/openWorkroom.ts +61 -0
  245. package/templates/agent-workroom/src/commands/recordAgentSignal.ts +119 -0
  246. package/templates/agent-workroom/src/commands/recordCheckRun.ts +52 -0
  247. package/templates/agent-workroom/src/forge/schema.ts +54 -0
  248. package/templates/agent-workroom/src/policies.ts +6 -0
  249. package/templates/agent-workroom/src/queries/listWorkrooms.ts +11 -0
  250. package/templates/agent-workroom/src/queries/liveWorkroom.ts +63 -0
  251. package/templates/agent-workroom/tsconfig.json +16 -0
  252. package/templates/agent-workroom/web/index.html +12 -0
  253. package/templates/agent-workroom/web/package.json +21 -0
  254. package/templates/agent-workroom/web/src/App.tsx +345 -0
  255. package/templates/agent-workroom/web/src/lib/forge.ts +13 -0
  256. package/templates/agent-workroom/web/src/main.tsx +13 -0
  257. package/templates/agent-workroom/web/src/styles.css +545 -0
  258. package/templates/agent-workroom/web/tsconfig.json +27 -0
  259. package/templates/b2b-support-web/package.json +1 -0
  260. package/templates/b2b-support-web/web/package.json +1 -1
  261. package/templates/minimal-web/package.json +1 -1
  262. package/templates/minimal-web/web/package.json +2 -2
  263. package/templates/nuxt-web/.vscode/settings.json +14 -0
  264. package/templates/nuxt-web/README.md +30 -0
  265. package/templates/nuxt-web/forge.config.ts +3 -0
  266. package/templates/nuxt-web/package.json +33 -0
  267. package/templates/nuxt-web/src/actions/logNoteCreated.ts +11 -0
  268. package/templates/nuxt-web/src/commands/createNote.ts +26 -0
  269. package/templates/nuxt-web/src/forge/schema.ts +12 -0
  270. package/templates/nuxt-web/src/policies.ts +6 -0
  271. package/templates/nuxt-web/src/queries/listNotes.ts +8 -0
  272. package/templates/nuxt-web/src/queries/liveNotes.ts +8 -0
  273. package/templates/nuxt-web/tsconfig.json +17 -0
  274. package/templates/nuxt-web/web/app.vue +67 -0
  275. package/templates/nuxt-web/web/components/LiveNotes.vue +89 -0
  276. package/templates/nuxt-web/web/components/NoteComposer.vue +100 -0
  277. package/templates/nuxt-web/web/composables/forge.ts +13 -0
  278. package/templates/nuxt-web/web/composables/useNotes.ts +24 -0
  279. package/templates/nuxt-web/web/nuxt.config.ts +11 -0
  280. package/templates/nuxt-web/web/package.json +18 -0
  281. package/templates/nuxt-web/web/plugins/forge.client.ts +10 -0
  282. package/templates/nuxt-web/web/plugins/forge.server.ts +10 -0
  283. package/templates/nuxt-web/web/server/api/forge-health.get.ts +7 -0
  284. package/templates/nuxt-web/web/tsconfig.json +6 -0
  285. package/src/forge/_generated/actionSubscriptions.json +0 -2
  286. package/src/forge/_generated/actionSubscriptions.ts +0 -10
  287. package/src/forge/_generated/agentAdapterManifest.json +0 -2
  288. package/src/forge/_generated/agentAdapterManifest.ts +0 -73
  289. package/src/forge/_generated/agentContract.json +0 -2
  290. package/src/forge/_generated/agentContract.ts +0 -7829
  291. package/src/forge/_generated/agentQuickstart.md +0 -34
  292. package/src/forge/_generated/agentTools.json +0 -2
  293. package/src/forge/_generated/agentTools.md +0 -16
  294. package/src/forge/_generated/agentTools.ts +0 -12
  295. package/src/forge/_generated/aiContext.ts +0 -125
  296. package/src/forge/_generated/aiModels.json +0 -2
  297. package/src/forge/_generated/aiModels.ts +0 -51
  298. package/src/forge/_generated/aiProviders.json +0 -2
  299. package/src/forge/_generated/aiProviders.ts +0 -23
  300. package/src/forge/_generated/aiRegistry.json +0 -2
  301. package/src/forge/_generated/aiRegistry.ts +0 -31
  302. package/src/forge/_generated/api.json +0 -2
  303. package/src/forge/_generated/api.ts +0 -8
  304. package/src/forge/_generated/appGraph.json +0 -2
  305. package/src/forge/_generated/appGraph.ts +0 -14919
  306. package/src/forge/_generated/appMap.md +0 -55
  307. package/src/forge/_generated/artifactManifest.json +0 -2
  308. package/src/forge/_generated/artifactManifest.ts +0 -7
  309. package/src/forge/_generated/authClaims.json +0 -2
  310. package/src/forge/_generated/authClaims.ts +0 -13
  311. package/src/forge/_generated/authConfig.json +0 -2
  312. package/src/forge/_generated/authConfig.ts +0 -17
  313. package/src/forge/_generated/authContext.ts +0 -23
  314. package/src/forge/_generated/authRegistry.json +0 -2
  315. package/src/forge/_generated/authRegistry.ts +0 -25
  316. package/src/forge/_generated/buildInfo.json +0 -2
  317. package/src/forge/_generated/buildInfo.ts +0 -9
  318. package/src/forge/_generated/capabilityMap.json +0 -2
  319. package/src/forge/_generated/capabilityMap.md +0 -15
  320. package/src/forge/_generated/capabilityMap.ts +0 -17
  321. package/src/forge/_generated/client.ts +0 -282
  322. package/src/forge/_generated/clientApi.ts +0 -9
  323. package/src/forge/_generated/clientManifest.json +0 -2
  324. package/src/forge/_generated/clientManifest.ts +0 -39
  325. package/src/forge/_generated/clientTypes.ts +0 -78
  326. package/src/forge/_generated/configRegistry.json +0 -2
  327. package/src/forge/_generated/configRegistry.ts +0 -4
  328. package/src/forge/_generated/dataGraph.json +0 -2
  329. package/src/forge/_generated/dataGraph.ts +0 -8
  330. package/src/forge/_generated/db.json +0 -2
  331. package/src/forge/_generated/db.ts +0 -2
  332. package/src/forge/_generated/dbSecurityManifest.json +0 -2
  333. package/src/forge/_generated/dbSecurityManifest.ts +0 -15
  334. package/src/forge/_generated/dbSessionContext.json +0 -2
  335. package/src/forge/_generated/dbSessionContext.ts +0 -39
  336. package/src/forge/_generated/deployManifest.json +0 -2
  337. package/src/forge/_generated/deployManifest.ts +0 -14
  338. package/src/forge/_generated/devManifest.json +0 -2
  339. package/src/forge/_generated/devManifest.ts +0 -62
  340. package/src/forge/_generated/envSchema.json +0 -2
  341. package/src/forge/_generated/envSchema.ts +0 -59
  342. package/src/forge/_generated/frontendGraph.json +0 -2
  343. package/src/forge/_generated/frontendGraph.ts +0 -27
  344. package/src/forge/_generated/importGuards.json +0 -2
  345. package/src/forge/_generated/importGuards.ts +0 -686
  346. package/src/forge/_generated/index.ts +0 -68
  347. package/src/forge/_generated/liveProductionManifest.json +0 -2
  348. package/src/forge/_generated/liveProductionManifest.ts +0 -23
  349. package/src/forge/_generated/liveProtocol.json +0 -2
  350. package/src/forge/_generated/liveProtocol.ts +0 -21
  351. package/src/forge/_generated/liveQueryRegistry.json +0 -2
  352. package/src/forge/_generated/liveQueryRegistry.ts +0 -9
  353. package/src/forge/_generated/liveTransportConfig.json +0 -2
  354. package/src/forge/_generated/liveTransportConfig.ts +0 -19
  355. package/src/forge/_generated/makeRegistry.json +0 -2
  356. package/src/forge/_generated/makeRegistry.ts +0 -177
  357. package/src/forge/_generated/makeTemplates.json +0 -2
  358. package/src/forge/_generated/makeTemplates.ts +0 -66
  359. package/src/forge/_generated/mockMap.json +0 -2
  360. package/src/forge/_generated/mockMap.ts +0 -7
  361. package/src/forge/_generated/operationPlaybooks.md +0 -167
  362. package/src/forge/_generated/packageGraph.json +0 -2
  363. package/src/forge/_generated/packageGraph.ts +0 -249334
  364. package/src/forge/_generated/packageUpgradeRegistry.json +0 -2
  365. package/src/forge/_generated/packageUpgradeRegistry.ts +0 -15
  366. package/src/forge/_generated/permissionMatrix.json +0 -2
  367. package/src/forge/_generated/permissionMatrix.ts +0 -7
  368. package/src/forge/_generated/policyRegistry.json +0 -2
  369. package/src/forge/_generated/policyRegistry.ts +0 -11
  370. package/src/forge/_generated/queryRegistry.json +0 -2
  371. package/src/forge/_generated/queryRegistry.ts +0 -9
  372. package/src/forge/_generated/react.d.ts +0 -22
  373. package/src/forge/_generated/react.ts +0 -29
  374. package/src/forge/_generated/reactManifest.json +0 -2
  375. package/src/forge/_generated/reactManifest.ts +0 -19
  376. package/src/forge/_generated/rlsPolicies.json +0 -2
  377. package/src/forge/_generated/rlsPolicies.sql +0 -34
  378. package/src/forge/_generated/rlsPolicies.ts +0 -6
  379. package/src/forge/_generated/runtimeGraph.json +0 -2
  380. package/src/forge/_generated/runtimeGraph.ts +0 -8
  381. package/src/forge/_generated/runtimeMatrix.json +0 -2
  382. package/src/forge/_generated/runtimeMatrix.ts +0 -334130
  383. package/src/forge/_generated/runtimeRegistry.ts +0 -2
  384. package/src/forge/_generated/runtimeRules.md +0 -91
  385. package/src/forge/_generated/secretRegistry.json +0 -2
  386. package/src/forge/_generated/secretRegistry.ts +0 -50
  387. package/src/forge/_generated/secretsContext.ts +0 -11
  388. package/src/forge/_generated/serverApi.ts +0 -10
  389. package/src/forge/_generated/sourceMapManifest.json +0 -2
  390. package/src/forge/_generated/sourceMapManifest.ts +0 -7
  391. package/src/forge/_generated/sqlPlan.json +0 -2
  392. package/src/forge/_generated/sqlPlan.ts +0 -88
  393. package/src/forge/_generated/subscriptionManifest.json +0 -2
  394. package/src/forge/_generated/subscriptionManifest.ts +0 -7
  395. package/src/forge/_generated/symbolicationManifest.json +0 -2
  396. package/src/forge/_generated/symbolicationManifest.ts +0 -17
  397. package/src/forge/_generated/telemetryRegistry.json +0 -2
  398. package/src/forge/_generated/telemetryRegistry.ts +0 -9
  399. package/src/forge/_generated/telemetrySinks.json +0 -2
  400. package/src/forge/_generated/telemetrySinks.ts +0 -11
  401. package/src/forge/_generated/tenantScope.json +0 -2
  402. package/src/forge/_generated/tenantScope.ts +0 -8
  403. package/src/forge/_generated/testGraph.json +0 -2
  404. package/src/forge/_generated/testGraph.ts +0 -3430
  405. package/src/forge/_generated/testPlanRegistry.json +0 -2
  406. package/src/forge/_generated/testPlanRegistry.ts +0 -33
  407. package/src/forge/_generated/uiRoutes.json +0 -2
  408. package/src/forge/_generated/uiRoutes.ts +0 -16
  409. package/src/forge/_generated/uiScenarios.json +0 -2
  410. package/src/forge/_generated/uiScenarios.ts +0 -30
  411. package/src/forge/_generated/uiTestManifest.json +0 -2
  412. package/src/forge/_generated/uiTestManifest.ts +0 -27
  413. package/src/forge/_generated/workflowRegistry.json +0 -2
  414. package/src/forge/_generated/workflowRegistry.ts +0 -9
  415. package/src/forge/_generated/workflowSubscriptions.json +0 -2
  416. package/src/forge/_generated/workflowSubscriptions.ts +0 -10
@@ -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,34 @@ 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_EMPTY_TIMESTAMP_LITERAL =
52
+ "FORGE_DB_EMPTY_TIMESTAMP_LITERAL" as const;
40
53
  export const FORGE_DB_TRANSACTION_FAILED = "FORGE_DB_TRANSACTION_FAILED" as const;
41
54
  export const FORGE_DB_OUTBOX_WRITE_FAILED = "FORGE_DB_OUTBOX_WRITE_FAILED" as const;
42
55
  export const FORGE_DB_ADAPTER_UNAVAILABLE = "FORGE_DB_ADAPTER_UNAVAILABLE" as const;
56
+ export const FORGE_PGLITE_STORE_ABORTED = "FORGE_PGLITE_STORE_ABORTED" as const;
57
+ export const FORGE_PGLITE_STORE_ACTIVE = "FORGE_PGLITE_STORE_ACTIVE" as const;
43
58
  export const FORGE_RLS_POLICY_MISSING = "FORGE_RLS_POLICY_MISSING" as const;
44
59
  export const FORGE_RLS_TENANT_FIELD_MISSING =
45
60
  "FORGE_RLS_TENANT_FIELD_MISSING" as const;
@@ -92,6 +107,8 @@ export const FORGE_RELEASE_DIRTY_WORKTREE =
92
107
  export const FORGE_RELEASE_GENERATED_DRIFT =
93
108
  "FORGE_RELEASE_GENERATED_DRIFT" as const;
94
109
  export const FORGE_RELEASE_ID_MISSING = "FORGE_RELEASE_ID_MISSING" as const;
110
+ export const FORGE_RELEASE_PACKAGE_PACK_FAILED =
111
+ "FORGE_RELEASE_PACKAGE_PACK_FAILED" as const;
95
112
  export const FORGE_SOURCEMAP_PUBLIC_EXPOSURE =
96
113
  "FORGE_SOURCEMAP_PUBLIC_EXPOSURE" as const;
97
114
  export const FORGE_SOURCEMAP_UPLOAD_MISSING =
@@ -216,6 +233,8 @@ export const FORGE_TEST_DOCKER_REQUIRED = "FORGE_TEST_DOCKER_REQUIRED" as const;
216
233
  export const FORGE_TEST_BROWSER_REQUIRED = "FORGE_TEST_BROWSER_REQUIRED" as const;
217
234
  export const FORGE_VERIFY_CHANGED_INCOMPLETE =
218
235
  "FORGE_VERIFY_CHANGED_INCOMPLETE" as const;
236
+ export const FORGE_VERIFY_NO_TESTS_SELECTED =
237
+ "FORGE_VERIFY_NO_TESTS_SELECTED" as const;
219
238
  export const FORGE_VERIFY_SCRIPT_TIMEOUT =
220
239
  "FORGE_VERIFY_SCRIPT_TIMEOUT" as const;
221
240
  export const FORGE_REPAIR_SOURCE_NOT_FOUND =
@@ -399,17 +418,26 @@ export const DIAGNOSTIC_CODES = [
399
418
  FORGE_RUNTIME_UNRESOLVABLE,
400
419
  FORGE_RUNTIME_NOT_FOUND,
401
420
  FORGE_RUNTIME_GUARD_BLOCKED,
421
+ FORGE_RUNTIME_EXPORT_NAME_REQUIRED,
422
+ FORGE_EXTERNAL_RUNTIME_NOT_FOUND,
423
+ FORGE_EXTERNAL_RUNTIME_UNSUPPORTED,
424
+ FORGE_EXTERNAL_RUNTIME_FAILED,
425
+ FORGE_EXTERNAL_RUNTIME_BAD_RESPONSE,
402
426
  FORGE_DEV_SERVER_ERROR,
403
427
  FORGE_DEV_WATCH_FAILED,
404
428
  FORGE_DEV_INVOKE_FAILED,
405
429
  FORGE_DEV_DOCTOR_MISSING_ARTIFACT,
430
+ FORGE_DEV_DB_RESET,
406
431
  FORGE_DB_CONNECT_FAILED,
407
432
  FORGE_DB_MIGRATION_FAILED,
408
433
  FORGE_DB_UNSUPPORTED_FIELD_TYPE,
409
434
  FORGE_DB_INVALID_SQL_PLAN,
435
+ FORGE_DB_EMPTY_TIMESTAMP_LITERAL,
410
436
  FORGE_DB_TRANSACTION_FAILED,
411
437
  FORGE_DB_OUTBOX_WRITE_FAILED,
412
438
  FORGE_DB_ADAPTER_UNAVAILABLE,
439
+ FORGE_PGLITE_STORE_ABORTED,
440
+ FORGE_PGLITE_STORE_ACTIVE,
413
441
  FORGE_RLS_POLICY_MISSING,
414
442
  FORGE_RLS_TENANT_FIELD_MISSING,
415
443
  FORGE_RLS_UNSUPPORTED_TENANT_TYPE,
@@ -444,6 +472,7 @@ export const DIAGNOSTIC_CODES = [
444
472
  FORGE_RELEASE_DIRTY_WORKTREE,
445
473
  FORGE_RELEASE_GENERATED_DRIFT,
446
474
  FORGE_RELEASE_ID_MISSING,
475
+ FORGE_RELEASE_PACKAGE_PACK_FAILED,
447
476
  FORGE_SOURCEMAP_PUBLIC_EXPOSURE,
448
477
  FORGE_SOURCEMAP_UPLOAD_MISSING,
449
478
  FORGE_SOURCEMAP_UPLOAD_FAILED,
@@ -521,6 +550,7 @@ export const DIAGNOSTIC_CODES = [
521
550
  FORGE_TEST_DOCKER_REQUIRED,
522
551
  FORGE_TEST_BROWSER_REQUIRED,
523
552
  FORGE_VERIFY_CHANGED_INCOMPLETE,
553
+ FORGE_VERIFY_NO_TESTS_SELECTED,
524
554
  FORGE_REPAIR_SOURCE_NOT_FOUND,
525
555
  FORGE_REPAIR_UNKNOWN_FAILURE,
526
556
  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,13 @@ 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
+ }
78
92
  if (code.startsWith("FORGE_UI_")) {
79
93
  return {
80
94
  fixHint: "Inspect the last UI run and use the UI report as repair input.",
@@ -106,7 +120,12 @@ function defaultGuidanceForCode(code: string): DiagnosticGuidance | null {
106
120
  if (code.startsWith("FORGE_FRONTEND_")) {
107
121
  return {
108
122
  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"],
123
+ suggestedCommands: [
124
+ "forge inspect frontend --json",
125
+ "forge make ui --framework vite --dry-run --json",
126
+ "forge make ui --framework nuxt --dry-run --json",
127
+ "forge generate",
128
+ ],
110
129
  docs: ["src/forge/_generated/frontendGraph.json", "AGENTS.md"],
111
130
  };
112
131
  }
@@ -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,