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
@@ -34,8 +34,9 @@ export function buildMakeRegistry(generatorVersion: string): MakeRegistryArtifac
34
34
  "forge make list --json",
35
35
  "forge make explain <primitive> --json",
36
36
  "forge make ui --framework vite --dry-run --json",
37
+ "forge make ui --framework nuxt --dry-run --json",
37
38
  "forge make ai-chat support --dry-run --json",
38
- "forge make resource <name> --fields title:text,status:enum(open,closed) --dry-run --json",
39
+ "forge make resource <name> --fields title:text,status:enum=open+closed --dry-run --json",
39
40
  "forge make resource <name> --fields title:text --with-ui --yes",
40
41
  "forge make apply <planId>",
41
42
  "forge make rollback <planId>",
@@ -113,16 +114,14 @@ export function buildMakeRegistry(generatorVersion: string): MakeRegistryArtifac
113
114
  },
114
115
  {
115
116
  name: "ui",
116
- summary: "Add a Vite React frontend shell with ForgeProvider devAuth and a generated client bridge.",
117
+ summary: "Add a Vite React or Nuxt Vue frontend shell with generated Forge client bindings.",
117
118
  creates: [
118
119
  "web/package.json",
119
- "web/index.html",
120
- "web/src/lib/forge.ts",
121
- "web/src/main.tsx",
122
- "web/src/App.tsx",
120
+ "web/src/lib/forge.ts or web/composables/forge.ts",
121
+ "web/src/main.tsx or web/app.vue",
123
122
  ],
124
123
  modifies: [],
125
- examples: ["forge make ui --framework vite --yes"],
124
+ examples: ["forge make ui --framework vite --yes", "forge make ui --framework nuxt --yes"],
126
125
  },
127
126
  {
128
127
  name: "ai-chat",
@@ -147,7 +146,7 @@ export function buildMakeRegistry(generatorVersion: string): MakeRegistryArtifac
147
146
  "tests/make-generated/*",
148
147
  ],
149
148
  modifies: ["src/forge/schema.ts", "src/policies.ts"],
150
- examples: ["forge make resource invoices --fields amount:number,status:enum(draft,paid) --with-ui --yes"],
149
+ examples: ["forge make resource invoices --fields amount:number,status:enum=draft+paid --with-ui --yes"],
151
150
  },
152
151
  ],
153
152
  };
@@ -166,7 +165,7 @@ export function buildMakeTemplates(): MakeTemplateArtifact {
166
165
  { name: "workflow", sourceKind: "runtime", outputPattern: "src/workflows/<name>.ts" },
167
166
  { name: "component", sourceKind: "frontend", outputPattern: "web/components/<name>.tsx" },
168
167
  { name: "page", sourceKind: "frontend", outputPattern: "web/app/<route>/page.tsx" },
169
- { name: "ui", sourceKind: "frontend", outputPattern: "web/src/App.tsx" },
168
+ { name: "ui", sourceKind: "frontend", outputPattern: "web/src/App.tsx or web/app.vue" },
170
169
  { name: "ai-chat", sourceKind: "frontend", outputPattern: "web/components/<name>AiChat.tsx" },
171
170
  { name: "placeholder-test", sourceKind: "test", outputPattern: "tests/make-generated/<name>.test.ts" },
172
171
  ],
@@ -8,6 +8,7 @@ import type { GenerateResult } from "../types/cli.ts";
8
8
  import type { Diagnostic } from "../types/diagnostic.ts";
9
9
  import { discover } from "./discover.ts";
10
10
  import { loadManifest } from "./manifest.ts";
11
+ import { ORCHESTRATOR_MANIFEST_VERSION } from "./types.ts";
11
12
 
12
13
  export type FastGenerateCheckResult =
13
14
  | {
@@ -55,6 +56,9 @@ export function runFastGenerateCheck(workspaceRootInput: string): FastGenerateCh
55
56
  const manifest = loadManifest(cacheDir);
56
57
  const trackedFiles = Object.keys(manifest.fileHashes).sort();
57
58
 
59
+ if (manifest.schemaVersion !== ORCHESTRATOR_MANIFEST_VERSION) {
60
+ return { kind: "miss", reason: "manifest schema version changed" };
61
+ }
58
62
  if (!manifest.inputFingerprint || trackedFiles.length === 0) {
59
63
  return { kind: "miss", reason: "manifest missing input fingerprint or file hashes" };
60
64
  }
@@ -37,12 +37,22 @@ function sleep(ms: number): Promise<void> {
37
37
  return new Promise((resolve) => setTimeout(resolve, ms));
38
38
  }
39
39
 
40
- function lockTimeoutDiagnostic(lockPath: string, timeoutMs: number): Diagnostic {
40
+ function lockTimeoutDiagnostic(lockPath: string, timeoutMs: number, ownerPid: number | null): Diagnostic {
41
+ const owner = ownerPid === null ? "unknown owner" : `owner pid ${ownerPid}`;
41
42
  return createDiagnostic({
42
43
  severity: "error",
43
44
  code: "FORGE_GENERATE_LOCKED",
44
- message: `forge generate is already running or a stale generate lock exists at ${lockPath} after ${timeoutMs}ms`,
45
+ message:
46
+ `forge generate is already running (${owner}) or a stale generate lock exists at ${lockPath} after ${timeoutMs}ms. ` +
47
+ "Avoid running forge generate, forge dev --once, and forge verify concurrently in the same workspace.",
45
48
  file: lockPath,
49
+ fixHint:
50
+ "Wait for the active Forge command to finish. If the owner pid is gone, remove .forge/locks/generate.lock and retry.",
51
+ suggestedCommands: [
52
+ "forge status --json",
53
+ "forge generate --check --json",
54
+ "forge dev --once --json",
55
+ ],
46
56
  });
47
57
  }
48
58
 
@@ -125,9 +135,10 @@ export async function acquireGenerateLock(
125
135
  }
126
136
 
127
137
  if (Date.now() - startedAt >= timeoutMs) {
138
+ const ownerPid = readLockOwnerPid(lockPath);
128
139
  return {
129
140
  ok: false,
130
- diagnostic: lockTimeoutDiagnostic(lockPath, timeoutMs),
141
+ diagnostic: lockTimeoutDiagnostic(lockPath, timeoutMs, ownerPid),
131
142
  failureKind: GENERATE_LOCK_FAILURE_KIND,
132
143
  };
133
144
  }
@@ -83,7 +83,7 @@ export function updateManifestAfterWrite(
83
83
  ): OrchestratorManifest {
84
84
  return {
85
85
  ...manifest,
86
- fileHashes: { ...manifest.fileHashes, ...fileHashes },
86
+ fileHashes,
87
87
  priorAppGraph,
88
88
  inputFingerprint,
89
89
  ...(sourceFileIndex !== undefined ? { sourceFileIndex } : {}),
@@ -0,0 +1,23 @@
1
+ import type { EmitPlan } from "../types/emit.ts";
2
+
3
+ export interface PlanPhaseTimings {
4
+ coreArtifactsMs: number;
5
+ agentArtifactsMs: number;
6
+ supportArtifactsMs: number;
7
+ fileRenderMs: number;
8
+ finalizeMs: number;
9
+ totalMs: number;
10
+ }
11
+
12
+ const planProfiles = new WeakMap<EmitPlan, PlanPhaseTimings>();
13
+
14
+ export function recordPlanProfile(
15
+ plan: EmitPlan,
16
+ timings: PlanPhaseTimings,
17
+ ): void {
18
+ planProfiles.set(plan, timings);
19
+ }
20
+
21
+ export function getPlanProfile(plan: EmitPlan): PlanPhaseTimings | undefined {
22
+ return planProfiles.get(plan);
23
+ }
@@ -27,9 +27,15 @@ import {
27
27
  buildSubscriptionManifest,
28
28
  } from "../live-query-registry/build.ts";
29
29
  import { buildApiSurface } from "../api-surface/build.ts";
30
+ import {
31
+ buildExternalServiceGraph,
32
+ serializeExternalServiceGraphJson,
33
+ serializeExternalServiceGraphTs,
34
+ } from "../external-manifest/registry.ts";
30
35
  import {
31
36
  buildClientManifest,
32
37
  buildReactManifest,
38
+ buildVueManifest,
33
39
  } from "../client-sdk/build-manifest.ts";
34
40
  import {
35
41
  buildFrontendGraph,
@@ -43,6 +49,9 @@ import {
43
49
  renderReactDts,
44
50
  renderReactManifestTs,
45
51
  renderReactTs,
52
+ renderVueDts,
53
+ renderVueManifestTs,
54
+ renderVueTs,
46
55
  } from "../client-sdk/render-client.ts";
47
56
  import { buildSqlPlan } from "../data-graph/sql/ddl.ts";
48
57
  import { buildRlsArtifacts } from "../data-graph/rls/build.ts";
@@ -85,6 +94,8 @@ import { detectCapabilities } from "../classifier/capabilities.ts";
85
94
  import { detectSecrets } from "../classifier/secrets.ts";
86
95
  import { resolveByPackageName } from "../recipes/registry.ts";
87
96
  import { RECIPE_SCHEMA_VERSION } from "../recipes/definitions.ts";
97
+ import type { IntegrationRecipe } from "../types/integration.ts";
98
+ import type { RuntimeContext } from "../types/runtime.ts";
88
99
  import {
89
100
  FORGE_LOCK_SCHEMA_VERSION,
90
101
  GENERATED_DIR,
@@ -95,9 +106,16 @@ import { hashStable } from "../primitives/hash.ts";
95
106
  import { stableSortEmitFiles } from "../primitives/sort.ts";
96
107
  import { detectOrphanedGeneratedFiles } from "./orphans.ts";
97
108
  import type { DiscoverContext } from "./types.ts";
109
+ import {
110
+ createRenderContext,
111
+ parseAdapterContext,
112
+ renderAdapterModule,
113
+ renderIntegrationDoc,
114
+ renderIntegrationModule,
115
+ renderTestkitModule,
116
+ } from "../integration/render.ts";
98
117
  import {
99
118
  serializeAppGraphJson,
100
- serializeAppGraphTs,
101
119
  serializeDataGraphJson,
102
120
  serializeDataGraphTs,
103
121
  serializeImportGuardsJson,
@@ -110,6 +128,7 @@ import {
110
128
  serializeRuntimeGraphTs,
111
129
  serializeRuntimeMatrixJson,
112
130
  serializeRuntimeMatrixTs,
131
+ serializeConstFromJson,
113
132
  serializeRuntimeRegistryTs,
114
133
  serializeDevManifestJson,
115
134
  serializeDevManifestTs,
@@ -201,10 +220,12 @@ import {
201
220
  serializeClientApiTsExport,
202
221
  serializeClientManifestJson,
203
222
  serializeReactManifestJson,
223
+ serializeVueManifestJson,
204
224
  buildMockMapEntries,
205
225
  } from "./serialize.ts";
206
- import { buildDefaultAuthRegistry, AUTH_ENV } from "../../runtime/auth/config.ts";
226
+ import { buildDefaultAuthRegistry, buildWorkOSAuthRegistry, AUTH_ENV } from "../../runtime/auth/config.ts";
207
227
  import type { EnvSchema } from "../types/secret-registry.ts";
228
+ import { recordPlanProfile } from "./plan-profile.ts";
208
229
 
209
230
  export interface PlanInput {
210
231
  appGraph: AppGraph;
@@ -222,6 +243,156 @@ function makeEmitFile(path: string, content: string): EmitFile {
222
243
  };
223
244
  }
224
245
 
246
+ function primaryPackageName(recipe: IntegrationRecipe): string {
247
+ return recipe.packages[0]?.packageName ?? recipe.alias;
248
+ }
249
+
250
+ function packageNamesForRecipe(recipe: IntegrationRecipe): string[] {
251
+ return recipe.packages.map((pkg) => pkg.packageName);
252
+ }
253
+
254
+ function compatibleContextsForRecipe(pkg: ClassifiedPackage): RuntimeContext[] {
255
+ const recipe = pkg.recipe ?? resolveByPackageName(pkg.api.name);
256
+ if (!recipe) {
257
+ return [...pkg.classification.compatible];
258
+ }
259
+
260
+ const contexts = new Set<RuntimeContext>(recipe.contexts.allowed);
261
+ for (const recipePackage of recipe.packages) {
262
+ for (const ctx of recipePackage.contexts?.allowed ?? []) {
263
+ contexts.add(ctx);
264
+ }
265
+ }
266
+ for (const ctx of pkg.classification.compatible) {
267
+ contexts.add(ctx);
268
+ }
269
+ return [...contexts];
270
+ }
271
+
272
+ function shouldEmitAdapter(
273
+ adapterFilename: string,
274
+ compatible: RuntimeContext[],
275
+ ): boolean {
276
+ const context = parseAdapterContext(adapterFilename);
277
+ return context === null || compatible.includes(context);
278
+ }
279
+
280
+ function buildRecipeGeneratedFiles(pkg: ClassifiedPackage): string[] {
281
+ const recipe = pkg.recipe ?? resolveByPackageName(pkg.api.name);
282
+ if (!recipe) {
283
+ return [];
284
+ }
285
+
286
+ const compatible = compatibleContextsForRecipe(pkg);
287
+ const paths: string[] = [];
288
+
289
+ for (const adapter of recipe.adapters) {
290
+ if (shouldEmitAdapter(adapter, compatible)) {
291
+ paths.push(`${GENERATED_DIR}/packages/${adapter}`);
292
+ }
293
+ }
294
+ for (const integration of recipe.integrations ?? []) {
295
+ paths.push(`${GENERATED_DIR}/integrations/${integration}`);
296
+ }
297
+ for (const testkit of recipe.testkits) {
298
+ paths.push(`${GENERATED_DIR}/testkits/${testkit}`);
299
+ }
300
+ for (const doc of recipe.docs) {
301
+ paths.push(`${GENERATED_DIR}/docs/${doc}`);
302
+ }
303
+
304
+ paths.push(
305
+ `${GENERATED_DIR}/runtimeMatrix.ts`,
306
+ `${GENERATED_DIR}/runtimeMatrix.json`,
307
+ `${GENERATED_DIR}/importGuards.ts`,
308
+ `${GENERATED_DIR}/importGuards.json`,
309
+ );
310
+
311
+ return paths.sort();
312
+ }
313
+
314
+ function buildIntegrationArtifactFiles(pkg: ClassifiedPackage): EmitFile[] {
315
+ const recipe = pkg.recipe ?? resolveByPackageName(pkg.api.name);
316
+ if (!recipe) {
317
+ return [];
318
+ }
319
+
320
+ const compatible = compatibleContextsForRecipe(pkg);
321
+ const incompatible = [...pkg.classification.incompatible];
322
+ const secrets = detectSecrets(pkg.api, recipe);
323
+ const packageNames = packageNamesForRecipe(recipe);
324
+ const packageName = primaryPackageName(recipe);
325
+ const templateCtx = createRenderContext({
326
+ alias: recipe.alias,
327
+ recipe,
328
+ context: "server",
329
+ packageName,
330
+ packageNames,
331
+ secrets,
332
+ compatible,
333
+ incompatible,
334
+ });
335
+ const files: EmitFile[] = [];
336
+
337
+ for (const adapter of recipe.adapters) {
338
+ if (!shouldEmitAdapter(adapter, compatible)) {
339
+ continue;
340
+ }
341
+ const context = parseAdapterContext(adapter) ?? "server";
342
+ files.push(
343
+ makeEmitFile(
344
+ `${GENERATED_DIR}/packages/${adapter}`,
345
+ renderAdapterModule({
346
+ alias: recipe.alias,
347
+ recipe,
348
+ context,
349
+ packageName,
350
+ packageNames,
351
+ secrets,
352
+ compatible,
353
+ incompatible,
354
+ }),
355
+ ),
356
+ );
357
+ }
358
+
359
+ for (const integration of recipe.integrations ?? []) {
360
+ files.push(
361
+ makeEmitFile(
362
+ `${GENERATED_DIR}/integrations/${integration}`,
363
+ renderIntegrationModule(integration, templateCtx),
364
+ ),
365
+ );
366
+ }
367
+
368
+ for (const testkit of recipe.testkits) {
369
+ files.push(
370
+ makeEmitFile(
371
+ `${GENERATED_DIR}/testkits/${testkit}`,
372
+ renderTestkitModule(recipe.alias, packageName, templateCtx),
373
+ ),
374
+ );
375
+ }
376
+
377
+ for (const doc of recipe.docs) {
378
+ files.push(
379
+ makeEmitFile(
380
+ `${GENERATED_DIR}/docs/${doc}`,
381
+ renderIntegrationDoc({
382
+ alias: recipe.alias,
383
+ recipe,
384
+ packageNames,
385
+ secrets,
386
+ compatible,
387
+ incompatible,
388
+ }),
389
+ ),
390
+ );
391
+ }
392
+
393
+ return files;
394
+ }
395
+
225
396
  function buildLockEntry(pkg: ClassifiedPackage): ForgeLockEntry {
226
397
  const recipe = pkg.recipe ?? resolveByPackageName(pkg.api.name);
227
398
  const secrets = detectSecrets(pkg.api, recipe ?? undefined);
@@ -239,7 +410,7 @@ function buildLockEntry(pkg: ClassifiedPackage): ForgeLockEntry {
239
410
  secrets,
240
411
  },
241
412
  secrets,
242
- generatedFiles: [],
413
+ generatedFiles: buildRecipeGeneratedFiles(pkg),
243
414
  contentChecksum: pkg.api.contentChecksum,
244
415
  };
245
416
  }
@@ -291,7 +462,15 @@ function augmentEnvSchemaWithAuthVars(schema: EnvSchema): EnvSchema {
291
462
  };
292
463
  }
293
464
 
465
+ function hasWorkOSAuth(classified: PlanInput["classified"]): boolean {
466
+ return classified.some((item) =>
467
+ item.recipe?.alias === "workos" || item.api.name === "@workos-inc/node"
468
+ );
469
+ }
470
+
294
471
  export function plan(input: PlanInput): EmitPlan {
472
+ const started = performance.now();
473
+ let checkpoint = started;
295
474
  const matrix = buildRuntimeMatrix(input.classified);
296
475
  const dataGraph = buildDataGraph(input.appGraph);
297
476
  const sqlPlan = buildSqlPlan(dataGraph);
@@ -300,7 +479,8 @@ export function plan(input: PlanInput): EmitPlan {
300
479
  const workflowSubscriptions = buildWorkflowSubscriptions(workflowRegistry);
301
480
  const telemetryRegistry = buildTelemetryRegistry(input.appGraph);
302
481
  const telemetrySinks = buildTelemetrySinks(input.classified);
303
- const policyRegistry = buildPolicyRegistry(input.appGraph);
482
+ const externalServices = buildExternalServiceGraph(input.ctx.workspaceRoot);
483
+ const policyRegistry = buildPolicyRegistry(input.appGraph, externalServices);
304
484
  const permissionMatrix = buildPermissionMatrixFromRegistry(policyRegistry);
305
485
  const tenantScope = buildTenantScope(dataGraph);
306
486
  const secretRegistry = buildSecretRegistry(input.classified);
@@ -311,7 +491,9 @@ export function plan(input: PlanInput): EmitPlan {
311
491
  ),
312
492
  );
313
493
  const configRegistry = buildConfigRegistry(secretRegistry);
314
- const authRegistry = buildDefaultAuthRegistry(tenantScope.tables.length > 0);
494
+ const authRegistry = hasWorkOSAuth(input.classified)
495
+ ? buildWorkOSAuthRegistry(tenantScope.tables.length > 0)
496
+ : buildDefaultAuthRegistry(tenantScope.tables.length > 0);
315
497
  const aiRegistry = buildAiRegistry(input.appGraph, input.classified);
316
498
  const aiModels = buildAiModels();
317
499
  const queryRegistry = buildQueryRegistry(input.appGraph);
@@ -323,15 +505,20 @@ export function plan(input: PlanInput): EmitPlan {
323
505
  queryRegistry,
324
506
  liveQueryRegistry,
325
507
  workflowRegistry,
508
+ externalServices,
326
509
  );
327
510
  const clientManifest = buildClientManifest(apiSurface, input.classified);
328
511
  const reactManifest = buildReactManifest(clientManifest);
512
+ const vueManifest = buildVueManifest(clientManifest);
329
513
  const frontendGraph = buildFrontendGraph({
330
514
  workspaceRoot: input.ctx.workspaceRoot,
331
515
  clientManifest,
332
516
  });
333
517
  const devManifest = buildDevManifest(runtimeGraph, queryRegistry, input.appGraph);
334
518
  const mockMapEntries = buildMockMapEntries(input.classified);
519
+ const coreArtifactsMs = performance.now() - checkpoint;
520
+ checkpoint = performance.now();
521
+
335
522
  const agentArtifacts = buildAgentContractArtifacts({
336
523
  workspaceRoot: input.ctx.workspaceRoot,
337
524
  appGraph: input.appGraph,
@@ -352,8 +539,12 @@ export function plan(input: PlanInput): EmitPlan {
352
539
  apiSurface,
353
540
  clientManifest,
354
541
  frontendGraph,
542
+ externalServices,
355
543
  });
356
544
  const agentAdapterManifest = buildAgentAdapterManifest(agentArtifacts.contract);
545
+ const agentArtifactsMs = performance.now() - checkpoint;
546
+ checkpoint = performance.now();
547
+
357
548
  const rlsArtifacts = buildRlsArtifacts(sqlPlan, tenantScope);
358
549
  const packageUpgradeRegistry = {
359
550
  schemaVersion: "0.1.0" as const,
@@ -387,8 +578,17 @@ export function plan(input: PlanInput): EmitPlan {
387
578
  const uiArtifacts = buildUiGeneratedArtifacts({
388
579
  appGraph: input.appGraph,
389
580
  apiSurface,
581
+ frontendGraph,
390
582
  sources: input.ctx.sources,
583
+ workspaceRoot: input.ctx.workspaceRoot,
391
584
  });
585
+ const integrationArtifactFiles = input.classified.flatMap(buildIntegrationArtifactFiles);
586
+ const supportArtifactsMs = performance.now() - checkpoint;
587
+ checkpoint = performance.now();
588
+
589
+ const appGraphJson = serializeAppGraphJson(input.appGraph);
590
+ const packageGraphJson = serializePackageGraphJson(input.packageGraph);
591
+ const runtimeMatrixJson = serializeRuntimeMatrixJson(matrix);
392
592
 
393
593
  const files: EmitFile[] = [
394
594
  makeEmitFile("AGENTS.md", agentArtifacts.agentsMd),
@@ -400,6 +600,14 @@ export function plan(input: PlanInput): EmitPlan {
400
600
  `${GENERATED_DIR}/agentContract.json`,
401
601
  serializeAgentContractJson(agentArtifacts.contract),
402
602
  ),
603
+ makeEmitFile(
604
+ `${GENERATED_DIR}/externalServices.ts`,
605
+ serializeExternalServiceGraphTs(externalServices),
606
+ ),
607
+ makeEmitFile(
608
+ `${GENERATED_DIR}/externalServices.json`,
609
+ serializeExternalServiceGraphJson(externalServices),
610
+ ),
403
611
  makeEmitFile(`${GENERATED_DIR}/appMap.md`, agentArtifacts.appMapMd),
404
612
  makeEmitFile(
405
613
  `${GENERATED_DIR}/agentTools.ts`,
@@ -428,6 +636,10 @@ export function plan(input: PlanInput): EmitPlan {
428
636
  `${GENERATED_DIR}/agentQuickstart.md`,
429
637
  agentArtifacts.agentQuickstartMd,
430
638
  ),
639
+ makeEmitFile(
640
+ `${GENERATED_DIR}/agentCairGuide.md`,
641
+ agentArtifacts.agentCairGuideMd,
642
+ ),
431
643
  makeEmitFile(
432
644
  `${GENERATED_DIR}/agentAdapterManifest.ts`,
433
645
  serializeAgentAdapterManifestTs(agentAdapterManifest),
@@ -446,11 +658,11 @@ export function plan(input: PlanInput): EmitPlan {
446
658
  ),
447
659
  makeEmitFile(
448
660
  `${GENERATED_DIR}/appGraph.ts`,
449
- serializeAppGraphTs(input.appGraph),
661
+ serializeConstFromJson("appGraph", appGraphJson),
450
662
  ),
451
663
  makeEmitFile(
452
664
  `${GENERATED_DIR}/appGraph.json`,
453
- serializeAppGraphJson(input.appGraph),
665
+ appGraphJson,
454
666
  ),
455
667
  makeEmitFile(
456
668
  `${GENERATED_DIR}/packageGraph.ts`,
@@ -458,7 +670,7 @@ export function plan(input: PlanInput): EmitPlan {
458
670
  ),
459
671
  makeEmitFile(
460
672
  `${GENERATED_DIR}/packageGraph.json`,
461
- serializePackageGraphJson(input.packageGraph),
673
+ packageGraphJson,
462
674
  ),
463
675
  makeEmitFile(
464
676
  `${GENERATED_DIR}/runtimeMatrix.ts`,
@@ -466,7 +678,7 @@ export function plan(input: PlanInput): EmitPlan {
466
678
  ),
467
679
  makeEmitFile(
468
680
  `${GENERATED_DIR}/runtimeMatrix.json`,
469
- serializeRuntimeMatrixJson(matrix),
681
+ runtimeMatrixJson,
470
682
  ),
471
683
  makeEmitFile(
472
684
  `${GENERATED_DIR}/importGuards.ts`,
@@ -476,6 +688,7 @@ export function plan(input: PlanInput): EmitPlan {
476
688
  `${GENERATED_DIR}/importGuards.json`,
477
689
  serializeImportGuardsJson(matrix, input.appGraph.moduleGraph),
478
690
  ),
691
+ ...integrationArtifactFiles,
479
692
  makeEmitFile(
480
693
  `${GENERATED_DIR}/dataGraph.ts`,
481
694
  serializeDataGraphTs(dataGraph),
@@ -855,7 +1068,16 @@ export function plan(input: PlanInput): EmitPlan {
855
1068
  `${GENERATED_DIR}/reactManifest.json`,
856
1069
  serializeReactManifestJson(reactManifest),
857
1070
  ),
1071
+ makeEmitFile(`${GENERATED_DIR}/vue.ts`, renderVueTs()),
1072
+ makeEmitFile(`${GENERATED_DIR}/vue.d.ts`, renderVueDts()),
1073
+ makeEmitFile(`${GENERATED_DIR}/vueManifest.ts`, renderVueManifestTs(vueManifest)),
1074
+ makeEmitFile(
1075
+ `${GENERATED_DIR}/vueManifest.json`,
1076
+ serializeVueManifestJson(vueManifest),
1077
+ ),
858
1078
  ];
1079
+ const fileRenderMs = performance.now() - checkpoint;
1080
+ checkpoint = performance.now();
859
1081
 
860
1082
  const sortedFiles = stableSortEmitFiles(files);
861
1083
  const plannedPathSet = new Set(sortedFiles.map((file) => file.path));
@@ -866,12 +1088,20 @@ export function plan(input: PlanInput): EmitPlan {
866
1088
  );
867
1089
 
868
1090
  const lock = buildForgeLock(input);
1091
+ const finalizeMs = performance.now() - checkpoint;
869
1092
 
870
- return {
1093
+ const result = {
871
1094
  files: sortedFiles,
872
1095
  orphanedFiles,
873
1096
  lock,
874
1097
  diagnostics: [
1098
+ ...dataGraph.diagnostics,
1099
+ ...sqlPlan.diagnostics,
1100
+ ...runtimeGraph.diagnostics,
1101
+ ...queryRegistry.diagnostics,
1102
+ ...liveQueryRegistry.diagnostics,
1103
+ ...policyRegistry.diagnostics,
1104
+ ...tenantScope.diagnostics,
875
1105
  ...agentArtifacts.diagnostics,
876
1106
  ...rlsArtifacts.diagnostics,
877
1107
  ...frontendGraph.diagnostics.map((diagnostic) =>
@@ -884,4 +1114,13 @@ export function plan(input: PlanInput): EmitPlan {
884
1114
  ),
885
1115
  ],
886
1116
  };
1117
+ recordPlanProfile(result, {
1118
+ coreArtifactsMs,
1119
+ agentArtifactsMs,
1120
+ supportArtifactsMs,
1121
+ fileRenderMs,
1122
+ finalizeMs,
1123
+ totalMs: performance.now() - started,
1124
+ });
1125
+ return result;
887
1126
  }
@@ -1,15 +1,37 @@
1
+ import type { AppGraphPhaseTimings } from "../app-graph/profile.ts";
2
+ import type { SignalProfile } from "../classifier/signals.ts";
3
+ import type { PlanPhaseTimings } from "./plan-profile.ts";
4
+
1
5
  export interface CompilePhaseTimings {
6
+ fastCheckMs: number;
7
+ sessionMs: number;
2
8
  discoverMs: number;
9
+ graphBuildMs: number;
3
10
  appGraphMs: number;
11
+ appGraph?: AppGraphPhaseTimings;
4
12
  packageGraphMs: number;
13
+ classifyMs: number;
14
+ classifierSignals?: SignalProfile;
5
15
  planMs: number;
16
+ planDetail?: PlanPhaseTimings;
17
+ runtimeMatrixMs: number;
18
+ importGuardsMs: number;
19
+ qualityGateMs: number;
6
20
  emitMs: number;
21
+ postEmitMs: number;
22
+ unaccountedMs: number;
7
23
  totalMs: number;
8
24
  }
9
25
 
10
26
  let lastTimings: CompilePhaseTimings | null = null;
11
27
 
12
28
  export function isCompileProfileEnabled(): boolean {
29
+ return process.env.FORGE_PROFILE === "1" ||
30
+ process.env.FORGE_PROFILE === "true" ||
31
+ process.env.FORGE_PROFILE === "silent";
32
+ }
33
+
34
+ export function shouldPrintCompileProfile(): boolean {
13
35
  return process.env.FORGE_PROFILE === "1" || process.env.FORGE_PROFILE === "true";
14
36
  }
15
37
 
@@ -26,11 +48,54 @@ export function getCompileTimings(): CompilePhaseTimings | null {
26
48
  export function formatCompileTimings(timings: CompilePhaseTimings): string {
27
49
  return [
28
50
  "forge compile profile:",
51
+ ` fast-check: ${timings.fastCheckMs}ms`,
52
+ ` session: ${timings.sessionMs}ms`,
29
53
  ` discover: ${timings.discoverMs}ms`,
54
+ ` graph-build: ${timings.graphBuildMs}ms`,
30
55
  ` app-graph: ${timings.appGraphMs}ms`,
56
+ ...(timings.appGraph
57
+ ? [
58
+ ` normalize: ${timings.appGraph.normalizeMs}ms`,
59
+ ` parse: ${timings.appGraph.parseMs}ms`,
60
+ ` symbols: ${timings.appGraph.symbolsMs}ms`,
61
+ ` duplicates: ${timings.appGraph.duplicatesMs}ms`,
62
+ ` module-graph: ${timings.appGraph.moduleGraphMs}ms`,
63
+ ` input-hash: ${timings.appGraph.inputHashMs}ms`,
64
+ ]
65
+ : []),
31
66
  ` package-graph: ${timings.packageGraphMs}ms`,
67
+ ` classify: ${timings.classifyMs}ms`,
68
+ ...(timings.classifierSignals
69
+ ? [
70
+ ` gatherSignals: ${timings.classifierSignals.totalMs}ms`,
71
+ ` gatherSignals calls: ${timings.classifierSignals.calls}`,
72
+ ` gatherSignals exports scanned: ${timings.classifierSignals.exports}`,
73
+ ` gatherSignals corpus bytes: ${timings.classifierSignals.corpusBytes}`,
74
+ ` gatherSignals packages: ${timings.classifierSignals.packageCount}`,
75
+ ...timings.classifierSignals.topPackages
76
+ .slice(0, 5)
77
+ .map(
78
+ (pkg) =>
79
+ ` ${pkg.packageName}: ${pkg.totalMs}ms, ${pkg.calls} calls, ${pkg.exports} exports`,
80
+ ),
81
+ ]
82
+ : []),
32
83
  ` plan: ${timings.planMs}ms`,
84
+ ...(timings.planDetail
85
+ ? [
86
+ ` core-artifacts: ${timings.planDetail.coreArtifactsMs}ms`,
87
+ ` agent-artifacts: ${timings.planDetail.agentArtifactsMs}ms`,
88
+ ` support-artifacts: ${timings.planDetail.supportArtifactsMs}ms`,
89
+ ` file-render: ${timings.planDetail.fileRenderMs}ms`,
90
+ ` finalize: ${timings.planDetail.finalizeMs}ms`,
91
+ ]
92
+ : []),
93
+ ` runtime-matrix: ${timings.runtimeMatrixMs}ms`,
94
+ ` import-guards: ${timings.importGuardsMs}ms`,
95
+ ` quality-gate: ${timings.qualityGateMs}ms`,
33
96
  ` emit: ${timings.emitMs}ms`,
97
+ ` post-emit: ${timings.postEmitMs}ms`,
98
+ ` unaccounted: ${timings.unaccountedMs}ms`,
34
99
  ` total: ${timings.totalMs}ms`,
35
100
  ].join("\n");
36
101
  }