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
@@ -4,18 +4,39 @@ import {
4
4
  FORGE_AUTH_INVALID_AUDIENCE,
5
5
  FORGE_AUTH_JWKS_FAILED,
6
6
  } from "../compiler/diagnostics/codes.ts";
7
- import { loadAuthConfigFromEnv } from "../runtime/auth/config.ts";
7
+ import { AUTH_ENV, loadAuthConfigFromEnv, type AuthClaimsMapping } from "../runtime/auth/config.ts";
8
8
  import { mapClaimsToAuthContext } from "../runtime/auth/claims.ts";
9
9
  import { ForgeAuthError } from "../runtime/auth/errors.ts";
10
10
  import { verifyJwtToken } from "../runtime/auth/verifier.ts";
11
+ import { loadSecretRegistry } from "../runtime/secrets/check.ts";
12
+ import { loadEnvFiles } from "../runtime/secrets/env-loader.ts";
13
+ import { existsSync } from "node:fs";
14
+ import { join } from "node:path";
15
+ import { normalizeForgeCliCommandsInValue } from "../workspace/forge-cli.ts";
16
+ import {
17
+ collectExpectedResourceTypes,
18
+ collectPolicyPermissions,
19
+ missingValues,
20
+ parseSeedFile,
21
+ runWorkOSCommand,
22
+ type WorkOSCommandResult,
23
+ type WorkOSCommandRunner,
24
+ } from "./workos.ts";
11
25
 
12
- export type AuthSubcommand = "check" | "config" | "decode" | "test-token" | "jwks" | "prove";
26
+ export type AuthSubcommand = "check" | "config" | "decode" | "test-token" | "jwks" | "prove" | "status";
13
27
 
14
28
  export interface AuthCommandOptions {
15
29
  subcommand: AuthSubcommand;
16
30
  workspaceRoot: string;
17
31
  json: boolean;
18
32
  token?: string;
33
+ prod?: boolean;
34
+ scenario?: string;
35
+ provider?: "workos";
36
+ real?: boolean;
37
+ file?: string;
38
+ clientId?: string;
39
+ commandRunner?: WorkOSCommandRunner;
19
40
  }
20
41
 
21
42
  export interface AuthCommandResult {
@@ -26,10 +47,76 @@ export interface AuthCommandResult {
26
47
  exitCode: 0 | 1;
27
48
  }
28
49
 
29
- function validateConfig(workspaceRoot: string): AuthCommandResult {
30
- const config = loadAuthConfigFromEnv(workspaceRoot);
31
- const errors: { code: string; message: string }[] = [];
50
+ const AUTH_CLI_ENV_KEYS = Object.values(AUTH_ENV);
51
+
52
+ function withCliAuthEnv<T>(workspaceRoot: string, fn: () => T): T {
53
+ const { store } = loadEnvFiles({ workspaceRoot });
54
+ const previous = AUTH_CLI_ENV_KEYS.map((key) => ({
55
+ key,
56
+ had: Object.prototype.hasOwnProperty.call(process.env, key),
57
+ value: process.env[key],
58
+ }));
59
+
60
+ for (const key of AUTH_CLI_ENV_KEYS) {
61
+ if (process.env[key] === undefined) {
62
+ const value = store.resolve(key);
63
+ if (value !== undefined) {
64
+ process.env[key] = value;
65
+ }
66
+ }
67
+ }
68
+
69
+ try {
70
+ return fn();
71
+ } finally {
72
+ for (const entry of previous) {
73
+ if (entry.had) {
74
+ process.env[entry.key] = entry.value;
75
+ } else {
76
+ delete process.env[entry.key];
77
+ }
78
+ }
79
+ }
80
+ }
81
+
82
+ function loadAuthConfigForCli(workspaceRoot: string) {
83
+ return withCliAuthEnv(workspaceRoot, () => loadAuthConfigFromEnv(workspaceRoot));
84
+ }
85
+
86
+ function detectWorkOS(workspaceRoot: string, claims: AuthClaimsMapping) {
87
+ const secretRegistry = loadSecretRegistry(workspaceRoot);
88
+ const secretNames = new Set((secretRegistry?.secrets ?? []).map((secret) => secret.name));
89
+ const detected =
90
+ secretNames.has("WORKOS_API_KEY") ||
91
+ secretNames.has("WORKOS_CLIENT_ID") ||
92
+ claims.tenantId === "organization_id";
93
+ const expectedClaims = {
94
+ userId: "sub",
95
+ email: "email",
96
+ tenantId: "organization_id",
97
+ role: "role",
98
+ roles: "roles",
99
+ permissions: "permissions",
100
+ };
101
+ const claimStatus = Object.entries(expectedClaims).map(([name, expected]) => ({
102
+ name,
103
+ expected,
104
+ actual: claims[name as keyof AuthClaimsMapping],
105
+ ok: claims[name as keyof AuthClaimsMapping] === expected,
106
+ }));
107
+ return {
108
+ detected,
109
+ requiredSecretsRegistered: ["WORKOS_API_KEY", "WORKOS_CLIENT_ID", "WORKOS_COOKIE_PASSWORD"].every((name) =>
110
+ secretNames.has(name)
111
+ ),
112
+ webhookSecretRegistered: secretNames.has("WORKOS_WEBHOOK_SECRET"),
113
+ expectedClaims,
114
+ claimStatus,
115
+ };
116
+ }
32
117
 
118
+ function configErrors(config: ReturnType<typeof loadAuthConfigFromEnv>): { code: string; message: string }[] {
119
+ const errors: { code: string; message: string }[] = [];
33
120
  if ((config.mode === "jwt" || config.mode === "oidc") && !config.issuer) {
34
121
  errors.push({
35
122
  code: FORGE_AUTH_INVALID_ISSUER,
@@ -48,6 +135,225 @@ function validateConfig(workspaceRoot: string): AuthCommandResult {
48
135
  message: "FORGE_AUTH_JWKS_URI is required for jwt auth",
49
136
  });
50
137
  }
138
+ return errors;
139
+ }
140
+
141
+ function buildAuthPosture(workspaceRoot: string) {
142
+ const config = loadAuthConfigForCli(workspaceRoot);
143
+ const productionMode = config.mode === "jwt" || config.mode === "oidc";
144
+ const errors = configErrors(config);
145
+ const configReady = errors.length === 0;
146
+ const classification = config.mode === "dev-headers"
147
+ ? "local-dev"
148
+ : config.mode === "disabled"
149
+ ? "unauthenticated"
150
+ : configReady
151
+ ? "production-ready"
152
+ : "production-incomplete";
153
+ const reason = productionMode
154
+ ? configReady
155
+ ? "jwt/oidc production auth configuration is present"
156
+ : "jwt/oidc production auth is selected but required settings are missing"
157
+ : config.mode === "disabled"
158
+ ? "auth is disabled; this is not suitable for public production traffic"
159
+ : "dev-headers auth is local-only and is not real production authentication";
160
+ return normalizeForgeCliCommandsInValue(workspaceRoot, {
161
+ schemaVersion: "0.1.0",
162
+ mode: config.mode,
163
+ classification,
164
+ localOnly: config.mode === "dev-headers",
165
+ productionReady: productionMode && configReady,
166
+ requiresTenant: config.requiresTenant,
167
+ bearerHeader: productionMode ? "Authorization: Bearer <token>" : null,
168
+ tenantClaim: config.claims.tenantId ?? "tenant_id",
169
+ environment: {
170
+ current: classification,
171
+ localDevelopment: config.mode === "dev-headers",
172
+ publicProduction: productionMode && configReady,
173
+ warning: reason,
174
+ },
175
+ localDevHeaders: config.mode === "dev-headers"
176
+ ? {
177
+ acceptedHeaders: [
178
+ "x-forge-user-id",
179
+ "x-forge-tenant-id",
180
+ "x-forge-role",
181
+ "x-forge-roles",
182
+ "x-forge-permissions",
183
+ ],
184
+ scope: "forge dev, tests, and local agent workflows only",
185
+ neverProduction: true,
186
+ }
187
+ : null,
188
+ productionRequirements: {
189
+ requiredMode: "jwt or oidc",
190
+ bearerHeader: "Authorization: Bearer <token>",
191
+ requiredEnv: [
192
+ "FORGE_AUTH_MODE",
193
+ "FORGE_AUTH_ISSUER",
194
+ "FORGE_AUTH_AUDIENCE",
195
+ config.mode === "oidc" ? "OIDC discovery at FORGE_AUTH_ISSUER" : "FORGE_AUTH_JWKS_URI",
196
+ ],
197
+ proofCommand: "forge auth prove --prod --token <jwt> --json",
198
+ },
199
+ productionChecklist: [
200
+ { item: "auth mode is jwt or oidc", ok: productionMode },
201
+ { item: "FORGE_AUTH_ISSUER configured", ok: Boolean(config.issuer) },
202
+ { item: "FORGE_AUTH_AUDIENCE configured", ok: Boolean(config.audience) },
203
+ { item: "FORGE_AUTH_JWKS_URI or OIDC discovery configured", ok: config.mode === "oidc" || Boolean(config.jwksUri) },
204
+ { item: "tenant claim mapped", ok: Boolean(config.claims.tenantId) },
205
+ { item: "permission claim mapped", ok: Boolean(config.claims.permissions) },
206
+ { item: "dev-headers disabled for public runtime", ok: config.mode !== "dev-headers" },
207
+ ],
208
+ reason,
209
+ nextActions: productionMode
210
+ ? configReady
211
+ ? ["forge auth prove --prod --token <jwt> --json", "forge serve --json"]
212
+ : ["forge auth check --json", "configure FORGE_AUTH_ISSUER, FORGE_AUTH_AUDIENCE, and FORGE_AUTH_JWKS_URI or OIDC issuer"]
213
+ : ["set FORGE_AUTH_MODE=jwt or oidc for production", "forge auth prove --prod --token <jwt> --json"],
214
+ });
215
+ }
216
+
217
+ function permissionSubsetForRestrictedTenant(permissions: string[]): string[] {
218
+ const readonly = permissions.filter((permission) =>
219
+ /(^|[:._-])(read|list|view|inspect|search)($|[:._-])/.test(permission)
220
+ );
221
+ if (readonly.length > 0) return readonly;
222
+ return permissions.slice(0, Math.max(1, Math.floor(permissions.length / 2)));
223
+ }
224
+
225
+ function buildMultiTenantProof(workspaceRoot: string, workos: ReturnType<typeof detectWorkOS>, requiresTenant: boolean) {
226
+ const rootSeedPresent = existsSync(join(workspaceRoot, "workos-seed.yml"));
227
+ const generatedSeedPresent = existsSync(join(workspaceRoot, "src/forge/_generated/integrations/workos/workos-seed.yml"));
228
+ const fgaArtifactsPresent =
229
+ existsSync(join(workspaceRoot, "src/forge/_generated/integrations/workos/fga.ts")) ||
230
+ existsSync(join(workspaceRoot, "src/forge/_generated/integrations/workos/resource-map.ts")) ||
231
+ existsSync(join(workspaceRoot, ".workos-fga-state.json"));
232
+ const authMdPresent = existsSync(join(workspaceRoot, "public/auth.md"));
233
+ const metadataPresent = existsSync(join(workspaceRoot, "public/.well-known/oauth-protected-resource"));
234
+ const activePermissions = collectPolicyPermissions(workspaceRoot);
235
+ const expectedResourceTypes = collectExpectedResourceTypes(workspaceRoot);
236
+ const seed = parseSeedFile(workspaceRoot);
237
+ const fgaEnabled = fgaArtifactsPresent || seed.resourceTypes.length > 0;
238
+ const missingSeedPermissions = missingValues(activePermissions, seed.permissions);
239
+ const missingSeedResources = missingValues(expectedResourceTypes, seed.resourceTypes);
240
+ const acmePermissions = activePermissions;
241
+ const globexPermissions = permissionSubsetForRestrictedTenant(activePermissions);
242
+ const permissionVocabularyPresent = workos.detected && workos.claimStatus.some((claim) => claim.name === "permissions" && claim.ok);
243
+ const checks = [
244
+ {
245
+ id: "tenant-claim",
246
+ ok: requiresTenant && workos.claimStatus.some((claim) => claim.name === "tenantId" && claim.ok),
247
+ evidence: "Forge tenant claim maps to WorkOS organization_id and tenant auth is required.",
248
+ },
249
+ {
250
+ id: "permission-claim",
251
+ ok: activePermissions.length > 0 && permissionVocabularyPresent,
252
+ evidence: activePermissions.length > 0
253
+ ? `Forge permissions claim maps to WorkOS permissions: ${activePermissions.join(", ")}.`
254
+ : "No active policy permissions were found in the generated policy registry.",
255
+ },
256
+ {
257
+ id: "seed-organizations",
258
+ ok: rootSeedPresent || generatedSeedPresent,
259
+ evidence: rootSeedPresent
260
+ ? "workos-seed.yml exists at app root."
261
+ : generatedSeedPresent
262
+ ? "generated WorkOS seed exists."
263
+ : "no WorkOS seed file found at app root or in generated integrations.",
264
+ },
265
+ {
266
+ id: "seed-permission-coverage",
267
+ ok: activePermissions.length > 0 && missingSeedPermissions.length === 0,
268
+ evidence: activePermissions.length === 0
269
+ ? "No active policy permissions were found in the generated policy registry."
270
+ : missingSeedPermissions.length === 0
271
+ ? `seed covers active app permission(s): ${activePermissions.join(", ")}`
272
+ : `seed missing active app permission(s): ${missingSeedPermissions.join(", ")}`,
273
+ },
274
+ {
275
+ id: "seed-resource-coverage",
276
+ ok: !fgaEnabled || missingSeedResources.length === 0,
277
+ evidence: !fgaEnabled
278
+ ? "FGA is not enabled; seed resource type coverage is not required for AuthKit/RBAC tenant isolation."
279
+ : missingSeedResources.length === 0
280
+ ? `seed covers expected app resource type(s): ${expectedResourceTypes.join(", ") || "none required"}`
281
+ : `seed missing expected app resource type(s): ${missingSeedResources.join(", ")}`,
282
+ },
283
+ {
284
+ id: "agent-auth-metadata",
285
+ ok: authMdPresent && metadataPresent,
286
+ evidence: "public/auth.md and protected resource metadata are present.",
287
+ },
288
+ ];
289
+ return normalizeForgeCliCommandsInValue(workspaceRoot, {
290
+ scenario: "multi-tenant",
291
+ ok: checks.every((check) => check.ok),
292
+ claims: {
293
+ acme: { organization_id: "org_acme", role: "owner", permissions: acmePermissions },
294
+ globex: { organization_id: "org_globex", role: "member", permissions: globexPermissions },
295
+ },
296
+ appContract: {
297
+ activePermissions,
298
+ expectedResourceTypes,
299
+ fgaEnabled,
300
+ seedPath: seed.path,
301
+ seedPermissions: seed.permissions,
302
+ seedResourceTypes: seed.resourceTypes,
303
+ },
304
+ invariants: [
305
+ "Acme and Globex must use different organization_id claim values.",
306
+ "Tenant-scoped reads must include the active organization_id.",
307
+ "Tenant-scoped writes must verify the resource tenant before mutation.",
308
+ "Role-only UI affordances are not sufficient; policies must use the app's generated permission vocabulary.",
309
+ ],
310
+ checks,
311
+ nextActions: [
312
+ "forge workos doctor --json",
313
+ "forge workos seed --file workos-seed.yml --dry-run --json",
314
+ "forge workos prove --file workos-seed.yml --json",
315
+ "run an HTTP E2E with Acme and Globex tokens before production",
316
+ ],
317
+ });
318
+ }
319
+
320
+ function runProviderProof(options: AuthCommandOptions): WorkOSCommandResult | null {
321
+ if (options.provider !== "workos") return null;
322
+ const file = options.file ?? "workos-seed.yml";
323
+ if (options.real && options.clientId) {
324
+ const env = runWorkOSCommand({
325
+ subcommand: "env",
326
+ workspaceRoot: options.workspaceRoot,
327
+ json: true,
328
+ file,
329
+ yes: false,
330
+ dryRun: false,
331
+ real: true,
332
+ write: true,
333
+ clientId: options.clientId,
334
+ commandRunner: options.commandRunner,
335
+ });
336
+ if (!env.ok) {
337
+ return env;
338
+ }
339
+ }
340
+ return runWorkOSCommand({
341
+ subcommand: "prove",
342
+ workspaceRoot: options.workspaceRoot,
343
+ json: true,
344
+ file,
345
+ yes: false,
346
+ dryRun: !options.real,
347
+ real: options.real ?? false,
348
+ clientId: options.clientId,
349
+ commandRunner: options.commandRunner,
350
+ });
351
+ }
352
+
353
+ function validateConfig(workspaceRoot: string): AuthCommandResult {
354
+ const config = loadAuthConfigForCli(workspaceRoot);
355
+ const errors = configErrors(config);
356
+ const workos = detectWorkOS(workspaceRoot, config.claims);
51
357
 
52
358
  return {
53
359
  ok: errors.length === 0,
@@ -60,6 +366,8 @@ function validateConfig(workspaceRoot: string): AuthCommandResult {
60
366
  algorithms: config.algorithms,
61
367
  claims: config.claims,
62
368
  requiresTenant: config.requiresTenant,
369
+ authPosture: buildAuthPosture(workspaceRoot),
370
+ workos,
63
371
  errors,
64
372
  },
65
373
  error: errors[0],
@@ -68,7 +376,8 @@ function validateConfig(workspaceRoot: string): AuthCommandResult {
68
376
  }
69
377
 
70
378
  function publicConfig(workspaceRoot: string): AuthCommandResult {
71
- const config = loadAuthConfigFromEnv(workspaceRoot);
379
+ const config = loadAuthConfigForCli(workspaceRoot);
380
+ const workos = detectWorkOS(workspaceRoot, config.claims);
72
381
  return {
73
382
  ok: true,
74
383
  mode: config.mode,
@@ -80,13 +389,15 @@ function publicConfig(workspaceRoot: string): AuthCommandResult {
80
389
  algorithms: config.algorithms,
81
390
  claims: config.claims,
82
391
  requiresTenant: config.requiresTenant,
392
+ authPosture: buildAuthPosture(workspaceRoot),
393
+ workos,
83
394
  },
84
395
  exitCode: 0,
85
396
  };
86
397
  }
87
398
 
88
399
  function decodeToken(workspaceRoot: string, token: string | undefined): AuthCommandResult {
89
- const config = loadAuthConfigFromEnv(workspaceRoot);
400
+ const config = loadAuthConfigForCli(workspaceRoot);
90
401
  if (!token) {
91
402
  return {
92
403
  ok: false,
@@ -121,7 +432,7 @@ async function testToken(
121
432
  workspaceRoot: string,
122
433
  token: string | undefined,
123
434
  ): Promise<AuthCommandResult> {
124
- const config = loadAuthConfigFromEnv(workspaceRoot);
435
+ const config = loadAuthConfigForCli(workspaceRoot);
125
436
  if (!token) {
126
437
  return {
127
438
  ok: false,
@@ -160,22 +471,82 @@ async function testToken(
160
471
  export async function runAuthCommand(
161
472
  options: AuthCommandOptions,
162
473
  ): Promise<AuthCommandResult> {
474
+ if (options.subcommand === "status") {
475
+ const posture = buildAuthPosture(options.workspaceRoot);
476
+ return {
477
+ ok: true,
478
+ mode: posture.mode,
479
+ data: posture,
480
+ exitCode: 0,
481
+ };
482
+ }
163
483
  if (options.subcommand === "check") {
164
- return validateConfig(options.workspaceRoot);
484
+ const checked = validateConfig(options.workspaceRoot);
485
+ if (!options.prod) {
486
+ return checked;
487
+ }
488
+ const posture = buildAuthPosture(options.workspaceRoot);
489
+ const productionReady = posture.productionReady === true;
490
+ return {
491
+ ok: checked.ok && productionReady,
492
+ mode: checked.mode,
493
+ data: {
494
+ ...(checked.data && typeof checked.data === "object" ? checked.data as Record<string, unknown> : {}),
495
+ production: true,
496
+ authPosture: posture,
497
+ productionCheck: {
498
+ ok: productionReady,
499
+ reason: posture.reason,
500
+ requiredMode: "jwt or oidc",
501
+ localOnlyModeRejected: posture.localOnly === true,
502
+ },
503
+ },
504
+ error: productionReady
505
+ ? checked.error
506
+ : { code: "FORGE_AUTH_MODE_INVALID", message: "production auth requires FORGE_AUTH_MODE=jwt or oidc; dev-headers is local-only" },
507
+ exitCode: checked.ok && productionReady ? 0 : 1,
508
+ };
165
509
  }
166
510
  if (options.subcommand === "prove") {
511
+ const providerProof = runProviderProof(options);
167
512
  const checked = validateConfig(options.workspaceRoot);
168
- const config = loadAuthConfigFromEnv(options.workspaceRoot);
513
+ const config = loadAuthConfigForCli(options.workspaceRoot);
514
+ const workos = detectWorkOS(options.workspaceRoot, config.claims);
169
515
  const productionMode = config.mode === "jwt" || config.mode === "oidc";
516
+ const workosClaimsOk = workos.claimStatus.every((claim) => claim.ok);
517
+ const posture = buildAuthPosture(options.workspaceRoot);
518
+ const tokenProof = options.token ? await testToken(options.workspaceRoot, options.token) : null;
519
+ const prodError = options.prod && !productionMode
520
+ ? { code: "FORGE_AUTH_MODE_INVALID", message: "forge auth prove --prod requires FORGE_AUTH_MODE=jwt or oidc" }
521
+ : options.prod && !options.token
522
+ ? { code: "FORGE_AUTH_MISSING_TOKEN", message: "forge auth prove --prod requires --token" }
523
+ : options.prod && tokenProof && !tokenProof.ok
524
+ ? tokenProof.error
525
+ : undefined;
526
+ const proofOk = checked.ok &&
527
+ (!options.prod || (productionMode && tokenProof?.ok === true)) &&
528
+ (!providerProof || providerProof.ok);
529
+ const multiTenantProof = options.scenario === "multi-tenant"
530
+ ? buildMultiTenantProof(options.workspaceRoot, workos, config.requiresTenant)
531
+ : null;
532
+ const scenarioOk = !multiTenantProof || multiTenantProof.ok;
170
533
  return {
171
- ok: checked.ok,
534
+ ok: proofOk && scenarioOk,
172
535
  mode: config.mode,
173
536
  data: {
174
537
  schemaVersion: "0.1.0",
175
538
  kind: "auth-proof",
176
- ok: checked.ok,
539
+ ok: proofOk,
177
540
  mode: config.mode,
178
541
  productionReady: productionMode && checked.ok,
542
+ prod: options.prod === true,
543
+ scenario: options.scenario ?? null,
544
+ provider: options.provider ?? null,
545
+ real: options.real === true,
546
+ authPosture: posture,
547
+ ...(tokenProof ? { tokenProof: tokenProof.ok ? tokenProof.data : tokenProof.error } : {}),
548
+ ...(providerProof ? { providerProof } : {}),
549
+ ...(multiTenantProof ? { multiTenantProof } : {}),
179
550
  invariants: [
180
551
  {
181
552
  id: "INV-001",
@@ -191,11 +562,37 @@ export async function runAuthCommand(
191
562
  status: checked.ok ? "passed" : "failed",
192
563
  evidence: checked.data,
193
564
  },
565
+ {
566
+ id: "INV-WORKOS-001",
567
+ name: "WorkOS adapter claim mapping is explicit when WorkOS is present",
568
+ status: !workos.detected ? "not-applicable" : workosClaimsOk ? "passed" : "failed",
569
+ evidence: workos.claimStatus,
570
+ },
571
+ {
572
+ id: "INV-WORKOS-002",
573
+ name: "WorkOS required secret names are registered without values",
574
+ status: !workos.detected ? "not-applicable" : workos.requiredSecretsRegistered ? "passed" : "failed",
575
+ evidence: {
576
+ required: ["WORKOS_API_KEY", "WORKOS_CLIENT_ID", "WORKOS_COOKIE_PASSWORD"],
577
+ webhookSecretRegistered: workos.webhookSecretRegistered,
578
+ },
579
+ },
580
+ ],
581
+ workos,
582
+ nextActions: [
583
+ ...(providerProof && !providerProof.ok
584
+ ? providerProof.data && typeof providerProof.data === "object" && "nextCommand" in providerProof.data
585
+ ? [String((providerProof.data as { nextCommand?: unknown }).nextCommand)]
586
+ : ["forge workos prove --real --file workos-seed.yml --json"]
587
+ : []),
588
+ ...(options.provider === "workos" && providerProof?.ok
589
+ ? ["forge auth prove --scenario multi-tenant --json", "forge deploy readiness --production --json"]
590
+ : []),
194
591
  ],
195
592
  checkedAt: "deterministic",
196
593
  },
197
- error: checked.error,
198
- exitCode: checked.exitCode,
594
+ error: prodError ?? (!providerProof || providerProof.ok ? checked.error : { code: "FORGE_AUTH_PROVIDER_PROOF_FAILED", message: "WorkOS provider proof failed" }),
595
+ exitCode: proofOk && scenarioOk ? 0 : 1,
199
596
  };
200
597
  }
201
598
  if (options.subcommand === "config") {
@@ -208,7 +605,7 @@ export async function runAuthCommand(
208
605
  return testToken(options.workspaceRoot, options.token);
209
606
  }
210
607
 
211
- const config = loadAuthConfigFromEnv(options.workspaceRoot);
608
+ const config = loadAuthConfigForCli(options.workspaceRoot);
212
609
  return {
213
610
  ok: true,
214
611
  mode: config.mode,
@@ -225,7 +622,54 @@ export function formatAuthJson(result: AuthCommandResult): string {
225
622
  return `${JSON.stringify(result, null, 2)}\n`;
226
623
  }
227
624
 
625
+ function authPostureFromResult(result: AuthCommandResult): Record<string, unknown> | null {
626
+ const data = result.data && typeof result.data === "object" ? result.data as Record<string, unknown> : {};
627
+ const direct = data.schemaVersion === "0.1.0" && "classification" in data ? data : null;
628
+ const nested = data.authPosture && typeof data.authPosture === "object"
629
+ ? data.authPosture as Record<string, unknown>
630
+ : null;
631
+ return direct ?? nested;
632
+ }
633
+
228
634
  export function formatAuthHuman(result: AuthCommandResult): string {
635
+ const posture = authPostureFromResult(result);
636
+ if (posture) {
637
+ const data = result.data && typeof result.data === "object" ? result.data as Record<string, unknown> : {};
638
+ const classification = typeof posture.classification === "string" ? posture.classification : result.mode;
639
+ const reason = typeof posture.reason === "string" ? posture.reason : result.error?.message;
640
+ const postureNextActions = Array.isArray(posture.nextActions) ? posture.nextActions.filter((item): item is string => typeof item === "string") : [];
641
+ const proofNextActions = Array.isArray(data.nextActions) ? data.nextActions.filter((item): item is string => typeof item === "string") : [];
642
+ const nextActions = Array.from(new Set([...proofNextActions, ...postureNextActions]));
643
+ const lines = [
644
+ `Auth ${result.mode}: ${result.ok ? "ok" : "failed"} (${classification})`,
645
+ `Production ready: ${posture.productionReady === true ? "yes" : "no"}`,
646
+ ...(reason ? [`Reason: ${reason}`] : []),
647
+ ];
648
+ const localDevHeaders = posture.localDevHeaders && typeof posture.localDevHeaders === "object"
649
+ ? posture.localDevHeaders as Record<string, unknown>
650
+ : null;
651
+ const acceptedHeaders = Array.isArray(localDevHeaders?.acceptedHeaders)
652
+ ? localDevHeaders.acceptedHeaders.filter((item): item is string => typeof item === "string")
653
+ : posture.localOnly === true || result.mode === "dev-headers"
654
+ ? [
655
+ "x-forge-user-id",
656
+ "x-forge-tenant-id",
657
+ "x-forge-role",
658
+ "x-forge-roles",
659
+ "x-forge-permissions",
660
+ ]
661
+ : [];
662
+ if (acceptedHeaders.length > 0) {
663
+ lines.push("Local dev headers:", ...acceptedHeaders.map((header) => ` ${header}`));
664
+ }
665
+ if (!result.ok && result.error) {
666
+ lines.push(`${result.error.code}: ${result.error.message}`);
667
+ }
668
+ if (nextActions.length > 0) {
669
+ lines.push("", "Next:", ...nextActions.map((action) => ` ${action}`));
670
+ }
671
+ return `${lines.join("\n")}\n`;
672
+ }
229
673
  if (!result.ok) {
230
674
  return `Auth ${result.mode}: failed\n${result.error?.code}: ${result.error?.message}\n`;
231
675
  }