@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,312 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
/**
|
|
4
|
+
* pod-export-compile.test.cjs — teste-guarda do compilador pod→bundle (Story SF10.1).
|
|
5
|
+
*
|
|
6
|
+
* Hermético (NÃO toca rede — endpoint mockado; NÃO toca exports/.power-claude reais — escreve
|
|
7
|
+
* em tmp). Fixture de CI = template/pods/content-carousel (exercita a GENERALIZAÇÃO: nomes de
|
|
8
|
+
* knowledge diferentes do pod de produção, citação implícita `identidade-visual-mascote.md`).
|
|
9
|
+
*
|
|
10
|
+
* Cobre: AC2 (6 linhas da tabela), AC3 (derivação PROGRAMÁTICA + cobertura + regressão hn-fetch),
|
|
11
|
+
* AC4 (determinismo byte-a-byte), AC5 (endpoint fail-loud mockado), AC6 (schema do lock).
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
const fs = require('node:fs');
|
|
15
|
+
const path = require('node:path');
|
|
16
|
+
const os = require('node:os');
|
|
17
|
+
|
|
18
|
+
const {
|
|
19
|
+
compile,
|
|
20
|
+
writeBundle,
|
|
21
|
+
serializeLock,
|
|
22
|
+
validateImageEndpoint,
|
|
23
|
+
parseCommandKnowledge,
|
|
24
|
+
extractGoldenRules,
|
|
25
|
+
splitFrontmatter,
|
|
26
|
+
COMPILER_VERSION,
|
|
27
|
+
CompileError,
|
|
28
|
+
} = require('./pod-export-compile.cjs');
|
|
29
|
+
|
|
30
|
+
const REPO_ROOT = path.resolve(__dirname, '..');
|
|
31
|
+
const FIXTURE_POD = path.join(REPO_ROOT, 'template', 'pods', 'content-carousel');
|
|
32
|
+
const REAL_PINS = path.join(REPO_ROOT, 'exports', 'content-carousel', 'pins.json');
|
|
33
|
+
|
|
34
|
+
let failures = 0;
|
|
35
|
+
function assert(ok, msg) {
|
|
36
|
+
if (ok) console.log(`[OK ] ${msg}`);
|
|
37
|
+
else { console.error(`[FALHA] ${msg}`); failures++; }
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Mocks de rede (AC5) — sem tocar a internet.
|
|
41
|
+
const fetchAlive = async () => ({ ok: true, json: async () => ({ data: { endpoints: [{ name: 'openrouter' }] } }) });
|
|
42
|
+
const fetchNoEndpoints = async () => ({ ok: true, json: async () => ({ data: { endpoints: [] } }) });
|
|
43
|
+
const fetchHttpError = async () => ({ ok: false, status: 404, json: async () => ({}) });
|
|
44
|
+
|
|
45
|
+
function tmpDir(label) { return fs.mkdtempSync(path.join(os.tmpdir(), `sf10-${label}-`)); }
|
|
46
|
+
function copyPod(dest) { fs.cpSync(FIXTURE_POD, dest, { recursive: true }); return dest; }
|
|
47
|
+
function wfPathOf(podDir) { return path.join(podDir, 'workflows', 'wf-content-carousel.yaml'); }
|
|
48
|
+
function mutateWf(podDir, fn) {
|
|
49
|
+
const p = wfPathOf(podDir);
|
|
50
|
+
fs.writeFileSync(p, fn(fs.readFileSync(p, 'utf8')));
|
|
51
|
+
}
|
|
52
|
+
async function expectFail(label, fn, substr) {
|
|
53
|
+
try {
|
|
54
|
+
await fn();
|
|
55
|
+
assert(false, `${label} — esperava FALHA, mas compilou`);
|
|
56
|
+
} catch (e) {
|
|
57
|
+
const isCompile = e instanceof CompileError || /Fail/.test(e.constructor.name);
|
|
58
|
+
assert(isCompile && (!substr || e.message.includes(substr)),
|
|
59
|
+
`${label} — falhou como esperado${substr ? ` (cita "${substr}")` : ''}: ${e.message.slice(0, 90)}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
// Unidade: derivação programática (nunca hardcode).
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
|
|
67
|
+
function unitTests() {
|
|
68
|
+
console.log('\n--- Unidade: parsing programático ---');
|
|
69
|
+
const hn = fs.readFileSync(path.join(FIXTURE_POD, 'agents', 'hn-curator.md'), 'utf8');
|
|
70
|
+
const { frontmatter, body } = splitFrontmatter(hn);
|
|
71
|
+
assert(frontmatter.model === 'sonnet', 'splitFrontmatter extrai model=sonnet');
|
|
72
|
+
// ACOPLAMENTO DECLARADO: o valor esperado é o do frontmatter REAL do pod-template (FIXTURE_POD
|
|
73
|
+
// aponta para template/pods/content-carousel, não para uma cópia). O que esta asserção prova é o
|
|
74
|
+
// PARSER, não o número — quando o agente muda de budget, este literal acompanha. Story SF12.2:
|
|
75
|
+
// 1000 -> 1450 (o `hn-curator` ganhou o modo `roteiro`; ainda sob o teto global de 1500 do
|
|
76
|
+
// scripts/validate-budgets.js, que é o gate real).
|
|
77
|
+
assert(frontmatter.budget_tokens === '1450', 'splitFrontmatter extrai budget_tokens');
|
|
78
|
+
const cited = parseCommandKnowledge(body);
|
|
79
|
+
assert(cited.has('aquisicao-ancora.md') && cited.size === 1,
|
|
80
|
+
`parseCommandKnowledge lê só a citação da linha de comando (${[...cited].join(', ')})`);
|
|
81
|
+
assert(extractGoldenRules(body).startsWith('## Regras de ouro'), 'extractGoldenRules captura a seção');
|
|
82
|
+
|
|
83
|
+
// A citação implícita: identidade-visual-mascote.md NÃO é citada por comando em NENHUM agente
|
|
84
|
+
// → um parser puro a perderia. Prova de que a derivação NÃO pode ser só parsing (D2).
|
|
85
|
+
let anyCites = false;
|
|
86
|
+
for (const a of ['hn-curator.md', 'carousel-visual.md', 'carousel-builder.md']) {
|
|
87
|
+
const b = splitFrontmatter(fs.readFileSync(path.join(FIXTURE_POD, 'agents', a), 'utf8')).body;
|
|
88
|
+
if (parseCommandKnowledge(b).has('identidade-visual-mascote.md')) anyCites = true;
|
|
89
|
+
}
|
|
90
|
+
assert(!anyCites, 'identidade-visual-mascote.md NÃO é citada por comando (só recuperável via campo declarado — D2)');
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// ---------------------------------------------------------------------------
|
|
94
|
+
// AC5: endpoint fail-loud (mockado).
|
|
95
|
+
// ---------------------------------------------------------------------------
|
|
96
|
+
|
|
97
|
+
async function endpointTests() {
|
|
98
|
+
console.log('\n--- AC5: validação de endpoint do modelo de imagem (mockado) ---');
|
|
99
|
+
const model = { id: 'google/gemini-2.5-flash-image', endpoints_url: 'https://x/endpoints' };
|
|
100
|
+
const ok = await validateImageEndpoint(model, { fetchImpl: fetchAlive });
|
|
101
|
+
assert(ok && ok.endpoints_count === 1, 'endpoint vivo → passa');
|
|
102
|
+
await expectFail('endpoint sem endpoints ("No endpoints" — Achado 1)',
|
|
103
|
+
() => validateImageEndpoint(model, { fetchImpl: fetchNoEndpoints }), 'SEM endpoints');
|
|
104
|
+
await expectFail('endpoint HTTP 404',
|
|
105
|
+
() => validateImageEndpoint(model, { fetchImpl: fetchHttpError }), 'indisponível');
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// ---------------------------------------------------------------------------
|
|
109
|
+
// AC2/AC3/AC6: compile feliz do fixture + cobertura de knowledge.
|
|
110
|
+
// ---------------------------------------------------------------------------
|
|
111
|
+
|
|
112
|
+
async function happyPathAndCoverage() {
|
|
113
|
+
console.log('\n--- AC2/AC3/AC6: compile do fixture content-carousel + cobertura ---');
|
|
114
|
+
const { lock, bundleFiles, podName } = await compile(FIXTURE_POD, { fetchImpl: fetchAlive, pinsPath: REAL_PINS });
|
|
115
|
+
const byRel = new Map(bundleFiles.map((f) => [f.rel, Buffer.isBuffer(f.content) ? f.content.toString('utf8') : f.content]));
|
|
116
|
+
|
|
117
|
+
assert(podName === 'content-carousel', 'nome do pod vem do pod-spec (D6)');
|
|
118
|
+
|
|
119
|
+
// AC6 — schema do lock completo.
|
|
120
|
+
const schemaKeys = ['pod', 'pod_sha', 'per_file_sha', 'modelo_pinado', 'framework_version', 'compiler_version', 'bundle_hashes'];
|
|
121
|
+
assert(schemaKeys.every((k) => k in lock), `lock tem as 7 chaves do schema: ${schemaKeys.join(', ')}`);
|
|
122
|
+
assert(lock.compiler_version === COMPILER_VERSION, 'lock.compiler_version = constante do compilador (D4)');
|
|
123
|
+
assert(/^\d+\.\d+\.\d+$/.test(lock.framework_version), 'lock.framework_version = version do package.json (D4)');
|
|
124
|
+
assert(lock.modelo_pinado.agents.digest === 'claude-sonnet-5', 'modelo pinado por fase = id concreto (D4)');
|
|
125
|
+
assert(lock.modelo_pinado.image.id === 'google/gemini-2.5-flash-image', 'modelo de imagem pinado registrado');
|
|
126
|
+
|
|
127
|
+
// AC2 — 6 linhas da tabela de compilação presentes no bundle.
|
|
128
|
+
assert(byRel.has('workflow.yaml'), 'tabela linha 5: grafo = wf VERBATIM empacotado (D3)');
|
|
129
|
+
assert(byRel.get('workflow.yaml') === fs.readFileSync(wfPathOf(FIXTURE_POD), 'utf8'), 'grafo é byte-idêntico ao wf original (D3)');
|
|
130
|
+
assert(byRel.has('phases/digest/system.md'), 'tabela linha 1: system prompt por fase');
|
|
131
|
+
assert(byRel.get('phases/digest/system.md').includes('# REGRAS DE OURO'), 'tabela linha 4: golden rules no bloco só-leitura');
|
|
132
|
+
assert(byRel.get('phases/digest/system.md').includes('MEMÓRIA CONSOLIDADA') &&
|
|
133
|
+
byRel.get('phases/digest/system.md').includes('recordLearning DESLIGADO'),
|
|
134
|
+
'tabela linha 4: memória consolidada SÓ-LEITURA (recordLearning off)');
|
|
135
|
+
assert(byRel.has('phases/digest/user.md') && byRel.get('phases/digest/user.md').includes('CONTRATO DE SAÍDA'),
|
|
136
|
+
'tabela linha 3: template como contrato de saída no user prompt');
|
|
137
|
+
assert(byRel.has('veto-checks/lexical-check.cjs'), 'tabela linha 6: script de veto blessed empacotado (assembly usa lexical-check)');
|
|
138
|
+
|
|
139
|
+
// AC3 — cobertura PROGRAMÁTICA de knowledge por fase.
|
|
140
|
+
const expected = {
|
|
141
|
+
digest: ['aquisicao-ancora.md', 'selecao-de-ancora.md'],
|
|
142
|
+
visuals: ['image-generation.md', 'identidade-visual-mascote.md'],
|
|
143
|
+
assembly: ['slides-html.md', 'cta-brief.md', 'identidade-visual-mascote.md'],
|
|
144
|
+
};
|
|
145
|
+
for (const [phase, ks] of Object.entries(expected)) {
|
|
146
|
+
const meta = JSON.parse(byRel.get(`phases/${phase}/meta.json`));
|
|
147
|
+
assert(JSON.stringify(meta.knowledge) === JSON.stringify(ks),
|
|
148
|
+
`fase ${phase}: knowledge na ORDEM declarada = [${ks.join(', ')}]`);
|
|
149
|
+
for (const k of ks) {
|
|
150
|
+
assert(byRel.has(`knowledge/${k}`), `fase ${phase}: knowledge/${k} presente no bundle`);
|
|
151
|
+
assert(byRel.get(`phases/${phase}/system.md`).includes(`# KNOWLEDGE: ${k}`),
|
|
152
|
+
`fase ${phase}: knowledge/${k} anexado ao system prompt`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// Zero omissão: união do knowledge por fase == todo knowledge .md do pod (garantia anti-órfão).
|
|
156
|
+
const unionKnowledge = new Set(Object.values(expected).flat());
|
|
157
|
+
const podKnowledgeMd = fs.readdirSync(path.join(FIXTURE_POD, 'knowledge')).filter((f) => f.endsWith('.md'));
|
|
158
|
+
assert(podKnowledgeMd.every((k) => unionKnowledge.has(k)),
|
|
159
|
+
`AC3: 100% do knowledge .md do pod está coberto por alguma fase (sem omissão): ${podKnowledgeMd.join(', ')}`);
|
|
160
|
+
// A citação implícita foi para o bundle (o bug que o parser puro cometeria).
|
|
161
|
+
assert(byRel.has('knowledge/identidade-visual-mascote.md'),
|
|
162
|
+
'AC3: citação IMPLÍCITA (identidade-visual-mascote.md) está no bundle via campo declarado (não perdida)');
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// ---------------------------------------------------------------------------
|
|
166
|
+
// AC3: regressão + os 3 checks fail-loud.
|
|
167
|
+
// ---------------------------------------------------------------------------
|
|
168
|
+
|
|
169
|
+
async function regressionAndChecks() {
|
|
170
|
+
console.log('\n--- AC3: regressão (bug do spike) + 3 checks fail-loud (D2) ---');
|
|
171
|
+
|
|
172
|
+
// Regressão: wf declara knowledge INEXISTENTE (hn-fetch.md num pod que não o tem) → FALHA.
|
|
173
|
+
await expectFail('regressão hn-fetch.md inexistente (bug do PoC)', async () => {
|
|
174
|
+
const pod = copyPod(tmpDir('regr'));
|
|
175
|
+
mutateWf(pod, (t) => t.replace('knowledge: [aquisicao-ancora.md, selecao-de-ancora.md]', 'knowledge: [hn-fetch.md]'));
|
|
176
|
+
await compile(pod, { fetchImpl: fetchAlive, pinsPath: REAL_PINS });
|
|
177
|
+
}, 'hn-fetch.md');
|
|
178
|
+
|
|
179
|
+
// Check 2 (superconjunto): citação de comando fora da lista declarada → FALHA.
|
|
180
|
+
await expectFail('check superconjunto (citação não declarada)', async () => {
|
|
181
|
+
const pod = copyPod(tmpDir('super'));
|
|
182
|
+
mutateWf(pod, (t) => t.replace('knowledge: [aquisicao-ancora.md, selecao-de-ancora.md]', 'knowledge: [selecao-de-ancora.md]'));
|
|
183
|
+
await compile(pod, { fetchImpl: fetchAlive, pinsPath: REAL_PINS });
|
|
184
|
+
}, 'aquisicao-ancora.md');
|
|
185
|
+
|
|
186
|
+
// Check 3 (órfãos): knowledge presente no pod não reivindicado → FALHA.
|
|
187
|
+
await expectFail('check órfãos (identidade-visual-mascote esquecido)', async () => {
|
|
188
|
+
const pod = copyPod(tmpDir('orphan'));
|
|
189
|
+
mutateWf(pod, (t) => t
|
|
190
|
+
.replace('knowledge: [image-generation.md, identidade-visual-mascote.md]', 'knowledge: [image-generation.md]')
|
|
191
|
+
.replace('knowledge: [slides-html.md, cta-brief.md, identidade-visual-mascote.md]', 'knowledge: [slides-html.md, cta-brief.md]'));
|
|
192
|
+
await compile(pod, { fetchImpl: fetchAlive, pinsPath: REAL_PINS });
|
|
193
|
+
}, 'identidade-visual-mascote.md');
|
|
194
|
+
|
|
195
|
+
// knowledge: ausente numa fase → FALHA (OBRIGATÓRIO para compile).
|
|
196
|
+
await expectFail('knowledge ausente numa fase', async () => {
|
|
197
|
+
const pod = copyPod(tmpDir('missing'));
|
|
198
|
+
mutateWf(pod, (t) => t.replace(/\n\s*knowledge: \[aquisicao-ancora.md, selecao-de-ancora.md\][^\n]*/, ''));
|
|
199
|
+
await compile(pod, { fetchImpl: fetchAlive, pinsPath: REAL_PINS });
|
|
200
|
+
}, 'OBRIGATÓRIO');
|
|
201
|
+
|
|
202
|
+
// knowledge_exclude: escape hatch permite knowledge não usado → COMPILA.
|
|
203
|
+
{
|
|
204
|
+
const pod = copyPod(tmpDir('exclude'));
|
|
205
|
+
fs.writeFileSync(path.join(pod, 'knowledge', 'extra-unused.md'), '# extra\n');
|
|
206
|
+
mutateWf(pod, (t) => t.replace('steps:', 'knowledge_exclude: [extra-unused.md]\nsteps:'));
|
|
207
|
+
try {
|
|
208
|
+
await compile(pod, { fetchImpl: fetchAlive, pinsPath: REAL_PINS });
|
|
209
|
+
assert(true, 'knowledge_exclude libera knowledge não usado (escape hatch D2)');
|
|
210
|
+
} catch (e) { assert(false, `knowledge_exclude deveria compilar: ${e.message}`); }
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// Pin ausente → FALHA (D4).
|
|
214
|
+
await expectFail('alias de modelo sem pin', async () => {
|
|
215
|
+
const badPins = path.join(tmpDir('pins'), 'pins.json');
|
|
216
|
+
fs.writeFileSync(badPins, JSON.stringify({ models: {}, image_model: { id: 'x', endpoints_url: 'https://x' } }));
|
|
217
|
+
await compile(FIXTURE_POD, { fetchImpl: fetchAlive, pinsPath: badPins });
|
|
218
|
+
}, 'sem pin');
|
|
219
|
+
|
|
220
|
+
// Endpoint morto no compile inteiro → FALHA (AC5 ponta-a-ponta).
|
|
221
|
+
await expectFail('endpoint morto aborta o compile inteiro', async () => {
|
|
222
|
+
await compile(FIXTURE_POD, { fetchImpl: fetchNoEndpoints, pinsPath: REAL_PINS });
|
|
223
|
+
}, 'endpoints');
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// ---------------------------------------------------------------------------
|
|
227
|
+
// AC4: determinismo byte-a-byte.
|
|
228
|
+
// ---------------------------------------------------------------------------
|
|
229
|
+
|
|
230
|
+
async function determinism() {
|
|
231
|
+
console.log('\n--- AC4: determinismo (mesmo pod@sha + compiler_version → bundle byte-idêntico) ---');
|
|
232
|
+
const a = await compile(FIXTURE_POD, { fetchImpl: fetchAlive, pinsPath: REAL_PINS });
|
|
233
|
+
const b = await compile(FIXTURE_POD, { fetchImpl: fetchAlive, pinsPath: REAL_PINS });
|
|
234
|
+
assert(a.lock.pod_sha === b.lock.pod_sha, 'pod_sha estável entre 2 compilações');
|
|
235
|
+
assert(serializeLock(a.lock) === serializeLock(b.lock), 'lock.json byte-idêntico entre 2 compilações');
|
|
236
|
+
const hashesA = JSON.stringify(a.lock.bundle_hashes);
|
|
237
|
+
const hashesB = JSON.stringify(b.lock.bundle_hashes);
|
|
238
|
+
assert(hashesA === hashesB, 'bundle_hashes byte-idênticos (nenhum timestamp/aleatório no conteúdo)');
|
|
239
|
+
|
|
240
|
+
// E o bundle escrito em disco também é byte-idêntico.
|
|
241
|
+
const d1 = tmpDir('det1'); const d2 = tmpDir('det2');
|
|
242
|
+
writeBundle(d1, a.bundleFiles); writeBundle(d2, b.bundleFiles);
|
|
243
|
+
let allEqual = true;
|
|
244
|
+
for (const f of a.bundleFiles) {
|
|
245
|
+
const p1 = path.join(d1, f.rel); const p2 = path.join(d2, f.rel);
|
|
246
|
+
if (!fs.existsSync(p2) || !fs.readFileSync(p1).equals(fs.readFileSync(p2))) allEqual = false;
|
|
247
|
+
}
|
|
248
|
+
assert(allEqual, 'todos os arquivos do bundle escrito são byte-idênticos entre as 2 compilações');
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// ---------------------------------------------------------------------------
|
|
252
|
+
// SF11.4/ADR-022 (DF-SF11.4-6): ramificação POR TRANSPORTE da memória consolidada.
|
|
253
|
+
// O consolidado cita `memory/learnings.hardened.md` (trilha auditável que vive no
|
|
254
|
+
// repositório do pod). Esse arquivo NÃO viaja no bundle — o prompt compilado não pode
|
|
255
|
+
// mandar o executor consultar um arquivo ausente (referência pendurada).
|
|
256
|
+
// ---------------------------------------------------------------------------
|
|
257
|
+
async function memoryTransportBranch() {
|
|
258
|
+
console.log('\n--- SF11.4/DF-SF11.4-6: memória no bundle sem referência pendurada ---');
|
|
259
|
+
const podDir = copyPod(path.join(tmpDir('hardref'), 'pod'));
|
|
260
|
+
fs.mkdirSync(path.join(podDir, 'memory'), { recursive: true });
|
|
261
|
+
fs.writeFileSync(path.join(podDir, 'memory', 'learnings.consolidated.md'), [
|
|
262
|
+
'# Memória consolidada — content-carousel',
|
|
263
|
+
'',
|
|
264
|
+
'> Curado por pod-memory.cjs (SF2.1). Único artefato de memória lido pelo agente.',
|
|
265
|
+
'> Log cru (learnings.jsonl) NÃO é lido pelo agente — auditoria apenas.',
|
|
266
|
+
'',
|
|
267
|
+
'## Heurísticas (top-N)',
|
|
268
|
+
'',
|
|
269
|
+
'- **[escrever texto de slide]** limite de texto em TODOS os slides _(x2)_',
|
|
270
|
+
'',
|
|
271
|
+
'## Endurecidas (🔒 → enforcement)',
|
|
272
|
+
'',
|
|
273
|
+
'_2 heurística(s) já viraram forma canônica do pod — enforcement substitui injeção: knowledge/slides-html.md (2). ' +
|
|
274
|
+
'O knowledge citado é LEITURA OBRIGATÓRIA da etapa e o veto citado bloqueia em disco; por isso o texto delas não é reinjetado aqui._',
|
|
275
|
+
'_Detalhe auditável (asserção, aprovador, momento): memory/learnings.hardened.md — append-only, nunca podado._',
|
|
276
|
+
'',
|
|
277
|
+
].join('\n'));
|
|
278
|
+
// a trilha existe no pod (e continua fora do bundle)
|
|
279
|
+
fs.writeFileSync(path.join(podDir, 'memory', 'learnings.hardened.md'),
|
|
280
|
+
'# Endurecidas (🔒) — trilha auditável — content-carousel\n\n- 🔒 **[x]** y — endurecida → knowledge/slides-html.md _(por daniel, 2026-08-02T00:00:00.000Z)_\n');
|
|
281
|
+
|
|
282
|
+
const { bundleFiles } = await compile(podDir, { fetchImpl: fetchAlive, pinsPath: REAL_PINS });
|
|
283
|
+
const byRel = new Map(bundleFiles.map((f) => [f.rel, Buffer.isBuffer(f.content) ? f.content.toString('utf8') : f.content]));
|
|
284
|
+
const sys = byRel.get('phases/digest/system.md');
|
|
285
|
+
assert(!/learnings\.hardened\.md/.test(sys),
|
|
286
|
+
'prompt compilado NÃO cita memory/learnings.hardened.md (arquivo ausente do bundle)');
|
|
287
|
+
assert(/Detalhe auditável das endurecidas .* vive no repositório do pod/.test(sys),
|
|
288
|
+
'prompt compilado DECLARA onde o detalhe vive, em vez de apagar a linha em silêncio');
|
|
289
|
+
assert(sys.includes('knowledge/slides-html.md (2)'),
|
|
290
|
+
'a referência AGREGADA (alvo + contagem) sobrevive ao transporte');
|
|
291
|
+
assert(!/learnings\.jsonl/.test(sys), 'log cru segue fora do prompt compilado (garantia anterior intacta)');
|
|
292
|
+
assert(![...byRel.keys()].some((k) => /learnings\.hardened\.md/.test(k)),
|
|
293
|
+
'a trilha auditável NÃO é empacotada no bundle (DF-SF11.4-6)');
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
async function main() {
|
|
297
|
+
console.log('POWER CLAUDE — teste-guarda do compilador pod-export (SF10.1)\n');
|
|
298
|
+
unitTests();
|
|
299
|
+
await endpointTests();
|
|
300
|
+
await happyPathAndCoverage();
|
|
301
|
+
await regressionAndChecks();
|
|
302
|
+
await memoryTransportBranch();
|
|
303
|
+
await determinism();
|
|
304
|
+
if (failures > 0) {
|
|
305
|
+
console.error(`\nTeste-guarda FALHOU: ${failures} violação(ões).`);
|
|
306
|
+
process.exit(1);
|
|
307
|
+
}
|
|
308
|
+
console.log('\nTeste-guarda verde.');
|
|
309
|
+
process.exit(0);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
main();
|