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,79 @@
1
+ /**
2
+ * Shared HTTPS client for provisioner API calls.
3
+ * Uses raw node:https — no dependencies.
4
+ *
5
+ * Security: All callers hardcode hostnames (api.cloudflare.com, etc.).
6
+ * Never pass user-controlled input as the hostname parameter.
7
+ */
8
+ import { request as httpsRequest } from 'node:https';
9
+ export function httpsGet(hostname, path, headers, timeout) {
10
+ return httpsCallWithRetry('GET', hostname, path, headers, undefined, timeout);
11
+ }
12
+ export function httpsPost(hostname, path, headers, body, timeout) {
13
+ return httpsCallWithRetry('POST', hostname, path, headers, body, timeout);
14
+ }
15
+ export function httpsPut(hostname, path, headers, body, timeout) {
16
+ return httpsCallWithRetry('PUT', hostname, path, headers, body, timeout);
17
+ }
18
+ export function httpsDelete(hostname, path, headers, timeout) {
19
+ return httpsCallWithRetry('DELETE', hostname, path, headers, undefined, timeout);
20
+ }
21
+ /** Slugify a name for use as a cloud resource identifier. Strips non-alphanumeric, trims hyphens. */
22
+ export function slugify(name) {
23
+ const slug = name.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '').slice(0, 40);
24
+ return slug || 'voidforge-project';
25
+ }
26
+ /** Safely parse JSON — returns null on invalid input instead of throwing. */
27
+ export function safeJsonParse(body) {
28
+ try {
29
+ return JSON.parse(body);
30
+ }
31
+ catch {
32
+ return null;
33
+ }
34
+ }
35
+ const DEFAULT_TIMEOUT = 30000;
36
+ const MAX_RETRIES = 1;
37
+ const RETRY_DELAY_MS = 2000;
38
+ const TRANSIENT_CODES = ['ECONNRESET', 'ETIMEDOUT', 'ENOTFOUND', 'EPIPE'];
39
+ /**
40
+ * Wrapper around httpsCall that retries once on transient network errors.
41
+ * Transient errors: ECONNRESET, ETIMEDOUT, ENOTFOUND, EPIPE, socket hang up.
42
+ */
43
+ async function httpsCallWithRetry(method, hostname, path, headers, body, timeout) {
44
+ for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
45
+ try {
46
+ return await httpsCall(method, hostname, path, headers, body, timeout);
47
+ }
48
+ catch (err) {
49
+ const code = err.code;
50
+ const isTransient = TRANSIENT_CODES.includes(code || '') ||
51
+ err.message.includes('socket hang up');
52
+ if (attempt < MAX_RETRIES && isTransient) {
53
+ await new Promise(r => setTimeout(r, RETRY_DELAY_MS));
54
+ continue;
55
+ }
56
+ throw err;
57
+ }
58
+ }
59
+ // Unreachable — the loop always returns or throws — but TypeScript needs this
60
+ throw new Error('Retry loop exited unexpectedly');
61
+ }
62
+ function httpsCall(method, hostname, path, headers, body, timeout) {
63
+ return new Promise((resolve, reject) => {
64
+ const opts = { hostname, path, method, headers, timeout: timeout ?? DEFAULT_TIMEOUT };
65
+ if (body) {
66
+ headers['Content-Length'] = String(Buffer.byteLength(body));
67
+ }
68
+ const req = httpsRequest(opts, (res) => {
69
+ let data = '';
70
+ res.on('data', (chunk) => { data += chunk.toString(); });
71
+ res.on('end', () => resolve({ status: res.statusCode ?? 0, body: data }));
72
+ });
73
+ req.on('error', reject);
74
+ req.on('timeout', () => { req.destroy(); reject(new Error('Request timed out')); });
75
+ if (body)
76
+ req.write(body);
77
+ req.end();
78
+ });
79
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Railway provisioner — configuration, GraphQL helpers, template deployment,
3
+ * config file generation, and cleanup.
4
+ */
5
+ import type { ProvisionContext, ProvisionEmitter, CreatedResource } from './types.js';
6
+ /** Execute a Railway GraphQL query. */
7
+ export declare function gql(token: string, query: string, variables?: Record<string, unknown>): Promise<{
8
+ status: number;
9
+ body: string;
10
+ }>;
11
+ export declare const DEPLOY_POLL_INTERVAL_MS = 5000;
12
+ export declare const DEPLOY_POLL_TIMEOUT_MS = 300000;
13
+ /** Validate Railway provisioner context. */
14
+ export declare function validateRailwayContext(ctx: ProvisionContext): string[];
15
+ /** Deploy a database/redis template or fall back to serviceCreate. */
16
+ export declare function deployTemplate(token: string, projectId: string, environmentId: string, ctx: ProvisionContext, resources: CreatedResource[], templateName: string, resourceLabel: string, displayName: string, emit: ProvisionEmitter): Promise<void>;
17
+ /** Generate railway.toml configuration file. */
18
+ export declare function generateRailwayConfig(ctx: ProvisionContext, projectId: string, files: string[], emit: ProvisionEmitter): Promise<void>;
19
+ /** Write Railway environment details to .env. */
20
+ export declare function writeRailwayEnv(ctx: ProvisionContext, projectId: string, outputs: Record<string, string>, ghOwner: string | undefined, emit: ProvisionEmitter): Promise<void>;
21
+ /** Step 7: Poll for Railway deployment completion. */
22
+ export declare function pollDeployment(ctx: ProvisionContext, token: string, serviceId: string, environmentId: string, outputs: Record<string, string>, ghOwner: string | undefined, emit: ProvisionEmitter): Promise<void>;
23
+ /** Delete Railway project (services are deleted with it). */
24
+ export declare function cleanupRailway(resources: CreatedResource[], credentials: Record<string, string>): Promise<void>;
@@ -0,0 +1,220 @@
1
+ /**
2
+ * Railway provisioner — configuration, GraphQL helpers, template deployment,
3
+ * config file generation, and cleanup.
4
+ */
5
+ import { writeFile } from 'node:fs/promises';
6
+ import { join } from 'node:path';
7
+ import { httpsPost, safeJsonParse } from './http-client.js';
8
+ import { recordResourcePending, recordResourceCreated } from '../provision-manifest.js';
9
+ import { appendEnvSection } from '../env-writer.js';
10
+ /** Execute a Railway GraphQL query. */
11
+ export function gql(token, query, variables) {
12
+ const body = JSON.stringify({ query, variables });
13
+ return httpsPost('backboard.railway.com', '/graphql/v2', {
14
+ 'Authorization': `Bearer ${token}`,
15
+ 'Content-Type': 'application/json',
16
+ }, body);
17
+ }
18
+ export const DEPLOY_POLL_INTERVAL_MS = 5000;
19
+ export const DEPLOY_POLL_TIMEOUT_MS = 300_000;
20
+ /** Validate Railway provisioner context. */
21
+ export function validateRailwayContext(ctx) {
22
+ const errors = [];
23
+ if (!ctx.projectDir)
24
+ errors.push('Project directory is required');
25
+ if (!ctx.credentials['railway-token'])
26
+ errors.push('Railway API token is required');
27
+ return errors;
28
+ }
29
+ /** Deploy a database/redis template or fall back to serviceCreate. */
30
+ export async function deployTemplate(token, projectId, environmentId, ctx, resources, templateName, resourceLabel, displayName, emit) {
31
+ await recordResourcePending(ctx.runId, 'railway-service', `${projectId}-${resourceLabel}`, 'global');
32
+ // Only attempt templateDeploy if we have a valid environment ID
33
+ if (environmentId) {
34
+ try {
35
+ const res = await gql(token, `
36
+ mutation($projectId: String!, $environmentId: String!, $template: String!) {
37
+ templateDeploy(input: {
38
+ projectId: $projectId,
39
+ environmentId: $environmentId,
40
+ services: [{ template: $template, hasDomain: false }]
41
+ }) {
42
+ projectId
43
+ workflowId
44
+ }
45
+ }
46
+ `, { projectId, environmentId, template: templateName });
47
+ if (res.status === 200) {
48
+ const data = safeJsonParse(res.body);
49
+ if (!data?.errors || data.errors.length === 0) {
50
+ resources.push({ type: 'railway-service', id: `${projectId}-${resourceLabel}`, region: 'global' });
51
+ await recordResourceCreated(ctx.runId, 'railway-service', `${projectId}-${resourceLabel}`, 'global');
52
+ emit({ step: `railway-${resourceLabel}`, status: 'done', message: `${displayName} deployed via template — connection string available in Railway dashboard` });
53
+ return;
54
+ }
55
+ }
56
+ }
57
+ catch {
58
+ // Fall through to serviceCreate fallback
59
+ }
60
+ }
61
+ // Fallback: create a bare service (user configures the database image in dashboard)
62
+ const svcRes = await gql(token, `
63
+ mutation($projectId: String!, $name: String!) {
64
+ serviceCreate(input: { projectId: $projectId, name: $name }) {
65
+ id
66
+ name
67
+ }
68
+ }
69
+ `, { projectId, name: `${ctx.projectName}-${templateName}` });
70
+ if (svcRes.status === 200) {
71
+ const svcData = safeJsonParse(svcRes.body);
72
+ const svcId = svcData?.data?.serviceCreate?.id;
73
+ if (svcId) {
74
+ resources.push({ type: 'railway-service', id: svcId, region: 'global' });
75
+ await recordResourceCreated(ctx.runId, 'railway-service', svcId, 'global');
76
+ emit({ step: `railway-${resourceLabel}`, status: 'done', message: `${displayName} service created — configure database image in Railway dashboard` });
77
+ }
78
+ else {
79
+ emit({ step: `railway-${resourceLabel}`, status: 'error', message: `${displayName} service creation returned no ID`, detail: 'Create the database manually in the Railway dashboard' });
80
+ }
81
+ }
82
+ else {
83
+ emit({ step: `railway-${resourceLabel}`, status: 'error', message: `Failed to create ${displayName} service (API returned ${svcRes.status})`, detail: 'Create the database manually in the Railway dashboard' });
84
+ }
85
+ }
86
+ /** Generate railway.toml configuration file. */
87
+ export async function generateRailwayConfig(ctx, projectId, files, emit) {
88
+ emit({ step: 'railway-config', status: 'started', message: 'Generating railway.toml' });
89
+ try {
90
+ const framework = ctx.framework || 'express';
91
+ const startCommand = framework === 'next.js'
92
+ ? 'npm run start'
93
+ : framework === 'django'
94
+ ? 'gunicorn config.wsgi:application --bind 0.0.0.0:$PORT'
95
+ : 'node dist/index.js';
96
+ const buildCommand = framework === 'django'
97
+ ? 'pip install -r requirements.txt && python manage.py collectstatic --noinput'
98
+ : 'npm ci && npm run build';
99
+ const config = `# railway.toml — Railway deployment configuration
100
+ # Generated by VoidForge
101
+ # Deploy with: railway link ${projectId} && railway up
102
+
103
+ [build]
104
+ builder = "nixpacks"
105
+ buildCommand = "${buildCommand}"
106
+
107
+ [deploy]
108
+ startCommand = "${startCommand}"
109
+ healthcheckPath = "/"
110
+ restartPolicyType = "on_failure"
111
+ restartPolicyMaxRetries = 3
112
+ `;
113
+ await writeFile(join(ctx.projectDir, 'railway.toml'), config, 'utf-8');
114
+ files.push('railway.toml');
115
+ emit({ step: 'railway-config', status: 'done', message: 'Generated railway.toml' });
116
+ }
117
+ catch (err) {
118
+ emit({ step: 'railway-config', status: 'error', message: 'Failed to write railway.toml', detail: err.message });
119
+ }
120
+ }
121
+ /** Write Railway environment details to .env. */
122
+ export async function writeRailwayEnv(ctx, projectId, outputs, ghOwner, emit) {
123
+ emit({ step: 'railway-env', status: 'started', message: 'Writing Railway config to .env' });
124
+ try {
125
+ const envLines = [
126
+ `# VoidForge Railway — generated ${new Date().toISOString()}`,
127
+ `RAILWAY_PROJECT_ID=${projectId}`,
128
+ `RAILWAY_PROJECT_NAME=${outputs['RAILWAY_PROJECT_NAME'] || ctx.projectName}`,
129
+ ];
130
+ if (outputs['DEPLOY_URL'])
131
+ envLines.push(`DEPLOY_URL=${outputs['DEPLOY_URL']}`);
132
+ envLines.push(ghOwner ? '# Auto-deploys on push to main' : `# Deploy with: railway link ${projectId} && railway up`);
133
+ await appendEnvSection(ctx.projectDir, envLines);
134
+ emit({ step: 'railway-env', status: 'done', message: 'Railway config written to .env' });
135
+ }
136
+ catch (err) {
137
+ emit({ step: 'railway-env', status: 'error', message: 'Failed to write .env', detail: err.message });
138
+ }
139
+ }
140
+ /** Step 7: Poll for Railway deployment completion. */
141
+ export async function pollDeployment(ctx, token, serviceId, environmentId, outputs, ghOwner, emit) {
142
+ if (!serviceId || !environmentId) {
143
+ if (!ghOwner) {
144
+ emit({ step: 'railway-deploy', status: 'skipped', message: 'No GitHub repo linked — deploy manually with: railway link && railway up' });
145
+ }
146
+ return;
147
+ }
148
+ emit({ step: 'railway-deploy', status: 'started', message: 'Waiting for Railway deployment...' });
149
+ try {
150
+ const start = Date.now();
151
+ let deployUrl = '';
152
+ while (Date.now() - start < DEPLOY_POLL_TIMEOUT_MS) {
153
+ await new Promise(r => setTimeout(r, DEPLOY_POLL_INTERVAL_MS));
154
+ if (ctx.abortSignal?.aborted)
155
+ break;
156
+ const depRes = await gql(token, `
157
+ query($serviceId: String!) {
158
+ service(id: $serviceId) {
159
+ serviceInstances { edges { node {
160
+ domains { serviceDomains { domain } }
161
+ latestDeployment { status }
162
+ } } }
163
+ }
164
+ }
165
+ `, { serviceId });
166
+ if (depRes.status === 200) {
167
+ const depData = safeJsonParse(depRes.body);
168
+ const instance = depData?.data?.service?.serviceInstances?.edges?.[0]?.node;
169
+ const deployStatus = instance?.latestDeployment?.status;
170
+ const domain = instance?.domains?.serviceDomains?.[0]?.domain;
171
+ if (deployStatus === 'SUCCESS' && domain) {
172
+ deployUrl = `https://${domain}`;
173
+ break;
174
+ }
175
+ if (deployStatus === 'FAILED' || deployStatus === 'CRASHED') {
176
+ emit({ step: 'railway-deploy', status: 'error', message: `Deployment ${deployStatus.toLowerCase()} — check Railway dashboard` });
177
+ break;
178
+ }
179
+ }
180
+ const elapsed = Math.round((Date.now() - start) / 1000);
181
+ if (elapsed % 15 === 0) {
182
+ emit({ step: 'railway-deploy', status: 'started', message: `Waiting for deployment... (${elapsed}s)` });
183
+ }
184
+ }
185
+ if (deployUrl) {
186
+ outputs['DEPLOY_URL'] = deployUrl;
187
+ if (!outputs['RAILWAY_CUSTOM_DOMAIN']) {
188
+ outputs['RAILWAY_DOMAIN'] = deployUrl.replace('https://', '');
189
+ }
190
+ emit({ step: 'railway-deploy', status: 'done', message: `Live at ${deployUrl}` });
191
+ }
192
+ else if (!ctx.abortSignal?.aborted) {
193
+ emit({ step: 'railway-deploy', status: 'error', message: 'Deployment polling timed out — check Railway dashboard' });
194
+ }
195
+ }
196
+ catch (err) {
197
+ emit({ step: 'railway-deploy', status: 'error', message: 'Failed to poll deployment', detail: err.message });
198
+ }
199
+ }
200
+ /** Delete Railway project (services are deleted with it). */
201
+ export async function cleanupRailway(resources, credentials) {
202
+ const token = credentials['railway-token'];
203
+ if (!token)
204
+ return;
205
+ for (const resource of resources) {
206
+ if (resource.type === 'railway-project') {
207
+ try {
208
+ await gql(token, `
209
+ mutation($id: String!) {
210
+ projectDelete(id: $id)
211
+ }
212
+ `, { id: resource.id });
213
+ }
214
+ catch (err) {
215
+ console.error(`Failed to delete Railway project ${resource.id}:`, err.message);
216
+ }
217
+ }
218
+ // Plugins are deleted with the project — no need to delete separately
219
+ }
220
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Railway provisioner — deployment logic: project creation, service management,
3
+ * GitHub linking, custom domains, environment variables, and deploy polling.
4
+ */
5
+ import type { ProvisionContext, ProvisionEmitter, CreatedResource } from './types.js';
6
+ /** Step 1: Create Railway project. Returns projectId or null on failure. */
7
+ export declare function createProject(ctx: ProvisionContext, token: string, resources: CreatedResource[], outputs: Record<string, string>, emit: ProvisionEmitter): Promise<string | null>;
8
+ /** Fetch the default environment ID for a Railway project. */
9
+ export declare function fetchEnvironmentId(token: string, projectId: string, emit: ProvisionEmitter): Promise<string>;
10
+ /** Step 2: Add database service if requested (ADR-019: template services). */
11
+ export declare function addDatabaseService(ctx: ProvisionContext, token: string, projectId: string, environmentId: string, resources: CreatedResource[], outputs: Record<string, string>, emit: ProvisionEmitter): Promise<void>;
12
+ /** Step 3: Add Redis service if cache requested (ADR-019: template services). */
13
+ export declare function addRedisService(ctx: ProvisionContext, token: string, projectId: string, environmentId: string, resources: CreatedResource[], emit: ProvisionEmitter): Promise<void>;
14
+ /** Step 4: Create service with GitHub source (ADR-015). Returns serviceId. */
15
+ export declare function createGitHubService(ctx: ProvisionContext, token: string, projectId: string, resources: CreatedResource[], emit: ProvisionEmitter): Promise<string>;
16
+ /** Step 5: Add custom domain to Railway service. */
17
+ export declare function addCustomDomain(ctx: ProvisionContext, token: string, projectId: string, serviceId: string, environmentId: string, outputs: Record<string, string>, emit: ProvisionEmitter): Promise<void>;
18
+ /** Step 6: Set environment variables on the service. */
19
+ export declare function setEnvironmentVariables(ctx: ProvisionContext, token: string, projectId: string, serviceId: string, environmentId: string, emit: ProvisionEmitter): Promise<void>;
@@ -0,0 +1,205 @@
1
+ /**
2
+ * Railway provisioner — deployment logic: project creation, service management,
3
+ * GitHub linking, custom domains, environment variables, and deploy polling.
4
+ */
5
+ import { safeJsonParse } from './http-client.js';
6
+ import { recordResourcePending, recordResourceCreated } from '../provision-manifest.js';
7
+ import { gql, deployTemplate } from './railway-config.js';
8
+ /** Step 1: Create Railway project. Returns projectId or null on failure. */
9
+ export async function createProject(ctx, token, resources, outputs, emit) {
10
+ emit({ step: 'railway-project', status: 'started', message: 'Creating Railway project' });
11
+ try {
12
+ await recordResourcePending(ctx.runId, 'railway-project', ctx.projectName, 'global');
13
+ const res = await gql(token, `
14
+ mutation($name: String!) {
15
+ projectCreate(input: { name: $name }) {
16
+ id
17
+ name
18
+ }
19
+ }
20
+ `, { name: ctx.projectName });
21
+ if (res.status !== 200) {
22
+ throw new Error(`Railway API returned ${res.status}`);
23
+ }
24
+ const data = safeJsonParse(res.body);
25
+ if (data.errors && data.errors.length > 0) {
26
+ throw new Error(data.errors[0].message);
27
+ }
28
+ const projectId = data.data?.projectCreate?.id ?? '';
29
+ if (!projectId)
30
+ throw new Error('No project ID returned');
31
+ resources.push({ type: 'railway-project', id: projectId, region: 'global' });
32
+ await recordResourceCreated(ctx.runId, 'railway-project', projectId, 'global');
33
+ outputs['RAILWAY_PROJECT_ID'] = projectId;
34
+ outputs['RAILWAY_PROJECT_NAME'] = data.data?.projectCreate?.name ?? ctx.projectName;
35
+ emit({ step: 'railway-project', status: 'done', message: `Project "${outputs['RAILWAY_PROJECT_NAME']}" created on Railway` });
36
+ return projectId;
37
+ }
38
+ catch (err) {
39
+ emit({ step: 'railway-project', status: 'error', message: 'Failed to create Railway project', detail: err.message });
40
+ return null;
41
+ }
42
+ }
43
+ /** Fetch the default environment ID for a Railway project. */
44
+ export async function fetchEnvironmentId(token, projectId, emit) {
45
+ try {
46
+ const envRes = await gql(token, `
47
+ query($projectId: String!) {
48
+ project(id: $projectId) {
49
+ environments { edges { node { id name } } }
50
+ }
51
+ }
52
+ `, { projectId });
53
+ if (envRes.status === 200) {
54
+ const envData = safeJsonParse(envRes.body);
55
+ const edges = envData?.data?.project?.environments?.edges ?? [];
56
+ const prodEnv = edges.find(e => e.node.name === 'production') || edges[0];
57
+ return prodEnv?.node.id ?? '';
58
+ }
59
+ }
60
+ catch {
61
+ emit({ step: 'railway-env', status: 'error', message: 'Could not fetch project environment — database/redis services will use fallback creation', detail: 'Environment query failed' });
62
+ }
63
+ return '';
64
+ }
65
+ /** Step 2: Add database service if requested (ADR-019: template services). */
66
+ export async function addDatabaseService(ctx, token, projectId, environmentId, resources, outputs, emit) {
67
+ if (ctx.database === 'postgres' || ctx.database === 'mysql') {
68
+ const dbType = ctx.database === 'postgres' ? 'Postgres' : 'MySQL';
69
+ const templateName = ctx.database === 'postgres' ? 'postgres' : 'mysql';
70
+ emit({ step: 'railway-db', status: 'started', message: `Adding ${dbType} service to Railway project` });
71
+ try {
72
+ await deployTemplate(token, projectId, environmentId, ctx, resources, templateName, 'db', dbType, emit);
73
+ outputs['RAILWAY_DB_TYPE'] = dbType;
74
+ }
75
+ catch (err) {
76
+ emit({ step: 'railway-db', status: 'error', message: `Failed to add ${dbType} service`, detail: err.message });
77
+ }
78
+ }
79
+ else {
80
+ emit({ step: 'railway-db', status: 'skipped', message: ctx.database === 'sqlite' ? 'SQLite — no remote database service needed' : 'No database requested' });
81
+ }
82
+ }
83
+ /** Step 3: Add Redis service if cache requested (ADR-019: template services). */
84
+ export async function addRedisService(ctx, token, projectId, environmentId, resources, emit) {
85
+ if (ctx.cache === 'redis') {
86
+ emit({ step: 'railway-redis', status: 'started', message: 'Adding Redis service to Railway project' });
87
+ try {
88
+ await deployTemplate(token, projectId, environmentId, ctx, resources, 'redis', 'redis', 'Redis', emit);
89
+ }
90
+ catch (err) {
91
+ emit({ step: 'railway-redis', status: 'error', message: 'Failed to add Redis service', detail: err.message });
92
+ }
93
+ }
94
+ else {
95
+ emit({ step: 'railway-redis', status: 'skipped', message: 'No cache requested' });
96
+ }
97
+ }
98
+ /** Step 4: Create service with GitHub source (ADR-015). Returns serviceId. */
99
+ export async function createGitHubService(ctx, token, projectId, resources, emit) {
100
+ const ghOwner = ctx.credentials['_github-owner'];
101
+ const ghRepo = ctx.credentials['_github-repo-name'];
102
+ if (!projectId || !ghOwner || !ghRepo)
103
+ return '';
104
+ emit({ step: 'railway-service', status: 'started', message: `Creating service linked to ${ghOwner}/${ghRepo}` });
105
+ try {
106
+ const svcRes = await gql(token, `
107
+ mutation($projectId: String!, $repo: String!) {
108
+ serviceCreate(input: {
109
+ projectId: $projectId,
110
+ source: { repo: $repo }
111
+ }) {
112
+ id
113
+ name
114
+ }
115
+ }
116
+ `, { projectId, repo: `${ghOwner}/${ghRepo}` });
117
+ if (svcRes.status === 200) {
118
+ const svcData = safeJsonParse(svcRes.body);
119
+ if (svcData?.errors?.length) {
120
+ emit({ step: 'railway-service', status: 'error', message: 'Failed to create service', detail: svcData.errors[0].message });
121
+ return '';
122
+ }
123
+ const serviceId = svcData?.data?.serviceCreate?.id ?? '';
124
+ if (serviceId) {
125
+ resources.push({ type: 'railway-service', id: serviceId, region: 'global' });
126
+ await recordResourceCreated(ctx.runId, 'railway-service', serviceId, 'global');
127
+ }
128
+ emit({ step: 'railway-service', status: 'done', message: 'Service created — linked to GitHub repo' });
129
+ return serviceId;
130
+ }
131
+ }
132
+ catch (err) {
133
+ emit({ step: 'railway-service', status: 'error', message: 'Failed to create service', detail: err.message });
134
+ }
135
+ return '';
136
+ }
137
+ /** Step 5: Add custom domain to Railway service. */
138
+ export async function addCustomDomain(ctx, token, projectId, serviceId, environmentId, outputs, emit) {
139
+ if (ctx.hostname && projectId && serviceId && environmentId) {
140
+ emit({ step: 'railway-domain', status: 'started', message: `Adding domain ${ctx.hostname} to Railway service` });
141
+ try {
142
+ const domRes = await gql(token, `
143
+ mutation($projectId: String!, $environmentId: String!, $serviceId: String!, $domain: String!) {
144
+ customDomainCreate(input: { projectId: $projectId, environmentId: $environmentId, serviceId: $serviceId, domain: $domain }) {
145
+ id
146
+ domain
147
+ }
148
+ }
149
+ `, { projectId, environmentId, serviceId, domain: ctx.hostname });
150
+ if (domRes.status !== 200)
151
+ throw new Error(`Railway API returned ${domRes.status}`);
152
+ const domData = safeJsonParse(domRes.body);
153
+ if (domData?.errors && domData.errors.length > 0) {
154
+ throw new Error(domData.errors[0].message);
155
+ }
156
+ const domain = domData?.data?.customDomainCreate?.domain ?? ctx.hostname;
157
+ outputs['RAILWAY_CUSTOM_DOMAIN'] = domain;
158
+ emit({ step: 'railway-domain', status: 'done', message: `Domain "${domain}" added to Railway service` });
159
+ }
160
+ catch (err) {
161
+ emit({ step: 'railway-domain', status: 'error', message: 'Failed to add domain to Railway', detail: err.message });
162
+ }
163
+ }
164
+ else if (ctx.hostname && projectId && (!serviceId || !environmentId)) {
165
+ emit({ step: 'railway-domain', status: 'skipped', message: 'Cannot add domain — service or environment not available. Add domain manually in Railway dashboard.' });
166
+ }
167
+ }
168
+ /** Step 6: Set environment variables on the service. */
169
+ export async function setEnvironmentVariables(ctx, token, projectId, serviceId, environmentId, emit) {
170
+ if (!serviceId || !environmentId)
171
+ return;
172
+ emit({ step: 'railway-envvars', status: 'started', message: 'Setting environment variables' });
173
+ try {
174
+ const variables = {};
175
+ if (ctx.database === 'postgres' || ctx.database === 'mysql') {
176
+ variables['DATABASE_URL'] = ctx.database === 'postgres'
177
+ ? '${{Postgres.DATABASE_URL}}'
178
+ : '${{MySQL.DATABASE_URL}}';
179
+ }
180
+ if (ctx.cache === 'redis') {
181
+ variables['REDIS_URL'] = '${{Redis.REDIS_URL}}';
182
+ }
183
+ if (Object.keys(variables).length > 0) {
184
+ await gql(token, `
185
+ mutation($input: VariableCollectionUpsertInput!) {
186
+ variableCollectionUpsert(input: $input)
187
+ }
188
+ `, {
189
+ input: {
190
+ projectId,
191
+ serviceId,
192
+ environmentId,
193
+ variables,
194
+ },
195
+ });
196
+ emit({ step: 'railway-envvars', status: 'done', message: `Set ${Object.keys(variables).length} environment variables` });
197
+ }
198
+ else {
199
+ emit({ step: 'railway-envvars', status: 'done', message: 'No environment variables to set' });
200
+ }
201
+ }
202
+ catch (err) {
203
+ emit({ step: 'railway-envvars', status: 'error', message: 'Failed to set env vars', detail: err.message });
204
+ }
205
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Railway provisioner — orchestrator that coordinates project creation,
3
+ * service deployment, config generation, and cleanup.
4
+ */
5
+ import type { Provisioner } from './types.js';
6
+ export declare const railwayProvisioner: Provisioner;
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Railway provisioner — orchestrator that coordinates project creation,
3
+ * service deployment, config generation, and cleanup.
4
+ */
5
+ import { validateRailwayContext, generateRailwayConfig, writeRailwayEnv, cleanupRailway, pollDeployment } from './railway-config.js';
6
+ import { createProject, fetchEnvironmentId, addDatabaseService, addRedisService, createGitHubService, addCustomDomain, setEnvironmentVariables, } from './railway-deploy.js';
7
+ export const railwayProvisioner = {
8
+ async validate(ctx) {
9
+ return validateRailwayContext(ctx);
10
+ },
11
+ async provision(ctx, emit) {
12
+ const files = [];
13
+ const resources = [];
14
+ const outputs = {};
15
+ const token = ctx.credentials['railway-token'];
16
+ const ghOwner = ctx.credentials['_github-owner'];
17
+ // Step 1: Create Railway project
18
+ const projectId = await createProject(ctx, token, resources, outputs, emit);
19
+ if (!projectId) {
20
+ return { success: false, resources, outputs, files, error: outputs['error'] || 'Failed to create Railway project' };
21
+ }
22
+ // Fetch the default environment ID — shared by all subsequent steps
23
+ const environmentId = await fetchEnvironmentId(token, projectId, emit);
24
+ // Step 2: Add database service if requested
25
+ await addDatabaseService(ctx, token, projectId, environmentId, resources, outputs, emit);
26
+ // Step 3: Add Redis service if cache requested
27
+ await addRedisService(ctx, token, projectId, environmentId, resources, emit);
28
+ // Step 4: Create service with GitHub source
29
+ const serviceId = await createGitHubService(ctx, token, projectId, resources, emit);
30
+ // Step 5: Add custom domain
31
+ await addCustomDomain(ctx, token, projectId, serviceId, environmentId, outputs, emit);
32
+ // Step 6: Set environment variables
33
+ await setEnvironmentVariables(ctx, token, projectId, serviceId, environmentId, emit);
34
+ // Step 7: Poll for deployment
35
+ await pollDeployment(ctx, token, serviceId, environmentId, outputs, ghOwner, emit);
36
+ // Step 8: Generate railway.toml
37
+ await generateRailwayConfig(ctx, projectId, files, emit);
38
+ // Step 9: Write .env
39
+ await writeRailwayEnv(ctx, projectId, outputs, ghOwner, emit);
40
+ return { success: true, resources, outputs, files };
41
+ },
42
+ async cleanup(resources, credentials) {
43
+ await cleanupRailway(resources, credentials);
44
+ },
45
+ };
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Template: Caddyfile — reverse proxy + automatic HTTPS + security headers.
3
+ * Written to projectDir/infra/Caddyfile
4
+ */
5
+ interface CaddyfileOptions {
6
+ framework: string;
7
+ hostname?: string;
8
+ }
9
+ export declare function generateCaddyfile(opts: CaddyfileOptions): string;
10
+ export {};
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Template: Caddyfile — reverse proxy + automatic HTTPS + security headers.
3
+ * Written to projectDir/infra/Caddyfile
4
+ */
5
+ export function generateCaddyfile(opts) {
6
+ const port = opts.framework === 'django' ? '8000' : '3000';
7
+ const siteAddress = opts.hostname || ':80';
8
+ const comment = opts.hostname
9
+ ? `# Caddyfile — Reverse proxy for ${opts.hostname}
10
+ # Generated by VoidForge
11
+ #
12
+ # Caddy will auto-provision HTTPS via Let's Encrypt.
13
+ # If using Cloudflare proxy (orange cloud), set SSL mode to "Full" in Cloudflare dashboard.
14
+ #
15
+ # Usage:
16
+ # 1. Copy to server: scp Caddyfile user@host:/etc/caddy/Caddyfile
17
+ # 2. Reload: sudo systemctl reload caddy`
18
+ : `# Caddyfile — Reverse proxy with automatic HTTPS
19
+ # Generated by VoidForge
20
+ #
21
+ # Usage:
22
+ # 1. Replace :80 with your domain (e.g. example.com)
23
+ # 2. Copy to server: scp Caddyfile user@host:/etc/caddy/Caddyfile
24
+ # 3. Reload: sudo systemctl reload caddy
25
+ #
26
+ # Caddy auto-provisions HTTPS certificates via Let's Encrypt
27
+ # when you replace :80 with a real domain name.`;
28
+ return `${comment}
29
+
30
+ ${siteAddress} {
31
+ reverse_proxy localhost:${port}
32
+
33
+ # Security headers
34
+ header {
35
+ Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
36
+ X-Content-Type-Options nosniff
37
+ X-Frame-Options DENY
38
+ Referrer-Policy strict-origin-when-cross-origin
39
+ Permissions-Policy "camera=(), microphone=(), geolocation=()"
40
+ Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'; connect-src 'self'; frame-ancestors 'none'"
41
+ -Server
42
+ }
43
+
44
+ # Gzip compression
45
+ encode gzip
46
+
47
+ # Access logs
48
+ log {
49
+ output file /var/log/caddy/access.log
50
+ format json
51
+ }
52
+ }
53
+ `;
54
+ }