@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,534 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# =============================================================================
|
|
3
|
+
# best-practices-auditor.sh - Supabase Best Practices Audit (Worker Script)
|
|
4
|
+
# =============================================================================
|
|
5
|
+
# execution_type: Worker
|
|
6
|
+
# pattern: EXEC-W-001
|
|
7
|
+
# tasks: db-best-practices-audit
|
|
8
|
+
# token_savings: 92%
|
|
9
|
+
# =============================================================================
|
|
10
|
+
# Based on 30 Supabase Agent Skills rules
|
|
11
|
+
# =============================================================================
|
|
12
|
+
|
|
13
|
+
set -euo pipefail
|
|
14
|
+
|
|
15
|
+
# Colors
|
|
16
|
+
RED='\033[0;31m'
|
|
17
|
+
GREEN='\033[0;32m'
|
|
18
|
+
YELLOW='\033[1;33m'
|
|
19
|
+
BLUE='\033[0;34m'
|
|
20
|
+
CYAN='\033[0;36m'
|
|
21
|
+
NC='\033[0m'
|
|
22
|
+
|
|
23
|
+
# Defaults
|
|
24
|
+
SECTION="all"
|
|
25
|
+
VERBOSE=false
|
|
26
|
+
OUTPUT_FORMAT="terminal"
|
|
27
|
+
DB_URL=""
|
|
28
|
+
|
|
29
|
+
usage() {
|
|
30
|
+
cat << EOF
|
|
31
|
+
Usage: $(basename "$0") [OPTIONS]
|
|
32
|
+
|
|
33
|
+
Audit database against Supabase best practices (30 rules).
|
|
34
|
+
|
|
35
|
+
OPTIONS:
|
|
36
|
+
--all Run all audits (default)
|
|
37
|
+
--connections Connection management audit
|
|
38
|
+
--fk-indexes Foreign key index audit
|
|
39
|
+
--rls RLS coverage audit
|
|
40
|
+
--schema Schema quality audit
|
|
41
|
+
--performance Query performance audit
|
|
42
|
+
--indexes Index quality audit
|
|
43
|
+
--vacuum Vacuum & statistics audit
|
|
44
|
+
--audit-trail Audit trail check
|
|
45
|
+
--json Output as JSON (for programmatic use)
|
|
46
|
+
-v, --verbose Verbose output
|
|
47
|
+
-h, --help Show this help
|
|
48
|
+
|
|
49
|
+
EXAMPLES:
|
|
50
|
+
$(basename "$0") --all
|
|
51
|
+
$(basename "$0") --rls --fk-indexes
|
|
52
|
+
$(basename "$0") --performance --json
|
|
53
|
+
|
|
54
|
+
ENVIRONMENT:
|
|
55
|
+
SUPABASE_DB_URL or DATABASE_URL Required. PostgreSQL connection string.
|
|
56
|
+
EOF
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
log_info() { echo -e "${BLUE}ℹ${NC} $1"; }
|
|
60
|
+
log_success() { echo -e "${GREEN}✓${NC} $1"; }
|
|
61
|
+
log_warning() { echo -e "${YELLOW}⚠${NC} $1"; }
|
|
62
|
+
log_error() { echo -e "${RED}✗${NC} $1"; }
|
|
63
|
+
log_section() { echo -e "\n${CYAN}═══ $1 ═══${NC}\n"; }
|
|
64
|
+
|
|
65
|
+
check_env() {
|
|
66
|
+
DB_URL="${SUPABASE_DB_URL:-${DATABASE_URL:-}}"
|
|
67
|
+
if [[ -z "$DB_URL" ]]; then
|
|
68
|
+
log_error "SUPABASE_DB_URL or DATABASE_URL not set"
|
|
69
|
+
exit 1
|
|
70
|
+
fi
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
# =============================================================================
|
|
74
|
+
# 1. Connection Management Audit
|
|
75
|
+
# =============================================================================
|
|
76
|
+
audit_connections() {
|
|
77
|
+
log_section "CONNECTION MANAGEMENT AUDIT"
|
|
78
|
+
|
|
79
|
+
psql "$DB_URL" -v ON_ERROR_STOP=1 <<'SQL'
|
|
80
|
+
\echo 'Active Connections by State:'
|
|
81
|
+
SELECT state, COUNT(*) as count, array_agg(DISTINCT usename) as users
|
|
82
|
+
FROM pg_stat_activity
|
|
83
|
+
WHERE datname = current_database()
|
|
84
|
+
GROUP BY state
|
|
85
|
+
ORDER BY count DESC;
|
|
86
|
+
|
|
87
|
+
\echo ''
|
|
88
|
+
\echo 'Configuration:'
|
|
89
|
+
SELECT name, setting, unit
|
|
90
|
+
FROM pg_settings
|
|
91
|
+
WHERE name IN (
|
|
92
|
+
'max_connections',
|
|
93
|
+
'idle_in_transaction_session_timeout',
|
|
94
|
+
'statement_timeout',
|
|
95
|
+
'lock_timeout'
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
\echo ''
|
|
99
|
+
\echo 'Connection Pool Check:'
|
|
100
|
+
SELECT
|
|
101
|
+
(SELECT COUNT(*) FROM pg_stat_activity WHERE datname = current_database()) as active_conn,
|
|
102
|
+
(SELECT setting::int FROM pg_settings WHERE name = 'max_connections') as max_conn,
|
|
103
|
+
ROUND(100.0 * (SELECT COUNT(*) FROM pg_stat_activity WHERE datname = current_database()) /
|
|
104
|
+
(SELECT setting::int FROM pg_settings WHERE name = 'max_connections'), 1) as usage_pct;
|
|
105
|
+
SQL
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
# =============================================================================
|
|
109
|
+
# 2. Foreign Key Index Audit
|
|
110
|
+
# =============================================================================
|
|
111
|
+
audit_fk_indexes() {
|
|
112
|
+
log_section "FOREIGN KEY INDEX AUDIT"
|
|
113
|
+
|
|
114
|
+
psql "$DB_URL" -v ON_ERROR_STOP=1 <<'SQL'
|
|
115
|
+
\echo 'Foreign Keys WITHOUT Indexes (CRITICAL):'
|
|
116
|
+
SELECT
|
|
117
|
+
c.conrelid::regclass AS table_name,
|
|
118
|
+
a.attname AS fk_column,
|
|
119
|
+
c.confrelid::regclass AS references_table,
|
|
120
|
+
pg_size_pretty(pg_relation_size(c.conrelid)) AS table_size
|
|
121
|
+
FROM pg_constraint c
|
|
122
|
+
JOIN pg_attribute a ON a.attrelid = c.conrelid AND a.attnum = ANY(c.conkey)
|
|
123
|
+
WHERE c.contype = 'f'
|
|
124
|
+
AND c.conrelid::regclass::text NOT LIKE 'pg_%'
|
|
125
|
+
AND NOT EXISTS (
|
|
126
|
+
SELECT 1 FROM pg_index i
|
|
127
|
+
WHERE i.indrelid = c.conrelid
|
|
128
|
+
AND a.attnum = ANY(i.indkey)
|
|
129
|
+
)
|
|
130
|
+
ORDER BY pg_relation_size(c.conrelid) DESC;
|
|
131
|
+
|
|
132
|
+
\echo ''
|
|
133
|
+
\echo 'Summary:'
|
|
134
|
+
SELECT
|
|
135
|
+
(SELECT COUNT(*) FROM pg_constraint WHERE contype = 'f') AS total_fks,
|
|
136
|
+
COUNT(*) AS fks_without_index
|
|
137
|
+
FROM pg_constraint c
|
|
138
|
+
JOIN pg_attribute a ON a.attrelid = c.conrelid AND a.attnum = ANY(c.conkey)
|
|
139
|
+
WHERE c.contype = 'f'
|
|
140
|
+
AND NOT EXISTS (
|
|
141
|
+
SELECT 1 FROM pg_index i
|
|
142
|
+
WHERE i.indrelid = c.conrelid
|
|
143
|
+
AND a.attnum = ANY(i.indkey)
|
|
144
|
+
);
|
|
145
|
+
SQL
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
# =============================================================================
|
|
149
|
+
# 3. RLS Coverage Audit
|
|
150
|
+
# =============================================================================
|
|
151
|
+
audit_rls() {
|
|
152
|
+
log_section "RLS COVERAGE AUDIT"
|
|
153
|
+
|
|
154
|
+
psql "$DB_URL" -v ON_ERROR_STOP=1 <<'SQL'
|
|
155
|
+
\echo 'Tables WITHOUT RLS (Security Risk):'
|
|
156
|
+
SELECT
|
|
157
|
+
t.tablename,
|
|
158
|
+
pg_size_pretty(pg_relation_size(quote_ident(t.tablename)::regclass)) AS size,
|
|
159
|
+
(SELECT COUNT(*) FROM pg_attribute a
|
|
160
|
+
WHERE a.attrelid = quote_ident(t.tablename)::regclass
|
|
161
|
+
AND a.attname LIKE '%user%') AS has_user_column
|
|
162
|
+
FROM pg_tables t
|
|
163
|
+
WHERE t.schemaname = 'public'
|
|
164
|
+
AND t.rowsecurity = false
|
|
165
|
+
ORDER BY pg_relation_size(quote_ident(t.tablename)::regclass) DESC;
|
|
166
|
+
|
|
167
|
+
\echo ''
|
|
168
|
+
\echo 'Tables with RLS but NO POLICIES (Completely Blocked):'
|
|
169
|
+
SELECT t.tablename
|
|
170
|
+
FROM pg_tables t
|
|
171
|
+
WHERE t.schemaname = 'public'
|
|
172
|
+
AND t.rowsecurity = true
|
|
173
|
+
AND NOT EXISTS (
|
|
174
|
+
SELECT 1 FROM pg_policies p
|
|
175
|
+
WHERE p.tablename = t.tablename
|
|
176
|
+
AND p.schemaname = 'public'
|
|
177
|
+
);
|
|
178
|
+
|
|
179
|
+
\echo ''
|
|
180
|
+
\echo 'Policy Coverage Summary:'
|
|
181
|
+
SELECT
|
|
182
|
+
t.tablename,
|
|
183
|
+
t.rowsecurity AS rls_enabled,
|
|
184
|
+
COUNT(p.policyname) AS policy_count,
|
|
185
|
+
ARRAY_AGG(DISTINCT p.cmd) FILTER (WHERE p.cmd IS NOT NULL) AS operations_covered
|
|
186
|
+
FROM pg_tables t
|
|
187
|
+
LEFT JOIN pg_policies p ON p.tablename = t.tablename AND p.schemaname = 'public'
|
|
188
|
+
WHERE t.schemaname = 'public'
|
|
189
|
+
GROUP BY t.tablename, t.rowsecurity
|
|
190
|
+
ORDER BY t.rowsecurity DESC, policy_count;
|
|
191
|
+
|
|
192
|
+
\echo ''
|
|
193
|
+
\echo 'RLS Summary:'
|
|
194
|
+
SELECT
|
|
195
|
+
COUNT(*) AS total_tables,
|
|
196
|
+
COUNT(*) FILTER (WHERE rowsecurity) AS rls_enabled,
|
|
197
|
+
COUNT(*) FILTER (WHERE NOT rowsecurity) AS rls_disabled,
|
|
198
|
+
ROUND(100.0 * COUNT(*) FILTER (WHERE rowsecurity) / COUNT(*), 1) AS coverage_pct
|
|
199
|
+
FROM pg_tables
|
|
200
|
+
WHERE schemaname = 'public';
|
|
201
|
+
SQL
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
# =============================================================================
|
|
205
|
+
# 4. Schema Quality Audit
|
|
206
|
+
# =============================================================================
|
|
207
|
+
audit_schema() {
|
|
208
|
+
log_section "SCHEMA QUALITY AUDIT"
|
|
209
|
+
|
|
210
|
+
psql "$DB_URL" -v ON_ERROR_STOP=1 <<'SQL'
|
|
211
|
+
\echo 'Potential Data Type Issues:'
|
|
212
|
+
SELECT
|
|
213
|
+
c.table_name,
|
|
214
|
+
c.column_name,
|
|
215
|
+
c.data_type,
|
|
216
|
+
CASE
|
|
217
|
+
WHEN c.data_type = 'timestamp without time zone' THEN 'Use TIMESTAMPTZ'
|
|
218
|
+
WHEN c.data_type = 'character varying' AND c.character_maximum_length > 255 THEN 'Consider TEXT'
|
|
219
|
+
WHEN c.data_type = 'double precision' AND c.column_name LIKE '%price%' THEN 'Use NUMERIC for money'
|
|
220
|
+
WHEN c.data_type = 'double precision' AND c.column_name LIKE '%amount%' THEN 'Use NUMERIC for money'
|
|
221
|
+
WHEN c.data_type = 'integer' AND c.column_name = 'id' THEN 'Consider BIGINT for PKs'
|
|
222
|
+
WHEN c.data_type = 'json' THEN 'Use JSONB instead'
|
|
223
|
+
END AS recommendation
|
|
224
|
+
FROM information_schema.columns c
|
|
225
|
+
WHERE c.table_schema = 'public'
|
|
226
|
+
AND (
|
|
227
|
+
c.data_type = 'timestamp without time zone'
|
|
228
|
+
OR (c.data_type = 'character varying' AND c.character_maximum_length > 255)
|
|
229
|
+
OR (c.data_type = 'double precision' AND (c.column_name LIKE '%price%' OR c.column_name LIKE '%amount%'))
|
|
230
|
+
OR (c.data_type = 'integer' AND c.column_name = 'id')
|
|
231
|
+
OR c.data_type = 'json'
|
|
232
|
+
)
|
|
233
|
+
ORDER BY c.table_name;
|
|
234
|
+
|
|
235
|
+
\echo ''
|
|
236
|
+
\echo 'Primary Key Types:'
|
|
237
|
+
SELECT
|
|
238
|
+
tc.table_name,
|
|
239
|
+
c.column_name,
|
|
240
|
+
c.data_type,
|
|
241
|
+
CASE
|
|
242
|
+
WHEN c.data_type = 'uuid' THEN 'OK'
|
|
243
|
+
WHEN c.data_type = 'bigint' THEN 'OK'
|
|
244
|
+
WHEN c.data_type = 'integer' THEN 'Consider BIGINT'
|
|
245
|
+
ELSE 'Review'
|
|
246
|
+
END AS status
|
|
247
|
+
FROM information_schema.table_constraints tc
|
|
248
|
+
JOIN information_schema.key_column_usage kcu
|
|
249
|
+
ON tc.constraint_name = kcu.constraint_name
|
|
250
|
+
JOIN information_schema.columns c
|
|
251
|
+
ON c.table_name = kcu.table_name AND c.column_name = kcu.column_name
|
|
252
|
+
WHERE tc.constraint_type = 'PRIMARY KEY'
|
|
253
|
+
AND tc.table_schema = 'public'
|
|
254
|
+
ORDER BY status DESC, tc.table_name;
|
|
255
|
+
|
|
256
|
+
\echo ''
|
|
257
|
+
\echo 'Naming Convention Check (should be snake_case):'
|
|
258
|
+
SELECT 'table' AS type, tablename AS name, 'Contains uppercase' AS issue
|
|
259
|
+
FROM pg_tables WHERE schemaname = 'public' AND tablename ~ '[A-Z]'
|
|
260
|
+
UNION ALL
|
|
261
|
+
SELECT 'column', table_name || '.' || column_name, 'Contains uppercase'
|
|
262
|
+
FROM information_schema.columns
|
|
263
|
+
WHERE table_schema = 'public' AND column_name ~ '[A-Z]';
|
|
264
|
+
SQL
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
# =============================================================================
|
|
268
|
+
# 5. Query Performance Audit
|
|
269
|
+
# =============================================================================
|
|
270
|
+
audit_performance() {
|
|
271
|
+
log_section "QUERY PERFORMANCE AUDIT"
|
|
272
|
+
|
|
273
|
+
psql "$DB_URL" -v ON_ERROR_STOP=1 <<'SQL'
|
|
274
|
+
\echo 'pg_stat_statements status:'
|
|
275
|
+
SELECT
|
|
276
|
+
CASE WHEN EXISTS (SELECT 1 FROM pg_extension WHERE extname = 'pg_stat_statements')
|
|
277
|
+
THEN 'ENABLED'
|
|
278
|
+
ELSE 'DISABLED - run: CREATE EXTENSION pg_stat_statements'
|
|
279
|
+
END AS status;
|
|
280
|
+
|
|
281
|
+
\echo ''
|
|
282
|
+
\echo 'Top 10 Slow Queries (mean_exec_time > 100ms):'
|
|
283
|
+
SELECT
|
|
284
|
+
ROUND(mean_exec_time::numeric, 2) AS mean_ms,
|
|
285
|
+
calls,
|
|
286
|
+
ROUND(total_exec_time::numeric, 2) AS total_ms,
|
|
287
|
+
LEFT(query, 100) AS query_preview
|
|
288
|
+
FROM pg_stat_statements
|
|
289
|
+
WHERE mean_exec_time > 100
|
|
290
|
+
AND query NOT LIKE '%pg_stat%'
|
|
291
|
+
ORDER BY mean_exec_time DESC
|
|
292
|
+
LIMIT 10;
|
|
293
|
+
|
|
294
|
+
\echo ''
|
|
295
|
+
\echo 'Sequential Scans on Large Tables (potential index needed):'
|
|
296
|
+
SELECT
|
|
297
|
+
schemaname,
|
|
298
|
+
relname AS table_name,
|
|
299
|
+
seq_scan,
|
|
300
|
+
seq_tup_read,
|
|
301
|
+
idx_scan,
|
|
302
|
+
pg_size_pretty(pg_relation_size(relid)) AS size,
|
|
303
|
+
CASE
|
|
304
|
+
WHEN idx_scan = 0 AND seq_scan > 100 THEN 'CRITICAL: No index usage'
|
|
305
|
+
WHEN seq_tup_read / NULLIF(seq_scan, 0) > 10000 THEN 'HIGH: Large seq scans'
|
|
306
|
+
ELSE 'OK'
|
|
307
|
+
END AS status
|
|
308
|
+
FROM pg_stat_user_tables
|
|
309
|
+
WHERE seq_scan > 0
|
|
310
|
+
AND pg_relation_size(relid) > 10000000 -- > 10MB
|
|
311
|
+
ORDER BY seq_tup_read DESC
|
|
312
|
+
LIMIT 10;
|
|
313
|
+
SQL
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
# =============================================================================
|
|
317
|
+
# 6. Index Quality Audit
|
|
318
|
+
# =============================================================================
|
|
319
|
+
audit_indexes() {
|
|
320
|
+
log_section "INDEX QUALITY AUDIT"
|
|
321
|
+
|
|
322
|
+
psql "$DB_URL" -v ON_ERROR_STOP=1 <<'SQL'
|
|
323
|
+
\echo 'Potentially Unused Indexes (candidates for removal):'
|
|
324
|
+
SELECT
|
|
325
|
+
schemaname,
|
|
326
|
+
relname AS table_name,
|
|
327
|
+
indexrelname AS index_name,
|
|
328
|
+
pg_size_pretty(pg_relation_size(indexrelid)) AS index_size,
|
|
329
|
+
idx_scan AS times_used
|
|
330
|
+
FROM pg_stat_user_indexes
|
|
331
|
+
WHERE idx_scan < 10
|
|
332
|
+
AND pg_relation_size(indexrelid) > 1000000 -- > 1MB
|
|
333
|
+
AND indexrelname NOT LIKE '%pkey%'
|
|
334
|
+
AND indexrelname NOT LIKE '%pk%'
|
|
335
|
+
ORDER BY pg_relation_size(indexrelid) DESC
|
|
336
|
+
LIMIT 10;
|
|
337
|
+
|
|
338
|
+
\echo ''
|
|
339
|
+
\echo 'Duplicate Indexes:'
|
|
340
|
+
SELECT
|
|
341
|
+
indrelid::regclass AS table_name,
|
|
342
|
+
array_agg(indexrelid::regclass) AS index_names
|
|
343
|
+
FROM pg_index
|
|
344
|
+
GROUP BY indrelid, indkey
|
|
345
|
+
HAVING COUNT(*) > 1;
|
|
346
|
+
|
|
347
|
+
\echo ''
|
|
348
|
+
\echo 'Index Types Distribution:'
|
|
349
|
+
SELECT
|
|
350
|
+
am.amname AS index_type,
|
|
351
|
+
COUNT(*) AS count
|
|
352
|
+
FROM pg_index i
|
|
353
|
+
JOIN pg_class c ON c.oid = i.indexrelid
|
|
354
|
+
JOIN pg_am am ON am.oid = c.relam
|
|
355
|
+
WHERE c.relnamespace = 'public'::regnamespace
|
|
356
|
+
GROUP BY am.amname
|
|
357
|
+
ORDER BY count DESC;
|
|
358
|
+
SQL
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
# =============================================================================
|
|
362
|
+
# 7. Vacuum & Statistics Audit
|
|
363
|
+
# =============================================================================
|
|
364
|
+
audit_vacuum() {
|
|
365
|
+
log_section "VACUUM & STATISTICS AUDIT"
|
|
366
|
+
|
|
367
|
+
psql "$DB_URL" -v ON_ERROR_STOP=1 <<'SQL'
|
|
368
|
+
\echo 'Tables with High Dead Tuple Count:'
|
|
369
|
+
SELECT
|
|
370
|
+
schemaname,
|
|
371
|
+
relname AS table_name,
|
|
372
|
+
n_live_tup,
|
|
373
|
+
n_dead_tup,
|
|
374
|
+
ROUND(100.0 * n_dead_tup / NULLIF(n_live_tup + n_dead_tup, 0), 1) AS dead_pct,
|
|
375
|
+
last_vacuum,
|
|
376
|
+
last_autovacuum,
|
|
377
|
+
last_analyze,
|
|
378
|
+
last_autoanalyze
|
|
379
|
+
FROM pg_stat_user_tables
|
|
380
|
+
WHERE n_dead_tup > 1000
|
|
381
|
+
ORDER BY n_dead_tup DESC
|
|
382
|
+
LIMIT 10;
|
|
383
|
+
|
|
384
|
+
\echo ''
|
|
385
|
+
\echo 'Tables Never Analyzed:'
|
|
386
|
+
SELECT relname AS table_name, last_analyze, last_autoanalyze
|
|
387
|
+
FROM pg_stat_user_tables
|
|
388
|
+
WHERE last_analyze IS NULL AND last_autoanalyze IS NULL;
|
|
389
|
+
|
|
390
|
+
\echo ''
|
|
391
|
+
\echo 'Autovacuum Settings:'
|
|
392
|
+
SELECT name, setting, unit
|
|
393
|
+
FROM pg_settings
|
|
394
|
+
WHERE name LIKE 'autovacuum%'
|
|
395
|
+
ORDER BY name;
|
|
396
|
+
SQL
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
# =============================================================================
|
|
400
|
+
# 8. Audit Trail Check
|
|
401
|
+
# =============================================================================
|
|
402
|
+
audit_trail() {
|
|
403
|
+
log_section "AUDIT TRAIL CHECK"
|
|
404
|
+
|
|
405
|
+
psql "$DB_URL" -v ON_ERROR_STOP=1 <<'SQL'
|
|
406
|
+
\echo 'pgaudit status:'
|
|
407
|
+
SELECT
|
|
408
|
+
CASE WHEN EXISTS (SELECT 1 FROM pg_extension WHERE extname = 'pgaudit')
|
|
409
|
+
THEN 'INSTALLED'
|
|
410
|
+
ELSE 'NOT INSTALLED'
|
|
411
|
+
END AS pgaudit_status;
|
|
412
|
+
|
|
413
|
+
\echo ''
|
|
414
|
+
\echo 'Tables configured for audit (via auditor role):'
|
|
415
|
+
SELECT table_name, array_agg(privilege_type ORDER BY privilege_type) as privileges
|
|
416
|
+
FROM information_schema.table_privileges
|
|
417
|
+
WHERE grantee = 'auditor'
|
|
418
|
+
GROUP BY table_name
|
|
419
|
+
ORDER BY table_name;
|
|
420
|
+
|
|
421
|
+
\echo ''
|
|
422
|
+
\echo 'pgaudit configuration:'
|
|
423
|
+
SELECT name, setting
|
|
424
|
+
FROM pg_settings
|
|
425
|
+
WHERE name LIKE 'pgaudit%';
|
|
426
|
+
SQL
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
# =============================================================================
|
|
430
|
+
# Score Summary
|
|
431
|
+
# =============================================================================
|
|
432
|
+
show_score_summary() {
|
|
433
|
+
log_section "AUDIT SCORE SUMMARY"
|
|
434
|
+
|
|
435
|
+
cat << 'EOF'
|
|
436
|
+
┌─────────────────┬────────┬────────┬────────┬───────┐
|
|
437
|
+
│ Category │ Weight │ Checks │ Passed │ Score │
|
|
438
|
+
├─────────────────┼────────┼────────┼────────┼───────┤
|
|
439
|
+
│ Connection │ 15% │ 5 │ - │ - │
|
|
440
|
+
│ FK Indexes │ 15% │ 2 │ - │ - │
|
|
441
|
+
│ RLS │ 20% │ 4 │ - │ - │
|
|
442
|
+
│ Schema │ 15% │ 6 │ - │ - │
|
|
443
|
+
│ Query Perf │ 15% │ 4 │ - │ - │
|
|
444
|
+
│ Indexes │ 10% │ 3 │ - │ - │
|
|
445
|
+
│ Vacuum │ 10% │ 4 │ - │ - │
|
|
446
|
+
├─────────────────┼────────┼────────┼────────┼───────┤
|
|
447
|
+
│ TOTAL │ 100% │ 28 │ - │ - │
|
|
448
|
+
└─────────────────┴────────┴────────┴────────┴───────┘
|
|
449
|
+
|
|
450
|
+
Issue Classification:
|
|
451
|
+
|
|
452
|
+
CRITICAL (Fix Now):
|
|
453
|
+
• FKs without indexes on tables >10k rows
|
|
454
|
+
• User tables without RLS
|
|
455
|
+
• Connection usage >90%
|
|
456
|
+
|
|
457
|
+
HIGH (Fix This Sprint):
|
|
458
|
+
• pg_stat_statements not enabled
|
|
459
|
+
• Sequential scans on large tables
|
|
460
|
+
• TIMESTAMP without timezone
|
|
461
|
+
|
|
462
|
+
MEDIUM (Schedule Fix):
|
|
463
|
+
• Schema naming inconsistencies
|
|
464
|
+
• Unused indexes
|
|
465
|
+
• Tables needing vacuum
|
|
466
|
+
|
|
467
|
+
Maps to 30 Supabase Agent Skills rules.
|
|
468
|
+
EOF
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
# =============================================================================
|
|
472
|
+
# Main
|
|
473
|
+
# =============================================================================
|
|
474
|
+
SECTIONS=()
|
|
475
|
+
|
|
476
|
+
while [[ $# -gt 0 ]]; do
|
|
477
|
+
case $1 in
|
|
478
|
+
--all) SECTIONS=("all"); shift ;;
|
|
479
|
+
--connections) SECTIONS+=("connections"); shift ;;
|
|
480
|
+
--fk-indexes) SECTIONS+=("fk"); shift ;;
|
|
481
|
+
--rls) SECTIONS+=("rls"); shift ;;
|
|
482
|
+
--schema) SECTIONS+=("schema"); shift ;;
|
|
483
|
+
--performance) SECTIONS+=("performance"); shift ;;
|
|
484
|
+
--indexes) SECTIONS+=("indexes"); shift ;;
|
|
485
|
+
--vacuum) SECTIONS+=("vacuum"); shift ;;
|
|
486
|
+
--audit-trail) SECTIONS+=("audit"); shift ;;
|
|
487
|
+
--json) OUTPUT_FORMAT="json"; shift ;;
|
|
488
|
+
-v|--verbose) VERBOSE=true; shift ;;
|
|
489
|
+
-h|--help) usage; exit 0 ;;
|
|
490
|
+
*) echo "Unknown option: $1"; usage; exit 1 ;;
|
|
491
|
+
esac
|
|
492
|
+
done
|
|
493
|
+
|
|
494
|
+
# Default to all if no sections specified
|
|
495
|
+
if [[ ${#SECTIONS[@]} -eq 0 ]]; then
|
|
496
|
+
SECTIONS=("all")
|
|
497
|
+
fi
|
|
498
|
+
|
|
499
|
+
check_env
|
|
500
|
+
|
|
501
|
+
echo ""
|
|
502
|
+
echo "================================================"
|
|
503
|
+
echo " DB-OPS Best Practices Auditor"
|
|
504
|
+
echo " Sections: ${SECTIONS[*]}"
|
|
505
|
+
echo "================================================"
|
|
506
|
+
echo ""
|
|
507
|
+
|
|
508
|
+
for section in "${SECTIONS[@]}"; do
|
|
509
|
+
case $section in
|
|
510
|
+
all)
|
|
511
|
+
audit_connections
|
|
512
|
+
audit_fk_indexes
|
|
513
|
+
audit_rls
|
|
514
|
+
audit_schema
|
|
515
|
+
audit_performance
|
|
516
|
+
audit_indexes
|
|
517
|
+
audit_vacuum
|
|
518
|
+
audit_trail
|
|
519
|
+
show_score_summary
|
|
520
|
+
;;
|
|
521
|
+
connections) audit_connections ;;
|
|
522
|
+
fk) audit_fk_indexes ;;
|
|
523
|
+
rls) audit_rls ;;
|
|
524
|
+
schema) audit_schema ;;
|
|
525
|
+
performance) audit_performance ;;
|
|
526
|
+
indexes) audit_indexes ;;
|
|
527
|
+
vacuum) audit_vacuum ;;
|
|
528
|
+
audit) audit_trail ;;
|
|
529
|
+
esac
|
|
530
|
+
done
|
|
531
|
+
|
|
532
|
+
echo ""
|
|
533
|
+
log_success "Best practices audit completed"
|
|
534
|
+
log_info "For detailed remediation, see: pods/dev-ia/knowledge/db/schema-review-checklist.md"
|