@daniellins/power-claude 0.16.3
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.
Potentially problematic release.
This version of @daniellins/power-claude might be problematic. Click here for more details.
- package/LICENSE +21 -0
- package/README.md +121 -0
- package/bin/cli.js +124 -0
- package/installer/__tests__/doctor-ready-oracles.test.cjs +140 -0
- package/installer/__tests__/merge-settings.test.cjs +330 -0
- package/installer/adopt.js +161 -0
- package/installer/copy.js +203 -0
- package/installer/doctor.js +266 -0
- package/installer/install.js +155 -0
- package/installer/manifest.js +102 -0
- package/installer/motor-scripts.js +50 -0
- package/installer/motor-scripts.json +39 -0
- package/installer/uninstall.js +99 -0
- package/installer/update.js +376 -0
- package/installer/util.js +113 -0
- package/installer/wizard.js +64 -0
- package/package.json +26 -0
- package/scripts/__fixtures__/anti-path-demo/agents/ap-writer.md +13 -0
- package/scripts/__fixtures__/anti-path-demo/templates/write-tmpl.md +7 -0
- package/scripts/__fixtures__/anti-path-demo/workflows/wf-ap.smoke.json +10 -0
- package/scripts/__fixtures__/anti-path-demo/workflows/wf-ap.yaml +25 -0
- package/scripts/__fixtures__/assess-tier/retrofit-leve/pod/agents/content-chief.md +1 -0
- package/scripts/__fixtures__/assess-tier/retrofit-leve/pod/workflows/wf-criacao-redteam.yaml +3 -0
- package/scripts/__fixtures__/assess-tier/retrofit-leve/pod-spec.json +13 -0
- package/scripts/__fixtures__/fidelity/fake-green-average-in-band.yaml +21 -0
- package/scripts/__fixtures__/fidelity/fake-green-average.yaml +18 -0
- package/scripts/__fixtures__/fidelity/fake-green-denominator.yaml +19 -0
- package/scripts/__fixtures__/fidelity/fake-green-missing-evidence.yaml +18 -0
- package/scripts/__fixtures__/fidelity/fake-green-threshold.yaml +18 -0
- package/scripts/__fixtures__/fidelity/fake-green-weight.yaml +18 -0
- package/scripts/__fixtures__/fidelity/golden.yaml +31 -0
- package/scripts/__fixtures__/fidelity/trindade-incoherent.yaml +15 -0
- package/scripts/__fixtures__/forge-canonical/pod-spec-example.json +37 -0
- package/scripts/__fixtures__/migrate-squad/authored/agents/offer-engineer.md +17 -0
- package/scripts/__fixtures__/migrate-squad/authored/knowledge/no-source.md +7 -0
- package/scripts/__fixtures__/migrate-squad/authored/knowledge/value-stack-method.md +8 -0
- package/scripts/__fixtures__/migrate-squad/authored/specs/wf-sample.smoke.json +24 -0
- package/scripts/__fixtures__/migrate-squad/authored/specs/wf-sample.spec.json +45 -0
- package/scripts/__fixtures__/migrate-squad/legacy-squad/HEADLINE.md +3 -0
- package/scripts/__fixtures__/migrate-squad/legacy-squad/README.md +4 -0
- package/scripts/__fixtures__/migrate-squad/legacy-squad/agents/hormozi-offer.md +14 -0
- package/scripts/__fixtures__/migrate-squad/legacy-squad/checklists/dead-redundant.md +4 -0
- package/scripts/__fixtures__/migrate-squad/legacy-squad/checklists/method-guide.md +6 -0
- package/scripts/__fixtures__/migrate-squad/legacy-squad/checklists/veto-screen.md +4 -0
- package/scripts/__fixtures__/migrate-squad/legacy-squad/config/config.yaml +2 -0
- package/scripts/__fixtures__/migrate-squad/legacy-squad/data/case-library.md +3 -0
- package/scripts/__fixtures__/migrate-squad/legacy-squad/scripts/validate-mvn.py +16 -0
- package/scripts/__fixtures__/migrate-squad/legacy-squad/sops/sop-sample.md +3 -0
- package/scripts/__fixtures__/migrate-squad/legacy-squad/squad-io.yaml +14 -0
- package/scripts/__fixtures__/migrate-squad/legacy-squad/tasks/gather-context.md +7 -0
- package/scripts/__fixtures__/migrate-squad/legacy-squad/templates/output-tmpl.md +5 -0
- package/scripts/__fixtures__/migrate-squad/legacy-squad/workflows/wf-sample.yaml +24 -0
- package/scripts/__fixtures__/pipeline/pipelines/pipeline-checkpoint.yaml +21 -0
- package/scripts/__fixtures__/pipeline/pipelines/pipeline-demo.yaml +22 -0
- package/scripts/__fixtures__/pipeline/pods/pipe-a/agents/maker.md +13 -0
- package/scripts/__fixtures__/pipeline/pods/pipe-a/memory/learnings.consolidated.md +8 -0
- package/scripts/__fixtures__/pipeline/pods/pipe-a/memory/learnings.jsonl +83 -0
- package/scripts/__fixtures__/pipeline/pods/pipe-a/templates/make-tmpl.md +8 -0
- package/scripts/__fixtures__/pipeline/pods/pipe-a/workflows/wf-a.yaml +16 -0
- package/scripts/__fixtures__/pipeline/pods/pipe-b/agents/user.md +13 -0
- package/scripts/__fixtures__/pipeline/pods/pipe-b/memory/learnings.consolidated.md +8 -0
- package/scripts/__fixtures__/pipeline/pods/pipe-b/memory/learnings.jsonl +14 -0
- package/scripts/__fixtures__/pipeline/pods/pipe-b/templates/use-tmpl.md +6 -0
- package/scripts/__fixtures__/pipeline/pods/pipe-b/workflows/wf-b.yaml +16 -0
- package/scripts/__fixtures__/pod-run/agents/forge-chief.md +13 -0
- package/scripts/__fixtures__/pod-run/agents/pod-critic.md +13 -0
- package/scripts/__fixtures__/pod-run/templates/build-tmpl.md +8 -0
- package/scripts/__fixtures__/pod-run/templates/gate-tmpl.md +6 -0
- package/scripts/__fixtures__/pod-run/workflows/wf-min.yaml +43 -0
- package/scripts/__fixtures__/pod-run/workflows/wf-skip-modes.yaml +50 -0
- package/scripts/__fixtures__/pod-workflow/invalid-checkpoint-all-skippable.yaml +30 -0
- package/scripts/__fixtures__/pod-workflow/invalid-checkpoint-criteria-escalar-de-bloco.yaml +40 -0
- package/scripts/__fixtures__/pod-workflow/invalid-checkpoint-skip-mode-desconhecido.yaml +30 -0
- package/scripts/__fixtures__/pod-workflow/invalid-checkpoint-unknown-key.yaml +29 -0
- package/scripts/__fixtures__/pod-workflow/invalid-cycle.yaml +26 -0
- package/scripts/__fixtures__/pod-workflow/invalid-fix-loop-backedge.yaml +29 -0
- package/scripts/__fixtures__/pod-workflow/invalid-fix-loop-forward.yaml +29 -0
- package/scripts/__fixtures__/pod-workflow/invalid-handoff-open.yaml +27 -0
- package/scripts/__fixtures__/pod-workflow/invalid-knowledge-shape.yaml +18 -0
- package/scripts/__fixtures__/pod-workflow/invalid-missing-agent.yaml +15 -0
- package/scripts/__fixtures__/pod-workflow/invalid-missing-outputs.yaml +15 -0
- package/scripts/__fixtures__/pod-workflow/invalid-missing-template.yaml +15 -0
- package/scripts/__fixtures__/pod-workflow/invalid-missing-veto.yaml +13 -0
- package/scripts/__fixtures__/pod-workflow/invalid-template-not-on-disk.yaml +16 -0
- package/scripts/__fixtures__/pod-workflow/invalid-veto-prose.yaml +17 -0
- package/scripts/__fixtures__/pod-workflow/knowledge/a.md +4 -0
- package/scripts/__fixtures__/pod-workflow/knowledge/b.md +4 -0
- package/scripts/__fixtures__/pod-workflow/knowledge/c.md +4 -0
- package/scripts/__fixtures__/pod-workflow/templates/step-tmpl.md +7 -0
- package/scripts/__fixtures__/pod-workflow/valid-checkpoint-skip-modes.yaml +29 -0
- package/scripts/__fixtures__/pod-workflow/valid-fix-loop.yaml +30 -0
- package/scripts/__fixtures__/pod-workflow/valid-knowledge.yaml +30 -0
- package/scripts/__fixtures__/pod-workflow/valid-veto-always-true.yaml +20 -0
- package/scripts/__fixtures__/pod-workflow/valid.yaml +27 -0
- package/scripts/__fixtures__/smoke-canary/agents/canary-reporter.md +13 -0
- package/scripts/__fixtures__/smoke-canary/agents/canary-researcher.md +13 -0
- package/scripts/__fixtures__/smoke-canary/agents/canary-synth.md +13 -0
- package/scripts/__fixtures__/smoke-canary/memory/learnings.consolidated.md +10 -0
- package/scripts/__fixtures__/smoke-canary/memory/learnings.jsonl +448 -0
- package/scripts/__fixtures__/smoke-canary/templates/report-tmpl.md +9 -0
- package/scripts/__fixtures__/smoke-canary/templates/research-tmpl.md +7 -0
- package/scripts/__fixtures__/smoke-canary/templates/synth-tmpl.md +9 -0
- package/scripts/__fixtures__/smoke-canary/workflows/wf-canary.smoke.json +11 -0
- package/scripts/__fixtures__/smoke-canary/workflows/wf-canary.yaml +53 -0
- package/scripts/__fixtures__/source-audit/fake-green-bronze-unsignaled.yaml +10 -0
- package/scripts/__fixtures__/source-audit/fake-green-counts.yaml +9 -0
- package/scripts/__fixtures__/source-audit/fake-green-missing-evidence.yaml +9 -0
- package/scripts/__fixtures__/source-audit/fake-green-unclassified.yaml +10 -0
- package/scripts/__fixtures__/source-audit/fake-green-verdict.yaml +10 -0
- package/scripts/__fixtures__/source-audit/golden-blocked.yaml +10 -0
- package/scripts/__fixtures__/source-audit/golden.yaml +11 -0
- package/scripts/__fixtures__/sweep-forms/agents/forms-count.md +13 -0
- package/scripts/__fixtures__/sweep-forms/agents/forms-field.md +13 -0
- package/scripts/__fixtures__/sweep-forms/agents/forms-fileref.md +13 -0
- package/scripts/__fixtures__/sweep-forms/agents/forms-json.md +13 -0
- package/scripts/__fixtures__/sweep-forms/agents/forms-section.md +13 -0
- package/scripts/__fixtures__/sweep-forms/specs/wf-forms.spec.json +5 -0
- package/scripts/__fixtures__/sweep-forms/templates/t_count.md +5 -0
- package/scripts/__fixtures__/sweep-forms/templates/t_field.md +3 -0
- package/scripts/__fixtures__/sweep-forms/templates/t_fileref.md +3 -0
- package/scripts/__fixtures__/sweep-forms/templates/t_json.md +0 -0
- package/scripts/__fixtures__/sweep-forms/templates/t_section.md +3 -0
- package/scripts/__fixtures__/sweep-forms/workflows/wf-forms.smoke.json +13 -0
- package/scripts/__fixtures__/sweep-forms/workflows/wf-forms.yaml +67 -0
- package/scripts/__fixtures__/validate-story-acs-corpus/corpus-1-noop-state-json.fixture.md +18 -0
- package/scripts/__fixtures__/validate-story-acs-corpus/corpus-2-crash-buildworkflowyaml.fixture.md +26 -0
- package/scripts/__fixtures__/validate-story-acs-corpus/corpus-3-nasce-verde-skip-modes.fixture.md +29 -0
- package/scripts/__fixtures__/validate-story-acs-corpus/corpus-4-guarda-sem-irmao.fixture.md +17 -0
- package/scripts/__fixtures__/validate-story-acs-corpus/corpus-5a-diff-stat-sem-guarda.fixture.md +17 -0
- package/scripts/__fixtures__/validate-story-acs-corpus/corpus-5b-test-f-sobre-diretorio.fixture.md +20 -0
- package/scripts/__fixtures__/veto-checks/copy-clean.md +4 -0
- package/scripts/__fixtures__/veto-checks/copy-dashes.md +4 -0
- package/scripts/__fixtures__/veto-checks/n8n-bad.md +18 -0
- package/scripts/__fixtures__/veto-checks/n8n-ok.md +22 -0
- package/scripts/__fixtures__/veto-checks/page-bad.html +7 -0
- package/scripts/__fixtures__/veto-checks/phash/copy.png +0 -0
- package/scripts/__fixtures__/veto-checks/phash/distinct.png +0 -0
- package/scripts/__fixtures__/veto-checks/phash/distinct2.png +0 -0
- package/scripts/__fixtures__/veto-checks/phash/make-fixtures.cjs +203 -0
- package/scripts/__fixtures__/veto-checks/phash/ref.png +0 -0
- package/scripts/__fixtures__/veto-checks/slide-ok.html +15 -0
- package/scripts/__fixtures__/veto-checks/slide-overflow.html +14 -0
- package/scripts/__fixtures__/veto-checks/sweep-pod/agents/vc-checker.md +13 -0
- package/scripts/__fixtures__/veto-checks/sweep-pod/templates/check-tmpl.md +6 -0
- package/scripts/__fixtures__/veto-checks/sweep-pod/workflows/wf-vc.smoke.json +10 -0
- package/scripts/__fixtures__/veto-checks/sweep-pod/workflows/wf-vc.yaml +19 -0
- package/scripts/__fixtures__/voz-do-dono/README.md +23 -0
- package/scripts/__fixtures__/voz-do-dono/dono-escalar.yaml +9 -0
- package/scripts/__fixtures__/voz-do-dono/dono-guia.yaml +10 -0
- package/scripts/__fixtures__/voz-do-dono/peca-3a-pessoa.md +6 -0
- package/scripts/__fixtures__/voz-do-dono/peca-com-lexico-proibido.md +6 -0
- package/scripts/__fixtures__/voz-do-dono/peca-limpa-1a-pessoa.md +6 -0
- package/scripts/__tests__/derive-ready-transitions.test.cjs +269 -0
- package/scripts/__tests__/enforce-cycle-authority.test.cjs +869 -0
- package/scripts/__tests__/enforce-git-push-authority.test.cjs +701 -0
- package/scripts/__tests__/enforce-ready-oracles.test.cjs +745 -0
- package/scripts/__tests__/motor-scripts.test.cjs +339 -0
- package/scripts/__tests__/pc-run-pod-counter.test.cjs +58 -0
- package/scripts/__tests__/pc-run-pod.test.cjs +578 -0
- package/scripts/__tests__/validate-pod-workflow.test.cjs +90 -0
- package/scripts/__tests__/validate-story-acs.test.cjs +607 -0
- package/scripts/anti-path.test.cjs +163 -0
- package/scripts/arena.cjs +514 -0
- package/scripts/arena.test.cjs +213 -0
- package/scripts/brief-leitura-obrigatoria.test.cjs +364 -0
- package/scripts/consolidate-knowledge-runner.test.cjs +249 -0
- package/scripts/default-funcional.test.cjs +153 -0
- package/scripts/derive-ready-transitions.cjs +325 -0
- package/scripts/forge-additive.test.cjs +158 -0
- package/scripts/forge-assess-tier.cjs +205 -0
- package/scripts/forge-assess-tier.test.cjs +114 -0
- package/scripts/forge-canonical.test.cjs +624 -0
- package/scripts/forge-generate.cjs +1303 -0
- package/scripts/forge-harden-learning.cjs +921 -0
- package/scripts/forge-harden-learning.test.cjs +242 -0
- package/scripts/forge-ingest-memory.cjs +136 -0
- package/scripts/forge-upgrade-pod.cjs +368 -0
- package/scripts/forge.test.cjs +609 -0
- package/scripts/harden-knowledge.test.cjs +612 -0
- package/scripts/harness-g5-lite.cjs +243 -0
- package/scripts/harness-g5-lite.test.cjs +134 -0
- package/scripts/hn-carousel-contrato-entrada.test.cjs +96 -0
- package/scripts/migrate-squad-orchestration.test.cjs +146 -0
- package/scripts/migration-manifest-sf3.2.test.cjs +382 -0
- package/scripts/migration-manifest-sf3.3.test.cjs +170 -0
- package/scripts/migration-manifest-sf5.5.test.cjs +189 -0
- package/scripts/migration-manifest.cjs +1146 -0
- package/scripts/migration-manifest.test.cjs +186 -0
- package/scripts/npm-scope-invocation.test.cjs +194 -0
- package/scripts/owner-layer.cjs +442 -0
- package/scripts/owner-layer.test.cjs +358 -0
- package/scripts/pc-run-pipeline.cjs +289 -0
- package/scripts/pc-run-pipeline.test.cjs +256 -0
- package/scripts/pc-run-pod-countgte.test.cjs +66 -0
- package/scripts/pc-run-pod.cjs +1355 -0
- package/scripts/phash-gate.test.cjs +433 -0
- package/scripts/pod-export-compile.cjs +487 -0
- package/scripts/pod-export-compile.test.cjs +312 -0
- package/scripts/pod-export-executor.cjs +678 -0
- package/scripts/pod-export-executor.test.cjs +1341 -0
- package/scripts/pod-export-hardening.test.cjs +531 -0
- package/scripts/pod-export-postprocess.cjs +427 -0
- package/scripts/pod-export-postprocess.test.cjs +558 -0
- package/scripts/pod-export-queue-race.test.cjs +865 -0
- package/scripts/pod-export-release.cjs +473 -0
- package/scripts/pod-export-release.test.cjs +267 -0
- package/scripts/pod-export-service.cjs +1297 -0
- package/scripts/pod-export-service.test.cjs +489 -0
- package/scripts/pod-export-tools.cjs +470 -0
- package/scripts/pod-export-ui.cjs +805 -0
- package/scripts/pod-export-ui.test.cjs +301 -0
- package/scripts/pod-memory-budget.test.cjs +309 -0
- package/scripts/pod-memory-note.cjs +357 -0
- package/scripts/pod-memory-note.test.cjs +452 -0
- package/scripts/pod-memory.cjs +1252 -0
- package/scripts/pod-memory.test.cjs +951 -0
- package/scripts/render-png.test.cjs +307 -0
- package/scripts/smoke-isolation.test.cjs +100 -0
- package/scripts/smoke-pod-workflow.cjs +755 -0
- package/scripts/smoke-sweep.test.cjs +170 -0
- package/scripts/validate-adopt.js +235 -0
- package/scripts/validate-branding.js +84 -0
- package/scripts/validate-budgets.js +140 -0
- package/scripts/validate-fidelity-output.cjs +267 -0
- package/scripts/validate-fidelity-output.test.cjs +101 -0
- package/scripts/validate-install.js +230 -0
- package/scripts/validate-no-clone.cjs +220 -0
- package/scripts/validate-no-clone.test.cjs +77 -0
- package/scripts/validate-pipeline.cjs +145 -0
- package/scripts/validate-pod-workflow.cjs +878 -0
- package/scripts/validate-source-audit.cjs +170 -0
- package/scripts/validate-source-audit.test.cjs +90 -0
- package/scripts/validate-story-acs.cjs +862 -0
- package/scripts/validate-update-scope-motor.js +421 -0
- package/scripts/veto-checks/html-valid.cjs +92 -0
- package/scripts/veto-checks/lexical-check.cjs +62 -0
- package/scripts/veto-checks/phash-gate.cjs +589 -0
- package/scripts/veto-checks/render-gate.cjs +165 -0
- package/scripts/veto-checks/render-png.cjs +358 -0
- package/scripts/veto-checks.test.cjs +219 -0
- package/scripts/watcher-audit.cjs +178 -0
- package/template/.claude/CLAUDE.md +103 -0
- package/template/.claude/agents/pc-analyst.md +100 -0
- package/template/.claude/agents/pc-architect.md +32 -0
- package/template/.claude/agents/pc-dev.md +27 -0
- package/template/.claude/agents/pc-devops.md +45 -0
- package/template/.claude/agents/pc-planner.md +32 -0
- package/template/.claude/agents/pc-po.md +25 -0
- package/template/.claude/agents/pc-qa.md +25 -0
- package/template/.claude/commands/power/academy.md +9 -0
- package/template/.claude/commands/power/automation.md +9 -0
- package/template/.claude/commands/power/content-carousel.md +267 -0
- package/template/.claude/commands/power/content.md +9 -0
- package/template/.claude/commands/power/dev.md +9 -0
- package/template/.claude/commands/power/forge.md +224 -0
- package/template/.claude/commands/power/hormozi.md +221 -0
- package/template/.claude/commands/power/modo.md +57 -0
- package/template/.claude/hooks/README.md +114 -0
- package/template/.claude/hooks/context-budget.cjs +64 -0
- package/template/.claude/hooks/enforce-cycle-authority.cjs +457 -0
- package/template/.claude/hooks/enforce-git-push-authority.cjs +925 -0
- package/template/.claude/hooks/enforce-ready-oracles.cjs +502 -0
- package/template/.claude/rules/authority.md +76 -0
- package/template/.claude/rules/curadoria-de-conhecimento.md +30 -0
- package/template/.claude/rules/model-matrix.md +34 -0
- package/template/.claude/rules/orchestration.md +133 -0
- package/template/.claude/settings.json +50 -0
- package/template/.claude/skills/pc-apply-qa-fixes/SKILL.md +108 -0
- package/template/.claude/skills/pc-apply-qa-fixes/references/fix-loop.md +40 -0
- package/template/.claude/skills/pc-apply-qa-fixes/references/fix-request-template.md +70 -0
- package/template/.claude/skills/pc-arena/SKILL.md +96 -0
- package/template/.claude/skills/pc-close-story/SKILL.md +105 -0
- package/template/.claude/skills/pc-commit/SKILL.md +108 -0
- package/template/.claude/skills/pc-develop-story/SKILL.md +116 -0
- package/template/.claude/skills/pc-full-cycle/SKILL.md +150 -0
- package/template/.claude/skills/pc-pipeline/SKILL.md +63 -0
- package/template/.claude/skills/pc-pipeline/references/gate-templates.md +46 -0
- package/template/.claude/skills/pc-review-story/SKILL.md +129 -0
- package/template/.claude/skills/pc-review-story/references/false-positive-detection.md +50 -0
- package/template/.claude/skills/pc-review-story/references/nfr-assess.md +47 -0
- package/template/.claude/skills/pc-review-story/references/risk-profile.md +75 -0
- package/template/.claude/skills/pc-review-story/references/security-checklist.md +69 -0
- package/template/.claude/skills/pc-review-story/references/test-design.md +37 -0
- package/template/.claude/skills/pc-review-story/references/trace-requirements.md +46 -0
- package/template/.claude/skills/pc-run-pod/SKILL.md +123 -0
- package/template/.claude/skills/pc-validate-story/SKILL.md +114 -0
- package/template/.claude/skills/pc-wave/SKILL.md +133 -0
- package/template/.env.example +10 -0
- package/template/knowledge/analyst/brainstorming.md +40 -0
- package/template/knowledge/analyst/brief-skeleton.md +32 -0
- package/template/knowledge/analyst/competitor-skeleton.md +39 -0
- package/template/knowledge/analyst/elicitation-menu.md +49 -0
- package/template/knowledge/analyst/market-research-skeleton.md +36 -0
- package/template/knowledge/analyst/research-prompt-structure.md +48 -0
- package/template/knowledge/analyst/roi-skeleton.md +51 -0
- package/template/knowledge/voice-dna/README.md +99 -0
- package/template/knowledge/voice-dna/voice-dna.example.yaml +157 -0
- package/template/pods/README.md +64 -0
- package/template/pods/academy/README.md +37 -0
- package/template/pods/academy/agents/academy-chief.md +27 -0
- package/template/pods/academy/examples/palestra.example.md +142 -0
- package/template/pods/academy/pod-spec.json +44 -0
- package/template/pods/academy/templates/materiais-tmpl.md +17 -0
- package/template/pods/academy/templates/revisao-didatica-tmpl.md +20 -0
- package/template/pods/academy/workflows/wf-materiais-revisao.yaml +30 -0
- package/template/pods/authority-content/README.md +43 -0
- package/template/pods/authority-content/agents/content-chief.md +28 -0
- package/template/pods/authority-content/pod-spec.json +45 -0
- package/template/pods/authority-content/templates/criacao-na-voz-tmpl.md +17 -0
- package/template/pods/authority-content/templates/red-team-factual-tmpl.md +23 -0
- package/template/pods/authority-content/workflows/wf-criacao-redteam.yaml +30 -0
- package/template/pods/automation/README.md +37 -0
- package/template/pods/automation/agents/langgraph-architect.md +30 -0
- package/template/pods/automation/agents/n8n-architect.md +30 -0
- package/template/pods/automation/examples/README.md +46 -0
- package/template/pods/automation/examples/n8n-content-radar.example.json +380 -0
- package/template/pods/automation/knowledge/langgraph-patterns.md +126 -0
- package/template/pods/automation/knowledge/n8n-patterns.md +131 -0
- package/template/pods/automation/memory/README.md +16 -0
- package/template/pods/automation/memory/learnings.consolidated.md +8 -0
- package/template/pods/automation/memory/learnings.jsonl +0 -0
- package/template/pods/automation/pod-spec.json +109 -0
- package/template/pods/automation/specs/wf-langgraph-build.spec.json +107 -0
- package/template/pods/automation/squad-io.yaml +28 -0
- package/template/pods/automation/templates/lg-build-tmpl.md +17 -0
- package/template/pods/automation/templates/lg-design-tmpl.md +23 -0
- package/template/pods/automation/templates/lg-discover-tmpl.md +20 -0
- package/template/pods/automation/templates/lg-handoff-tmpl.md +20 -0
- package/template/pods/automation/templates/lg-test-tmpl.md +20 -0
- package/template/pods/automation/templates/n8n-build-tmpl.md +14 -0
- package/template/pods/automation/templates/n8n-design-tmpl.md +23 -0
- package/template/pods/automation/templates/n8n-discover-tmpl.md +20 -0
- package/template/pods/automation/templates/n8n-handoff-tmpl.md +20 -0
- package/template/pods/automation/templates/n8n-test-tmpl.md +20 -0
- package/template/pods/automation/workflows/wf-langgraph-build.smoke.json +11 -0
- package/template/pods/automation/workflows/wf-langgraph-build.yaml +64 -0
- package/template/pods/automation/workflows/wf-n8n-build.smoke.json +11 -0
- package/template/pods/automation/workflows/wf-n8n-build.yaml +65 -0
- package/template/pods/content-carousel/README.md +91 -0
- package/template/pods/content-carousel/agents/carousel-builder.md +28 -0
- package/template/pods/content-carousel/agents/carousel-visual.md +24 -0
- package/template/pods/content-carousel/agents/hn-curator.md +74 -0
- package/template/pods/content-carousel/config/heuristic-watcher-rubric.yaml +59 -0
- package/template/pods/content-carousel/knowledge/aquisicao-ancora.md +443 -0
- package/template/pods/content-carousel/knowledge/cta-brief.md +25 -0
- package/template/pods/content-carousel/knowledge/dono.example.yaml +45 -0
- package/template/pods/content-carousel/knowledge/identidade-visual-mascote.md +62 -0
- package/template/pods/content-carousel/knowledge/image-generation.md +62 -0
- package/template/pods/content-carousel/knowledge/selecao-de-ancora.md +60 -0
- package/template/pods/content-carousel/knowledge/slides-html.md +56 -0
- package/template/pods/content-carousel/memory/README.md +18 -0
- package/template/pods/content-carousel/memory/learnings.consolidated.md +6 -0
- package/template/pods/content-carousel/memory/learnings.jsonl +0 -0
- package/template/pods/content-carousel/pod-spec.json +100 -0
- package/template/pods/content-carousel/squad-io.yaml +10 -0
- package/template/pods/content-carousel/templates/assembly-tmpl.md +23 -0
- package/template/pods/content-carousel/templates/digest-tmpl.md +29 -0
- package/template/pods/content-carousel/templates/visuals-tmpl.md +20 -0
- package/template/pods/content-carousel/workflows/wf-content-carousel.smoke.json +23 -0
- package/template/pods/content-carousel/workflows/wf-content-carousel.yaml +80 -0
- package/template/pods/dev-ia/README.md +45 -0
- package/template/pods/dev-ia/agents/db-architect.md +33 -0
- package/template/pods/dev-ia/agents/ux-architect.md +29 -0
- package/template/pods/dev-ia/knowledge/db/migration-protocol.md +95 -0
- package/template/pods/dev-ia/knowledge/db/rls-patterns.md +101 -0
- package/template/pods/dev-ia/knowledge/db/schema-review-checklist.md +76 -0
- package/template/pods/dev-ia/memory/README.md +16 -0
- package/template/pods/dev-ia/memory/learnings.consolidated.md +8 -0
- package/template/pods/dev-ia/memory/learnings.jsonl +0 -0
- package/template/pods/dev-ia/pod-spec.json +34 -0
- package/template/pods/dev-ia/templates/schema-review-tmpl.md +23 -0
- package/template/pods/dev-ia/templates/ux-flow-review-tmpl.md +23 -0
- package/template/pods/dev-ia/tools/db-ops/backup-manager.sh +321 -0
- package/template/pods/dev-ia/tools/db-ops/best-practices-auditor.sh +534 -0
- package/template/pods/dev-ia/tools/db-ops/bootstrap-runner.sh +255 -0
- package/template/pods/dev-ia/tools/db-ops/data-loader.sh +616 -0
- package/template/pods/dev-ia/tools/db-ops/detect-database.sh +113 -0
- package/template/pods/dev-ia/tools/db-ops/explain-analyzer.sh +285 -0
- package/template/pods/dev-ia/tools/db-ops/health-checker.sh +323 -0
- package/template/pods/dev-ia/tools/db-ops/migration-runner.sh +308 -0
- package/template/pods/dev-ia/tools/db-ops/postgresql-schema-loader.sh +334 -0
- package/template/pods/dev-ia/tools/db-ops/query-runner.sh +171 -0
- package/template/pods/dev-ia/tools/db-ops/rls-policy-installer.sh +480 -0
- package/template/pods/dev-ia/tools/db-ops/rls-test-suite.sh +172 -0
- package/template/pods/dev-ia/tools/db-ops/schema-context-loader.sh +176 -0
- package/template/pods/hormozi-method/README.md +52 -0
- package/template/pods/hormozi-method/agents/acquisition-strategist.md +33 -0
- package/template/pods/hormozi-method/agents/conversion-copywriter.md +34 -0
- package/template/pods/hormozi-method/agents/monetization-architect.md +35 -0
- package/template/pods/hormozi-method/agents/offer-engineer.md +37 -0
- package/template/pods/hormozi-method/knowledge/core-four-leads.md +51 -0
- package/template/pods/hormozi-method/knowledge/grand-slam-offer.md +66 -0
- package/template/pods/hormozi-method/knowledge/growth-decision.md +38 -0
- package/template/pods/hormozi-method/knowledge/hooks-and-ads.md +56 -0
- package/template/pods/hormozi-method/knowledge/launch-email.md +31 -0
- package/template/pods/hormozi-method/knowledge/money-model.md +46 -0
- package/template/pods/hormozi-method/knowledge/opportunity-screening.md +44 -0
- package/template/pods/hormozi-method/knowledge/pages.md +25 -0
- package/template/pods/hormozi-method/knowledge/pos-lancamento-leads.md +56 -0
- package/template/pods/hormozi-method/knowledge/pricing.md +36 -0
- package/template/pods/hormozi-method/knowledge/retention-ltv.md +37 -0
- package/template/pods/hormozi-method/knowledge/scale-roadmap.md +35 -0
- package/template/pods/hormozi-method/knowledge/swipefiles-curados.md +44 -0
- package/template/pods/hormozi-method/knowledge/value-equation-diagnostic.md +77 -0
- package/template/pods/hormozi-method/memory/README.md +16 -0
- package/template/pods/hormozi-method/memory/learnings.consolidated.md +6 -0
- package/template/pods/hormozi-method/memory/learnings.jsonl +0 -0
- package/template/pods/hormozi-method/pod-spec.json +50 -0
- package/template/pods/hormozi-method/specs/wf-full-launch-sequence.spec.json +149 -0
- package/template/pods/hormozi-method/specs/wf-lead-magnet-pipeline.spec.json +125 -0
- package/template/pods/hormozi-method/specs/wf-money-model-design.spec.json +117 -0
- package/template/pods/hormozi-method/specs/wf-paid-ads-campaign.spec.json +132 -0
- package/template/pods/hormozi-method/specs/wf-scaling-diagnostic.spec.json +121 -0
- package/template/pods/hormozi-method/squad-io.yaml +43 -0
- package/template/pods/hormozi-method/templates/conversion-copywriter-tmpl.md +20 -0
- package/template/pods/hormozi-method/templates/launch-execucao-tmpl.md +17 -0
- package/template/pods/hormozi-method/templates/launch-fechamento-tmpl.md +17 -0
- package/template/pods/hormozi-method/templates/launch-pos-tmpl.md +17 -0
- package/template/pods/hormozi-method/templates/launch-preparacao-tmpl.md +17 -0
- package/template/pods/hormozi-method/templates/lm-copy-tmpl.md +17 -0
- package/template/pods/hormozi-method/templates/lm-distribuicao-tmpl.md +18 -0
- package/template/pods/hormozi-method/templates/lm-estrategia-tmpl.md +17 -0
- package/template/pods/hormozi-method/templates/mm-arquitetura-tmpl.md +18 -0
- package/template/pods/hormozi-method/templates/mm-copy-tmpl.md +17 -0
- package/template/pods/hormozi-method/templates/mm-diagnostico-tmpl.md +14 -0
- package/template/pods/hormozi-method/templates/monetization-architect-tmpl.md +17 -0
- package/template/pods/hormozi-method/templates/offer-engineer-tmpl.md +20 -0
- package/template/pods/hormozi-method/templates/paid-criativos-tmpl.md +19 -0
- package/template/pods/hormozi-method/templates/paid-fundacao-tmpl.md +17 -0
- package/template/pods/hormozi-method/templates/paid-teste-escala-tmpl.md +17 -0
- package/template/pods/hormozi-method/templates/scaling-diagnostico-tmpl.md +17 -0
- package/template/pods/hormozi-method/templates/scaling-priorizacao-tmpl.md +17 -0
- package/template/pods/hormozi-method/templates/scaling-roadmap-tmpl.md +17 -0
- package/template/pods/hormozi-method/workflows/wf-full-launch-sequence.smoke.json +12 -0
- package/template/pods/hormozi-method/workflows/wf-full-launch-sequence.yaml +56 -0
- package/template/pods/hormozi-method/workflows/wf-grand-slam-offer.smoke.json +11 -0
- package/template/pods/hormozi-method/workflows/wf-grand-slam-offer.yaml +45 -0
- package/template/pods/hormozi-method/workflows/wf-lead-magnet-pipeline.smoke.json +9 -0
- package/template/pods/hormozi-method/workflows/wf-lead-magnet-pipeline.yaml +45 -0
- package/template/pods/hormozi-method/workflows/wf-money-model-design.smoke.json +11 -0
- package/template/pods/hormozi-method/workflows/wf-money-model-design.yaml +45 -0
- package/template/pods/hormozi-method/workflows/wf-paid-ads-campaign.smoke.json +9 -0
- package/template/pods/hormozi-method/workflows/wf-paid-ads-campaign.yaml +46 -0
- package/template/pods/hormozi-method/workflows/wf-scaling-diagnostic.smoke.json +11 -0
- package/template/pods/hormozi-method/workflows/wf-scaling-diagnostic.yaml +44 -0
- package/template/pods/squad-forge/README.md +53 -0
- package/template/pods/squad-forge/agents/forge-chief.md +31 -0
- package/template/pods/squad-forge/agents/mind-extractor.md +29 -0
- package/template/pods/squad-forge/agents/pod-critic.md +26 -0
- package/template/pods/squad-forge/config/heuristic-watcher-rubric.yaml +74 -0
- package/template/pods/squad-forge/knowledge/fidelity-rubric.yaml +176 -0
- package/template/pods/squad-forge/knowledge/g6-memory-check.md +17 -0
- package/template/pods/squad-forge/knowledge/memory-ingest.md +16 -0
- package/template/pods/squad-forge/knowledge/source-audit-rubric.yaml +60 -0
- package/template/pods/squad-forge/memory/README.md +16 -0
- package/template/pods/squad-forge/memory/learnings.consolidated.md +8 -0
- package/template/pods/squad-forge/memory/learnings.jsonl +0 -0
- package/template/pods/squad-forge/pod-spec.json +166 -0
- package/template/pods/squad-forge/squad-io.yaml +13 -0
- package/template/pods/squad-forge/tasks/pipeline.md +158 -0
- package/template/pods/squad-forge/templates/discovery-tmpl.md +40 -0
- package/template/pods/squad-forge/templates/generation-tmpl.md +18 -0
- package/template/pods/squad-forge/templates/red-team-tmpl.md +17 -0
- package/template/pods/squad-forge/templates/register-tmpl.md +17 -0
- package/template/pods/squad-forge/templates/workflow-tmpl.yaml +101 -0
- package/template/pods/squad-forge/workflows/wf-forge.smoke.json +12 -0
- package/template/pods/squad-forge/workflows/wf-forge.yaml +60 -0
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# =============================================================================
|
|
3
|
+
# health-checker.sh - Database Health Check (Worker Script)
|
|
4
|
+
# =============================================================================
|
|
5
|
+
# execution_type: Worker
|
|
6
|
+
# pattern: EXEC-W-001
|
|
7
|
+
# tasks: db-env-check, db-smoke-test, schema-audit
|
|
8
|
+
# token_savings: 95%
|
|
9
|
+
# =============================================================================
|
|
10
|
+
|
|
11
|
+
set -euo pipefail
|
|
12
|
+
|
|
13
|
+
# Colors
|
|
14
|
+
RED='\033[0;31m'
|
|
15
|
+
GREEN='\033[0;32m'
|
|
16
|
+
YELLOW='\033[1;33m'
|
|
17
|
+
BLUE='\033[0;34m'
|
|
18
|
+
NC='\033[0m' # No Color
|
|
19
|
+
|
|
20
|
+
# Defaults
|
|
21
|
+
MODE="quick"
|
|
22
|
+
VERBOSE=false
|
|
23
|
+
DB_URL=""
|
|
24
|
+
|
|
25
|
+
usage() {
|
|
26
|
+
cat << EOF
|
|
27
|
+
Usage: $(basename "$0") [OPTIONS]
|
|
28
|
+
|
|
29
|
+
Database health checker for Supabase/PostgreSQL.
|
|
30
|
+
|
|
31
|
+
OPTIONS:
|
|
32
|
+
--quick Quick health check (default)
|
|
33
|
+
--full Full health check with all metrics
|
|
34
|
+
--smoke-test Post-migration smoke tests
|
|
35
|
+
--schema-audit Schema quality audit
|
|
36
|
+
--security-audit Security-focused audit
|
|
37
|
+
-v, --verbose Verbose output
|
|
38
|
+
-h, --help Show this help
|
|
39
|
+
|
|
40
|
+
EXAMPLES:
|
|
41
|
+
$(basename "$0") --quick
|
|
42
|
+
$(basename "$0") --smoke-test
|
|
43
|
+
$(basename "$0") --schema-audit --verbose
|
|
44
|
+
|
|
45
|
+
ENVIRONMENT:
|
|
46
|
+
SUPABASE_DB_URL or DATABASE_URL Required. PostgreSQL connection string.
|
|
47
|
+
EOF
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
log_info() { echo -e "${BLUE}ℹ${NC} $1"; }
|
|
51
|
+
log_success() { echo -e "${GREEN}✓${NC} $1"; }
|
|
52
|
+
log_warning() { echo -e "${YELLOW}⚠${NC} $1"; }
|
|
53
|
+
log_error() { echo -e "${RED}✗${NC} $1"; }
|
|
54
|
+
|
|
55
|
+
check_env() {
|
|
56
|
+
DB_URL="${SUPABASE_DB_URL:-${DATABASE_URL:-}}"
|
|
57
|
+
if [[ -z "$DB_URL" ]]; then
|
|
58
|
+
log_error "SUPABASE_DB_URL or DATABASE_URL not set"
|
|
59
|
+
exit 1
|
|
60
|
+
fi
|
|
61
|
+
if [[ -n "${SUPABASE_DB_URL:-}" ]]; then
|
|
62
|
+
log_success "SUPABASE_DB_URL present (redacted)"
|
|
63
|
+
else
|
|
64
|
+
log_success "DATABASE_URL present (redacted)"
|
|
65
|
+
fi
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
check_connection() {
|
|
69
|
+
log_info "Testing database connection..."
|
|
70
|
+
if psql "$DB_URL" -c "SELECT 1" > /dev/null 2>&1; then
|
|
71
|
+
log_success "Database connection OK"
|
|
72
|
+
return 0
|
|
73
|
+
else
|
|
74
|
+
log_error "Database connection FAILED"
|
|
75
|
+
return 1
|
|
76
|
+
fi
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
check_ssl() {
|
|
80
|
+
log_info "Checking SSL configuration..."
|
|
81
|
+
if echo "$DB_URL" | grep -q "sslmode="; then
|
|
82
|
+
log_success "SSL mode configured"
|
|
83
|
+
else
|
|
84
|
+
log_warning "Consider adding sslmode=require"
|
|
85
|
+
fi
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
check_pooler() {
|
|
89
|
+
log_info "Checking connection pooler..."
|
|
90
|
+
if echo "$DB_URL" | grep -q "pooler"; then
|
|
91
|
+
log_success "Using connection pooler"
|
|
92
|
+
else
|
|
93
|
+
log_warning "Consider using pooler host for better performance"
|
|
94
|
+
fi
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
check_client_tools() {
|
|
98
|
+
log_info "Checking PostgreSQL client tools..."
|
|
99
|
+
local tools_ok=true
|
|
100
|
+
|
|
101
|
+
if command -v psql &> /dev/null; then
|
|
102
|
+
log_success "psql: $(psql --version | head -1)"
|
|
103
|
+
else
|
|
104
|
+
log_error "psql not found"
|
|
105
|
+
tools_ok=false
|
|
106
|
+
fi
|
|
107
|
+
|
|
108
|
+
if command -v pg_dump &> /dev/null; then
|
|
109
|
+
log_success "pg_dump: $(pg_dump --version | head -1)"
|
|
110
|
+
else
|
|
111
|
+
log_error "pg_dump not found"
|
|
112
|
+
tools_ok=false
|
|
113
|
+
fi
|
|
114
|
+
|
|
115
|
+
$tools_ok
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
get_db_stats() {
|
|
119
|
+
log_info "Collecting database statistics..."
|
|
120
|
+
|
|
121
|
+
psql "$DB_URL" -t -A << 'SQL'
|
|
122
|
+
SELECT json_build_object(
|
|
123
|
+
'version', version(),
|
|
124
|
+
'database_size', pg_size_pretty(pg_database_size(current_database())),
|
|
125
|
+
'table_count', (SELECT count(*) FROM pg_tables WHERE schemaname = 'public'),
|
|
126
|
+
'index_count', (SELECT count(*) FROM pg_indexes WHERE schemaname = 'public'),
|
|
127
|
+
'active_connections', (SELECT count(*) FROM pg_stat_activity WHERE state = 'active')
|
|
128
|
+
);
|
|
129
|
+
SQL
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
run_smoke_tests() {
|
|
133
|
+
log_info "Running smoke tests..."
|
|
134
|
+
|
|
135
|
+
# Test 1: Tables exist
|
|
136
|
+
local table_count
|
|
137
|
+
table_count=$(psql "$DB_URL" -t -A -c "SELECT count(*) FROM pg_tables WHERE schemaname = 'public'")
|
|
138
|
+
if [[ "$table_count" -gt 0 ]]; then
|
|
139
|
+
log_success "Tables exist: $table_count tables in public schema"
|
|
140
|
+
else
|
|
141
|
+
log_warning "No tables in public schema"
|
|
142
|
+
fi
|
|
143
|
+
|
|
144
|
+
# Test 2: RLS enabled
|
|
145
|
+
local rls_enabled
|
|
146
|
+
rls_enabled=$(psql "$DB_URL" -t -A -c "SELECT count(*) FROM pg_tables WHERE schemaname = 'public' AND rowsecurity = true")
|
|
147
|
+
log_info "Tables with RLS enabled: $rls_enabled"
|
|
148
|
+
|
|
149
|
+
# Test 3: No pending migrations (if using supabase)
|
|
150
|
+
if [[ -d "supabase/migrations" ]]; then
|
|
151
|
+
local migration_count
|
|
152
|
+
migration_count=$(ls -1 supabase/migrations/*.sql 2>/dev/null | wc -l || echo "0")
|
|
153
|
+
log_info "Local migrations: $migration_count files"
|
|
154
|
+
fi
|
|
155
|
+
|
|
156
|
+
# Test 4: Connection pool health
|
|
157
|
+
local idle_connections
|
|
158
|
+
idle_connections=$(psql "$DB_URL" -t -A -c "SELECT count(*) FROM pg_stat_activity WHERE state = 'idle'")
|
|
159
|
+
if [[ "$idle_connections" -lt 50 ]]; then
|
|
160
|
+
log_success "Connection pool healthy: $idle_connections idle connections"
|
|
161
|
+
else
|
|
162
|
+
log_warning "High idle connections: $idle_connections (consider reviewing)"
|
|
163
|
+
fi
|
|
164
|
+
|
|
165
|
+
log_success "Smoke tests completed"
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
run_schema_audit() {
|
|
169
|
+
log_info "Running schema audit..."
|
|
170
|
+
|
|
171
|
+
psql "$DB_URL" << 'SQL'
|
|
172
|
+
\echo ''
|
|
173
|
+
\echo '=== SCHEMA AUDIT REPORT ==='
|
|
174
|
+
\echo ''
|
|
175
|
+
|
|
176
|
+
-- Tables without primary key
|
|
177
|
+
\echo '--- Tables without PRIMARY KEY ---'
|
|
178
|
+
SELECT tablename
|
|
179
|
+
FROM pg_tables t
|
|
180
|
+
WHERE schemaname = 'public'
|
|
181
|
+
AND NOT EXISTS (
|
|
182
|
+
SELECT 1 FROM pg_constraint c
|
|
183
|
+
WHERE c.conrelid = (schemaname || '.' || tablename)::regclass
|
|
184
|
+
AND c.contype = 'p'
|
|
185
|
+
);
|
|
186
|
+
|
|
187
|
+
-- Tables without RLS
|
|
188
|
+
\echo ''
|
|
189
|
+
\echo '--- Tables without RLS ---'
|
|
190
|
+
SELECT tablename,
|
|
191
|
+
CASE WHEN rowsecurity THEN '✓ Enabled' ELSE '✗ DISABLED' END as rls_status
|
|
192
|
+
FROM pg_tables
|
|
193
|
+
WHERE schemaname = 'public'
|
|
194
|
+
ORDER BY rowsecurity, tablename;
|
|
195
|
+
|
|
196
|
+
-- Columns without NOT NULL that probably should have it
|
|
197
|
+
\echo ''
|
|
198
|
+
\echo '--- Nullable columns (potential issues) ---'
|
|
199
|
+
SELECT table_name, column_name, data_type
|
|
200
|
+
FROM information_schema.columns
|
|
201
|
+
WHERE table_schema = 'public'
|
|
202
|
+
AND is_nullable = 'YES'
|
|
203
|
+
AND column_name IN ('id', 'created_at', 'updated_at', 'user_id')
|
|
204
|
+
ORDER BY table_name, column_name;
|
|
205
|
+
|
|
206
|
+
-- Indexes
|
|
207
|
+
\echo ''
|
|
208
|
+
\echo '--- Index coverage ---'
|
|
209
|
+
SELECT
|
|
210
|
+
t.tablename,
|
|
211
|
+
count(i.indexname) as index_count
|
|
212
|
+
FROM pg_tables t
|
|
213
|
+
LEFT JOIN pg_indexes i ON t.tablename = i.tablename AND t.schemaname = i.schemaname
|
|
214
|
+
WHERE t.schemaname = 'public'
|
|
215
|
+
GROUP BY t.tablename
|
|
216
|
+
ORDER BY index_count, t.tablename;
|
|
217
|
+
|
|
218
|
+
\echo ''
|
|
219
|
+
\echo '=== END OF AUDIT ==='
|
|
220
|
+
SQL
|
|
221
|
+
|
|
222
|
+
log_success "Schema audit completed"
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
run_security_audit() {
|
|
226
|
+
log_info "Running security audit..."
|
|
227
|
+
|
|
228
|
+
psql "$DB_URL" << 'SQL'
|
|
229
|
+
\echo ''
|
|
230
|
+
\echo '=== SECURITY AUDIT REPORT ==='
|
|
231
|
+
\echo ''
|
|
232
|
+
|
|
233
|
+
-- RLS policies
|
|
234
|
+
\echo '--- RLS Policies by Table ---'
|
|
235
|
+
SELECT
|
|
236
|
+
schemaname || '.' || tablename as table_name,
|
|
237
|
+
policyname,
|
|
238
|
+
permissive,
|
|
239
|
+
roles,
|
|
240
|
+
cmd
|
|
241
|
+
FROM pg_policies
|
|
242
|
+
WHERE schemaname = 'public'
|
|
243
|
+
ORDER BY tablename, policyname;
|
|
244
|
+
|
|
245
|
+
-- Public functions
|
|
246
|
+
\echo ''
|
|
247
|
+
\echo '--- Public Functions (review for security) ---'
|
|
248
|
+
SELECT
|
|
249
|
+
routine_name,
|
|
250
|
+
routine_type,
|
|
251
|
+
security_type
|
|
252
|
+
FROM information_schema.routines
|
|
253
|
+
WHERE routine_schema = 'public'
|
|
254
|
+
ORDER BY routine_name;
|
|
255
|
+
|
|
256
|
+
-- Grants on public schema
|
|
257
|
+
\echo ''
|
|
258
|
+
\echo '--- Grants on public schema ---'
|
|
259
|
+
SELECT grantee, privilege_type
|
|
260
|
+
FROM information_schema.table_privileges
|
|
261
|
+
WHERE table_schema = 'public'
|
|
262
|
+
GROUP BY grantee, privilege_type
|
|
263
|
+
ORDER BY grantee;
|
|
264
|
+
|
|
265
|
+
\echo ''
|
|
266
|
+
\echo '=== END OF SECURITY AUDIT ==='
|
|
267
|
+
SQL
|
|
268
|
+
|
|
269
|
+
log_success "Security audit completed"
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
# Parse arguments
|
|
273
|
+
while [[ $# -gt 0 ]]; do
|
|
274
|
+
case $1 in
|
|
275
|
+
--quick) MODE="quick"; shift ;;
|
|
276
|
+
--full) MODE="full"; shift ;;
|
|
277
|
+
--smoke-test) MODE="smoke"; shift ;;
|
|
278
|
+
--schema-audit) MODE="schema"; shift ;;
|
|
279
|
+
--security-audit) MODE="security"; shift ;;
|
|
280
|
+
-v|--verbose) VERBOSE=true; shift ;;
|
|
281
|
+
-h|--help) usage; exit 0 ;;
|
|
282
|
+
*) echo "Unknown option: $1"; usage; exit 1 ;;
|
|
283
|
+
esac
|
|
284
|
+
done
|
|
285
|
+
|
|
286
|
+
# Main execution
|
|
287
|
+
echo ""
|
|
288
|
+
echo "================================================"
|
|
289
|
+
echo " DB-OPS Health Checker"
|
|
290
|
+
echo " Mode: $MODE"
|
|
291
|
+
echo "================================================"
|
|
292
|
+
echo ""
|
|
293
|
+
|
|
294
|
+
check_env
|
|
295
|
+
check_client_tools
|
|
296
|
+
check_connection || exit 1
|
|
297
|
+
|
|
298
|
+
case $MODE in
|
|
299
|
+
quick)
|
|
300
|
+
check_ssl
|
|
301
|
+
check_pooler
|
|
302
|
+
get_db_stats
|
|
303
|
+
;;
|
|
304
|
+
full)
|
|
305
|
+
check_ssl
|
|
306
|
+
check_pooler
|
|
307
|
+
get_db_stats
|
|
308
|
+
run_smoke_tests
|
|
309
|
+
run_schema_audit
|
|
310
|
+
;;
|
|
311
|
+
smoke)
|
|
312
|
+
run_smoke_tests
|
|
313
|
+
;;
|
|
314
|
+
schema)
|
|
315
|
+
run_schema_audit
|
|
316
|
+
;;
|
|
317
|
+
security)
|
|
318
|
+
run_security_audit
|
|
319
|
+
;;
|
|
320
|
+
esac
|
|
321
|
+
|
|
322
|
+
echo ""
|
|
323
|
+
log_success "Health check completed"
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# =============================================================================
|
|
3
|
+
# migration-runner.sh - Safe Migration Execution (Hybrid Script)
|
|
4
|
+
# =============================================================================
|
|
5
|
+
# execution_type: Hybrid (Worker executes, Human confirms for production)
|
|
6
|
+
# pattern: EXEC-HY-001
|
|
7
|
+
# tasks: db-apply-migration, db-dry-run, db-verify-order
|
|
8
|
+
# token_savings: 91%
|
|
9
|
+
# =============================================================================
|
|
10
|
+
|
|
11
|
+
set -euo pipefail
|
|
12
|
+
|
|
13
|
+
# Colors
|
|
14
|
+
RED='\033[0;31m'
|
|
15
|
+
GREEN='\033[0;32m'
|
|
16
|
+
YELLOW='\033[1;33m'
|
|
17
|
+
BLUE='\033[0;34m'
|
|
18
|
+
NC='\033[0m'
|
|
19
|
+
|
|
20
|
+
# Defaults
|
|
21
|
+
DRY_RUN=false
|
|
22
|
+
VERIFY_ORDER=false
|
|
23
|
+
CREATE_SNAPSHOT=true
|
|
24
|
+
LOCK_KEY="dbops_migration_$(date +%s)"
|
|
25
|
+
DB_URL=""
|
|
26
|
+
|
|
27
|
+
usage() {
|
|
28
|
+
cat << EOF
|
|
29
|
+
Usage: $(basename "$0") [OPTIONS] <migration_file>
|
|
30
|
+
|
|
31
|
+
Safely execute database migrations with locks and snapshots.
|
|
32
|
+
|
|
33
|
+
OPTIONS:
|
|
34
|
+
--dry-run Execute in BEGIN/ROLLBACK (test mode)
|
|
35
|
+
--verify-order Only verify DDL ordering, don't execute
|
|
36
|
+
--no-snapshot Skip pre-migration snapshot
|
|
37
|
+
--force Skip confirmation prompts
|
|
38
|
+
-h, --help Show this help
|
|
39
|
+
|
|
40
|
+
EXAMPLES:
|
|
41
|
+
$(basename "$0") supabase/migrations/001_create_users.sql
|
|
42
|
+
$(basename "$0") supabase/migrations/002_add_rls.sql --dry-run
|
|
43
|
+
$(basename "$0") supabase/migrations/003_indexes.sql --verify-order
|
|
44
|
+
|
|
45
|
+
SAFETY FEATURES:
|
|
46
|
+
• Advisory lock prevents concurrent migrations
|
|
47
|
+
• Pre-migration snapshot for rollback
|
|
48
|
+
• Dry-run mode for testing
|
|
49
|
+
• DDL ordering verification
|
|
50
|
+
|
|
51
|
+
ENVIRONMENT:
|
|
52
|
+
SUPABASE_DB_URL or DATABASE_URL Required. PostgreSQL connection string.
|
|
53
|
+
EOF
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
log_info() { echo -e "${BLUE}ℹ${NC} $1"; }
|
|
57
|
+
log_success() { echo -e "${GREEN}✓${NC} $1"; }
|
|
58
|
+
log_warning() { echo -e "${YELLOW}⚠${NC} $1"; }
|
|
59
|
+
log_error() { echo -e "${RED}✗${NC} $1"; }
|
|
60
|
+
|
|
61
|
+
check_env() {
|
|
62
|
+
DB_URL="${SUPABASE_DB_URL:-${DATABASE_URL:-}}"
|
|
63
|
+
if [[ -z "$DB_URL" ]]; then
|
|
64
|
+
log_error "SUPABASE_DB_URL or DATABASE_URL not set"
|
|
65
|
+
exit 1
|
|
66
|
+
fi
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
acquire_lock() {
|
|
70
|
+
log_info "Acquiring migration lock..."
|
|
71
|
+
|
|
72
|
+
local got_lock
|
|
73
|
+
got_lock=$(psql "$DB_URL" -t -A -c "SELECT pg_try_advisory_lock(hashtext('$LOCK_KEY'))")
|
|
74
|
+
|
|
75
|
+
if [[ "$got_lock" == "t" ]]; then
|
|
76
|
+
log_success "Migration lock acquired"
|
|
77
|
+
return 0
|
|
78
|
+
else
|
|
79
|
+
log_error "Another migration is running. Wait or check for stale locks."
|
|
80
|
+
return 1
|
|
81
|
+
fi
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
release_lock() {
|
|
85
|
+
log_info "Releasing migration lock..."
|
|
86
|
+
psql "$DB_URL" -c "SELECT pg_advisory_unlock(hashtext('$LOCK_KEY'))" > /dev/null 2>&1 || true
|
|
87
|
+
log_success "Lock released"
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
# Trap to ensure lock is released
|
|
91
|
+
cleanup() {
|
|
92
|
+
release_lock
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
verify_ddl_order() {
|
|
96
|
+
local file="$1"
|
|
97
|
+
|
|
98
|
+
log_info "Verifying DDL ordering..."
|
|
99
|
+
|
|
100
|
+
# Extract DDL statements
|
|
101
|
+
local sql
|
|
102
|
+
sql=$(cat "$file")
|
|
103
|
+
|
|
104
|
+
# Check for common ordering issues
|
|
105
|
+
local issues=0
|
|
106
|
+
|
|
107
|
+
# Issue 1: DROP before CREATE of same object
|
|
108
|
+
if grep -qE "DROP TABLE.*IF EXISTS.*(\w+)" "$file"; then
|
|
109
|
+
local dropped_tables
|
|
110
|
+
dropped_tables=$(grep -oE "DROP TABLE.*IF EXISTS.*(\w+)" "$file" | grep -oE "\w+$")
|
|
111
|
+
|
|
112
|
+
for table in $dropped_tables; do
|
|
113
|
+
if grep -qE "CREATE TABLE.*$table" "$file"; then
|
|
114
|
+
# Check order
|
|
115
|
+
local drop_line create_line
|
|
116
|
+
drop_line=$(grep -n "DROP TABLE.*$table" "$file" | head -1 | cut -d: -f1)
|
|
117
|
+
create_line=$(grep -n "CREATE TABLE.*$table" "$file" | head -1 | cut -d: -f1)
|
|
118
|
+
|
|
119
|
+
if [[ -n "$create_line" && "$drop_line" -gt "$create_line" ]]; then
|
|
120
|
+
log_error "DROP TABLE $table appears after CREATE TABLE"
|
|
121
|
+
((issues++))
|
|
122
|
+
fi
|
|
123
|
+
fi
|
|
124
|
+
done
|
|
125
|
+
fi
|
|
126
|
+
|
|
127
|
+
# Issue 2: Foreign key references table created later
|
|
128
|
+
if grep -qiE "REFERENCES\s+(\w+)" "$file"; then
|
|
129
|
+
log_info "Checking foreign key references..."
|
|
130
|
+
# This is a simplified check - full verification would need proper SQL parsing
|
|
131
|
+
fi
|
|
132
|
+
|
|
133
|
+
# Issue 3: Index on table that doesn't exist yet
|
|
134
|
+
if grep -qiE "CREATE INDEX.*ON\s+(\w+)" "$file"; then
|
|
135
|
+
log_info "Checking index targets..."
|
|
136
|
+
fi
|
|
137
|
+
|
|
138
|
+
if [[ $issues -eq 0 ]]; then
|
|
139
|
+
log_success "DDL ordering verified - no issues found"
|
|
140
|
+
return 0
|
|
141
|
+
else
|
|
142
|
+
log_error "Found $issues ordering issues"
|
|
143
|
+
return 1
|
|
144
|
+
fi
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
run_dry_run() {
|
|
148
|
+
local file="$1"
|
|
149
|
+
|
|
150
|
+
log_info "Running dry-run (BEGIN/ROLLBACK)..."
|
|
151
|
+
|
|
152
|
+
local sql
|
|
153
|
+
sql=$(cat "$file")
|
|
154
|
+
|
|
155
|
+
local start_time end_time duration
|
|
156
|
+
|
|
157
|
+
start_time=$(date +%s.%N)
|
|
158
|
+
|
|
159
|
+
# Execute in transaction that rolls back
|
|
160
|
+
if psql "$DB_URL" -v ON_ERROR_STOP=1 << EOF
|
|
161
|
+
BEGIN;
|
|
162
|
+
$sql
|
|
163
|
+
ROLLBACK;
|
|
164
|
+
EOF
|
|
165
|
+
then
|
|
166
|
+
end_time=$(date +%s.%N)
|
|
167
|
+
duration=$(echo "$end_time - $start_time" | bc)
|
|
168
|
+
|
|
169
|
+
log_success "Dry-run completed in ${duration}s"
|
|
170
|
+
log_info "No changes were made (rolled back)"
|
|
171
|
+
return 0
|
|
172
|
+
else
|
|
173
|
+
log_error "Dry-run failed - migration has errors"
|
|
174
|
+
return 1
|
|
175
|
+
fi
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
apply_migration() {
|
|
179
|
+
local file="$1"
|
|
180
|
+
|
|
181
|
+
# Create pre-migration snapshot
|
|
182
|
+
if $CREATE_SNAPSHOT; then
|
|
183
|
+
log_info "Creating pre-migration snapshot..."
|
|
184
|
+
local script_dir
|
|
185
|
+
script_dir="$(dirname "$0")"
|
|
186
|
+
if [[ -x "$script_dir/backup-manager.sh" ]]; then
|
|
187
|
+
"$script_dir/backup-manager.sh" --snapshot "pre_migration_$(basename "$file" .sql)" --schema-only
|
|
188
|
+
else
|
|
189
|
+
log_warning "backup-manager.sh not found, skipping snapshot"
|
|
190
|
+
fi
|
|
191
|
+
fi
|
|
192
|
+
|
|
193
|
+
log_info "Applying migration: $file"
|
|
194
|
+
|
|
195
|
+
local sql
|
|
196
|
+
sql=$(cat "$file")
|
|
197
|
+
|
|
198
|
+
local start_time end_time duration
|
|
199
|
+
|
|
200
|
+
start_time=$(date +%s.%N)
|
|
201
|
+
|
|
202
|
+
# Execute
|
|
203
|
+
if psql "$DB_URL" -v ON_ERROR_STOP=1 << EOF
|
|
204
|
+
BEGIN;
|
|
205
|
+
$sql
|
|
206
|
+
COMMIT;
|
|
207
|
+
EOF
|
|
208
|
+
then
|
|
209
|
+
end_time=$(date +%s.%N)
|
|
210
|
+
duration=$(echo "$end_time - $start_time" | bc)
|
|
211
|
+
|
|
212
|
+
log_success "Migration applied in ${duration}s"
|
|
213
|
+
return 0
|
|
214
|
+
else
|
|
215
|
+
log_error "Migration failed"
|
|
216
|
+
log_info "Database was not modified (transaction rolled back)"
|
|
217
|
+
return 1
|
|
218
|
+
fi
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
# Parse arguments
|
|
222
|
+
MIGRATION_FILE=""
|
|
223
|
+
FORCE=false
|
|
224
|
+
|
|
225
|
+
while [[ $# -gt 0 ]]; do
|
|
226
|
+
case $1 in
|
|
227
|
+
--dry-run) DRY_RUN=true; shift ;;
|
|
228
|
+
--verify-order) VERIFY_ORDER=true; shift ;;
|
|
229
|
+
--no-snapshot) CREATE_SNAPSHOT=false; shift ;;
|
|
230
|
+
--force) FORCE=true; shift ;;
|
|
231
|
+
-h|--help) usage; exit 0 ;;
|
|
232
|
+
*)
|
|
233
|
+
MIGRATION_FILE="$1"
|
|
234
|
+
shift
|
|
235
|
+
;;
|
|
236
|
+
esac
|
|
237
|
+
done
|
|
238
|
+
|
|
239
|
+
if [[ -z "$MIGRATION_FILE" ]]; then
|
|
240
|
+
usage
|
|
241
|
+
exit 1
|
|
242
|
+
fi
|
|
243
|
+
|
|
244
|
+
if [[ ! -f "$MIGRATION_FILE" ]]; then
|
|
245
|
+
log_error "File not found: $MIGRATION_FILE"
|
|
246
|
+
exit 1
|
|
247
|
+
fi
|
|
248
|
+
|
|
249
|
+
check_env
|
|
250
|
+
|
|
251
|
+
echo ""
|
|
252
|
+
echo "================================================"
|
|
253
|
+
echo " DB-OPS Migration Runner"
|
|
254
|
+
echo " File: $MIGRATION_FILE"
|
|
255
|
+
echo " Mode: $(if $DRY_RUN; then echo "DRY-RUN"; elif $VERIFY_ORDER; then echo "VERIFY-ORDER"; else echo "APPLY"; fi)"
|
|
256
|
+
echo "================================================"
|
|
257
|
+
echo ""
|
|
258
|
+
|
|
259
|
+
log_info "File: $MIGRATION_FILE"
|
|
260
|
+
log_info "Size: $(du -h "$MIGRATION_FILE" | cut -f1)"
|
|
261
|
+
log_info "Lines: $(wc -l < "$MIGRATION_FILE")"
|
|
262
|
+
echo ""
|
|
263
|
+
|
|
264
|
+
# Always verify order first
|
|
265
|
+
if ! verify_ddl_order "$MIGRATION_FILE"; then
|
|
266
|
+
if ! $FORCE; then
|
|
267
|
+
log_error "Fix ordering issues before proceeding"
|
|
268
|
+
exit 1
|
|
269
|
+
fi
|
|
270
|
+
log_warning "Proceeding despite ordering issues (--force)"
|
|
271
|
+
fi
|
|
272
|
+
|
|
273
|
+
if $VERIFY_ORDER; then
|
|
274
|
+
log_success "Verification complete"
|
|
275
|
+
exit 0
|
|
276
|
+
fi
|
|
277
|
+
|
|
278
|
+
# Acquire lock
|
|
279
|
+
trap cleanup EXIT
|
|
280
|
+
if ! acquire_lock; then
|
|
281
|
+
exit 1
|
|
282
|
+
fi
|
|
283
|
+
|
|
284
|
+
echo ""
|
|
285
|
+
|
|
286
|
+
if $DRY_RUN; then
|
|
287
|
+
run_dry_run "$MIGRATION_FILE"
|
|
288
|
+
else
|
|
289
|
+
# Show warning for production
|
|
290
|
+
if ! $FORCE; then
|
|
291
|
+
log_warning "╔════════════════════════════════════════════════════════════╗"
|
|
292
|
+
log_warning "║ ⚠️ PRODUCTION MIGRATION WARNING ⚠️ ║"
|
|
293
|
+
log_warning "╠════════════════════════════════════════════════════════════╣"
|
|
294
|
+
log_warning "║ This will modify the database schema. ║"
|
|
295
|
+
log_warning "║ ║"
|
|
296
|
+
log_warning "║ Recommended: Run --dry-run first ║"
|
|
297
|
+
log_warning "╚════════════════════════════════════════════════════════════╝"
|
|
298
|
+
echo ""
|
|
299
|
+
log_info "Use --force to skip this warning"
|
|
300
|
+
log_info "Or run: $(basename "$0") $MIGRATION_FILE --dry-run"
|
|
301
|
+
exit 0
|
|
302
|
+
fi
|
|
303
|
+
|
|
304
|
+
apply_migration "$MIGRATION_FILE"
|
|
305
|
+
fi
|
|
306
|
+
|
|
307
|
+
echo ""
|
|
308
|
+
log_info "Run health check: ./scripts/db-ops/health-checker.sh --smoke-test"
|