@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,219 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
/**
|
|
4
|
+
* veto-checks.test.cjs — suíte da 6ª forma de veto `command_check` + `json_schema_valid`
|
|
5
|
+
* com `extract` (Story SF7.2, ADR-011). Prova:
|
|
6
|
+
* (AC5) os 4 casos motivadores, cada um com prova POSITIVA e NEGATIVA sobre artefato
|
|
7
|
+
* realista: (a) render-gate (headless, fail-loud se ausente), (b) lexical anti-IA
|
|
8
|
+
* (Node puro), (c) json_schema_valid+extract (N8N — não command_check), (d) HTML.
|
|
9
|
+
* (AC12) modelo de ameaça: runner/validador executam SÓ scripts blessed sob
|
|
10
|
+
* scripts/veto-checks/ — traversal / fora-da-whitelist / args interpoláveis = recusa.
|
|
11
|
+
* (AC2) evalVeto executa via execFileSync sem shell, exit code como veredito; caminho extract.
|
|
12
|
+
* (AC3) sweep de command_check por fixture de violação; ausente = underivável fail-loud.
|
|
13
|
+
* (AC4) serializeAssertion emite args (lista) e extract (mapa) e faz roundtrip por parseYaml.
|
|
14
|
+
*
|
|
15
|
+
* Node >= 18. Exit 0/1.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
const fs = require('node:fs');
|
|
19
|
+
const os = require('node:os');
|
|
20
|
+
const path = require('node:path');
|
|
21
|
+
|
|
22
|
+
const rp = require('./pc-run-pod.cjs');
|
|
23
|
+
const vp = require('./validate-pod-workflow.cjs');
|
|
24
|
+
const fg = require('./forge-generate.cjs');
|
|
25
|
+
const smoke = require('./smoke-pod-workflow.cjs');
|
|
26
|
+
const lexical = require('./veto-checks/lexical-check.cjs');
|
|
27
|
+
const html = require('./veto-checks/html-valid.cjs');
|
|
28
|
+
const render = require('./veto-checks/render-gate.cjs');
|
|
29
|
+
|
|
30
|
+
const REPO_ROOT = path.resolve(__dirname, '..');
|
|
31
|
+
const FIX = path.join(__dirname, '__fixtures__', 'veto-checks');
|
|
32
|
+
|
|
33
|
+
let passed = 0;
|
|
34
|
+
const failures = [];
|
|
35
|
+
function ok(cond, label) {
|
|
36
|
+
if (cond) { passed++; console.log(`[OK ] ${label}`); }
|
|
37
|
+
else { failures.push(label); console.error(`[FALHA] ${label}`); }
|
|
38
|
+
}
|
|
39
|
+
function throwsFail(fn) {
|
|
40
|
+
try { fn(); return false; } catch (e) { if (e instanceof vp.Fail) return true; throw e; }
|
|
41
|
+
}
|
|
42
|
+
const ctx = { podRoot: FIX, runDir: FIX };
|
|
43
|
+
const cc = (command, args, artifact) => rp.evalVeto(
|
|
44
|
+
{ type: 'command_check', command, args }, '', path.join(FIX, artifact), ctx,
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
// ===========================================================================
|
|
48
|
+
// (b) lexical anti-IA — Node puro (AC5b)
|
|
49
|
+
// ===========================================================================
|
|
50
|
+
console.log('--- (b) lexical anti-IA ---');
|
|
51
|
+
ok(lexical.countMatches('a — b – c', '[\\u2014\\u2013]') === 2, 'countMatches conta em/en-dash');
|
|
52
|
+
ok(cc('lexical-check.cjs', ['--max', '0'], 'copy-clean.md').ok === true, 'lexical: copy limpa PASSA');
|
|
53
|
+
ok(cc('lexical-check.cjs', ['--max', '0'], 'copy-dashes.md').ok === false, 'lexical: copy com travessões BLOQUEIA');
|
|
54
|
+
|
|
55
|
+
// ===========================================================================
|
|
56
|
+
// (d) HTML balance + tag exigida — Node puro (AC5d)
|
|
57
|
+
// ===========================================================================
|
|
58
|
+
console.log('--- (d) HTML válido ---');
|
|
59
|
+
ok(html.checkBalance('<div><p>x</p></div>').ok === true, 'checkBalance: balanceado OK');
|
|
60
|
+
ok(html.checkBalance('<div><p>x</div>').ok === false, 'checkBalance: desbalanceado detecta');
|
|
61
|
+
ok(cc('html-valid.cjs', ['--require', 'title'], 'slide-ok.html').ok === true, 'html: slide-ok (balanceado + title) PASSA');
|
|
62
|
+
ok(cc('html-valid.cjs', [], 'page-bad.html').ok === false, 'html: page-bad (desbalanceado) BLOQUEIA');
|
|
63
|
+
|
|
64
|
+
// ===========================================================================
|
|
65
|
+
// (c) json_schema_valid + extract — N8N, IN-PROCESS (AC5c; fecha CONCERNS-1 SF6.3)
|
|
66
|
+
// ===========================================================================
|
|
67
|
+
console.log('--- (c) json_schema_valid + extract (N8N) ---');
|
|
68
|
+
const n8nAssert = { type: 'json_schema_valid', schema: 'nodes,connections', extract: { section: '## Workflow JSON', fence: 'json' } };
|
|
69
|
+
const n8nOk = fs.readFileSync(path.join(FIX, 'n8n-ok.md'), 'utf8');
|
|
70
|
+
const n8nBad = fs.readFileSync(path.join(FIX, 'n8n-bad.md'), 'utf8');
|
|
71
|
+
ok(rp.evalVeto(n8nAssert, n8nOk, 'x', ctx).ok === true, 'extract: N8N JSON com nodes+connections PASSA');
|
|
72
|
+
ok(rp.evalVeto(n8nAssert, n8nBad, 'x', ctx).ok === false, 'extract: N8N JSON sem connections BLOQUEIA (CONCERNS-1 fechado na forma)');
|
|
73
|
+
ok(rp.extractFencedBlock(n8nOk, '## Workflow JSON', 'json').includes('"connections"'), 'extractFencedBlock extrai só o bloco da seção declarada');
|
|
74
|
+
// sem extract, o artefato .md inteiro não é JSON → bloqueia (comportamento legado preservado)
|
|
75
|
+
ok(rp.evalVeto({ type: 'json_schema_valid', schema: 'nodes' }, n8nOk, 'x', ctx).ok === false, 'sem extract: .md inteiro não é JSON (legado preservado)');
|
|
76
|
+
|
|
77
|
+
// ===========================================================================
|
|
78
|
+
// (a) render-gate — headless, FAIL-LOUD se ausente (AC5a)
|
|
79
|
+
// ===========================================================================
|
|
80
|
+
console.log('--- (a) render-gate ---');
|
|
81
|
+
ok(render.decideFromDom('<html data-render-gate="OK">').ok === true, 'decideFromDom: OK → passa');
|
|
82
|
+
ok(render.decideFromDom('<html data-render-gate="OVERFLOW">').ok === false, 'decideFromDom: OVERFLOW → bloqueia');
|
|
83
|
+
ok(render.decideFromDom('<html>').ok === false, 'decideFromDom: sem marcador → bloqueia (não green-fake)');
|
|
84
|
+
// FAIL-LOUD: CHROME_BIN inválido é honrado estritamente → probe null → exit não-zero.
|
|
85
|
+
{
|
|
86
|
+
const saved = process.env.CHROME_BIN;
|
|
87
|
+
process.env.CHROME_BIN = '/nao/existe/chrome-xyz';
|
|
88
|
+
const r = cc('render-gate.cjs', [], 'slide-ok.html');
|
|
89
|
+
ok(r.ok === false && /exit 3|Chrome/i.test(r.reason), 'render-gate: Chrome ausente → FAIL-LOUD (bloqueia, nunca skip)');
|
|
90
|
+
if (saved === undefined) delete process.env.CHROME_BIN; else process.env.CHROME_BIN = saved;
|
|
91
|
+
}
|
|
92
|
+
// Se há Chrome no ambiente, prova positiva/negativa reais; senão, registra skip honesto.
|
|
93
|
+
if (render.probeChrome()) {
|
|
94
|
+
ok(cc('render-gate.cjs', [], 'slide-ok.html').ok === true, 'render-gate: slide-ok (cabe) PASSA [Chrome real]');
|
|
95
|
+
ok(cc('render-gate.cjs', [], 'slide-overflow.html').ok === false, 'render-gate: slide-overflow (corte) BLOQUEIA [Chrome real]');
|
|
96
|
+
} else {
|
|
97
|
+
console.log('[SKIP ] render-gate pos/neg: headless Chrome ausente neste ambiente (fail-loud já provado; end-to-end roda no CI com Chrome)');
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// ===========================================================================
|
|
101
|
+
// (AC12) modelo de ameaça — só scripts BLESSED, recusa fail-loud
|
|
102
|
+
// ===========================================================================
|
|
103
|
+
console.log('--- (AC12) whitelist / modelo de ameaça ---');
|
|
104
|
+
ok(throwsFail(() => vp.checkCommandCheckSafety({ command: '../../etc/passwd' })), 'estático: path traversal RECUSADO');
|
|
105
|
+
ok(throwsFail(() => vp.checkCommandCheckSafety({ command: 'scripts/evil.cjs' })), 'estático: caminho (não nome simples) RECUSADO');
|
|
106
|
+
ok(throwsFail(() => vp.checkCommandCheckSafety({ command: 'nao-blessed.cjs' })), 'estático: script fora de veto-checks/ RECUSADO');
|
|
107
|
+
ok(throwsFail(() => vp.checkCommandCheckSafety({ command: 'lexical-check.cjs', args: ['$(rm -rf /)'] })), 'estático: arg com interpolação/shell RECUSADO');
|
|
108
|
+
ok(throwsFail(() => vp.checkCommandCheckSafety({ command: 'lexical-check.cjs', args: [42] })), 'estático: arg não-literal (número) RECUSADO');
|
|
109
|
+
ok(!throwsFail(() => vp.checkCommandCheckSafety({ command: 'lexical-check.cjs', args: ['--max', '0'] })), 'estático: blessed + args literais ACEITO');
|
|
110
|
+
// runtime (defesa em profundidade): evalVeto recusa comando fora da raiz blessed sem executar
|
|
111
|
+
ok(rp.evalVeto({ type: 'command_check', command: '../smoke-pod-workflow.cjs' }, '', path.join(FIX, 'copy-clean.md'), ctx).ok === false,
|
|
112
|
+
'runtime: evalVeto recusa comando fora da raiz blessed (defesa em profundidade)');
|
|
113
|
+
// ISOLANTE do guard B realpath (SF7.2 CONCERNS-1): um symlink de NOME BLESSED dentro de
|
|
114
|
+
// scripts/veto-checks/ apontando para um script-sentinela FORA passa o estático (nome blessed,
|
|
115
|
+
// dirname lexical == raiz) — só o realpathSync o pega. Sabotar o realpath faz esta asserção
|
|
116
|
+
// ficar VERMELHA (a sentinela seria executada). Restaura o arquivo real em finally.
|
|
117
|
+
{
|
|
118
|
+
const VC = path.join(REPO_ROOT, 'scripts', 'veto-checks');
|
|
119
|
+
const blessedReal = path.join(VC, 'lexical-check.cjs');
|
|
120
|
+
const backup = fs.readFileSync(blessedReal);
|
|
121
|
+
const d = fs.mkdtempSync(path.join(os.tmpdir(), 'sf72-symlink-'));
|
|
122
|
+
const sentinelFlag = path.join(d, 'EXECUTED');
|
|
123
|
+
const evil = path.join(d, 'evil-sentinel.cjs');
|
|
124
|
+
fs.writeFileSync(evil, `require('node:fs').writeFileSync(${JSON.stringify(sentinelFlag)}, 'x'); process.exit(0);`);
|
|
125
|
+
let refused = false;
|
|
126
|
+
let executed = true;
|
|
127
|
+
try {
|
|
128
|
+
fs.unlinkSync(blessedReal);
|
|
129
|
+
fs.symlinkSync(evil, blessedReal); // symlink de nome BLESSED → alvo externo
|
|
130
|
+
const r = rp.evalVeto({ type: 'command_check', command: 'lexical-check.cjs' }, '', path.join(FIX, 'copy-clean.md'), ctx);
|
|
131
|
+
refused = r.ok === false && /realpath/i.test(r.reason || '');
|
|
132
|
+
executed = fs.existsSync(sentinelFlag);
|
|
133
|
+
} finally {
|
|
134
|
+
try { fs.unlinkSync(blessedReal); } catch { /* ok */ }
|
|
135
|
+
fs.writeFileSync(blessedReal, backup); // restaura o arquivo real byte-idêntico
|
|
136
|
+
}
|
|
137
|
+
ok(refused && !executed,
|
|
138
|
+
'runtime ISOLADO: symlink de nome blessed → alvo externo é RECUSADO por realpath, sentinela NUNCA executada (fura o guard B se removido)');
|
|
139
|
+
}
|
|
140
|
+
// SF10.8 — a MESMA fronteira aplicada ao 4º blessed (`phash-gate.cjs`, veto de não-cópia):
|
|
141
|
+
// nenhuma exceção foi criada para ele (AC2). Estático + runtime + o isolante do guard B.
|
|
142
|
+
ok(!throwsFail(() => vp.checkCommandCheckSafety({ command: 'phash-gate.cjs', args: ['--refs-dir', '../inputs', '--assets-dir', '../assets'] })),
|
|
143
|
+
'phash-gate: blessed + args literais ACEITO (mesma porta dos 3 anteriores)');
|
|
144
|
+
ok(throwsFail(() => vp.checkCommandCheckSafety({ command: '../veto-checks/phash-gate.cjs' })), 'phash-gate: traversal no nome RECUSADO');
|
|
145
|
+
ok(throwsFail(() => vp.checkCommandCheckSafety({ command: 'phash-gate-fake.cjs' })), 'phash-gate: vizinho não-blessed RECUSADO');
|
|
146
|
+
ok(throwsFail(() => vp.checkCommandCheckSafety({ command: 'phash-gate.cjs', args: ['--refs-dir', '{{run.inputs_dir}}'] })),
|
|
147
|
+
'phash-gate: arg INTERPOLADO com dado de run RECUSADO (ADR-011 preservado — a referência nunca vira arg dinâmico)');
|
|
148
|
+
ok(rp.evalVeto({ type: 'command_check', command: '../veto-checks/phash-gate.cjs' }, '', path.join(FIX, 'copy-clean.md'), ctx).ok === false,
|
|
149
|
+
'phash-gate: runtime recusa a forma com caminho, sem executar');
|
|
150
|
+
{
|
|
151
|
+
const VC = path.join(REPO_ROOT, 'scripts', 'veto-checks');
|
|
152
|
+
const blessedReal = path.join(VC, 'phash-gate.cjs');
|
|
153
|
+
const backup = fs.readFileSync(blessedReal);
|
|
154
|
+
const d = fs.mkdtempSync(path.join(os.tmpdir(), 'sf108-symlink-'));
|
|
155
|
+
const sentinelFlag = path.join(d, 'EXECUTED');
|
|
156
|
+
const evil = path.join(d, 'evil-sentinel.cjs');
|
|
157
|
+
fs.writeFileSync(evil, `require('node:fs').writeFileSync(${JSON.stringify(sentinelFlag)}, 'x'); process.exit(0);`);
|
|
158
|
+
let refused = false;
|
|
159
|
+
let executed = true;
|
|
160
|
+
try {
|
|
161
|
+
fs.unlinkSync(blessedReal);
|
|
162
|
+
fs.symlinkSync(evil, blessedReal);
|
|
163
|
+
const r = rp.evalVeto({ type: 'command_check', command: 'phash-gate.cjs' }, '', path.join(FIX, 'copy-clean.md'), ctx);
|
|
164
|
+
refused = r.ok === false && /realpath/i.test(r.reason || '');
|
|
165
|
+
executed = fs.existsSync(sentinelFlag);
|
|
166
|
+
} finally {
|
|
167
|
+
try { fs.unlinkSync(blessedReal); } catch { /* ok */ }
|
|
168
|
+
fs.writeFileSync(blessedReal, backup);
|
|
169
|
+
}
|
|
170
|
+
ok(refused && !executed, 'phash-gate ISOLADO: symlink de nome blessed → alvo externo RECUSADO por realpath, sentinela NUNCA executada');
|
|
171
|
+
}
|
|
172
|
+
// validateWorkflow end-to-end: wf declarando comando não-blessed = exit 1 (Fail)
|
|
173
|
+
{
|
|
174
|
+
const d = fs.mkdtempSync(path.join(os.tmpdir(), 'vc-badwf-'));
|
|
175
|
+
fs.mkdirSync(path.join(d, 'workflows')); fs.mkdirSync(path.join(d, 'templates'));
|
|
176
|
+
fs.writeFileSync(path.join(d, 'templates', 't.md'), '# T\n## Body\nx\n');
|
|
177
|
+
fs.writeFileSync(path.join(d, 'workflows', 'wf-bad.yaml'),
|
|
178
|
+
'state_machine:\n states: [init, running, complete, failed]\n initial: init\n terminal: [complete, failed]\n' +
|
|
179
|
+
'steps:\n - id: s\n agent: a\n template: templates/t.md\n inputs: [x]\n outputs: [y]\n depends_on: []\n checkpoint: null\n' +
|
|
180
|
+
' veto:\n assertions:\n - { type: command_check, command: "evil.cjs" }\n');
|
|
181
|
+
ok(throwsFail(() => vp.validateWorkflow(path.join(d, 'workflows', 'wf-bad.yaml'), d)),
|
|
182
|
+
'validateWorkflow: wf com command_check fora da whitelist = exit 1 (recusa estática)');
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// ===========================================================================
|
|
186
|
+
// (AC3) sweep de command_check — fixture de violação; ausente = underivável fail-loud
|
|
187
|
+
// ===========================================================================
|
|
188
|
+
console.log('--- (AC3) sweep de command_check ---');
|
|
189
|
+
const sweepPod = path.join(FIX, 'sweep-pod');
|
|
190
|
+
const wfVc = path.join(sweepPod, 'workflows', 'wf-vc.yaml');
|
|
191
|
+
ok(!throwsFail(() => vp.validateWorkflow(wfVc, sweepPod)), 'validate-pod-workflow: wf-vc (command_check blessed) PASSA estático');
|
|
192
|
+
const scenario = JSON.parse(fs.readFileSync(path.join(sweepPod, 'workflows', 'wf-vc.smoke.json'), 'utf8'));
|
|
193
|
+
const sweepOk = smoke.runSweep({ workflowPath: wfVc, podRoot: sweepPod, scenario });
|
|
194
|
+
ok(sweepOk.ok === true && sweepOk.underivable === null && sweepOk.report.proofs.every((p) => p.blocked),
|
|
195
|
+
'sweep: command_check com fixture de violação → BLOQUEOU (prova de bloqueio)');
|
|
196
|
+
const scenarioNoViol = { ...scenario, violations: {} };
|
|
197
|
+
const sweepUnder = smoke.runSweep({ workflowPath: wfVc, podRoot: sweepPod, scenario: scenarioNoViol });
|
|
198
|
+
ok(sweepUnder.underivable !== null && /sem fixture de violação/.test(sweepUnder.underivable.reason),
|
|
199
|
+
'sweep: sem fixture de violação → UNDERIVÁVEL fail-loud (nunca pulado)');
|
|
200
|
+
|
|
201
|
+
// ===========================================================================
|
|
202
|
+
// (AC4) forge-generate serializeAssertion — args (lista) e extract (mapa) + roundtrip
|
|
203
|
+
// ===========================================================================
|
|
204
|
+
console.log('--- (AC4) forge-generate serializeAssertion ---');
|
|
205
|
+
const emitArgs = fg.serializeAssertion({ type: 'command_check', command: 'lexical-check.cjs', args: ['--max', '0'] });
|
|
206
|
+
const emitExtract = fg.serializeAssertion({ type: 'json_schema_valid', schema: 'nodes,connections', extract: { section: '## Workflow JSON', fence: 'json' } });
|
|
207
|
+
ok(/args: \[/.test(emitArgs), 'serializeAssertion emite args como flow-list');
|
|
208
|
+
ok(/extract: \{/.test(emitExtract), 'serializeAssertion emite extract como flow-map');
|
|
209
|
+
const rtArgs = vp.parseYaml('a: ' + emitArgs.slice(2)).a;
|
|
210
|
+
const rtExtract = vp.parseYaml('a: ' + emitExtract.slice(2)).a;
|
|
211
|
+
ok(Array.isArray(rtArgs.args) && rtArgs.args[0] === '--max', 'roundtrip: parseYaml lê args de volta como lista');
|
|
212
|
+
ok(rtExtract.extract && rtExtract.extract.section === '## Workflow JSON', 'roundtrip: parseYaml lê extract de volta como mapa');
|
|
213
|
+
|
|
214
|
+
if (failures.length > 0) {
|
|
215
|
+
console.error(`\nSuíte veto-checks FALHOU: ${failures.length} de ${passed + failures.length}.`);
|
|
216
|
+
process.exit(1);
|
|
217
|
+
}
|
|
218
|
+
console.log(`\n${passed} asserções verdes. command_check (6ª forma) + json_schema.extract provados.`);
|
|
219
|
+
process.exit(0);
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
/**
|
|
4
|
+
* watcher-audit.cjs — auditoria DETERMINÍSTICA de ADERÊNCIA heurística por run
|
|
5
|
+
* (Story SF2.3, SPEC §G1 "watcher-rubric audita, a cada run, se o agente de fato
|
|
6
|
+
* aplicou as heurísticas do top-N — aderência, não resumo").
|
|
7
|
+
*
|
|
8
|
+
* CONTRATO (a filosofia da rubrica, honrada em código, não em prosa):
|
|
9
|
+
* "O watcher NÃO resume o consolidado. Ele audita se o AGENTE APLICOU a heurística
|
|
10
|
+
* no ARTEFATO que produziu."
|
|
11
|
+
*
|
|
12
|
+
* Por que arquivo NOVO (e não extensão de pod-memory.cjs): a auditoria opera sobre
|
|
13
|
+
* PARES (consolidado top-N aplicável, artefato produzido) e é consumida pelo
|
|
14
|
+
* `pod-critic` (agente/gate), não pelo runner. Manter o motor de lifecycle
|
|
15
|
+
* (pod-memory.cjs) focado em DADOS e o de auditoria em ADERÊNCIA é a fronteira limpa
|
|
16
|
+
* recomendada nas Dev Notes da story. NÃO é decisão de arquitetura nova — a SPEC já
|
|
17
|
+
* autoriza qualquer dos dois arquivos (AC3 do brief).
|
|
18
|
+
*
|
|
19
|
+
* COMO É DETERMINÍSTICO (proibido veto por LLM, SPEC §B1): para cada heurística do
|
|
20
|
+
* consolidado (linha `- **[trigger]** recomendação`), extrai os TOKENS DE CONTEÚDO
|
|
21
|
+
* (palavras significativas, sem stopwords) do trigger e da recomendação e mede, por
|
|
22
|
+
* presença/ausência no TEXTO DO ARTEFATO (normalizado), um PADRÃO VERIFICÁVEL:
|
|
23
|
+
* - not-applicable → o CONTEXTO do trigger não aparece no artefato (a heurística não
|
|
24
|
+
* se aplica a este artefato — não é falha do agente).
|
|
25
|
+
* - applied → contexto do trigger presente E ≥ THRESHOLD dos tokens da
|
|
26
|
+
* recomendação presentes (o agente materializou o padrão recomendado).
|
|
27
|
+
* - not-applied → contexto presente mas o padrão da recomendação ausente (o
|
|
28
|
+
* agente ENTROU no caso e NÃO aplicou — este é o achado que importa).
|
|
29
|
+
*
|
|
30
|
+
* Isto NÃO mede se o consolidado foi CITADO: mede o artefato por si só. Um artefato que
|
|
31
|
+
* apenas MENCIONA "consultei learnings.consolidated.md" sem materializar o padrão
|
|
32
|
+
* pontua not-applied — é exatamente a diferença entre "aderência" e "resumo/menção".
|
|
33
|
+
*
|
|
34
|
+
* Uso:
|
|
35
|
+
* node scripts/watcher-audit.cjs <consolidado.md> <artefato> [--out <relatorio.md>]
|
|
36
|
+
* (sem --out: imprime o relatório em stdout e sai 0; com achados not-applied → exit 3
|
|
37
|
+
* para o pod-critic poder falhar o gate por código, se quiser)
|
|
38
|
+
*
|
|
39
|
+
* Node >= 18, sem dependências externas.
|
|
40
|
+
*/
|
|
41
|
+
|
|
42
|
+
const fs = require('node:fs');
|
|
43
|
+
const path = require('node:path');
|
|
44
|
+
|
|
45
|
+
const THRESHOLD = 0.5; // fração mínima dos tokens da recomendação presentes p/ "applied"
|
|
46
|
+
|
|
47
|
+
// Stopwords PT-BR/EN — palavras sem poder discriminante. Determinístico, documentado.
|
|
48
|
+
const STOPWORDS = new Set([
|
|
49
|
+
'a', 'o', 'as', 'os', 'um', 'uma', 'de', 'do', 'da', 'dos', 'das', 'em', 'no', 'na',
|
|
50
|
+
'nos', 'nas', 'e', 'ou', 'que', 'com', 'sem', 'por', 'para', 'ao', 'aos', 'se', 'ser',
|
|
51
|
+
'como', 'the', 'a', 'an', 'of', 'in', 'on', 'to', 'and', 'or', 'for', 'with', 'is',
|
|
52
|
+
'as', 'be', 'use', 'usar', 'sempre', 'nunca', 'deve', 'entao', 'então',
|
|
53
|
+
]);
|
|
54
|
+
|
|
55
|
+
function normalize(s) {
|
|
56
|
+
return String(s == null ? '' : s)
|
|
57
|
+
.toLowerCase()
|
|
58
|
+
.normalize('NFD')
|
|
59
|
+
.replace(/[̀-ͯ]/g, '')
|
|
60
|
+
.replace(/[^\w\s]/g, ' ')
|
|
61
|
+
.replace(/\s+/g, ' ')
|
|
62
|
+
.trim();
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** Tokens de conteúdo: palavras normalizadas com ≥3 chars, fora das stopwords. */
|
|
66
|
+
function contentTokens(s) {
|
|
67
|
+
return [...new Set(normalize(s).split(' ').filter((w) => w.length >= 3 && !STOPWORDS.has(w)))];
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Extrai as heurísticas do consolidado curado (formato de pod-memory.renderConsolidated):
|
|
72
|
+
* `- **[trigger]** recomendação _(xN)_` (top-N)
|
|
73
|
+
* `- **[trigger]** recomendação _(fonte: ...)_` (CRITICAL pinado)
|
|
74
|
+
*/
|
|
75
|
+
function parseConsolidatedHeuristics(md) {
|
|
76
|
+
const out = [];
|
|
77
|
+
for (const line of String(md).split(/\r?\n/)) {
|
|
78
|
+
const m = line.match(/^\s*-\s+\*\*\[(.+?)\]\*\*\s+(.*?)(?:\s+_\(.*\)_)?\s*$/);
|
|
79
|
+
if (m) out.push({ trigger: m[1].trim(), recommendation: m[2].trim() });
|
|
80
|
+
}
|
|
81
|
+
return out;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Audita aderência de UM artefato ao consolidado top-N. Puro e determinístico.
|
|
86
|
+
* @returns {{ results, appliedCount, notAppliedCount, notApplicableCount, auditable,
|
|
87
|
+
* adherenceScore }}
|
|
88
|
+
*/
|
|
89
|
+
function auditAdherence(consolidatedMd, artifactText, opts = {}) {
|
|
90
|
+
const threshold = typeof opts.threshold === 'number' ? opts.threshold : THRESHOLD;
|
|
91
|
+
const heuristics = parseConsolidatedHeuristics(consolidatedMd);
|
|
92
|
+
const artifactNorm = ` ${normalize(artifactText)} `;
|
|
93
|
+
const has = (tok) => artifactNorm.includes(` ${tok} `) || artifactNorm.includes(` ${tok}`);
|
|
94
|
+
|
|
95
|
+
const results = heuristics.map((h) => {
|
|
96
|
+
const trigTokens = contentTokens(h.trigger);
|
|
97
|
+
const recTokens = contentTokens(h.recommendation);
|
|
98
|
+
const triggerPresent = trigTokens.length === 0 ? false : trigTokens.some((t) => has(t));
|
|
99
|
+
const recHits = recTokens.filter((t) => has(t)).length;
|
|
100
|
+
const ratio = recTokens.length ? recHits / recTokens.length : 0;
|
|
101
|
+
let status;
|
|
102
|
+
if (!triggerPresent) status = 'not-applicable';
|
|
103
|
+
else if (ratio >= threshold) status = 'applied';
|
|
104
|
+
else status = 'not-applied';
|
|
105
|
+
return {
|
|
106
|
+
trigger: h.trigger,
|
|
107
|
+
recommendation: h.recommendation,
|
|
108
|
+
status,
|
|
109
|
+
evidence: { trigger_present: triggerPresent, recommendation_signal_ratio: Number(ratio.toFixed(2)), recommendation_tokens: recTokens.length },
|
|
110
|
+
};
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
const appliedCount = results.filter((r) => r.status === 'applied').length;
|
|
114
|
+
const notAppliedCount = results.filter((r) => r.status === 'not-applied').length;
|
|
115
|
+
const notApplicableCount = results.filter((r) => r.status === 'not-applicable').length;
|
|
116
|
+
const auditable = appliedCount + notAppliedCount; // heurísticas cujo contexto se aplica
|
|
117
|
+
const adherenceScore = auditable === 0 ? null : Number((appliedCount / auditable).toFixed(2));
|
|
118
|
+
return { results, appliedCount, notAppliedCount, notApplicableCount, auditable, adherenceScore };
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/** Renderiza o relatório de auditoria (destino claro — arquivo/stdout). */
|
|
122
|
+
function renderReport(audit, meta = {}) {
|
|
123
|
+
const lines = [];
|
|
124
|
+
lines.push('# Watcher — auditoria de aderência heurística (SF2.3)');
|
|
125
|
+
lines.push('');
|
|
126
|
+
lines.push('> Audita se o AGENTE APLICOU as heurísticas do top-N no artefato — não resume o consolidado.');
|
|
127
|
+
if (meta.artifact) lines.push(`> Artefato: \`${meta.artifact}\``);
|
|
128
|
+
if (meta.consolidated) lines.push(`> Consolidado: \`${meta.consolidated}\``);
|
|
129
|
+
lines.push('');
|
|
130
|
+
lines.push(`- aderência (aplicadas / aplicáveis): ${audit.adherenceScore == null ? 'n/a (nenhuma aplicável)' : audit.adherenceScore}`);
|
|
131
|
+
lines.push(`- aplicadas: ${audit.appliedCount} · NÃO-aplicadas: ${audit.notAppliedCount} · não-aplicáveis: ${audit.notApplicableCount}`);
|
|
132
|
+
lines.push('');
|
|
133
|
+
lines.push('| heurística (trigger) | status | sinal-recomendação |');
|
|
134
|
+
lines.push('|---|---|---|');
|
|
135
|
+
for (const r of audit.results) {
|
|
136
|
+
lines.push(`| ${r.trigger} | ${r.status} | ${r.evidence.recommendation_signal_ratio} |`);
|
|
137
|
+
}
|
|
138
|
+
lines.push('');
|
|
139
|
+
if (audit.notAppliedCount > 0) {
|
|
140
|
+
lines.push('## Achados — heurísticas NÃO aplicadas (contexto presente, padrão ausente)');
|
|
141
|
+
for (const r of audit.results.filter((x) => x.status === 'not-applied')) {
|
|
142
|
+
lines.push(`- **[${r.trigger}]** ${r.recommendation}`);
|
|
143
|
+
}
|
|
144
|
+
lines.push('');
|
|
145
|
+
}
|
|
146
|
+
return lines.join('\n');
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function main() {
|
|
150
|
+
const args = process.argv.slice(2);
|
|
151
|
+
let out = null;
|
|
152
|
+
const rest = [];
|
|
153
|
+
for (let i = 0; i < args.length; i++) {
|
|
154
|
+
if (args[i] === '--out') out = args[++i];
|
|
155
|
+
else rest.push(args[i]);
|
|
156
|
+
}
|
|
157
|
+
if (rest.length < 2) {
|
|
158
|
+
console.error('Uso: node scripts/watcher-audit.cjs <consolidado.md> <artefato> [--out <relatorio.md>]');
|
|
159
|
+
process.exit(2);
|
|
160
|
+
}
|
|
161
|
+
const consolidatedMd = fs.readFileSync(rest[0], 'utf8');
|
|
162
|
+
const artifactText = fs.readFileSync(rest[1], 'utf8');
|
|
163
|
+
const audit = auditAdherence(consolidatedMd, artifactText);
|
|
164
|
+
const report = renderReport(audit, { consolidated: path.basename(rest[0]), artifact: path.basename(rest[1]) });
|
|
165
|
+
if (out) {
|
|
166
|
+
fs.mkdirSync(path.dirname(path.resolve(out)), { recursive: true });
|
|
167
|
+
fs.writeFileSync(out, report);
|
|
168
|
+
console.log(`relatório de aderência gravado em ${path.relative(process.cwd(), path.resolve(out))}`);
|
|
169
|
+
} else {
|
|
170
|
+
console.log(report);
|
|
171
|
+
}
|
|
172
|
+
// exit 3 quando há heurística aplicável NÃO aplicada — o pod-critic decide o gate.
|
|
173
|
+
process.exit(audit.notAppliedCount > 0 ? 3 : 0);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
if (require.main === module) main();
|
|
177
|
+
|
|
178
|
+
module.exports = { auditAdherence, parseConsolidatedHeuristics, renderReport, contentTokens, normalize, THRESHOLD };
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# POWER CLAUDE
|
|
2
|
+
|
|
3
|
+
Framework de pods organizados por job-to-be-done. Cada pod é uma unidade de capacidade autocontida: agentes enxutos, conhecimento sob demanda e enforcement determinístico dos não-negociáveis.
|
|
4
|
+
|
|
5
|
+
## O que é
|
|
6
|
+
|
|
7
|
+
Cinco pods, cada um ativado por um slash command:
|
|
8
|
+
|
|
9
|
+
| Pod | Job-to-be-done | Comando |
|
|
10
|
+
|---|---|---|
|
|
11
|
+
| `pods/dev-ia/` | Desenvolvimento de software com IA (ciclo story → validação → implementação → QA gate) | `/power:dev` |
|
|
12
|
+
| `pods/authority-content/` | Conteúdo de autoridade multi-canal (radar → criação na voz → red-team factual → adaptação) | `/power:content` |
|
|
13
|
+
| `pods/automation/` | Automações com N8N e Langgraph (desenho → workflow/grafo → red-team → runbook) | `/power:automation` |
|
|
14
|
+
| `pods/academy/` | Palestras, treinamentos, mentorias e ofertas de consultoria | `/power:academy` |
|
|
15
|
+
| `pods/squad-forge/` | Criação de novos pods, agentes e skills no padrão da casa | `/power:forge` |
|
|
16
|
+
|
|
17
|
+
Fonte única da verdade: os agentes vivem nos pods. Slash commands são stubs finos que apontam para lá. Todo agente de pod é um arquivo markdown de até 150 linhas com `budget_tokens` declarado no frontmatter.
|
|
18
|
+
|
|
19
|
+
## Regras de ouro do ambiente
|
|
20
|
+
|
|
21
|
+
1. **Contexto é o ativo mais caro.** Todo agente declara `budget_tokens` e passa pelo gate `scripts/validate-budgets.js` (teto global: 1.500 tokens de ativação, 150 linhas). Conhecimento profundo carrega sob demanda — nunca na ativação. Budget de tokens é gate de CI, não sugestão.
|
|
22
|
+
2. **Enforcement determinístico > instrução.** O que é inegociável vira hook ou gate de CI, não prosa. Prosa orienta; hook bloqueia. Se uma regra importa de verdade e ainda é só texto, o próximo passo é transformá-la em gate.
|
|
23
|
+
3. **Verificação adversarial em tudo que sai para fora.** Todo pipeline que publica ou entrega tem fase de red-team obrigatória, executada por quem não produziu a peça. Gate de estilo não substitui red-team factual.
|
|
24
|
+
4. **Conhecimento em `knowledge/`, nunca em entry points.** Agentes, commands e skills são mapas de rota; o conteúdo denso vive em `knowledge/` ou `pods/<pod>/knowledge/` e carrega por comando, sob demanda.
|
|
25
|
+
5. **Git: push somente fast-forward e somente com aprovação humana ou papel devops.** Force-push é proibido para todos, inclusive devops — bloqueado deterministicamente por `.claude/hooks/enforce-git-push-authority.cjs`.
|
|
26
|
+
6. **Nunca marcar Done sem QA independente.** Quem implementa não se aprova. Só o papel QA transiciona uma story para Done, e só depois de re-executar os gates — relato de sucesso não é evidência.
|
|
27
|
+
7. **Autoatestado não é evidência.** Métrica de qualidade que um agente emite sobre o próprio trabalho (score, veredito, confiança) só vale pareada com validador externo — script de forma ou checkpoint humano. Dimensão sem evidência se declara insuficiente (`insufficient_data`); estimar para preencher é proibido.
|
|
28
|
+
|
|
29
|
+
## Personalização (opcional, em três degraus)
|
|
30
|
+
|
|
31
|
+
Nenhum pod exige que você construa um DNA de voz. Os pods que **assinam peças em seu nome**
|
|
32
|
+
perguntam quem é você — uma vez, três campos (nome, handle, uma linha de autoridade) —, porque a
|
|
33
|
+
alternativa seria assinar por uma pessoa inventada. Tudo o mais é opcional, tem default funcional
|
|
34
|
+
e se ajusta com o seu feedback durante o uso.
|
|
35
|
+
|
|
36
|
+
| Degrau | Você fornece | Onde |
|
|
37
|
+
|---|---|---|
|
|
38
|
+
| 1 — sem voz | nada; roda com tom neutro | — |
|
|
39
|
+
| 2 — guia de estilo | pessoa gramatical, léxico proibido, tom em uma linha | `pods/<pod>/knowledge/dono.yaml` (cópia de `dono.example.yaml`) |
|
|
40
|
+
| 3 — DNA de voz | um corpus do que você já escreveu | `knowledge/voice-dna/voice-dna.yaml`, via `/power:forge` → `mind-extractor` → `*extract {corpus}` |
|
|
41
|
+
|
|
42
|
+
Com o degrau 3 presente, os campos `voz.*` do degrau 2 não são autorados em paralelo (ausentes ou
|
|
43
|
+
`derived_from:`). Enquanto o arquivo carregar a sentinela (`meta.placeholder: true` /
|
|
44
|
+
`pc:placeholder`), trate-o como **não personalizado** — e nunca bloqueie a rodada por isso.
|
|
45
|
+
Passo a passo: `knowledge/voice-dna/README.md`.
|
|
46
|
+
|
|
47
|
+
## Ciclo de desenvolvimento
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
SPEC → epic → story → validação → implementação → QA gate independente → fechamento
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
| Etapa | Skill | Papel |
|
|
54
|
+
|---|---|---|
|
|
55
|
+
| Validar a story (GO/NO-GO, checklist de 10 pontos) | `pc-validate-story` | PO |
|
|
56
|
+
| Implementar os ACs (branch guard, gates verdes) | `pc-develop-story` | Dev |
|
|
57
|
+
| QA gate (PASS/CONCERNS/FAIL/WAIVED + gate file) | `pc-review-story` | QA |
|
|
58
|
+
| Corrigir findings do gate (inventário total) | `pc-apply-qa-fixes` | Dev |
|
|
59
|
+
| Fechar (bookkeeping pós-Done, índice do epic) | `pc-close-story` | qualquer |
|
|
60
|
+
| Commit local convencional com `[Story X.Y]` | `pc-commit` | Dev |
|
|
61
|
+
|
|
62
|
+
Regras do ciclo:
|
|
63
|
+
|
|
64
|
+
- Story só entra em implementação com veredito **GO** da validação (Status `Ready`).
|
|
65
|
+
- Gate **FAIL** → `pc-apply-qa-fixes` → re-review. Máximo 3 iterações; depois escala ao humano.
|
|
66
|
+
- Cada papel tem um subagente dedicado: `pc-po`, `pc-dev`, `pc-qa` (em `.claude/agents/`) — use-os para garantir contexto limpo entre implementação e revisão.
|
|
67
|
+
- A matriz completa de papéis, vetos e escalação está em `.claude/rules/authority.md`.
|
|
68
|
+
|
|
69
|
+
## Model routing
|
|
70
|
+
|
|
71
|
+
| Modelo | Quando |
|
|
72
|
+
|---|---|
|
|
73
|
+
| `sonnet` | Default para todo trabalho |
|
|
74
|
+
| `opus` | Arquitetura, síntese criativa, revisão adversarial (com justificativa registrada) |
|
|
75
|
+
| `haiku` | Varreduras mecânicas em lote (triagem de arquivos, grep semântico, checagens repetitivas) |
|
|
76
|
+
|
|
77
|
+
Routing é decisão de custo-benefício explícita: escalar para `opus` sem justificativa e varrer 200 arquivos com `sonnet` são o mesmo erro em direções opostas.
|
|
78
|
+
|
|
79
|
+
## Estrutura do projeto
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
pods/ # Os 6 pods: agents/, knowledge/, tasks/, examples/
|
|
83
|
+
knowledge/ # Conhecimento transversal (voice DNA, referências)
|
|
84
|
+
docs/stories/ # Stories numeradas ({epic}.{n}.story.md) e índices de epic
|
|
85
|
+
docs/qa/gates/ # Gate files de QA ({story}.yaml) — trilha de auditoria
|
|
86
|
+
content/ # Peças de conteúdo produzidas pelos pods
|
|
87
|
+
.claude/
|
|
88
|
+
├── CLAUDE.md # Este arquivo — identidade do ambiente
|
|
89
|
+
├── settings.json # Idioma, permissões (deny .env*) e registro de hooks
|
|
90
|
+
├── hooks/ # Enforcement determinístico (autoridade de push)
|
|
91
|
+
├── rules/ # authority.md — matriz de papéis do ciclo
|
|
92
|
+
├── skills/ # As 6 skills pc-* do ciclo de desenvolvimento
|
|
93
|
+
├── agents/ # Subagentes de papel: pc-po, pc-dev, pc-qa
|
|
94
|
+
└── commands/power/ # Stubs /power:* que ativam os pods
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Convenções
|
|
98
|
+
|
|
99
|
+
- Branch: `feat/{epic}.{n}-{slug}` — nunca commitar em `main`.
|
|
100
|
+
- Commits convencionais (`feat:`, `fix:`, `docs:`, `chore:`) com `[Story X.Y]`.
|
|
101
|
+
- Idioma: português, com termos técnicos em inglês.
|
|
102
|
+
- Segredos só em `.env` (nunca versionado; leitura bloqueada por permissão deny).
|
|
103
|
+
- Voz de conteúdo público: `knowledge/voice-dna/` — nunca persona de terceiros.
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pc-analyst
|
|
3
|
+
description: "Papel Analyst da fase Explore do POWER CLAUDE: transforma ideia ou problema vago em análise fundamentada e brief acionável que alimenta o planner. Use para: criar project brief, pesquisar mercado (TAM/SAM/SOM), analisar competidores, facilitar brainstorming, gerar prompt de pesquisa profunda, calcular ROI."
|
|
4
|
+
model: sonnet
|
|
5
|
+
budget_tokens: 1500
|
|
6
|
+
tools: Read, Grep, Glob, Write, Edit, Bash, WebSearch, WebFetch
|
|
7
|
+
permissionMode: acceptEdits
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# pc-analyst — Explorador da Fase Explore
|
|
11
|
+
|
|
12
|
+
Você é o papel **Analyst** do ciclo POWER CLAUDE.
|
|
13
|
+
Sua função é converter ideias vagas em evidência estruturada: briefs, pesquisas
|
|
14
|
+
de mercado, análises competitivas e sessões de ideação que dão ao planner e ao
|
|
15
|
+
architect um ponto de partida sólido — fatos com fonte, não opinião com verniz.
|
|
16
|
+
|
|
17
|
+
Critério de qualidade: alguém que nunca falou com o usuário consegue tomar uma
|
|
18
|
+
decisão de produto lendo só o seu documento.
|
|
19
|
+
|
|
20
|
+
> Para síntese estratégica pesada (executive summary de pesquisa extensa,
|
|
21
|
+
> cenários best/base/worst, war-gaming competitivo), o operador pode elevar
|
|
22
|
+
> este agente para `opus` com justificativa; o default é `sonnet`.
|
|
23
|
+
|
|
24
|
+
## Fronteiras do papel
|
|
25
|
+
|
|
26
|
+
- **NÃO escreve PRD** — o brief termina no Planner Handoff; PRD é do planner.
|
|
27
|
+
- **NÃO decide arquitetura** — Technical Considerations são pensamentos
|
|
28
|
+
iniciais, nunca decisões; arquitetura é do papel architect.
|
|
29
|
+
- **NÃO cria stories** — descoberta termina em documento, não em backlog.
|
|
30
|
+
|
|
31
|
+
## Missões
|
|
32
|
+
|
|
33
|
+
Cada missão carrega seu conhecimento sob demanda — o método vive FORA deste
|
|
34
|
+
agente, em `knowledge/analyst/`:
|
|
35
|
+
|
|
36
|
+
**`*brief`** — project brief em 12 seções, com Planner Handoff ao final.
|
|
37
|
+
- Método: `knowledge/analyst/brief-skeleton.md`
|
|
38
|
+
- Output: `docs/brief.md`
|
|
39
|
+
|
|
40
|
+
**`*market`** — pesquisa de mercado: TAM/SAM/SOM em 3 abordagens, JTBD,
|
|
41
|
+
Porter's Five Forces, oportunidades quantificadas.
|
|
42
|
+
- Método: `knowledge/analyst/market-research-skeleton.md`
|
|
43
|
+
- Output: `docs/market-research.md`
|
|
44
|
+
|
|
45
|
+
**`*bench`** — análise competitiva: 5 categorias de competidor, matriz 2×2
|
|
46
|
+
Market Share × Threat, SWOT, positioning map, plano de monitoramento.
|
|
47
|
+
- Método: `knowledge/analyst/competitor-skeleton.md`
|
|
48
|
+
- Output: `docs/competitor-analysis.md`
|
|
49
|
+
|
|
50
|
+
**`*brainstorm {tópico}`** — facilitação em 4 fases com 20 técnicas;
|
|
51
|
+
categorização Immediate / Future / Moonshots / Insights.
|
|
52
|
+
- Método: `knowledge/analyst/brainstorming.md`
|
|
53
|
+
- Output: `docs/brainstorming-session-results.md`
|
|
54
|
+
|
|
55
|
+
**`*research-prompt {tópico}`** — prompt de pesquisa profunda: 8 tipos,
|
|
56
|
+
perguntas primárias vs. secundárias, critérios de sucesso.
|
|
57
|
+
- Método: `knowledge/analyst/research-prompt-structure.md`
|
|
58
|
+
- Output: prompt pronto (ou `docs/research-prompt.md`)
|
|
59
|
+
|
|
60
|
+
**`*roi`** — análise de ROI com fórmulas visíveis, breakeven, projeção de
|
|
61
|
+
3 anos e análise de sensibilidade.
|
|
62
|
+
- Método: `knowledge/analyst/roi-skeleton.md`
|
|
63
|
+
- Output: `docs/roi-analysis.md`
|
|
64
|
+
|
|
65
|
+
**`*elicit`** — motor de refinamento seção a seção (menu 0-9) sobre qualquer
|
|
66
|
+
documento desta fase.
|
|
67
|
+
- Método: `knowledge/analyst/elicitation-menu.md`
|
|
68
|
+
- Output: seção refinada in-place
|
|
69
|
+
|
|
70
|
+
Variações cobertas sem missão própria:
|
|
71
|
+
- Pesquisa de dependências/constraints técnicas de uma feature →
|
|
72
|
+
`*research-prompt` tipo 5 (Technology & Innovation).
|
|
73
|
+
- Validação de hipótese de produto → `*research-prompt` tipo 1.
|
|
74
|
+
- Avaliação de risco/viabilidade → `*research-prompt` tipo 8.
|
|
75
|
+
|
|
76
|
+
## Fluxo típico da fase Explore
|
|
77
|
+
|
|
78
|
+
1. `*brainstorm` — divergir com o usuário.
|
|
79
|
+
2. `*market` / `*bench` / `*research-prompt` — fundamentar com evidência.
|
|
80
|
+
3. `*roi` — se o investimento precisa de defesa numérica.
|
|
81
|
+
4. `*brief` — convergir tudo em documento fundacional.
|
|
82
|
+
5. Planner Handoff — o brief vira entrada do PRD.
|
|
83
|
+
|
|
84
|
+
Cada documento aceita `*elicit` a qualquer momento para refinar seções.
|
|
85
|
+
|
|
86
|
+
## Regras de ouro
|
|
87
|
+
|
|
88
|
+
1. **Todo dado com fonte e data.** Fato citado tem origem rastreável;
|
|
89
|
+
estimativa tem método declarado; opinião é rotulada como opinião.
|
|
90
|
+
Declare o nível de confiança e as incertezas de cada achado.
|
|
91
|
+
2. **No Invention.** Nunca invente números, competidores, citações ou
|
|
92
|
+
tendências. Sem dado disponível? Registre a lacuna em "Areas Needing
|
|
93
|
+
Further Research" — lacuna honesta vale mais que preenchimento plausível.
|
|
94
|
+
3. **Executive summary por ÚLTIMO** e rationale registrado por seção
|
|
95
|
+
(por que este escopo, por que estes segmentos, por que estas premissas).
|
|
96
|
+
4. **Em brainstorming você é FACILITADOR:** extrai ideias do usuário com
|
|
97
|
+
perguntas e prompts; nunca gera por ele.
|
|
98
|
+
5. **Modo autônomo:** toda escolha não confirmada com o usuário vira registro
|
|
99
|
+
`[AUTO-DECISION] {pergunta} → {decisão} ({razão})` no documento,
|
|
100
|
+
para revisão posterior.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pc-architect
|
|
3
|
+
description: "Papel Architect do ciclo POWER CLAUDE: classifica complexidade, decide stack/arquitetura com trade-offs e ADR, revisa arquitetura antes do dev e analisa impacto de mudanças. Use para: classificar complexidade de spec (assess), decisão de arquitetura com ADR, revisão de arquitetura pré-desenvolvimento, análise de impacto em sistema existente."
|
|
4
|
+
model: opus
|
|
5
|
+
budget_tokens: 1400
|
|
6
|
+
tools: Read, Grep, Glob, Write, Edit, Bash, WebSearch, WebFetch
|
|
7
|
+
permissionMode: acceptEdits
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# pc-architect — Arquiteto do Ciclo
|
|
11
|
+
|
|
12
|
+
## Papel
|
|
13
|
+
|
|
14
|
+
Você é o papel **Architect** do ciclo POWER CLAUDE: decide como o sistema é construído e é o quality gate de arquitetura que SPECs e stories referenciam antes do desenvolvimento. Critério de qualidade: nenhuma decisão sem alternativas comparadas e critério explícito.
|
|
15
|
+
|
|
16
|
+
> Model `opus` com justificativa: arquitetura é onde raciocínio profundo paga — uma decisão errada aqui custa épicos inteiros de retrabalho; o custo extra de inferência é ordens de grandeza menor que o custo de corrigi-la depois.
|
|
17
|
+
|
|
18
|
+
## Missões
|
|
19
|
+
|
|
20
|
+
| Missão | O que faz |
|
|
21
|
+
|---|---|
|
|
22
|
+
| `*assess` | Classificação de complexidade por 5 dimensões, cada uma pontuada 1-5: **escopo** (arquivos/módulos afetados), **integração** (APIs e sistemas externos), **infraestrutura** (mudanças necessárias), **conhecimento** (familiaridade com o domínio/stack), **risco** (criticidade do que pode quebrar). Soma ≤ 8 → SIMPLE; 9-15 → STANDARD; ≥ 16 → COMPLEX. O veredito decide a profundidade do processo: SIMPLE = spec enxuta direto a stories; STANDARD = SPEC completa + `*review`; COMPLEX = SPEC (planner elevado a opus) + `*design` com ADR + `*review` obrigatório. |
|
|
23
|
+
| `*design` | Decisão de stack/arquitetura: ≥ 2 alternativas com trade-offs em tabela, critério de decisão explícito, e ADR curto (Contexto → Decisão → Consequências, incluindo as negativas) em `docs/adr/ADR-{n}-{slug}.md`. |
|
|
24
|
+
| `*review` | Revisão de arquitetura de SPEC/story **antes** do desenvolvimento — o quality gate que as stories referenciam: consistência com as decisões da SPEC e ADRs vigentes, acoplamento e fronteiras de módulo, superfícies de segurança, pontos únicos de falha, testabilidade dos ACs. Veredito APPROVED / NEEDS_CHANGES com lista acionável — nunca "parece ok". |
|
|
25
|
+
| `*impact` | Análise de impacto de mudança em sistema existente: mapeia módulos, contratos e dados afetados por leitura/grep real do código (nunca por suposição), avalia compatibilidade retroativa, plano de migração incremental e riscos com mitigação. |
|
|
26
|
+
|
|
27
|
+
## Regras de ouro
|
|
28
|
+
|
|
29
|
+
- **Toda decisão com alternativas consideradas e critério.** "Escolhi X" sem "em vez de Y, porque Z" não é decisão de arquitetura — é palpite.
|
|
30
|
+
- **Dívida técnica declarada, nunca silenciosa:** atalho aceito vira registro explícito (onde, por quê, custo estimado de pagar depois) na SPEC/ADR/story.
|
|
31
|
+
- **Segurança e custo são dimensões de TODA decisão** — avaliados em cada `*design`, `*review` e `*impact`, não seções opcionais.
|
|
32
|
+
- **Você não implementa:** analisa, decide, revisa e recomenda. Código é do papel Dev; veredito de story é do PO/QA; publicação é do devops (`.claude/rules/authority.md`).
|