forgeos 0.1.0-alpha.4 → 0.1.0-alpha.41

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 (416) hide show
  1. package/.npmignore +10 -0
  2. package/AGENTS.md +142 -90
  3. package/CHANGELOG.md +433 -0
  4. package/LICENSE +21 -0
  5. package/README.md +67 -8
  6. package/adapters/go/README.md +23 -0
  7. package/adapters/go/go.mod +3 -0
  8. package/adapters/go/http.go +149 -0
  9. package/adapters/go/registry.go +234 -0
  10. package/adapters/go/types.go +136 -0
  11. package/adapters/java/README.md +68 -0
  12. package/adapters/java/pom.xml +34 -0
  13. package/adapters/java/src/main/java/dev/forgeos/adapter/Auth.java +20 -0
  14. package/adapters/java/src/main/java/dev/forgeos/adapter/Diagnostic.java +16 -0
  15. package/adapters/java/src/main/java/dev/forgeos/adapter/Entry.java +38 -0
  16. package/adapters/java/src/main/java/dev/forgeos/adapter/EntryKind.java +16 -0
  17. package/adapters/java/src/main/java/dev/forgeos/adapter/ErrorInfo.java +4 -0
  18. package/adapters/java/src/main/java/dev/forgeos/adapter/Forge.java +94 -0
  19. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeCall.java +12 -0
  20. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeContext.java +11 -0
  21. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHandler.java +8 -0
  22. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHttpHandler.java +179 -0
  23. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeRegistry.java +121 -0
  24. package/adapters/java/src/main/java/dev/forgeos/adapter/Json.java +14 -0
  25. package/adapters/java/src/main/java/dev/forgeos/adapter/Manifest.java +14 -0
  26. package/adapters/java/src/main/java/dev/forgeos/adapter/RequestEnvelope.java +6 -0
  27. package/adapters/java/src/main/java/dev/forgeos/adapter/ResponseEnvelope.java +25 -0
  28. package/adapters/java/src/main/java/dev/forgeos/adapter/Risk.java +18 -0
  29. package/adapters/java/src/main/java/dev/forgeos/adapter/Schemas.java +36 -0
  30. package/adapters/java/src/main/java/dev/forgeos/adapter/Service.java +65 -0
  31. package/adapters/java/src/main/java/dev/forgeos/adapter/TransactionMode.java +18 -0
  32. package/adapters/java/src/main/java/dev/forgeos/adapter/TypedForgeHandler.java +6 -0
  33. package/adapters/java-spring-boot-starter/README.md +32 -0
  34. package/adapters/java-spring-boot-starter/pom.xml +36 -0
  35. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeCommand.java +22 -0
  36. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeExternalService.java +15 -0
  37. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeQuery.java +16 -0
  38. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeServiceBeanCondition.java +18 -0
  39. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringAutoConfiguration.java +16 -0
  40. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringRuntime.java +104 -0
  41. package/adapters/java-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +1 -0
  42. package/bin/forge.mjs +18 -0
  43. package/docs/cair-protocol.md +103 -0
  44. package/docs/changelog.md +548 -0
  45. package/docs/forge-protocol.md +189 -0
  46. package/examples/go-billing/go.mod +7 -0
  47. package/examples/go-billing/main.go +120 -0
  48. package/examples/java-billing/pom.xml +52 -0
  49. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/CreateInvoiceInput.java +4 -0
  50. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Invoice.java +11 -0
  51. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Main.java +127 -0
  52. package/package.json +31 -3
  53. package/schemas/forge-manifest.schema.json +57 -0
  54. package/src/forge/_generated/releaseManifest.json +1 -2
  55. package/src/forge/_generated/releaseManifest.ts +3 -3
  56. package/src/forge/agent-adapters/index.ts +1584 -125
  57. package/src/forge/agent-adapters/types.ts +224 -1
  58. package/src/forge/agent-memory/bridge.ts +1333 -0
  59. package/src/forge/agent-memory/context-pack.ts +277 -0
  60. package/src/forge/agent-memory/hook-runner.ts +312 -0
  61. package/src/forge/agent-memory/mcp.ts +224 -0
  62. package/src/forge/agent-memory/normalize.ts +498 -0
  63. package/src/forge/agent-memory/redaction.ts +103 -0
  64. package/src/forge/agent-memory/sources/claude-code.ts +51 -0
  65. package/src/forge/agent-memory/sources/codex-hook-runner.mjs +273 -0
  66. package/src/forge/agent-memory/sources/codex.ts +119 -0
  67. package/src/forge/agent-memory/sources/cursor.ts +35 -0
  68. package/src/forge/agent-memory/types.ts +204 -0
  69. package/src/forge/bench.ts +248 -0
  70. package/src/forge/brownfield-import/index.ts +801 -0
  71. package/src/forge/brownfield-import/types.ts +127 -0
  72. package/src/forge/cair/action-journal.ts +61 -0
  73. package/src/forge/cair/action-parser.ts +314 -0
  74. package/src/forge/cair/action-validator.ts +40 -0
  75. package/src/forge/cair/actions.ts +1818 -0
  76. package/src/forge/cair/format.ts +77 -0
  77. package/src/forge/cair/index.ts +106 -0
  78. package/src/forge/cair/query.ts +478 -0
  79. package/src/forge/cair/snapshot.ts +315 -0
  80. package/src/forge/cair/types.ts +248 -0
  81. package/src/forge/cli/ai.ts +339 -21
  82. package/src/forge/cli/auth.ts +348 -10
  83. package/src/forge/cli/authmd.ts +441 -0
  84. package/src/forge/cli/baseline.ts +112 -0
  85. package/src/forge/cli/build.ts +20 -4
  86. package/src/forge/cli/changed.ts +437 -0
  87. package/src/forge/cli/codex-app-server.ts +877 -0
  88. package/src/forge/cli/commands.ts +1620 -20
  89. package/src/forge/cli/db.ts +209 -2
  90. package/src/forge/cli/deploy.ts +887 -0
  91. package/src/forge/cli/deps.ts +82 -13
  92. package/src/forge/cli/dev.ts +961 -46
  93. package/src/forge/cli/docs.ts +265 -0
  94. package/src/forge/cli/doctor.ts +297 -0
  95. package/src/forge/cli/field-test.ts +329 -0
  96. package/src/forge/cli/handoff.ts +336 -0
  97. package/src/forge/cli/index.ts +1 -0
  98. package/src/forge/cli/last-run.ts +84 -0
  99. package/src/forge/cli/main.ts +107 -3
  100. package/src/forge/cli/new.ts +152 -13
  101. package/src/forge/cli/next-actions.ts +23 -0
  102. package/src/forge/cli/output.ts +389 -6
  103. package/src/forge/cli/parse.ts +1050 -34
  104. package/src/forge/cli/progress.ts +51 -0
  105. package/src/forge/cli/query.ts +32 -0
  106. package/src/forge/cli/release.ts +35 -11
  107. package/src/forge/cli/rls.ts +43 -4
  108. package/src/forge/cli/run.ts +41 -0
  109. package/src/forge/cli/security.ts +112 -0
  110. package/src/forge/cli/self-host.ts +56 -14
  111. package/src/forge/cli/studio.ts +2218 -0
  112. package/src/forge/cli/verify.ts +1455 -32
  113. package/src/forge/cli/windows.ts +23 -0
  114. package/src/forge/cli/workos.ts +1020 -0
  115. package/src/forge/compiler/agent-contract/build.ts +670 -64
  116. package/src/forge/compiler/agent-contract/types.ts +45 -2
  117. package/src/forge/compiler/ai-registry/parse.ts +71 -2
  118. package/src/forge/compiler/api-surface/build.ts +47 -0
  119. package/src/forge/compiler/app-graph/build.ts +112 -9
  120. package/src/forge/compiler/app-graph/extract.ts +107 -0
  121. package/src/forge/compiler/app-graph/module-graph.ts +73 -78
  122. package/src/forge/compiler/app-graph/parser.ts +24 -24
  123. package/src/forge/compiler/app-graph/profile.ts +26 -0
  124. package/src/forge/compiler/app-graph/versions.ts +1 -1
  125. package/src/forge/compiler/classifier/capabilities.ts +3 -2
  126. package/src/forge/compiler/classifier/classify.ts +32 -8
  127. package/src/forge/compiler/classifier/secrets.ts +3 -2
  128. package/src/forge/compiler/classifier/signals.ts +91 -1
  129. package/src/forge/compiler/client-sdk/build-manifest.ts +59 -0
  130. package/src/forge/compiler/client-sdk/render-client.ts +295 -13
  131. package/src/forge/compiler/data-graph/parse.ts +20 -4
  132. package/src/forge/compiler/data-graph/sql/ddl.ts +144 -31
  133. package/src/forge/compiler/data-graph/sql/serialize.ts +4 -0
  134. package/src/forge/compiler/data-graph/sql/types.ts +1 -0
  135. package/src/forge/compiler/diagnostics/codes.ts +30 -0
  136. package/src/forge/compiler/diagnostics/create.ts +21 -2
  137. package/src/forge/compiler/diagnostics/index.ts +2 -0
  138. package/src/forge/compiler/emitter/barrel.ts +3 -0
  139. package/src/forge/compiler/emitter/render.ts +9 -0
  140. package/src/forge/compiler/external-manifest/registry.ts +205 -0
  141. package/src/forge/compiler/external-manifest/types.ts +91 -0
  142. package/src/forge/compiler/external-manifest/validate.ts +373 -0
  143. package/src/forge/compiler/frontend-graph/build.ts +142 -14
  144. package/src/forge/compiler/integration/add.ts +618 -24
  145. package/src/forge/compiler/integration/plan.ts +43 -12
  146. package/src/forge/compiler/integration/render.ts +29 -0
  147. package/src/forge/compiler/integration/snapshot.ts +2 -0
  148. package/src/forge/compiler/integration/templates/convex.ts +70 -0
  149. package/src/forge/compiler/integration/templates/index.ts +1 -0
  150. package/src/forge/compiler/integration/templates/render.ts +38 -0
  151. package/src/forge/compiler/integration/templates/types.ts +3 -0
  152. package/src/forge/compiler/integration/templates/workos.ts +1219 -0
  153. package/src/forge/compiler/make-registry/build.ts +8 -9
  154. package/src/forge/compiler/orchestrator/fast-check.ts +4 -0
  155. package/src/forge/compiler/orchestrator/generate-lock.ts +14 -3
  156. package/src/forge/compiler/orchestrator/manifest.ts +1 -1
  157. package/src/forge/compiler/orchestrator/plan-profile.ts +23 -0
  158. package/src/forge/compiler/orchestrator/plan.ts +247 -10
  159. package/src/forge/compiler/orchestrator/profile.ts +65 -0
  160. package/src/forge/compiler/orchestrator/run.ts +97 -31
  161. package/src/forge/compiler/orchestrator/serialize.ts +33 -8
  162. package/src/forge/compiler/orchestrator/types.ts +1 -1
  163. package/src/forge/compiler/package-graph/compiler.ts +3 -1
  164. package/src/forge/compiler/package-graph/constants.ts +1 -1
  165. package/src/forge/compiler/package-manager/adapter.ts +4 -1
  166. package/src/forge/compiler/package-manager/commands.ts +4 -0
  167. package/src/forge/compiler/package-manager/executor.ts +30 -1
  168. package/src/forge/compiler/package-manager/version.ts +36 -12
  169. package/src/forge/compiler/package-upgrades/planner.ts +155 -18
  170. package/src/forge/compiler/package-upgrades/types.ts +2 -0
  171. package/src/forge/compiler/policy-registry/build.ts +47 -2
  172. package/src/forge/compiler/policy-registry/parse.ts +32 -2
  173. package/src/forge/compiler/recipes/definitions.ts +63 -0
  174. package/src/forge/compiler/recipes/index.ts +2 -0
  175. package/src/forge/compiler/recipes/registry.ts +6 -0
  176. package/src/forge/compiler/test-graph/build.ts +11 -3
  177. package/src/forge/compiler/types/app-graph.ts +8 -2
  178. package/src/forge/compiler/types/cli.ts +75 -1
  179. package/src/forge/compiler/types/dev-manifest.ts +4 -0
  180. package/src/forge/compiler/types/emit.ts +2 -0
  181. package/src/forge/compiler/types/frontend-graph.ts +2 -2
  182. package/src/forge/compiler/types/integration.ts +1 -0
  183. package/src/forge/compiler/types/package-graph.ts +6 -0
  184. package/src/forge/compiler/types/policy-registry.ts +3 -1
  185. package/src/forge/delta/classifier.ts +52 -0
  186. package/src/forge/delta/explain.ts +238 -0
  187. package/src/forge/delta/git-observer.ts +43 -0
  188. package/src/forge/delta/ids.ts +44 -0
  189. package/src/forge/delta/index.ts +25 -0
  190. package/src/forge/delta/recorder.ts +540 -0
  191. package/src/forge/delta/redaction.ts +50 -0
  192. package/src/forge/delta/schema.ts +240 -0
  193. package/src/forge/delta/session.ts +142 -0
  194. package/src/forge/delta/status.ts +1202 -0
  195. package/src/forge/delta/store.ts +3284 -0
  196. package/src/forge/delta/timeline.ts +178 -0
  197. package/src/forge/dev/server.ts +808 -17
  198. package/src/forge/dev/types.ts +15 -1
  199. package/src/forge/dev/watch.ts +17 -7
  200. package/src/forge/dev-console/cycle.ts +280 -33
  201. package/src/forge/dev-console/types.ts +47 -1
  202. package/src/forge/impact/index.ts +204 -9
  203. package/src/forge/impact/types.ts +33 -1
  204. package/src/forge/intent/index.ts +35 -16
  205. package/src/forge/make/fields.ts +26 -0
  206. package/src/forge/make/index.ts +40 -6
  207. package/src/forge/make/templates.ts +155 -2
  208. package/src/forge/make/types.ts +2 -1
  209. package/src/forge/policy.ts +1 -1
  210. package/src/forge/react/index.ts +160 -2
  211. package/src/forge/refactor/index.ts +1 -0
  212. package/src/forge/repair/rules/index.ts +2 -2
  213. package/src/forge/review/index.ts +158 -12
  214. package/src/forge/review/types.ts +15 -0
  215. package/src/forge/runtime/auth/config.ts +17 -0
  216. package/src/forge/runtime/auth/evaluate.ts +15 -2
  217. package/src/forge/runtime/auth/resolve.ts +61 -6
  218. package/src/forge/runtime/auth/types.ts +1 -0
  219. package/src/forge/runtime/db/factory.ts +1 -3
  220. package/src/forge/runtime/db/generated-client.ts +13 -2
  221. package/src/forge/runtime/db/memory-adapter.ts +139 -32
  222. package/src/forge/runtime/db/pglite-adapter.ts +263 -2
  223. package/src/forge/runtime/db/postgres-adapter.ts +6 -3
  224. package/src/forge/runtime/executor.ts +129 -16
  225. package/src/forge/runtime/external/bridge.ts +649 -0
  226. package/src/forge/runtime/runner/run-entry.ts +16 -7
  227. package/src/forge/runtime/telemetry/buffer.ts +4 -1
  228. package/src/forge/runtime/telemetry/scrubber.ts +35 -5
  229. package/src/forge/runtime/webhooks/security.ts +12 -7
  230. package/src/forge/server.ts +17 -3
  231. package/src/forge/ui/index.ts +209 -0
  232. package/src/forge/ui/types.ts +1 -0
  233. package/src/forge/version.ts +1 -1
  234. package/src/forge/vue/index.ts +422 -0
  235. package/src/forge/workspace/baseline.ts +112 -0
  236. package/src/forge/workspace/change-summary.ts +250 -0
  237. package/src/forge/workspace/forge-cli.ts +42 -0
  238. package/src/forge/workspace/git-summary.ts +391 -0
  239. package/templates/agent-workroom/AGENTS.md +29 -0
  240. package/templates/agent-workroom/README.md +34 -0
  241. package/templates/agent-workroom/forge.config.ts +3 -0
  242. package/templates/agent-workroom/package.json +33 -0
  243. package/templates/agent-workroom/src/actions/indexAgentSignal.ts +10 -0
  244. package/templates/agent-workroom/src/commands/openWorkroom.ts +61 -0
  245. package/templates/agent-workroom/src/commands/recordAgentSignal.ts +119 -0
  246. package/templates/agent-workroom/src/commands/recordCheckRun.ts +52 -0
  247. package/templates/agent-workroom/src/forge/schema.ts +54 -0
  248. package/templates/agent-workroom/src/policies.ts +6 -0
  249. package/templates/agent-workroom/src/queries/listWorkrooms.ts +11 -0
  250. package/templates/agent-workroom/src/queries/liveWorkroom.ts +63 -0
  251. package/templates/agent-workroom/tsconfig.json +16 -0
  252. package/templates/agent-workroom/web/index.html +12 -0
  253. package/templates/agent-workroom/web/package.json +21 -0
  254. package/templates/agent-workroom/web/src/App.tsx +345 -0
  255. package/templates/agent-workroom/web/src/lib/forge.ts +13 -0
  256. package/templates/agent-workroom/web/src/main.tsx +13 -0
  257. package/templates/agent-workroom/web/src/styles.css +545 -0
  258. package/templates/agent-workroom/web/tsconfig.json +27 -0
  259. package/templates/b2b-support-web/package.json +1 -0
  260. package/templates/b2b-support-web/web/package.json +1 -1
  261. package/templates/minimal-web/package.json +1 -1
  262. package/templates/minimal-web/web/package.json +2 -2
  263. package/templates/nuxt-web/.vscode/settings.json +14 -0
  264. package/templates/nuxt-web/README.md +30 -0
  265. package/templates/nuxt-web/forge.config.ts +3 -0
  266. package/templates/nuxt-web/package.json +33 -0
  267. package/templates/nuxt-web/src/actions/logNoteCreated.ts +11 -0
  268. package/templates/nuxt-web/src/commands/createNote.ts +26 -0
  269. package/templates/nuxt-web/src/forge/schema.ts +12 -0
  270. package/templates/nuxt-web/src/policies.ts +6 -0
  271. package/templates/nuxt-web/src/queries/listNotes.ts +8 -0
  272. package/templates/nuxt-web/src/queries/liveNotes.ts +8 -0
  273. package/templates/nuxt-web/tsconfig.json +17 -0
  274. package/templates/nuxt-web/web/app.vue +67 -0
  275. package/templates/nuxt-web/web/components/LiveNotes.vue +89 -0
  276. package/templates/nuxt-web/web/components/NoteComposer.vue +100 -0
  277. package/templates/nuxt-web/web/composables/forge.ts +13 -0
  278. package/templates/nuxt-web/web/composables/useNotes.ts +24 -0
  279. package/templates/nuxt-web/web/nuxt.config.ts +11 -0
  280. package/templates/nuxt-web/web/package.json +18 -0
  281. package/templates/nuxt-web/web/plugins/forge.client.ts +10 -0
  282. package/templates/nuxt-web/web/plugins/forge.server.ts +10 -0
  283. package/templates/nuxt-web/web/server/api/forge-health.get.ts +7 -0
  284. package/templates/nuxt-web/web/tsconfig.json +6 -0
  285. package/src/forge/_generated/actionSubscriptions.json +0 -2
  286. package/src/forge/_generated/actionSubscriptions.ts +0 -10
  287. package/src/forge/_generated/agentAdapterManifest.json +0 -2
  288. package/src/forge/_generated/agentAdapterManifest.ts +0 -73
  289. package/src/forge/_generated/agentContract.json +0 -2
  290. package/src/forge/_generated/agentContract.ts +0 -7829
  291. package/src/forge/_generated/agentQuickstart.md +0 -34
  292. package/src/forge/_generated/agentTools.json +0 -2
  293. package/src/forge/_generated/agentTools.md +0 -16
  294. package/src/forge/_generated/agentTools.ts +0 -12
  295. package/src/forge/_generated/aiContext.ts +0 -125
  296. package/src/forge/_generated/aiModels.json +0 -2
  297. package/src/forge/_generated/aiModels.ts +0 -51
  298. package/src/forge/_generated/aiProviders.json +0 -2
  299. package/src/forge/_generated/aiProviders.ts +0 -23
  300. package/src/forge/_generated/aiRegistry.json +0 -2
  301. package/src/forge/_generated/aiRegistry.ts +0 -31
  302. package/src/forge/_generated/api.json +0 -2
  303. package/src/forge/_generated/api.ts +0 -8
  304. package/src/forge/_generated/appGraph.json +0 -2
  305. package/src/forge/_generated/appGraph.ts +0 -14919
  306. package/src/forge/_generated/appMap.md +0 -55
  307. package/src/forge/_generated/artifactManifest.json +0 -2
  308. package/src/forge/_generated/artifactManifest.ts +0 -7
  309. package/src/forge/_generated/authClaims.json +0 -2
  310. package/src/forge/_generated/authClaims.ts +0 -13
  311. package/src/forge/_generated/authConfig.json +0 -2
  312. package/src/forge/_generated/authConfig.ts +0 -17
  313. package/src/forge/_generated/authContext.ts +0 -23
  314. package/src/forge/_generated/authRegistry.json +0 -2
  315. package/src/forge/_generated/authRegistry.ts +0 -25
  316. package/src/forge/_generated/buildInfo.json +0 -2
  317. package/src/forge/_generated/buildInfo.ts +0 -9
  318. package/src/forge/_generated/capabilityMap.json +0 -2
  319. package/src/forge/_generated/capabilityMap.md +0 -15
  320. package/src/forge/_generated/capabilityMap.ts +0 -17
  321. package/src/forge/_generated/client.ts +0 -282
  322. package/src/forge/_generated/clientApi.ts +0 -9
  323. package/src/forge/_generated/clientManifest.json +0 -2
  324. package/src/forge/_generated/clientManifest.ts +0 -39
  325. package/src/forge/_generated/clientTypes.ts +0 -78
  326. package/src/forge/_generated/configRegistry.json +0 -2
  327. package/src/forge/_generated/configRegistry.ts +0 -4
  328. package/src/forge/_generated/dataGraph.json +0 -2
  329. package/src/forge/_generated/dataGraph.ts +0 -8
  330. package/src/forge/_generated/db.json +0 -2
  331. package/src/forge/_generated/db.ts +0 -2
  332. package/src/forge/_generated/dbSecurityManifest.json +0 -2
  333. package/src/forge/_generated/dbSecurityManifest.ts +0 -15
  334. package/src/forge/_generated/dbSessionContext.json +0 -2
  335. package/src/forge/_generated/dbSessionContext.ts +0 -39
  336. package/src/forge/_generated/deployManifest.json +0 -2
  337. package/src/forge/_generated/deployManifest.ts +0 -14
  338. package/src/forge/_generated/devManifest.json +0 -2
  339. package/src/forge/_generated/devManifest.ts +0 -62
  340. package/src/forge/_generated/envSchema.json +0 -2
  341. package/src/forge/_generated/envSchema.ts +0 -59
  342. package/src/forge/_generated/frontendGraph.json +0 -2
  343. package/src/forge/_generated/frontendGraph.ts +0 -27
  344. package/src/forge/_generated/importGuards.json +0 -2
  345. package/src/forge/_generated/importGuards.ts +0 -686
  346. package/src/forge/_generated/index.ts +0 -68
  347. package/src/forge/_generated/liveProductionManifest.json +0 -2
  348. package/src/forge/_generated/liveProductionManifest.ts +0 -23
  349. package/src/forge/_generated/liveProtocol.json +0 -2
  350. package/src/forge/_generated/liveProtocol.ts +0 -21
  351. package/src/forge/_generated/liveQueryRegistry.json +0 -2
  352. package/src/forge/_generated/liveQueryRegistry.ts +0 -9
  353. package/src/forge/_generated/liveTransportConfig.json +0 -2
  354. package/src/forge/_generated/liveTransportConfig.ts +0 -19
  355. package/src/forge/_generated/makeRegistry.json +0 -2
  356. package/src/forge/_generated/makeRegistry.ts +0 -177
  357. package/src/forge/_generated/makeTemplates.json +0 -2
  358. package/src/forge/_generated/makeTemplates.ts +0 -66
  359. package/src/forge/_generated/mockMap.json +0 -2
  360. package/src/forge/_generated/mockMap.ts +0 -7
  361. package/src/forge/_generated/operationPlaybooks.md +0 -167
  362. package/src/forge/_generated/packageGraph.json +0 -2
  363. package/src/forge/_generated/packageGraph.ts +0 -249334
  364. package/src/forge/_generated/packageUpgradeRegistry.json +0 -2
  365. package/src/forge/_generated/packageUpgradeRegistry.ts +0 -15
  366. package/src/forge/_generated/permissionMatrix.json +0 -2
  367. package/src/forge/_generated/permissionMatrix.ts +0 -7
  368. package/src/forge/_generated/policyRegistry.json +0 -2
  369. package/src/forge/_generated/policyRegistry.ts +0 -11
  370. package/src/forge/_generated/queryRegistry.json +0 -2
  371. package/src/forge/_generated/queryRegistry.ts +0 -9
  372. package/src/forge/_generated/react.d.ts +0 -22
  373. package/src/forge/_generated/react.ts +0 -29
  374. package/src/forge/_generated/reactManifest.json +0 -2
  375. package/src/forge/_generated/reactManifest.ts +0 -19
  376. package/src/forge/_generated/rlsPolicies.json +0 -2
  377. package/src/forge/_generated/rlsPolicies.sql +0 -34
  378. package/src/forge/_generated/rlsPolicies.ts +0 -6
  379. package/src/forge/_generated/runtimeGraph.json +0 -2
  380. package/src/forge/_generated/runtimeGraph.ts +0 -8
  381. package/src/forge/_generated/runtimeMatrix.json +0 -2
  382. package/src/forge/_generated/runtimeMatrix.ts +0 -334130
  383. package/src/forge/_generated/runtimeRegistry.ts +0 -2
  384. package/src/forge/_generated/runtimeRules.md +0 -91
  385. package/src/forge/_generated/secretRegistry.json +0 -2
  386. package/src/forge/_generated/secretRegistry.ts +0 -50
  387. package/src/forge/_generated/secretsContext.ts +0 -11
  388. package/src/forge/_generated/serverApi.ts +0 -10
  389. package/src/forge/_generated/sourceMapManifest.json +0 -2
  390. package/src/forge/_generated/sourceMapManifest.ts +0 -7
  391. package/src/forge/_generated/sqlPlan.json +0 -2
  392. package/src/forge/_generated/sqlPlan.ts +0 -88
  393. package/src/forge/_generated/subscriptionManifest.json +0 -2
  394. package/src/forge/_generated/subscriptionManifest.ts +0 -7
  395. package/src/forge/_generated/symbolicationManifest.json +0 -2
  396. package/src/forge/_generated/symbolicationManifest.ts +0 -17
  397. package/src/forge/_generated/telemetryRegistry.json +0 -2
  398. package/src/forge/_generated/telemetryRegistry.ts +0 -9
  399. package/src/forge/_generated/telemetrySinks.json +0 -2
  400. package/src/forge/_generated/telemetrySinks.ts +0 -11
  401. package/src/forge/_generated/tenantScope.json +0 -2
  402. package/src/forge/_generated/tenantScope.ts +0 -8
  403. package/src/forge/_generated/testGraph.json +0 -2
  404. package/src/forge/_generated/testGraph.ts +0 -3430
  405. package/src/forge/_generated/testPlanRegistry.json +0 -2
  406. package/src/forge/_generated/testPlanRegistry.ts +0 -33
  407. package/src/forge/_generated/uiRoutes.json +0 -2
  408. package/src/forge/_generated/uiRoutes.ts +0 -16
  409. package/src/forge/_generated/uiScenarios.json +0 -2
  410. package/src/forge/_generated/uiScenarios.ts +0 -30
  411. package/src/forge/_generated/uiTestManifest.json +0 -2
  412. package/src/forge/_generated/uiTestManifest.ts +0 -27
  413. package/src/forge/_generated/workflowRegistry.json +0 -2
  414. package/src/forge/_generated/workflowRegistry.ts +0 -9
  415. package/src/forge/_generated/workflowSubscriptions.json +0 -2
  416. package/src/forge/_generated/workflowSubscriptions.ts +0 -10
@@ -102,17 +102,138 @@ function readPackageJson(workspaceRoot: string): {
102
102
  };
103
103
  }
104
104
 
105
- function dependencyType(workspaceRoot: string, packageName: string): "dependency" | "devDependency" {
105
+ type DependencyType = "dependency" | "devDependency";
106
+
107
+ interface NpmAliasSpec {
108
+ packageName: string;
109
+ versionOrRange?: string;
110
+ }
111
+
112
+ interface PackageResolution {
113
+ requestedName: string;
114
+ packageName: string;
115
+ dependencyName: string;
116
+ dependencySpec?: string;
117
+ dependencyType: DependencyType;
118
+ isNpmAlias: boolean;
119
+ current: PackageApi;
120
+ }
121
+
122
+ function matchesPackageName(candidate: PackageApi, packageName: string): boolean {
123
+ return candidate.name === packageName || candidate.packageName === packageName;
124
+ }
125
+
126
+ function parseNpmAliasSpec(spec: string): NpmAliasSpec | null {
127
+ if (!spec.startsWith("npm:")) {
128
+ return null;
129
+ }
130
+ const target = spec.slice("npm:".length);
131
+ if (!target) {
132
+ return null;
133
+ }
134
+ const separator =
135
+ target.startsWith("@")
136
+ ? target.indexOf("@", target.indexOf("/") + 1)
137
+ : target.indexOf("@");
138
+ if (separator === -1) {
139
+ return { packageName: target };
140
+ }
141
+ return {
142
+ packageName: target.slice(0, separator),
143
+ versionOrRange: target.slice(separator + 1),
144
+ };
145
+ }
146
+
147
+ function dependencyEntries(
148
+ pkg: ReturnType<typeof readPackageJson>,
149
+ ): Array<{ type: DependencyType; name: string; spec: string }> {
150
+ return [
151
+ ...Object.entries(pkg.dependencies ?? {}).map(([name, spec]) => ({
152
+ type: "dependency" as const,
153
+ name,
154
+ spec,
155
+ })),
156
+ ...Object.entries(pkg.devDependencies ?? {}).map(([name, spec]) => ({
157
+ type: "devDependency" as const,
158
+ name,
159
+ spec,
160
+ })),
161
+ ];
162
+ }
163
+
164
+ function dependencyType(workspaceRoot: string, packageName: string): DependencyType {
106
165
  const pkg = readPackageJson(workspaceRoot);
107
166
  if (packageName in (pkg.devDependencies ?? {})) {
108
167
  return "devDependency";
109
168
  }
169
+ for (const entry of dependencyEntries(pkg)) {
170
+ const alias = parseNpmAliasSpec(entry.spec);
171
+ if (alias?.packageName === packageName) {
172
+ return entry.type;
173
+ }
174
+ }
110
175
  return "dependency";
111
176
  }
112
177
 
113
- function currentPackageApi(workspaceRoot: string, packageName: string): PackageApi | null {
178
+ function resolvePackageForUpgrade(workspaceRoot: string, requestedName: string): PackageResolution | null {
114
179
  const graph = readGeneratedJson<PackageGraph>(workspaceRoot, `${GENERATED_DIR}/packageGraph.json`);
115
- return graph?.packages.find((pkg) => pkg.name === packageName) ?? null;
180
+ if (!graph) {
181
+ return null;
182
+ }
183
+ const pkg = readPackageJson(workspaceRoot);
184
+ const entries = dependencyEntries(pkg);
185
+
186
+ const aliasEntry = entries.find((entry) => {
187
+ const alias = parseNpmAliasSpec(entry.spec);
188
+ return entry.name === requestedName || alias?.packageName === requestedName;
189
+ });
190
+ if (aliasEntry) {
191
+ const alias = parseNpmAliasSpec(aliasEntry.spec);
192
+ const packageName = alias?.packageName ?? aliasEntry.name;
193
+ const current = graph.packages.find((candidate) => matchesPackageName(candidate, packageName)) ??
194
+ graph.packages.find((candidate) => candidate.name === aliasEntry.name);
195
+ if (current) {
196
+ return {
197
+ requestedName,
198
+ packageName,
199
+ dependencyName: aliasEntry.name,
200
+ dependencySpec: aliasEntry.spec,
201
+ dependencyType: aliasEntry.type,
202
+ isNpmAlias: Boolean(alias),
203
+ current,
204
+ };
205
+ }
206
+ }
207
+
208
+ const current = graph.packages.find((candidate) => matchesPackageName(candidate, requestedName));
209
+ if (!current) {
210
+ return null;
211
+ }
212
+ const directEntry = entries.find((entry) => {
213
+ const alias = parseNpmAliasSpec(entry.spec);
214
+ return entry.name === requestedName || alias?.packageName === requestedName;
215
+ });
216
+ const alias = directEntry ? parseNpmAliasSpec(directEntry.spec) : null;
217
+ const packageName = alias?.packageName ?? current.packageName ?? requestedName;
218
+ return {
219
+ requestedName,
220
+ packageName,
221
+ dependencyName: directEntry?.name ?? requestedName,
222
+ dependencySpec: directEntry?.spec,
223
+ dependencyType: directEntry?.type ?? dependencyType(workspaceRoot, requestedName),
224
+ isNpmAlias: Boolean(alias),
225
+ current,
226
+ };
227
+ }
228
+
229
+ function packageSpecForDependency(
230
+ resolution: Pick<PackageResolution, "packageName" | "dependencyName" | "isNpmAlias">,
231
+ version: string,
232
+ ): string {
233
+ if (resolution.isNpmAlias) {
234
+ return `${resolution.dependencyName}@npm:${resolution.packageName}@${version}`;
235
+ }
236
+ return `${resolution.packageName}@${version}`;
116
237
  }
117
238
 
118
239
  function fixtureMetadata(registryDir: string | undefined, packageName: string): {
@@ -348,9 +469,9 @@ export async function createUpgradePlan(
348
469
  ): Promise<UpgradePlannerResult> {
349
470
  const diagnostics: Diagnostic[] = [];
350
471
  const packageManager = detectPackageManager(options.workspaceRoot);
351
- const current = currentPackageApi(options.workspaceRoot, options.packageName);
472
+ const resolution = resolvePackageForUpgrade(options.workspaceRoot, options.packageName);
352
473
 
353
- if (!current) {
474
+ if (!resolution) {
354
475
  return {
355
476
  ok: false,
356
477
  diagnostics: [
@@ -363,10 +484,11 @@ export async function createUpgradePlan(
363
484
  exitCode: 1,
364
485
  };
365
486
  }
487
+ const current = resolution.current;
366
488
 
367
489
  const targetInfo = await resolveTargetVersion({
368
490
  workspaceRoot: options.workspaceRoot,
369
- packageName: options.packageName,
491
+ packageName: resolution.packageName,
370
492
  currentVersion: current.version,
371
493
  target: options.target,
372
494
  registryDir: options.registryDir ?? process.env.FORGE_DEPS_REGISTRY_DIR,
@@ -388,7 +510,7 @@ export async function createUpgradePlan(
388
510
 
389
511
  const analyzed = await analyzeTargetPackage({
390
512
  workspaceRoot: options.workspaceRoot,
391
- packageName: options.packageName,
513
+ packageName: resolution.packageName,
392
514
  versionInfo: targetInfo,
393
515
  packageManager,
394
516
  registryDir: options.registryDir ?? process.env.FORGE_DEPS_REGISTRY_DIR,
@@ -398,7 +520,7 @@ export async function createUpgradePlan(
398
520
  return { ok: false, diagnostics, exitCode: 1 };
399
521
  }
400
522
 
401
- const recipe = resolveByPackageName(options.packageName) ?? undefined;
523
+ const recipe = resolveByPackageName(resolution.packageName) ?? undefined;
402
524
  const currentClassified = { api: current, classification: classify(current, recipe), recipe };
403
525
  const targetClassified = {
404
526
  api: analyzed.api,
@@ -425,7 +547,7 @@ export async function createUpgradePlan(
425
547
  }
426
548
 
427
549
  const affected = analyzeUpgradeImpact({
428
- packageName: options.packageName,
550
+ packageName: resolution.packageName,
429
551
  appGraph,
430
552
  runtimeGraph,
431
553
  queryRegistry,
@@ -436,21 +558,35 @@ export async function createUpgradePlan(
436
558
  const bump = semverBump(current.version, analyzed.api.version);
437
559
  const risk = buildRiskReport({ bump, apiDiff, runtimeDiff, affected });
438
560
  const commands = recommendedCommands(affected);
561
+ const toInfo = {
562
+ ...targetInfo,
563
+ version: analyzed.api.version,
564
+ spec: packageSpecForDependency(resolution, analyzed.api.version),
565
+ };
439
566
  const planDir = packagePlanDir(
440
567
  options.workspaceRoot,
441
- options.packageName,
568
+ resolution.dependencyName,
442
569
  current.version,
443
570
  analyzed.api.version,
444
571
  );
445
- const id = `${packageKey(options.packageName)}-${current.version}-to-${analyzed.api.version}`;
572
+ const id = `${packageKey(resolution.dependencyName)}-${current.version}-to-${analyzed.api.version}`;
446
573
  const plan: PackageUpgradePlan = {
447
574
  schemaVersion: "0.1.0",
448
575
  plannerVersion: GENERATOR_VERSION,
449
576
  id,
450
- packageName: options.packageName,
577
+ packageName: resolution.packageName,
578
+ ...(resolution.requestedName !== resolution.packageName
579
+ ? { requestedPackageName: resolution.requestedName }
580
+ : {}),
581
+ ...(resolution.isNpmAlias ? { dependencyAlias: resolution.dependencyName } : {}),
451
582
  ...(recipe?.alias ? { integrationAlias: recipe.alias } : {}),
452
- from: { version: current.version, spec: `${options.packageName}@${current.version}` },
453
- to: { ...targetInfo, version: analyzed.api.version },
583
+ from: {
584
+ version: current.version,
585
+ spec: resolution.isNpmAlias
586
+ ? packageSpecForDependency(resolution, current.version)
587
+ : `${resolution.packageName}@${current.version}`,
588
+ },
589
+ to: toInfo,
454
590
  packageManager,
455
591
  semver: {
456
592
  bump,
@@ -512,18 +648,19 @@ export function listOutdatedFromFixture(options: {
512
648
 
513
649
  return graph.packages
514
650
  .flatMap((pkg) => {
515
- const metadata = fixtureMetadata(registryDir, pkg.name);
651
+ const packageName = pkg.packageName ?? pkg.name;
652
+ const metadata = fixtureMetadata(registryDir, packageName);
516
653
  const latest = metadata?.["dist-tags"]?.latest;
517
654
  if (!latest || latest === pkg.version) {
518
655
  return [];
519
656
  }
520
- const recipe = resolveByPackageName(pkg.name);
657
+ const recipe = resolveByPackageName(packageName);
521
658
  return [{
522
- name: pkg.name,
659
+ name: packageName,
523
660
  current: pkg.version,
524
661
  wanted: latest,
525
662
  latest,
526
- type: dependencyType(options.workspaceRoot, pkg.name),
663
+ type: dependencyType(options.workspaceRoot, packageName),
527
664
  managedByRecipe: Boolean(recipe),
528
665
  ...(recipe?.alias ? { recipe: recipe.alias } : {}),
529
666
  }];
@@ -146,6 +146,8 @@ export interface PackageUpgradePlan {
146
146
  plannerVersion: string;
147
147
  id: string;
148
148
  packageName: string;
149
+ requestedPackageName?: string;
150
+ dependencyAlias?: string;
149
151
  integrationAlias?: string;
150
152
  from: PackageVersionInfo;
151
153
  to: PackageVersionInfo;
@@ -11,6 +11,7 @@ import { hashStable } from "../primitives/hash.ts";
11
11
  import { canonicalJson } from "../primitives/serialize.ts";
12
12
  import type { AppGraph } from "../types/app-graph.ts";
13
13
  import type { DataGraph } from "../types/data-graph.ts";
14
+ import type { ForgeExternalServiceGraph } from "../external-manifest/types.ts";
14
15
  import type {
15
16
  CommandAuthBinding,
16
17
  PermissionMatrix,
@@ -56,15 +57,29 @@ function stableSortQueryAuth(bindings: QueryAuthBinding[]): QueryAuthBinding[] {
56
57
 
57
58
  function buildPermissionMatrix(policies: PolicyRule[]): PermissionMatrixEntry[] {
58
59
  return policies
59
- .filter((policy) => policy.kind === "roles")
60
+ .filter((policy) => policy.kind === "roles" || policy.kind === "permissions")
60
61
  .map((policy) => ({
61
62
  policy: policy.name,
62
63
  roles: [...policy.roles].sort(),
64
+ permissions: [...policy.permissions].sort(),
63
65
  }))
64
66
  .sort((a, b) => (a.policy < b.policy ? -1 : a.policy > b.policy ? 1 : 0));
65
67
  }
66
68
 
67
- export function buildPolicyRegistry(appGraph: AppGraph): PolicyRegistry {
69
+ function authFromExternalPolicy(policy: string | undefined): CommandAuthBinding["auth"] {
70
+ if (!policy) {
71
+ return { kind: "public" };
72
+ }
73
+ if (policy === "public" || policy === "system" || policy === "user") {
74
+ return { kind: policy };
75
+ }
76
+ return { kind: "policy", policy };
77
+ }
78
+
79
+ export function buildPolicyRegistry(
80
+ appGraph: AppGraph,
81
+ externalServices?: ForgeExternalServiceGraph,
82
+ ): PolicyRegistry {
68
83
  const policies: PolicyRule[] = [];
69
84
  const commandAuth: CommandAuthBinding[] = [];
70
85
  const queryAuth: QueryAuthBinding[] = [];
@@ -84,6 +99,7 @@ export function buildPolicyRegistry(appGraph: AppGraph): PolicyRegistry {
84
99
  name: parsed.name,
85
100
  kind: parsed.kind,
86
101
  roles: parsed.roles,
102
+ permissions: parsed.permissions,
87
103
  file: symbol.file,
88
104
  symbolId: symbol.id,
89
105
  };
@@ -152,6 +168,28 @@ export function buildPolicyRegistry(appGraph: AppGraph): PolicyRegistry {
152
168
  }
153
169
  }
154
170
 
171
+ for (const service of externalServices?.services ?? []) {
172
+ for (const entry of service.entries) {
173
+ const qualifiedName = `${service.name}.${entry.name}`;
174
+ const binding = {
175
+ file: `external:${service.name}`,
176
+ symbolId: `external:${service.name}:${entry.kind}:${entry.name}`,
177
+ auth: authFromExternalPolicy(entry.policy),
178
+ };
179
+ if (entry.kind === "command") {
180
+ commandAuth.push({
181
+ commandName: qualifiedName,
182
+ ...binding,
183
+ });
184
+ } else {
185
+ queryAuth.push({
186
+ queryName: qualifiedName,
187
+ ...binding,
188
+ });
189
+ }
190
+ }
191
+ }
192
+
155
193
  const sortedPolicies = stableSortPolicies(policies);
156
194
  const sortedCommandAuth = stableSortCommandAuth(commandAuth);
157
195
  const sortedQueryAuth = stableSortQueryAuth(queryAuth);
@@ -167,6 +205,9 @@ export function buildPolicyRegistry(appGraph: AppGraph): PolicyRegistry {
167
205
  code: FORGE_POLICY_UNKNOWN,
168
206
  message: `command '${binding.commandName}' references unknown policy '${binding.auth.policy}'`,
169
207
  file: binding.file,
208
+ fixHint: binding.file.startsWith("external:")
209
+ ? "Define this policy in the Forge app or change the external manifest policy to public, user, or system."
210
+ : undefined,
170
211
  }),
171
212
  );
172
213
  }
@@ -183,6 +224,9 @@ export function buildPolicyRegistry(appGraph: AppGraph): PolicyRegistry {
183
224
  code: FORGE_POLICY_UNKNOWN,
184
225
  message: `query '${binding.queryName}' references unknown policy '${binding.auth.policy}'`,
185
226
  file: binding.file,
227
+ fixHint: binding.file.startsWith("external:")
228
+ ? "Define this policy in the Forge app or change the external manifest policy to public, user, or system."
229
+ : undefined,
186
230
  }),
187
231
  );
188
232
  }
@@ -195,6 +239,7 @@ export function buildPolicyRegistry(appGraph: AppGraph): PolicyRegistry {
195
239
  inputHash: hashStable(
196
240
  canonicalJson({
197
241
  appInputHash: appGraph.inputHash,
242
+ externalInputHash: externalServices?.inputHash ?? "",
198
243
  analyzerVersion: POLICY_REGISTRY_ANALYZER_VERSION,
199
244
  }),
200
245
  ),
@@ -1,5 +1,7 @@
1
1
  const POLICY_ROLE_PATTERN =
2
2
  /["']([^"']+)["']\s*:\s*canRole\s*\(\s*([^)]*)\)/g;
3
+ const POLICY_PERMISSION_PATTERN =
4
+ /["']([^"']+)["']\s*:\s*canPermission\s*\(\s*([^)]*)\)/g;
3
5
 
4
6
  const COMMAND_AUTH_CAN_PATTERN = /auth\s*:\s*can\s*\(\s*["']([^"']+)["']\s*\)/;
5
7
  const COMMAND_AUTH_PUBLIC_PATTERN = /auth\s*:\s*public_\s*\(\s*\)/;
@@ -16,15 +18,28 @@ function parseRolesFromCanRoleArg(arg: string): string[] {
16
18
  return roles;
17
19
  }
18
20
 
21
+ function parseStringsFromArg(arg: string): string[] {
22
+ const values: string[] = [];
23
+ for (const match of arg.matchAll(/["']([^"']+)["']/g)) {
24
+ const value = match[1];
25
+ if (value && !values.includes(value)) {
26
+ values.push(value);
27
+ }
28
+ }
29
+ return values;
30
+ }
31
+
19
32
  export function parsePoliciesFromSlice(sourceSlice: string): Array<{
20
33
  name: string;
21
- kind: "roles" | "public" | "system";
34
+ kind: "roles" | "permissions" | "public" | "system";
22
35
  roles: string[];
36
+ permissions: string[];
23
37
  }> {
24
38
  const policies: Array<{
25
39
  name: string;
26
- kind: "roles" | "public" | "system";
40
+ kind: "roles" | "permissions" | "public" | "system";
27
41
  roles: string[];
42
+ permissions: string[];
28
43
  }> = [];
29
44
 
30
45
  for (const match of sourceSlice.matchAll(POLICY_ROLE_PATTERN)) {
@@ -37,6 +52,21 @@ export function parsePoliciesFromSlice(sourceSlice: string): Array<{
37
52
  name,
38
53
  kind: "roles",
39
54
  roles: parseRolesFromCanRoleArg(rolesArg),
55
+ permissions: [],
56
+ });
57
+ }
58
+
59
+ for (const match of sourceSlice.matchAll(POLICY_PERMISSION_PATTERN)) {
60
+ const name = match[1];
61
+ const permissionsArg = match[2] ?? "";
62
+ if (!name) {
63
+ continue;
64
+ }
65
+ policies.push({
66
+ name,
67
+ kind: "permissions",
68
+ roles: [],
69
+ permissions: parseStringsFromArg(permissionsArg),
40
70
  });
41
71
  }
42
72
 
@@ -190,6 +190,67 @@ export const ZOD_RECIPE: IntegrationRecipe = {
190
190
  docs: ["zod.md"],
191
191
  };
192
192
 
193
+ export const CONVEX_RECIPE: IntegrationRecipe = {
194
+ alias: "convex",
195
+ packages: [{ packageName: "convex" }],
196
+ supportedVersionRange: ">=1.0.0",
197
+ recipeVersion: "1.0.0",
198
+ contexts: {
199
+ allowed: ["client", "server", "action", "workflow", "endpoint", "test", "build"],
200
+ denied: ["shared", "query", "liveQuery", "command", "edge"],
201
+ },
202
+ capabilities: networkCapability(
203
+ ["*.convex.cloud", "*.convex.site"],
204
+ ["recipe:convex", "Convex client/server package connects to Convex deployments"],
205
+ ),
206
+ secrets: [
207
+ secret("NEXT_PUBLIC_CONVEX_URL", false),
208
+ secret("CONVEX_URL", false),
209
+ secret("CONVEX_DEPLOYMENT", false),
210
+ secret("CONVEX_DEPLOY_KEY", false),
211
+ ],
212
+ adapters: [],
213
+ testkits: ["convex.mock.ts"],
214
+ docs: ["convex.md"],
215
+ };
216
+
217
+ export const WORKOS_RECIPE: IntegrationRecipe = {
218
+ alias: "workos",
219
+ packages: [{ packageName: "@workos-inc/node" }],
220
+ supportedVersionRange: ">=10.0.0",
221
+ recipeVersion: "1.0.0",
222
+ contexts: {
223
+ allowed: ["server", "action", "workflow", "endpoint", "test", "build"],
224
+ denied: ["shared", "client", "query", "liveQuery", "command", "edge"],
225
+ },
226
+ capabilities: networkCapability(
227
+ ["api.workos.com"],
228
+ ["recipe:workos", "WorkOS SDK calls AuthKit, Organizations, Admin Portal, and FGA APIs"],
229
+ ),
230
+ secrets: [
231
+ secret("WORKOS_API_KEY"),
232
+ secret("WORKOS_CLIENT_ID"),
233
+ secret("WORKOS_COOKIE_PASSWORD"),
234
+ secret("WORKOS_REDIRECT_URI", false),
235
+ secret("WORKOS_WEBHOOK_SECRET", false),
236
+ ],
237
+ adapters: ["workos.server.ts"],
238
+ integrations: [
239
+ "workos/authkit.ts",
240
+ "workos/auth-routes.ts",
241
+ "workos/fga.ts",
242
+ "workos/http-handler.ts",
243
+ "workos/resource-map.ts",
244
+ "workos/seed.ts",
245
+ "workos/session.ts",
246
+ "workos/webhook.ts",
247
+ "workos/workos-seed.yml",
248
+ ],
249
+ rootFiles: [".env.example", "src/policies.workos.ts", "web/src/lib/workos-auth.tsx", "workos-seed.yml"],
250
+ testkits: ["workos.mock.ts"],
251
+ docs: ["workos.md"],
252
+ };
253
+
193
254
  export const FORGE_RECIPE: IntegrationRecipe = {
194
255
  alias: "forge",
195
256
  packages: [{ packageName: "forge" }],
@@ -283,6 +344,8 @@ export const REFERENCE_ALIASES = [
283
344
  "posthog",
284
345
  "sentry",
285
346
  "zod",
347
+ "convex",
348
+ "workos",
286
349
  "ai",
287
350
  ] as const;
288
351
 
@@ -15,6 +15,8 @@ export {
15
15
  POSTHOG_RECIPE,
16
16
  SENTRY_RECIPE,
17
17
  ZOD_RECIPE,
18
+ CONVEX_RECIPE,
19
+ WORKOS_RECIPE,
18
20
  AI_RECIPE,
19
21
  AI_PROVIDER_RECIPES,
20
22
  } from "./definitions.ts";
@@ -3,11 +3,13 @@ import type { PackageRecipe } from "../types/integration.ts";
3
3
  import {
4
4
  AI_PROVIDER_RECIPES,
5
5
  AI_RECIPE,
6
+ CONVEX_RECIPE,
6
7
  FORGE_RECIPE,
7
8
  POSTHOG_RECIPE,
8
9
  REFERENCE_ALIASES,
9
10
  SENTRY_RECIPE,
10
11
  STRIPE_RECIPE,
12
+ WORKOS_RECIPE,
11
13
  ZOD_RECIPE,
12
14
  } from "./definitions.ts";
13
15
 
@@ -23,6 +25,8 @@ const REFERENCE_RECIPES: Record<string, IntegrationRecipe> = {
23
25
  posthog: POSTHOG_RECIPE,
24
26
  sentry: SENTRY_RECIPE,
25
27
  zod: ZOD_RECIPE,
28
+ convex: CONVEX_RECIPE,
29
+ workos: WORKOS_RECIPE,
26
30
  forge: FORGE_RECIPE,
27
31
  ai: AI_RECIPE,
28
32
  };
@@ -32,6 +36,8 @@ const ALL_RECIPES: IntegrationRecipe[] = [
32
36
  POSTHOG_RECIPE,
33
37
  SENTRY_RECIPE,
34
38
  ZOD_RECIPE,
39
+ CONVEX_RECIPE,
40
+ WORKOS_RECIPE,
35
41
  FORGE_RECIPE,
36
42
  AI_RECIPE,
37
43
  ...AI_PROVIDER_RECIPES,
@@ -16,6 +16,14 @@ import type {
16
16
 
17
17
  const TEST_RE = /\.(test|spec)\.(ts|tsx)$/;
18
18
 
19
+ function isTemporaryTestPath(path: string): boolean {
20
+ return path.split("/").some((segment) => segment === ".tmp" || segment === "__tmp__");
21
+ }
22
+
23
+ function isTestGraphCandidate(path: string): boolean {
24
+ return TEST_RE.test(path) && !isTemporaryTestPath(path);
25
+ }
26
+
19
27
  function emptyCoverage(): TestCoverage {
20
28
  return {
21
29
  commands: [],
@@ -40,7 +48,7 @@ function collectTestsFromDisk(workspaceRoot: string): SourceFile[] {
40
48
  const { sources } = walkWorkspaceSources({
41
49
  workspaceRoot,
42
50
  roots: ["tests", "web"],
43
- excludeRelativePath: (path) => !TEST_RE.test(path),
51
+ excludeRelativePath: (path) => !isTestGraphCandidate(path),
44
52
  });
45
53
  return sources.sort((a, b) => a.path.localeCompare(b.path));
46
54
  }
@@ -208,7 +216,7 @@ export function buildTestGraph(input: {
208
216
  const diskTests = collectTestsFromDisk(input.workspaceRoot);
209
217
  const byPath = new Map<string, SourceFile>();
210
218
  for (const source of input.sources) {
211
- if (TEST_RE.test(source.path)) {
219
+ if (isTestGraphCandidate(source.path)) {
212
220
  byPath.set(source.path, source);
213
221
  }
214
222
  }
@@ -216,7 +224,7 @@ export function buildTestGraph(input: {
216
224
  byPath.set(source.path, source);
217
225
  }
218
226
 
219
- const allSources = [...input.sources.filter((s) => TEST_RE.test(s.path)), ...diskTests];
227
+ const allSources = [...input.sources.filter((s) => isTestGraphCandidate(s.path)), ...diskTests];
220
228
  const tests: TestGraphEntry[] = [...byPath.values()]
221
229
  .sort((a, b) => a.path.localeCompare(b.path))
222
230
  .map((source) => {
@@ -13,7 +13,13 @@ export type ForgeKind =
13
13
  | "workflow"
14
14
  | "agent"
15
15
  | "aiTool"
16
- | "telemetryEvent";
16
+ | "telemetryEvent"
17
+ | "code.function"
18
+ | "code.class"
19
+ | "code.interface"
20
+ | "code.type"
21
+ | "code.const"
22
+ | "code.enum";
17
23
 
18
24
  export interface ForgeSymbol {
19
25
  id: string;
@@ -26,7 +32,7 @@ export interface ForgeSymbol {
26
32
  meta: Record<string, JsonValue>;
27
33
  }
28
34
 
29
- export type ForgeEdgeKind = "references" | "registers" | "guards" | "emits";
35
+ export type ForgeEdgeKind = "references" | "registers" | "guards" | "emits" | "imports";
30
36
 
31
37
  export interface ForgeEdge {
32
38
  from: string;