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,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal YAML frontmatter parser for PRD documents.
|
|
3
|
+
* Handles the simple key: value format used in PRD frontmatter blocks.
|
|
4
|
+
*/
|
|
5
|
+
export function parseFrontmatter(content) {
|
|
6
|
+
// Try ```yaml ... ``` block first (markdown code fence)
|
|
7
|
+
const yamlBlockMatch = content.match(/```yaml\s*\n([\s\S]*?)```/);
|
|
8
|
+
// Then try --- ... --- block (standard YAML frontmatter)
|
|
9
|
+
const dashBlockMatch = !yamlBlockMatch ? content.match(/^---\s*\n([\s\S]*?)\n---/) : null;
|
|
10
|
+
const match = yamlBlockMatch ?? dashBlockMatch;
|
|
11
|
+
if (!match) {
|
|
12
|
+
return { frontmatter: {}, body: content };
|
|
13
|
+
}
|
|
14
|
+
const yamlStr = match[1];
|
|
15
|
+
const frontmatter = {};
|
|
16
|
+
for (const line of yamlStr.split('\n')) {
|
|
17
|
+
const trimmed = line.trim();
|
|
18
|
+
if (!trimmed || trimmed.startsWith('#'))
|
|
19
|
+
continue;
|
|
20
|
+
const match = trimmed.match(/^(\w+):\s*(.+)$/);
|
|
21
|
+
if (match) {
|
|
22
|
+
const key = match[1];
|
|
23
|
+
let value = match[2].trim();
|
|
24
|
+
// Track whether the original value was quoted
|
|
25
|
+
const wasQuoted = (value.startsWith('"') && value.endsWith('"')) ||
|
|
26
|
+
(value.startsWith("'") && value.endsWith("'"));
|
|
27
|
+
// Strip quotes
|
|
28
|
+
if (wasQuoted) {
|
|
29
|
+
value = value.slice(1, -1);
|
|
30
|
+
}
|
|
31
|
+
// Strip inline comments — but only if the value was NOT quoted
|
|
32
|
+
// (a `#` inside a quoted value is literal, not a comment)
|
|
33
|
+
if (!wasQuoted) {
|
|
34
|
+
const commentIdx = value.indexOf('#');
|
|
35
|
+
if (commentIdx > 0) {
|
|
36
|
+
value = value.slice(0, commentIdx).trim();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
frontmatter[key] = value;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return { frontmatter, body: content };
|
|
43
|
+
}
|
|
44
|
+
export function generateFrontmatterBlock(fm) {
|
|
45
|
+
const lines = ['```yaml'];
|
|
46
|
+
if (fm.name)
|
|
47
|
+
lines.push(`name: "${fm.name}"`);
|
|
48
|
+
if (fm.type)
|
|
49
|
+
lines.push(`type: "${fm.type}"`);
|
|
50
|
+
lines.push('');
|
|
51
|
+
if (fm.framework)
|
|
52
|
+
lines.push(`framework: "${fm.framework}"`);
|
|
53
|
+
if (fm.database)
|
|
54
|
+
lines.push(`database: "${fm.database}"`);
|
|
55
|
+
if (fm.cache)
|
|
56
|
+
lines.push(`cache: "${fm.cache}"`);
|
|
57
|
+
if (fm.styling)
|
|
58
|
+
lines.push(`styling: "${fm.styling}"`);
|
|
59
|
+
lines.push('');
|
|
60
|
+
if (fm.auth)
|
|
61
|
+
lines.push(`auth: ${fm.auth}`);
|
|
62
|
+
if (fm.payments)
|
|
63
|
+
lines.push(`payments: ${fm.payments}`);
|
|
64
|
+
if (fm.workers)
|
|
65
|
+
lines.push(`workers: ${fm.workers}`);
|
|
66
|
+
if (fm.admin)
|
|
67
|
+
lines.push(`admin: ${fm.admin}`);
|
|
68
|
+
if (fm.marketing)
|
|
69
|
+
lines.push(`marketing: ${fm.marketing}`);
|
|
70
|
+
if (fm.email)
|
|
71
|
+
lines.push(`email: ${fm.email}`);
|
|
72
|
+
lines.push('');
|
|
73
|
+
if (fm.deploy)
|
|
74
|
+
lines.push(`deploy: "${fm.deploy}"`);
|
|
75
|
+
if (fm.instance_type)
|
|
76
|
+
lines.push(`instance_type: "${fm.instance_type}"`);
|
|
77
|
+
if (fm.hostname)
|
|
78
|
+
lines.push(`hostname: "${fm.hostname}"`);
|
|
79
|
+
lines.push('```');
|
|
80
|
+
return lines.join('\n');
|
|
81
|
+
}
|
|
82
|
+
const VALID_TYPES = ['full-stack', 'api-only', 'static-site', 'prototype'];
|
|
83
|
+
const VALID_DEPLOY = ['vps', 'vercel', 'railway', 'cloudflare', 'static', 'docker'];
|
|
84
|
+
const VALID_INSTANCE_TYPES = ['t3.micro', 't3.small', 't3.medium', 't3.large'];
|
|
85
|
+
export function validateFrontmatter(fm) {
|
|
86
|
+
const errors = [];
|
|
87
|
+
if (!fm.name)
|
|
88
|
+
errors.push('Missing required field: name');
|
|
89
|
+
if (fm.type && !VALID_TYPES.includes(fm.type)) {
|
|
90
|
+
errors.push(`Invalid type: "${fm.type}". Must be one of: ${VALID_TYPES.join(', ')}`);
|
|
91
|
+
}
|
|
92
|
+
if (fm.deploy && !VALID_DEPLOY.includes(fm.deploy)) {
|
|
93
|
+
errors.push(`Invalid deploy: "${fm.deploy}". Must be one of: ${VALID_DEPLOY.join(', ')}`);
|
|
94
|
+
}
|
|
95
|
+
if (fm.instance_type && !VALID_INSTANCE_TYPES.includes(fm.instance_type)) {
|
|
96
|
+
errors.push(`Invalid instance_type: "${fm.instance_type}". Must be one of: ${VALID_INSTANCE_TYPES.join(', ')}`);
|
|
97
|
+
}
|
|
98
|
+
return errors;
|
|
99
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Seven's Gap Analysis Engine — 5-dimension project scoring (v12.1).
|
|
3
|
+
*
|
|
4
|
+
* Analyzes a project across: feature completeness, quality, performance,
|
|
5
|
+
* growth readiness, and revenue potential. Produces a scored situation model
|
|
6
|
+
* that drives Tuvok's campaign proposals.
|
|
7
|
+
*
|
|
8
|
+
* PRD Reference: ROADMAP v12.1 deliverables, DEEP_CURRENT.md ANALYZE step
|
|
9
|
+
*/
|
|
10
|
+
import type { SituationModel, DimensionScore } from './deep-current.js';
|
|
11
|
+
/**
|
|
12
|
+
* Score feature completeness by diffing PRD requirements against codebase.
|
|
13
|
+
* Uses a simplified heuristic: count PRD sections vs implemented routes/components.
|
|
14
|
+
*/
|
|
15
|
+
export declare function scoreFeatureCompleteness(projectDir: string): Promise<DimensionScore>;
|
|
16
|
+
/**
|
|
17
|
+
* Score quality from gauntlet findings, field reports, and test presence.
|
|
18
|
+
*/
|
|
19
|
+
export declare function scoreQuality(projectDir: string): Promise<DimensionScore>;
|
|
20
|
+
/**
|
|
21
|
+
* Score revenue potential from treasury setup, payment integrations, and pricing presence.
|
|
22
|
+
*/
|
|
23
|
+
export declare function scoreRevenuePotential(projectDir: string): Promise<DimensionScore>;
|
|
24
|
+
/**
|
|
25
|
+
* Run Seven's full gap analysis across all 5 dimensions.
|
|
26
|
+
* Performance and growthReadiness come from Torres's site scan (already in the model).
|
|
27
|
+
* Feature completeness, quality, and revenue potential are analyzed here.
|
|
28
|
+
*/
|
|
29
|
+
export declare function analyzeGaps(model: SituationModel, projectDir: string): Promise<SituationModel>;
|
|
30
|
+
/**
|
|
31
|
+
* Find the weakest dimension — this drives the next campaign proposal.
|
|
32
|
+
*/
|
|
33
|
+
export declare function findWeakestDimension(model: SituationModel): {
|
|
34
|
+
name: string;
|
|
35
|
+
score: number;
|
|
36
|
+
gaps: string[];
|
|
37
|
+
};
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Seven's Gap Analysis Engine — 5-dimension project scoring (v12.1).
|
|
3
|
+
*
|
|
4
|
+
* Analyzes a project across: feature completeness, quality, performance,
|
|
5
|
+
* growth readiness, and revenue potential. Produces a scored situation model
|
|
6
|
+
* that drives Tuvok's campaign proposals.
|
|
7
|
+
*
|
|
8
|
+
* PRD Reference: ROADMAP v12.1 deliverables, DEEP_CURRENT.md ANALYZE step
|
|
9
|
+
*/
|
|
10
|
+
import { existsSync } from 'node:fs';
|
|
11
|
+
import { readFile, readdir } from 'node:fs/promises';
|
|
12
|
+
import { join } from 'node:path';
|
|
13
|
+
import { homedir } from 'node:os';
|
|
14
|
+
// ── Feature Completeness Dimension ────────────────────
|
|
15
|
+
/**
|
|
16
|
+
* Score feature completeness by diffing PRD requirements against codebase.
|
|
17
|
+
* Uses a simplified heuristic: count PRD sections vs implemented routes/components.
|
|
18
|
+
*/
|
|
19
|
+
export async function scoreFeatureCompleteness(projectDir) {
|
|
20
|
+
const gaps = [];
|
|
21
|
+
let score = 50; // base — assumes halfway done if we can't fully analyze
|
|
22
|
+
// Read PRD if exists
|
|
23
|
+
const prdPaths = [join(projectDir, 'docs', 'PRD.md'), join(projectDir, 'PRD.md')];
|
|
24
|
+
let prdContent = '';
|
|
25
|
+
for (const p of prdPaths) {
|
|
26
|
+
if (existsSync(p)) {
|
|
27
|
+
prdContent = await readFile(p, 'utf-8');
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (!prdContent) {
|
|
32
|
+
return { score: 0, gaps: ['No PRD found — cannot assess feature completeness'], lastUpdated: new Date().toISOString() };
|
|
33
|
+
}
|
|
34
|
+
// Count PRD feature sections (## headers that look like features)
|
|
35
|
+
const featureSections = (prdContent.match(/^#{2,3}\s+(?!Frontmatter|Version|Status)/gm) || []).length;
|
|
36
|
+
// Count source files as a proxy for implementation
|
|
37
|
+
let sourceFileCount = 0;
|
|
38
|
+
try {
|
|
39
|
+
const srcDirs = ['src', 'app', 'pages', 'components', 'lib', 'services', 'wizard/lib', 'wizard/ui'];
|
|
40
|
+
for (const dir of srcDirs) {
|
|
41
|
+
const fullDir = join(projectDir, dir);
|
|
42
|
+
if (existsSync(fullDir)) {
|
|
43
|
+
const files = await readdir(fullDir, { recursive: true });
|
|
44
|
+
sourceFileCount += files.filter(f => /\.(ts|tsx|js|jsx|py|rb)$/.test(String(f))).length;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch { /* can't read dirs */ }
|
|
49
|
+
// Heuristic scoring
|
|
50
|
+
if (featureSections > 0 && sourceFileCount > 0) {
|
|
51
|
+
const ratio = Math.min(sourceFileCount / featureSections, 3); // cap at 3 files/section
|
|
52
|
+
score = Math.min(100, Math.round(ratio / 3 * 100));
|
|
53
|
+
}
|
|
54
|
+
if (score < 30)
|
|
55
|
+
gaps.push(`Only ${sourceFileCount} source files for ${featureSections} PRD sections`);
|
|
56
|
+
if (score < 60)
|
|
57
|
+
gaps.push('Feature implementation appears incomplete');
|
|
58
|
+
// Check for campaign state — completed campaigns boost the score
|
|
59
|
+
const campaignStatePath = join(projectDir, 'logs', 'campaign-state.md');
|
|
60
|
+
if (existsSync(campaignStatePath)) {
|
|
61
|
+
const campaignContent = await readFile(campaignStatePath, 'utf-8');
|
|
62
|
+
const completedMissions = (campaignContent.match(/COMPLETE/g) || []).length;
|
|
63
|
+
score = Math.min(100, score + completedMissions * 3);
|
|
64
|
+
}
|
|
65
|
+
return { score: Math.min(100, score), gaps, lastUpdated: new Date().toISOString() };
|
|
66
|
+
}
|
|
67
|
+
// ── Quality Dimension ─────────────────────────────────
|
|
68
|
+
/**
|
|
69
|
+
* Score quality from gauntlet findings, field reports, and test presence.
|
|
70
|
+
*/
|
|
71
|
+
export async function scoreQuality(projectDir) {
|
|
72
|
+
const gaps = [];
|
|
73
|
+
let score = 50;
|
|
74
|
+
// Check for test files
|
|
75
|
+
let testFileCount = 0;
|
|
76
|
+
const testDirs = ['__tests__', 'tests', 'test', 'spec'];
|
|
77
|
+
for (const dir of testDirs) {
|
|
78
|
+
const fullDir = join(projectDir, dir);
|
|
79
|
+
if (existsSync(fullDir)) {
|
|
80
|
+
const files = await readdir(fullDir, { recursive: true });
|
|
81
|
+
testFileCount += files.filter(f => /\.(test|spec)\.(ts|tsx|js|jsx|py)$/.test(String(f))).length;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Also check for test files alongside source
|
|
85
|
+
try {
|
|
86
|
+
const srcDir = join(projectDir, 'src');
|
|
87
|
+
if (existsSync(srcDir)) {
|
|
88
|
+
const files = await readdir(srcDir, { recursive: true });
|
|
89
|
+
testFileCount += files.filter(f => /\.(test|spec)\.(ts|tsx|js|jsx)$/.test(String(f))).length;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch { /* can't read */ }
|
|
93
|
+
if (testFileCount === 0) {
|
|
94
|
+
gaps.push('No test files found');
|
|
95
|
+
score -= 20;
|
|
96
|
+
}
|
|
97
|
+
else if (testFileCount < 5) {
|
|
98
|
+
gaps.push(`Only ${testFileCount} test files — coverage likely low`);
|
|
99
|
+
score -= 10;
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
score += 15;
|
|
103
|
+
}
|
|
104
|
+
// Check gauntlet state for unfixed findings
|
|
105
|
+
const gauntletPath = join(projectDir, 'logs', 'gauntlet-state.md');
|
|
106
|
+
if (existsSync(gauntletPath)) {
|
|
107
|
+
const content = await readFile(gauntletPath, 'utf-8');
|
|
108
|
+
if (content.includes('COMPLETE') && content.includes('SIGN OFF')) {
|
|
109
|
+
score += 20;
|
|
110
|
+
}
|
|
111
|
+
const criticalCount = (content.match(/Critical/gi) || []).length;
|
|
112
|
+
if (criticalCount > 5) {
|
|
113
|
+
gaps.push(`${criticalCount} Critical mentions in gauntlet state`);
|
|
114
|
+
score -= 10;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
gaps.push('No gauntlet history — project has not been reviewed');
|
|
119
|
+
score -= 15;
|
|
120
|
+
}
|
|
121
|
+
// Check for LESSONS.md (learning from mistakes = quality signal)
|
|
122
|
+
if (existsSync(join(projectDir, 'docs', 'LESSONS.md')))
|
|
123
|
+
score += 5;
|
|
124
|
+
return { score: Math.max(0, Math.min(100, score)), gaps, lastUpdated: new Date().toISOString() };
|
|
125
|
+
}
|
|
126
|
+
// ── Revenue Potential Dimension ───────────────────────
|
|
127
|
+
/**
|
|
128
|
+
* Score revenue potential from treasury setup, payment integrations, and pricing presence.
|
|
129
|
+
*/
|
|
130
|
+
export async function scoreRevenuePotential(projectDir) {
|
|
131
|
+
const gaps = [];
|
|
132
|
+
let score = 20; // base — most projects start without revenue infrastructure
|
|
133
|
+
// Check for treasury vault (Cultivation installed)
|
|
134
|
+
const treasuryVault = join(homedir(), '.voidforge', 'treasury', 'vault.enc');
|
|
135
|
+
if (existsSync(treasuryVault)) {
|
|
136
|
+
score += 25;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
gaps.push('No treasury set up — no revenue tracking');
|
|
140
|
+
}
|
|
141
|
+
// Check for payment integration in code
|
|
142
|
+
const paymentIndicators = ['stripe', 'paddle', 'lemon', 'paypal', 'checkout'];
|
|
143
|
+
let paymentFound = false;
|
|
144
|
+
try {
|
|
145
|
+
const envPath = join(projectDir, '.env');
|
|
146
|
+
if (existsSync(envPath)) {
|
|
147
|
+
const envContent = await readFile(envPath, 'utf-8');
|
|
148
|
+
for (const indicator of paymentIndicators) {
|
|
149
|
+
if (envContent.toLowerCase().includes(indicator)) {
|
|
150
|
+
paymentFound = true;
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch { /* can't read .env */ }
|
|
157
|
+
if (paymentFound) {
|
|
158
|
+
score += 20;
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
gaps.push('No payment integration detected');
|
|
162
|
+
}
|
|
163
|
+
// Check for pricing page indicators in source
|
|
164
|
+
try {
|
|
165
|
+
const srcDir = join(projectDir, 'src');
|
|
166
|
+
if (existsSync(srcDir)) {
|
|
167
|
+
const files = await readdir(srcDir, { recursive: true });
|
|
168
|
+
const pricingFiles = files.filter(f => /pric/i.test(String(f)));
|
|
169
|
+
if (pricingFiles.length > 0) {
|
|
170
|
+
score += 15;
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
gaps.push('No pricing page or component found');
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
catch { /* can't read */ }
|
|
178
|
+
// Check for heartbeat daemon (revenue monitoring)
|
|
179
|
+
if (existsSync(join(homedir(), '.voidforge', 'heartbeat.json'))) {
|
|
180
|
+
score += 15;
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
gaps.push('Heartbeat daemon not running — no revenue monitoring');
|
|
184
|
+
}
|
|
185
|
+
return { score: Math.max(0, Math.min(100, score)), gaps, lastUpdated: new Date().toISOString() };
|
|
186
|
+
}
|
|
187
|
+
// ── Full Analysis ─────────────────────────────────────
|
|
188
|
+
/**
|
|
189
|
+
* Run Seven's full gap analysis across all 5 dimensions.
|
|
190
|
+
* Performance and growthReadiness come from Torres's site scan (already in the model).
|
|
191
|
+
* Feature completeness, quality, and revenue potential are analyzed here.
|
|
192
|
+
*/
|
|
193
|
+
export async function analyzeGaps(model, projectDir) {
|
|
194
|
+
// Feature completeness
|
|
195
|
+
model.dimensions.featureCompleteness = await scoreFeatureCompleteness(projectDir);
|
|
196
|
+
// Quality
|
|
197
|
+
model.dimensions.quality = await scoreQuality(projectDir);
|
|
198
|
+
// Revenue potential
|
|
199
|
+
model.dimensions.revenuePotential = await scoreRevenuePotential(projectDir);
|
|
200
|
+
// Performance and growthReadiness are updated by Torres's SENSE step (site scanner)
|
|
201
|
+
// If they haven't been scanned yet, keep their current values
|
|
202
|
+
return model;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Find the weakest dimension — this drives the next campaign proposal.
|
|
206
|
+
*/
|
|
207
|
+
export function findWeakestDimension(model) {
|
|
208
|
+
const dims = model.dimensions;
|
|
209
|
+
const entries = [
|
|
210
|
+
{ name: 'Feature Completeness', ...dims.featureCompleteness },
|
|
211
|
+
{ name: 'Quality', ...dims.quality },
|
|
212
|
+
{ name: 'Performance', ...dims.performance },
|
|
213
|
+
{ name: 'Growth Readiness', ...dims.growthReadiness },
|
|
214
|
+
{ name: 'Revenue Potential', ...dims.revenuePotential },
|
|
215
|
+
];
|
|
216
|
+
entries.sort((a, b) => a.score - b.score);
|
|
217
|
+
return entries[0];
|
|
218
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub integration — create repo, git init + remote + push.
|
|
3
|
+
* Runs as a pre-provision step (ADR-011) so platforms can link to the repo.
|
|
4
|
+
* Uses exec.ts for git operations (ADR-013). No npm dependencies.
|
|
5
|
+
*/
|
|
6
|
+
import type { ProvisionEmitter } from './provisioners/types.js';
|
|
7
|
+
export interface GitHubResult {
|
|
8
|
+
success: boolean;
|
|
9
|
+
repoUrl?: string;
|
|
10
|
+
owner?: string;
|
|
11
|
+
repoName?: string;
|
|
12
|
+
error?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Full GitHub pre-provision flow:
|
|
16
|
+
* 1. Validate git binary exists
|
|
17
|
+
* 2. Determine owner (from vault or token)
|
|
18
|
+
* 3. Create repo via API (or use existing)
|
|
19
|
+
* 4. Ensure .gitignore has .ssh/ and .env
|
|
20
|
+
* 5. git init + remote + push
|
|
21
|
+
*/
|
|
22
|
+
export declare function prepareGithub(runId: string, token: string, owner: string | null, projectName: string, projectDir: string, emit: ProvisionEmitter, abortSignal?: AbortSignal, framework?: string, deployTarget?: string): Promise<GitHubResult>;
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub integration — create repo, git init + remote + push.
|
|
3
|
+
* Runs as a pre-provision step (ADR-011) so platforms can link to the repo.
|
|
4
|
+
* Uses exec.ts for git operations (ADR-013). No npm dependencies.
|
|
5
|
+
*/
|
|
6
|
+
import { existsSync } from 'node:fs';
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
import { writeFile, readFile } from 'node:fs/promises';
|
|
9
|
+
import { execCommand, validateBinaries } from './exec.js';
|
|
10
|
+
import { httpsPost, httpsGet, safeJsonParse, slugify } from './provisioners/http-client.js';
|
|
11
|
+
import { recordResourcePending, recordResourceCreated } from './provision-manifest.js';
|
|
12
|
+
import { generateCIWorkflows } from './ci-generator.js';
|
|
13
|
+
const GH_API = 'api.github.com';
|
|
14
|
+
const GH_API_VERSION = '2022-11-28';
|
|
15
|
+
function ghHeaders(token) {
|
|
16
|
+
return {
|
|
17
|
+
'Authorization': `Bearer ${token}`,
|
|
18
|
+
'User-Agent': 'VoidForge',
|
|
19
|
+
'X-GitHub-Api-Version': GH_API_VERSION,
|
|
20
|
+
'Content-Type': 'application/json',
|
|
21
|
+
'Accept': 'application/vnd.github+json',
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Full GitHub pre-provision flow:
|
|
26
|
+
* 1. Validate git binary exists
|
|
27
|
+
* 2. Determine owner (from vault or token)
|
|
28
|
+
* 3. Create repo via API (or use existing)
|
|
29
|
+
* 4. Ensure .gitignore has .ssh/ and .env
|
|
30
|
+
* 5. git init + remote + push
|
|
31
|
+
*/
|
|
32
|
+
export async function prepareGithub(runId, token, owner, projectName, projectDir, emit, abortSignal, framework, deployTarget) {
|
|
33
|
+
const repoName = slugify(projectName);
|
|
34
|
+
const headers = ghHeaders(token);
|
|
35
|
+
// Step 1: Validate git binary
|
|
36
|
+
emit({ step: 'github-validate', status: 'started', message: 'Checking for git binary' });
|
|
37
|
+
const missing = await validateBinaries(['git']);
|
|
38
|
+
if (missing.length > 0) {
|
|
39
|
+
emit({ step: 'github-validate', status: 'error', message: 'git is not installed. Install git to enable GitHub integration.' });
|
|
40
|
+
return { success: false, error: 'git binary not found' };
|
|
41
|
+
}
|
|
42
|
+
emit({ step: 'github-validate', status: 'done', message: 'git found' });
|
|
43
|
+
// Step 2: Determine owner
|
|
44
|
+
emit({ step: 'github-owner', status: 'started', message: 'Determining GitHub owner' });
|
|
45
|
+
let resolvedOwner = owner;
|
|
46
|
+
const ownerIsExplicit = !!owner;
|
|
47
|
+
if (!resolvedOwner) {
|
|
48
|
+
try {
|
|
49
|
+
const res = await httpsGet(GH_API, '/user', headers);
|
|
50
|
+
if (res.status !== 200) {
|
|
51
|
+
emit({ step: 'github-owner', status: 'error', message: 'Failed to fetch GitHub user', detail: `API returned ${res.status}` });
|
|
52
|
+
return { success: false, error: `GitHub API returned ${res.status}` };
|
|
53
|
+
}
|
|
54
|
+
const data = safeJsonParse(res.body);
|
|
55
|
+
resolvedOwner = data?.login ?? '';
|
|
56
|
+
if (!resolvedOwner) {
|
|
57
|
+
emit({ step: 'github-owner', status: 'error', message: 'Could not determine GitHub username from token' });
|
|
58
|
+
return { success: false, error: 'No GitHub username in token response' };
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
emit({ step: 'github-owner', status: 'error', message: 'GitHub API connection failed', detail: err.message });
|
|
63
|
+
return { success: false, error: err.message };
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Validate owner format (Kenobi: prevent path traversal in API calls)
|
|
67
|
+
if (!/^[a-zA-Z0-9_.-]+$/.test(resolvedOwner)) {
|
|
68
|
+
emit({ step: 'github-owner', status: 'error', message: `Invalid GitHub owner format: "${resolvedOwner}"` });
|
|
69
|
+
return { success: false, error: 'Invalid GitHub owner format' };
|
|
70
|
+
}
|
|
71
|
+
emit({ step: 'github-owner', status: 'done', message: `GitHub owner: ${resolvedOwner}` });
|
|
72
|
+
// Step 3: Create repo (or detect existing)
|
|
73
|
+
emit({ step: 'github-repo', status: 'started', message: `Creating repository ${resolvedOwner}/${repoName}` });
|
|
74
|
+
try {
|
|
75
|
+
await recordResourcePending(runId, 'github-repo', `${resolvedOwner}/${repoName}`, 'global');
|
|
76
|
+
// Check if repo already exists
|
|
77
|
+
const checkRes = await httpsGet(GH_API, `/repos/${resolvedOwner}/${repoName}`, headers);
|
|
78
|
+
if (checkRes.status === 200) {
|
|
79
|
+
emit({ step: 'github-repo', status: 'done', message: `Repository ${resolvedOwner}/${repoName} already exists — will push to it` });
|
|
80
|
+
await recordResourceCreated(runId, 'github-repo', `${resolvedOwner}/${repoName}`, 'global');
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
// Create new repo — use org endpoint if owner was explicitly set (may be an org)
|
|
84
|
+
const body = JSON.stringify({
|
|
85
|
+
name: repoName,
|
|
86
|
+
private: true,
|
|
87
|
+
auto_init: false,
|
|
88
|
+
description: `Created by VoidForge`,
|
|
89
|
+
});
|
|
90
|
+
const createPath = ownerIsExplicit
|
|
91
|
+
? `/orgs/${resolvedOwner}/repos`
|
|
92
|
+
: '/user/repos';
|
|
93
|
+
let createRes = await httpsPost(GH_API, createPath, headers, body);
|
|
94
|
+
// If org endpoint returned 404, the owner is a user, not an org — fall back
|
|
95
|
+
if (createRes.status === 404 && ownerIsExplicit) {
|
|
96
|
+
createRes = await httpsPost(GH_API, '/user/repos', headers, body);
|
|
97
|
+
}
|
|
98
|
+
if (createRes.status === 201) {
|
|
99
|
+
await recordResourceCreated(runId, 'github-repo', `${resolvedOwner}/${repoName}`, 'global');
|
|
100
|
+
emit({ step: 'github-repo', status: 'done', message: `Repository ${resolvedOwner}/${repoName} created (private)` });
|
|
101
|
+
}
|
|
102
|
+
else if (createRes.status === 422) {
|
|
103
|
+
// Repo already exists (race condition or name conflict)
|
|
104
|
+
const errData = safeJsonParse(createRes.body);
|
|
105
|
+
const detail = errData?.errors?.[0]?.message || errData?.message || 'Repository name already exists';
|
|
106
|
+
emit({ step: 'github-repo', status: 'done', message: `Repository exists — ${detail}` });
|
|
107
|
+
await recordResourceCreated(runId, 'github-repo', `${resolvedOwner}/${repoName}`, 'global');
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
const errData = safeJsonParse(createRes.body);
|
|
111
|
+
throw new Error(errData?.message || `GitHub API returned ${createRes.status}`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
emit({ step: 'github-repo', status: 'error', message: 'Failed to create GitHub repository', detail: err.message });
|
|
117
|
+
return { success: false, error: err.message };
|
|
118
|
+
}
|
|
119
|
+
// Step 4: Ensure .gitignore protects secrets
|
|
120
|
+
emit({ step: 'github-gitignore', status: 'started', message: 'Checking .gitignore' });
|
|
121
|
+
try {
|
|
122
|
+
const gitignorePath = join(projectDir, '.gitignore');
|
|
123
|
+
let gitignore = '';
|
|
124
|
+
try {
|
|
125
|
+
gitignore = await readFile(gitignorePath, 'utf-8');
|
|
126
|
+
}
|
|
127
|
+
catch { /* new file */ }
|
|
128
|
+
const requiredEntries = ['.env', '.env.*', '.ssh/', 'node_modules/'];
|
|
129
|
+
const existingLines = gitignore.split('\n').map(l => l.trim());
|
|
130
|
+
const missing = requiredEntries.filter(entry => !existingLines.includes(entry));
|
|
131
|
+
if (missing.length > 0) {
|
|
132
|
+
const addition = (gitignore ? '\n' : '') + '# VoidForge — protect secrets\n' + missing.join('\n') + '\n';
|
|
133
|
+
await writeFile(gitignorePath, gitignore + addition, 'utf-8');
|
|
134
|
+
emit({ step: 'github-gitignore', status: 'done', message: `Added ${missing.length} entries to .gitignore` });
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
emit({ step: 'github-gitignore', status: 'done', message: '.gitignore already has required entries' });
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
emit({ step: 'github-gitignore', status: 'error', message: 'Failed to update .gitignore', detail: err.message });
|
|
142
|
+
// Non-fatal
|
|
143
|
+
}
|
|
144
|
+
// Step 5: git init + remote + add + commit + push
|
|
145
|
+
emit({ step: 'github-push', status: 'started', message: 'Pushing code to GitHub' });
|
|
146
|
+
try {
|
|
147
|
+
const gitOpts = { cwd: projectDir, timeout: 30_000, abortSignal };
|
|
148
|
+
const repoUrl = `https://github.com/${resolvedOwner}/${repoName}.git`;
|
|
149
|
+
// Init if needed
|
|
150
|
+
if (!existsSync(join(projectDir, '.git'))) {
|
|
151
|
+
await execCommand('git', ['init'], gitOpts);
|
|
152
|
+
await execCommand('git', ['branch', '-M', 'main'], gitOpts);
|
|
153
|
+
}
|
|
154
|
+
// Set remote (idempotent)
|
|
155
|
+
try {
|
|
156
|
+
await execCommand('git', ['remote', 'add', 'origin', repoUrl], gitOpts);
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// Remote exists — update URL
|
|
160
|
+
await execCommand('git', ['remote', 'set-url', 'origin', repoUrl], gitOpts);
|
|
161
|
+
}
|
|
162
|
+
// Verify .gitignore protects secrets before staging (defense in depth)
|
|
163
|
+
try {
|
|
164
|
+
const currentGitignore = await readFile(join(projectDir, '.gitignore'), 'utf-8');
|
|
165
|
+
const lines = currentGitignore.split('\n').map(l => l.trim());
|
|
166
|
+
if (!lines.includes('.env') || !lines.includes('.ssh/')) {
|
|
167
|
+
emit({ step: 'github-push', status: 'error', message: 'Cannot push — .gitignore is missing .env or .ssh/ entries' });
|
|
168
|
+
return { success: false, error: '.gitignore missing required entries' };
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
emit({ step: 'github-push', status: 'error', message: 'Cannot push — .gitignore not found' });
|
|
173
|
+
return { success: false, error: '.gitignore not found' };
|
|
174
|
+
}
|
|
175
|
+
// Stage all files
|
|
176
|
+
await execCommand('git', ['add', '-A'], gitOpts);
|
|
177
|
+
// Commit (may fail if nothing to commit — that's fine)
|
|
178
|
+
try {
|
|
179
|
+
await execCommand('git', ['commit', '-m', 'Initial commit — VoidForge'], {
|
|
180
|
+
...gitOpts,
|
|
181
|
+
env: {
|
|
182
|
+
GIT_AUTHOR_NAME: 'VoidForge',
|
|
183
|
+
GIT_AUTHOR_EMAIL: 'voidforge@localhost',
|
|
184
|
+
GIT_COMMITTER_NAME: 'VoidForge',
|
|
185
|
+
GIT_COMMITTER_EMAIL: 'voidforge@localhost',
|
|
186
|
+
},
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
// Nothing to commit — existing repo with no changes
|
|
191
|
+
}
|
|
192
|
+
// Push using http.extraheader to avoid token in URL/reflog (Kenobi: git reflog token persistence)
|
|
193
|
+
await execCommand('git', ['push', '-u', 'origin', 'main'], {
|
|
194
|
+
...gitOpts,
|
|
195
|
+
timeout: 120_000, // Longer timeout for push
|
|
196
|
+
env: {
|
|
197
|
+
GIT_TERMINAL_PROMPT: '0',
|
|
198
|
+
GIT_CONFIG_COUNT: '1',
|
|
199
|
+
GIT_CONFIG_KEY_0: 'http.https://github.com/.extraheader',
|
|
200
|
+
GIT_CONFIG_VALUE_0: `Authorization: Basic ${Buffer.from(`x-access-token:${token}`).toString('base64')}`,
|
|
201
|
+
},
|
|
202
|
+
});
|
|
203
|
+
emit({ step: 'github-push', status: 'done', message: `Code pushed to ${resolvedOwner}/${repoName}` });
|
|
204
|
+
// ── CI/CD workflow generation (ADR-017) ────────────────────────
|
|
205
|
+
if (framework && deployTarget) {
|
|
206
|
+
emit({ step: 'github-ci', status: 'started', message: 'Generating GitHub Actions CI/CD workflows' });
|
|
207
|
+
try {
|
|
208
|
+
const ciResult = await generateCIWorkflows(projectDir, framework, deployTarget);
|
|
209
|
+
if (ciResult.success && ciResult.files.length > 0) {
|
|
210
|
+
// Commit and push the workflow files
|
|
211
|
+
await execCommand('git', ['add', ...ciResult.files], gitOpts);
|
|
212
|
+
try {
|
|
213
|
+
await execCommand('git', ['commit', '-m', 'Add CI/CD workflows — VoidForge (ADR-017)'], {
|
|
214
|
+
...gitOpts,
|
|
215
|
+
env: {
|
|
216
|
+
GIT_AUTHOR_NAME: 'VoidForge',
|
|
217
|
+
GIT_AUTHOR_EMAIL: 'voidforge@localhost',
|
|
218
|
+
GIT_COMMITTER_NAME: 'VoidForge',
|
|
219
|
+
GIT_COMMITTER_EMAIL: 'voidforge@localhost',
|
|
220
|
+
},
|
|
221
|
+
});
|
|
222
|
+
await execCommand('git', ['push', 'origin', 'main'], {
|
|
223
|
+
...gitOpts,
|
|
224
|
+
timeout: 120_000,
|
|
225
|
+
env: {
|
|
226
|
+
GIT_TERMINAL_PROMPT: '0',
|
|
227
|
+
GIT_CONFIG_COUNT: '1',
|
|
228
|
+
GIT_CONFIG_KEY_0: 'http.https://github.com/.extraheader',
|
|
229
|
+
GIT_CONFIG_VALUE_0: `Authorization: Basic ${Buffer.from(`x-access-token:${token}`).toString('base64')}`,
|
|
230
|
+
},
|
|
231
|
+
});
|
|
232
|
+
emit({ step: 'github-ci', status: 'done', message: `Generated ${ciResult.files.join(', ')} — CI/CD enabled` });
|
|
233
|
+
}
|
|
234
|
+
catch {
|
|
235
|
+
emit({ step: 'github-ci', status: 'done', message: 'Workflows generated locally (push separately if needed)' });
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
catch (ciErr) {
|
|
240
|
+
emit({ step: 'github-ci', status: 'error', message: 'Failed to generate CI/CD workflows', detail: ciErr.message });
|
|
241
|
+
// Non-fatal — project was still pushed
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return {
|
|
245
|
+
success: true,
|
|
246
|
+
repoUrl: `https://github.com/${resolvedOwner}/${repoName}`,
|
|
247
|
+
owner: resolvedOwner,
|
|
248
|
+
repoName,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
catch (err) {
|
|
252
|
+
// Sanitize error — strip token from git error messages
|
|
253
|
+
const rawError = err.message;
|
|
254
|
+
const safeError = rawError
|
|
255
|
+
.replace(/x-access-token:[^@]+@/g, 'x-access-token:***@')
|
|
256
|
+
.replace(/Authorization: Basic [A-Za-z0-9+/=]+/g, 'Authorization: Basic ***')
|
|
257
|
+
.replace(/GIT_CONFIG_VALUE_0=[^\s]+/g, 'GIT_CONFIG_VALUE_0=***');
|
|
258
|
+
emit({ step: 'github-push', status: 'error', message: 'Failed to push to GitHub', detail: safeError });
|
|
259
|
+
return { success: false, error: safeError };
|
|
260
|
+
}
|
|
261
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Headless deploy — runs the same provisioner pipeline as Haku,
|
|
3
|
+
* but outputs progress to stdout instead of SSE to a browser.
|
|
4
|
+
* Called by: `npx voidforge deploy --headless`
|
|
5
|
+
* Used by: /build Phase 12 (Kusanagi)
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Env-only deploy — write vault credentials to .env without provisioning infrastructure.
|
|
9
|
+
* Reads PRD frontmatter to identify required env vars, pulls matching values from the vault,
|
|
10
|
+
* and appends them to the project's .env file.
|
|
11
|
+
* Called by: `npx voidforge deploy --env-only`
|
|
12
|
+
*/
|
|
13
|
+
export declare function envOnlyDeploy(projectDir?: string): Promise<void>;
|
|
14
|
+
export declare function headlessDeploy(projectDir?: string): Promise<void>;
|