forgeos 0.1.0-alpha.2 → 0.1.0-alpha.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (406) hide show
  1. package/.npmignore +4 -0
  2. package/AGENTS.md +168 -81
  3. package/CHANGELOG.md +211 -0
  4. package/README.md +88 -14
  5. package/adapters/go/README.md +23 -0
  6. package/adapters/go/go.mod +3 -0
  7. package/adapters/go/http.go +149 -0
  8. package/adapters/go/registry.go +234 -0
  9. package/adapters/go/types.go +136 -0
  10. package/adapters/java/README.md +68 -0
  11. package/adapters/java/pom.xml +34 -0
  12. package/adapters/java/src/main/java/dev/forgeos/adapter/Auth.java +20 -0
  13. package/adapters/java/src/main/java/dev/forgeos/adapter/Diagnostic.java +16 -0
  14. package/adapters/java/src/main/java/dev/forgeos/adapter/Entry.java +38 -0
  15. package/adapters/java/src/main/java/dev/forgeos/adapter/EntryKind.java +16 -0
  16. package/adapters/java/src/main/java/dev/forgeos/adapter/ErrorInfo.java +4 -0
  17. package/adapters/java/src/main/java/dev/forgeos/adapter/Forge.java +94 -0
  18. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeCall.java +12 -0
  19. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeContext.java +11 -0
  20. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHandler.java +8 -0
  21. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHttpHandler.java +179 -0
  22. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeRegistry.java +121 -0
  23. package/adapters/java/src/main/java/dev/forgeos/adapter/Json.java +14 -0
  24. package/adapters/java/src/main/java/dev/forgeos/adapter/Manifest.java +14 -0
  25. package/adapters/java/src/main/java/dev/forgeos/adapter/RequestEnvelope.java +6 -0
  26. package/adapters/java/src/main/java/dev/forgeos/adapter/ResponseEnvelope.java +25 -0
  27. package/adapters/java/src/main/java/dev/forgeos/adapter/Risk.java +18 -0
  28. package/adapters/java/src/main/java/dev/forgeos/adapter/Schemas.java +36 -0
  29. package/adapters/java/src/main/java/dev/forgeos/adapter/Service.java +65 -0
  30. package/adapters/java/src/main/java/dev/forgeos/adapter/TransactionMode.java +18 -0
  31. package/adapters/java/src/main/java/dev/forgeos/adapter/TypedForgeHandler.java +6 -0
  32. package/adapters/java/target/classes/dev/forgeos/adapter/Auth.class +0 -0
  33. package/adapters/java/target/classes/dev/forgeos/adapter/Diagnostic.class +0 -0
  34. package/adapters/java/target/classes/dev/forgeos/adapter/Entry.class +0 -0
  35. package/adapters/java/target/classes/dev/forgeos/adapter/EntryKind.class +0 -0
  36. package/adapters/java/target/classes/dev/forgeos/adapter/ErrorInfo.class +0 -0
  37. package/adapters/java/target/classes/dev/forgeos/adapter/Forge.class +0 -0
  38. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeCall.class +0 -0
  39. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeContext.class +0 -0
  40. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeHandler.class +0 -0
  41. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeHttpHandler.class +0 -0
  42. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry$EntryOption.class +0 -0
  43. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry$RegisteredEntry.class +0 -0
  44. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry$RegistryOption.class +0 -0
  45. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry.class +0 -0
  46. package/adapters/java/target/classes/dev/forgeos/adapter/Json.class +0 -0
  47. package/adapters/java/target/classes/dev/forgeos/adapter/Manifest.class +0 -0
  48. package/adapters/java/target/classes/dev/forgeos/adapter/RequestEnvelope.class +0 -0
  49. package/adapters/java/target/classes/dev/forgeos/adapter/ResponseEnvelope.class +0 -0
  50. package/adapters/java/target/classes/dev/forgeos/adapter/Risk.class +0 -0
  51. package/adapters/java/target/classes/dev/forgeos/adapter/Schemas.class +0 -0
  52. package/adapters/java/target/classes/dev/forgeos/adapter/Service.class +0 -0
  53. package/adapters/java/target/classes/dev/forgeos/adapter/TransactionMode.class +0 -0
  54. package/adapters/java/target/classes/dev/forgeos/adapter/TypedForgeHandler.class +0 -0
  55. package/adapters/java/target/forge-java-adapter-0.1.0-alpha.11.jar +0 -0
  56. package/adapters/java/target/maven-archiver/pom.properties +3 -0
  57. package/adapters/java/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +23 -0
  58. package/adapters/java/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +20 -0
  59. package/adapters/java-spring-boot-starter/README.md +32 -0
  60. package/adapters/java-spring-boot-starter/pom.xml +36 -0
  61. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeCommand.java +22 -0
  62. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeExternalService.java +15 -0
  63. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeQuery.java +16 -0
  64. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeServiceBeanCondition.java +18 -0
  65. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringAutoConfiguration.java +16 -0
  66. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringRuntime.java +104 -0
  67. package/adapters/java-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +1 -0
  68. package/adapters/java-spring-boot-starter/target/classes/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +1 -0
  69. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeCommand.class +0 -0
  70. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeExternalService.class +0 -0
  71. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeQuery.class +0 -0
  72. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeServiceBeanCondition.class +0 -0
  73. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeSpringAutoConfiguration.class +0 -0
  74. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeSpringRuntime.class +0 -0
  75. package/adapters/java-spring-boot-starter/target/forge-java-spring-boot-starter-0.1.0-alpha.11.jar +0 -0
  76. package/adapters/java-spring-boot-starter/target/maven-archiver/pom.properties +3 -0
  77. package/adapters/java-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +6 -0
  78. package/adapters/java-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +6 -0
  79. package/bin/forge.mjs +18 -0
  80. package/docs/changelog.md +242 -0
  81. package/docs/forge-protocol.md +189 -0
  82. package/examples/go-billing/go.mod +7 -0
  83. package/examples/go-billing/main.go +120 -0
  84. package/examples/java-billing/pom.xml +52 -0
  85. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/CreateInvoiceInput.java +4 -0
  86. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Invoice.java +11 -0
  87. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Main.java +127 -0
  88. package/examples/java-billing/target/classes/dev/forgeos/examples/billing/CreateInvoiceInput.class +0 -0
  89. package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Invoice.class +0 -0
  90. package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main$EmptyInput.class +0 -0
  91. package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main$Options.class +0 -0
  92. package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main.class +0 -0
  93. package/examples/java-billing/target/java-billing-0.1.0-alpha.11-all.jar +0 -0
  94. package/examples/java-billing/target/java-billing-0.1.0-alpha.11.jar +0 -0
  95. package/examples/java-billing/target/maven-archiver/pom.properties +3 -0
  96. package/examples/java-billing/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +5 -0
  97. package/examples/java-billing/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +3 -0
  98. package/package.json +29 -7
  99. package/schemas/forge-manifest.schema.json +57 -0
  100. package/src/forge/_generated/releaseManifest.json +1 -2
  101. package/src/forge/_generated/releaseManifest.ts +3 -3
  102. package/src/forge/agent-adapters/index.ts +1511 -123
  103. package/src/forge/agent-adapters/types.ts +216 -1
  104. package/src/forge/agent-memory/bridge.ts +1245 -0
  105. package/src/forge/agent-memory/context-pack.ts +151 -0
  106. package/src/forge/agent-memory/hook-runner.ts +312 -0
  107. package/src/forge/agent-memory/mcp.ts +224 -0
  108. package/src/forge/agent-memory/normalize.ts +498 -0
  109. package/src/forge/agent-memory/redaction.ts +103 -0
  110. package/src/forge/agent-memory/sources/claude-code.ts +51 -0
  111. package/src/forge/agent-memory/sources/codex-hook-runner.mjs +273 -0
  112. package/src/forge/agent-memory/sources/codex.ts +119 -0
  113. package/src/forge/agent-memory/sources/cursor.ts +35 -0
  114. package/src/forge/agent-memory/types.ts +191 -0
  115. package/src/forge/bench.ts +248 -0
  116. package/src/forge/brownfield-import/index.ts +801 -0
  117. package/src/forge/brownfield-import/types.ts +127 -0
  118. package/src/forge/cair/action-journal.ts +61 -0
  119. package/src/forge/cair/action-parser.ts +314 -0
  120. package/src/forge/cair/action-validator.ts +40 -0
  121. package/src/forge/cair/actions.ts +1818 -0
  122. package/src/forge/cair/format.ts +77 -0
  123. package/src/forge/cair/index.ts +106 -0
  124. package/src/forge/cair/query.ts +478 -0
  125. package/src/forge/cair/snapshot.ts +315 -0
  126. package/src/forge/cair/types.ts +248 -0
  127. package/src/forge/cli/ai.ts +671 -3
  128. package/src/forge/cli/auth.ts +36 -1
  129. package/src/forge/cli/build.ts +20 -4
  130. package/src/forge/cli/changed.ts +300 -0
  131. package/src/forge/cli/codex-app-server.ts +877 -0
  132. package/src/forge/cli/commands.ts +1285 -7
  133. package/src/forge/cli/db.ts +121 -2
  134. package/src/forge/cli/deps.ts +79 -12
  135. package/src/forge/cli/dev.ts +502 -38
  136. package/src/forge/cli/docs.ts +265 -0
  137. package/src/forge/cli/handoff.ts +250 -0
  138. package/src/forge/cli/index.ts +1 -0
  139. package/src/forge/cli/main.ts +49 -3
  140. package/src/forge/cli/new.ts +3 -1
  141. package/src/forge/cli/next-actions.ts +23 -0
  142. package/src/forge/cli/output.ts +290 -1
  143. package/src/forge/cli/parse.ts +770 -36
  144. package/src/forge/cli/query.ts +32 -0
  145. package/src/forge/cli/release.ts +35 -11
  146. package/src/forge/cli/rls.ts +568 -17
  147. package/src/forge/cli/run.ts +41 -0
  148. package/src/forge/cli/secrets.ts +46 -1
  149. package/src/forge/cli/security.ts +381 -0
  150. package/src/forge/cli/self-host.ts +56 -14
  151. package/src/forge/cli/studio.ts +2163 -0
  152. package/src/forge/cli/verify.ts +1422 -32
  153. package/src/forge/compiler/agent-contract/build.ts +725 -41
  154. package/src/forge/compiler/agent-contract/types.ts +85 -0
  155. package/src/forge/compiler/ai-registry/build.ts +62 -1
  156. package/src/forge/compiler/ai-registry/constants.ts +1 -1
  157. package/src/forge/compiler/ai-registry/parse.ts +168 -5
  158. package/src/forge/compiler/api-surface/build.ts +47 -0
  159. package/src/forge/compiler/app-graph/build.ts +68 -8
  160. package/src/forge/compiler/app-graph/extract.ts +107 -0
  161. package/src/forge/compiler/app-graph/forge-apis.ts +1 -0
  162. package/src/forge/compiler/app-graph/module-graph.ts +73 -78
  163. package/src/forge/compiler/app-graph/parser.ts +24 -24
  164. package/src/forge/compiler/app-graph/profile.ts +26 -0
  165. package/src/forge/compiler/app-graph/versions.ts +1 -1
  166. package/src/forge/compiler/classifier/capabilities.ts +3 -2
  167. package/src/forge/compiler/classifier/classify.ts +32 -8
  168. package/src/forge/compiler/classifier/secrets.ts +3 -2
  169. package/src/forge/compiler/classifier/signals.ts +91 -1
  170. package/src/forge/compiler/client-sdk/build-manifest.ts +59 -0
  171. package/src/forge/compiler/client-sdk/render-client.ts +188 -13
  172. package/src/forge/compiler/data-graph/parse.ts +3 -3
  173. package/src/forge/compiler/data-graph/sql/ddl.ts +60 -2
  174. package/src/forge/compiler/data-graph/sql/serialize.ts +4 -0
  175. package/src/forge/compiler/data-graph/sql/types.ts +1 -0
  176. package/src/forge/compiler/dev-manifest/build.ts +3 -0
  177. package/src/forge/compiler/diagnostics/codes.ts +35 -0
  178. package/src/forge/compiler/diagnostics/create.ts +8 -3
  179. package/src/forge/compiler/diagnostics/index.ts +2 -0
  180. package/src/forge/compiler/emitter/barrel.ts +3 -0
  181. package/src/forge/compiler/emitter/render.ts +5 -0
  182. package/src/forge/compiler/external-manifest/registry.ts +205 -0
  183. package/src/forge/compiler/external-manifest/types.ts +91 -0
  184. package/src/forge/compiler/external-manifest/validate.ts +373 -0
  185. package/src/forge/compiler/frontend-graph/build.ts +85 -13
  186. package/src/forge/compiler/integration/add.ts +498 -22
  187. package/src/forge/compiler/integration/snapshot.ts +2 -0
  188. package/src/forge/compiler/make-registry/build.ts +19 -7
  189. package/src/forge/compiler/orchestrator/plan-profile.ts +23 -0
  190. package/src/forge/compiler/orchestrator/plan.ts +78 -7
  191. package/src/forge/compiler/orchestrator/profile.ts +65 -0
  192. package/src/forge/compiler/orchestrator/run.ts +97 -31
  193. package/src/forge/compiler/orchestrator/serialize.ts +101 -8
  194. package/src/forge/compiler/package-graph/compiler.ts +13 -3
  195. package/src/forge/compiler/package-manager/adapter.ts +4 -1
  196. package/src/forge/compiler/package-manager/commands.ts +4 -0
  197. package/src/forge/compiler/package-manager/executor.ts +30 -1
  198. package/src/forge/compiler/policy-registry/build.ts +44 -1
  199. package/src/forge/compiler/test-graph/build.ts +11 -3
  200. package/src/forge/compiler/types/ai-registry.ts +25 -1
  201. package/src/forge/compiler/types/app-graph.ts +9 -2
  202. package/src/forge/compiler/types/cli.ts +76 -1
  203. package/src/forge/compiler/types/dev-manifest.ts +3 -0
  204. package/src/forge/compiler/types/frontend-graph.ts +2 -2
  205. package/src/forge/delta/classifier.ts +52 -0
  206. package/src/forge/delta/explain.ts +126 -0
  207. package/src/forge/delta/git-observer.ts +43 -0
  208. package/src/forge/delta/ids.ts +44 -0
  209. package/src/forge/delta/index.ts +13 -0
  210. package/src/forge/delta/recorder.ts +402 -0
  211. package/src/forge/delta/redaction.ts +50 -0
  212. package/src/forge/delta/schema.ts +240 -0
  213. package/src/forge/delta/session.ts +142 -0
  214. package/src/forge/delta/status.ts +489 -0
  215. package/src/forge/delta/store.ts +2975 -0
  216. package/src/forge/delta/timeline.ts +104 -0
  217. package/src/forge/dev/server.ts +768 -15
  218. package/src/forge/dev/types.ts +15 -1
  219. package/src/forge/dev/watch.ts +17 -7
  220. package/src/forge/dev-console/cycle.ts +233 -21
  221. package/src/forge/dev-console/types.ts +46 -1
  222. package/src/forge/impact/index.ts +46 -8
  223. package/src/forge/impact/types.ts +6 -0
  224. package/src/forge/intent/index.ts +35 -16
  225. package/src/forge/make/index.ts +149 -6
  226. package/src/forge/make/templates.ts +343 -2
  227. package/src/forge/make/types.ts +3 -1
  228. package/src/forge/refactor/index.ts +1 -0
  229. package/src/forge/repair/rules/index.ts +2 -2
  230. package/src/forge/review/index.ts +158 -12
  231. package/src/forge/review/types.ts +15 -0
  232. package/src/forge/runtime/ai/context.ts +210 -5
  233. package/src/forge/runtime/ai/types.ts +70 -0
  234. package/src/forge/runtime/auth/claims.ts +32 -0
  235. package/src/forge/runtime/auth/errors.ts +2 -0
  236. package/src/forge/runtime/context/create-context.ts +30 -6
  237. package/src/forge/runtime/db/generated-client.ts +13 -2
  238. package/src/forge/runtime/db/memory-adapter.ts +2 -2
  239. package/src/forge/runtime/db/pglite-adapter.ts +77 -2
  240. package/src/forge/runtime/db/postgres-adapter.ts +6 -3
  241. package/src/forge/runtime/executor.ts +112 -2
  242. package/src/forge/runtime/external/bridge.ts +649 -0
  243. package/src/forge/runtime/runner/run-entry.ts +16 -7
  244. package/src/forge/runtime/telemetry/scrubber.ts +91 -10
  245. package/src/forge/runtime/webhooks/security.ts +184 -0
  246. package/src/forge/server.ts +100 -2
  247. package/src/forge/version.ts +1 -1
  248. package/src/forge/vue/index.ts +407 -0
  249. package/src/forge/workspace/change-summary.ts +209 -0
  250. package/src/forge/workspace/forge-cli.ts +14 -0
  251. package/src/forge/workspace/git-summary.ts +279 -0
  252. package/templates/agent-workroom/AGENTS.md +29 -0
  253. package/templates/agent-workroom/README.md +34 -0
  254. package/templates/agent-workroom/forge.config.ts +3 -0
  255. package/templates/agent-workroom/package.json +33 -0
  256. package/templates/agent-workroom/src/actions/indexAgentSignal.ts +10 -0
  257. package/templates/agent-workroom/src/commands/openWorkroom.ts +61 -0
  258. package/templates/agent-workroom/src/commands/recordAgentSignal.ts +119 -0
  259. package/templates/agent-workroom/src/commands/recordCheckRun.ts +52 -0
  260. package/templates/agent-workroom/src/forge/schema.ts +54 -0
  261. package/templates/agent-workroom/src/policies.ts +6 -0
  262. package/templates/agent-workroom/src/queries/listWorkrooms.ts +11 -0
  263. package/templates/agent-workroom/src/queries/liveWorkroom.ts +63 -0
  264. package/templates/agent-workroom/tsconfig.json +16 -0
  265. package/templates/agent-workroom/web/index.html +12 -0
  266. package/templates/agent-workroom/web/package.json +21 -0
  267. package/templates/agent-workroom/web/src/App.tsx +345 -0
  268. package/templates/agent-workroom/web/src/lib/forge.ts +13 -0
  269. package/templates/agent-workroom/web/src/main.tsx +13 -0
  270. package/templates/agent-workroom/web/src/styles.css +545 -0
  271. package/templates/agent-workroom/web/tsconfig.json +27 -0
  272. package/templates/b2b-support-web/package.json +2 -0
  273. package/templates/b2b-support-web/tsconfig.json +4 -1
  274. package/templates/b2b-support-web/web/package.json +1 -1
  275. package/templates/minimal-web/package.json +2 -1
  276. package/templates/minimal-web/tsconfig.json +3 -1
  277. package/templates/minimal-web/web/package.json +2 -2
  278. package/src/forge/_generated/actionSubscriptions.json +0 -2
  279. package/src/forge/_generated/actionSubscriptions.ts +0 -10
  280. package/src/forge/_generated/agentAdapterManifest.json +0 -2
  281. package/src/forge/_generated/agentAdapterManifest.ts +0 -73
  282. package/src/forge/_generated/agentContract.json +0 -2
  283. package/src/forge/_generated/agentContract.ts +0 -7696
  284. package/src/forge/_generated/agentQuickstart.md +0 -32
  285. package/src/forge/_generated/aiContext.ts +0 -59
  286. package/src/forge/_generated/aiModels.json +0 -2
  287. package/src/forge/_generated/aiModels.ts +0 -35
  288. package/src/forge/_generated/aiProviders.json +0 -2
  289. package/src/forge/_generated/aiProviders.ts +0 -23
  290. package/src/forge/_generated/aiRegistry.json +0 -2
  291. package/src/forge/_generated/aiRegistry.ts +0 -29
  292. package/src/forge/_generated/api.json +0 -2
  293. package/src/forge/_generated/api.ts +0 -8
  294. package/src/forge/_generated/appGraph.json +0 -2
  295. package/src/forge/_generated/appGraph.ts +0 -14667
  296. package/src/forge/_generated/appMap.md +0 -35
  297. package/src/forge/_generated/artifactManifest.json +0 -2
  298. package/src/forge/_generated/artifactManifest.ts +0 -7
  299. package/src/forge/_generated/authClaims.json +0 -2
  300. package/src/forge/_generated/authClaims.ts +0 -13
  301. package/src/forge/_generated/authConfig.json +0 -2
  302. package/src/forge/_generated/authConfig.ts +0 -17
  303. package/src/forge/_generated/authContext.ts +0 -23
  304. package/src/forge/_generated/authRegistry.json +0 -2
  305. package/src/forge/_generated/authRegistry.ts +0 -25
  306. package/src/forge/_generated/buildInfo.json +0 -2
  307. package/src/forge/_generated/buildInfo.ts +0 -9
  308. package/src/forge/_generated/capabilityMap.json +0 -2
  309. package/src/forge/_generated/capabilityMap.md +0 -15
  310. package/src/forge/_generated/capabilityMap.ts +0 -17
  311. package/src/forge/_generated/client.ts +0 -282
  312. package/src/forge/_generated/clientApi.ts +0 -9
  313. package/src/forge/_generated/clientManifest.json +0 -2
  314. package/src/forge/_generated/clientManifest.ts +0 -39
  315. package/src/forge/_generated/clientTypes.ts +0 -78
  316. package/src/forge/_generated/configRegistry.json +0 -2
  317. package/src/forge/_generated/configRegistry.ts +0 -4
  318. package/src/forge/_generated/dataGraph.json +0 -2
  319. package/src/forge/_generated/dataGraph.ts +0 -8
  320. package/src/forge/_generated/db.json +0 -2
  321. package/src/forge/_generated/db.ts +0 -2
  322. package/src/forge/_generated/dbSecurityManifest.json +0 -2
  323. package/src/forge/_generated/dbSecurityManifest.ts +0 -15
  324. package/src/forge/_generated/dbSessionContext.json +0 -2
  325. package/src/forge/_generated/dbSessionContext.ts +0 -39
  326. package/src/forge/_generated/deployManifest.json +0 -2
  327. package/src/forge/_generated/deployManifest.ts +0 -14
  328. package/src/forge/_generated/devManifest.json +0 -2
  329. package/src/forge/_generated/devManifest.ts +0 -47
  330. package/src/forge/_generated/envSchema.json +0 -2
  331. package/src/forge/_generated/envSchema.ts +0 -59
  332. package/src/forge/_generated/frontendGraph.json +0 -2
  333. package/src/forge/_generated/frontendGraph.ts +0 -27
  334. package/src/forge/_generated/importGuards.json +0 -2
  335. package/src/forge/_generated/importGuards.ts +0 -686
  336. package/src/forge/_generated/index.ts +0 -67
  337. package/src/forge/_generated/liveProductionManifest.json +0 -2
  338. package/src/forge/_generated/liveProductionManifest.ts +0 -23
  339. package/src/forge/_generated/liveProtocol.json +0 -2
  340. package/src/forge/_generated/liveProtocol.ts +0 -21
  341. package/src/forge/_generated/liveQueryRegistry.json +0 -2
  342. package/src/forge/_generated/liveQueryRegistry.ts +0 -9
  343. package/src/forge/_generated/liveTransportConfig.json +0 -2
  344. package/src/forge/_generated/liveTransportConfig.ts +0 -19
  345. package/src/forge/_generated/makeRegistry.json +0 -2
  346. package/src/forge/_generated/makeRegistry.ts +0 -163
  347. package/src/forge/_generated/makeTemplates.json +0 -2
  348. package/src/forge/_generated/makeTemplates.ts +0 -61
  349. package/src/forge/_generated/mockMap.json +0 -2
  350. package/src/forge/_generated/mockMap.ts +0 -7
  351. package/src/forge/_generated/operationPlaybooks.md +0 -147
  352. package/src/forge/_generated/packageGraph.json +0 -2
  353. package/src/forge/_generated/packageGraph.ts +0 -245249
  354. package/src/forge/_generated/packageUpgradeRegistry.json +0 -2
  355. package/src/forge/_generated/packageUpgradeRegistry.ts +0 -15
  356. package/src/forge/_generated/permissionMatrix.json +0 -2
  357. package/src/forge/_generated/permissionMatrix.ts +0 -7
  358. package/src/forge/_generated/policyRegistry.json +0 -2
  359. package/src/forge/_generated/policyRegistry.ts +0 -11
  360. package/src/forge/_generated/queryRegistry.json +0 -2
  361. package/src/forge/_generated/queryRegistry.ts +0 -9
  362. package/src/forge/_generated/react.d.ts +0 -22
  363. package/src/forge/_generated/react.ts +0 -29
  364. package/src/forge/_generated/reactManifest.json +0 -2
  365. package/src/forge/_generated/reactManifest.ts +0 -19
  366. package/src/forge/_generated/rlsPolicies.json +0 -2
  367. package/src/forge/_generated/rlsPolicies.sql +0 -34
  368. package/src/forge/_generated/rlsPolicies.ts +0 -6
  369. package/src/forge/_generated/runtimeGraph.json +0 -2
  370. package/src/forge/_generated/runtimeGraph.ts +0 -8
  371. package/src/forge/_generated/runtimeMatrix.json +0 -2
  372. package/src/forge/_generated/runtimeMatrix.ts +0 -327385
  373. package/src/forge/_generated/runtimeRegistry.ts +0 -2
  374. package/src/forge/_generated/runtimeRules.md +0 -79
  375. package/src/forge/_generated/secretRegistry.json +0 -2
  376. package/src/forge/_generated/secretRegistry.ts +0 -50
  377. package/src/forge/_generated/secretsContext.ts +0 -11
  378. package/src/forge/_generated/serverApi.ts +0 -10
  379. package/src/forge/_generated/sourceMapManifest.json +0 -2
  380. package/src/forge/_generated/sourceMapManifest.ts +0 -7
  381. package/src/forge/_generated/sqlPlan.json +0 -2
  382. package/src/forge/_generated/sqlPlan.ts +0 -88
  383. package/src/forge/_generated/subscriptionManifest.json +0 -2
  384. package/src/forge/_generated/subscriptionManifest.ts +0 -7
  385. package/src/forge/_generated/symbolicationManifest.json +0 -2
  386. package/src/forge/_generated/symbolicationManifest.ts +0 -17
  387. package/src/forge/_generated/telemetryRegistry.json +0 -2
  388. package/src/forge/_generated/telemetryRegistry.ts +0 -9
  389. package/src/forge/_generated/telemetrySinks.json +0 -2
  390. package/src/forge/_generated/telemetrySinks.ts +0 -11
  391. package/src/forge/_generated/tenantScope.json +0 -2
  392. package/src/forge/_generated/tenantScope.ts +0 -8
  393. package/src/forge/_generated/testGraph.json +0 -2
  394. package/src/forge/_generated/testGraph.ts +0 -3108
  395. package/src/forge/_generated/testPlanRegistry.json +0 -2
  396. package/src/forge/_generated/testPlanRegistry.ts +0 -33
  397. package/src/forge/_generated/uiRoutes.json +0 -2
  398. package/src/forge/_generated/uiRoutes.ts +0 -16
  399. package/src/forge/_generated/uiScenarios.json +0 -2
  400. package/src/forge/_generated/uiScenarios.ts +0 -30
  401. package/src/forge/_generated/uiTestManifest.json +0 -2
  402. package/src/forge/_generated/uiTestManifest.ts +0 -27
  403. package/src/forge/_generated/workflowRegistry.json +0 -2
  404. package/src/forge/_generated/workflowRegistry.ts +0 -9
  405. package/src/forge/_generated/workflowSubscriptions.json +0 -2
  406. package/src/forge/_generated/workflowSubscriptions.ts +0 -10
@@ -14,6 +14,7 @@ export const FORGE_AUTH_INVALID_AUDIENCE = "FORGE_AUTH_INVALID_AUDIENCE" as cons
14
14
  export const FORGE_AUTH_TOKEN_EXPIRED = "FORGE_AUTH_TOKEN_EXPIRED" as const;
15
15
  export const FORGE_AUTH_JWKS_FAILED = "FORGE_AUTH_JWKS_FAILED" as const;
16
16
  export const FORGE_AUTH_CLAIM_MISSING = "FORGE_AUTH_CLAIM_MISSING" as const;
17
+ export const FORGE_AUTH_CLAIM_INVALID = "FORGE_AUTH_CLAIM_INVALID" as const;
17
18
  export const FORGE_AUTH_TENANT_MISSING = "FORGE_AUTH_TENANT_MISSING" as const;
18
19
  export const FORGE_AUTH_DEV_HEADERS_IN_PRODUCTION =
19
20
  "FORGE_AUTH_DEV_HEADERS_IN_PRODUCTION" as const;
@@ -26,11 +27,20 @@ export const FORGE_DUP_RUNTIME_ENTRY = "FORGE_DUP_RUNTIME_ENTRY" as const;
26
27
  export const FORGE_RUNTIME_UNRESOLVABLE = "FORGE_RUNTIME_UNRESOLVABLE" as const;
27
28
  export const FORGE_RUNTIME_NOT_FOUND = "FORGE_RUNTIME_NOT_FOUND" as const;
28
29
  export const FORGE_RUNTIME_GUARD_BLOCKED = "FORGE_RUNTIME_GUARD_BLOCKED" as const;
30
+ export const FORGE_EXTERNAL_RUNTIME_NOT_FOUND =
31
+ "FORGE_EXTERNAL_RUNTIME_NOT_FOUND" as const;
32
+ export const FORGE_EXTERNAL_RUNTIME_UNSUPPORTED =
33
+ "FORGE_EXTERNAL_RUNTIME_UNSUPPORTED" as const;
34
+ export const FORGE_EXTERNAL_RUNTIME_FAILED =
35
+ "FORGE_EXTERNAL_RUNTIME_FAILED" as const;
36
+ export const FORGE_EXTERNAL_RUNTIME_BAD_RESPONSE =
37
+ "FORGE_EXTERNAL_RUNTIME_BAD_RESPONSE" as const;
29
38
  export const FORGE_DEV_SERVER_ERROR = "FORGE_DEV_SERVER_ERROR" as const;
30
39
  export const FORGE_DEV_WATCH_FAILED = "FORGE_DEV_WATCH_FAILED" as const;
31
40
  export const FORGE_DEV_INVOKE_FAILED = "FORGE_DEV_INVOKE_FAILED" as const;
32
41
  export const FORGE_DEV_DOCTOR_MISSING_ARTIFACT =
33
42
  "FORGE_DEV_DOCTOR_MISSING_ARTIFACT" as const;
43
+ export const FORGE_DEV_DB_RESET = "FORGE_DEV_DB_RESET" as const;
34
44
  export const FORGE_DB_CONNECT_FAILED = "FORGE_DB_CONNECT_FAILED" as const;
35
45
  export const FORGE_DB_MIGRATION_FAILED = "FORGE_DB_MIGRATION_FAILED" as const;
36
46
  export const FORGE_DB_UNSUPPORTED_FIELD_TYPE =
@@ -47,6 +57,7 @@ export const FORGE_RLS_UNSUPPORTED_TENANT_TYPE =
47
57
  export const FORGE_RLS_FORCE_DISABLED = "FORGE_RLS_FORCE_DISABLED" as const;
48
58
  export const FORGE_RLS_APPLY_FAILED = "FORGE_RLS_APPLY_FAILED" as const;
49
59
  export const FORGE_RLS_TEST_FAILED = "FORGE_RLS_TEST_FAILED" as const;
60
+ export const FORGE_RLS_MUTATION_FAILED = "FORGE_RLS_MUTATION_FAILED" as const;
50
61
  export const FORGE_RLS_SESSION_CONTEXT_MISSING =
51
62
  "FORGE_RLS_SESSION_CONTEXT_MISSING" as const;
52
63
  export const FORGE_RLS_SESSION_CONTEXT_UNSAFE =
@@ -90,6 +101,8 @@ export const FORGE_RELEASE_DIRTY_WORKTREE =
90
101
  export const FORGE_RELEASE_GENERATED_DRIFT =
91
102
  "FORGE_RELEASE_GENERATED_DRIFT" as const;
92
103
  export const FORGE_RELEASE_ID_MISSING = "FORGE_RELEASE_ID_MISSING" as const;
104
+ export const FORGE_RELEASE_PACKAGE_PACK_FAILED =
105
+ "FORGE_RELEASE_PACKAGE_PACK_FAILED" as const;
93
106
  export const FORGE_SOURCEMAP_PUBLIC_EXPOSURE =
94
107
  "FORGE_SOURCEMAP_PUBLIC_EXPOSURE" as const;
95
108
  export const FORGE_SOURCEMAP_UPLOAD_MISSING =
@@ -214,6 +227,8 @@ export const FORGE_TEST_DOCKER_REQUIRED = "FORGE_TEST_DOCKER_REQUIRED" as const;
214
227
  export const FORGE_TEST_BROWSER_REQUIRED = "FORGE_TEST_BROWSER_REQUIRED" as const;
215
228
  export const FORGE_VERIFY_CHANGED_INCOMPLETE =
216
229
  "FORGE_VERIFY_CHANGED_INCOMPLETE" as const;
230
+ export const FORGE_VERIFY_NO_TESTS_SELECTED =
231
+ "FORGE_VERIFY_NO_TESTS_SELECTED" as const;
217
232
  export const FORGE_VERIFY_SCRIPT_TIMEOUT =
218
233
  "FORGE_VERIFY_SCRIPT_TIMEOUT" as const;
219
234
  export const FORGE_REPAIR_SOURCE_NOT_FOUND =
@@ -315,6 +330,12 @@ export const FORGE_TELEMETRY_PAYLOAD_TRUNCATED =
315
330
  "FORGE_TELEMETRY_PAYLOAD_TRUNCATED" as const;
316
331
  export const FORGE_TELEMETRY_SINK_FAILED = "FORGE_TELEMETRY_SINK_FAILED" as const;
317
332
  export const FORGE_TELEMETRY_UNKNOWN_SINK = "FORGE_TELEMETRY_UNKNOWN_SINK" as const;
333
+ export const FORGE_WEBHOOK_SIGNATURE_INVALID =
334
+ "FORGE_WEBHOOK_SIGNATURE_INVALID" as const;
335
+ export const FORGE_WEBHOOK_TIMESTAMP_INVALID =
336
+ "FORGE_WEBHOOK_TIMESTAMP_INVALID" as const;
337
+ export const FORGE_WEBHOOK_REPLAY_DETECTED =
338
+ "FORGE_WEBHOOK_REPLAY_DETECTED" as const;
318
339
  export const FORGE_POLICY_DENIED = "FORGE_POLICY_DENIED" as const;
319
340
  export const FORGE_POLICY_MISSING = "FORGE_POLICY_MISSING" as const;
320
341
  export const FORGE_POLICY_UNKNOWN = "FORGE_POLICY_UNKNOWN" as const;
@@ -338,6 +359,7 @@ export const FORGE_AI_SECRET_MISSING = "FORGE_AI_SECRET_MISSING" as const;
338
359
  export const FORGE_AI_DYNAMIC_PROVIDER = "FORGE_AI_DYNAMIC_PROVIDER" as const;
339
360
  export const FORGE_AI_GENERATION_FAILED = "FORGE_AI_GENERATION_FAILED" as const;
340
361
  export const FORGE_AI_USAGE_UNAVAILABLE = "FORGE_AI_USAGE_UNAVAILABLE" as const;
362
+ export const FORGE_AI_REDTEAM_FAILED = "FORGE_AI_REDTEAM_FAILED" as const;
341
363
  export const FORGE_QUERY_WRITE_FORBIDDEN = "FORGE_QUERY_WRITE_FORBIDDEN" as const;
342
364
  export const FORGE_QUERY_EMIT_FORBIDDEN = "FORGE_QUERY_EMIT_FORBIDDEN" as const;
343
365
  export const FORGE_QUERY_SECRET_FORBIDDEN = "FORGE_QUERY_SECRET_FORBIDDEN" as const;
@@ -379,6 +401,7 @@ export const DIAGNOSTIC_CODES = [
379
401
  FORGE_AUTH_TOKEN_EXPIRED,
380
402
  FORGE_AUTH_JWKS_FAILED,
381
403
  FORGE_AUTH_CLAIM_MISSING,
404
+ FORGE_AUTH_CLAIM_INVALID,
382
405
  FORGE_AUTH_TENANT_MISSING,
383
406
  FORGE_AUTH_DEV_HEADERS_IN_PRODUCTION,
384
407
  FORGE_AUTH_MODE_INVALID,
@@ -389,10 +412,15 @@ export const DIAGNOSTIC_CODES = [
389
412
  FORGE_RUNTIME_UNRESOLVABLE,
390
413
  FORGE_RUNTIME_NOT_FOUND,
391
414
  FORGE_RUNTIME_GUARD_BLOCKED,
415
+ FORGE_EXTERNAL_RUNTIME_NOT_FOUND,
416
+ FORGE_EXTERNAL_RUNTIME_UNSUPPORTED,
417
+ FORGE_EXTERNAL_RUNTIME_FAILED,
418
+ FORGE_EXTERNAL_RUNTIME_BAD_RESPONSE,
392
419
  FORGE_DEV_SERVER_ERROR,
393
420
  FORGE_DEV_WATCH_FAILED,
394
421
  FORGE_DEV_INVOKE_FAILED,
395
422
  FORGE_DEV_DOCTOR_MISSING_ARTIFACT,
423
+ FORGE_DEV_DB_RESET,
396
424
  FORGE_DB_CONNECT_FAILED,
397
425
  FORGE_DB_MIGRATION_FAILED,
398
426
  FORGE_DB_UNSUPPORTED_FIELD_TYPE,
@@ -406,6 +434,7 @@ export const DIAGNOSTIC_CODES = [
406
434
  FORGE_RLS_FORCE_DISABLED,
407
435
  FORGE_RLS_APPLY_FAILED,
408
436
  FORGE_RLS_TEST_FAILED,
437
+ FORGE_RLS_MUTATION_FAILED,
409
438
  FORGE_RLS_SESSION_CONTEXT_MISSING,
410
439
  FORGE_RLS_SESSION_CONTEXT_UNSAFE,
411
440
  FORGE_DB_SUPERUSER_RUNTIME,
@@ -433,6 +462,7 @@ export const DIAGNOSTIC_CODES = [
433
462
  FORGE_RELEASE_DIRTY_WORKTREE,
434
463
  FORGE_RELEASE_GENERATED_DRIFT,
435
464
  FORGE_RELEASE_ID_MISSING,
465
+ FORGE_RELEASE_PACKAGE_PACK_FAILED,
436
466
  FORGE_SOURCEMAP_PUBLIC_EXPOSURE,
437
467
  FORGE_SOURCEMAP_UPLOAD_MISSING,
438
468
  FORGE_SOURCEMAP_UPLOAD_FAILED,
@@ -510,6 +540,7 @@ export const DIAGNOSTIC_CODES = [
510
540
  FORGE_TEST_DOCKER_REQUIRED,
511
541
  FORGE_TEST_BROWSER_REQUIRED,
512
542
  FORGE_VERIFY_CHANGED_INCOMPLETE,
543
+ FORGE_VERIFY_NO_TESTS_SELECTED,
513
544
  FORGE_REPAIR_SOURCE_NOT_FOUND,
514
545
  FORGE_REPAIR_UNKNOWN_FAILURE,
515
546
  FORGE_REPAIR_NO_RULE_MATCHED,
@@ -575,6 +606,9 @@ export const DIAGNOSTIC_CODES = [
575
606
  FORGE_TELEMETRY_PAYLOAD_TRUNCATED,
576
607
  FORGE_TELEMETRY_SINK_FAILED,
577
608
  FORGE_TELEMETRY_UNKNOWN_SINK,
609
+ FORGE_WEBHOOK_SIGNATURE_INVALID,
610
+ FORGE_WEBHOOK_TIMESTAMP_INVALID,
611
+ FORGE_WEBHOOK_REPLAY_DETECTED,
578
612
  FORGE_POLICY_DENIED,
579
613
  FORGE_POLICY_MISSING,
580
614
  FORGE_POLICY_UNKNOWN,
@@ -595,6 +629,7 @@ export const DIAGNOSTIC_CODES = [
595
629
  FORGE_AI_DYNAMIC_PROVIDER,
596
630
  FORGE_AI_GENERATION_FAILED,
597
631
  FORGE_AI_USAGE_UNAVAILABLE,
632
+ FORGE_AI_REDTEAM_FAILED,
598
633
  FORGE_QUERY_WRITE_FORBIDDEN,
599
634
  FORGE_QUERY_EMIT_FORBIDDEN,
600
635
  FORGE_QUERY_SECRET_FORBIDDEN,
@@ -49,7 +49,7 @@ function defaultGuidanceForCode(code: string): DiagnosticGuidance | null {
49
49
  }
50
50
  if (code === "FORGE_SECRET_DIRECT_PROCESS_ENV") {
51
51
  return {
52
- fixHint: "Use ctx.secrets or ctx.config instead of reading process.env directly from app runtime code.",
52
+ 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
53
  suggestedCommands: ["forge repair diagnose --diagnostic FORGE_SECRET_DIRECT_PROCESS_ENV --json", "forge refactor replace-process-env <ENV_NAME> --dry-run --json"],
54
54
  docs: ["src/forge/_generated/runtimeRules.md"],
55
55
  };
@@ -71,7 +71,7 @@ function defaultGuidanceForCode(code: string): DiagnosticGuidance | null {
71
71
  if (code.startsWith("FORGE_RLS_")) {
72
72
  return {
73
73
  fixHint: "Inspect generated RLS SQL and validate tenant isolation before applying migrations.",
74
- suggestedCommands: ["forge rls check --json", "forge rls print --json"],
74
+ suggestedCommands: ["forge rls check --json", "forge rls test --db postgres --json"],
75
75
  docs: ["src/forge/_generated/agentContract.json"],
76
76
  };
77
77
  }
@@ -106,7 +106,12 @@ function defaultGuidanceForCode(code: string): DiagnosticGuidance | null {
106
106
  if (code.startsWith("FORGE_FRONTEND_")) {
107
107
  return {
108
108
  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"],
109
+ suggestedCommands: [
110
+ "forge inspect frontend --json",
111
+ "forge make ui --framework vite --dry-run --json",
112
+ "forge make ui --framework nuxt --dry-run --json",
113
+ "forge generate",
114
+ ],
110
115
  docs: ["src/forge/_generated/frontendGraph.json", "AGENTS.md"],
111
116
  };
112
117
  }
@@ -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,10 @@ export function render(file: EmitFile, context: RenderContext): string {
66
67
  );
67
68
  }
68
69
 
70
+ if (kind === "json") {
71
+ return body;
72
+ }
73
+
69
74
  return prependDeterministicHeader(body, {
70
75
  generatorVersion: context.generatorVersion,
71
76
  inputHash: context.inputHash,
@@ -0,0 +1,205 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { dirname, join, resolve } from "node:path";
3
+ import { createDiagnostic } from "../diagnostics/create.ts";
4
+ import { hashStable } from "../primitives/hash.ts";
5
+ import { serializeCanonical } from "../primitives/serialize.ts";
6
+ import type { Diagnostic } from "../types/diagnostic.ts";
7
+ import {
8
+ FORGE_EXTERNAL_MANIFEST_PROTOCOL_VERSION,
9
+ FORGE_EXTERNAL_MANIFEST_REGISTRY,
10
+ type ForgeExternalManifest,
11
+ type ForgeExternalManifestRegistryFile,
12
+ type ForgeExternalService,
13
+ type ForgeExternalServiceEntry,
14
+ type ForgeExternalServiceGraph,
15
+ } from "./types.ts";
16
+ import {
17
+ validateExternalManifest,
18
+ validateExternalManifestRegistry,
19
+ } from "./validate.ts";
20
+
21
+ function parseJsonFile(path: string): { value: unknown | null; diagnostics: Diagnostic[] } {
22
+ try {
23
+ return { value: JSON.parse(readFileSync(path, "utf8")), diagnostics: [] };
24
+ } catch (error) {
25
+ return {
26
+ value: null,
27
+ diagnostics: [
28
+ createDiagnostic({
29
+ severity: "error",
30
+ code: "FORGE_EXTERNAL_MANIFEST_PARSE",
31
+ message: `failed to parse external manifest JSON: ${error instanceof Error ? error.message : String(error)}`,
32
+ file: path,
33
+ docs: ["docs/forge-protocol.md", "schemas/forge-manifest.schema.json"],
34
+ }),
35
+ ],
36
+ };
37
+ }
38
+ }
39
+
40
+ function registryPath(workspaceRoot: string): string {
41
+ return join(workspaceRoot, FORGE_EXTERNAL_MANIFEST_REGISTRY);
42
+ }
43
+
44
+ function rootManifestPath(workspaceRoot: string): string {
45
+ return join(workspaceRoot, "forge.manifest.json");
46
+ }
47
+
48
+ function normalizeManifests(manifests: ForgeExternalManifest[]): ForgeExternalManifest[] {
49
+ return [...manifests].sort((a, b) => a.service.name.localeCompare(b.service.name));
50
+ }
51
+
52
+ function serviceFromManifest(manifest: ForgeExternalManifest): ForgeExternalService {
53
+ const entries: ForgeExternalServiceEntry[] = manifest.entries.map((entry) => ({
54
+ ...entry,
55
+ service: manifest.service.name,
56
+ language: manifest.language,
57
+ ...(manifest.framework ? { framework: manifest.framework } : {}),
58
+ transport: manifest.service.transport,
59
+ source: "external",
60
+ }));
61
+ return {
62
+ name: manifest.service.name,
63
+ language: manifest.language,
64
+ ...(manifest.framework ? { framework: manifest.framework } : {}),
65
+ transport: manifest.service.transport,
66
+ ...(manifest.service.baseUrl ? { baseUrl: manifest.service.baseUrl } : {}),
67
+ ...(manifest.service.command ? { command: manifest.service.command } : {}),
68
+ ...(manifest.service.commandArgs ? { commandArgs: manifest.service.commandArgs } : {}),
69
+ ...(manifest.service.health ? { health: manifest.service.health } : {}),
70
+ entries,
71
+ };
72
+ }
73
+
74
+ function duplicateServiceDiagnostics(
75
+ manifests: ForgeExternalManifest[],
76
+ file: string,
77
+ ): Diagnostic[] {
78
+ const seen = new Set<string>();
79
+ const diagnostics: Diagnostic[] = [];
80
+ for (const manifest of manifests) {
81
+ if (seen.has(manifest.service.name)) {
82
+ diagnostics.push(createDiagnostic({
83
+ severity: "error",
84
+ code: "FORGE_EXTERNAL_SERVICE_DUPLICATE",
85
+ message: `external service '${manifest.service.name}' is imported more than once`,
86
+ file,
87
+ fixHint: "Keep one manifest per external service name in .forge/external-manifests.json.",
88
+ docs: ["docs/forge-protocol.md"],
89
+ }));
90
+ }
91
+ seen.add(manifest.service.name);
92
+ }
93
+ return diagnostics;
94
+ }
95
+
96
+ export function readExternalManifestFile(path: string): {
97
+ manifest: ForgeExternalManifest | null;
98
+ diagnostics: Diagnostic[];
99
+ } {
100
+ const parsed = parseJsonFile(path);
101
+ if (parsed.value === null) {
102
+ return { manifest: null, diagnostics: parsed.diagnostics };
103
+ }
104
+ const result = validateExternalManifest(parsed.value, { file: path });
105
+ return { manifest: result.manifest, diagnostics: [...parsed.diagnostics, ...result.diagnostics] };
106
+ }
107
+
108
+ export function loadExternalManifestRegistry(
109
+ workspaceRoot: string,
110
+ ): { registry: ForgeExternalManifestRegistryFile; diagnostics: Diagnostic[]; path: string } {
111
+ const path = registryPath(workspaceRoot);
112
+ const diagnostics: Diagnostic[] = [];
113
+ const manifests: ForgeExternalManifest[] = [];
114
+
115
+ if (existsSync(path)) {
116
+ const parsed = parseJsonFile(path);
117
+ diagnostics.push(...parsed.diagnostics);
118
+ if (parsed.value !== null) {
119
+ const result = validateExternalManifestRegistry(parsed.value, { file: path });
120
+ diagnostics.push(...result.diagnostics);
121
+ if (result.registry) {
122
+ manifests.push(...result.registry.manifests);
123
+ }
124
+ }
125
+ }
126
+
127
+ const rootPath = rootManifestPath(workspaceRoot);
128
+ if (existsSync(rootPath)) {
129
+ const result = readExternalManifestFile(rootPath);
130
+ diagnostics.push(...result.diagnostics);
131
+ if (result.manifest) {
132
+ manifests.push(result.manifest);
133
+ }
134
+ }
135
+
136
+ diagnostics.push(...duplicateServiceDiagnostics(manifests, path));
137
+ return {
138
+ path,
139
+ registry: {
140
+ schemaVersion: "0.1.0",
141
+ manifests: normalizeManifests(manifests),
142
+ },
143
+ diagnostics,
144
+ };
145
+ }
146
+
147
+ export function buildExternalServiceGraph(workspaceRoot: string): ForgeExternalServiceGraph {
148
+ const loaded = loadExternalManifestRegistry(workspaceRoot);
149
+ const services = loaded.registry.manifests.map(serviceFromManifest);
150
+ return {
151
+ schemaVersion: "0.1.0",
152
+ protocolVersion: FORGE_EXTERNAL_MANIFEST_PROTOCOL_VERSION,
153
+ registryPath: FORGE_EXTERNAL_MANIFEST_REGISTRY,
154
+ inputHash: hashStable(serializeCanonical({ services, diagnostics: loaded.diagnostics })),
155
+ services,
156
+ diagnostics: loaded.diagnostics,
157
+ };
158
+ }
159
+
160
+ export function importExternalManifest(
161
+ workspaceRoot: string,
162
+ inputPath: string,
163
+ ): { graph: ForgeExternalServiceGraph; diagnostics: Diagnostic[]; imported: boolean; path: string } {
164
+ const absoluteInput = resolve(workspaceRoot, inputPath);
165
+ const result = readExternalManifestFile(absoluteInput);
166
+ if (!result.manifest || result.diagnostics.some((diagnostic) => diagnostic.severity === "error")) {
167
+ return {
168
+ graph: buildExternalServiceGraph(workspaceRoot),
169
+ diagnostics: result.diagnostics,
170
+ imported: false,
171
+ path: absoluteInput,
172
+ };
173
+ }
174
+
175
+ const loaded = loadExternalManifestRegistry(workspaceRoot);
176
+ const remaining = loaded.registry.manifests.filter(
177
+ (manifest) => manifest.service.name !== result.manifest?.service.name,
178
+ );
179
+ const registry: ForgeExternalManifestRegistryFile = {
180
+ schemaVersion: "0.1.0",
181
+ manifests: normalizeManifests([...remaining, result.manifest]),
182
+ };
183
+ const path = registryPath(workspaceRoot);
184
+ mkdirSync(dirname(path), { recursive: true });
185
+ writeFileSync(path, `${serializeCanonical(registry).trimEnd()}\n`, "utf8");
186
+ const graph = buildExternalServiceGraph(workspaceRoot);
187
+ return {
188
+ graph,
189
+ diagnostics: [...loaded.diagnostics, ...result.diagnostics],
190
+ imported: true,
191
+ path,
192
+ };
193
+ }
194
+
195
+ export function serializeExternalServiceGraphJson(graph: ForgeExternalServiceGraph): string {
196
+ return serializeCanonical(graph);
197
+ }
198
+
199
+ export function serializeExternalServiceGraphTs(graph: ForgeExternalServiceGraph): string {
200
+ return `export const externalServices = ${JSON.stringify(
201
+ JSON.parse(serializeExternalServiceGraphJson(graph)),
202
+ null,
203
+ 2,
204
+ )} as const;\n`;
205
+ }
@@ -0,0 +1,91 @@
1
+ import type { Diagnostic } from "../types/diagnostic.ts";
2
+
3
+ export const FORGE_EXTERNAL_MANIFEST_PROTOCOL_VERSION = "1.0";
4
+ export const FORGE_EXTERNAL_MANIFEST_REGISTRY = ".forge/external-manifests.json";
5
+
6
+ export type ForgeExternalManifestLanguage =
7
+ | "go"
8
+ | "java"
9
+ | "kotlin"
10
+ | "csharp"
11
+ | "rust"
12
+ | "python"
13
+ | "typescript"
14
+ | string;
15
+
16
+ export type ForgeExternalTransportKind = "http" | "grpc" | "stdio";
17
+ export type ForgeExternalEntryKind = "command" | "query";
18
+ export type ForgeExternalEntryRisk = "read" | "write" | "destructive" | "external";
19
+ export type ForgeExternalTransactionMode =
20
+ | "read-only"
21
+ | "external-managed"
22
+ | "forge-managed"
23
+ | "saga";
24
+
25
+ export interface ForgeExternalManifestService {
26
+ name: string;
27
+ transport: ForgeExternalTransportKind;
28
+ baseUrl?: string;
29
+ command?: string;
30
+ commandArgs?: string[];
31
+ health?: string;
32
+ }
33
+
34
+ export interface ForgeExternalManifestEntry {
35
+ name: string;
36
+ kind: ForgeExternalEntryKind;
37
+ description?: string;
38
+ path?: string;
39
+ method?: "GET" | "POST";
40
+ inputSchema?: unknown;
41
+ outputSchema?: unknown;
42
+ policy?: string;
43
+ tenantScoped?: boolean;
44
+ transaction?: ForgeExternalTransactionMode;
45
+ risk?: ForgeExternalEntryRisk;
46
+ needsApproval?: boolean;
47
+ effects?: string[];
48
+ }
49
+
50
+ export interface ForgeExternalManifest {
51
+ forgeProtocol: typeof FORGE_EXTERNAL_MANIFEST_PROTOCOL_VERSION;
52
+ language: ForgeExternalManifestLanguage;
53
+ framework?: string;
54
+ service: ForgeExternalManifestService;
55
+ entries: ForgeExternalManifestEntry[];
56
+ schemas?: Record<string, unknown>;
57
+ }
58
+
59
+ export interface ForgeExternalManifestRegistryFile {
60
+ schemaVersion: "0.1.0";
61
+ manifests: ForgeExternalManifest[];
62
+ }
63
+
64
+ export interface ForgeExternalServiceEntry extends ForgeExternalManifestEntry {
65
+ service: string;
66
+ language: ForgeExternalManifestLanguage;
67
+ framework?: string;
68
+ transport: ForgeExternalTransportKind;
69
+ source: "external";
70
+ }
71
+
72
+ export interface ForgeExternalService {
73
+ name: string;
74
+ language: ForgeExternalManifestLanguage;
75
+ framework?: string;
76
+ transport: ForgeExternalTransportKind;
77
+ baseUrl?: string;
78
+ command?: string;
79
+ commandArgs?: string[];
80
+ health?: string;
81
+ entries: ForgeExternalServiceEntry[];
82
+ }
83
+
84
+ export interface ForgeExternalServiceGraph {
85
+ schemaVersion: "0.1.0";
86
+ protocolVersion: typeof FORGE_EXTERNAL_MANIFEST_PROTOCOL_VERSION;
87
+ inputHash: string;
88
+ registryPath: string;
89
+ services: ForgeExternalService[];
90
+ diagnostics: Diagnostic[];
91
+ }