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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (598) hide show
  1. package/.agents/skills/forge-agent-fabric/SKILL.md +178 -0
  2. package/.agents/skills/forge-agent-fabric/references/managed-workflows.md +95 -0
  3. package/.agents/skills/forge-agent-fabric/references/repository-analysis.md +102 -0
  4. package/.agents/skills/forge-agent-fabric/scripts/fabric.mjs +46 -0
  5. package/.agents/skills/forge-agent-fabric/scripts/repository.mjs +44 -0
  6. package/.npmignore +10 -0
  7. package/AGENTS.md +142 -90
  8. package/CHANGELOG.md +870 -9
  9. package/LICENSE +21 -0
  10. package/README.md +121 -6
  11. package/adapters/go/README.md +23 -0
  12. package/adapters/go/go.mod +3 -0
  13. package/adapters/go/http.go +149 -0
  14. package/adapters/go/registry.go +234 -0
  15. package/adapters/go/types.go +136 -0
  16. package/adapters/java/README.md +68 -0
  17. package/adapters/java/pom.xml +47 -0
  18. package/adapters/java/src/main/java/dev/forgeos/adapter/Auth.java +20 -0
  19. package/adapters/java/src/main/java/dev/forgeos/adapter/Diagnostic.java +16 -0
  20. package/adapters/java/src/main/java/dev/forgeos/adapter/Entry.java +38 -0
  21. package/adapters/java/src/main/java/dev/forgeos/adapter/EntryKind.java +16 -0
  22. package/adapters/java/src/main/java/dev/forgeos/adapter/ErrorInfo.java +4 -0
  23. package/adapters/java/src/main/java/dev/forgeos/adapter/Forge.java +94 -0
  24. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeCall.java +12 -0
  25. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeContext.java +11 -0
  26. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHandler.java +8 -0
  27. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHttpHandler.java +179 -0
  28. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeRegistry.java +121 -0
  29. package/adapters/java/src/main/java/dev/forgeos/adapter/Json.java +14 -0
  30. package/adapters/java/src/main/java/dev/forgeos/adapter/Manifest.java +14 -0
  31. package/adapters/java/src/main/java/dev/forgeos/adapter/RequestEnvelope.java +6 -0
  32. package/adapters/java/src/main/java/dev/forgeos/adapter/ResponseEnvelope.java +25 -0
  33. package/adapters/java/src/main/java/dev/forgeos/adapter/Risk.java +18 -0
  34. package/adapters/java/src/main/java/dev/forgeos/adapter/Schemas.java +36 -0
  35. package/adapters/java/src/main/java/dev/forgeos/adapter/Service.java +65 -0
  36. package/adapters/java/src/main/java/dev/forgeos/adapter/TransactionMode.java +18 -0
  37. package/adapters/java/src/main/java/dev/forgeos/adapter/TypedForgeHandler.java +6 -0
  38. package/adapters/java-spring-boot-starter/README.md +32 -0
  39. package/adapters/java-spring-boot-starter/pom.xml +49 -0
  40. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeCommand.java +22 -0
  41. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeExternalService.java +15 -0
  42. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeQuery.java +16 -0
  43. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeServiceBeanCondition.java +18 -0
  44. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringAutoConfiguration.java +16 -0
  45. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringRuntime.java +104 -0
  46. package/adapters/java-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +1 -0
  47. package/bin/forge.mjs +18 -0
  48. package/docs/agent-fabric-programs.md +151 -0
  49. package/docs/agent-fabric.md +582 -0
  50. package/docs/architecture/agent-fabric/PORTABLE_PROJECTS_PLAN.md +136 -0
  51. package/docs/architecture/agent-fabric/README.md +180 -0
  52. package/docs/architecture/agent-fabric/REPOSITORY_MANIFEST_PLAN.md +284 -0
  53. package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_V2_ADR.md +81 -0
  54. package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_V2_CORRECTIONS.md +39 -0
  55. package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_V2_CORRECTIONS_EVIDENCE.md +53 -0
  56. package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_V2_EVIDENCE.md +49 -0
  57. package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_V2_PLAN.md +590 -0
  58. package/docs/cair-protocol.md +103 -0
  59. package/docs/changelog.md +1070 -0
  60. package/docs/forge-protocol.md +189 -0
  61. package/docs/repository-agent-benchmark.md +179 -0
  62. package/docs/repository-analysis.md +139 -0
  63. package/docs/repository-context-quality.md +179 -0
  64. package/docs/repository-runtime-observation.md +82 -0
  65. package/examples/agent-fabric-v2/README.md +70 -0
  66. package/examples/agent-fabric-v2/item-child.workflow.ts +11 -0
  67. package/examples/agent-fabric-v2/make-request.mjs +4 -0
  68. package/examples/agent-fabric-v2/map-child.workflow.ts +10 -0
  69. package/examples/agent-fabric-v2/migrate.workflow.ts +35 -0
  70. package/examples/agent-fabric-v2/registry.example.json +256 -0
  71. package/examples/agent-fabric-v2/run-ui-fixture.ts +48 -0
  72. package/examples/agent-fabric-v2/ui-audit.workflow.ts +28 -0
  73. package/examples/agent-fabric-v2/ui-fixture-worker.cjs +36 -0
  74. package/examples/agent-fabric-v2/visual-population.json +13 -0
  75. package/examples/agent-fabric-v2/workers/check.mjs +2 -0
  76. package/examples/agent-fabric-v2/workers/common.mjs +7 -0
  77. package/examples/agent-fabric-v2/workers/discover.mjs +2 -0
  78. package/examples/agent-fabric-v2/workers/migrate.mjs +4 -0
  79. package/examples/agent-fabric-v2/workers/review.mjs +3 -0
  80. package/examples/go-billing/go.mod +7 -0
  81. package/examples/go-billing/main.go +120 -0
  82. package/examples/java-billing/pom.xml +60 -0
  83. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/CreateInvoiceInput.java +4 -0
  84. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Invoice.java +11 -0
  85. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Main.java +127 -0
  86. package/package.json +60 -5
  87. package/schemas/agent-fabric/v0.1/control-event.schema.json +281 -0
  88. package/schemas/forge-manifest.schema.json +389 -0
  89. package/scripts/field-test-forgeos.mjs +1021 -0
  90. package/scripts/install-agent-fabric-skill.mjs +105 -0
  91. package/src/forge/_generated/releaseManifest.json +1 -2
  92. package/src/forge/_generated/releaseManifest.ts +3 -3
  93. package/src/forge/agent-adapters/index.ts +1592 -125
  94. package/src/forge/agent-adapters/types.ts +225 -1
  95. package/src/forge/agent-fabric/adapter.ts +131 -0
  96. package/src/forge/agent-fabric/attached-snapshot.ts +55 -0
  97. package/src/forge/agent-fabric/attached-task-contract.ts +105 -0
  98. package/src/forge/agent-fabric/attached-task-service.ts +127 -0
  99. package/src/forge/agent-fabric/attached-task-store.ts +109 -0
  100. package/src/forge/agent-fabric/authority.ts +298 -0
  101. package/src/forge/agent-fabric/canonical.ts +135 -0
  102. package/src/forge/agent-fabric/codex-adversarial-review.ts +229 -0
  103. package/src/forge/agent-fabric/codex-sdk-worker.ts +203 -0
  104. package/src/forge/agent-fabric/conductor.ts +754 -0
  105. package/src/forge/agent-fabric/dictionary.ts +12 -0
  106. package/src/forge/agent-fabric/errors.ts +32 -0
  107. package/src/forge/agent-fabric/hardened-conductor.ts +485 -0
  108. package/src/forge/agent-fabric/hardened-reducer.ts +211 -0
  109. package/src/forge/agent-fabric/index.ts +48 -0
  110. package/src/forge/agent-fabric/journal.ts +116 -0
  111. package/src/forge/agent-fabric/local-adaptive-digest-worker.mjs +26 -0
  112. package/src/forge/agent-fabric/local-adaptive-harness.ts +343 -0
  113. package/src/forge/agent-fabric/local-adaptive-service.ts +398 -0
  114. package/src/forge/agent-fabric/local-adaptive-worker.ts +146 -0
  115. package/src/forge/agent-fabric/local-approval-window.ts +211 -0
  116. package/src/forge/agent-fabric/local-change-review-service.ts +374 -0
  117. package/src/forge/agent-fabric/local-coding-worker.ts +285 -0
  118. package/src/forge/agent-fabric/local-control-store.ts +239 -0
  119. package/src/forge/agent-fabric/local-effect-broker.ts +348 -0
  120. package/src/forge/agent-fabric/local-evolution-approval.ts +81 -0
  121. package/src/forge/agent-fabric/local-evolution-profile.ts +87 -0
  122. package/src/forge/agent-fabric/local-evolution-registry.ts +427 -0
  123. package/src/forge/agent-fabric/local-evolution-service.ts +200 -0
  124. package/src/forge/agent-fabric/local-intelligence.ts +281 -0
  125. package/src/forge/agent-fabric/local-paths.ts +18 -0
  126. package/src/forge/agent-fabric/local-task-contract.ts +203 -0
  127. package/src/forge/agent-fabric/local-task-inbox.ts +543 -0
  128. package/src/forge/agent-fabric/local-task-server.ts +374 -0
  129. package/src/forge/agent-fabric/local-task-service.ts +982 -0
  130. package/src/forge/agent-fabric/local-verification.ts +551 -0
  131. package/src/forge/agent-fabric/managed-environment.ts +205 -0
  132. package/src/forge/agent-fabric/managed-run-contract.ts +103 -0
  133. package/src/forge/agent-fabric/managed-run-service.ts +401 -0
  134. package/src/forge/agent-fabric/managed-run-store.ts +165 -0
  135. package/src/forge/agent-fabric/managed-workspace.ts +253 -0
  136. package/src/forge/agent-fabric/p0a.ts +104 -0
  137. package/src/forge/agent-fabric/p0b-model-adapter.ts +434 -0
  138. package/src/forge/agent-fabric/planning.ts +155 -0
  139. package/src/forge/agent-fabric/program-api.ts +37 -0
  140. package/src/forge/agent-fabric/program-contract.ts +283 -0
  141. package/src/forge/agent-fabric/program-dsl.ts +126 -0
  142. package/src/forge/agent-fabric/program-evidence.ts +22 -0
  143. package/src/forge/agent-fabric/program-image.ts +15 -0
  144. package/src/forge/agent-fabric/program-lock.ts +50 -0
  145. package/src/forge/agent-fabric/program-owner.ts +16 -0
  146. package/src/forge/agent-fabric/program-scheduler.ts +38 -0
  147. package/src/forge/agent-fabric/program-service.ts +793 -0
  148. package/src/forge/agent-fabric/program-store.ts +142 -0
  149. package/src/forge/agent-fabric/program-structure.ts +65 -0
  150. package/src/forge/agent-fabric/program-types.ts +110 -0
  151. package/src/forge/agent-fabric/program-view.ts +12 -0
  152. package/src/forge/agent-fabric/program-worker.ts +108 -0
  153. package/src/forge/agent-fabric/project-profile.ts +50 -0
  154. package/src/forge/agent-fabric/project-registry.ts +120 -0
  155. package/src/forge/agent-fabric/project-runtime.ts +85 -0
  156. package/src/forge/agent-fabric/readiness.ts +26 -0
  157. package/src/forge/agent-fabric/reducer.ts +863 -0
  158. package/src/forge/agent-fabric/repository-context.ts +83 -0
  159. package/src/forge/agent-fabric/resource-ledger.ts +266 -0
  160. package/src/forge/agent-fabric/serialized-local-adapter.ts +60 -0
  161. package/src/forge/agent-fabric/types.ts +424 -0
  162. package/src/forge/agent-fabric/validation.ts +500 -0
  163. package/src/forge/agent-fabric/workflow-engine.ts +218 -0
  164. package/src/forge/agent-fabric/workflow-task-actions.ts +104 -0
  165. package/src/forge/agent-fabric/workflow-templates.ts +11 -0
  166. package/src/forge/agent-memory/bridge.ts +1728 -0
  167. package/src/forge/agent-memory/context-pack.ts +284 -0
  168. package/src/forge/agent-memory/hook-runner.ts +331 -0
  169. package/src/forge/agent-memory/mcp.ts +597 -0
  170. package/src/forge/agent-memory/normalize.ts +498 -0
  171. package/src/forge/agent-memory/redaction.ts +103 -0
  172. package/src/forge/agent-memory/sources/claude-code.ts +51 -0
  173. package/src/forge/agent-memory/sources/codex-hook-runner.mjs +343 -0
  174. package/src/forge/agent-memory/sources/codex.ts +161 -0
  175. package/src/forge/agent-memory/sources/cursor.ts +35 -0
  176. package/src/forge/agent-memory/types.ts +215 -0
  177. package/src/forge/bench.ts +248 -0
  178. package/src/forge/brownfield-import/index.ts +896 -0
  179. package/src/forge/brownfield-import/types.ts +127 -0
  180. package/src/forge/cair/action-journal.ts +61 -0
  181. package/src/forge/cair/action-parser.ts +314 -0
  182. package/src/forge/cair/action-validator.ts +40 -0
  183. package/src/forge/cair/actions.ts +1818 -0
  184. package/src/forge/cair/format.ts +77 -0
  185. package/src/forge/cair/index.ts +118 -0
  186. package/src/forge/cair/query.ts +478 -0
  187. package/src/forge/cair/snapshot.ts +315 -0
  188. package/src/forge/cair/types.ts +255 -0
  189. package/src/forge/cli/adaptive.ts +51 -0
  190. package/src/forge/cli/ai.ts +16 -1
  191. package/src/forge/cli/auth.ts +459 -15
  192. package/src/forge/cli/authmd.ts +441 -0
  193. package/src/forge/cli/baseline.ts +112 -0
  194. package/src/forge/cli/build.ts +20 -4
  195. package/src/forge/cli/changed.ts +418 -0
  196. package/src/forge/cli/codex-app-server.ts +877 -0
  197. package/src/forge/cli/commands.ts +1859 -20
  198. package/src/forge/cli/db.ts +209 -2
  199. package/src/forge/cli/deploy.ts +1339 -0
  200. package/src/forge/cli/deps.ts +150 -23
  201. package/src/forge/cli/dev.ts +1137 -53
  202. package/src/forge/cli/docs.ts +265 -0
  203. package/src/forge/cli/doctor.ts +297 -0
  204. package/src/forge/cli/env-placeholders.ts +62 -0
  205. package/src/forge/cli/evolution.ts +40 -0
  206. package/src/forge/cli/fabric.ts +253 -0
  207. package/src/forge/cli/field-test.ts +568 -0
  208. package/src/forge/cli/golden-path.ts +487 -0
  209. package/src/forge/cli/handoff.ts +336 -0
  210. package/src/forge/cli/index.ts +1 -0
  211. package/src/forge/cli/last-run.ts +84 -0
  212. package/src/forge/cli/main.ts +196 -3
  213. package/src/forge/cli/new.ts +169 -17
  214. package/src/forge/cli/next-actions.ts +23 -0
  215. package/src/forge/cli/output.ts +398 -6
  216. package/src/forge/cli/parse.ts +1377 -38
  217. package/src/forge/cli/progress.ts +51 -0
  218. package/src/forge/cli/query.ts +32 -0
  219. package/src/forge/cli/release.ts +35 -11
  220. package/src/forge/cli/repository.ts +151 -0
  221. package/src/forge/cli/run.ts +42 -0
  222. package/src/forge/cli/secrets.ts +137 -1
  223. package/src/forge/cli/seed.ts +581 -0
  224. package/src/forge/cli/self-host.ts +56 -14
  225. package/src/forge/cli/studio.ts +2282 -0
  226. package/src/forge/cli/verify.ts +1458 -32
  227. package/src/forge/cli/windows.ts +23 -0
  228. package/src/forge/cli/workos.ts +3509 -0
  229. package/src/forge/compiler/agent-contract/build.ts +728 -64
  230. package/src/forge/compiler/agent-contract/types.ts +45 -2
  231. package/src/forge/compiler/ai-registry/parse.ts +71 -2
  232. package/src/forge/compiler/api-surface/build.ts +47 -0
  233. package/src/forge/compiler/app-graph/build.ts +112 -9
  234. package/src/forge/compiler/app-graph/extract.ts +107 -0
  235. package/src/forge/compiler/app-graph/module-graph.ts +73 -78
  236. package/src/forge/compiler/app-graph/parser.ts +24 -24
  237. package/src/forge/compiler/app-graph/profile.ts +26 -0
  238. package/src/forge/compiler/app-graph/tsconfig-hash.ts +41 -4
  239. package/src/forge/compiler/app-graph/versions.ts +1 -1
  240. package/src/forge/compiler/classifier/capabilities.ts +3 -2
  241. package/src/forge/compiler/classifier/classify.ts +32 -8
  242. package/src/forge/compiler/classifier/secrets.ts +3 -2
  243. package/src/forge/compiler/classifier/signals.ts +91 -1
  244. package/src/forge/compiler/client-sdk/build-manifest.ts +59 -0
  245. package/src/forge/compiler/client-sdk/render-client.ts +295 -13
  246. package/src/forge/compiler/data-graph/build.ts +29 -1
  247. package/src/forge/compiler/data-graph/parse.ts +20 -4
  248. package/src/forge/compiler/data-graph/sql/ddl.ts +144 -31
  249. package/src/forge/compiler/data-graph/sql/serialize.ts +4 -0
  250. package/src/forge/compiler/data-graph/sql/types.ts +1 -0
  251. package/src/forge/compiler/diagnostics/codes.ts +38 -0
  252. package/src/forge/compiler/diagnostics/create.ts +28 -2
  253. package/src/forge/compiler/diagnostics/index.ts +2 -0
  254. package/src/forge/compiler/emitter/barrel.ts +3 -0
  255. package/src/forge/compiler/emitter/render.ts +9 -0
  256. package/src/forge/compiler/external-manifest/registry.ts +217 -0
  257. package/src/forge/compiler/external-manifest/types.ts +91 -0
  258. package/src/forge/compiler/external-manifest/validate.ts +373 -0
  259. package/src/forge/compiler/frontend-graph/build.ts +142 -14
  260. package/src/forge/compiler/integration/add.ts +991 -33
  261. package/src/forge/compiler/integration/plan.ts +43 -12
  262. package/src/forge/compiler/integration/render.ts +29 -0
  263. package/src/forge/compiler/integration/snapshot.ts +2 -0
  264. package/src/forge/compiler/integration/templates/convex.ts +70 -0
  265. package/src/forge/compiler/integration/templates/index.ts +1 -0
  266. package/src/forge/compiler/integration/templates/render.ts +38 -0
  267. package/src/forge/compiler/integration/templates/types.ts +3 -0
  268. package/src/forge/compiler/integration/templates/workos.ts +1439 -0
  269. package/src/forge/compiler/make-registry/build.ts +8 -9
  270. package/src/forge/compiler/orchestrator/fast-check.ts +4 -0
  271. package/src/forge/compiler/orchestrator/generate-lock.ts +14 -3
  272. package/src/forge/compiler/orchestrator/manifest.ts +1 -1
  273. package/src/forge/compiler/orchestrator/plan-profile.ts +23 -0
  274. package/src/forge/compiler/orchestrator/plan.ts +249 -10
  275. package/src/forge/compiler/orchestrator/profile.ts +65 -0
  276. package/src/forge/compiler/orchestrator/run.ts +101 -33
  277. package/src/forge/compiler/orchestrator/serialize.ts +33 -8
  278. package/src/forge/compiler/orchestrator/types.ts +1 -1
  279. package/src/forge/compiler/package-graph/compiler.ts +3 -1
  280. package/src/forge/compiler/package-graph/constants.ts +1 -1
  281. package/src/forge/compiler/package-graph/dts-extractor.ts +14 -1
  282. package/src/forge/compiler/package-manager/adapter.ts +4 -1
  283. package/src/forge/compiler/package-manager/commands.ts +4 -0
  284. package/src/forge/compiler/package-manager/executor.ts +30 -1
  285. package/src/forge/compiler/package-manager/version.ts +36 -12
  286. package/src/forge/compiler/package-upgrades/planner.ts +155 -18
  287. package/src/forge/compiler/package-upgrades/types.ts +2 -0
  288. package/src/forge/compiler/policy-registry/build.ts +47 -2
  289. package/src/forge/compiler/policy-registry/parse.ts +32 -2
  290. package/src/forge/compiler/recipes/definitions.ts +63 -0
  291. package/src/forge/compiler/recipes/index.ts +2 -0
  292. package/src/forge/compiler/recipes/profiles.ts +81 -0
  293. package/src/forge/compiler/recipes/registry.ts +6 -0
  294. package/src/forge/compiler/test-graph/build.ts +11 -3
  295. package/src/forge/compiler/types/app-graph.ts +8 -2
  296. package/src/forge/compiler/types/cli.ts +76 -1
  297. package/src/forge/compiler/types/dev-manifest.ts +4 -0
  298. package/src/forge/compiler/types/emit.ts +2 -0
  299. package/src/forge/compiler/types/frontend-graph.ts +2 -2
  300. package/src/forge/compiler/types/integration.ts +1 -0
  301. package/src/forge/compiler/types/package-graph.ts +6 -0
  302. package/src/forge/compiler/types/policy-registry.ts +3 -1
  303. package/src/forge/delta/broker-runner.mjs +5 -0
  304. package/src/forge/delta/broker.ts +429 -0
  305. package/src/forge/delta/classifier.ts +52 -0
  306. package/src/forge/delta/explain.ts +238 -0
  307. package/src/forge/delta/git-observer.ts +67 -0
  308. package/src/forge/delta/ids.ts +44 -0
  309. package/src/forge/delta/index.ts +25 -0
  310. package/src/forge/delta/process-identity.ts +37 -0
  311. package/src/forge/delta/queue-status.ts +190 -0
  312. package/src/forge/delta/recorder.ts +540 -0
  313. package/src/forge/delta/redaction.ts +50 -0
  314. package/src/forge/delta/schema.ts +240 -0
  315. package/src/forge/delta/session.ts +142 -0
  316. package/src/forge/delta/status.ts +1139 -0
  317. package/src/forge/delta/store.ts +3329 -0
  318. package/src/forge/delta/timeline.ts +178 -0
  319. package/src/forge/dev/server.ts +1061 -22
  320. package/src/forge/dev/types.ts +15 -1
  321. package/src/forge/dev/watch.ts +17 -7
  322. package/src/forge/dev-console/cycle.ts +285 -33
  323. package/src/forge/dev-console/types.ts +47 -1
  324. package/src/forge/impact/index.ts +222 -30
  325. package/src/forge/impact/types.ts +33 -1
  326. package/src/forge/intent/index.ts +35 -16
  327. package/src/forge/make/fields.ts +26 -0
  328. package/src/forge/make/index.ts +42 -6
  329. package/src/forge/make/templates.ts +211 -4
  330. package/src/forge/make/types.ts +2 -1
  331. package/src/forge/policy.ts +1 -1
  332. package/src/forge/react/index.ts +160 -2
  333. package/src/forge/refactor/index.ts +1 -0
  334. package/src/forge/repair/rules/index.ts +2 -2
  335. package/src/forge/repository-analysis/adapters/common.ts +72 -0
  336. package/src/forge/repository-analysis/adapters/docker.ts +185 -0
  337. package/src/forge/repository-analysis/adapters/java.ts +133 -0
  338. package/src/forge/repository-analysis/adapters/typescript.ts +350 -0
  339. package/src/forge/repository-analysis/adapters/vue.ts +71 -0
  340. package/src/forge/repository-analysis/analyze.ts +434 -0
  341. package/src/forge/repository-analysis/benchmark.ts +336 -0
  342. package/src/forge/repository-analysis/cache-gc.ts +154 -0
  343. package/src/forge/repository-analysis/check-selection.ts +123 -0
  344. package/src/forge/repository-analysis/context-node.ts +17 -0
  345. package/src/forge/repository-analysis/context.ts +456 -0
  346. package/src/forge/repository-analysis/http-resolution.ts +135 -0
  347. package/src/forge/repository-analysis/identity.ts +45 -0
  348. package/src/forge/repository-analysis/index.ts +18 -0
  349. package/src/forge/repository-analysis/nuxt-resolution.ts +188 -0
  350. package/src/forge/repository-analysis/quality.ts +60 -0
  351. package/src/forge/repository-analysis/retrieval.ts +309 -0
  352. package/src/forge/repository-analysis/runtime-artifacts.ts +195 -0
  353. package/src/forge/repository-analysis/runtime-observation.ts +325 -0
  354. package/src/forge/repository-analysis/scanner.ts +174 -0
  355. package/src/forge/repository-analysis/storage.ts +193 -0
  356. package/src/forge/repository-analysis/test-associations.ts +59 -0
  357. package/src/forge/repository-analysis/types.ts +99 -0
  358. package/src/forge/repository-manifest/index.ts +178 -0
  359. package/src/forge/repository-manifest/types.ts +63 -0
  360. package/src/forge/review/index.ts +162 -12
  361. package/src/forge/review/types.ts +15 -0
  362. package/src/forge/runtime/ai/providers.ts +19 -4
  363. package/src/forge/runtime/auth/config.ts +17 -0
  364. package/src/forge/runtime/auth/evaluate.ts +15 -2
  365. package/src/forge/runtime/auth/resolve.ts +61 -6
  366. package/src/forge/runtime/auth/types.ts +1 -0
  367. package/src/forge/runtime/db/factory.ts +1 -3
  368. package/src/forge/runtime/db/generated-client.ts +13 -2
  369. package/src/forge/runtime/db/memory-adapter.ts +139 -32
  370. package/src/forge/runtime/db/pglite-adapter.ts +285 -2
  371. package/src/forge/runtime/executor.ts +129 -16
  372. package/src/forge/runtime/external/bridge.ts +663 -0
  373. package/src/forge/runtime/runner/run-entry.ts +16 -7
  374. package/src/forge/runtime/telemetry/buffer.ts +4 -1
  375. package/src/forge/runtime/telemetry/scrubber.ts +35 -5
  376. package/src/forge/runtime/webhooks/security.ts +12 -7
  377. package/src/forge/server.ts +71 -7
  378. package/src/forge/ui/index.ts +831 -19
  379. package/src/forge/ui/types.ts +3 -1
  380. package/src/forge/version.ts +1 -1
  381. package/src/forge/vue/index.ts +422 -0
  382. package/src/forge/workspace/baseline.ts +112 -0
  383. package/src/forge/workspace/change-summary.ts +292 -0
  384. package/src/forge/workspace/forge-cli.ts +42 -0
  385. package/src/forge/workspace/git-summary.ts +393 -0
  386. package/templates/agent-workroom/AGENTS.md +29 -0
  387. package/templates/agent-workroom/README.md +34 -0
  388. package/templates/agent-workroom/forge.config.ts +3 -0
  389. package/templates/agent-workroom/package.json +34 -0
  390. package/templates/agent-workroom/pnpm-workspace.yaml +2 -0
  391. package/templates/agent-workroom/src/actions/indexAgentSignal.ts +10 -0
  392. package/templates/agent-workroom/src/commands/openWorkroom.ts +61 -0
  393. package/templates/agent-workroom/src/commands/recordAgentSignal.ts +119 -0
  394. package/templates/agent-workroom/src/commands/recordCheckRun.ts +52 -0
  395. package/templates/agent-workroom/src/forge/schema.ts +54 -0
  396. package/templates/agent-workroom/src/policies.ts +6 -0
  397. package/templates/agent-workroom/src/queries/listWorkrooms.ts +11 -0
  398. package/templates/agent-workroom/src/queries/liveWorkroom.ts +63 -0
  399. package/templates/agent-workroom/tsconfig.json +16 -0
  400. package/templates/agent-workroom/web/index.html +13 -0
  401. package/templates/agent-workroom/web/package.json +21 -0
  402. package/templates/agent-workroom/web/src/App.tsx +345 -0
  403. package/templates/agent-workroom/web/src/lib/forge.ts +20 -0
  404. package/templates/agent-workroom/web/src/main.tsx +13 -0
  405. package/templates/agent-workroom/web/src/styles.css +545 -0
  406. package/templates/agent-workroom/web/tsconfig.json +27 -0
  407. package/templates/agent-workroom/web/vite.config.ts +36 -0
  408. package/templates/b2b-support-web/package.json +2 -0
  409. package/templates/b2b-support-web/pnpm-workspace.yaml +2 -0
  410. package/templates/b2b-support-web/web/app/page.tsx +2 -2
  411. package/templates/b2b-support-web/web/lib/forge.ts +9 -2
  412. package/templates/b2b-support-web/web/next.config.ts +24 -0
  413. package/templates/b2b-support-web/web/package.json +1 -1
  414. package/templates/minimal-web/package.json +2 -1
  415. package/templates/minimal-web/pnpm-workspace.yaml +2 -0
  416. package/templates/minimal-web/web/index.html +1 -0
  417. package/templates/minimal-web/web/src/App.tsx +12 -6
  418. package/templates/minimal-web/web/src/lib/forge.ts +9 -2
  419. package/templates/minimal-web/web/src/styles.css +34 -0
  420. package/templates/minimal-web/web/vite.config.ts +36 -0
  421. package/templates/nuxt-web/.vscode/settings.json +14 -0
  422. package/templates/nuxt-web/.yarnrc.yml +1 -0
  423. package/templates/nuxt-web/README.md +30 -0
  424. package/templates/nuxt-web/forge.config.ts +3 -0
  425. package/templates/nuxt-web/package.json +37 -0
  426. package/templates/nuxt-web/pnpm-workspace.yaml +2 -0
  427. package/templates/nuxt-web/src/actions/logNoteCreated.ts +11 -0
  428. package/templates/nuxt-web/src/commands/createNote.ts +26 -0
  429. package/templates/nuxt-web/src/forge/schema.ts +12 -0
  430. package/templates/nuxt-web/src/policies.ts +6 -0
  431. package/templates/nuxt-web/src/queries/listNotes.ts +8 -0
  432. package/templates/nuxt-web/src/queries/liveNotes.ts +8 -0
  433. package/templates/nuxt-web/tsconfig.json +17 -0
  434. package/templates/nuxt-web/web/app.vue +67 -0
  435. package/templates/nuxt-web/web/components/LiveNotes.vue +89 -0
  436. package/templates/nuxt-web/web/components/NoteComposer.vue +100 -0
  437. package/templates/nuxt-web/web/composables/forge.ts +13 -0
  438. package/templates/nuxt-web/web/composables/useNotes.ts +24 -0
  439. package/templates/nuxt-web/web/nuxt.config.ts +11 -0
  440. package/templates/nuxt-web/web/package.json +22 -0
  441. package/templates/nuxt-web/web/plugins/forge.client.ts +10 -0
  442. package/templates/nuxt-web/web/plugins/forge.server.ts +10 -0
  443. package/templates/nuxt-web/web/server/api/forge-health.get.ts +7 -0
  444. package/templates/nuxt-web/web/tsconfig.json +6 -0
  445. package/templates/vendor-access/.vscode/settings.json +14 -0
  446. package/templates/vendor-access/README.md +30 -0
  447. package/templates/vendor-access/forge.config.ts +3 -0
  448. package/templates/vendor-access/package.json +35 -0
  449. package/templates/vendor-access/pnpm-workspace.yaml +2 -0
  450. package/templates/vendor-access/src/commands/addEvidence.ts +42 -0
  451. package/templates/vendor-access/src/commands/approveAccessRequest.ts +43 -0
  452. package/templates/vendor-access/src/commands/createAccessRequest.ts +49 -0
  453. package/templates/vendor-access/src/commands/seedVendorAccessDemo.ts +200 -0
  454. package/templates/vendor-access/src/forge/schema.ts +74 -0
  455. package/templates/vendor-access/src/policies.ts +11 -0
  456. package/templates/vendor-access/src/queries/listVendorAccessDashboard.ts +24 -0
  457. package/templates/vendor-access/src/queries/liveVendorAccessDashboard.ts +24 -0
  458. package/templates/vendor-access/tsconfig.json +17 -0
  459. package/templates/vendor-access/web/index.html +13 -0
  460. package/templates/vendor-access/web/package.json +21 -0
  461. package/templates/vendor-access/web/src/App.tsx +573 -0
  462. package/templates/vendor-access/web/src/lib/forge.ts +20 -0
  463. package/templates/vendor-access/web/src/main.tsx +205 -0
  464. package/templates/vendor-access/web/src/styles.css +682 -0
  465. package/templates/vendor-access/web/tsconfig.json +18 -0
  466. package/templates/vendor-access/web/vite.config.ts +36 -0
  467. package/src/forge/_generated/actionSubscriptions.json +0 -2
  468. package/src/forge/_generated/actionSubscriptions.ts +0 -10
  469. package/src/forge/_generated/agentAdapterManifest.json +0 -2
  470. package/src/forge/_generated/agentAdapterManifest.ts +0 -73
  471. package/src/forge/_generated/agentContract.json +0 -2
  472. package/src/forge/_generated/agentContract.ts +0 -7829
  473. package/src/forge/_generated/agentQuickstart.md +0 -34
  474. package/src/forge/_generated/agentTools.json +0 -2
  475. package/src/forge/_generated/agentTools.md +0 -16
  476. package/src/forge/_generated/agentTools.ts +0 -12
  477. package/src/forge/_generated/aiContext.ts +0 -125
  478. package/src/forge/_generated/aiModels.json +0 -2
  479. package/src/forge/_generated/aiModels.ts +0 -51
  480. package/src/forge/_generated/aiProviders.json +0 -2
  481. package/src/forge/_generated/aiProviders.ts +0 -23
  482. package/src/forge/_generated/aiRegistry.json +0 -2
  483. package/src/forge/_generated/aiRegistry.ts +0 -31
  484. package/src/forge/_generated/api.json +0 -2
  485. package/src/forge/_generated/api.ts +0 -8
  486. package/src/forge/_generated/appGraph.json +0 -2
  487. package/src/forge/_generated/appGraph.ts +0 -14937
  488. package/src/forge/_generated/appMap.md +0 -55
  489. package/src/forge/_generated/artifactManifest.json +0 -2
  490. package/src/forge/_generated/artifactManifest.ts +0 -7
  491. package/src/forge/_generated/authClaims.json +0 -2
  492. package/src/forge/_generated/authClaims.ts +0 -13
  493. package/src/forge/_generated/authConfig.json +0 -2
  494. package/src/forge/_generated/authConfig.ts +0 -17
  495. package/src/forge/_generated/authContext.ts +0 -23
  496. package/src/forge/_generated/authRegistry.json +0 -2
  497. package/src/forge/_generated/authRegistry.ts +0 -25
  498. package/src/forge/_generated/buildInfo.json +0 -2
  499. package/src/forge/_generated/buildInfo.ts +0 -9
  500. package/src/forge/_generated/capabilityMap.json +0 -2
  501. package/src/forge/_generated/capabilityMap.md +0 -15
  502. package/src/forge/_generated/capabilityMap.ts +0 -17
  503. package/src/forge/_generated/client.ts +0 -282
  504. package/src/forge/_generated/clientApi.ts +0 -9
  505. package/src/forge/_generated/clientManifest.json +0 -2
  506. package/src/forge/_generated/clientManifest.ts +0 -39
  507. package/src/forge/_generated/clientTypes.ts +0 -78
  508. package/src/forge/_generated/configRegistry.json +0 -2
  509. package/src/forge/_generated/configRegistry.ts +0 -4
  510. package/src/forge/_generated/dataGraph.json +0 -2
  511. package/src/forge/_generated/dataGraph.ts +0 -8
  512. package/src/forge/_generated/db.json +0 -2
  513. package/src/forge/_generated/db.ts +0 -2
  514. package/src/forge/_generated/dbSecurityManifest.json +0 -2
  515. package/src/forge/_generated/dbSecurityManifest.ts +0 -15
  516. package/src/forge/_generated/dbSessionContext.json +0 -2
  517. package/src/forge/_generated/dbSessionContext.ts +0 -39
  518. package/src/forge/_generated/deployManifest.json +0 -2
  519. package/src/forge/_generated/deployManifest.ts +0 -14
  520. package/src/forge/_generated/devManifest.json +0 -2
  521. package/src/forge/_generated/devManifest.ts +0 -62
  522. package/src/forge/_generated/envSchema.json +0 -2
  523. package/src/forge/_generated/envSchema.ts +0 -59
  524. package/src/forge/_generated/frontendGraph.json +0 -2
  525. package/src/forge/_generated/frontendGraph.ts +0 -27
  526. package/src/forge/_generated/importGuards.json +0 -2
  527. package/src/forge/_generated/importGuards.ts +0 -686
  528. package/src/forge/_generated/index.ts +0 -68
  529. package/src/forge/_generated/liveProductionManifest.json +0 -2
  530. package/src/forge/_generated/liveProductionManifest.ts +0 -23
  531. package/src/forge/_generated/liveProtocol.json +0 -2
  532. package/src/forge/_generated/liveProtocol.ts +0 -21
  533. package/src/forge/_generated/liveQueryRegistry.json +0 -2
  534. package/src/forge/_generated/liveQueryRegistry.ts +0 -9
  535. package/src/forge/_generated/liveTransportConfig.json +0 -2
  536. package/src/forge/_generated/liveTransportConfig.ts +0 -19
  537. package/src/forge/_generated/makeRegistry.json +0 -2
  538. package/src/forge/_generated/makeRegistry.ts +0 -177
  539. package/src/forge/_generated/makeTemplates.json +0 -2
  540. package/src/forge/_generated/makeTemplates.ts +0 -66
  541. package/src/forge/_generated/mockMap.json +0 -2
  542. package/src/forge/_generated/mockMap.ts +0 -7
  543. package/src/forge/_generated/operationPlaybooks.md +0 -167
  544. package/src/forge/_generated/packageGraph.json +0 -2
  545. package/src/forge/_generated/packageGraph.ts +0 -249334
  546. package/src/forge/_generated/packageUpgradeRegistry.json +0 -2
  547. package/src/forge/_generated/packageUpgradeRegistry.ts +0 -15
  548. package/src/forge/_generated/permissionMatrix.json +0 -2
  549. package/src/forge/_generated/permissionMatrix.ts +0 -7
  550. package/src/forge/_generated/policyRegistry.json +0 -2
  551. package/src/forge/_generated/policyRegistry.ts +0 -11
  552. package/src/forge/_generated/queryRegistry.json +0 -2
  553. package/src/forge/_generated/queryRegistry.ts +0 -9
  554. package/src/forge/_generated/react.d.ts +0 -22
  555. package/src/forge/_generated/react.ts +0 -29
  556. package/src/forge/_generated/reactManifest.json +0 -2
  557. package/src/forge/_generated/reactManifest.ts +0 -19
  558. package/src/forge/_generated/rlsPolicies.json +0 -2
  559. package/src/forge/_generated/rlsPolicies.sql +0 -34
  560. package/src/forge/_generated/rlsPolicies.ts +0 -6
  561. package/src/forge/_generated/runtimeGraph.json +0 -2
  562. package/src/forge/_generated/runtimeGraph.ts +0 -8
  563. package/src/forge/_generated/runtimeMatrix.json +0 -2
  564. package/src/forge/_generated/runtimeMatrix.ts +0 -334130
  565. package/src/forge/_generated/runtimeRegistry.ts +0 -2
  566. package/src/forge/_generated/runtimeRules.md +0 -91
  567. package/src/forge/_generated/secretRegistry.json +0 -2
  568. package/src/forge/_generated/secretRegistry.ts +0 -50
  569. package/src/forge/_generated/secretsContext.ts +0 -11
  570. package/src/forge/_generated/serverApi.ts +0 -10
  571. package/src/forge/_generated/sourceMapManifest.json +0 -2
  572. package/src/forge/_generated/sourceMapManifest.ts +0 -7
  573. package/src/forge/_generated/sqlPlan.json +0 -2
  574. package/src/forge/_generated/sqlPlan.ts +0 -88
  575. package/src/forge/_generated/subscriptionManifest.json +0 -2
  576. package/src/forge/_generated/subscriptionManifest.ts +0 -7
  577. package/src/forge/_generated/symbolicationManifest.json +0 -2
  578. package/src/forge/_generated/symbolicationManifest.ts +0 -17
  579. package/src/forge/_generated/telemetryRegistry.json +0 -2
  580. package/src/forge/_generated/telemetryRegistry.ts +0 -9
  581. package/src/forge/_generated/telemetrySinks.json +0 -2
  582. package/src/forge/_generated/telemetrySinks.ts +0 -11
  583. package/src/forge/_generated/tenantScope.json +0 -2
  584. package/src/forge/_generated/tenantScope.ts +0 -8
  585. package/src/forge/_generated/testGraph.json +0 -2
  586. package/src/forge/_generated/testGraph.ts +0 -3452
  587. package/src/forge/_generated/testPlanRegistry.json +0 -2
  588. package/src/forge/_generated/testPlanRegistry.ts +0 -33
  589. package/src/forge/_generated/uiRoutes.json +0 -2
  590. package/src/forge/_generated/uiRoutes.ts +0 -16
  591. package/src/forge/_generated/uiScenarios.json +0 -2
  592. package/src/forge/_generated/uiScenarios.ts +0 -30
  593. package/src/forge/_generated/uiTestManifest.json +0 -2
  594. package/src/forge/_generated/uiTestManifest.ts +0 -27
  595. package/src/forge/_generated/workflowRegistry.json +0 -2
  596. package/src/forge/_generated/workflowRegistry.ts +0 -9
  597. package/src/forge/_generated/workflowSubscriptions.json +0 -2
  598. package/src/forge/_generated/workflowSubscriptions.ts +0 -10
@@ -0,0 +1,121 @@
1
+ package dev.forgeos.adapter;
2
+
3
+ import java.io.IOException;
4
+ import java.io.OutputStream;
5
+ import java.util.ArrayList;
6
+ import java.util.LinkedHashMap;
7
+ import java.util.List;
8
+ import java.util.Map;
9
+
10
+ public final class ForgeRegistry {
11
+ private final Service service;
12
+ private final Map<String, Object> schemas = new LinkedHashMap<>();
13
+ private final List<RegisteredEntry> entries = new ArrayList<>();
14
+ private final Map<String, RegisteredEntry> lookup = new LinkedHashMap<>();
15
+ private String framework = "java/jdk-http";
16
+
17
+ public ForgeRegistry(String serviceName, RegistryOption... options) {
18
+ this.service = new Service(serviceName, "http", null, null, "/health");
19
+ for (RegistryOption option : options) {
20
+ option.apply(this);
21
+ }
22
+ }
23
+
24
+ public String serviceName() {
25
+ return service.name();
26
+ }
27
+
28
+ public String baseUrl() {
29
+ return service.baseUrl();
30
+ }
31
+
32
+ public String healthPath() {
33
+ return service.health() == null ? "/health" : service.health();
34
+ }
35
+
36
+ public void command(String name, ForgeHandler handler, EntryOption... options) {
37
+ Entry entry = new Entry();
38
+ entry.name = name;
39
+ entry.kind = EntryKind.COMMAND.value();
40
+ entry.path = "/commands/" + name;
41
+ entry.method = "POST";
42
+ entry.transaction = TransactionMode.EXTERNAL_MANAGED.value();
43
+ entry.risk = Risk.WRITE.value();
44
+ add(entry, handler, options);
45
+ }
46
+
47
+ public void query(String name, ForgeHandler handler, EntryOption... options) {
48
+ Entry entry = new Entry();
49
+ entry.name = name;
50
+ entry.kind = EntryKind.QUERY.value();
51
+ entry.path = "/queries/" + name;
52
+ entry.method = "POST";
53
+ entry.transaction = TransactionMode.READ_ONLY.value();
54
+ entry.risk = Risk.READ.value();
55
+ add(entry, handler, options);
56
+ }
57
+
58
+ public Manifest manifest(String baseUrl) {
59
+ Service manifestService = service;
60
+ if (baseUrl != null && !baseUrl.isBlank()) {
61
+ manifestService = new Service(service.name(), service.transport(), baseUrl, service.command(), service.health());
62
+ }
63
+ List<Entry> manifestEntries = entries.stream().map(registered -> registered.entry().copy()).toList();
64
+ return new Manifest("1.0", "java", framework, manifestService, manifestEntries, schemas.isEmpty() ? null : schemas);
65
+ }
66
+
67
+ public byte[] marshalManifest(String baseUrl) throws IOException {
68
+ return Json.MAPPER.writerWithDefaultPrettyPrinter().writeValueAsBytes(manifest(baseUrl));
69
+ }
70
+
71
+ public void writeManifest(OutputStream output, String baseUrl) throws IOException {
72
+ output.write(marshalManifest(baseUrl));
73
+ output.write('\n');
74
+ }
75
+
76
+ RegisteredEntry lookup(EntryKind kind, String name) {
77
+ return lookup.get(key(kind, name));
78
+ }
79
+
80
+ void setFramework(String framework) {
81
+ this.framework = framework;
82
+ }
83
+
84
+ void setBaseUrl(String baseUrl) {
85
+ this.service.setBaseUrl(baseUrl);
86
+ }
87
+
88
+ void setHealth(String health) {
89
+ this.service.setHealth(health);
90
+ }
91
+
92
+ void addSchema(String name, Object schema) {
93
+ this.schemas.put(name, schema);
94
+ }
95
+
96
+ private void add(Entry entry, ForgeHandler handler, EntryOption... options) {
97
+ for (EntryOption option : options) {
98
+ option.apply(entry);
99
+ }
100
+ RegisteredEntry registered = new RegisteredEntry(entry, handler);
101
+ entries.add(registered);
102
+ lookup.put(key(EntryKind.valueOf(entry.kind.toUpperCase()), entry.name), registered);
103
+ }
104
+
105
+ private static String key(EntryKind kind, String name) {
106
+ return kind.value() + ":" + name;
107
+ }
108
+
109
+ @FunctionalInterface
110
+ public interface RegistryOption {
111
+ void apply(ForgeRegistry registry);
112
+ }
113
+
114
+ @FunctionalInterface
115
+ public interface EntryOption {
116
+ void apply(Entry entry);
117
+ }
118
+
119
+ record RegisteredEntry(Entry entry, ForgeHandler handler) {
120
+ }
121
+ }
@@ -0,0 +1,14 @@
1
+ package dev.forgeos.adapter;
2
+
3
+ import com.fasterxml.jackson.annotation.JsonInclude;
4
+ import com.fasterxml.jackson.databind.DeserializationFeature;
5
+ import com.fasterxml.jackson.databind.ObjectMapper;
6
+
7
+ public final class Json {
8
+ public static final ObjectMapper MAPPER = new ObjectMapper()
9
+ .setSerializationInclusion(JsonInclude.Include.NON_NULL)
10
+ .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
11
+
12
+ private Json() {
13
+ }
14
+ }
@@ -0,0 +1,14 @@
1
+ package dev.forgeos.adapter;
2
+
3
+ import java.util.List;
4
+ import java.util.Map;
5
+
6
+ public record Manifest(
7
+ String forgeProtocol,
8
+ String language,
9
+ String framework,
10
+ Service service,
11
+ List<Entry> entries,
12
+ Map<String, Object> schemas
13
+ ) {
14
+ }
@@ -0,0 +1,6 @@
1
+ package dev.forgeos.adapter;
2
+
3
+ import com.fasterxml.jackson.databind.JsonNode;
4
+
5
+ public record RequestEnvelope(JsonNode args, Auth auth, ForgeCall forge) {
6
+ }
@@ -0,0 +1,25 @@
1
+ package dev.forgeos.adapter;
2
+
3
+ import java.util.List;
4
+
5
+ public record ResponseEnvelope(
6
+ boolean ok,
7
+ Object result,
8
+ List<Diagnostic> diagnostics,
9
+ ErrorInfo error,
10
+ String traceId
11
+ ) {
12
+ public static ResponseEnvelope ok(Object result, String traceId) {
13
+ return new ResponseEnvelope(true, result, null, null, traceId);
14
+ }
15
+
16
+ public static ResponseEnvelope error(String code, String message, String traceId) {
17
+ return new ResponseEnvelope(
18
+ false,
19
+ null,
20
+ List.of(Diagnostic.error(code, message == null || message.isBlank() ? code : message)),
21
+ new ErrorInfo(code, message == null || message.isBlank() ? code : message),
22
+ traceId
23
+ );
24
+ }
25
+ }
@@ -0,0 +1,18 @@
1
+ package dev.forgeos.adapter;
2
+
3
+ public enum Risk {
4
+ READ("read"),
5
+ WRITE("write"),
6
+ DESTRUCTIVE("destructive"),
7
+ EXTERNAL("external");
8
+
9
+ private final String value;
10
+
11
+ Risk(String value) {
12
+ this.value = value;
13
+ }
14
+
15
+ public String value() {
16
+ return value;
17
+ }
18
+ }
@@ -0,0 +1,36 @@
1
+ package dev.forgeos.adapter;
2
+
3
+ import java.util.LinkedHashMap;
4
+ import java.util.List;
5
+ import java.util.Map;
6
+
7
+ public final class Schemas {
8
+ private Schemas() {
9
+ }
10
+
11
+ public static Map<String, Object> object(Map<String, Object> properties, String... required) {
12
+ Map<String, Object> schema = new LinkedHashMap<>();
13
+ schema.put("type", "object");
14
+ schema.put("properties", properties);
15
+ if (required.length > 0) {
16
+ schema.put("required", List.of(required));
17
+ }
18
+ return schema;
19
+ }
20
+
21
+ public static Map<String, Object> string() {
22
+ return Map.of("type", "string");
23
+ }
24
+
25
+ public static Map<String, Object> bool() {
26
+ return Map.of("type", "boolean");
27
+ }
28
+
29
+ public static Map<String, Object> number() {
30
+ return Map.of("type", "number");
31
+ }
32
+
33
+ public static Map<String, Object> array(Object items) {
34
+ return Map.of("type", "array", "items", items);
35
+ }
36
+ }
@@ -0,0 +1,65 @@
1
+ package dev.forgeos.adapter;
2
+
3
+ public final class Service {
4
+ private final String name;
5
+ private final String transport;
6
+ private String baseUrl;
7
+ private String command;
8
+ private String health;
9
+
10
+ public Service(String name, String transport, String baseUrl, String command, String health) {
11
+ this.name = name;
12
+ this.transport = transport;
13
+ this.baseUrl = baseUrl;
14
+ this.command = command;
15
+ this.health = health;
16
+ }
17
+
18
+ public String name() {
19
+ return name;
20
+ }
21
+
22
+ public String getName() {
23
+ return name;
24
+ }
25
+
26
+ public String transport() {
27
+ return transport;
28
+ }
29
+
30
+ public String getTransport() {
31
+ return transport;
32
+ }
33
+
34
+ public String baseUrl() {
35
+ return baseUrl;
36
+ }
37
+
38
+ public String getBaseUrl() {
39
+ return baseUrl;
40
+ }
41
+
42
+ public String command() {
43
+ return command;
44
+ }
45
+
46
+ public String getCommand() {
47
+ return command;
48
+ }
49
+
50
+ public String health() {
51
+ return health;
52
+ }
53
+
54
+ public String getHealth() {
55
+ return health;
56
+ }
57
+
58
+ void setBaseUrl(String baseUrl) {
59
+ this.baseUrl = baseUrl;
60
+ }
61
+
62
+ void setHealth(String health) {
63
+ this.health = health;
64
+ }
65
+ }
@@ -0,0 +1,18 @@
1
+ package dev.forgeos.adapter;
2
+
3
+ public enum TransactionMode {
4
+ READ_ONLY("read-only"),
5
+ EXTERNAL_MANAGED("external-managed"),
6
+ FORGE_MANAGED("forge-managed"),
7
+ SAGA("saga");
8
+
9
+ private final String value;
10
+
11
+ TransactionMode(String value) {
12
+ this.value = value;
13
+ }
14
+
15
+ public String value() {
16
+ return value;
17
+ }
18
+ }
@@ -0,0 +1,6 @@
1
+ package dev.forgeos.adapter;
2
+
3
+ @FunctionalInterface
4
+ public interface TypedForgeHandler<In, Out> {
5
+ Out handle(ForgeContext context, In input) throws Exception;
6
+ }
@@ -0,0 +1,32 @@
1
+ # Forge Java Spring Boot Starter
2
+
3
+ `adapters/java-spring-boot-starter` is the first Spring integration layer for
4
+ Forge external runtimes. It discovers a bean annotated with
5
+ `@ForgeExternalService`, registers methods annotated with `@ForgeCommand` and
6
+ `@ForgeQuery`, and exposes a `ForgeRegistry` bean.
7
+
8
+ ```java
9
+ @Service
10
+ @ForgeExternalService(name = "billing", baseUrl = "http://127.0.0.1:8080")
11
+ public class BillingService {
12
+ @ForgeCommand(
13
+ name = "createInvoice",
14
+ policy = "billing.manage",
15
+ tenantScoped = true,
16
+ needsApproval = true,
17
+ effects = {"invoice.created"})
18
+ public Invoice createInvoice(ForgeContext context, CreateInvoiceInput input) {
19
+ return new Invoice("inv_java_1", input.title(), context.auth().tenantId());
20
+ }
21
+
22
+ @ForgeQuery(name = "listInvoices", policy = "billing.manage", tenantScoped = true)
23
+ public List<Invoice> listInvoices(ForgeContext context) {
24
+ return List.of(new Invoice("inv_java_1", "Spring invoice", context.auth().tenantId()));
25
+ }
26
+ }
27
+ ```
28
+
29
+ The starter intentionally keeps HTTP endpoint wiring thin in this first version.
30
+ Applications can inject the generated `ForgeRegistry` and serve it with the core
31
+ adapter, or add their own Spring MVC bridge. Full MVC/Actuator auto-endpoints
32
+ are a follow-up layer.
@@ -0,0 +1,49 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project xmlns="http://maven.apache.org/POM/4.0.0"
3
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
5
+ <modelVersion>4.0.0</modelVersion>
6
+
7
+ <groupId>dev.forgeos</groupId>
8
+ <artifactId>forge-java-spring-boot-starter</artifactId>
9
+ <version>0.1.0-alpha.11</version>
10
+ <name>Forge Java Spring Boot Starter</name>
11
+ <description>Spring Boot integration for Forge external runtimes.</description>
12
+
13
+ <properties>
14
+ <maven.compiler.release>17</maven.compiler.release>
15
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
16
+ <spring.boot.version>3.3.5</spring.boot.version>
17
+ </properties>
18
+
19
+ <dependencies>
20
+ <dependency>
21
+ <groupId>dev.forgeos</groupId>
22
+ <artifactId>forge-java-adapter</artifactId>
23
+ <version>0.1.0-alpha.11</version>
24
+ </dependency>
25
+ <dependency>
26
+ <groupId>org.springframework.boot</groupId>
27
+ <artifactId>spring-boot-autoconfigure</artifactId>
28
+ <version>${spring.boot.version}</version>
29
+ </dependency>
30
+ <dependency>
31
+ <groupId>org.springframework</groupId>
32
+ <artifactId>spring-context</artifactId>
33
+ <version>6.1.14</version>
34
+ </dependency>
35
+ </dependencies>
36
+
37
+ <build>
38
+ <plugins>
39
+ <plugin>
40
+ <groupId>org.apache.maven.plugins</groupId>
41
+ <artifactId>maven-compiler-plugin</artifactId>
42
+ <version>3.13.0</version>
43
+ <configuration>
44
+ <release>${maven.compiler.release}</release>
45
+ </configuration>
46
+ </plugin>
47
+ </plugins>
48
+ </build>
49
+ </project>
@@ -0,0 +1,22 @@
1
+ package dev.forgeos.adapter.spring;
2
+
3
+ import dev.forgeos.adapter.Risk;
4
+ import dev.forgeos.adapter.TransactionMode;
5
+ import java.lang.annotation.ElementType;
6
+ import java.lang.annotation.Retention;
7
+ import java.lang.annotation.RetentionPolicy;
8
+ import java.lang.annotation.Target;
9
+
10
+ @Target(ElementType.METHOD)
11
+ @Retention(RetentionPolicy.RUNTIME)
12
+ public @interface ForgeCommand {
13
+ String name();
14
+ String description() default "";
15
+ String path() default "";
16
+ String policy() default "";
17
+ boolean tenantScoped() default false;
18
+ TransactionMode transaction() default TransactionMode.EXTERNAL_MANAGED;
19
+ Risk risk() default Risk.WRITE;
20
+ boolean needsApproval() default false;
21
+ String[] effects() default {};
22
+ }
@@ -0,0 +1,15 @@
1
+ package dev.forgeos.adapter.spring;
2
+
3
+ import java.lang.annotation.ElementType;
4
+ import java.lang.annotation.Retention;
5
+ import java.lang.annotation.RetentionPolicy;
6
+ import java.lang.annotation.Target;
7
+
8
+ @Target(ElementType.TYPE)
9
+ @Retention(RetentionPolicy.RUNTIME)
10
+ public @interface ForgeExternalService {
11
+ String name();
12
+ String baseUrl() default "";
13
+ String framework() default "spring-boot";
14
+ String health() default "/health";
15
+ }
@@ -0,0 +1,16 @@
1
+ package dev.forgeos.adapter.spring;
2
+
3
+ import java.lang.annotation.ElementType;
4
+ import java.lang.annotation.Retention;
5
+ import java.lang.annotation.RetentionPolicy;
6
+ import java.lang.annotation.Target;
7
+
8
+ @Target(ElementType.METHOD)
9
+ @Retention(RetentionPolicy.RUNTIME)
10
+ public @interface ForgeQuery {
11
+ String name();
12
+ String description() default "";
13
+ String path() default "";
14
+ String policy() default "";
15
+ boolean tenantScoped() default false;
16
+ }
@@ -0,0 +1,18 @@
1
+ package dev.forgeos.adapter.spring;
2
+
3
+ import org.springframework.beans.factory.BeanFactory;
4
+ import org.springframework.beans.factory.ListableBeanFactory;
5
+ import org.springframework.context.annotation.Condition;
6
+ import org.springframework.context.annotation.ConditionContext;
7
+ import org.springframework.core.type.AnnotatedTypeMetadata;
8
+
9
+ public final class ForgeServiceBeanCondition implements Condition {
10
+ @Override
11
+ public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
12
+ BeanFactory beanFactory = context.getBeanFactory();
13
+ if (!(beanFactory instanceof ListableBeanFactory listable)) {
14
+ return false;
15
+ }
16
+ return !listable.getBeansWithAnnotation(ForgeExternalService.class).isEmpty();
17
+ }
18
+ }
@@ -0,0 +1,16 @@
1
+ package dev.forgeos.adapter.spring;
2
+
3
+ import dev.forgeos.adapter.ForgeRegistry;
4
+ import org.springframework.boot.autoconfigure.AutoConfiguration;
5
+ import org.springframework.context.ApplicationContext;
6
+ import org.springframework.context.annotation.Bean;
7
+ import org.springframework.context.annotation.Conditional;
8
+
9
+ @AutoConfiguration
10
+ public class ForgeSpringAutoConfiguration {
11
+ @Bean
12
+ @Conditional(ForgeServiceBeanCondition.class)
13
+ public ForgeRegistry forgeRegistry(ApplicationContext context) {
14
+ return ForgeSpringRuntime.buildRegistry(context);
15
+ }
16
+ }
@@ -0,0 +1,104 @@
1
+ package dev.forgeos.adapter.spring;
2
+
3
+ import com.fasterxml.jackson.databind.JsonNode;
4
+ import dev.forgeos.adapter.Forge;
5
+ import dev.forgeos.adapter.ForgeContext;
6
+ import dev.forgeos.adapter.ForgeHandler;
7
+ import dev.forgeos.adapter.ForgeRegistry;
8
+ import java.lang.reflect.InvocationTargetException;
9
+ import java.lang.reflect.Method;
10
+ import java.lang.reflect.Parameter;
11
+ import org.springframework.aop.support.AopUtils;
12
+ import org.springframework.context.ApplicationContext;
13
+ import org.springframework.core.annotation.AnnotatedElementUtils;
14
+ import org.springframework.util.ReflectionUtils;
15
+
16
+ public final class ForgeSpringRuntime {
17
+ private ForgeSpringRuntime() {
18
+ }
19
+
20
+ public static ForgeRegistry buildRegistry(ApplicationContext context) {
21
+ String[] serviceBeanNames = context.getBeanNamesForAnnotation(ForgeExternalService.class);
22
+ if (serviceBeanNames.length == 0) {
23
+ throw new IllegalStateException("no @ForgeExternalService bean found");
24
+ }
25
+
26
+ Object serviceBean = context.getBean(serviceBeanNames[0]);
27
+ Class<?> serviceClass = AopUtils.getTargetClass(serviceBean);
28
+ ForgeExternalService service = AnnotatedElementUtils.findMergedAnnotation(
29
+ serviceClass,
30
+ ForgeExternalService.class
31
+ );
32
+ if (service == null) {
33
+ throw new IllegalStateException("selected bean is missing @ForgeExternalService");
34
+ }
35
+
36
+ ForgeRegistry registry = Forge.service(service.name(),
37
+ Forge.framework(service.framework()),
38
+ Forge.baseUrl(service.baseUrl()),
39
+ Forge.health(service.health())
40
+ );
41
+
42
+ ReflectionUtils.doWithMethods(serviceClass, method -> registerMethod(registry, serviceBean, method));
43
+ return registry;
44
+ }
45
+
46
+ private static void registerMethod(ForgeRegistry registry, Object bean, Method method) {
47
+ ForgeCommand command = AnnotatedElementUtils.findMergedAnnotation(method, ForgeCommand.class);
48
+ if (command != null) {
49
+ registry.command(command.name(), handlerFor(bean, method),
50
+ command.description().isBlank() ? entry -> { } : Forge.description(command.description()),
51
+ command.path().isBlank() ? entry -> { } : Forge.path(command.path()),
52
+ command.policy().isBlank() ? entry -> { } : Forge.policy(command.policy()),
53
+ Forge.tenantScoped(command.tenantScoped()),
54
+ Forge.transaction(command.transaction()),
55
+ Forge.risk(command.risk()),
56
+ Forge.needsApproval(command.needsApproval()),
57
+ Forge.effects(command.effects())
58
+ );
59
+ }
60
+
61
+ ForgeQuery query = AnnotatedElementUtils.findMergedAnnotation(method, ForgeQuery.class);
62
+ if (query != null) {
63
+ registry.query(query.name(), handlerFor(bean, method),
64
+ query.description().isBlank() ? entry -> { } : Forge.description(query.description()),
65
+ query.path().isBlank() ? entry -> { } : Forge.path(query.path()),
66
+ query.policy().isBlank() ? entry -> { } : Forge.policy(query.policy()),
67
+ Forge.tenantScoped(query.tenantScoped()),
68
+ Forge.readOnly()
69
+ );
70
+ }
71
+ }
72
+
73
+ private static ForgeHandler handlerFor(Object bean, Method method) {
74
+ ReflectionUtils.makeAccessible(method);
75
+ return (context, args) -> {
76
+ try {
77
+ return method.invoke(bean, argumentsFor(method, context, args));
78
+ } catch (InvocationTargetException error) {
79
+ Throwable target = error.getTargetException();
80
+ if (target instanceof Exception exception) {
81
+ throw exception;
82
+ }
83
+ throw new RuntimeException(target);
84
+ }
85
+ };
86
+ }
87
+
88
+ private static Object[] argumentsFor(Method method, ForgeContext context, JsonNode args) throws Exception {
89
+ Parameter[] parameters = method.getParameters();
90
+ Object[] values = new Object[parameters.length];
91
+ for (int index = 0; index < parameters.length; index += 1) {
92
+ Class<?> type = parameters[index].getType();
93
+ if (type.equals(ForgeContext.class)) {
94
+ values[index] = context;
95
+ } else {
96
+ JsonNode safeArgs = args == null || args.isNull()
97
+ ? dev.forgeos.adapter.Json.MAPPER.createObjectNode()
98
+ : args;
99
+ values[index] = dev.forgeos.adapter.Json.MAPPER.treeToValue(safeArgs, type);
100
+ }
101
+ }
102
+ return values;
103
+ }
104
+ }
package/bin/forge.mjs CHANGED
@@ -1,8 +1,26 @@
1
1
  #!/usr/bin/env node
2
2
  import { dirname, join } from "node:path";
3
+ import { readFileSync } from "node:fs";
3
4
  import { fileURLToPath, pathToFileURL } from "node:url";
4
5
 
5
6
  const root = dirname(dirname(fileURLToPath(import.meta.url)));
7
+ const args = process.argv.slice(2);
8
+
9
+ if (args.includes("--version") || args.includes("-v")) {
10
+ const pkg = JSON.parse(readFileSync(join(root, "package.json"), "utf8"));
11
+ const version = typeof pkg.version === "string" ? pkg.version : "unknown";
12
+ if (args.includes("--json")) {
13
+ console.log(JSON.stringify({
14
+ version,
15
+ cliVersion: version,
16
+ forgeosVersion: version,
17
+ }, null, 2));
18
+ } else {
19
+ console.log(version);
20
+ }
21
+ process.exit(0);
22
+ }
23
+
6
24
  const entrypoint = join(root, "src", "forge", "cli", "main.ts");
7
25
 
8
26
  let register;