forgeos 0.1.0-alpha.2 → 0.1.0-alpha.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (406) hide show
  1. package/.npmignore +4 -0
  2. package/AGENTS.md +168 -81
  3. package/CHANGELOG.md +199 -0
  4. package/README.md +88 -14
  5. package/adapters/go/README.md +23 -0
  6. package/adapters/go/go.mod +3 -0
  7. package/adapters/go/http.go +149 -0
  8. package/adapters/go/registry.go +234 -0
  9. package/adapters/go/types.go +136 -0
  10. package/adapters/java/README.md +68 -0
  11. package/adapters/java/pom.xml +34 -0
  12. package/adapters/java/src/main/java/dev/forgeos/adapter/Auth.java +20 -0
  13. package/adapters/java/src/main/java/dev/forgeos/adapter/Diagnostic.java +16 -0
  14. package/adapters/java/src/main/java/dev/forgeos/adapter/Entry.java +38 -0
  15. package/adapters/java/src/main/java/dev/forgeos/adapter/EntryKind.java +16 -0
  16. package/adapters/java/src/main/java/dev/forgeos/adapter/ErrorInfo.java +4 -0
  17. package/adapters/java/src/main/java/dev/forgeos/adapter/Forge.java +94 -0
  18. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeCall.java +12 -0
  19. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeContext.java +11 -0
  20. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHandler.java +8 -0
  21. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHttpHandler.java +179 -0
  22. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeRegistry.java +121 -0
  23. package/adapters/java/src/main/java/dev/forgeos/adapter/Json.java +14 -0
  24. package/adapters/java/src/main/java/dev/forgeos/adapter/Manifest.java +14 -0
  25. package/adapters/java/src/main/java/dev/forgeos/adapter/RequestEnvelope.java +6 -0
  26. package/adapters/java/src/main/java/dev/forgeos/adapter/ResponseEnvelope.java +25 -0
  27. package/adapters/java/src/main/java/dev/forgeos/adapter/Risk.java +18 -0
  28. package/adapters/java/src/main/java/dev/forgeos/adapter/Schemas.java +36 -0
  29. package/adapters/java/src/main/java/dev/forgeos/adapter/Service.java +65 -0
  30. package/adapters/java/src/main/java/dev/forgeos/adapter/TransactionMode.java +18 -0
  31. package/adapters/java/src/main/java/dev/forgeos/adapter/TypedForgeHandler.java +6 -0
  32. package/adapters/java/target/classes/dev/forgeos/adapter/Auth.class +0 -0
  33. package/adapters/java/target/classes/dev/forgeos/adapter/Diagnostic.class +0 -0
  34. package/adapters/java/target/classes/dev/forgeos/adapter/Entry.class +0 -0
  35. package/adapters/java/target/classes/dev/forgeos/adapter/EntryKind.class +0 -0
  36. package/adapters/java/target/classes/dev/forgeos/adapter/ErrorInfo.class +0 -0
  37. package/adapters/java/target/classes/dev/forgeos/adapter/Forge.class +0 -0
  38. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeCall.class +0 -0
  39. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeContext.class +0 -0
  40. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeHandler.class +0 -0
  41. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeHttpHandler.class +0 -0
  42. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry$EntryOption.class +0 -0
  43. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry$RegisteredEntry.class +0 -0
  44. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry$RegistryOption.class +0 -0
  45. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry.class +0 -0
  46. package/adapters/java/target/classes/dev/forgeos/adapter/Json.class +0 -0
  47. package/adapters/java/target/classes/dev/forgeos/adapter/Manifest.class +0 -0
  48. package/adapters/java/target/classes/dev/forgeos/adapter/RequestEnvelope.class +0 -0
  49. package/adapters/java/target/classes/dev/forgeos/adapter/ResponseEnvelope.class +0 -0
  50. package/adapters/java/target/classes/dev/forgeos/adapter/Risk.class +0 -0
  51. package/adapters/java/target/classes/dev/forgeos/adapter/Schemas.class +0 -0
  52. package/adapters/java/target/classes/dev/forgeos/adapter/Service.class +0 -0
  53. package/adapters/java/target/classes/dev/forgeos/adapter/TransactionMode.class +0 -0
  54. package/adapters/java/target/classes/dev/forgeos/adapter/TypedForgeHandler.class +0 -0
  55. package/adapters/java/target/forge-java-adapter-0.1.0-alpha.11.jar +0 -0
  56. package/adapters/java/target/maven-archiver/pom.properties +3 -0
  57. package/adapters/java/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +23 -0
  58. package/adapters/java/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +20 -0
  59. package/adapters/java-spring-boot-starter/README.md +32 -0
  60. package/adapters/java-spring-boot-starter/pom.xml +36 -0
  61. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeCommand.java +22 -0
  62. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeExternalService.java +15 -0
  63. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeQuery.java +16 -0
  64. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeServiceBeanCondition.java +18 -0
  65. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringAutoConfiguration.java +16 -0
  66. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringRuntime.java +104 -0
  67. package/adapters/java-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +1 -0
  68. package/adapters/java-spring-boot-starter/target/classes/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +1 -0
  69. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeCommand.class +0 -0
  70. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeExternalService.class +0 -0
  71. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeQuery.class +0 -0
  72. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeServiceBeanCondition.class +0 -0
  73. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeSpringAutoConfiguration.class +0 -0
  74. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeSpringRuntime.class +0 -0
  75. package/adapters/java-spring-boot-starter/target/forge-java-spring-boot-starter-0.1.0-alpha.11.jar +0 -0
  76. package/adapters/java-spring-boot-starter/target/maven-archiver/pom.properties +3 -0
  77. package/adapters/java-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +6 -0
  78. package/adapters/java-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +6 -0
  79. package/bin/forge.mjs +18 -0
  80. package/docs/changelog.md +212 -0
  81. package/docs/forge-protocol.md +189 -0
  82. package/examples/go-billing/go.mod +7 -0
  83. package/examples/go-billing/main.go +120 -0
  84. package/examples/java-billing/pom.xml +52 -0
  85. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/CreateInvoiceInput.java +4 -0
  86. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Invoice.java +11 -0
  87. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Main.java +127 -0
  88. package/examples/java-billing/target/classes/dev/forgeos/examples/billing/CreateInvoiceInput.class +0 -0
  89. package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Invoice.class +0 -0
  90. package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main$EmptyInput.class +0 -0
  91. package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main$Options.class +0 -0
  92. package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main.class +0 -0
  93. package/examples/java-billing/target/java-billing-0.1.0-alpha.11-all.jar +0 -0
  94. package/examples/java-billing/target/java-billing-0.1.0-alpha.11.jar +0 -0
  95. package/examples/java-billing/target/maven-archiver/pom.properties +3 -0
  96. package/examples/java-billing/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +5 -0
  97. package/examples/java-billing/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +3 -0
  98. package/package.json +29 -7
  99. package/schemas/forge-manifest.schema.json +57 -0
  100. package/src/forge/_generated/releaseManifest.json +1 -2
  101. package/src/forge/_generated/releaseManifest.ts +3 -3
  102. package/src/forge/agent-adapters/index.ts +1511 -123
  103. package/src/forge/agent-adapters/types.ts +216 -1
  104. package/src/forge/agent-memory/bridge.ts +1192 -0
  105. package/src/forge/agent-memory/context-pack.ts +151 -0
  106. package/src/forge/agent-memory/hook-runner.ts +312 -0
  107. package/src/forge/agent-memory/mcp.ts +224 -0
  108. package/src/forge/agent-memory/normalize.ts +498 -0
  109. package/src/forge/agent-memory/redaction.ts +103 -0
  110. package/src/forge/agent-memory/sources/claude-code.ts +51 -0
  111. package/src/forge/agent-memory/sources/codex-hook-runner.mjs +84 -0
  112. package/src/forge/agent-memory/sources/codex.ts +119 -0
  113. package/src/forge/agent-memory/sources/cursor.ts +35 -0
  114. package/src/forge/agent-memory/types.ts +191 -0
  115. package/src/forge/bench.ts +248 -0
  116. package/src/forge/brownfield-import/index.ts +736 -0
  117. package/src/forge/brownfield-import/types.ts +127 -0
  118. package/src/forge/cair/action-journal.ts +61 -0
  119. package/src/forge/cair/action-parser.ts +314 -0
  120. package/src/forge/cair/action-validator.ts +40 -0
  121. package/src/forge/cair/actions.ts +1818 -0
  122. package/src/forge/cair/format.ts +77 -0
  123. package/src/forge/cair/index.ts +106 -0
  124. package/src/forge/cair/query.ts +478 -0
  125. package/src/forge/cair/snapshot.ts +315 -0
  126. package/src/forge/cair/types.ts +248 -0
  127. package/src/forge/cli/ai.ts +671 -3
  128. package/src/forge/cli/auth.ts +36 -1
  129. package/src/forge/cli/build.ts +20 -4
  130. package/src/forge/cli/changed.ts +300 -0
  131. package/src/forge/cli/codex-app-server.ts +877 -0
  132. package/src/forge/cli/commands.ts +1285 -7
  133. package/src/forge/cli/db.ts +121 -2
  134. package/src/forge/cli/deps.ts +79 -12
  135. package/src/forge/cli/dev.ts +502 -38
  136. package/src/forge/cli/docs.ts +265 -0
  137. package/src/forge/cli/handoff.ts +250 -0
  138. package/src/forge/cli/index.ts +1 -0
  139. package/src/forge/cli/main.ts +49 -3
  140. package/src/forge/cli/new.ts +3 -1
  141. package/src/forge/cli/next-actions.ts +23 -0
  142. package/src/forge/cli/output.ts +290 -1
  143. package/src/forge/cli/parse.ts +770 -36
  144. package/src/forge/cli/query.ts +32 -0
  145. package/src/forge/cli/release.ts +35 -11
  146. package/src/forge/cli/rls.ts +568 -17
  147. package/src/forge/cli/run.ts +41 -0
  148. package/src/forge/cli/secrets.ts +46 -1
  149. package/src/forge/cli/security.ts +381 -0
  150. package/src/forge/cli/self-host.ts +56 -14
  151. package/src/forge/cli/studio.ts +2163 -0
  152. package/src/forge/cli/verify.ts +1422 -32
  153. package/src/forge/compiler/agent-contract/build.ts +725 -41
  154. package/src/forge/compiler/agent-contract/types.ts +85 -0
  155. package/src/forge/compiler/ai-registry/build.ts +62 -1
  156. package/src/forge/compiler/ai-registry/constants.ts +1 -1
  157. package/src/forge/compiler/ai-registry/parse.ts +168 -5
  158. package/src/forge/compiler/api-surface/build.ts +47 -0
  159. package/src/forge/compiler/app-graph/build.ts +68 -8
  160. package/src/forge/compiler/app-graph/extract.ts +107 -0
  161. package/src/forge/compiler/app-graph/forge-apis.ts +1 -0
  162. package/src/forge/compiler/app-graph/module-graph.ts +73 -78
  163. package/src/forge/compiler/app-graph/parser.ts +24 -24
  164. package/src/forge/compiler/app-graph/profile.ts +26 -0
  165. package/src/forge/compiler/app-graph/versions.ts +1 -1
  166. package/src/forge/compiler/classifier/capabilities.ts +3 -2
  167. package/src/forge/compiler/classifier/classify.ts +32 -8
  168. package/src/forge/compiler/classifier/secrets.ts +3 -2
  169. package/src/forge/compiler/classifier/signals.ts +91 -1
  170. package/src/forge/compiler/client-sdk/build-manifest.ts +59 -0
  171. package/src/forge/compiler/client-sdk/render-client.ts +188 -13
  172. package/src/forge/compiler/data-graph/parse.ts +3 -3
  173. package/src/forge/compiler/data-graph/sql/ddl.ts +60 -2
  174. package/src/forge/compiler/data-graph/sql/serialize.ts +4 -0
  175. package/src/forge/compiler/data-graph/sql/types.ts +1 -0
  176. package/src/forge/compiler/dev-manifest/build.ts +3 -0
  177. package/src/forge/compiler/diagnostics/codes.ts +35 -0
  178. package/src/forge/compiler/diagnostics/create.ts +8 -3
  179. package/src/forge/compiler/diagnostics/index.ts +2 -0
  180. package/src/forge/compiler/emitter/barrel.ts +3 -0
  181. package/src/forge/compiler/emitter/render.ts +5 -0
  182. package/src/forge/compiler/external-manifest/registry.ts +205 -0
  183. package/src/forge/compiler/external-manifest/types.ts +91 -0
  184. package/src/forge/compiler/external-manifest/validate.ts +373 -0
  185. package/src/forge/compiler/frontend-graph/build.ts +85 -13
  186. package/src/forge/compiler/integration/add.ts +498 -22
  187. package/src/forge/compiler/integration/snapshot.ts +2 -0
  188. package/src/forge/compiler/make-registry/build.ts +19 -7
  189. package/src/forge/compiler/orchestrator/plan-profile.ts +23 -0
  190. package/src/forge/compiler/orchestrator/plan.ts +78 -7
  191. package/src/forge/compiler/orchestrator/profile.ts +65 -0
  192. package/src/forge/compiler/orchestrator/run.ts +97 -31
  193. package/src/forge/compiler/orchestrator/serialize.ts +101 -8
  194. package/src/forge/compiler/package-graph/compiler.ts +13 -3
  195. package/src/forge/compiler/package-manager/adapter.ts +4 -1
  196. package/src/forge/compiler/package-manager/commands.ts +4 -0
  197. package/src/forge/compiler/package-manager/executor.ts +30 -1
  198. package/src/forge/compiler/policy-registry/build.ts +44 -1
  199. package/src/forge/compiler/test-graph/build.ts +11 -3
  200. package/src/forge/compiler/types/ai-registry.ts +25 -1
  201. package/src/forge/compiler/types/app-graph.ts +9 -2
  202. package/src/forge/compiler/types/cli.ts +76 -1
  203. package/src/forge/compiler/types/dev-manifest.ts +3 -0
  204. package/src/forge/compiler/types/frontend-graph.ts +2 -2
  205. package/src/forge/delta/classifier.ts +52 -0
  206. package/src/forge/delta/explain.ts +126 -0
  207. package/src/forge/delta/git-observer.ts +43 -0
  208. package/src/forge/delta/ids.ts +44 -0
  209. package/src/forge/delta/index.ts +13 -0
  210. package/src/forge/delta/recorder.ts +402 -0
  211. package/src/forge/delta/redaction.ts +50 -0
  212. package/src/forge/delta/schema.ts +240 -0
  213. package/src/forge/delta/session.ts +142 -0
  214. package/src/forge/delta/status.ts +489 -0
  215. package/src/forge/delta/store.ts +2975 -0
  216. package/src/forge/delta/timeline.ts +104 -0
  217. package/src/forge/dev/server.ts +768 -15
  218. package/src/forge/dev/types.ts +15 -1
  219. package/src/forge/dev/watch.ts +17 -7
  220. package/src/forge/dev-console/cycle.ts +233 -21
  221. package/src/forge/dev-console/types.ts +46 -1
  222. package/src/forge/impact/index.ts +46 -8
  223. package/src/forge/impact/types.ts +6 -0
  224. package/src/forge/intent/index.ts +35 -16
  225. package/src/forge/make/index.ts +149 -6
  226. package/src/forge/make/templates.ts +343 -2
  227. package/src/forge/make/types.ts +3 -1
  228. package/src/forge/refactor/index.ts +1 -0
  229. package/src/forge/repair/rules/index.ts +2 -2
  230. package/src/forge/review/index.ts +158 -12
  231. package/src/forge/review/types.ts +15 -0
  232. package/src/forge/runtime/ai/context.ts +210 -5
  233. package/src/forge/runtime/ai/types.ts +70 -0
  234. package/src/forge/runtime/auth/claims.ts +32 -0
  235. package/src/forge/runtime/auth/errors.ts +2 -0
  236. package/src/forge/runtime/context/create-context.ts +30 -6
  237. package/src/forge/runtime/db/generated-client.ts +13 -2
  238. package/src/forge/runtime/db/memory-adapter.ts +2 -2
  239. package/src/forge/runtime/db/pglite-adapter.ts +77 -2
  240. package/src/forge/runtime/db/postgres-adapter.ts +6 -3
  241. package/src/forge/runtime/executor.ts +112 -2
  242. package/src/forge/runtime/external/bridge.ts +649 -0
  243. package/src/forge/runtime/runner/run-entry.ts +16 -7
  244. package/src/forge/runtime/telemetry/scrubber.ts +91 -10
  245. package/src/forge/runtime/webhooks/security.ts +184 -0
  246. package/src/forge/server.ts +100 -2
  247. package/src/forge/version.ts +1 -1
  248. package/src/forge/vue/index.ts +407 -0
  249. package/src/forge/workspace/change-summary.ts +209 -0
  250. package/src/forge/workspace/forge-cli.ts +14 -0
  251. package/src/forge/workspace/git-summary.ts +279 -0
  252. package/templates/agent-workroom/AGENTS.md +29 -0
  253. package/templates/agent-workroom/README.md +34 -0
  254. package/templates/agent-workroom/forge.config.ts +3 -0
  255. package/templates/agent-workroom/package.json +33 -0
  256. package/templates/agent-workroom/src/actions/indexAgentSignal.ts +10 -0
  257. package/templates/agent-workroom/src/commands/openWorkroom.ts +61 -0
  258. package/templates/agent-workroom/src/commands/recordAgentSignal.ts +119 -0
  259. package/templates/agent-workroom/src/commands/recordCheckRun.ts +52 -0
  260. package/templates/agent-workroom/src/forge/schema.ts +54 -0
  261. package/templates/agent-workroom/src/policies.ts +6 -0
  262. package/templates/agent-workroom/src/queries/listWorkrooms.ts +11 -0
  263. package/templates/agent-workroom/src/queries/liveWorkroom.ts +63 -0
  264. package/templates/agent-workroom/tsconfig.json +16 -0
  265. package/templates/agent-workroom/web/index.html +12 -0
  266. package/templates/agent-workroom/web/package.json +21 -0
  267. package/templates/agent-workroom/web/src/App.tsx +345 -0
  268. package/templates/agent-workroom/web/src/lib/forge.ts +13 -0
  269. package/templates/agent-workroom/web/src/main.tsx +13 -0
  270. package/templates/agent-workroom/web/src/styles.css +545 -0
  271. package/templates/agent-workroom/web/tsconfig.json +27 -0
  272. package/templates/b2b-support-web/package.json +2 -0
  273. package/templates/b2b-support-web/tsconfig.json +4 -1
  274. package/templates/b2b-support-web/web/package.json +1 -1
  275. package/templates/minimal-web/package.json +2 -1
  276. package/templates/minimal-web/tsconfig.json +3 -1
  277. package/templates/minimal-web/web/package.json +2 -2
  278. package/src/forge/_generated/actionSubscriptions.json +0 -2
  279. package/src/forge/_generated/actionSubscriptions.ts +0 -10
  280. package/src/forge/_generated/agentAdapterManifest.json +0 -2
  281. package/src/forge/_generated/agentAdapterManifest.ts +0 -73
  282. package/src/forge/_generated/agentContract.json +0 -2
  283. package/src/forge/_generated/agentContract.ts +0 -7696
  284. package/src/forge/_generated/agentQuickstart.md +0 -32
  285. package/src/forge/_generated/aiContext.ts +0 -59
  286. package/src/forge/_generated/aiModels.json +0 -2
  287. package/src/forge/_generated/aiModels.ts +0 -35
  288. package/src/forge/_generated/aiProviders.json +0 -2
  289. package/src/forge/_generated/aiProviders.ts +0 -23
  290. package/src/forge/_generated/aiRegistry.json +0 -2
  291. package/src/forge/_generated/aiRegistry.ts +0 -29
  292. package/src/forge/_generated/api.json +0 -2
  293. package/src/forge/_generated/api.ts +0 -8
  294. package/src/forge/_generated/appGraph.json +0 -2
  295. package/src/forge/_generated/appGraph.ts +0 -14667
  296. package/src/forge/_generated/appMap.md +0 -35
  297. package/src/forge/_generated/artifactManifest.json +0 -2
  298. package/src/forge/_generated/artifactManifest.ts +0 -7
  299. package/src/forge/_generated/authClaims.json +0 -2
  300. package/src/forge/_generated/authClaims.ts +0 -13
  301. package/src/forge/_generated/authConfig.json +0 -2
  302. package/src/forge/_generated/authConfig.ts +0 -17
  303. package/src/forge/_generated/authContext.ts +0 -23
  304. package/src/forge/_generated/authRegistry.json +0 -2
  305. package/src/forge/_generated/authRegistry.ts +0 -25
  306. package/src/forge/_generated/buildInfo.json +0 -2
  307. package/src/forge/_generated/buildInfo.ts +0 -9
  308. package/src/forge/_generated/capabilityMap.json +0 -2
  309. package/src/forge/_generated/capabilityMap.md +0 -15
  310. package/src/forge/_generated/capabilityMap.ts +0 -17
  311. package/src/forge/_generated/client.ts +0 -282
  312. package/src/forge/_generated/clientApi.ts +0 -9
  313. package/src/forge/_generated/clientManifest.json +0 -2
  314. package/src/forge/_generated/clientManifest.ts +0 -39
  315. package/src/forge/_generated/clientTypes.ts +0 -78
  316. package/src/forge/_generated/configRegistry.json +0 -2
  317. package/src/forge/_generated/configRegistry.ts +0 -4
  318. package/src/forge/_generated/dataGraph.json +0 -2
  319. package/src/forge/_generated/dataGraph.ts +0 -8
  320. package/src/forge/_generated/db.json +0 -2
  321. package/src/forge/_generated/db.ts +0 -2
  322. package/src/forge/_generated/dbSecurityManifest.json +0 -2
  323. package/src/forge/_generated/dbSecurityManifest.ts +0 -15
  324. package/src/forge/_generated/dbSessionContext.json +0 -2
  325. package/src/forge/_generated/dbSessionContext.ts +0 -39
  326. package/src/forge/_generated/deployManifest.json +0 -2
  327. package/src/forge/_generated/deployManifest.ts +0 -14
  328. package/src/forge/_generated/devManifest.json +0 -2
  329. package/src/forge/_generated/devManifest.ts +0 -47
  330. package/src/forge/_generated/envSchema.json +0 -2
  331. package/src/forge/_generated/envSchema.ts +0 -59
  332. package/src/forge/_generated/frontendGraph.json +0 -2
  333. package/src/forge/_generated/frontendGraph.ts +0 -27
  334. package/src/forge/_generated/importGuards.json +0 -2
  335. package/src/forge/_generated/importGuards.ts +0 -686
  336. package/src/forge/_generated/index.ts +0 -67
  337. package/src/forge/_generated/liveProductionManifest.json +0 -2
  338. package/src/forge/_generated/liveProductionManifest.ts +0 -23
  339. package/src/forge/_generated/liveProtocol.json +0 -2
  340. package/src/forge/_generated/liveProtocol.ts +0 -21
  341. package/src/forge/_generated/liveQueryRegistry.json +0 -2
  342. package/src/forge/_generated/liveQueryRegistry.ts +0 -9
  343. package/src/forge/_generated/liveTransportConfig.json +0 -2
  344. package/src/forge/_generated/liveTransportConfig.ts +0 -19
  345. package/src/forge/_generated/makeRegistry.json +0 -2
  346. package/src/forge/_generated/makeRegistry.ts +0 -163
  347. package/src/forge/_generated/makeTemplates.json +0 -2
  348. package/src/forge/_generated/makeTemplates.ts +0 -61
  349. package/src/forge/_generated/mockMap.json +0 -2
  350. package/src/forge/_generated/mockMap.ts +0 -7
  351. package/src/forge/_generated/operationPlaybooks.md +0 -147
  352. package/src/forge/_generated/packageGraph.json +0 -2
  353. package/src/forge/_generated/packageGraph.ts +0 -245249
  354. package/src/forge/_generated/packageUpgradeRegistry.json +0 -2
  355. package/src/forge/_generated/packageUpgradeRegistry.ts +0 -15
  356. package/src/forge/_generated/permissionMatrix.json +0 -2
  357. package/src/forge/_generated/permissionMatrix.ts +0 -7
  358. package/src/forge/_generated/policyRegistry.json +0 -2
  359. package/src/forge/_generated/policyRegistry.ts +0 -11
  360. package/src/forge/_generated/queryRegistry.json +0 -2
  361. package/src/forge/_generated/queryRegistry.ts +0 -9
  362. package/src/forge/_generated/react.d.ts +0 -22
  363. package/src/forge/_generated/react.ts +0 -29
  364. package/src/forge/_generated/reactManifest.json +0 -2
  365. package/src/forge/_generated/reactManifest.ts +0 -19
  366. package/src/forge/_generated/rlsPolicies.json +0 -2
  367. package/src/forge/_generated/rlsPolicies.sql +0 -34
  368. package/src/forge/_generated/rlsPolicies.ts +0 -6
  369. package/src/forge/_generated/runtimeGraph.json +0 -2
  370. package/src/forge/_generated/runtimeGraph.ts +0 -8
  371. package/src/forge/_generated/runtimeMatrix.json +0 -2
  372. package/src/forge/_generated/runtimeMatrix.ts +0 -327385
  373. package/src/forge/_generated/runtimeRegistry.ts +0 -2
  374. package/src/forge/_generated/runtimeRules.md +0 -79
  375. package/src/forge/_generated/secretRegistry.json +0 -2
  376. package/src/forge/_generated/secretRegistry.ts +0 -50
  377. package/src/forge/_generated/secretsContext.ts +0 -11
  378. package/src/forge/_generated/serverApi.ts +0 -10
  379. package/src/forge/_generated/sourceMapManifest.json +0 -2
  380. package/src/forge/_generated/sourceMapManifest.ts +0 -7
  381. package/src/forge/_generated/sqlPlan.json +0 -2
  382. package/src/forge/_generated/sqlPlan.ts +0 -88
  383. package/src/forge/_generated/subscriptionManifest.json +0 -2
  384. package/src/forge/_generated/subscriptionManifest.ts +0 -7
  385. package/src/forge/_generated/symbolicationManifest.json +0 -2
  386. package/src/forge/_generated/symbolicationManifest.ts +0 -17
  387. package/src/forge/_generated/telemetryRegistry.json +0 -2
  388. package/src/forge/_generated/telemetryRegistry.ts +0 -9
  389. package/src/forge/_generated/telemetrySinks.json +0 -2
  390. package/src/forge/_generated/telemetrySinks.ts +0 -11
  391. package/src/forge/_generated/tenantScope.json +0 -2
  392. package/src/forge/_generated/tenantScope.ts +0 -8
  393. package/src/forge/_generated/testGraph.json +0 -2
  394. package/src/forge/_generated/testGraph.ts +0 -3108
  395. package/src/forge/_generated/testPlanRegistry.json +0 -2
  396. package/src/forge/_generated/testPlanRegistry.ts +0 -33
  397. package/src/forge/_generated/uiRoutes.json +0 -2
  398. package/src/forge/_generated/uiRoutes.ts +0 -16
  399. package/src/forge/_generated/uiScenarios.json +0 -2
  400. package/src/forge/_generated/uiScenarios.ts +0 -30
  401. package/src/forge/_generated/uiTestManifest.json +0 -2
  402. package/src/forge/_generated/uiTestManifest.ts +0 -27
  403. package/src/forge/_generated/workflowRegistry.json +0 -2
  404. package/src/forge/_generated/workflowRegistry.ts +0 -9
  405. package/src/forge/_generated/workflowSubscriptions.json +0 -2
  406. package/src/forge/_generated/workflowSubscriptions.ts +0 -10
@@ -34,6 +34,8 @@ 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",
38
+ "forge make ai-chat support --dry-run --json",
37
39
  "forge make resource <name> --fields title:text,status:enum(open,closed) --dry-run --json",
38
40
  "forge make resource <name> --fields title:text --with-ui --yes",
39
41
  "forge make apply <planId>",
@@ -112,16 +114,25 @@ export function buildMakeRegistry(generatorVersion: string): MakeRegistryArtifac
112
114
  },
113
115
  {
114
116
  name: "ui",
115
- 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.",
116
118
  creates: [
117
119
  "web/package.json",
118
- "web/index.html",
119
- "web/src/lib/forge.ts",
120
- "web/src/main.tsx",
121
- "web/src/App.tsx",
120
+ "web/src/lib/forge.ts or web/composables/forge.ts",
121
+ "web/src/main.tsx or web/app.vue",
122
122
  ],
123
123
  modifies: [],
124
- examples: ["forge make ui --framework vite --yes"],
124
+ examples: ["forge make ui --framework vite --yes", "forge make ui --framework nuxt --yes"],
125
+ },
126
+ {
127
+ name: "ai-chat",
128
+ summary: "Add a Forge AI agent and React chat component backed by /ai/agents/run.",
129
+ creates: [
130
+ "src/ai/<name>Agent.ts",
131
+ "web/components/<Name>AiChat.tsx",
132
+ "web/app/<name>-ai/page.tsx when web/app exists",
133
+ ],
134
+ modifies: [],
135
+ examples: ["forge make ai-chat support --yes"],
125
136
  },
126
137
  {
127
138
  name: "resource",
@@ -154,7 +165,8 @@ export function buildMakeTemplates(): MakeTemplateArtifact {
154
165
  { name: "workflow", sourceKind: "runtime", outputPattern: "src/workflows/<name>.ts" },
155
166
  { name: "component", sourceKind: "frontend", outputPattern: "web/components/<name>.tsx" },
156
167
  { name: "page", sourceKind: "frontend", outputPattern: "web/app/<route>/page.tsx" },
157
- { name: "ui", sourceKind: "frontend", outputPattern: "web/src/App.tsx" },
168
+ { name: "ui", sourceKind: "frontend", outputPattern: "web/src/App.tsx or web/app.vue" },
169
+ { name: "ai-chat", sourceKind: "frontend", outputPattern: "web/components/<name>AiChat.tsx" },
158
170
  { name: "placeholder-test", sourceKind: "test", outputPattern: "tests/make-generated/<name>.test.ts" },
159
171
  ],
160
172
  };
@@ -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";
@@ -54,6 +63,8 @@ import { buildDevManifest } from "../dev-manifest/build.ts";
54
63
  import { buildRuntimeGraph } from "../runtime-graph/build.ts";
55
64
  import {
56
65
  buildAgentContractArtifacts,
66
+ serializeAgentToolRegistryJson,
67
+ serializeAgentToolRegistryTs,
57
68
  serializeCapabilityMapJson,
58
69
  serializeCapabilityMapTs,
59
70
  serializeAgentContractJson,
@@ -95,7 +106,6 @@ import { detectOrphanedGeneratedFiles } from "./orphans.ts";
95
106
  import type { DiscoverContext } from "./types.ts";
96
107
  import {
97
108
  serializeAppGraphJson,
98
- serializeAppGraphTs,
99
109
  serializeDataGraphJson,
100
110
  serializeDataGraphTs,
101
111
  serializeImportGuardsJson,
@@ -108,6 +118,7 @@ import {
108
118
  serializeRuntimeGraphTs,
109
119
  serializeRuntimeMatrixJson,
110
120
  serializeRuntimeMatrixTs,
121
+ serializeConstFromJson,
111
122
  serializeRuntimeRegistryTs,
112
123
  serializeDevManifestJson,
113
124
  serializeDevManifestTs,
@@ -199,10 +210,12 @@ import {
199
210
  serializeClientApiTsExport,
200
211
  serializeClientManifestJson,
201
212
  serializeReactManifestJson,
213
+ serializeVueManifestJson,
202
214
  buildMockMapEntries,
203
215
  } from "./serialize.ts";
204
216
  import { buildDefaultAuthRegistry, AUTH_ENV } from "../../runtime/auth/config.ts";
205
217
  import type { EnvSchema } from "../types/secret-registry.ts";
218
+ import { recordPlanProfile } from "./plan-profile.ts";
206
219
 
207
220
  export interface PlanInput {
208
221
  appGraph: AppGraph;
@@ -290,6 +303,8 @@ function augmentEnvSchemaWithAuthVars(schema: EnvSchema): EnvSchema {
290
303
  }
291
304
 
292
305
  export function plan(input: PlanInput): EmitPlan {
306
+ const started = performance.now();
307
+ let checkpoint = started;
293
308
  const matrix = buildRuntimeMatrix(input.classified);
294
309
  const dataGraph = buildDataGraph(input.appGraph);
295
310
  const sqlPlan = buildSqlPlan(dataGraph);
@@ -298,7 +313,8 @@ export function plan(input: PlanInput): EmitPlan {
298
313
  const workflowSubscriptions = buildWorkflowSubscriptions(workflowRegistry);
299
314
  const telemetryRegistry = buildTelemetryRegistry(input.appGraph);
300
315
  const telemetrySinks = buildTelemetrySinks(input.classified);
301
- const policyRegistry = buildPolicyRegistry(input.appGraph);
316
+ const externalServices = buildExternalServiceGraph(input.ctx.workspaceRoot);
317
+ const policyRegistry = buildPolicyRegistry(input.appGraph, externalServices);
302
318
  const permissionMatrix = buildPermissionMatrixFromRegistry(policyRegistry);
303
319
  const tenantScope = buildTenantScope(dataGraph);
304
320
  const secretRegistry = buildSecretRegistry(input.classified);
@@ -321,15 +337,20 @@ export function plan(input: PlanInput): EmitPlan {
321
337
  queryRegistry,
322
338
  liveQueryRegistry,
323
339
  workflowRegistry,
340
+ externalServices,
324
341
  );
325
342
  const clientManifest = buildClientManifest(apiSurface, input.classified);
326
343
  const reactManifest = buildReactManifest(clientManifest);
344
+ const vueManifest = buildVueManifest(clientManifest);
327
345
  const frontendGraph = buildFrontendGraph({
328
346
  workspaceRoot: input.ctx.workspaceRoot,
329
347
  clientManifest,
330
348
  });
331
349
  const devManifest = buildDevManifest(runtimeGraph, queryRegistry, input.appGraph);
332
350
  const mockMapEntries = buildMockMapEntries(input.classified);
351
+ const coreArtifactsMs = performance.now() - checkpoint;
352
+ checkpoint = performance.now();
353
+
333
354
  const agentArtifacts = buildAgentContractArtifacts({
334
355
  workspaceRoot: input.ctx.workspaceRoot,
335
356
  appGraph: input.appGraph,
@@ -350,8 +371,12 @@ export function plan(input: PlanInput): EmitPlan {
350
371
  apiSurface,
351
372
  clientManifest,
352
373
  frontendGraph,
374
+ externalServices,
353
375
  });
354
376
  const agentAdapterManifest = buildAgentAdapterManifest(agentArtifacts.contract);
377
+ const agentArtifactsMs = performance.now() - checkpoint;
378
+ checkpoint = performance.now();
379
+
355
380
  const rlsArtifacts = buildRlsArtifacts(sqlPlan, tenantScope);
356
381
  const packageUpgradeRegistry = {
357
382
  schemaVersion: "0.1.0" as const,
@@ -387,6 +412,12 @@ export function plan(input: PlanInput): EmitPlan {
387
412
  apiSurface,
388
413
  sources: input.ctx.sources,
389
414
  });
415
+ const supportArtifactsMs = performance.now() - checkpoint;
416
+ checkpoint = performance.now();
417
+
418
+ const appGraphJson = serializeAppGraphJson(input.appGraph);
419
+ const packageGraphJson = serializePackageGraphJson(input.packageGraph);
420
+ const runtimeMatrixJson = serializeRuntimeMatrixJson(matrix);
390
421
 
391
422
  const files: EmitFile[] = [
392
423
  makeEmitFile("AGENTS.md", agentArtifacts.agentsMd),
@@ -398,7 +429,24 @@ export function plan(input: PlanInput): EmitPlan {
398
429
  `${GENERATED_DIR}/agentContract.json`,
399
430
  serializeAgentContractJson(agentArtifacts.contract),
400
431
  ),
432
+ makeEmitFile(
433
+ `${GENERATED_DIR}/externalServices.ts`,
434
+ serializeExternalServiceGraphTs(externalServices),
435
+ ),
436
+ makeEmitFile(
437
+ `${GENERATED_DIR}/externalServices.json`,
438
+ serializeExternalServiceGraphJson(externalServices),
439
+ ),
401
440
  makeEmitFile(`${GENERATED_DIR}/appMap.md`, agentArtifacts.appMapMd),
441
+ makeEmitFile(
442
+ `${GENERATED_DIR}/agentTools.ts`,
443
+ serializeAgentToolRegistryTs(agentArtifacts.toolRegistry),
444
+ ),
445
+ makeEmitFile(
446
+ `${GENERATED_DIR}/agentTools.json`,
447
+ serializeAgentToolRegistryJson(agentArtifacts.toolRegistry),
448
+ ),
449
+ makeEmitFile(`${GENERATED_DIR}/agentTools.md`, agentArtifacts.agentToolsMd),
402
450
  makeEmitFile(
403
451
  `${GENERATED_DIR}/capabilityMap.ts`,
404
452
  serializeCapabilityMapTs(agentArtifacts.capabilityMap),
@@ -417,6 +465,10 @@ export function plan(input: PlanInput): EmitPlan {
417
465
  `${GENERATED_DIR}/agentQuickstart.md`,
418
466
  agentArtifacts.agentQuickstartMd,
419
467
  ),
468
+ makeEmitFile(
469
+ `${GENERATED_DIR}/agentCairGuide.md`,
470
+ agentArtifacts.agentCairGuideMd,
471
+ ),
420
472
  makeEmitFile(
421
473
  `${GENERATED_DIR}/agentAdapterManifest.ts`,
422
474
  serializeAgentAdapterManifestTs(agentAdapterManifest),
@@ -435,11 +487,11 @@ export function plan(input: PlanInput): EmitPlan {
435
487
  ),
436
488
  makeEmitFile(
437
489
  `${GENERATED_DIR}/appGraph.ts`,
438
- serializeAppGraphTs(input.appGraph),
490
+ serializeConstFromJson("appGraph", appGraphJson),
439
491
  ),
440
492
  makeEmitFile(
441
493
  `${GENERATED_DIR}/appGraph.json`,
442
- serializeAppGraphJson(input.appGraph),
494
+ appGraphJson,
443
495
  ),
444
496
  makeEmitFile(
445
497
  `${GENERATED_DIR}/packageGraph.ts`,
@@ -447,7 +499,7 @@ export function plan(input: PlanInput): EmitPlan {
447
499
  ),
448
500
  makeEmitFile(
449
501
  `${GENERATED_DIR}/packageGraph.json`,
450
- serializePackageGraphJson(input.packageGraph),
502
+ packageGraphJson,
451
503
  ),
452
504
  makeEmitFile(
453
505
  `${GENERATED_DIR}/runtimeMatrix.ts`,
@@ -455,7 +507,7 @@ export function plan(input: PlanInput): EmitPlan {
455
507
  ),
456
508
  makeEmitFile(
457
509
  `${GENERATED_DIR}/runtimeMatrix.json`,
458
- serializeRuntimeMatrixJson(matrix),
510
+ runtimeMatrixJson,
459
511
  ),
460
512
  makeEmitFile(
461
513
  `${GENERATED_DIR}/importGuards.ts`,
@@ -844,7 +896,16 @@ export function plan(input: PlanInput): EmitPlan {
844
896
  `${GENERATED_DIR}/reactManifest.json`,
845
897
  serializeReactManifestJson(reactManifest),
846
898
  ),
899
+ makeEmitFile(`${GENERATED_DIR}/vue.ts`, renderVueTs()),
900
+ makeEmitFile(`${GENERATED_DIR}/vue.d.ts`, renderVueDts()),
901
+ makeEmitFile(`${GENERATED_DIR}/vueManifest.ts`, renderVueManifestTs(vueManifest)),
902
+ makeEmitFile(
903
+ `${GENERATED_DIR}/vueManifest.json`,
904
+ serializeVueManifestJson(vueManifest),
905
+ ),
847
906
  ];
907
+ const fileRenderMs = performance.now() - checkpoint;
908
+ checkpoint = performance.now();
848
909
 
849
910
  const sortedFiles = stableSortEmitFiles(files);
850
911
  const plannedPathSet = new Set(sortedFiles.map((file) => file.path));
@@ -855,8 +916,9 @@ export function plan(input: PlanInput): EmitPlan {
855
916
  );
856
917
 
857
918
  const lock = buildForgeLock(input);
919
+ const finalizeMs = performance.now() - checkpoint;
858
920
 
859
- return {
921
+ const result = {
860
922
  files: sortedFiles,
861
923
  orphanedFiles,
862
924
  lock,
@@ -873,4 +935,13 @@ export function plan(input: PlanInput): EmitPlan {
873
935
  ),
874
936
  ],
875
937
  };
938
+ recordPlanProfile(result, {
939
+ coreArtifactsMs,
940
+ agentArtifactsMs,
941
+ supportArtifactsMs,
942
+ fileRenderMs,
943
+ finalizeMs,
944
+ totalMs: performance.now() - started,
945
+ });
946
+ return result;
876
947
  }
@@ -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
  }
@@ -5,6 +5,12 @@ import {
5
5
  import type { GenerateOptions, GenerateResult } from "../types/cli.ts";
6
6
  import type { Diagnostic } from "../types/diagnostic.ts";
7
7
  import { classify } from "../classifier/classify.ts";
8
+ import { getAppGraphProfile } from "../app-graph/profile.ts";
9
+ import {
10
+ clearSignalProfile,
11
+ getSignalProfile,
12
+ resetSignalProfile,
13
+ } from "../classifier/signals.ts";
8
14
  import type { ClassifiedPackage } from "../classifier/runtime-matrix.ts";
9
15
  import { buildRuntimeMatrix } from "../classifier/runtime-matrix.ts";
10
16
  import { emit } from "../emitter/emit.ts";
@@ -25,8 +31,10 @@ import {
25
31
  formatCompileTimings,
26
32
  isCompileProfileEnabled,
27
33
  recordCompileTimings,
34
+ shouldPrintCompileProfile,
28
35
  } from "./profile.ts";
29
36
  import { plan } from "./plan.ts";
37
+ import { getPlanProfile } from "./plan-profile.ts";
30
38
  import {
31
39
  buildAppGraphForSession,
32
40
  discoverForSession,
@@ -100,6 +108,7 @@ export async function run(options: GenerateOptions): Promise<GenerateResult> {
100
108
  async function runUnlocked(options: GenerateOptions): Promise<GenerateResult> {
101
109
  const profileEnabled = isCompileProfileEnabled();
102
110
  const runStarted = profileEnabled ? performance.now() : 0;
111
+ let fastCheckMs = 0;
103
112
  let generateCheckCache: GenerateResult["cache"] =
104
113
  options.check && !options.dryRun
105
114
  ? {
@@ -110,7 +119,9 @@ async function runUnlocked(options: GenerateOptions): Promise<GenerateResult> {
110
119
  : undefined;
111
120
 
112
121
  if (options.check && !options.dryRun) {
122
+ const fastCheckStarted = profileEnabled ? performance.now() : 0;
113
123
  const fastCheck = runFastGenerateCheck(options.workspaceRoot);
124
+ fastCheckMs = profileEnabled ? performance.now() - fastCheckStarted : 0;
114
125
  if (fastCheck.kind === "hit") {
115
126
  return fastCheck.result;
116
127
  }
@@ -121,7 +132,9 @@ async function runUnlocked(options: GenerateOptions): Promise<GenerateResult> {
121
132
  };
122
133
  }
123
134
 
135
+ const sessionStarted = profileEnabled ? performance.now() : 0;
124
136
  const session = getCompileSession(options.workspaceRoot);
137
+ const sessionMs = profileEnabled ? performance.now() - sessionStarted : 0;
125
138
 
126
139
  const discoverStarted = profileEnabled ? performance.now() : 0;
127
140
  const ctx = discoverForSession(session);
@@ -130,20 +143,40 @@ async function runUnlocked(options: GenerateOptions): Promise<GenerateResult> {
130
143
 
131
144
  const pkgCompiler = new PackageGraphCompiler();
132
145
 
133
- const graphStarted = profileEnabled ? performance.now() : 0;
134
- const [appGraph, pkgResult] = await Promise.all([
135
- buildAppGraphForSession(session),
136
- pkgCompiler.build(ctx.dependencies, {
146
+ let appGraphMs = 0;
147
+ let packageGraphMs = 0;
148
+ const graphBuildStarted = profileEnabled ? performance.now() : 0;
149
+ const appGraphPromise = (async () => {
150
+ const started = profileEnabled ? performance.now() : 0;
151
+ const graph = await buildAppGraphForSession(session);
152
+ appGraphMs = profileEnabled ? performance.now() - started : 0;
153
+ return graph;
154
+ })();
155
+ const packageGraphPromise = (async () => {
156
+ const started = profileEnabled ? performance.now() : 0;
157
+ const result = await pkgCompiler.build(ctx.dependencies, {
137
158
  runtimeInspect: false,
138
159
  resolutionMode: "nodenext",
139
160
  cacheDir: ctx.cacheDir,
140
161
  concurrency: options.concurrency,
141
162
  lockfileHash: ctx.lockfileHash,
142
- }),
143
- ]);
144
- const graphMs = profileEnabled ? performance.now() - graphStarted : 0;
163
+ });
164
+ packageGraphMs = profileEnabled ? performance.now() - started : 0;
165
+ return result;
166
+ })();
167
+ const [appGraph, pkgResult] = await Promise.all([appGraphPromise, packageGraphPromise]);
168
+ const graphBuildMs = profileEnabled ? performance.now() - graphBuildStarted : 0;
145
169
 
170
+ const classifyStarted = profileEnabled ? performance.now() : 0;
171
+ if (profileEnabled) {
172
+ resetSignalProfile();
173
+ }
146
174
  const classified = classifyPackages(pkgResult.graph);
175
+ const classifierSignals = profileEnabled ? getSignalProfile() : undefined;
176
+ if (profileEnabled) {
177
+ clearSignalProfile();
178
+ }
179
+ const classifyMs = profileEnabled ? performance.now() - classifyStarted : 0;
147
180
 
148
181
  const planStarted = profileEnabled ? performance.now() : 0;
149
182
  const emitPlan = plan({
@@ -160,8 +193,13 @@ async function runUnlocked(options: GenerateOptions): Promise<GenerateResult> {
160
193
  ? "dry-run"
161
194
  : "write";
162
195
 
196
+ const runtimeMatrixStarted = profileEnabled ? performance.now() : 0;
163
197
  const matrix = buildRuntimeMatrix(classified);
198
+ const runtimeMatrixMs = profileEnabled ? performance.now() - runtimeMatrixStarted : 0;
199
+ const importGuardsStarted = profileEnabled ? performance.now() : 0;
164
200
  const guardDiagnostics = checkImportGuards(appGraph.moduleGraph, matrix);
201
+ const importGuardsMs = profileEnabled ? performance.now() - importGuardsStarted : 0;
202
+ const qualityGateStarted = profileEnabled ? performance.now() : 0;
165
203
  // Import guards fail `forge check`; generate/drift only surface them as warnings.
166
204
  const guardDiagnosticsForGate =
167
205
  mode === "check"
@@ -176,6 +214,7 @@ async function runUnlocked(options: GenerateOptions): Promise<GenerateResult> {
176
214
  pkgResult.diagnostics,
177
215
  [...guardDiagnosticsForGate, ...(emitPlan.diagnostics ?? [])],
178
216
  );
217
+ const qualityGateMs = profileEnabled ? performance.now() - qualityGateStarted : 0;
179
218
 
180
219
  const emitStarted = profileEnabled ? performance.now() : 0;
181
220
  const emitResult = await emit(emitPlan, {
@@ -184,6 +223,7 @@ async function runUnlocked(options: GenerateOptions): Promise<GenerateResult> {
184
223
  });
185
224
  const emitMs = profileEnabled ? performance.now() - emitStarted : 0;
186
225
 
226
+ const postEmitStarted = profileEnabled ? performance.now() : 0;
187
227
  const warnings: Diagnostic[] = [
188
228
  ...qualityDiagnostics.filter((d) => d.severity === "warning"),
189
229
  ...emitResult.warnings,
@@ -214,30 +254,6 @@ async function runUnlocked(options: GenerateOptions): Promise<GenerateResult> {
214
254
  }
215
255
  }
216
256
 
217
- if (profileEnabled) {
218
- const totalMs = performance.now() - runStarted;
219
- recordCompileTimings({
220
- discoverMs,
221
- appGraphMs: graphMs,
222
- packageGraphMs: 0,
223
- planMs,
224
- emitMs,
225
- totalMs,
226
- });
227
- const fsProfile = getFileSystemProfile();
228
- process.stderr.write(`${formatCompileTimings({
229
- discoverMs,
230
- appGraphMs: graphMs,
231
- packageGraphMs: 0,
232
- planMs,
233
- emitMs,
234
- totalMs,
235
- })}\n`);
236
- if (fsProfile) {
237
- process.stderr.write(`${formatFileSystemProfile(fsProfile)}\n`);
238
- }
239
- }
240
-
241
257
  const driftFailure =
242
258
  options.check &&
243
259
  (emitResult.changed.length > 0 ||
@@ -257,6 +273,56 @@ async function runUnlocked(options: GenerateOptions): Promise<GenerateResult> {
257
273
  const unchanged = emitResult.unchanged.filter((path) =>
258
274
  plannedPaths.has(path),
259
275
  );
276
+ const postEmitMs = profileEnabled ? performance.now() - postEmitStarted : 0;
277
+
278
+ if (profileEnabled) {
279
+ const totalMs = performance.now() - runStarted;
280
+ const appGraphProfile = getAppGraphProfile(appGraph);
281
+ const planProfile = getPlanProfile(emitPlan);
282
+ const unaccountedMs = Math.max(
283
+ 0,
284
+ totalMs -
285
+ fastCheckMs -
286
+ sessionMs -
287
+ discoverMs -
288
+ graphBuildMs -
289
+ classifyMs -
290
+ planMs -
291
+ runtimeMatrixMs -
292
+ importGuardsMs -
293
+ qualityGateMs -
294
+ emitMs -
295
+ postEmitMs,
296
+ );
297
+ const timings = {
298
+ fastCheckMs,
299
+ sessionMs,
300
+ discoverMs,
301
+ graphBuildMs,
302
+ appGraphMs,
303
+ ...(appGraphProfile ? { appGraph: appGraphProfile } : {}),
304
+ packageGraphMs,
305
+ classifyMs,
306
+ ...(classifierSignals ? { classifierSignals } : {}),
307
+ planMs,
308
+ ...(planProfile ? { planDetail: planProfile } : {}),
309
+ runtimeMatrixMs,
310
+ importGuardsMs,
311
+ qualityGateMs,
312
+ emitMs,
313
+ postEmitMs,
314
+ unaccountedMs,
315
+ totalMs,
316
+ };
317
+ recordCompileTimings(timings);
318
+ const fsProfile = getFileSystemProfile();
319
+ if (shouldPrintCompileProfile()) {
320
+ process.stderr.write(`${formatCompileTimings(timings)}\n`);
321
+ if (fsProfile) {
322
+ process.stderr.write(`${formatFileSystemProfile(fsProfile)}\n`);
323
+ }
324
+ }
325
+ }
260
326
 
261
327
  return {
262
328
  changed,