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.
- package/dist/.claude/agents/adolin-brand.md +40 -0
- package/dist/.claude/agents/ahsoka-access-control.md +56 -0
- package/dist/.claude/agents/alfred-dependencies.md +43 -0
- package/dist/.claude/agents/alia-threat-detect.md +40 -0
- package/dist/.claude/agents/anakin-dark-side.md +41 -0
- package/dist/.claude/agents/aquaman-deep-dive.md +43 -0
- package/dist/.claude/agents/aragorn-orchestration.md +39 -0
- package/dist/.claude/agents/archer-greenfield.md +48 -0
- package/dist/.claude/agents/armin-clever.md +39 -0
- package/dist/.claude/agents/arwen-ui-polish.md +42 -0
- package/dist/.claude/agents/ashitaka-tech-debt.md +39 -0
- package/dist/.claude/agents/asuka-performance.md +39 -0
- package/dist/.claude/agents/bail-organa-governance.md +37 -0
- package/dist/.claude/agents/banner-database.md +44 -0
- package/dist/.claude/agents/barton-smoke-test.md +59 -0
- package/dist/.claude/agents/bashir-field-medic.md +63 -0
- package/dist/.claude/agents/batgirl-detail.md +43 -0
- package/dist/.claude/agents/batman-qa.md +73 -0
- package/dist/.claude/agents/bayta-evals.md +41 -0
- package/dist/.claude/agents/beast-boy-cross-env.md +43 -0
- package/dist/.claude/agents/beerus-destroyer.md +39 -0
- package/dist/.claude/agents/bel-riose-orchestration.md +40 -0
- package/dist/.claude/agents/beru-subprocess.md +37 -0
- package/dist/.claude/agents/bilbo-microcopy.md +43 -0
- package/dist/.claude/agents/black-canary-monitoring.md +43 -0
- package/dist/.claude/agents/bliss-ai-safety.md +40 -0
- package/dist/.claude/agents/bo-katan-perimeter.md +40 -0
- package/dist/.claude/agents/bombadil-forge-sync.md +62 -0
- package/dist/.claude/agents/boromir-hubris.md +40 -0
- package/dist/.claude/agents/breeze-platform-relations.md +40 -0
- package/dist/.claude/agents/bucky-legacy.md +43 -0
- package/dist/.claude/agents/bulma-engineering.md +40 -0
- package/dist/.claude/agents/calcifer-daemon.md +39 -0
- package/dist/.claude/agents/cara-dune-enforcement.md +37 -0
- package/dist/.claude/agents/cassian-recon.md +37 -0
- package/dist/.claude/agents/cc-persistent-process.md +39 -0
- package/dist/.claude/agents/celeborn-design-system.md +40 -0
- package/dist/.claude/agents/celebrimbor-forge-artist.md +62 -0
- package/dist/.claude/agents/chakotay-bridge.md +47 -0
- package/dist/.claude/agents/chani-worm-rider.md +61 -0
- package/dist/.claude/agents/chewie-dependency-audit.md +41 -0
- package/dist/.claude/agents/chrome-discovery.md +37 -0
- package/dist/.claude/agents/constantine-cursed-code.md +59 -0
- package/dist/.claude/agents/coulson-release.md +64 -0
- package/dist/.claude/agents/crusher-diagnostics.md +48 -0
- package/dist/.claude/agents/cyborg-system-integration.md +43 -0
- package/dist/.claude/agents/dalinar-positioning.md +40 -0
- package/dist/.claude/agents/daneel-model-migration.md +40 -0
- package/dist/.claude/agents/data-tech-debt.md +48 -0
- package/dist/.claude/agents/dax-legacy-wisdom.md +48 -0
- package/dist/.claude/agents/deathstroke-adversarial.md +59 -0
- package/dist/.claude/agents/denji-determination.md +39 -0
- package/dist/.claude/agents/din-djarin-bounty.md +42 -0
- package/dist/.claude/agents/dockson-treasury.md +67 -0
- package/dist/.claude/agents/dori-integration-check.md +37 -0
- package/dist/.claude/agents/dors-observability.md +40 -0
- package/dist/.claude/agents/drax-exact-match.md +42 -0
- package/dist/.claude/agents/ducem-token-economics.md +41 -0
- package/dist/.claude/agents/duncan-relay.md +40 -0
- package/dist/.claude/agents/duo-teardown.md +38 -0
- package/dist/.claude/agents/ed-network-scan.md +38 -0
- package/dist/.claude/agents/elrond-ux-strategy.md +39 -0
- package/dist/.claude/agents/eowyn-delight.md +56 -0
- package/dist/.claude/agents/erwin-strategy.md +39 -0
- package/dist/.claude/agents/ezra-catches-missed.md +40 -0
- package/dist/.claude/agents/ezri-session-analyst.md +45 -0
- package/dist/.claude/agents/falcon-migration.md +43 -0
- package/dist/.claude/agents/faramir-judgment.md +40 -0
- package/dist/.claude/agents/faye-resourceful.md +39 -0
- package/dist/.claude/agents/fenring-passive-monitor.md +37 -0
- package/dist/.claude/agents/fern-protocol.md +37 -0
- package/dist/.claude/agents/feyd-adversarial.md +41 -0
- package/dist/.claude/agents/flash-rapid-test.md +43 -0
- package/dist/.claude/agents/friday-automation.md +42 -0
- package/dist/.claude/agents/frieren-long-term.md +39 -0
- package/dist/.claude/agents/frodo-critical-path.md +40 -0
- package/dist/.claude/agents/fury-initiative.md +65 -0
- package/dist/.claude/agents/gaal-prompt-arch.md +41 -0
- package/dist/.claude/agents/galadriel-frontend.md +69 -0
- package/dist/.claude/agents/gamora-perf-assassin.md +43 -0
- package/dist/.claude/agents/gandalf-setup-wizard.md +63 -0
- package/dist/.claude/agents/gen-docs.md +37 -0
- package/dist/.claude/agents/ghanima-paired-monitor.md +37 -0
- package/dist/.claude/agents/gimli-performance.md +41 -0
- package/dist/.claude/agents/giyu-silent-guard.md +39 -0
- package/dist/.claude/agents/glorfindel-rendering.md +40 -0
- package/dist/.claude/agents/gohan-hidden-power.md +39 -0
- package/dist/.claude/agents/gojo-infinite-scale.md +39 -0
- package/dist/.claude/agents/goku-scaling.md +39 -0
- package/dist/.claude/agents/goldberry-change-detect.md +37 -0
- package/dist/.claude/agents/gordon-escalation.md +42 -0
- package/dist/.claude/agents/green-arrow-precision.md +43 -0
- package/dist/.claude/agents/green-lantern-scenarios.md +43 -0
- package/dist/.claude/agents/grogu-tiny-vulns.md +38 -0
- package/dist/.claude/agents/groot-caching.md +43 -0
- package/dist/.claude/agents/gurney-delivery.md +40 -0
- package/dist/.claude/agents/haku-deploy-wizard.md +65 -0
- package/dist/.claude/agents/haldir-boundaries.md +40 -0
- package/dist/.claude/agents/han-vuln-hunter.md +40 -0
- package/dist/.claude/agents/hange-experimentation.md +39 -0
- package/dist/.claude/agents/harah-protocol.md +38 -0
- package/dist/.claude/agents/hawkgirl-regression-sweep.md +43 -0
- package/dist/.claude/agents/heero-mission-deploy.md +39 -0
- package/dist/.claude/agents/hera-navigation.md +41 -0
- package/dist/.claude/agents/hill-mission-control.md +43 -0
- package/dist/.claude/agents/himmel-legacy.md +37 -0
- package/dist/.claude/agents/hober-tool-schema.md +40 -0
- package/dist/.claude/agents/hoid-copywriting.md +40 -0
- package/dist/.claude/agents/howl-migration.md +39 -0
- package/dist/.claude/agents/hughes-observability.md +37 -0
- package/dist/.claude/agents/huntress-flaky-bugs.md +42 -0
- package/dist/.claude/agents/irulan-historian.md +37 -0
- package/dist/.claude/agents/jake-reporter.md +45 -0
- package/dist/.claude/agents/janeway-novel-arch.md +48 -0
- package/dist/.claude/agents/janov-context-eng.md +40 -0
- package/dist/.claude/agents/jarvis-status.md +42 -0
- package/dist/.claude/agents/jean-pragmatic.md +39 -0
- package/dist/.claude/agents/jessica-voice.md +40 -0
- package/dist/.claude/agents/jet-maintenance.md +39 -0
- package/dist/.claude/agents/jin-disciplined-adv.md +39 -0
- package/dist/.claude/agents/kaji-intelligence.md +39 -0
- package/dist/.claude/agents/kaladin-organic-growth.md +40 -0
- package/dist/.claude/agents/kallen-hard-deploy.md +39 -0
- package/dist/.claude/agents/kanan-intuitive.md +41 -0
- package/dist/.claude/agents/kaoru-harmony.md +37 -0
- package/dist/.claude/agents/kaworu-solver.md +39 -0
- package/dist/.claude/agents/kelsier-growth.md +64 -0
- package/dist/.claude/agents/kenobi-security.md +70 -0
- package/dist/.claude/agents/kim-api-design.md +49 -0
- package/dist/.claude/agents/kira-pragmatic.md +48 -0
- package/dist/.claude/agents/kishibe-hardening.md +39 -0
- package/dist/.claude/agents/kohaku-rapid-response.md +36 -0
- package/dist/.claude/agents/krillin-support.md +36 -0
- package/dist/.claude/agents/kusanagi-devops.md +70 -0
- package/dist/.claude/agents/la-forge-reliability.md +63 -0
- package/dist/.claude/agents/lang-micro-changes.md +43 -0
- package/dist/.claude/agents/legolas-precision.md +42 -0
- package/dist/.claude/agents/leia-secrets.md +41 -0
- package/dist/.claude/agents/lelouch-orchestration.md +39 -0
- package/dist/.claude/agents/leto-ii-persistence.md +40 -0
- package/dist/.claude/agents/leto-protection.md +40 -0
- package/dist/.claude/agents/levi-deploy.md +40 -0
- package/dist/.claude/agents/liet-kynes-deep-system.md +40 -0
- package/dist/.claude/agents/lift-social-media.md +40 -0
- package/dist/.claude/agents/loki-chaos.md +58 -0
- package/dist/.claude/agents/lucius-config.md +43 -0
- package/dist/.claude/agents/luke-audit-journey.md +41 -0
- package/dist/.claude/agents/manhunter-shapeshifting.md +43 -0
- package/dist/.claude/agents/marsh-competitive-intel.md +41 -0
- package/dist/.claude/agents/maul-red-team.md +57 -0
- package/dist/.claude/agents/merry-pair-review.md +40 -0
- package/dist/.claude/agents/mikasa-protection.md +39 -0
- package/dist/.claude/agents/miles-teg-perf.md +40 -0
- package/dist/.claude/agents/milim-load-test.md +39 -0
- package/dist/.claude/agents/misato-operations.md +39 -0
- package/dist/.claude/agents/mob-capacity.md +39 -0
- package/dist/.claude/agents/mohiam-authentication.md +40 -0
- package/dist/.claude/agents/mon-mothma-security-mgmt.md +41 -0
- package/dist/.claude/agents/mugen-chaos.md +39 -0
- package/dist/.claude/agents/mule-adversarial-ai.md +41 -0
- package/dist/.claude/agents/mustang-cleanup.md +39 -0
- package/dist/.claude/agents/nanami-structured-ops.md +39 -0
- package/dist/.claude/agents/nausicaa-resources.md +39 -0
- package/dist/.claude/agents/navani-technical-seo.md +40 -0
- package/dist/.claude/agents/nebula-optimization.md +43 -0
- package/dist/.claude/agents/nightwing-regression.md +59 -0
- package/dist/.claude/agents/nobara-direct-fix.md +39 -0
- package/dist/.claude/agents/nog-solutions.md +48 -0
- package/dist/.claude/agents/nori-asset-scanner.md +37 -0
- package/dist/.claude/agents/obrien-root-cause.md +48 -0
- package/dist/.claude/agents/odo-structural-anomaly.md +48 -0
- package/dist/.claude/agents/okoye-data-integrity.md +43 -0
- package/dist/.claude/agents/olivier-hardening.md +39 -0
- package/dist/.claude/agents/oracle-static-analysis.md +59 -0
- package/dist/.claude/agents/ori-prompt-crafter.md +37 -0
- package/dist/.claude/agents/padme-data-protection.md +42 -0
- package/dist/.claude/agents/paris-route-planner.md +47 -0
- package/dist/.claude/agents/parker-connections.md +43 -0
- package/dist/.claude/agents/paul-orchestration.md +40 -0
- package/dist/.claude/agents/picard-architecture.md +64 -0
- package/dist/.claude/agents/piccolo-tactics.md +39 -0
- package/dist/.claude/agents/pike-bold-decisions.md +48 -0
- package/dist/.claude/agents/pippin-discovery.md +40 -0
- package/dist/.claude/agents/plo-koon-edge-cases.md +37 -0
- package/dist/.claude/agents/power-chaotic.md +39 -0
- package/dist/.claude/agents/qui-gon-subtle-vulns.md +40 -0
- package/dist/.claude/agents/radagast-edge-cases.md +41 -0
- package/dist/.claude/agents/raoden-conversion.md +41 -0
- package/dist/.claude/agents/raven-deep-analysis.md +43 -0
- package/dist/.claude/agents/red-hood-aggressive.md +47 -0
- package/dist/.claude/agents/rei-dangerous-tasks.md +39 -0
- package/dist/.claude/agents/reigen-debugger.md +39 -0
- package/dist/.claude/agents/rengoku-intense-monitor.md +39 -0
- package/dist/.claude/agents/rex-infrastructure.md +41 -0
- package/dist/.claude/agents/rhodes-production.md +43 -0
- package/dist/.claude/agents/riker-review.md +62 -0
- package/dist/.claude/agents/rimuru-adapter.md +39 -0
- package/dist/.claude/agents/riza-backup.md +39 -0
- package/dist/.claude/agents/robin-apprentice.md +42 -0
- package/dist/.claude/agents/rocket-scrappy.md +43 -0
- package/dist/.claude/agents/rogers-api-design.md +43 -0
- package/dist/.claude/agents/romanoff-integrations.md +44 -0
- package/dist/.claude/agents/sabine-unconventional.md +40 -0
- package/dist/.claude/agents/salvor-model-selection.md +42 -0
- package/dist/.claude/agents/samwise-accessibility.md +43 -0
- package/dist/.claude/agents/sarene-outreach.md +40 -0
- package/dist/.claude/agents/sasha-resources.md +37 -0
- package/dist/.claude/agents/scotty-infrastructure.md +48 -0
- package/dist/.claude/agents/seldon-ai.md +67 -0
- package/dist/.claude/agents/senku-provisioning.md +40 -0
- package/dist/.claude/agents/sentaro-scheduling.md +37 -0
- package/dist/.claude/agents/seven-optimization.md +48 -0
- package/dist/.claude/agents/shallan-creative.md +40 -0
- package/dist/.claude/agents/sheeana-transport.md +40 -0
- package/dist/.claude/agents/shuri-innovation.md +43 -0
- package/dist/.claude/agents/silver-surfer-herald.md +90 -0
- package/dist/.claude/agents/siona-evasion.md +41 -0
- package/dist/.claude/agents/sisko-campaign.md +68 -0
- package/dist/.claude/agents/spike-routing.md +40 -0
- package/dist/.claude/agents/spock-schema.md +62 -0
- package/dist/.claude/agents/starfire-brute-force.md +43 -0
- package/dist/.claude/agents/stark-backend.md +71 -0
- package/dist/.claude/agents/steris-budget.md +41 -0
- package/dist/.claude/agents/stilgar-channel-security.md +40 -0
- package/dist/.claude/agents/strange-service-arch.md +44 -0
- package/dist/.claude/agents/sung-workers.md +39 -0
- package/dist/.claude/agents/superman-strength-test.md +43 -0
- package/dist/.claude/agents/suzaku-execution.md +39 -0
- package/dist/.claude/agents/szeth-compliance.md +40 -0
- package/dist/.claude/agents/tanjiro-persistent.md +39 -0
- package/dist/.claude/agents/tchalla-quality.md +43 -0
- package/dist/.claude/agents/thanos-gauntlet.md +68 -0
- package/dist/.claude/agents/theoden-rally.md +40 -0
- package/dist/.claude/agents/thor-queues.md +44 -0
- package/dist/.claude/agents/thufir-protocol-parsing.md +40 -0
- package/dist/.claude/agents/todo-brute-force.md +39 -0
- package/dist/.claude/agents/torres-site-scanner.md +47 -0
- package/dist/.claude/agents/totoro-guardian.md +39 -0
- package/dist/.claude/agents/tpol-disciplined.md +48 -0
- package/dist/.claude/agents/treebeard-deliberation.md +41 -0
- package/dist/.claude/agents/troi-prd-compliance.md +64 -0
- package/dist/.claude/agents/trunks-rollback.md +39 -0
- package/dist/.claude/agents/tuvok-deep-current.md +63 -0
- package/dist/.claude/agents/uhura-integration.md +47 -0
- package/dist/.claude/agents/valkyrie-recovery.md +43 -0
- package/dist/.claude/agents/vegeta-monitoring.md +39 -0
- package/dist/.claude/agents/veldora-dormant.md +37 -0
- package/dist/.claude/agents/vin-analytics.md +41 -0
- package/dist/.claude/agents/vision-data-analysis.md +43 -0
- package/dist/.claude/agents/wanda-seldon-validation.md +38 -0
- package/dist/.claude/agents/wanda-state.md +43 -0
- package/dist/.claude/agents/wax-paid-ads.md +40 -0
- package/dist/.claude/agents/wayne-ab-testing.md +40 -0
- package/dist/.claude/agents/whis-precision.md +39 -0
- package/dist/.claude/agents/windu-input-validation.md +41 -0
- package/dist/.claude/agents/winry-maintenance.md +39 -0
- package/dist/.claude/agents/wonder-woman-truth.md +43 -0
- package/dist/.claude/agents/wong-documentation.md +58 -0
- package/dist/.claude/agents/worf-security-arch.md +49 -0
- package/dist/.claude/agents/yoda-auth.md +57 -0
- package/dist/.claude/agents/yueh-trust-verify.md +40 -0
- package/dist/.claude/agents/zatanna-impossible.md +43 -0
- package/dist/.claude/agents/zechs-rival.md +39 -0
- package/dist/.claude/agents/zenitsu-alerts.md +37 -0
- package/dist/.claude/commands/ai.md +84 -0
- package/dist/.claude/commands/architect.md +107 -0
- package/dist/.claude/commands/assemble.md +223 -0
- package/dist/.claude/commands/assess.md +86 -0
- package/dist/.claude/commands/blueprint.md +135 -0
- package/dist/.claude/commands/build.md +138 -0
- package/dist/.claude/commands/campaign.md +224 -0
- package/dist/.claude/commands/cultivation.md +184 -0
- package/dist/.claude/commands/current.md +128 -0
- package/dist/.claude/commands/dangerroom.md +74 -0
- package/dist/.claude/commands/debrief.md +180 -0
- package/dist/.claude/commands/deploy.md +108 -0
- package/dist/.claude/commands/devops.md +160 -0
- package/dist/.claude/commands/engage.md +135 -0
- package/dist/.claude/commands/gauntlet.md +179 -0
- package/dist/.claude/commands/git.md +104 -0
- package/dist/.claude/commands/grow.md +160 -0
- package/dist/.claude/commands/imagine.md +126 -0
- package/dist/.claude/commands/portfolio.md +51 -0
- package/dist/.claude/commands/prd.md +113 -0
- package/dist/.claude/commands/qa.md +130 -0
- package/dist/.claude/commands/review.md +9 -0
- package/dist/.claude/commands/security.md +9 -0
- package/dist/.claude/commands/sentinel.md +90 -0
- package/dist/.claude/commands/test.md +114 -0
- package/dist/.claude/commands/thumper.md +116 -0
- package/dist/.claude/commands/treasury.md +117 -0
- package/dist/.claude/commands/ux.md +132 -0
- package/dist/.claude/commands/vault.md +198 -0
- package/dist/.claude/commands/void.md +148 -0
- package/dist/CHANGELOG.md +2621 -0
- package/dist/CLAUDE.md +292 -0
- package/dist/HOLOCRON.md +859 -0
- package/dist/VERSION.md +149 -0
- package/dist/docs/NAMING_REGISTRY.md +479 -0
- package/dist/docs/methods/AI_INTELLIGENCE.md +276 -0
- package/dist/docs/methods/ASSEMBLER.md +142 -0
- package/dist/docs/methods/BACKEND_ENGINEER.md +165 -0
- package/dist/docs/methods/BUILD_JOURNAL.md +214 -0
- package/dist/docs/methods/BUILD_PROTOCOL.md +436 -0
- package/dist/docs/methods/CAMPAIGN.md +569 -0
- package/dist/docs/methods/CONTEXT_MANAGEMENT.md +189 -0
- package/dist/docs/methods/DEEP_CURRENT.md +184 -0
- package/dist/docs/methods/DEVOPS_ENGINEER.md +297 -0
- package/dist/docs/methods/FIELD_MEDIC.md +265 -0
- package/dist/docs/methods/FORGE_ARTIST.md +108 -0
- package/dist/docs/methods/FORGE_KEEPER.md +270 -0
- package/dist/docs/methods/GAUNTLET.md +364 -0
- package/dist/docs/methods/GROWTH_STRATEGIST.md +466 -0
- package/dist/docs/methods/HEARTBEAT.md +168 -0
- package/dist/docs/methods/MCP_INTEGRATION.md +139 -0
- package/dist/docs/methods/MUSTER.md +152 -0
- package/dist/docs/methods/PRD_GENERATOR.md +186 -0
- package/dist/docs/methods/PRODUCT_DESIGN_FRONTEND.md +252 -0
- package/dist/docs/methods/QA_ENGINEER.md +360 -0
- package/dist/docs/methods/RELEASE_MANAGER.md +145 -0
- package/dist/docs/methods/SECURITY_AUDITOR.md +328 -0
- package/dist/docs/methods/SUB_AGENTS.md +375 -0
- package/dist/docs/methods/SYSTEMS_ARCHITECT.md +180 -0
- package/dist/docs/methods/TESTING.md +359 -0
- package/dist/docs/methods/THUMPER.md +175 -0
- package/dist/docs/methods/TIME_VAULT.md +120 -0
- package/dist/docs/methods/TREASURY.md +184 -0
- package/dist/docs/methods/TROUBLESHOOTING.md +265 -0
- package/dist/docs/patterns/README.md +52 -0
- package/dist/docs/patterns/ad-billing-adapter.ts +537 -0
- package/dist/docs/patterns/ad-platform-adapter.ts +421 -0
- package/dist/docs/patterns/ai-classifier.ts +195 -0
- package/dist/docs/patterns/ai-eval.ts +272 -0
- package/dist/docs/patterns/ai-orchestrator.ts +341 -0
- package/dist/docs/patterns/ai-router.ts +194 -0
- package/dist/docs/patterns/ai-tool-schema.ts +237 -0
- package/dist/docs/patterns/api-route.ts +241 -0
- package/dist/docs/patterns/backtest-engine.ts +499 -0
- package/dist/docs/patterns/browser-review.ts +292 -0
- package/dist/docs/patterns/combobox.tsx +300 -0
- package/dist/docs/patterns/component.tsx +262 -0
- package/dist/docs/patterns/daemon-process.ts +338 -0
- package/dist/docs/patterns/data-pipeline.ts +297 -0
- package/dist/docs/patterns/database-migration.ts +466 -0
- package/dist/docs/patterns/e2e-test.ts +629 -0
- package/dist/docs/patterns/error-handling.ts +312 -0
- package/dist/docs/patterns/execution-safety.ts +601 -0
- package/dist/docs/patterns/financial-transaction.ts +366 -0
- package/dist/docs/patterns/funding-plan.ts +462 -0
- package/dist/docs/patterns/game-entity.ts +137 -0
- package/dist/docs/patterns/game-loop.ts +113 -0
- package/dist/docs/patterns/game-state.ts +143 -0
- package/dist/docs/patterns/job-queue.ts +225 -0
- package/dist/docs/patterns/kongo-integration.ts +164 -0
- package/dist/docs/patterns/middleware.ts +363 -0
- package/dist/docs/patterns/mobile-screen.tsx +139 -0
- package/dist/docs/patterns/mobile-service.ts +167 -0
- package/dist/docs/patterns/multi-tenant.ts +382 -0
- package/dist/docs/patterns/oauth-token-lifecycle.ts +223 -0
- package/dist/docs/patterns/outbound-rate-limiter.ts +260 -0
- package/dist/docs/patterns/prompt-template.ts +195 -0
- package/dist/docs/patterns/revenue-source-adapter.ts +311 -0
- package/dist/docs/patterns/service.ts +224 -0
- package/dist/docs/patterns/sse-endpoint.ts +118 -0
- package/dist/docs/patterns/stablecoin-adapter.ts +511 -0
- package/dist/docs/patterns/third-party-script.ts +68 -0
- package/dist/scripts/thumper/gom-jabbar.sh +241 -0
- package/dist/scripts/thumper/relay.sh +610 -0
- package/dist/scripts/thumper/scan.sh +359 -0
- package/dist/scripts/thumper/thumper.sh +190 -0
- package/dist/scripts/thumper/water-rings.sh +76 -0
- package/dist/scripts/vault-read.d.ts +11 -0
- package/dist/scripts/vault-read.js +89 -0
- package/dist/scripts/voidforge.d.ts +21 -0
- package/dist/scripts/voidforge.js +614 -0
- package/dist/wizard/api/auth.d.ts +5 -0
- package/dist/wizard/api/auth.js +139 -0
- package/dist/wizard/api/blueprint.d.ts +34 -0
- package/dist/wizard/api/blueprint.js +161 -0
- package/dist/wizard/api/cloud-providers.d.ts +16 -0
- package/dist/wizard/api/cloud-providers.js +363 -0
- package/dist/wizard/api/credentials.d.ts +1 -0
- package/dist/wizard/api/credentials.js +265 -0
- package/dist/wizard/api/danger-room.d.ts +24 -0
- package/dist/wizard/api/danger-room.js +274 -0
- package/dist/wizard/api/deploy.d.ts +4 -0
- package/dist/wizard/api/deploy.js +164 -0
- package/dist/wizard/api/prd.d.ts +1 -0
- package/dist/wizard/api/prd.js +363 -0
- package/dist/wizard/api/project.d.ts +1 -0
- package/dist/wizard/api/project.js +241 -0
- package/dist/wizard/api/projects-data.d.ts +5 -0
- package/dist/wizard/api/projects-data.js +234 -0
- package/dist/wizard/api/projects-list.d.ts +5 -0
- package/dist/wizard/api/projects-list.js +227 -0
- package/dist/wizard/api/projects.d.ts +7 -0
- package/dist/wizard/api/projects.js +273 -0
- package/dist/wizard/api/provision-status.d.ts +5 -0
- package/dist/wizard/api/provision-status.js +47 -0
- package/dist/wizard/api/provision-steps.d.ts +21 -0
- package/dist/wizard/api/provision-steps.js +44 -0
- package/dist/wizard/api/provision-validate.d.ts +22 -0
- package/dist/wizard/api/provision-validate.js +164 -0
- package/dist/wizard/api/provision.d.ts +2 -0
- package/dist/wizard/api/provision.js +239 -0
- package/dist/wizard/api/terminal.d.ts +25 -0
- package/dist/wizard/api/terminal.js +246 -0
- package/dist/wizard/api/users.d.ts +6 -0
- package/dist/wizard/api/users.js +244 -0
- package/dist/wizard/api/war-room.d.ts +16 -0
- package/dist/wizard/api/war-room.js +70 -0
- package/dist/wizard/danger-room.config.json +5 -0
- package/dist/wizard/lib/ad-platform-core.d.ts +6 -0
- package/dist/wizard/lib/ad-platform-core.js +1 -0
- package/dist/wizard/lib/adapters/index.d.ts +52 -0
- package/dist/wizard/lib/adapters/index.js +38 -0
- package/dist/wizard/lib/adapters/sandbox-bank.d.ts +17 -0
- package/dist/wizard/lib/adapters/sandbox-bank.js +77 -0
- package/dist/wizard/lib/adapters/sandbox.d.ts +39 -0
- package/dist/wizard/lib/adapters/sandbox.js +174 -0
- package/dist/wizard/lib/adapters/stripe.d.ts +19 -0
- package/dist/wizard/lib/adapters/stripe.js +143 -0
- package/dist/wizard/lib/adapters/types.d.ts +9 -0
- package/dist/wizard/lib/adapters/types.js +10 -0
- package/dist/wizard/lib/agent-memory.d.ts +36 -0
- package/dist/wizard/lib/agent-memory.js +114 -0
- package/dist/wizard/lib/agent-registry.d.ts +21 -0
- package/dist/wizard/lib/agent-registry.js +105 -0
- package/dist/wizard/lib/anomaly-detection.d.ts +59 -0
- package/dist/wizard/lib/anomaly-detection.js +122 -0
- package/dist/wizard/lib/anthropic.d.ts +21 -0
- package/dist/wizard/lib/anthropic.js +105 -0
- package/dist/wizard/lib/asset-scanner.d.ts +23 -0
- package/dist/wizard/lib/asset-scanner.js +107 -0
- package/dist/wizard/lib/audit-log.d.ts +23 -0
- package/dist/wizard/lib/audit-log.js +70 -0
- package/dist/wizard/lib/autonomy-controller.d.ts +76 -0
- package/dist/wizard/lib/autonomy-controller.js +184 -0
- package/dist/wizard/lib/body-parser.d.ts +2 -0
- package/dist/wizard/lib/body-parser.js +36 -0
- package/dist/wizard/lib/build-analytics.d.ts +39 -0
- package/dist/wizard/lib/build-analytics.js +91 -0
- package/dist/wizard/lib/build-step.d.ts +21 -0
- package/dist/wizard/lib/build-step.js +104 -0
- package/dist/wizard/lib/campaign-proposer.d.ts +39 -0
- package/dist/wizard/lib/campaign-proposer.js +181 -0
- package/dist/wizard/lib/campaign-state-machine.d.ts +63 -0
- package/dist/wizard/lib/campaign-state-machine.js +114 -0
- package/dist/wizard/lib/ci-generator.d.ts +14 -0
- package/dist/wizard/lib/ci-generator.js +187 -0
- package/dist/wizard/lib/claude-merge.d.ts +38 -0
- package/dist/wizard/lib/claude-merge.js +115 -0
- package/dist/wizard/lib/codegen/erd-gen.d.ts +16 -0
- package/dist/wizard/lib/codegen/erd-gen.js +98 -0
- package/dist/wizard/lib/codegen/integrations.d.ts +18 -0
- package/dist/wizard/lib/codegen/integrations.js +189 -0
- package/dist/wizard/lib/codegen/openapi-gen.d.ts +15 -0
- package/dist/wizard/lib/codegen/openapi-gen.js +79 -0
- package/dist/wizard/lib/codegen/prisma-types.d.ts +15 -0
- package/dist/wizard/lib/codegen/prisma-types.js +44 -0
- package/dist/wizard/lib/codegen/seed-gen.d.ts +16 -0
- package/dist/wizard/lib/codegen/seed-gen.js +128 -0
- package/dist/wizard/lib/compliance.d.ts +51 -0
- package/dist/wizard/lib/compliance.js +112 -0
- package/dist/wizard/lib/correlation-engine.d.ts +59 -0
- package/dist/wizard/lib/correlation-engine.js +152 -0
- package/dist/wizard/lib/cost-estimator.d.ts +22 -0
- package/dist/wizard/lib/cost-estimator.js +72 -0
- package/dist/wizard/lib/cost-tracker.d.ts +27 -0
- package/dist/wizard/lib/cost-tracker.js +37 -0
- package/dist/wizard/lib/daemon-aggregator.d.ts +76 -0
- package/dist/wizard/lib/daemon-aggregator.js +241 -0
- package/dist/wizard/lib/daemon-core.d.ts +16 -0
- package/dist/wizard/lib/daemon-core.js +39 -0
- package/dist/wizard/lib/dashboard-data.d.ts +123 -0
- package/dist/wizard/lib/dashboard-data.js +314 -0
- package/dist/wizard/lib/dashboard-ws.d.ts +28 -0
- package/dist/wizard/lib/dashboard-ws.js +117 -0
- package/dist/wizard/lib/deep-current.d.ts +77 -0
- package/dist/wizard/lib/deep-current.js +247 -0
- package/dist/wizard/lib/deploy-coordinator.d.ts +40 -0
- package/dist/wizard/lib/deploy-coordinator.js +86 -0
- package/dist/wizard/lib/deploy-log.d.ts +28 -0
- package/dist/wizard/lib/deploy-log.js +52 -0
- package/dist/wizard/lib/desktop-notify.d.ts +27 -0
- package/dist/wizard/lib/desktop-notify.js +98 -0
- package/dist/wizard/lib/dns/cloudflare-dns.d.ts +35 -0
- package/dist/wizard/lib/dns/cloudflare-dns.js +216 -0
- package/dist/wizard/lib/dns/cloudflare-registrar.d.ts +31 -0
- package/dist/wizard/lib/dns/cloudflare-registrar.js +148 -0
- package/dist/wizard/lib/dns/types.d.ts +22 -0
- package/dist/wizard/lib/dns/types.js +4 -0
- package/dist/wizard/lib/document-discovery.d.ts +33 -0
- package/dist/wizard/lib/document-discovery.js +145 -0
- package/dist/wizard/lib/env-validator.d.ts +14 -0
- package/dist/wizard/lib/env-validator.js +205 -0
- package/dist/wizard/lib/env-writer.d.ts +13 -0
- package/dist/wizard/lib/env-writer.js +26 -0
- package/dist/wizard/lib/exec.d.ts +30 -0
- package/dist/wizard/lib/exec.js +52 -0
- package/dist/wizard/lib/experiment.d.ts +70 -0
- package/dist/wizard/lib/experiment.js +169 -0
- package/dist/wizard/lib/extensions.d.ts +20 -0
- package/dist/wizard/lib/extensions.js +183 -0
- package/dist/wizard/lib/financial/adapter-factory.d.ts +47 -0
- package/dist/wizard/lib/financial/adapter-factory.js +225 -0
- package/dist/wizard/lib/financial/billing/base.d.ts +6 -0
- package/dist/wizard/lib/financial/billing/base.js +1 -0
- package/dist/wizard/lib/financial/billing/google-billing.d.ts +56 -0
- package/dist/wizard/lib/financial/billing/google-billing.js +298 -0
- package/dist/wizard/lib/financial/billing/meta-billing.d.ts +54 -0
- package/dist/wizard/lib/financial/billing/meta-billing.js +243 -0
- package/dist/wizard/lib/financial/billing/tiktok-billing.d.ts +54 -0
- package/dist/wizard/lib/financial/billing/tiktok-billing.js +260 -0
- package/dist/wizard/lib/financial/campaign/base.d.ts +13 -0
- package/dist/wizard/lib/financial/campaign/base.js +1 -0
- package/dist/wizard/lib/financial/campaign/campaign-common.d.ts +21 -0
- package/dist/wizard/lib/financial/campaign/campaign-common.js +58 -0
- package/dist/wizard/lib/financial/campaign/google-api.d.ts +35 -0
- package/dist/wizard/lib/financial/campaign/google-api.js +118 -0
- package/dist/wizard/lib/financial/campaign/google-campaign.d.ts +38 -0
- package/dist/wizard/lib/financial/campaign/google-campaign.js +186 -0
- package/dist/wizard/lib/financial/campaign/meta-api.d.ts +28 -0
- package/dist/wizard/lib/financial/campaign/meta-api.js +93 -0
- package/dist/wizard/lib/financial/campaign/meta-campaign.d.ts +32 -0
- package/dist/wizard/lib/financial/campaign/meta-campaign.js +189 -0
- package/dist/wizard/lib/financial/campaign/sandbox-campaign.d.ts +45 -0
- package/dist/wizard/lib/financial/campaign/sandbox-campaign.js +261 -0
- package/dist/wizard/lib/financial/campaign/tiktok-api.d.ts +25 -0
- package/dist/wizard/lib/financial/campaign/tiktok-api.js +81 -0
- package/dist/wizard/lib/financial/campaign/tiktok-campaign.d.ts +37 -0
- package/dist/wizard/lib/financial/campaign/tiktok-campaign.js +155 -0
- package/dist/wizard/lib/financial/funding-auto.d.ts +44 -0
- package/dist/wizard/lib/financial/funding-auto.js +52 -0
- package/dist/wizard/lib/financial/funding-policy.d.ts +60 -0
- package/dist/wizard/lib/financial/funding-policy.js +179 -0
- package/dist/wizard/lib/financial/platform-planner.d.ts +47 -0
- package/dist/wizard/lib/financial/platform-planner.js +134 -0
- package/dist/wizard/lib/financial/reconciliation-engine.d.ts +78 -0
- package/dist/wizard/lib/financial/reconciliation-engine.js +193 -0
- package/dist/wizard/lib/financial/registry.d.ts +22 -0
- package/dist/wizard/lib/financial/registry.js +26 -0
- package/dist/wizard/lib/financial/reporting.d.ts +96 -0
- package/dist/wizard/lib/financial/reporting.js +198 -0
- package/dist/wizard/lib/financial/stablecoin/base.d.ts +6 -0
- package/dist/wizard/lib/financial/stablecoin/base.js +1 -0
- package/dist/wizard/lib/financial/stablecoin/circle.d.ts +54 -0
- package/dist/wizard/lib/financial/stablecoin/circle.js +367 -0
- package/dist/wizard/lib/financial/stablecoin/mercury.d.ts +24 -0
- package/dist/wizard/lib/financial/stablecoin/mercury.js +171 -0
- package/dist/wizard/lib/financial/stablecoin/sandbox-stablecoin.d.ts +47 -0
- package/dist/wizard/lib/financial/stablecoin/sandbox-stablecoin.js +202 -0
- package/dist/wizard/lib/financial/treasury-planner.d.ts +52 -0
- package/dist/wizard/lib/financial/treasury-planner.js +128 -0
- package/dist/wizard/lib/financial-core.d.ts +6 -0
- package/dist/wizard/lib/financial-core.js +5 -0
- package/dist/wizard/lib/financial-vault.d.ts +34 -0
- package/dist/wizard/lib/financial-vault.js +200 -0
- package/dist/wizard/lib/frontmatter.d.ts +30 -0
- package/dist/wizard/lib/frontmatter.js +99 -0
- package/dist/wizard/lib/gap-analysis.d.ts +37 -0
- package/dist/wizard/lib/gap-analysis.js +218 -0
- package/dist/wizard/lib/github.d.ts +22 -0
- package/dist/wizard/lib/github.js +261 -0
- package/dist/wizard/lib/headless-deploy.d.ts +14 -0
- package/dist/wizard/lib/headless-deploy.js +452 -0
- package/dist/wizard/lib/health-monitor.d.ts +15 -0
- package/dist/wizard/lib/health-monitor.js +91 -0
- package/dist/wizard/lib/health-poller.d.ts +9 -0
- package/dist/wizard/lib/health-poller.js +123 -0
- package/dist/wizard/lib/heartbeat-lifecycle.d.ts +71 -0
- package/dist/wizard/lib/heartbeat-lifecycle.js +107 -0
- package/dist/wizard/lib/heartbeat-scheduler.d.ts +26 -0
- package/dist/wizard/lib/heartbeat-scheduler.js +155 -0
- package/dist/wizard/lib/heartbeat.d.ts +22 -0
- package/dist/wizard/lib/heartbeat.js +538 -0
- package/dist/wizard/lib/herald.d.ts +28 -0
- package/dist/wizard/lib/herald.js +167 -0
- package/dist/wizard/lib/http-helpers.d.ts +9 -0
- package/dist/wizard/lib/http-helpers.js +24 -0
- package/dist/wizard/lib/image-gen.d.ts +56 -0
- package/dist/wizard/lib/image-gen.js +159 -0
- package/dist/wizard/lib/instance-sizing.d.ts +26 -0
- package/dist/wizard/lib/instance-sizing.js +51 -0
- package/dist/wizard/lib/kongo/analytics.d.ts +29 -0
- package/dist/wizard/lib/kongo/analytics.js +179 -0
- package/dist/wizard/lib/kongo/campaigns.d.ts +52 -0
- package/dist/wizard/lib/kongo/campaigns.js +91 -0
- package/dist/wizard/lib/kongo/client.d.ts +58 -0
- package/dist/wizard/lib/kongo/client.js +221 -0
- package/dist/wizard/lib/kongo/jobs.d.ts +57 -0
- package/dist/wizard/lib/kongo/jobs.js +122 -0
- package/dist/wizard/lib/kongo/pages.d.ts +60 -0
- package/dist/wizard/lib/kongo/pages.js +150 -0
- package/dist/wizard/lib/kongo/provisioner.d.ts +64 -0
- package/dist/wizard/lib/kongo/provisioner.js +116 -0
- package/dist/wizard/lib/kongo/seed.d.ts +49 -0
- package/dist/wizard/lib/kongo/seed.js +237 -0
- package/dist/wizard/lib/kongo/types.d.ts +323 -0
- package/dist/wizard/lib/kongo/types.js +11 -0
- package/dist/wizard/lib/kongo/variants.d.ts +57 -0
- package/dist/wizard/lib/kongo/variants.js +88 -0
- package/dist/wizard/lib/kongo/webhooks.d.ts +41 -0
- package/dist/wizard/lib/kongo/webhooks.js +112 -0
- package/dist/wizard/lib/marker.d.ts +28 -0
- package/dist/wizard/lib/marker.js +79 -0
- package/dist/wizard/lib/migrator.d.ts +35 -0
- package/dist/wizard/lib/migrator.js +190 -0
- package/dist/wizard/lib/natural-language-deploy.d.ts +30 -0
- package/dist/wizard/lib/natural-language-deploy.js +186 -0
- package/dist/wizard/lib/network.d.ts +22 -0
- package/dist/wizard/lib/network.js +72 -0
- package/dist/wizard/lib/oauth-core.d.ts +6 -0
- package/dist/wizard/lib/oauth-core.js +5 -0
- package/dist/wizard/lib/open-browser.d.ts +1 -0
- package/dist/wizard/lib/open-browser.js +26 -0
- package/dist/wizard/lib/patterns/ad-billing-adapter.d.ts +209 -0
- package/dist/wizard/lib/patterns/ad-billing-adapter.js +269 -0
- package/dist/wizard/lib/patterns/ad-platform-adapter.d.ts +200 -0
- package/dist/wizard/lib/patterns/ad-platform-adapter.js +212 -0
- package/dist/wizard/lib/patterns/daemon-process.d.ts +88 -0
- package/dist/wizard/lib/patterns/daemon-process.js +271 -0
- package/dist/wizard/lib/patterns/financial-transaction.d.ts +171 -0
- package/dist/wizard/lib/patterns/financial-transaction.js +154 -0
- package/dist/wizard/lib/patterns/funding-plan.d.ts +136 -0
- package/dist/wizard/lib/patterns/funding-plan.js +200 -0
- package/dist/wizard/lib/patterns/oauth-token-lifecycle.d.ts +94 -0
- package/dist/wizard/lib/patterns/oauth-token-lifecycle.js +139 -0
- package/dist/wizard/lib/patterns/outbound-rate-limiter.d.ts +67 -0
- package/dist/wizard/lib/patterns/outbound-rate-limiter.js +216 -0
- package/dist/wizard/lib/patterns/revenue-source-adapter.d.ts +96 -0
- package/dist/wizard/lib/patterns/revenue-source-adapter.js +182 -0
- package/dist/wizard/lib/patterns/stablecoin-adapter.d.ts +218 -0
- package/dist/wizard/lib/patterns/stablecoin-adapter.js +264 -0
- package/dist/wizard/lib/prd-validator.d.ts +39 -0
- package/dist/wizard/lib/prd-validator.js +137 -0
- package/dist/wizard/lib/project-init.d.ts +24 -0
- package/dist/wizard/lib/project-init.js +228 -0
- package/dist/wizard/lib/project-registry.d.ts +86 -0
- package/dist/wizard/lib/project-registry.js +359 -0
- package/dist/wizard/lib/project-scope.d.ts +64 -0
- package/dist/wizard/lib/project-scope.js +96 -0
- package/dist/wizard/lib/project-vault.d.ts +47 -0
- package/dist/wizard/lib/project-vault.js +221 -0
- package/dist/wizard/lib/provision-manifest.d.ts +44 -0
- package/dist/wizard/lib/provision-manifest.js +164 -0
- package/dist/wizard/lib/provisioner-registry.d.ts +15 -0
- package/dist/wizard/lib/provisioner-registry.js +34 -0
- package/dist/wizard/lib/provisioners/aws-config.d.ts +36 -0
- package/dist/wizard/lib/provisioners/aws-config.js +56 -0
- package/dist/wizard/lib/provisioners/aws-ec2.d.ts +19 -0
- package/dist/wizard/lib/provisioners/aws-ec2.js +241 -0
- package/dist/wizard/lib/provisioners/aws-rds.d.ts +10 -0
- package/dist/wizard/lib/provisioners/aws-rds.js +199 -0
- package/dist/wizard/lib/provisioners/aws-vps.d.ts +6 -0
- package/dist/wizard/lib/provisioners/aws-vps.js +231 -0
- package/dist/wizard/lib/provisioners/cloudflare.d.ts +6 -0
- package/dist/wizard/lib/provisioners/cloudflare.js +300 -0
- package/dist/wizard/lib/provisioners/docker.d.ts +6 -0
- package/dist/wizard/lib/provisioners/docker.js +75 -0
- package/dist/wizard/lib/provisioners/http-client.d.ts +20 -0
- package/dist/wizard/lib/provisioners/http-client.js +79 -0
- package/dist/wizard/lib/provisioners/railway-config.d.ts +24 -0
- package/dist/wizard/lib/provisioners/railway-config.js +220 -0
- package/dist/wizard/lib/provisioners/railway-deploy.d.ts +19 -0
- package/dist/wizard/lib/provisioners/railway-deploy.js +205 -0
- package/dist/wizard/lib/provisioners/railway.d.ts +6 -0
- package/dist/wizard/lib/provisioners/railway.js +45 -0
- package/dist/wizard/lib/provisioners/scripts/caddyfile.d.ts +10 -0
- package/dist/wizard/lib/provisioners/scripts/caddyfile.js +54 -0
- package/dist/wizard/lib/provisioners/scripts/deploy-vps.d.ts +10 -0
- package/dist/wizard/lib/provisioners/scripts/deploy-vps.js +112 -0
- package/dist/wizard/lib/provisioners/scripts/docker-compose.d.ts +11 -0
- package/dist/wizard/lib/provisioners/scripts/docker-compose.js +91 -0
- package/dist/wizard/lib/provisioners/scripts/dockerfile.d.ts +5 -0
- package/dist/wizard/lib/provisioners/scripts/dockerfile.js +185 -0
- package/dist/wizard/lib/provisioners/scripts/ecosystem-config.d.ts +10 -0
- package/dist/wizard/lib/provisioners/scripts/ecosystem-config.js +36 -0
- package/dist/wizard/lib/provisioners/scripts/provision-vps.d.ts +14 -0
- package/dist/wizard/lib/provisioners/scripts/provision-vps.js +202 -0
- package/dist/wizard/lib/provisioners/scripts/rollback-vps.d.ts +10 -0
- package/dist/wizard/lib/provisioners/scripts/rollback-vps.js +67 -0
- package/dist/wizard/lib/provisioners/self-deploy.d.ts +41 -0
- package/dist/wizard/lib/provisioners/self-deploy.js +185 -0
- package/dist/wizard/lib/provisioners/static-s3.d.ts +6 -0
- package/dist/wizard/lib/provisioners/static-s3.js +235 -0
- package/dist/wizard/lib/provisioners/types.d.ts +40 -0
- package/dist/wizard/lib/provisioners/types.js +4 -0
- package/dist/wizard/lib/provisioners/vercel.d.ts +6 -0
- package/dist/wizard/lib/provisioners/vercel.js +287 -0
- package/dist/wizard/lib/pty-manager.d.ts +42 -0
- package/dist/wizard/lib/pty-manager.js +244 -0
- package/dist/wizard/lib/rate-limiter-core.d.ts +5 -0
- package/dist/wizard/lib/rate-limiter-core.js +5 -0
- package/dist/wizard/lib/reconciliation.d.ts +43 -0
- package/dist/wizard/lib/reconciliation.js +173 -0
- package/dist/wizard/lib/revenue-types.d.ts +5 -0
- package/dist/wizard/lib/revenue-types.js +1 -0
- package/dist/wizard/lib/route-optimizer.d.ts +28 -0
- package/dist/wizard/lib/route-optimizer.js +93 -0
- package/dist/wizard/lib/s3-deploy.d.ts +19 -0
- package/dist/wizard/lib/s3-deploy.js +156 -0
- package/dist/wizard/lib/safety-tiers.d.ts +76 -0
- package/dist/wizard/lib/safety-tiers.js +134 -0
- package/dist/wizard/lib/sentry-generator.d.ts +15 -0
- package/dist/wizard/lib/sentry-generator.js +116 -0
- package/dist/wizard/lib/server-config.d.ts +13 -0
- package/dist/wizard/lib/server-config.js +23 -0
- package/dist/wizard/lib/service-install.d.ts +18 -0
- package/dist/wizard/lib/service-install.js +182 -0
- package/dist/wizard/lib/site-scanner.d.ts +80 -0
- package/dist/wizard/lib/site-scanner.js +262 -0
- package/dist/wizard/lib/ssh-deploy.d.ts +25 -0
- package/dist/wizard/lib/ssh-deploy.js +225 -0
- package/dist/wizard/lib/templates.d.ts +24 -0
- package/dist/wizard/lib/templates.js +219 -0
- package/dist/wizard/lib/totp.d.ts +35 -0
- package/dist/wizard/lib/totp.js +277 -0
- package/dist/wizard/lib/tower-auth.d.ts +43 -0
- package/dist/wizard/lib/tower-auth.js +352 -0
- package/dist/wizard/lib/tower-rate-limit.d.ts +14 -0
- package/dist/wizard/lib/tower-rate-limit.js +61 -0
- package/dist/wizard/lib/tower-session.d.ts +28 -0
- package/dist/wizard/lib/tower-session.js +119 -0
- package/dist/wizard/lib/treasury-backup.d.ts +23 -0
- package/dist/wizard/lib/treasury-backup.js +127 -0
- package/dist/wizard/lib/treasury-circuit-breakers.d.ts +28 -0
- package/dist/wizard/lib/treasury-circuit-breakers.js +74 -0
- package/dist/wizard/lib/treasury-handlers.d.ts +21 -0
- package/dist/wizard/lib/treasury-handlers.js +281 -0
- package/dist/wizard/lib/treasury-heartbeat.d.ts +18 -0
- package/dist/wizard/lib/treasury-heartbeat.js +20 -0
- package/dist/wizard/lib/treasury-io.d.ts +107 -0
- package/dist/wizard/lib/treasury-io.js +254 -0
- package/dist/wizard/lib/treasury-jobs.d.ts +14 -0
- package/dist/wizard/lib/treasury-jobs.js +589 -0
- package/dist/wizard/lib/treasury-migrator.d.ts +59 -0
- package/dist/wizard/lib/treasury-migrator.js +227 -0
- package/dist/wizard/lib/treasury-reader.d.ts +52 -0
- package/dist/wizard/lib/treasury-reader.js +235 -0
- package/dist/wizard/lib/updater.d.ts +29 -0
- package/dist/wizard/lib/updater.js +203 -0
- package/dist/wizard/lib/user-manager.d.ts +39 -0
- package/dist/wizard/lib/user-manager.js +182 -0
- package/dist/wizard/lib/vault.d.ts +26 -0
- package/dist/wizard/lib/vault.js +161 -0
- package/dist/wizard/router.d.ts +12 -0
- package/dist/wizard/router.js +58 -0
- package/dist/wizard/server.d.ts +18 -0
- package/dist/wizard/server.js +427 -0
- package/dist/wizard/ui/app.js +1357 -0
- package/dist/wizard/ui/danger-room-prophecy.js +217 -0
- package/dist/wizard/ui/danger-room.html +27 -0
- package/dist/wizard/ui/danger-room.js +29 -0
- package/dist/wizard/ui/deploy.html +181 -0
- package/dist/wizard/ui/deploy.js +616 -0
- package/dist/wizard/ui/favicon.svg +11 -0
- package/dist/wizard/ui/index.html +407 -0
- package/dist/wizard/ui/lobby.html +235 -0
- package/dist/wizard/ui/lobby.js +843 -0
- package/dist/wizard/ui/login.html +111 -0
- package/dist/wizard/ui/login.js +199 -0
- package/dist/wizard/ui/project.html +285 -0
- package/dist/wizard/ui/project.js +324 -0
- package/dist/wizard/ui/rollback.js +107 -0
- package/dist/wizard/ui/styles.css +1040 -0
- package/dist/wizard/ui/tower.html +177 -0
- package/dist/wizard/ui/tower.js +445 -0
- package/dist/wizard/ui/war-room-prophecy.js +217 -0
- package/dist/wizard/ui/war-room.html +27 -0
- package/dist/wizard/ui/war-room.js +29 -0
- package/package.json +60 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kongo Variants — Variant lifecycle and AI generation.
|
|
3
|
+
*
|
|
4
|
+
* Create, list, update, delete variants within campaigns.
|
|
5
|
+
* AI-powered bulk variant generation and slot regeneration.
|
|
6
|
+
*
|
|
7
|
+
* Real Kongo API endpoints:
|
|
8
|
+
* - POST /engine/campaigns/:campaignId/variants — create variant
|
|
9
|
+
* - GET /engine/campaigns/:campaignId/variants — list variants
|
|
10
|
+
* - GET /engine/campaigns/:campaignId/variants/:variantId — get variant
|
|
11
|
+
* - PATCH /engine/campaigns/:campaignId/variants/:variantId — update
|
|
12
|
+
* - DELETE /engine/campaigns/:campaignId/variants/:variantId — deactivate
|
|
13
|
+
* - POST /engine/campaigns/:campaignId/variants/generate — AI generate N variants
|
|
14
|
+
* - POST /engine/campaigns/:campaignId/variants/:variantId/regenerate — regen slots
|
|
15
|
+
*
|
|
16
|
+
* PRD Reference: PRD-kongo-integration.md §4.2
|
|
17
|
+
*/
|
|
18
|
+
import { KongoApiError } from './client.js';
|
|
19
|
+
// ── Variant Operations ───────────────────────────────────
|
|
20
|
+
function campaignVariantsPath(campaignId) {
|
|
21
|
+
return `/engine/campaigns/${encodeURIComponent(campaignId)}/variants`;
|
|
22
|
+
}
|
|
23
|
+
function variantPath(campaignId, variantId) {
|
|
24
|
+
return `${campaignVariantsPath(campaignId)}/${encodeURIComponent(variantId)}`;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Create a single variant with explicit slot values.
|
|
28
|
+
*/
|
|
29
|
+
export async function createVariant(client, campaignId, config) {
|
|
30
|
+
return client.post(campaignVariantsPath(campaignId), config);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* List all variants for a campaign.
|
|
34
|
+
* Returns view counts, conversions, CVR, weights, and direct URLs.
|
|
35
|
+
*/
|
|
36
|
+
export async function listVariants(client, campaignId) {
|
|
37
|
+
return client.get(campaignVariantsPath(campaignId));
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Get a single variant with full details including slotValues and compiledHtml.
|
|
41
|
+
*/
|
|
42
|
+
export async function getVariant(client, campaignId, variantId) {
|
|
43
|
+
return client.get(variantPath(campaignId, variantId));
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Update a variant's label, slot values, weight, or active status.
|
|
47
|
+
* Slot value updates are merged (existing preserved, new override).
|
|
48
|
+
*/
|
|
49
|
+
export async function updateVariant(client, campaignId, variantId, updates) {
|
|
50
|
+
return client.patch(variantPath(campaignId, variantId), updates);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Deactivate a variant (soft delete).
|
|
54
|
+
*/
|
|
55
|
+
export async function deleteVariant(client, campaignId, variantId) {
|
|
56
|
+
await client.delete(variantPath(campaignId, variantId));
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* AI-generate multiple variants in a single call.
|
|
60
|
+
* Uses Claude Sonnet to produce N variants varying specified slots.
|
|
61
|
+
* ~$0.01, ~3s for 5 variants.
|
|
62
|
+
*/
|
|
63
|
+
export async function generateVariants(client, campaignId, config) {
|
|
64
|
+
if (config.count < 1 || config.count > 20) {
|
|
65
|
+
throw new KongoApiError('VALIDATION_ERROR', `Variant count must be 1-20, got ${config.count}`, 400);
|
|
66
|
+
}
|
|
67
|
+
if (config.vary.length === 0) {
|
|
68
|
+
throw new KongoApiError('VALIDATION_ERROR', 'At least one slot name must be specified in vary', 400);
|
|
69
|
+
}
|
|
70
|
+
return client.post(`${campaignVariantsPath(campaignId)}/generate`, config);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Regenerate specific slots of an existing variant using AI.
|
|
74
|
+
* Merged values are recompiled into HTML.
|
|
75
|
+
*/
|
|
76
|
+
export async function regenerateVariantSlots(client, campaignId, variantId, config) {
|
|
77
|
+
if (config.slots.length === 0) {
|
|
78
|
+
throw new KongoApiError('VALIDATION_ERROR', 'At least one slot name must be specified', 400);
|
|
79
|
+
}
|
|
80
|
+
return client.post(`${variantPath(campaignId, variantId)}/regenerate`, config);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Set rotation strategy for a campaign.
|
|
84
|
+
* Convenience wrapper around updateCampaign — updates only rotationStrategy.
|
|
85
|
+
*/
|
|
86
|
+
export async function setRotation(client, campaignId, strategy) {
|
|
87
|
+
await client.put(`/engine/campaigns/${encodeURIComponent(campaignId)}`, { rotationStrategy: strategy });
|
|
88
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kongo Webhooks — Signature verification and event routing.
|
|
3
|
+
*
|
|
4
|
+
* Kongo sends webhooks for page.completed and page.failed events
|
|
5
|
+
* via the callbackUrl specified on page creation.
|
|
6
|
+
*
|
|
7
|
+
* Signature format: X-Kongo-Signature: t=timestamp,v1=signature
|
|
8
|
+
* Verification: HMAC-SHA256 of "timestamp.body" with webhook signing secret.
|
|
9
|
+
*
|
|
10
|
+
* PRD Reference: PRD-kongo-integration.md §4.3, §11
|
|
11
|
+
*/
|
|
12
|
+
import type { WebhookPayload, WebhookEventType } from './types.js';
|
|
13
|
+
export interface WebhookVerificationResult {
|
|
14
|
+
readonly valid: boolean;
|
|
15
|
+
readonly reason?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Verify a Kongo webhook signature.
|
|
19
|
+
*
|
|
20
|
+
* Uses timing-safe comparison to prevent timing attacks.
|
|
21
|
+
* Rejects replayed webhooks older than 5 minutes.
|
|
22
|
+
*
|
|
23
|
+
* @param rawBody - The raw request body as a string (must not be parsed)
|
|
24
|
+
* @param signature - The X-Kongo-Signature header value
|
|
25
|
+
* @param secret - The webhook signing secret from vault
|
|
26
|
+
*/
|
|
27
|
+
export declare function verifyWebhookSignature(rawBody: string, signature: string, secret: string): WebhookVerificationResult;
|
|
28
|
+
/**
|
|
29
|
+
* Parse a verified webhook body into a typed payload.
|
|
30
|
+
*/
|
|
31
|
+
export declare function parseWebhookPayload(rawBody: string): WebhookPayload;
|
|
32
|
+
export type WebhookHandler = (payload: WebhookPayload) => Promise<void>;
|
|
33
|
+
export interface WebhookRouter {
|
|
34
|
+
readonly handlers: Map<WebhookEventType, WebhookHandler>;
|
|
35
|
+
on(event: WebhookEventType, handler: WebhookHandler): void;
|
|
36
|
+
handle(rawBody: string, signature: string, secret: string): Promise<void>;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Create a webhook router that verifies signatures and routes events to handlers.
|
|
40
|
+
*/
|
|
41
|
+
export declare function createWebhookRouter(): WebhookRouter;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kongo Webhooks — Signature verification and event routing.
|
|
3
|
+
*
|
|
4
|
+
* Kongo sends webhooks for page.completed and page.failed events
|
|
5
|
+
* via the callbackUrl specified on page creation.
|
|
6
|
+
*
|
|
7
|
+
* Signature format: X-Kongo-Signature: t=timestamp,v1=signature
|
|
8
|
+
* Verification: HMAC-SHA256 of "timestamp.body" with webhook signing secret.
|
|
9
|
+
*
|
|
10
|
+
* PRD Reference: PRD-kongo-integration.md §4.3, §11
|
|
11
|
+
*/
|
|
12
|
+
import { createHmac, timingSafeEqual } from 'node:crypto';
|
|
13
|
+
// ── Signature Verification ───────────────────────────────
|
|
14
|
+
// Maximum age for webhook timestamp (5 minutes)
|
|
15
|
+
const MAX_WEBHOOK_AGE_MS = 5 * 60 * 1000;
|
|
16
|
+
// Maximum webhook body size (1 MB — defense in depth, HTTP layer should also limit)
|
|
17
|
+
const MAX_WEBHOOK_BODY_BYTES = 1 * 1024 * 1024;
|
|
18
|
+
/**
|
|
19
|
+
* Verify a Kongo webhook signature.
|
|
20
|
+
*
|
|
21
|
+
* Uses timing-safe comparison to prevent timing attacks.
|
|
22
|
+
* Rejects replayed webhooks older than 5 minutes.
|
|
23
|
+
*
|
|
24
|
+
* @param rawBody - The raw request body as a string (must not be parsed)
|
|
25
|
+
* @param signature - The X-Kongo-Signature header value
|
|
26
|
+
* @param secret - The webhook signing secret from vault
|
|
27
|
+
*/
|
|
28
|
+
export function verifyWebhookSignature(rawBody, signature, secret) {
|
|
29
|
+
if (!signature || !rawBody || !secret) {
|
|
30
|
+
return { valid: false, reason: 'Missing signature, body, or secret' };
|
|
31
|
+
}
|
|
32
|
+
if (Buffer.byteLength(rawBody) > MAX_WEBHOOK_BODY_BYTES) {
|
|
33
|
+
return { valid: false, reason: 'Webhook body too large' };
|
|
34
|
+
}
|
|
35
|
+
// Parse signature: t=timestamp,v1=hash
|
|
36
|
+
const parts = signature.split(',');
|
|
37
|
+
if (parts.length !== 2) {
|
|
38
|
+
return { valid: false, reason: 'Invalid signature format' };
|
|
39
|
+
}
|
|
40
|
+
const tPart = parts[0];
|
|
41
|
+
const vPart = parts[1];
|
|
42
|
+
if (!tPart.startsWith('t=') || !vPart.startsWith('v1=')) {
|
|
43
|
+
return { valid: false, reason: 'Invalid signature format: missing t= or v1= prefix' };
|
|
44
|
+
}
|
|
45
|
+
const timestamp = tPart.slice(2);
|
|
46
|
+
const providedHash = vPart.slice(3);
|
|
47
|
+
// Check timestamp freshness
|
|
48
|
+
const timestampMs = parseInt(timestamp, 10) * 1000;
|
|
49
|
+
if (isNaN(timestampMs)) {
|
|
50
|
+
return { valid: false, reason: 'Invalid timestamp' };
|
|
51
|
+
}
|
|
52
|
+
const age = Date.now() - timestampMs;
|
|
53
|
+
if (age < -60_000) {
|
|
54
|
+
return { valid: false, reason: 'Webhook timestamp is in the future' };
|
|
55
|
+
}
|
|
56
|
+
if (age > MAX_WEBHOOK_AGE_MS) {
|
|
57
|
+
return { valid: false, reason: `Webhook too old: ${Math.round(age / 1000)}s (max ${MAX_WEBHOOK_AGE_MS / 1000}s)` };
|
|
58
|
+
}
|
|
59
|
+
// Compute expected signature
|
|
60
|
+
const payload = `${timestamp}.${rawBody}`;
|
|
61
|
+
const expectedHash = createHmac('sha256', secret)
|
|
62
|
+
.update(payload)
|
|
63
|
+
.digest('hex');
|
|
64
|
+
// Timing-safe comparison
|
|
65
|
+
const providedBuf = Buffer.from(providedHash, 'hex');
|
|
66
|
+
const expectedBuf = Buffer.from(expectedHash, 'hex');
|
|
67
|
+
if (providedBuf.length !== expectedBuf.length) {
|
|
68
|
+
return { valid: false, reason: 'Signature length mismatch' };
|
|
69
|
+
}
|
|
70
|
+
const valid = timingSafeEqual(providedBuf, expectedBuf);
|
|
71
|
+
return valid ? { valid: true } : { valid: false, reason: 'Signature mismatch' };
|
|
72
|
+
}
|
|
73
|
+
// ── Event Parsing ────────────────────────────────────────
|
|
74
|
+
/**
|
|
75
|
+
* Parse a verified webhook body into a typed payload.
|
|
76
|
+
*/
|
|
77
|
+
export function parseWebhookPayload(rawBody) {
|
|
78
|
+
const parsed = JSON.parse(rawBody);
|
|
79
|
+
if (!parsed.event || !parsed.pageId || !parsed.data) {
|
|
80
|
+
throw new Error('Invalid webhook payload: missing event, pageId, or data');
|
|
81
|
+
}
|
|
82
|
+
const validEvents = ['page.completed', 'page.failed'];
|
|
83
|
+
if (!validEvents.includes(parsed.event)) {
|
|
84
|
+
throw new Error(`Unknown webhook event type: ${parsed.event}`);
|
|
85
|
+
}
|
|
86
|
+
return parsed;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Create a webhook router that verifies signatures and routes events to handlers.
|
|
90
|
+
*/
|
|
91
|
+
export function createWebhookRouter() {
|
|
92
|
+
const handlers = new Map();
|
|
93
|
+
return {
|
|
94
|
+
handlers,
|
|
95
|
+
on(event, handler) {
|
|
96
|
+
handlers.set(event, handler);
|
|
97
|
+
},
|
|
98
|
+
async handle(rawBody, signature, secret) {
|
|
99
|
+
const verification = verifyWebhookSignature(rawBody, signature, secret);
|
|
100
|
+
if (!verification.valid) {
|
|
101
|
+
throw new Error(`Webhook verification failed: ${verification.reason}`);
|
|
102
|
+
}
|
|
103
|
+
const payload = parseWebhookPayload(rawBody);
|
|
104
|
+
const handler = handlers.get(payload.event);
|
|
105
|
+
if (!handler) {
|
|
106
|
+
// Log but don't throw — unknown event types should be ignored gracefully
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
await handler(payload);
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* .voidforge marker file — project identity and CLI detection.
|
|
3
|
+
*
|
|
4
|
+
* Every VoidForge project has a `.voidforge` JSON file at root.
|
|
5
|
+
* The CLI walks up from cwd to find it, determining the project root.
|
|
6
|
+
*/
|
|
7
|
+
export interface VoidForgeMarker {
|
|
8
|
+
id: string;
|
|
9
|
+
version: string;
|
|
10
|
+
created: string;
|
|
11
|
+
tier: 'full' | 'methodology';
|
|
12
|
+
extensions: string[];
|
|
13
|
+
}
|
|
14
|
+
export declare const MARKER_FILE = ".voidforge";
|
|
15
|
+
export declare function readMarker(dir: string): Promise<VoidForgeMarker | null>;
|
|
16
|
+
export declare function writeMarker(dir: string, marker: VoidForgeMarker): Promise<void>;
|
|
17
|
+
export declare function createMarker(version: string, tier?: VoidForgeMarker['tier'], extensions?: string[]): VoidForgeMarker;
|
|
18
|
+
/**
|
|
19
|
+
* Walk up from `startDir` to find the nearest `.voidforge` marker.
|
|
20
|
+
* Returns the directory containing the marker, or null if none found.
|
|
21
|
+
*/
|
|
22
|
+
export declare function findProjectRoot(startDir?: string): string | null;
|
|
23
|
+
/**
|
|
24
|
+
* Like findProjectRoot but throws with a user-friendly message.
|
|
25
|
+
*/
|
|
26
|
+
export declare function requireProjectRoot(startDir?: string): string;
|
|
27
|
+
export declare function getGlobalDir(): string;
|
|
28
|
+
export declare function getVaultPath(): string;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* .voidforge marker file — project identity and CLI detection.
|
|
3
|
+
*
|
|
4
|
+
* Every VoidForge project has a `.voidforge` JSON file at root.
|
|
5
|
+
* The CLI walks up from cwd to find it, determining the project root.
|
|
6
|
+
*/
|
|
7
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
8
|
+
import { existsSync } from 'node:fs';
|
|
9
|
+
import { join, dirname } from 'node:path';
|
|
10
|
+
import { randomUUID } from 'node:crypto';
|
|
11
|
+
import { homedir } from 'node:os';
|
|
12
|
+
// ── Constants ────────────────────────────────────────────
|
|
13
|
+
export const MARKER_FILE = '.voidforge';
|
|
14
|
+
// ── Read / Write ─────────────────────────────────────────
|
|
15
|
+
export async function readMarker(dir) {
|
|
16
|
+
const markerPath = join(dir, MARKER_FILE);
|
|
17
|
+
if (!existsSync(markerPath))
|
|
18
|
+
return null;
|
|
19
|
+
try {
|
|
20
|
+
const raw = await readFile(markerPath, 'utf-8');
|
|
21
|
+
const data = JSON.parse(raw);
|
|
22
|
+
if (!data.id || !data.version || !Array.isArray(data.extensions))
|
|
23
|
+
return null;
|
|
24
|
+
return data;
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export async function writeMarker(dir, marker) {
|
|
31
|
+
const markerPath = join(dir, MARKER_FILE);
|
|
32
|
+
await writeFile(markerPath, JSON.stringify(marker, null, 2) + '\n', 'utf-8');
|
|
33
|
+
}
|
|
34
|
+
export function createMarker(version, tier = 'full', extensions = []) {
|
|
35
|
+
return {
|
|
36
|
+
id: randomUUID(),
|
|
37
|
+
version,
|
|
38
|
+
created: new Date().toISOString(),
|
|
39
|
+
tier,
|
|
40
|
+
extensions,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
// ── Project Detection ────────────────────────────────────
|
|
44
|
+
/**
|
|
45
|
+
* Walk up from `startDir` to find the nearest `.voidforge` marker.
|
|
46
|
+
* Returns the directory containing the marker, or null if none found.
|
|
47
|
+
*/
|
|
48
|
+
export function findProjectRoot(startDir = process.cwd()) {
|
|
49
|
+
let current = startDir;
|
|
50
|
+
while (true) {
|
|
51
|
+
if (existsSync(join(current, MARKER_FILE))) {
|
|
52
|
+
return current;
|
|
53
|
+
}
|
|
54
|
+
const parent = dirname(current);
|
|
55
|
+
if (parent === current)
|
|
56
|
+
break; // filesystem root
|
|
57
|
+
current = parent;
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Like findProjectRoot but throws with a user-friendly message.
|
|
63
|
+
*/
|
|
64
|
+
export function requireProjectRoot(startDir = process.cwd()) {
|
|
65
|
+
const root = findProjectRoot(startDir);
|
|
66
|
+
if (!root) {
|
|
67
|
+
console.error('Not a VoidForge project — run `npx voidforge init` to create one.');
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
return root;
|
|
71
|
+
}
|
|
72
|
+
// ── Global Config ────────────────────────────────────────
|
|
73
|
+
export function getGlobalDir() {
|
|
74
|
+
const home = process.env['HOME'] ?? process.env['USERPROFILE'] ?? homedir();
|
|
75
|
+
return join(home, '.voidforge');
|
|
76
|
+
}
|
|
77
|
+
export function getVaultPath() {
|
|
78
|
+
return join(getGlobalDir(), 'vault.enc');
|
|
79
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration from v20.x — detects old-model projects (embedded wizard/)
|
|
3
|
+
* and converts them to v21.0 (standalone wizard, methodology-only projects).
|
|
4
|
+
*/
|
|
5
|
+
export interface MigrationPlan {
|
|
6
|
+
projectDir: string;
|
|
7
|
+
hasWizardDir: boolean;
|
|
8
|
+
wizardFileCount: number;
|
|
9
|
+
hasPackageJson: boolean;
|
|
10
|
+
voidforgeDeps: string[];
|
|
11
|
+
hasMethodology: boolean;
|
|
12
|
+
hasMarker: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface MigrationResult {
|
|
15
|
+
success: boolean;
|
|
16
|
+
backupDir: string;
|
|
17
|
+
wizardFilesRemoved: number;
|
|
18
|
+
depsRemoved: string[];
|
|
19
|
+
markerCreated: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Detect if a directory is a v20.x project (has embedded wizard/).
|
|
23
|
+
*/
|
|
24
|
+
export declare function detectV20Project(dir: string): Promise<MigrationPlan>;
|
|
25
|
+
/**
|
|
26
|
+
* Migrate a v20.x project to v21.0.
|
|
27
|
+
*
|
|
28
|
+
* 1. Create backup at ~/.voidforge/migration-backup/
|
|
29
|
+
* 2. Remove wizard/ directory
|
|
30
|
+
* 3. Remove VoidForge deps from package.json
|
|
31
|
+
* 4. Add .voidforge marker file
|
|
32
|
+
* 5. Keep all methodology files in place
|
|
33
|
+
*/
|
|
34
|
+
export declare function migrateProject(projectDir: string, dryRun?: boolean): Promise<MigrationResult>;
|
|
35
|
+
export declare function rollbackMigration(projectDir: string, backupDir: string): Promise<void>;
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration from v20.x — detects old-model projects (embedded wizard/)
|
|
3
|
+
* and converts them to v21.0 (standalone wizard, methodology-only projects).
|
|
4
|
+
*/
|
|
5
|
+
import { readdir, readFile, rm, cp, mkdir } from 'node:fs/promises';
|
|
6
|
+
import { existsSync } from 'node:fs';
|
|
7
|
+
import { join, resolve } from 'node:path';
|
|
8
|
+
import { createMarker, writeMarker } from './marker.js';
|
|
9
|
+
// ── Detection ────────────────────────────────────────────
|
|
10
|
+
async function countFiles(dir) {
|
|
11
|
+
if (!existsSync(dir))
|
|
12
|
+
return 0;
|
|
13
|
+
let count = 0;
|
|
14
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
15
|
+
for (const entry of entries) {
|
|
16
|
+
if (entry.isDirectory()) {
|
|
17
|
+
count += await countFiles(join(dir, entry.name));
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
count++;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return count;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Detect if a directory is a v20.x project (has embedded wizard/).
|
|
27
|
+
*/
|
|
28
|
+
export async function detectV20Project(dir) {
|
|
29
|
+
const projectDir = resolve(dir);
|
|
30
|
+
const wizardDir = join(projectDir, 'wizard');
|
|
31
|
+
const hasWizardDir = existsSync(wizardDir) && existsSync(join(wizardDir, 'server.ts'));
|
|
32
|
+
const wizardFileCount = hasWizardDir ? await countFiles(wizardDir) : 0;
|
|
33
|
+
// Check package.json for VoidForge dependencies
|
|
34
|
+
const pkgPath = join(projectDir, 'package.json');
|
|
35
|
+
const hasPackageJson = existsSync(pkgPath);
|
|
36
|
+
let voidforgeDeps = [];
|
|
37
|
+
if (hasPackageJson) {
|
|
38
|
+
try {
|
|
39
|
+
const pkg = JSON.parse(await readFile(pkgPath, 'utf-8'));
|
|
40
|
+
const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
41
|
+
voidforgeDeps = Object.keys(allDeps).filter(d => d.startsWith('@aws-sdk/') || d === 'node-pty' || d === 'ws');
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// Invalid package.json
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const hasMethodology = existsSync(join(projectDir, 'CLAUDE.md'));
|
|
48
|
+
const hasMarker = existsSync(join(projectDir, '.voidforge'));
|
|
49
|
+
return {
|
|
50
|
+
projectDir,
|
|
51
|
+
hasWizardDir,
|
|
52
|
+
wizardFileCount,
|
|
53
|
+
hasPackageJson,
|
|
54
|
+
voidforgeDeps,
|
|
55
|
+
hasMethodology,
|
|
56
|
+
hasMarker,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// ── Backup ───────────────────────────────────────────────
|
|
60
|
+
async function createBackup(projectDir) {
|
|
61
|
+
const { homedir } = await import('node:os');
|
|
62
|
+
const backupBase = join(homedir(), '.voidforge', 'migration-backup');
|
|
63
|
+
await mkdir(backupBase, { recursive: true });
|
|
64
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
65
|
+
const projectName = projectDir.split('/').pop() ?? 'project';
|
|
66
|
+
const backupDir = join(backupBase, `${projectName}-${timestamp}`);
|
|
67
|
+
await mkdir(backupDir);
|
|
68
|
+
// Backup wizard/ directory
|
|
69
|
+
const wizardDir = join(projectDir, 'wizard');
|
|
70
|
+
if (existsSync(wizardDir)) {
|
|
71
|
+
await cp(wizardDir, join(backupDir, 'wizard'), { recursive: true });
|
|
72
|
+
}
|
|
73
|
+
// Backup package.json
|
|
74
|
+
const pkgPath = join(projectDir, 'package.json');
|
|
75
|
+
if (existsSync(pkgPath)) {
|
|
76
|
+
await cp(pkgPath, join(backupDir, 'package.json'));
|
|
77
|
+
}
|
|
78
|
+
// Backup package-lock.json
|
|
79
|
+
const lockPath = join(projectDir, 'package-lock.json');
|
|
80
|
+
if (existsSync(lockPath)) {
|
|
81
|
+
await cp(lockPath, join(backupDir, 'package-lock.json'));
|
|
82
|
+
}
|
|
83
|
+
return backupDir;
|
|
84
|
+
}
|
|
85
|
+
// ── Migration ────────────────────────────────────────────
|
|
86
|
+
/**
|
|
87
|
+
* Migrate a v20.x project to v21.0.
|
|
88
|
+
*
|
|
89
|
+
* 1. Create backup at ~/.voidforge/migration-backup/
|
|
90
|
+
* 2. Remove wizard/ directory
|
|
91
|
+
* 3. Remove VoidForge deps from package.json
|
|
92
|
+
* 4. Add .voidforge marker file
|
|
93
|
+
* 5. Keep all methodology files in place
|
|
94
|
+
*/
|
|
95
|
+
export async function migrateProject(projectDir, dryRun = false) {
|
|
96
|
+
const plan = await detectV20Project(projectDir);
|
|
97
|
+
if (!plan.hasWizardDir) {
|
|
98
|
+
throw new Error('No wizard/ directory found — this is not a v20.x project.');
|
|
99
|
+
}
|
|
100
|
+
if (plan.hasMarker) {
|
|
101
|
+
throw new Error('Project already has a .voidforge marker — already migrated?');
|
|
102
|
+
}
|
|
103
|
+
if (dryRun) {
|
|
104
|
+
return {
|
|
105
|
+
success: true,
|
|
106
|
+
backupDir: '(dry run — no backup created)',
|
|
107
|
+
wizardFilesRemoved: plan.wizardFileCount,
|
|
108
|
+
depsRemoved: plan.voidforgeDeps,
|
|
109
|
+
markerCreated: true,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
// 1. Create backup
|
|
113
|
+
const backupDir = await createBackup(projectDir);
|
|
114
|
+
// 2. Remove wizard/ directory
|
|
115
|
+
const wizardDir = join(projectDir, 'wizard');
|
|
116
|
+
await rm(wizardDir, { recursive: true, force: true });
|
|
117
|
+
// 3. Remove VoidForge deps from package.json
|
|
118
|
+
const depsRemoved = [];
|
|
119
|
+
const pkgPath = join(projectDir, 'package.json');
|
|
120
|
+
if (plan.hasPackageJson && plan.voidforgeDeps.length > 0) {
|
|
121
|
+
try {
|
|
122
|
+
const pkg = JSON.parse(await readFile(pkgPath, 'utf-8'));
|
|
123
|
+
for (const dep of plan.voidforgeDeps) {
|
|
124
|
+
if (pkg.dependencies?.[dep]) {
|
|
125
|
+
delete pkg.dependencies[dep];
|
|
126
|
+
depsRemoved.push(dep);
|
|
127
|
+
}
|
|
128
|
+
if (pkg.devDependencies?.[dep]) {
|
|
129
|
+
delete pkg.devDependencies[dep];
|
|
130
|
+
depsRemoved.push(dep);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
const { writeFile } = await import('node:fs/promises');
|
|
134
|
+
await writeFile(pkgPath, JSON.stringify(pkg, null, 2) + '\n', 'utf-8');
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
// package.json modification failed — non-fatal
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// 4. Write .voidforge marker
|
|
141
|
+
const marker = createMarker('21.0.0', 'full');
|
|
142
|
+
await writeMarker(projectDir, marker);
|
|
143
|
+
// 5. Remove old config files that moved to the wizard package
|
|
144
|
+
const oldConfigs = ['vitest.config.ts', 'playwright.config.ts'];
|
|
145
|
+
for (const config of oldConfigs) {
|
|
146
|
+
const configPath = join(projectDir, config);
|
|
147
|
+
if (existsSync(configPath)) {
|
|
148
|
+
await rm(configPath);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// 6. Remove wizard-specific scripts from package.json
|
|
152
|
+
const scriptsDir = join(projectDir, 'scripts');
|
|
153
|
+
const wizardScripts = ['voidforge.ts', 'danger-room-feed.sh', 'new-project.sh', 'vault-read.ts'];
|
|
154
|
+
for (const script of wizardScripts) {
|
|
155
|
+
const scriptPath = join(scriptsDir, script);
|
|
156
|
+
if (existsSync(scriptPath)) {
|
|
157
|
+
await rm(scriptPath);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
success: true,
|
|
162
|
+
backupDir,
|
|
163
|
+
wizardFilesRemoved: plan.wizardFileCount,
|
|
164
|
+
depsRemoved,
|
|
165
|
+
markerCreated: true,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
// ── Rollback ─────────────────────────────────────────────
|
|
169
|
+
export async function rollbackMigration(projectDir, backupDir) {
|
|
170
|
+
// Restore wizard/
|
|
171
|
+
const wizardBackup = join(backupDir, 'wizard');
|
|
172
|
+
if (existsSync(wizardBackup)) {
|
|
173
|
+
await cp(wizardBackup, join(projectDir, 'wizard'), { recursive: true });
|
|
174
|
+
}
|
|
175
|
+
// Restore package.json
|
|
176
|
+
const pkgBackup = join(backupDir, 'package.json');
|
|
177
|
+
if (existsSync(pkgBackup)) {
|
|
178
|
+
await cp(pkgBackup, join(projectDir, 'package.json'));
|
|
179
|
+
}
|
|
180
|
+
// Restore package-lock.json
|
|
181
|
+
const lockBackup = join(backupDir, 'package-lock.json');
|
|
182
|
+
if (existsSync(lockBackup)) {
|
|
183
|
+
await cp(lockBackup, join(projectDir, 'package-lock.json'));
|
|
184
|
+
}
|
|
185
|
+
// Remove marker (wasn't there before migration)
|
|
186
|
+
const markerPath = join(projectDir, '.voidforge');
|
|
187
|
+
if (existsSync(markerPath)) {
|
|
188
|
+
await rm(markerPath);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Natural Language Deploy — resolve prose deployment descriptions to YAML frontmatter.
|
|
3
|
+
*
|
|
4
|
+
* Parse: "I want a $20/month server with SSL and daily backups"
|
|
5
|
+
* → { deploy: 'vps', instanceType: 't3.small', hostname: '', resilience: { backups: 'daily', ... } }
|
|
6
|
+
*
|
|
7
|
+
* Uses keyword matching and heuristics — no AI API call required.
|
|
8
|
+
*/
|
|
9
|
+
export interface DeployConfig {
|
|
10
|
+
deploy: 'vps' | 'vercel' | 'railway' | 'cloudflare' | 'static' | 'docker';
|
|
11
|
+
instanceType: string;
|
|
12
|
+
hostname: string;
|
|
13
|
+
estimatedMonthlyCost: string;
|
|
14
|
+
resilience: {
|
|
15
|
+
multiEnv: boolean;
|
|
16
|
+
previewDeploys: boolean;
|
|
17
|
+
rollback: boolean;
|
|
18
|
+
migrations: 'auto' | 'manual' | 'no';
|
|
19
|
+
backups: 'daily' | 'weekly' | 'no';
|
|
20
|
+
healthCheck: boolean;
|
|
21
|
+
gracefulShutdown: boolean;
|
|
22
|
+
errorBoundaries: boolean;
|
|
23
|
+
rateLimiting: boolean;
|
|
24
|
+
deadLetterQueue: boolean;
|
|
25
|
+
};
|
|
26
|
+
reasoning: string[];
|
|
27
|
+
}
|
|
28
|
+
export declare function resolveDeployConfig(prose: string): DeployConfig | null;
|
|
29
|
+
/** Convert a DeployConfig to YAML frontmatter fragment. */
|
|
30
|
+
export declare function toFrontmatter(config: DeployConfig): string;
|