voidforge-build 23.9.1

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 (772) hide show
  1. package/dist/.claude/agents/adolin-brand.md +40 -0
  2. package/dist/.claude/agents/ahsoka-access-control.md +56 -0
  3. package/dist/.claude/agents/alfred-dependencies.md +43 -0
  4. package/dist/.claude/agents/alia-threat-detect.md +40 -0
  5. package/dist/.claude/agents/anakin-dark-side.md +41 -0
  6. package/dist/.claude/agents/aquaman-deep-dive.md +43 -0
  7. package/dist/.claude/agents/aragorn-orchestration.md +39 -0
  8. package/dist/.claude/agents/archer-greenfield.md +48 -0
  9. package/dist/.claude/agents/armin-clever.md +39 -0
  10. package/dist/.claude/agents/arwen-ui-polish.md +42 -0
  11. package/dist/.claude/agents/ashitaka-tech-debt.md +39 -0
  12. package/dist/.claude/agents/asuka-performance.md +39 -0
  13. package/dist/.claude/agents/bail-organa-governance.md +37 -0
  14. package/dist/.claude/agents/banner-database.md +44 -0
  15. package/dist/.claude/agents/barton-smoke-test.md +59 -0
  16. package/dist/.claude/agents/bashir-field-medic.md +63 -0
  17. package/dist/.claude/agents/batgirl-detail.md +43 -0
  18. package/dist/.claude/agents/batman-qa.md +73 -0
  19. package/dist/.claude/agents/bayta-evals.md +41 -0
  20. package/dist/.claude/agents/beast-boy-cross-env.md +43 -0
  21. package/dist/.claude/agents/beerus-destroyer.md +39 -0
  22. package/dist/.claude/agents/bel-riose-orchestration.md +40 -0
  23. package/dist/.claude/agents/beru-subprocess.md +37 -0
  24. package/dist/.claude/agents/bilbo-microcopy.md +43 -0
  25. package/dist/.claude/agents/black-canary-monitoring.md +43 -0
  26. package/dist/.claude/agents/bliss-ai-safety.md +40 -0
  27. package/dist/.claude/agents/bo-katan-perimeter.md +40 -0
  28. package/dist/.claude/agents/bombadil-forge-sync.md +62 -0
  29. package/dist/.claude/agents/boromir-hubris.md +40 -0
  30. package/dist/.claude/agents/breeze-platform-relations.md +40 -0
  31. package/dist/.claude/agents/bucky-legacy.md +43 -0
  32. package/dist/.claude/agents/bulma-engineering.md +40 -0
  33. package/dist/.claude/agents/calcifer-daemon.md +39 -0
  34. package/dist/.claude/agents/cara-dune-enforcement.md +37 -0
  35. package/dist/.claude/agents/cassian-recon.md +37 -0
  36. package/dist/.claude/agents/cc-persistent-process.md +39 -0
  37. package/dist/.claude/agents/celeborn-design-system.md +40 -0
  38. package/dist/.claude/agents/celebrimbor-forge-artist.md +62 -0
  39. package/dist/.claude/agents/chakotay-bridge.md +47 -0
  40. package/dist/.claude/agents/chani-worm-rider.md +61 -0
  41. package/dist/.claude/agents/chewie-dependency-audit.md +41 -0
  42. package/dist/.claude/agents/chrome-discovery.md +37 -0
  43. package/dist/.claude/agents/constantine-cursed-code.md +59 -0
  44. package/dist/.claude/agents/coulson-release.md +64 -0
  45. package/dist/.claude/agents/crusher-diagnostics.md +48 -0
  46. package/dist/.claude/agents/cyborg-system-integration.md +43 -0
  47. package/dist/.claude/agents/dalinar-positioning.md +40 -0
  48. package/dist/.claude/agents/daneel-model-migration.md +40 -0
  49. package/dist/.claude/agents/data-tech-debt.md +48 -0
  50. package/dist/.claude/agents/dax-legacy-wisdom.md +48 -0
  51. package/dist/.claude/agents/deathstroke-adversarial.md +59 -0
  52. package/dist/.claude/agents/denji-determination.md +39 -0
  53. package/dist/.claude/agents/din-djarin-bounty.md +42 -0
  54. package/dist/.claude/agents/dockson-treasury.md +67 -0
  55. package/dist/.claude/agents/dori-integration-check.md +37 -0
  56. package/dist/.claude/agents/dors-observability.md +40 -0
  57. package/dist/.claude/agents/drax-exact-match.md +42 -0
  58. package/dist/.claude/agents/ducem-token-economics.md +41 -0
  59. package/dist/.claude/agents/duncan-relay.md +40 -0
  60. package/dist/.claude/agents/duo-teardown.md +38 -0
  61. package/dist/.claude/agents/ed-network-scan.md +38 -0
  62. package/dist/.claude/agents/elrond-ux-strategy.md +39 -0
  63. package/dist/.claude/agents/eowyn-delight.md +56 -0
  64. package/dist/.claude/agents/erwin-strategy.md +39 -0
  65. package/dist/.claude/agents/ezra-catches-missed.md +40 -0
  66. package/dist/.claude/agents/ezri-session-analyst.md +45 -0
  67. package/dist/.claude/agents/falcon-migration.md +43 -0
  68. package/dist/.claude/agents/faramir-judgment.md +40 -0
  69. package/dist/.claude/agents/faye-resourceful.md +39 -0
  70. package/dist/.claude/agents/fenring-passive-monitor.md +37 -0
  71. package/dist/.claude/agents/fern-protocol.md +37 -0
  72. package/dist/.claude/agents/feyd-adversarial.md +41 -0
  73. package/dist/.claude/agents/flash-rapid-test.md +43 -0
  74. package/dist/.claude/agents/friday-automation.md +42 -0
  75. package/dist/.claude/agents/frieren-long-term.md +39 -0
  76. package/dist/.claude/agents/frodo-critical-path.md +40 -0
  77. package/dist/.claude/agents/fury-initiative.md +65 -0
  78. package/dist/.claude/agents/gaal-prompt-arch.md +41 -0
  79. package/dist/.claude/agents/galadriel-frontend.md +69 -0
  80. package/dist/.claude/agents/gamora-perf-assassin.md +43 -0
  81. package/dist/.claude/agents/gandalf-setup-wizard.md +63 -0
  82. package/dist/.claude/agents/gen-docs.md +37 -0
  83. package/dist/.claude/agents/ghanima-paired-monitor.md +37 -0
  84. package/dist/.claude/agents/gimli-performance.md +41 -0
  85. package/dist/.claude/agents/giyu-silent-guard.md +39 -0
  86. package/dist/.claude/agents/glorfindel-rendering.md +40 -0
  87. package/dist/.claude/agents/gohan-hidden-power.md +39 -0
  88. package/dist/.claude/agents/gojo-infinite-scale.md +39 -0
  89. package/dist/.claude/agents/goku-scaling.md +39 -0
  90. package/dist/.claude/agents/goldberry-change-detect.md +37 -0
  91. package/dist/.claude/agents/gordon-escalation.md +42 -0
  92. package/dist/.claude/agents/green-arrow-precision.md +43 -0
  93. package/dist/.claude/agents/green-lantern-scenarios.md +43 -0
  94. package/dist/.claude/agents/grogu-tiny-vulns.md +38 -0
  95. package/dist/.claude/agents/groot-caching.md +43 -0
  96. package/dist/.claude/agents/gurney-delivery.md +40 -0
  97. package/dist/.claude/agents/haku-deploy-wizard.md +65 -0
  98. package/dist/.claude/agents/haldir-boundaries.md +40 -0
  99. package/dist/.claude/agents/han-vuln-hunter.md +40 -0
  100. package/dist/.claude/agents/hange-experimentation.md +39 -0
  101. package/dist/.claude/agents/harah-protocol.md +38 -0
  102. package/dist/.claude/agents/hawkgirl-regression-sweep.md +43 -0
  103. package/dist/.claude/agents/heero-mission-deploy.md +39 -0
  104. package/dist/.claude/agents/hera-navigation.md +41 -0
  105. package/dist/.claude/agents/hill-mission-control.md +43 -0
  106. package/dist/.claude/agents/himmel-legacy.md +37 -0
  107. package/dist/.claude/agents/hober-tool-schema.md +40 -0
  108. package/dist/.claude/agents/hoid-copywriting.md +40 -0
  109. package/dist/.claude/agents/howl-migration.md +39 -0
  110. package/dist/.claude/agents/hughes-observability.md +37 -0
  111. package/dist/.claude/agents/huntress-flaky-bugs.md +42 -0
  112. package/dist/.claude/agents/irulan-historian.md +37 -0
  113. package/dist/.claude/agents/jake-reporter.md +45 -0
  114. package/dist/.claude/agents/janeway-novel-arch.md +48 -0
  115. package/dist/.claude/agents/janov-context-eng.md +40 -0
  116. package/dist/.claude/agents/jarvis-status.md +42 -0
  117. package/dist/.claude/agents/jean-pragmatic.md +39 -0
  118. package/dist/.claude/agents/jessica-voice.md +40 -0
  119. package/dist/.claude/agents/jet-maintenance.md +39 -0
  120. package/dist/.claude/agents/jin-disciplined-adv.md +39 -0
  121. package/dist/.claude/agents/kaji-intelligence.md +39 -0
  122. package/dist/.claude/agents/kaladin-organic-growth.md +40 -0
  123. package/dist/.claude/agents/kallen-hard-deploy.md +39 -0
  124. package/dist/.claude/agents/kanan-intuitive.md +41 -0
  125. package/dist/.claude/agents/kaoru-harmony.md +37 -0
  126. package/dist/.claude/agents/kaworu-solver.md +39 -0
  127. package/dist/.claude/agents/kelsier-growth.md +64 -0
  128. package/dist/.claude/agents/kenobi-security.md +70 -0
  129. package/dist/.claude/agents/kim-api-design.md +49 -0
  130. package/dist/.claude/agents/kira-pragmatic.md +48 -0
  131. package/dist/.claude/agents/kishibe-hardening.md +39 -0
  132. package/dist/.claude/agents/kohaku-rapid-response.md +36 -0
  133. package/dist/.claude/agents/krillin-support.md +36 -0
  134. package/dist/.claude/agents/kusanagi-devops.md +70 -0
  135. package/dist/.claude/agents/la-forge-reliability.md +63 -0
  136. package/dist/.claude/agents/lang-micro-changes.md +43 -0
  137. package/dist/.claude/agents/legolas-precision.md +42 -0
  138. package/dist/.claude/agents/leia-secrets.md +41 -0
  139. package/dist/.claude/agents/lelouch-orchestration.md +39 -0
  140. package/dist/.claude/agents/leto-ii-persistence.md +40 -0
  141. package/dist/.claude/agents/leto-protection.md +40 -0
  142. package/dist/.claude/agents/levi-deploy.md +40 -0
  143. package/dist/.claude/agents/liet-kynes-deep-system.md +40 -0
  144. package/dist/.claude/agents/lift-social-media.md +40 -0
  145. package/dist/.claude/agents/loki-chaos.md +58 -0
  146. package/dist/.claude/agents/lucius-config.md +43 -0
  147. package/dist/.claude/agents/luke-audit-journey.md +41 -0
  148. package/dist/.claude/agents/manhunter-shapeshifting.md +43 -0
  149. package/dist/.claude/agents/marsh-competitive-intel.md +41 -0
  150. package/dist/.claude/agents/maul-red-team.md +57 -0
  151. package/dist/.claude/agents/merry-pair-review.md +40 -0
  152. package/dist/.claude/agents/mikasa-protection.md +39 -0
  153. package/dist/.claude/agents/miles-teg-perf.md +40 -0
  154. package/dist/.claude/agents/milim-load-test.md +39 -0
  155. package/dist/.claude/agents/misato-operations.md +39 -0
  156. package/dist/.claude/agents/mob-capacity.md +39 -0
  157. package/dist/.claude/agents/mohiam-authentication.md +40 -0
  158. package/dist/.claude/agents/mon-mothma-security-mgmt.md +41 -0
  159. package/dist/.claude/agents/mugen-chaos.md +39 -0
  160. package/dist/.claude/agents/mule-adversarial-ai.md +41 -0
  161. package/dist/.claude/agents/mustang-cleanup.md +39 -0
  162. package/dist/.claude/agents/nanami-structured-ops.md +39 -0
  163. package/dist/.claude/agents/nausicaa-resources.md +39 -0
  164. package/dist/.claude/agents/navani-technical-seo.md +40 -0
  165. package/dist/.claude/agents/nebula-optimization.md +43 -0
  166. package/dist/.claude/agents/nightwing-regression.md +59 -0
  167. package/dist/.claude/agents/nobara-direct-fix.md +39 -0
  168. package/dist/.claude/agents/nog-solutions.md +48 -0
  169. package/dist/.claude/agents/nori-asset-scanner.md +37 -0
  170. package/dist/.claude/agents/obrien-root-cause.md +48 -0
  171. package/dist/.claude/agents/odo-structural-anomaly.md +48 -0
  172. package/dist/.claude/agents/okoye-data-integrity.md +43 -0
  173. package/dist/.claude/agents/olivier-hardening.md +39 -0
  174. package/dist/.claude/agents/oracle-static-analysis.md +59 -0
  175. package/dist/.claude/agents/ori-prompt-crafter.md +37 -0
  176. package/dist/.claude/agents/padme-data-protection.md +42 -0
  177. package/dist/.claude/agents/paris-route-planner.md +47 -0
  178. package/dist/.claude/agents/parker-connections.md +43 -0
  179. package/dist/.claude/agents/paul-orchestration.md +40 -0
  180. package/dist/.claude/agents/picard-architecture.md +64 -0
  181. package/dist/.claude/agents/piccolo-tactics.md +39 -0
  182. package/dist/.claude/agents/pike-bold-decisions.md +48 -0
  183. package/dist/.claude/agents/pippin-discovery.md +40 -0
  184. package/dist/.claude/agents/plo-koon-edge-cases.md +37 -0
  185. package/dist/.claude/agents/power-chaotic.md +39 -0
  186. package/dist/.claude/agents/qui-gon-subtle-vulns.md +40 -0
  187. package/dist/.claude/agents/radagast-edge-cases.md +41 -0
  188. package/dist/.claude/agents/raoden-conversion.md +41 -0
  189. package/dist/.claude/agents/raven-deep-analysis.md +43 -0
  190. package/dist/.claude/agents/red-hood-aggressive.md +47 -0
  191. package/dist/.claude/agents/rei-dangerous-tasks.md +39 -0
  192. package/dist/.claude/agents/reigen-debugger.md +39 -0
  193. package/dist/.claude/agents/rengoku-intense-monitor.md +39 -0
  194. package/dist/.claude/agents/rex-infrastructure.md +41 -0
  195. package/dist/.claude/agents/rhodes-production.md +43 -0
  196. package/dist/.claude/agents/riker-review.md +62 -0
  197. package/dist/.claude/agents/rimuru-adapter.md +39 -0
  198. package/dist/.claude/agents/riza-backup.md +39 -0
  199. package/dist/.claude/agents/robin-apprentice.md +42 -0
  200. package/dist/.claude/agents/rocket-scrappy.md +43 -0
  201. package/dist/.claude/agents/rogers-api-design.md +43 -0
  202. package/dist/.claude/agents/romanoff-integrations.md +44 -0
  203. package/dist/.claude/agents/sabine-unconventional.md +40 -0
  204. package/dist/.claude/agents/salvor-model-selection.md +42 -0
  205. package/dist/.claude/agents/samwise-accessibility.md +43 -0
  206. package/dist/.claude/agents/sarene-outreach.md +40 -0
  207. package/dist/.claude/agents/sasha-resources.md +37 -0
  208. package/dist/.claude/agents/scotty-infrastructure.md +48 -0
  209. package/dist/.claude/agents/seldon-ai.md +67 -0
  210. package/dist/.claude/agents/senku-provisioning.md +40 -0
  211. package/dist/.claude/agents/sentaro-scheduling.md +37 -0
  212. package/dist/.claude/agents/seven-optimization.md +48 -0
  213. package/dist/.claude/agents/shallan-creative.md +40 -0
  214. package/dist/.claude/agents/sheeana-transport.md +40 -0
  215. package/dist/.claude/agents/shuri-innovation.md +43 -0
  216. package/dist/.claude/agents/silver-surfer-herald.md +90 -0
  217. package/dist/.claude/agents/siona-evasion.md +41 -0
  218. package/dist/.claude/agents/sisko-campaign.md +68 -0
  219. package/dist/.claude/agents/spike-routing.md +40 -0
  220. package/dist/.claude/agents/spock-schema.md +62 -0
  221. package/dist/.claude/agents/starfire-brute-force.md +43 -0
  222. package/dist/.claude/agents/stark-backend.md +71 -0
  223. package/dist/.claude/agents/steris-budget.md +41 -0
  224. package/dist/.claude/agents/stilgar-channel-security.md +40 -0
  225. package/dist/.claude/agents/strange-service-arch.md +44 -0
  226. package/dist/.claude/agents/sung-workers.md +39 -0
  227. package/dist/.claude/agents/superman-strength-test.md +43 -0
  228. package/dist/.claude/agents/suzaku-execution.md +39 -0
  229. package/dist/.claude/agents/szeth-compliance.md +40 -0
  230. package/dist/.claude/agents/tanjiro-persistent.md +39 -0
  231. package/dist/.claude/agents/tchalla-quality.md +43 -0
  232. package/dist/.claude/agents/thanos-gauntlet.md +68 -0
  233. package/dist/.claude/agents/theoden-rally.md +40 -0
  234. package/dist/.claude/agents/thor-queues.md +44 -0
  235. package/dist/.claude/agents/thufir-protocol-parsing.md +40 -0
  236. package/dist/.claude/agents/todo-brute-force.md +39 -0
  237. package/dist/.claude/agents/torres-site-scanner.md +47 -0
  238. package/dist/.claude/agents/totoro-guardian.md +39 -0
  239. package/dist/.claude/agents/tpol-disciplined.md +48 -0
  240. package/dist/.claude/agents/treebeard-deliberation.md +41 -0
  241. package/dist/.claude/agents/troi-prd-compliance.md +64 -0
  242. package/dist/.claude/agents/trunks-rollback.md +39 -0
  243. package/dist/.claude/agents/tuvok-deep-current.md +63 -0
  244. package/dist/.claude/agents/uhura-integration.md +47 -0
  245. package/dist/.claude/agents/valkyrie-recovery.md +43 -0
  246. package/dist/.claude/agents/vegeta-monitoring.md +39 -0
  247. package/dist/.claude/agents/veldora-dormant.md +37 -0
  248. package/dist/.claude/agents/vin-analytics.md +41 -0
  249. package/dist/.claude/agents/vision-data-analysis.md +43 -0
  250. package/dist/.claude/agents/wanda-seldon-validation.md +38 -0
  251. package/dist/.claude/agents/wanda-state.md +43 -0
  252. package/dist/.claude/agents/wax-paid-ads.md +40 -0
  253. package/dist/.claude/agents/wayne-ab-testing.md +40 -0
  254. package/dist/.claude/agents/whis-precision.md +39 -0
  255. package/dist/.claude/agents/windu-input-validation.md +41 -0
  256. package/dist/.claude/agents/winry-maintenance.md +39 -0
  257. package/dist/.claude/agents/wonder-woman-truth.md +43 -0
  258. package/dist/.claude/agents/wong-documentation.md +58 -0
  259. package/dist/.claude/agents/worf-security-arch.md +49 -0
  260. package/dist/.claude/agents/yoda-auth.md +57 -0
  261. package/dist/.claude/agents/yueh-trust-verify.md +40 -0
  262. package/dist/.claude/agents/zatanna-impossible.md +43 -0
  263. package/dist/.claude/agents/zechs-rival.md +39 -0
  264. package/dist/.claude/agents/zenitsu-alerts.md +37 -0
  265. package/dist/.claude/commands/ai.md +84 -0
  266. package/dist/.claude/commands/architect.md +107 -0
  267. package/dist/.claude/commands/assemble.md +223 -0
  268. package/dist/.claude/commands/assess.md +86 -0
  269. package/dist/.claude/commands/blueprint.md +135 -0
  270. package/dist/.claude/commands/build.md +138 -0
  271. package/dist/.claude/commands/campaign.md +224 -0
  272. package/dist/.claude/commands/cultivation.md +184 -0
  273. package/dist/.claude/commands/current.md +128 -0
  274. package/dist/.claude/commands/dangerroom.md +74 -0
  275. package/dist/.claude/commands/debrief.md +180 -0
  276. package/dist/.claude/commands/deploy.md +108 -0
  277. package/dist/.claude/commands/devops.md +160 -0
  278. package/dist/.claude/commands/engage.md +135 -0
  279. package/dist/.claude/commands/gauntlet.md +179 -0
  280. package/dist/.claude/commands/git.md +104 -0
  281. package/dist/.claude/commands/grow.md +160 -0
  282. package/dist/.claude/commands/imagine.md +126 -0
  283. package/dist/.claude/commands/portfolio.md +51 -0
  284. package/dist/.claude/commands/prd.md +113 -0
  285. package/dist/.claude/commands/qa.md +130 -0
  286. package/dist/.claude/commands/review.md +9 -0
  287. package/dist/.claude/commands/security.md +9 -0
  288. package/dist/.claude/commands/sentinel.md +90 -0
  289. package/dist/.claude/commands/test.md +114 -0
  290. package/dist/.claude/commands/thumper.md +116 -0
  291. package/dist/.claude/commands/treasury.md +117 -0
  292. package/dist/.claude/commands/ux.md +132 -0
  293. package/dist/.claude/commands/vault.md +198 -0
  294. package/dist/.claude/commands/void.md +148 -0
  295. package/dist/CHANGELOG.md +2621 -0
  296. package/dist/CLAUDE.md +292 -0
  297. package/dist/HOLOCRON.md +859 -0
  298. package/dist/VERSION.md +149 -0
  299. package/dist/docs/NAMING_REGISTRY.md +479 -0
  300. package/dist/docs/methods/AI_INTELLIGENCE.md +276 -0
  301. package/dist/docs/methods/ASSEMBLER.md +142 -0
  302. package/dist/docs/methods/BACKEND_ENGINEER.md +165 -0
  303. package/dist/docs/methods/BUILD_JOURNAL.md +214 -0
  304. package/dist/docs/methods/BUILD_PROTOCOL.md +436 -0
  305. package/dist/docs/methods/CAMPAIGN.md +569 -0
  306. package/dist/docs/methods/CONTEXT_MANAGEMENT.md +189 -0
  307. package/dist/docs/methods/DEEP_CURRENT.md +184 -0
  308. package/dist/docs/methods/DEVOPS_ENGINEER.md +297 -0
  309. package/dist/docs/methods/FIELD_MEDIC.md +265 -0
  310. package/dist/docs/methods/FORGE_ARTIST.md +108 -0
  311. package/dist/docs/methods/FORGE_KEEPER.md +270 -0
  312. package/dist/docs/methods/GAUNTLET.md +364 -0
  313. package/dist/docs/methods/GROWTH_STRATEGIST.md +466 -0
  314. package/dist/docs/methods/HEARTBEAT.md +168 -0
  315. package/dist/docs/methods/MCP_INTEGRATION.md +139 -0
  316. package/dist/docs/methods/MUSTER.md +152 -0
  317. package/dist/docs/methods/PRD_GENERATOR.md +186 -0
  318. package/dist/docs/methods/PRODUCT_DESIGN_FRONTEND.md +252 -0
  319. package/dist/docs/methods/QA_ENGINEER.md +360 -0
  320. package/dist/docs/methods/RELEASE_MANAGER.md +145 -0
  321. package/dist/docs/methods/SECURITY_AUDITOR.md +328 -0
  322. package/dist/docs/methods/SUB_AGENTS.md +375 -0
  323. package/dist/docs/methods/SYSTEMS_ARCHITECT.md +180 -0
  324. package/dist/docs/methods/TESTING.md +359 -0
  325. package/dist/docs/methods/THUMPER.md +175 -0
  326. package/dist/docs/methods/TIME_VAULT.md +120 -0
  327. package/dist/docs/methods/TREASURY.md +184 -0
  328. package/dist/docs/methods/TROUBLESHOOTING.md +265 -0
  329. package/dist/docs/patterns/README.md +52 -0
  330. package/dist/docs/patterns/ad-billing-adapter.ts +537 -0
  331. package/dist/docs/patterns/ad-platform-adapter.ts +421 -0
  332. package/dist/docs/patterns/ai-classifier.ts +195 -0
  333. package/dist/docs/patterns/ai-eval.ts +272 -0
  334. package/dist/docs/patterns/ai-orchestrator.ts +341 -0
  335. package/dist/docs/patterns/ai-router.ts +194 -0
  336. package/dist/docs/patterns/ai-tool-schema.ts +237 -0
  337. package/dist/docs/patterns/api-route.ts +241 -0
  338. package/dist/docs/patterns/backtest-engine.ts +499 -0
  339. package/dist/docs/patterns/browser-review.ts +292 -0
  340. package/dist/docs/patterns/combobox.tsx +300 -0
  341. package/dist/docs/patterns/component.tsx +262 -0
  342. package/dist/docs/patterns/daemon-process.ts +338 -0
  343. package/dist/docs/patterns/data-pipeline.ts +297 -0
  344. package/dist/docs/patterns/database-migration.ts +466 -0
  345. package/dist/docs/patterns/e2e-test.ts +629 -0
  346. package/dist/docs/patterns/error-handling.ts +312 -0
  347. package/dist/docs/patterns/execution-safety.ts +601 -0
  348. package/dist/docs/patterns/financial-transaction.ts +366 -0
  349. package/dist/docs/patterns/funding-plan.ts +462 -0
  350. package/dist/docs/patterns/game-entity.ts +137 -0
  351. package/dist/docs/patterns/game-loop.ts +113 -0
  352. package/dist/docs/patterns/game-state.ts +143 -0
  353. package/dist/docs/patterns/job-queue.ts +225 -0
  354. package/dist/docs/patterns/kongo-integration.ts +164 -0
  355. package/dist/docs/patterns/middleware.ts +363 -0
  356. package/dist/docs/patterns/mobile-screen.tsx +139 -0
  357. package/dist/docs/patterns/mobile-service.ts +167 -0
  358. package/dist/docs/patterns/multi-tenant.ts +382 -0
  359. package/dist/docs/patterns/oauth-token-lifecycle.ts +223 -0
  360. package/dist/docs/patterns/outbound-rate-limiter.ts +260 -0
  361. package/dist/docs/patterns/prompt-template.ts +195 -0
  362. package/dist/docs/patterns/revenue-source-adapter.ts +311 -0
  363. package/dist/docs/patterns/service.ts +224 -0
  364. package/dist/docs/patterns/sse-endpoint.ts +118 -0
  365. package/dist/docs/patterns/stablecoin-adapter.ts +511 -0
  366. package/dist/docs/patterns/third-party-script.ts +68 -0
  367. package/dist/scripts/thumper/gom-jabbar.sh +241 -0
  368. package/dist/scripts/thumper/relay.sh +610 -0
  369. package/dist/scripts/thumper/scan.sh +359 -0
  370. package/dist/scripts/thumper/thumper.sh +190 -0
  371. package/dist/scripts/thumper/water-rings.sh +76 -0
  372. package/dist/scripts/vault-read.d.ts +11 -0
  373. package/dist/scripts/vault-read.js +89 -0
  374. package/dist/scripts/voidforge.d.ts +21 -0
  375. package/dist/scripts/voidforge.js +614 -0
  376. package/dist/wizard/api/auth.d.ts +5 -0
  377. package/dist/wizard/api/auth.js +139 -0
  378. package/dist/wizard/api/blueprint.d.ts +34 -0
  379. package/dist/wizard/api/blueprint.js +161 -0
  380. package/dist/wizard/api/cloud-providers.d.ts +16 -0
  381. package/dist/wizard/api/cloud-providers.js +363 -0
  382. package/dist/wizard/api/credentials.d.ts +1 -0
  383. package/dist/wizard/api/credentials.js +265 -0
  384. package/dist/wizard/api/danger-room.d.ts +24 -0
  385. package/dist/wizard/api/danger-room.js +274 -0
  386. package/dist/wizard/api/deploy.d.ts +4 -0
  387. package/dist/wizard/api/deploy.js +164 -0
  388. package/dist/wizard/api/prd.d.ts +1 -0
  389. package/dist/wizard/api/prd.js +363 -0
  390. package/dist/wizard/api/project.d.ts +1 -0
  391. package/dist/wizard/api/project.js +241 -0
  392. package/dist/wizard/api/projects-data.d.ts +5 -0
  393. package/dist/wizard/api/projects-data.js +234 -0
  394. package/dist/wizard/api/projects-list.d.ts +5 -0
  395. package/dist/wizard/api/projects-list.js +227 -0
  396. package/dist/wizard/api/projects.d.ts +7 -0
  397. package/dist/wizard/api/projects.js +273 -0
  398. package/dist/wizard/api/provision-status.d.ts +5 -0
  399. package/dist/wizard/api/provision-status.js +47 -0
  400. package/dist/wizard/api/provision-steps.d.ts +21 -0
  401. package/dist/wizard/api/provision-steps.js +44 -0
  402. package/dist/wizard/api/provision-validate.d.ts +22 -0
  403. package/dist/wizard/api/provision-validate.js +164 -0
  404. package/dist/wizard/api/provision.d.ts +2 -0
  405. package/dist/wizard/api/provision.js +239 -0
  406. package/dist/wizard/api/terminal.d.ts +25 -0
  407. package/dist/wizard/api/terminal.js +246 -0
  408. package/dist/wizard/api/users.d.ts +6 -0
  409. package/dist/wizard/api/users.js +244 -0
  410. package/dist/wizard/api/war-room.d.ts +16 -0
  411. package/dist/wizard/api/war-room.js +70 -0
  412. package/dist/wizard/danger-room.config.json +5 -0
  413. package/dist/wizard/lib/ad-platform-core.d.ts +6 -0
  414. package/dist/wizard/lib/ad-platform-core.js +1 -0
  415. package/dist/wizard/lib/adapters/index.d.ts +52 -0
  416. package/dist/wizard/lib/adapters/index.js +38 -0
  417. package/dist/wizard/lib/adapters/sandbox-bank.d.ts +17 -0
  418. package/dist/wizard/lib/adapters/sandbox-bank.js +77 -0
  419. package/dist/wizard/lib/adapters/sandbox.d.ts +39 -0
  420. package/dist/wizard/lib/adapters/sandbox.js +174 -0
  421. package/dist/wizard/lib/adapters/stripe.d.ts +19 -0
  422. package/dist/wizard/lib/adapters/stripe.js +143 -0
  423. package/dist/wizard/lib/adapters/types.d.ts +9 -0
  424. package/dist/wizard/lib/adapters/types.js +10 -0
  425. package/dist/wizard/lib/agent-memory.d.ts +36 -0
  426. package/dist/wizard/lib/agent-memory.js +114 -0
  427. package/dist/wizard/lib/agent-registry.d.ts +21 -0
  428. package/dist/wizard/lib/agent-registry.js +105 -0
  429. package/dist/wizard/lib/anomaly-detection.d.ts +59 -0
  430. package/dist/wizard/lib/anomaly-detection.js +122 -0
  431. package/dist/wizard/lib/anthropic.d.ts +21 -0
  432. package/dist/wizard/lib/anthropic.js +105 -0
  433. package/dist/wizard/lib/asset-scanner.d.ts +23 -0
  434. package/dist/wizard/lib/asset-scanner.js +107 -0
  435. package/dist/wizard/lib/audit-log.d.ts +23 -0
  436. package/dist/wizard/lib/audit-log.js +70 -0
  437. package/dist/wizard/lib/autonomy-controller.d.ts +76 -0
  438. package/dist/wizard/lib/autonomy-controller.js +184 -0
  439. package/dist/wizard/lib/body-parser.d.ts +2 -0
  440. package/dist/wizard/lib/body-parser.js +36 -0
  441. package/dist/wizard/lib/build-analytics.d.ts +39 -0
  442. package/dist/wizard/lib/build-analytics.js +91 -0
  443. package/dist/wizard/lib/build-step.d.ts +21 -0
  444. package/dist/wizard/lib/build-step.js +104 -0
  445. package/dist/wizard/lib/campaign-proposer.d.ts +39 -0
  446. package/dist/wizard/lib/campaign-proposer.js +181 -0
  447. package/dist/wizard/lib/campaign-state-machine.d.ts +63 -0
  448. package/dist/wizard/lib/campaign-state-machine.js +114 -0
  449. package/dist/wizard/lib/ci-generator.d.ts +14 -0
  450. package/dist/wizard/lib/ci-generator.js +187 -0
  451. package/dist/wizard/lib/claude-merge.d.ts +38 -0
  452. package/dist/wizard/lib/claude-merge.js +115 -0
  453. package/dist/wizard/lib/codegen/erd-gen.d.ts +16 -0
  454. package/dist/wizard/lib/codegen/erd-gen.js +98 -0
  455. package/dist/wizard/lib/codegen/integrations.d.ts +18 -0
  456. package/dist/wizard/lib/codegen/integrations.js +189 -0
  457. package/dist/wizard/lib/codegen/openapi-gen.d.ts +15 -0
  458. package/dist/wizard/lib/codegen/openapi-gen.js +79 -0
  459. package/dist/wizard/lib/codegen/prisma-types.d.ts +15 -0
  460. package/dist/wizard/lib/codegen/prisma-types.js +44 -0
  461. package/dist/wizard/lib/codegen/seed-gen.d.ts +16 -0
  462. package/dist/wizard/lib/codegen/seed-gen.js +128 -0
  463. package/dist/wizard/lib/compliance.d.ts +51 -0
  464. package/dist/wizard/lib/compliance.js +112 -0
  465. package/dist/wizard/lib/correlation-engine.d.ts +59 -0
  466. package/dist/wizard/lib/correlation-engine.js +152 -0
  467. package/dist/wizard/lib/cost-estimator.d.ts +22 -0
  468. package/dist/wizard/lib/cost-estimator.js +72 -0
  469. package/dist/wizard/lib/cost-tracker.d.ts +27 -0
  470. package/dist/wizard/lib/cost-tracker.js +37 -0
  471. package/dist/wizard/lib/daemon-aggregator.d.ts +76 -0
  472. package/dist/wizard/lib/daemon-aggregator.js +241 -0
  473. package/dist/wizard/lib/daemon-core.d.ts +16 -0
  474. package/dist/wizard/lib/daemon-core.js +39 -0
  475. package/dist/wizard/lib/dashboard-data.d.ts +123 -0
  476. package/dist/wizard/lib/dashboard-data.js +314 -0
  477. package/dist/wizard/lib/dashboard-ws.d.ts +28 -0
  478. package/dist/wizard/lib/dashboard-ws.js +117 -0
  479. package/dist/wizard/lib/deep-current.d.ts +77 -0
  480. package/dist/wizard/lib/deep-current.js +247 -0
  481. package/dist/wizard/lib/deploy-coordinator.d.ts +40 -0
  482. package/dist/wizard/lib/deploy-coordinator.js +86 -0
  483. package/dist/wizard/lib/deploy-log.d.ts +28 -0
  484. package/dist/wizard/lib/deploy-log.js +52 -0
  485. package/dist/wizard/lib/desktop-notify.d.ts +27 -0
  486. package/dist/wizard/lib/desktop-notify.js +98 -0
  487. package/dist/wizard/lib/dns/cloudflare-dns.d.ts +35 -0
  488. package/dist/wizard/lib/dns/cloudflare-dns.js +216 -0
  489. package/dist/wizard/lib/dns/cloudflare-registrar.d.ts +31 -0
  490. package/dist/wizard/lib/dns/cloudflare-registrar.js +148 -0
  491. package/dist/wizard/lib/dns/types.d.ts +22 -0
  492. package/dist/wizard/lib/dns/types.js +4 -0
  493. package/dist/wizard/lib/document-discovery.d.ts +33 -0
  494. package/dist/wizard/lib/document-discovery.js +145 -0
  495. package/dist/wizard/lib/env-validator.d.ts +14 -0
  496. package/dist/wizard/lib/env-validator.js +205 -0
  497. package/dist/wizard/lib/env-writer.d.ts +13 -0
  498. package/dist/wizard/lib/env-writer.js +26 -0
  499. package/dist/wizard/lib/exec.d.ts +30 -0
  500. package/dist/wizard/lib/exec.js +52 -0
  501. package/dist/wizard/lib/experiment.d.ts +70 -0
  502. package/dist/wizard/lib/experiment.js +169 -0
  503. package/dist/wizard/lib/extensions.d.ts +20 -0
  504. package/dist/wizard/lib/extensions.js +183 -0
  505. package/dist/wizard/lib/financial/adapter-factory.d.ts +47 -0
  506. package/dist/wizard/lib/financial/adapter-factory.js +225 -0
  507. package/dist/wizard/lib/financial/billing/base.d.ts +6 -0
  508. package/dist/wizard/lib/financial/billing/base.js +1 -0
  509. package/dist/wizard/lib/financial/billing/google-billing.d.ts +56 -0
  510. package/dist/wizard/lib/financial/billing/google-billing.js +298 -0
  511. package/dist/wizard/lib/financial/billing/meta-billing.d.ts +54 -0
  512. package/dist/wizard/lib/financial/billing/meta-billing.js +243 -0
  513. package/dist/wizard/lib/financial/billing/tiktok-billing.d.ts +54 -0
  514. package/dist/wizard/lib/financial/billing/tiktok-billing.js +260 -0
  515. package/dist/wizard/lib/financial/campaign/base.d.ts +13 -0
  516. package/dist/wizard/lib/financial/campaign/base.js +1 -0
  517. package/dist/wizard/lib/financial/campaign/campaign-common.d.ts +21 -0
  518. package/dist/wizard/lib/financial/campaign/campaign-common.js +58 -0
  519. package/dist/wizard/lib/financial/campaign/google-api.d.ts +35 -0
  520. package/dist/wizard/lib/financial/campaign/google-api.js +118 -0
  521. package/dist/wizard/lib/financial/campaign/google-campaign.d.ts +38 -0
  522. package/dist/wizard/lib/financial/campaign/google-campaign.js +186 -0
  523. package/dist/wizard/lib/financial/campaign/meta-api.d.ts +28 -0
  524. package/dist/wizard/lib/financial/campaign/meta-api.js +93 -0
  525. package/dist/wizard/lib/financial/campaign/meta-campaign.d.ts +32 -0
  526. package/dist/wizard/lib/financial/campaign/meta-campaign.js +189 -0
  527. package/dist/wizard/lib/financial/campaign/sandbox-campaign.d.ts +45 -0
  528. package/dist/wizard/lib/financial/campaign/sandbox-campaign.js +261 -0
  529. package/dist/wizard/lib/financial/campaign/tiktok-api.d.ts +25 -0
  530. package/dist/wizard/lib/financial/campaign/tiktok-api.js +81 -0
  531. package/dist/wizard/lib/financial/campaign/tiktok-campaign.d.ts +37 -0
  532. package/dist/wizard/lib/financial/campaign/tiktok-campaign.js +155 -0
  533. package/dist/wizard/lib/financial/funding-auto.d.ts +44 -0
  534. package/dist/wizard/lib/financial/funding-auto.js +52 -0
  535. package/dist/wizard/lib/financial/funding-policy.d.ts +60 -0
  536. package/dist/wizard/lib/financial/funding-policy.js +179 -0
  537. package/dist/wizard/lib/financial/platform-planner.d.ts +47 -0
  538. package/dist/wizard/lib/financial/platform-planner.js +134 -0
  539. package/dist/wizard/lib/financial/reconciliation-engine.d.ts +78 -0
  540. package/dist/wizard/lib/financial/reconciliation-engine.js +193 -0
  541. package/dist/wizard/lib/financial/registry.d.ts +22 -0
  542. package/dist/wizard/lib/financial/registry.js +26 -0
  543. package/dist/wizard/lib/financial/reporting.d.ts +96 -0
  544. package/dist/wizard/lib/financial/reporting.js +198 -0
  545. package/dist/wizard/lib/financial/stablecoin/base.d.ts +6 -0
  546. package/dist/wizard/lib/financial/stablecoin/base.js +1 -0
  547. package/dist/wizard/lib/financial/stablecoin/circle.d.ts +54 -0
  548. package/dist/wizard/lib/financial/stablecoin/circle.js +367 -0
  549. package/dist/wizard/lib/financial/stablecoin/mercury.d.ts +24 -0
  550. package/dist/wizard/lib/financial/stablecoin/mercury.js +171 -0
  551. package/dist/wizard/lib/financial/stablecoin/sandbox-stablecoin.d.ts +47 -0
  552. package/dist/wizard/lib/financial/stablecoin/sandbox-stablecoin.js +202 -0
  553. package/dist/wizard/lib/financial/treasury-planner.d.ts +52 -0
  554. package/dist/wizard/lib/financial/treasury-planner.js +128 -0
  555. package/dist/wizard/lib/financial-core.d.ts +6 -0
  556. package/dist/wizard/lib/financial-core.js +5 -0
  557. package/dist/wizard/lib/financial-vault.d.ts +34 -0
  558. package/dist/wizard/lib/financial-vault.js +200 -0
  559. package/dist/wizard/lib/frontmatter.d.ts +30 -0
  560. package/dist/wizard/lib/frontmatter.js +99 -0
  561. package/dist/wizard/lib/gap-analysis.d.ts +37 -0
  562. package/dist/wizard/lib/gap-analysis.js +218 -0
  563. package/dist/wizard/lib/github.d.ts +22 -0
  564. package/dist/wizard/lib/github.js +261 -0
  565. package/dist/wizard/lib/headless-deploy.d.ts +14 -0
  566. package/dist/wizard/lib/headless-deploy.js +452 -0
  567. package/dist/wizard/lib/health-monitor.d.ts +15 -0
  568. package/dist/wizard/lib/health-monitor.js +91 -0
  569. package/dist/wizard/lib/health-poller.d.ts +9 -0
  570. package/dist/wizard/lib/health-poller.js +123 -0
  571. package/dist/wizard/lib/heartbeat-lifecycle.d.ts +71 -0
  572. package/dist/wizard/lib/heartbeat-lifecycle.js +107 -0
  573. package/dist/wizard/lib/heartbeat-scheduler.d.ts +26 -0
  574. package/dist/wizard/lib/heartbeat-scheduler.js +155 -0
  575. package/dist/wizard/lib/heartbeat.d.ts +22 -0
  576. package/dist/wizard/lib/heartbeat.js +538 -0
  577. package/dist/wizard/lib/herald.d.ts +28 -0
  578. package/dist/wizard/lib/herald.js +167 -0
  579. package/dist/wizard/lib/http-helpers.d.ts +9 -0
  580. package/dist/wizard/lib/http-helpers.js +24 -0
  581. package/dist/wizard/lib/image-gen.d.ts +56 -0
  582. package/dist/wizard/lib/image-gen.js +159 -0
  583. package/dist/wizard/lib/instance-sizing.d.ts +26 -0
  584. package/dist/wizard/lib/instance-sizing.js +51 -0
  585. package/dist/wizard/lib/kongo/analytics.d.ts +29 -0
  586. package/dist/wizard/lib/kongo/analytics.js +179 -0
  587. package/dist/wizard/lib/kongo/campaigns.d.ts +52 -0
  588. package/dist/wizard/lib/kongo/campaigns.js +91 -0
  589. package/dist/wizard/lib/kongo/client.d.ts +58 -0
  590. package/dist/wizard/lib/kongo/client.js +221 -0
  591. package/dist/wizard/lib/kongo/jobs.d.ts +57 -0
  592. package/dist/wizard/lib/kongo/jobs.js +122 -0
  593. package/dist/wizard/lib/kongo/pages.d.ts +60 -0
  594. package/dist/wizard/lib/kongo/pages.js +150 -0
  595. package/dist/wizard/lib/kongo/provisioner.d.ts +64 -0
  596. package/dist/wizard/lib/kongo/provisioner.js +116 -0
  597. package/dist/wizard/lib/kongo/seed.d.ts +49 -0
  598. package/dist/wizard/lib/kongo/seed.js +237 -0
  599. package/dist/wizard/lib/kongo/types.d.ts +323 -0
  600. package/dist/wizard/lib/kongo/types.js +11 -0
  601. package/dist/wizard/lib/kongo/variants.d.ts +57 -0
  602. package/dist/wizard/lib/kongo/variants.js +88 -0
  603. package/dist/wizard/lib/kongo/webhooks.d.ts +41 -0
  604. package/dist/wizard/lib/kongo/webhooks.js +112 -0
  605. package/dist/wizard/lib/marker.d.ts +28 -0
  606. package/dist/wizard/lib/marker.js +79 -0
  607. package/dist/wizard/lib/migrator.d.ts +35 -0
  608. package/dist/wizard/lib/migrator.js +190 -0
  609. package/dist/wizard/lib/natural-language-deploy.d.ts +30 -0
  610. package/dist/wizard/lib/natural-language-deploy.js +186 -0
  611. package/dist/wizard/lib/network.d.ts +22 -0
  612. package/dist/wizard/lib/network.js +72 -0
  613. package/dist/wizard/lib/oauth-core.d.ts +6 -0
  614. package/dist/wizard/lib/oauth-core.js +5 -0
  615. package/dist/wizard/lib/open-browser.d.ts +1 -0
  616. package/dist/wizard/lib/open-browser.js +26 -0
  617. package/dist/wizard/lib/patterns/ad-billing-adapter.d.ts +209 -0
  618. package/dist/wizard/lib/patterns/ad-billing-adapter.js +269 -0
  619. package/dist/wizard/lib/patterns/ad-platform-adapter.d.ts +200 -0
  620. package/dist/wizard/lib/patterns/ad-platform-adapter.js +212 -0
  621. package/dist/wizard/lib/patterns/daemon-process.d.ts +88 -0
  622. package/dist/wizard/lib/patterns/daemon-process.js +271 -0
  623. package/dist/wizard/lib/patterns/financial-transaction.d.ts +171 -0
  624. package/dist/wizard/lib/patterns/financial-transaction.js +154 -0
  625. package/dist/wizard/lib/patterns/funding-plan.d.ts +136 -0
  626. package/dist/wizard/lib/patterns/funding-plan.js +200 -0
  627. package/dist/wizard/lib/patterns/oauth-token-lifecycle.d.ts +94 -0
  628. package/dist/wizard/lib/patterns/oauth-token-lifecycle.js +139 -0
  629. package/dist/wizard/lib/patterns/outbound-rate-limiter.d.ts +67 -0
  630. package/dist/wizard/lib/patterns/outbound-rate-limiter.js +216 -0
  631. package/dist/wizard/lib/patterns/revenue-source-adapter.d.ts +96 -0
  632. package/dist/wizard/lib/patterns/revenue-source-adapter.js +182 -0
  633. package/dist/wizard/lib/patterns/stablecoin-adapter.d.ts +218 -0
  634. package/dist/wizard/lib/patterns/stablecoin-adapter.js +264 -0
  635. package/dist/wizard/lib/prd-validator.d.ts +39 -0
  636. package/dist/wizard/lib/prd-validator.js +137 -0
  637. package/dist/wizard/lib/project-init.d.ts +24 -0
  638. package/dist/wizard/lib/project-init.js +228 -0
  639. package/dist/wizard/lib/project-registry.d.ts +86 -0
  640. package/dist/wizard/lib/project-registry.js +359 -0
  641. package/dist/wizard/lib/project-scope.d.ts +64 -0
  642. package/dist/wizard/lib/project-scope.js +96 -0
  643. package/dist/wizard/lib/project-vault.d.ts +47 -0
  644. package/dist/wizard/lib/project-vault.js +221 -0
  645. package/dist/wizard/lib/provision-manifest.d.ts +44 -0
  646. package/dist/wizard/lib/provision-manifest.js +164 -0
  647. package/dist/wizard/lib/provisioner-registry.d.ts +15 -0
  648. package/dist/wizard/lib/provisioner-registry.js +34 -0
  649. package/dist/wizard/lib/provisioners/aws-config.d.ts +36 -0
  650. package/dist/wizard/lib/provisioners/aws-config.js +56 -0
  651. package/dist/wizard/lib/provisioners/aws-ec2.d.ts +19 -0
  652. package/dist/wizard/lib/provisioners/aws-ec2.js +241 -0
  653. package/dist/wizard/lib/provisioners/aws-rds.d.ts +10 -0
  654. package/dist/wizard/lib/provisioners/aws-rds.js +199 -0
  655. package/dist/wizard/lib/provisioners/aws-vps.d.ts +6 -0
  656. package/dist/wizard/lib/provisioners/aws-vps.js +231 -0
  657. package/dist/wizard/lib/provisioners/cloudflare.d.ts +6 -0
  658. package/dist/wizard/lib/provisioners/cloudflare.js +300 -0
  659. package/dist/wizard/lib/provisioners/docker.d.ts +6 -0
  660. package/dist/wizard/lib/provisioners/docker.js +75 -0
  661. package/dist/wizard/lib/provisioners/http-client.d.ts +20 -0
  662. package/dist/wizard/lib/provisioners/http-client.js +79 -0
  663. package/dist/wizard/lib/provisioners/railway-config.d.ts +24 -0
  664. package/dist/wizard/lib/provisioners/railway-config.js +220 -0
  665. package/dist/wizard/lib/provisioners/railway-deploy.d.ts +19 -0
  666. package/dist/wizard/lib/provisioners/railway-deploy.js +205 -0
  667. package/dist/wizard/lib/provisioners/railway.d.ts +6 -0
  668. package/dist/wizard/lib/provisioners/railway.js +45 -0
  669. package/dist/wizard/lib/provisioners/scripts/caddyfile.d.ts +10 -0
  670. package/dist/wizard/lib/provisioners/scripts/caddyfile.js +54 -0
  671. package/dist/wizard/lib/provisioners/scripts/deploy-vps.d.ts +10 -0
  672. package/dist/wizard/lib/provisioners/scripts/deploy-vps.js +112 -0
  673. package/dist/wizard/lib/provisioners/scripts/docker-compose.d.ts +11 -0
  674. package/dist/wizard/lib/provisioners/scripts/docker-compose.js +91 -0
  675. package/dist/wizard/lib/provisioners/scripts/dockerfile.d.ts +5 -0
  676. package/dist/wizard/lib/provisioners/scripts/dockerfile.js +185 -0
  677. package/dist/wizard/lib/provisioners/scripts/ecosystem-config.d.ts +10 -0
  678. package/dist/wizard/lib/provisioners/scripts/ecosystem-config.js +36 -0
  679. package/dist/wizard/lib/provisioners/scripts/provision-vps.d.ts +14 -0
  680. package/dist/wizard/lib/provisioners/scripts/provision-vps.js +202 -0
  681. package/dist/wizard/lib/provisioners/scripts/rollback-vps.d.ts +10 -0
  682. package/dist/wizard/lib/provisioners/scripts/rollback-vps.js +67 -0
  683. package/dist/wizard/lib/provisioners/self-deploy.d.ts +41 -0
  684. package/dist/wizard/lib/provisioners/self-deploy.js +185 -0
  685. package/dist/wizard/lib/provisioners/static-s3.d.ts +6 -0
  686. package/dist/wizard/lib/provisioners/static-s3.js +235 -0
  687. package/dist/wizard/lib/provisioners/types.d.ts +40 -0
  688. package/dist/wizard/lib/provisioners/types.js +4 -0
  689. package/dist/wizard/lib/provisioners/vercel.d.ts +6 -0
  690. package/dist/wizard/lib/provisioners/vercel.js +287 -0
  691. package/dist/wizard/lib/pty-manager.d.ts +42 -0
  692. package/dist/wizard/lib/pty-manager.js +244 -0
  693. package/dist/wizard/lib/rate-limiter-core.d.ts +5 -0
  694. package/dist/wizard/lib/rate-limiter-core.js +5 -0
  695. package/dist/wizard/lib/reconciliation.d.ts +43 -0
  696. package/dist/wizard/lib/reconciliation.js +173 -0
  697. package/dist/wizard/lib/revenue-types.d.ts +5 -0
  698. package/dist/wizard/lib/revenue-types.js +1 -0
  699. package/dist/wizard/lib/route-optimizer.d.ts +28 -0
  700. package/dist/wizard/lib/route-optimizer.js +93 -0
  701. package/dist/wizard/lib/s3-deploy.d.ts +19 -0
  702. package/dist/wizard/lib/s3-deploy.js +156 -0
  703. package/dist/wizard/lib/safety-tiers.d.ts +76 -0
  704. package/dist/wizard/lib/safety-tiers.js +134 -0
  705. package/dist/wizard/lib/sentry-generator.d.ts +15 -0
  706. package/dist/wizard/lib/sentry-generator.js +116 -0
  707. package/dist/wizard/lib/server-config.d.ts +13 -0
  708. package/dist/wizard/lib/server-config.js +23 -0
  709. package/dist/wizard/lib/service-install.d.ts +18 -0
  710. package/dist/wizard/lib/service-install.js +182 -0
  711. package/dist/wizard/lib/site-scanner.d.ts +80 -0
  712. package/dist/wizard/lib/site-scanner.js +262 -0
  713. package/dist/wizard/lib/ssh-deploy.d.ts +25 -0
  714. package/dist/wizard/lib/ssh-deploy.js +225 -0
  715. package/dist/wizard/lib/templates.d.ts +24 -0
  716. package/dist/wizard/lib/templates.js +219 -0
  717. package/dist/wizard/lib/totp.d.ts +35 -0
  718. package/dist/wizard/lib/totp.js +277 -0
  719. package/dist/wizard/lib/tower-auth.d.ts +43 -0
  720. package/dist/wizard/lib/tower-auth.js +352 -0
  721. package/dist/wizard/lib/tower-rate-limit.d.ts +14 -0
  722. package/dist/wizard/lib/tower-rate-limit.js +61 -0
  723. package/dist/wizard/lib/tower-session.d.ts +28 -0
  724. package/dist/wizard/lib/tower-session.js +119 -0
  725. package/dist/wizard/lib/treasury-backup.d.ts +23 -0
  726. package/dist/wizard/lib/treasury-backup.js +127 -0
  727. package/dist/wizard/lib/treasury-circuit-breakers.d.ts +28 -0
  728. package/dist/wizard/lib/treasury-circuit-breakers.js +74 -0
  729. package/dist/wizard/lib/treasury-handlers.d.ts +21 -0
  730. package/dist/wizard/lib/treasury-handlers.js +281 -0
  731. package/dist/wizard/lib/treasury-heartbeat.d.ts +18 -0
  732. package/dist/wizard/lib/treasury-heartbeat.js +20 -0
  733. package/dist/wizard/lib/treasury-io.d.ts +107 -0
  734. package/dist/wizard/lib/treasury-io.js +254 -0
  735. package/dist/wizard/lib/treasury-jobs.d.ts +14 -0
  736. package/dist/wizard/lib/treasury-jobs.js +589 -0
  737. package/dist/wizard/lib/treasury-migrator.d.ts +59 -0
  738. package/dist/wizard/lib/treasury-migrator.js +227 -0
  739. package/dist/wizard/lib/treasury-reader.d.ts +52 -0
  740. package/dist/wizard/lib/treasury-reader.js +235 -0
  741. package/dist/wizard/lib/updater.d.ts +29 -0
  742. package/dist/wizard/lib/updater.js +203 -0
  743. package/dist/wizard/lib/user-manager.d.ts +39 -0
  744. package/dist/wizard/lib/user-manager.js +182 -0
  745. package/dist/wizard/lib/vault.d.ts +26 -0
  746. package/dist/wizard/lib/vault.js +161 -0
  747. package/dist/wizard/router.d.ts +12 -0
  748. package/dist/wizard/router.js +58 -0
  749. package/dist/wizard/server.d.ts +18 -0
  750. package/dist/wizard/server.js +427 -0
  751. package/dist/wizard/ui/app.js +1357 -0
  752. package/dist/wizard/ui/danger-room-prophecy.js +217 -0
  753. package/dist/wizard/ui/danger-room.html +27 -0
  754. package/dist/wizard/ui/danger-room.js +29 -0
  755. package/dist/wizard/ui/deploy.html +181 -0
  756. package/dist/wizard/ui/deploy.js +616 -0
  757. package/dist/wizard/ui/favicon.svg +11 -0
  758. package/dist/wizard/ui/index.html +407 -0
  759. package/dist/wizard/ui/lobby.html +235 -0
  760. package/dist/wizard/ui/lobby.js +843 -0
  761. package/dist/wizard/ui/login.html +111 -0
  762. package/dist/wizard/ui/login.js +199 -0
  763. package/dist/wizard/ui/project.html +285 -0
  764. package/dist/wizard/ui/project.js +324 -0
  765. package/dist/wizard/ui/rollback.js +107 -0
  766. package/dist/wizard/ui/styles.css +1040 -0
  767. package/dist/wizard/ui/tower.html +177 -0
  768. package/dist/wizard/ui/tower.js +445 -0
  769. package/dist/wizard/ui/war-room-prophecy.js +217 -0
  770. package/dist/wizard/ui/war-room.html +27 -0
  771. package/dist/wizard/ui/war-room.js +29 -0
  772. package/package.json +60 -0
@@ -0,0 +1,273 @@
1
+ /**
2
+ * Projects API — project CRUD routes (get, import, delete).
3
+ * Listing, access, links in projects-list.ts. Data/analytics in projects-data.ts.
4
+ * All queries filtered by per-project access control (v7.0).
5
+ */
6
+ import { access as fsAccess, readFile, realpath } from 'node:fs/promises';
7
+ import { join, resolve } from 'node:path';
8
+ import { addRoute } from '../router.js';
9
+ import { parseJsonBody } from '../lib/body-parser.js';
10
+ import { parseFrontmatter } from '../lib/frontmatter.js';
11
+ import { addProject, getProject, removeProject, findByDirectory, checkProjectAccess, } from '../lib/project-registry.js';
12
+ import { audit } from '../lib/audit-log.js';
13
+ import { validateSession, parseSessionCookie, getClientIp, isRemoteMode } from '../lib/tower-auth.js';
14
+ import { sendJson } from '../lib/http-helpers.js';
15
+ // ── Barrel imports — load split route files ─────────
16
+ import './projects-list.js';
17
+ import './projects-data.js';
18
+ /** Extract session from request. Returns null if not authenticated (local mode returns synthetic admin). */
19
+ function getSession(req) {
20
+ if (!isRemoteMode()) {
21
+ return { username: 'local', role: 'admin' };
22
+ }
23
+ const token = parseSessionCookie(req.headers.cookie);
24
+ const ip = getClientIp(req);
25
+ if (!token)
26
+ return null;
27
+ return validateSession(token, ip);
28
+ }
29
+ /** Scan a project directory for metadata. Reuses patterns from wizard/api/deploy.ts. */
30
+ async function scanProjectMetadata(dir) {
31
+ let name = 'Unknown';
32
+ try {
33
+ const claudeMd = await readFile(join(dir, 'CLAUDE.md'), 'utf-8');
34
+ const nameMatch = claudeMd.match(/\*\*Name:\*\*\s*(.+)/);
35
+ if (nameMatch) {
36
+ const extracted = nameMatch[1].trim();
37
+ if (!extracted.startsWith('['))
38
+ name = extracted;
39
+ }
40
+ }
41
+ catch { /* use default */ }
42
+ let deployTarget = '';
43
+ let deployUrl = '';
44
+ let hostname = '';
45
+ let sshHost = '';
46
+ try {
47
+ const envContent = await readFile(join(dir, '.env'), 'utf-8');
48
+ const deployMatch = envContent.match(/DEPLOY_TARGET=(.+)/);
49
+ if (deployMatch) {
50
+ deployTarget = deployMatch[1].trim().replace(/^["']|["']$/g, '').split('#')[0].trim();
51
+ }
52
+ const hostnameMatch = envContent.match(/HOSTNAME=(.+)/);
53
+ if (hostnameMatch) {
54
+ hostname = hostnameMatch[1].trim().replace(/^["']|["']$/g, '').split('#')[0].trim();
55
+ if (hostname)
56
+ deployUrl = `https://${hostname}`;
57
+ }
58
+ if (deployTarget === 'vps') {
59
+ const sshMatch = envContent.match(/SSH_HOST=(.+)/);
60
+ if (sshMatch) {
61
+ sshHost = sshMatch[1].trim().replace(/^["']|["']$/g, '').split('#')[0].trim();
62
+ }
63
+ }
64
+ }
65
+ catch { /* no .env */ }
66
+ let framework = '';
67
+ let database = 'none';
68
+ try {
69
+ const prd = await readFile(join(dir, 'docs', 'PRD.md'), 'utf-8');
70
+ const { frontmatter } = parseFrontmatter(prd);
71
+ if (frontmatter.framework)
72
+ framework = frontmatter.framework;
73
+ if (frontmatter.database)
74
+ database = frontmatter.database;
75
+ if (frontmatter.deploy && !deployTarget)
76
+ deployTarget = frontmatter.deploy;
77
+ if (frontmatter.hostname && !hostname) {
78
+ hostname = frontmatter.hostname;
79
+ if (!deployUrl && hostname)
80
+ deployUrl = `https://${hostname}`;
81
+ }
82
+ }
83
+ catch { /* no PRD or no frontmatter */ }
84
+ if (!framework) {
85
+ try {
86
+ const pkg = await readFile(join(dir, 'package.json'), 'utf-8');
87
+ const pkgData = JSON.parse(pkg);
88
+ const deps = pkgData.dependencies ?? {};
89
+ if (deps['next'])
90
+ framework = 'next.js';
91
+ else if (deps['express'])
92
+ framework = 'express';
93
+ }
94
+ catch { /* not a Node project */ }
95
+ if (!framework) {
96
+ try {
97
+ const reqs = await readFile(join(dir, 'requirements.txt'), 'utf-8');
98
+ if (reqs.toLowerCase().includes('django'))
99
+ framework = 'django';
100
+ else
101
+ framework = 'python';
102
+ }
103
+ catch { /* not Python */ }
104
+ }
105
+ if (!framework) {
106
+ try {
107
+ await fsAccess(join(dir, 'Gemfile'));
108
+ framework = 'rails';
109
+ }
110
+ catch { /* not Ruby */ }
111
+ }
112
+ }
113
+ let lastBuildPhase = 0;
114
+ try {
115
+ const buildState = await readFile(join(dir, 'logs', 'build-state.md'), 'utf-8');
116
+ const phaseMatch = buildState.match(/\*\*Current Phase:\*\*\s*(\d+)/);
117
+ if (phaseMatch) {
118
+ lastBuildPhase = parseInt(phaseMatch[1], 10);
119
+ }
120
+ }
121
+ catch { /* no build state */ }
122
+ let healthCheckUrl = '';
123
+ if (deployUrl) {
124
+ healthCheckUrl = `${deployUrl}/api/health`;
125
+ }
126
+ return {
127
+ name,
128
+ directory: dir,
129
+ deployTarget: deployTarget || 'unknown',
130
+ deployUrl,
131
+ sshHost,
132
+ framework: framework || 'unknown',
133
+ database,
134
+ createdAt: new Date().toISOString(),
135
+ lastBuildPhase,
136
+ lastDeployAt: '',
137
+ healthCheckUrl,
138
+ monthlyCost: 0,
139
+ owner: '',
140
+ access: [],
141
+ linkedProjects: [],
142
+ };
143
+ }
144
+ // GET /api/projects/get — get single project by id (filtered by access)
145
+ addRoute('GET', '/api/projects/get', async (req, res) => {
146
+ const session = getSession(req);
147
+ if (!session) {
148
+ sendJson(res, 401, { success: false, error: 'Authentication required' });
149
+ return;
150
+ }
151
+ const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);
152
+ const id = url.searchParams.get('id');
153
+ if (!id) {
154
+ sendJson(res, 400, { success: false, error: 'id query parameter is required' });
155
+ return;
156
+ }
157
+ // Access check — returns null if project doesn't exist OR user has no access
158
+ const effectiveRole = await checkProjectAccess(id, session.username, session.role);
159
+ if (!effectiveRole) {
160
+ sendJson(res, 404, { success: false, error: 'Project not found' });
161
+ return;
162
+ }
163
+ const project = await getProject(id);
164
+ if (!project) {
165
+ sendJson(res, 404, { success: false, error: 'Project not found' });
166
+ return;
167
+ }
168
+ sendJson(res, 200, { success: true, data: { ...project, userRole: effectiveRole } });
169
+ });
170
+ // POST /api/projects/import — import an existing project (sets owner to current user)
171
+ addRoute('POST', '/api/projects/import', async (req, res) => {
172
+ const session = getSession(req);
173
+ if (!session) {
174
+ sendJson(res, 401, { success: false, error: 'Authentication required' });
175
+ return;
176
+ }
177
+ const body = await parseJsonBody(req);
178
+ if (typeof body !== 'object' || body === null) {
179
+ sendJson(res, 400, { success: false, error: 'Request body must be a JSON object' });
180
+ return;
181
+ }
182
+ const { directory } = body;
183
+ if (typeof directory !== 'string' || directory.trim().length === 0) {
184
+ sendJson(res, 400, { success: false, error: 'directory must be a non-empty string' });
185
+ return;
186
+ }
187
+ if (directory.includes('..')) {
188
+ sendJson(res, 400, { success: false, error: 'directory must not contain ".." segments' });
189
+ return;
190
+ }
191
+ let dir = resolve(directory);
192
+ if (!dir.startsWith('/')) {
193
+ sendJson(res, 400, { success: false, error: 'directory must be an absolute path' });
194
+ return;
195
+ }
196
+ try {
197
+ await fsAccess(dir);
198
+ }
199
+ catch {
200
+ sendJson(res, 400, { success: false, error: 'Directory does not exist' });
201
+ return;
202
+ }
203
+ // CROSS-R4-005 + IG-R4: Resolve symlinks and use the real path for all subsequent operations.
204
+ // This handles macOS /tmp → /private/tmp while ensuring we operate on the true filesystem location.
205
+ try {
206
+ dir = await realpath(dir);
207
+ }
208
+ catch {
209
+ sendJson(res, 400, { success: false, error: 'Could not resolve directory path' });
210
+ return;
211
+ }
212
+ try {
213
+ await fsAccess(join(dir, 'CLAUDE.md'));
214
+ }
215
+ catch {
216
+ sendJson(res, 400, { success: false, error: 'Not a VoidForge project — no CLAUDE.md found' });
217
+ return;
218
+ }
219
+ const existing = await findByDirectory(dir);
220
+ if (existing) {
221
+ sendJson(res, 409, { success: false, error: 'Project already registered', data: existing });
222
+ return;
223
+ }
224
+ try {
225
+ const input = await scanProjectMetadata(dir);
226
+ input.owner = session.username; // Set owner to importing user
227
+ const project = await addProject(input);
228
+ const ip = getClientIp(req);
229
+ await audit('project_create', ip, session.username, { action: 'import', directory: dir, name: project.name });
230
+ sendJson(res, 201, { success: true, data: { ...project, userRole: 'owner' } });
231
+ }
232
+ catch (err) {
233
+ const message = err instanceof Error ? err.message : 'Import failed';
234
+ if (message.includes('already registered')) {
235
+ sendJson(res, 409, { success: false, error: 'Project already registered' });
236
+ }
237
+ else {
238
+ sendJson(res, 500, { success: false, error: 'Failed to import project' });
239
+ }
240
+ }
241
+ });
242
+ // POST /api/projects/delete — remove a project (owner or admin only)
243
+ addRoute('POST', '/api/projects/delete', async (req, res) => {
244
+ const session = getSession(req);
245
+ if (!session) {
246
+ sendJson(res, 401, { success: false, error: 'Authentication required' });
247
+ return;
248
+ }
249
+ const body = await parseJsonBody(req);
250
+ if (typeof body !== 'object' || body === null) {
251
+ sendJson(res, 400, { success: false, error: 'Request body must be a JSON object' });
252
+ return;
253
+ }
254
+ const { id } = body;
255
+ if (typeof id !== 'string' || id.trim().length === 0) {
256
+ sendJson(res, 400, { success: false, error: 'id must be a non-empty string' });
257
+ return;
258
+ }
259
+ // Check access — only owner or admin can delete
260
+ const effectiveRole = await checkProjectAccess(id, session.username, session.role);
261
+ if (effectiveRole !== 'admin') {
262
+ sendJson(res, 404, { success: false, error: 'Project not found' });
263
+ return;
264
+ }
265
+ const removed = await removeProject(id);
266
+ if (!removed) {
267
+ sendJson(res, 404, { success: false, error: 'Project not found' });
268
+ return;
269
+ }
270
+ const ip = getClientIp(req);
271
+ await audit('project_delete', ip, session.username, { projectId: id });
272
+ sendJson(res, 200, { success: true });
273
+ });
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Provisioning API — deploy history, incomplete run detection.
3
+ * Split from provision.ts for file size (v23.3).
4
+ */
5
+ export {};
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Provisioning API — deploy history, incomplete run detection.
3
+ * Split from provision.ts for file size (v23.3).
4
+ */
5
+ import { addRoute } from '../router.js';
6
+ import { getSessionPassword } from './credentials.js';
7
+ import { listDeploys } from '../lib/deploy-log.js';
8
+ import { listIncompleteRuns } from '../lib/provision-manifest.js';
9
+ import { sendJson } from '../lib/http-helpers.js';
10
+ // GET /api/deploys — list recent deploy history (ADR-021)
11
+ addRoute('GET', '/api/deploys', async (_req, res) => {
12
+ const password = getSessionPassword();
13
+ if (!password) {
14
+ sendJson(res, 401, { error: 'Vault is locked.' });
15
+ return;
16
+ }
17
+ const deploys = await listDeploys();
18
+ sendJson(res, 200, {
19
+ deploys: deploys.map(d => ({
20
+ timestamp: d.timestamp,
21
+ target: d.target,
22
+ projectName: d.projectName,
23
+ deployUrl: d.deployUrl,
24
+ hostname: d.hostname,
25
+ resourceCount: d.resources.length,
26
+ })),
27
+ });
28
+ });
29
+ // GET /api/provision/incomplete — check for orphaned runs from crashes
30
+ addRoute('GET', '/api/provision/incomplete', async (_req, res) => {
31
+ const password = getSessionPassword();
32
+ if (!password) {
33
+ sendJson(res, 401, { error: 'Vault is locked.' });
34
+ return;
35
+ }
36
+ const incomplete = await listIncompleteRuns();
37
+ sendJson(res, 200, {
38
+ runs: incomplete.map((m) => ({
39
+ runId: m.runId,
40
+ startedAt: m.startedAt,
41
+ target: m.target,
42
+ projectName: m.projectName,
43
+ resourceCount: m.resources.filter((r) => r.status === 'created').length,
44
+ resources: m.resources.filter((r) => r.status === 'created').map((r) => `${r.type}: ${r.id}`),
45
+ })),
46
+ });
47
+ });
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Provisioning API — post-provision finalization steps.
3
+ * Sentry, env-validator, health monitoring, deploy logging.
4
+ * Split from provision.ts for file size (v23.3).
5
+ */
6
+ import type { ProvisionEvent, CreatedResource } from '../lib/provisioners/types.js';
7
+ export interface PostProvisionOpts {
8
+ projectDir: string;
9
+ framework: string;
10
+ deployTarget: string;
11
+ projectName: string;
12
+ hostname: string;
13
+ region: string;
14
+ runId: string;
15
+ outputs: Record<string, string>;
16
+ resources: CreatedResource[];
17
+ sentryDsn: string | undefined;
18
+ emit: (event: ProvisionEvent) => void;
19
+ }
20
+ /** Run post-provision finalization: sentry, env-validator, health monitoring, deploy logging. */
21
+ export declare function runPostProvisionSteps(opts: PostProvisionOpts): Promise<void>;
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Provisioning API — post-provision finalization steps.
3
+ * Sentry, env-validator, health monitoring, deploy logging.
4
+ * Split from provision.ts for file size (v23.3).
5
+ */
6
+ import { generateEnvValidator } from '../lib/env-validator.js';
7
+ import { logDeploy } from '../lib/deploy-log.js';
8
+ import { setupHealthMonitoring } from '../lib/health-monitor.js';
9
+ import { generateSentryInit } from '../lib/sentry-generator.js';
10
+ import { stripSecrets } from './provision-validate.js';
11
+ /** Run post-provision finalization: sentry, env-validator, health monitoring, deploy logging. */
12
+ export async function runPostProvisionSteps(opts) {
13
+ const { projectDir, framework, deployTarget, projectName, hostname, region, runId, outputs, resources, sentryDsn, emit } = opts;
14
+ // ── Sentry integration (ADR-024) ──────────────────────────────
15
+ await generateSentryInit(projectDir, framework, sentryDsn, emit);
16
+ // ── Environment validation script (ADR-018) ──────────────────
17
+ const envResult = await generateEnvValidator(projectDir, framework);
18
+ if (envResult.file) {
19
+ const hint = envResult.file.endsWith('.py')
20
+ ? 'Add "python validate_env.py &&" before your start command'
21
+ : 'Add "node validate-env.js &&" before your start command in package.json';
22
+ emit({ step: 'env-validator', status: 'done', message: `Generated ${envResult.file} — ${hint}` });
23
+ }
24
+ else {
25
+ emit({ step: 'env-validator', status: 'skipped', message: 'No .env file found — env validation script skipped' });
26
+ }
27
+ // ── Health monitoring (ADR-023) ──────────────────────────────
28
+ const deployUrl = outputs['DEPLOY_URL'] || '';
29
+ await setupHealthMonitoring(deployTarget, projectDir, projectName, deployUrl, outputs, emit);
30
+ // ── Deploy logging (ADR-021) ─────────────────────────────────
31
+ try {
32
+ const logOutputs = stripSecrets(outputs);
33
+ const logPath = await logDeploy({
34
+ runId, timestamp: new Date().toISOString(), target: deployTarget,
35
+ projectName, framework, deployUrl: outputs['DEPLOY_URL'] || '', hostname, region,
36
+ resources: resources.map(r => ({ type: r.type, id: r.id })),
37
+ outputs: logOutputs,
38
+ });
39
+ emit({ step: 'deploy-log', status: 'done', message: `Deploy logged to ${logPath}` });
40
+ }
41
+ catch {
42
+ // Non-fatal — deploy succeeded even if logging fails
43
+ }
44
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Provisioning API — shared state, credential helpers, cleanup route.
3
+ * Split from provision.ts for file size (v23.3).
4
+ */
5
+ import type { CreatedResource } from '../lib/provisioners/types.js';
6
+ /** Tracks resources per provisioning run by ID, keyed by runId. */
7
+ export interface ProvisionRun {
8
+ resources: CreatedResource[];
9
+ credentials: Record<string, string>;
10
+ target: string;
11
+ }
12
+ export declare const provisionRuns: Map<string, ProvisionRun>;
13
+ /** Concurrency lock — only one provisioning run at a time (F-02). */
14
+ export declare let activeProvisionRun: string | null;
15
+ export declare function setActiveProvisionRun(runId: string | null): void;
16
+ /** Scope credentials to only the keys a provisioner needs. Internal _-prefixed keys pass through. */
17
+ export declare function scopeCredentials(allCreds: Record<string, string>, target: string): Record<string, string>;
18
+ /** Strip secret values from an outputs map, preserving allowlisted keys. */
19
+ export declare function stripSecrets(outputs: Record<string, string>): Record<string, string>;
20
+ /** Build minimal credential set needed for cleanup of a given deploy target. */
21
+ export declare function buildCleanupCredentials(target: string, allCreds: Record<string, string>, hasDnsRecords: boolean): Record<string, string>;
22
+ export declare function loadCredentials(password: string): Promise<Record<string, string>>;
@@ -0,0 +1,164 @@
1
+ /**
2
+ * Provisioning API — shared state, credential helpers, cleanup route.
3
+ * Split from provision.ts for file size (v23.3).
4
+ */
5
+ import { addRoute } from '../router.js';
6
+ import { getSessionPassword } from './credentials.js';
7
+ import { vaultGet, vaultKeys } from '../lib/vault.js';
8
+ import { parseJsonBody } from '../lib/body-parser.js';
9
+ import { provisioners, provisionKeys } from '../lib/provisioner-registry.js';
10
+ import { updateManifestStatus, readManifest, deleteManifest, manifestToCreatedResources, } from '../lib/provision-manifest.js';
11
+ import { cleanupDnsRecords } from '../lib/dns/cloudflare-dns.js';
12
+ import { sendJson } from '../lib/http-helpers.js';
13
+ export const provisionRuns = new Map();
14
+ /** Concurrency lock — only one provisioning run at a time (F-02). */
15
+ export let activeProvisionRun = null;
16
+ export function setActiveProvisionRun(runId) {
17
+ activeProvisionRun = runId;
18
+ }
19
+ /** Scope credentials to only the keys a provisioner needs. Internal _-prefixed keys pass through. */
20
+ export function scopeCredentials(allCreds, target) {
21
+ const allowed = provisionKeys[target] || [];
22
+ const scoped = {};
23
+ for (const key of allowed) {
24
+ if (allCreds[key])
25
+ scoped[key] = allCreds[key];
26
+ }
27
+ // Internal keys (injected by pre-steps) always pass through
28
+ for (const [key, val] of Object.entries(allCreds)) {
29
+ if (key.startsWith('_'))
30
+ scoped[key] = val;
31
+ }
32
+ return scoped;
33
+ }
34
+ /** Secret keywords to strip from SSE outputs and deploy logs. */
35
+ const SECRET_KEYWORDS = [
36
+ 'password', 'secret', 'token', 'credential', '_key', '_pass',
37
+ '_pwd', 'passphrase', 'bearer', 'oauth', 'jwt', 'signing',
38
+ 'private', 'connection_uri', 'database_url', 'redis_url', 'mongo_uri',
39
+ 'cert', 'hmac', 'auth_code',
40
+ ];
41
+ /** Keys that are safe to include in outputs despite matching secret keywords. */
42
+ const SAFE_OUTPUT_KEYS = new Set(['DEPLOY_URL', 'S3_WEBSITE_URL', 'CF_PROJECT_URL', 'GITHUB_REPO_URL', 'SSH_KEY_PATH']);
43
+ /** Strip secret values from an outputs map, preserving allowlisted keys. */
44
+ export function stripSecrets(outputs) {
45
+ const safe = { ...outputs };
46
+ delete safe['DB_PASSWORD'];
47
+ delete safe['GITHUB_TOKEN'];
48
+ for (const key of Object.keys(safe)) {
49
+ if (SAFE_OUTPUT_KEYS.has(key))
50
+ continue;
51
+ const lk = key.toLowerCase();
52
+ if (SECRET_KEYWORDS.some((kw) => lk.includes(kw))) {
53
+ delete safe[key];
54
+ }
55
+ }
56
+ return safe;
57
+ }
58
+ /** Build minimal credential set needed for cleanup of a given deploy target. */
59
+ export function buildCleanupCredentials(target, allCreds, hasDnsRecords) {
60
+ const cleanupCreds = {};
61
+ const cleanupKeys = {
62
+ vps: ['aws-access-key-id', 'aws-secret-access-key', 'aws-region'],
63
+ static: ['aws-access-key-id', 'aws-secret-access-key', 'aws-region'],
64
+ vercel: ['vercel-token'],
65
+ railway: ['railway-token'],
66
+ cloudflare: ['cloudflare-api-token'],
67
+ docker: [],
68
+ };
69
+ for (const key of (cleanupKeys[target] || [])) {
70
+ if (allCreds[key])
71
+ cleanupCreds[key] = allCreds[key];
72
+ }
73
+ if (hasDnsRecords && allCreds['cloudflare-api-token']) {
74
+ cleanupCreds['cloudflare-api-token'] = allCreds['cloudflare-api-token'];
75
+ }
76
+ return cleanupCreds;
77
+ }
78
+ export async function loadCredentials(password) {
79
+ const keys = await vaultKeys(password);
80
+ const creds = {};
81
+ for (const key of keys) {
82
+ const val = await vaultGet(password, key);
83
+ if (val)
84
+ creds[key] = val;
85
+ }
86
+ return creds;
87
+ }
88
+ // POST /api/provision/cleanup — clean up resources from a provisioning run
89
+ addRoute('POST', '/api/provision/cleanup', async (req, res) => {
90
+ const password = getSessionPassword();
91
+ if (!password) {
92
+ sendJson(res, 401, { error: 'Vault is locked.' });
93
+ return;
94
+ }
95
+ const body = await parseJsonBody(req);
96
+ // If no runId provided, clean up the most recent run
97
+ let runId = body.runId;
98
+ if (!runId) {
99
+ const keys = [...provisionRuns.keys()];
100
+ runId = keys[keys.length - 1];
101
+ }
102
+ // Try in-memory runs first, then fall back to disk manifests (crash recovery)
103
+ let target;
104
+ let resources;
105
+ let credentials;
106
+ if (runId && provisionRuns.has(runId)) {
107
+ const run = provisionRuns.get(runId);
108
+ target = run.target;
109
+ resources = run.resources;
110
+ credentials = run.credentials;
111
+ }
112
+ else if (runId) {
113
+ // Crash recovery: load from disk manifest + vault credentials
114
+ const manifest = await readManifest(runId);
115
+ if (!manifest || manifest.status === 'cleaned') {
116
+ sendJson(res, 200, { cleaned: true, message: 'No resources to clean up' });
117
+ return;
118
+ }
119
+ target = manifest.target;
120
+ resources = manifestToCreatedResources(manifest);
121
+ credentials = await loadCredentials(password);
122
+ }
123
+ else {
124
+ sendJson(res, 200, { cleaned: true, message: 'No resources to clean up' });
125
+ return;
126
+ }
127
+ if (resources.length === 0) {
128
+ await deleteManifest(runId);
129
+ sendJson(res, 200, { cleaned: true, message: 'No resources to clean up' });
130
+ return;
131
+ }
132
+ const provisioner = provisioners[target];
133
+ if (!provisioner) {
134
+ sendJson(res, 400, { error: `Unknown target: ${target}` });
135
+ return;
136
+ }
137
+ try {
138
+ // Clean up DNS records separately (they're not managed by the provisioner)
139
+ // Skip github-repo — repos are tracked for idempotency, not cleanup (ADR-012)
140
+ const dnsResources = resources.filter((r) => r.type === 'dns-record');
141
+ const infraResources = resources.filter((r) => r.type !== 'dns-record' && r.type !== 'github-repo');
142
+ if (dnsResources.length > 0 && credentials['cloudflare-api-token']) {
143
+ await cleanupDnsRecords(credentials['cloudflare-api-token'], dnsResources.map((r) => r.id));
144
+ }
145
+ // Clean up infrastructure resources via the provisioner
146
+ if (infraResources.length > 0) {
147
+ await provisioner.cleanup(infraResources, credentials);
148
+ }
149
+ const count = resources.length;
150
+ provisionRuns.delete(runId);
151
+ await updateManifestStatus(runId, 'cleaned');
152
+ await deleteManifest(runId);
153
+ const notes = [];
154
+ // Domain registration and GitHub repos are irreversible — always warn
155
+ notes.push('Note: If a domain was registered during this run, that purchase cannot be reversed. Manage it at dash.cloudflare.com.');
156
+ if (resources.some((r) => r.type === 'github-repo')) {
157
+ notes.push('Note: GitHub repository was not deleted (repos are preserved). Delete manually at github.com if needed.');
158
+ }
159
+ sendJson(res, 200, { cleaned: true, message: `Cleaned up ${count} resources`, notes });
160
+ }
161
+ catch (err) {
162
+ sendJson(res, 500, { error: `Cleanup failed: ${err.message}` });
163
+ }
164
+ });
@@ -0,0 +1,2 @@
1
+ import './provision-validate.js';
2
+ import './provision-status.js';