@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,427 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
/**
|
|
3
|
+
* pod-export-postprocess.cjs - FIXER determinístico PRÉ-VETO do pod-export (Story SF10.11, F6).
|
|
4
|
+
*
|
|
5
|
+
* ┌─ O QUE FAZ ────────────────────────────────────────────────────────────────────────────┐
|
|
6
|
+
* │ Normaliza classes puramente MECÂNICAS (tabela declarada de substituição) em TODOS os │
|
|
7
|
+
* │ arquivos que o agente escreveu com `write_file` NA TENTATIVA CORRENTE, ANTES de │
|
|
8
|
+
* │ `motor.advance` (verifyStep/evalVeto) rodar. É o ÚLTIMO ESCRITOR ANTES DE TODA │
|
|
9
|
+
* │ VERIFICAÇÃO - nunca um bypass: o veto continua rodando depois, com a última palavra. │
|
|
10
|
+
* └────────────────────────────────────────────────────────────────────────────────────────┘
|
|
11
|
+
*
|
|
12
|
+
* ┌─ O QUE NÃO É (decidido por desenho, ADR-018 Adendo F6-a / `DF-SF10.11-2`) ──────────────┐
|
|
13
|
+
* │ NÃO vive em `scripts/veto-checks/`; NÃO é BLESSED; NÃO é declarável em `command_check` │
|
|
14
|
+
* │ nem em nenhum `wf-*.yaml`; NÃO toca o motor compartilhado (`pc-run-pod.cjs` e │
|
|
15
|
+
* │ `validate-pod-workflow.cjs` ficam byte-idênticos). É um módulo in-process do EXPORT, │
|
|
16
|
+
* │ importado só por `pod-export-executor.cjs`. Pôr um MUTADOR na raiz blessed estenderia a │
|
|
17
|
+
* │ superfície de "verificar" para "reescrever" em todos os pods, por ganho zero. │
|
|
18
|
+
* └────────────────────────────────────────────────────────────────────────────────────────┘
|
|
19
|
+
*
|
|
20
|
+
* ORDEM VINCULANTE no laço (`DF-SF10.11+12-1`), por tentativa dentro de `drive`:
|
|
21
|
+
* 1. runPhase -> o modelo escreve via write_file; devolve toolTrail
|
|
22
|
+
* 2. FIXER (aqui) -> sobre os paths de write_file DESTA tentativa; determinístico, idempotente
|
|
23
|
+
* 3. motor.advance -> veto REAL (motor INTOCADO, última linha)
|
|
24
|
+
* 4. se reprovar -> correção guiada (SF10.12) consome o relatório deste fixer e volta ao 1
|
|
25
|
+
* O fixer roda em TODA tentativa, inclusive as pós-edição: a edição pode reintroduzir a classe
|
|
26
|
+
* mecânica, e a uniformidade do laço é o que dispensa um "segundo hook".
|
|
27
|
+
*
|
|
28
|
+
* DOMÍNIO (`DF-SF10.11-1`): os paths de `write_file` bem-sucedidos do `toolTrail` da tentativa -
|
|
29
|
+
* NÃO o artefato verificado. Deliberado: o `lexical-check` do `wf-hn-carousel` mede só
|
|
30
|
+
* `artifacts/assembly.md` (um SUMÁRIO), enquanto a copy publicada vive nas 7 peças HTML, que
|
|
31
|
+
* nenhuma assertion inspeciona (`DF-SF10.11+12-0(a)`). Um fixer escopado ao artefato verificado
|
|
32
|
+
* consertaria a MÉTRICA sem consertar o PRODUTO. Sem glob e sem varredura de diretório (a classe
|
|
33
|
+
* de erro do `listImages`, `NOTE-1` do gate de SF10.8): só o que ESTE agente escreveu NESTA
|
|
34
|
+
* tentativa. A resolução passa por `tools.confinedResolveWritable`, então `inputs/` (referência
|
|
35
|
+
* materializada) e o `.provenance.json` (irmão do runDir) são INALCANÇÁVEIS por construção.
|
|
36
|
+
*
|
|
37
|
+
* SUBTRAÇÃO DO DOMÍNIO (FIND-1, débito Low do gate de QA da SF10.11, pago na SF10.12): um path que
|
|
38
|
+
* `openrouter_image` gravou COM SUCESSO na MESMA tentativa sai do domínio, mesmo estando no trail de
|
|
39
|
+
* `write_file`. As duas tools compartilham o espaço de nomes do runDir; ler binário como UTF-8 e
|
|
40
|
+
* regravar corrompe (o QA mediu 16B -> 21B com sha alterado). A subtração compara paths ABSOLUTOS
|
|
41
|
+
* resolvidos - nunca strings -, então grafias diferentes do mesmo arquivo não escapam. Nada de
|
|
42
|
+
* heurística por extensão ou por magic bytes: o que decide é a TOOL que escreveu por último.
|
|
43
|
+
*
|
|
44
|
+
* DISCIPLINA DE FORMA (herdada de ADR-011): zero-dep, SÍNCRONO, determinístico, IDEMPOTENTE
|
|
45
|
+
* (`fix(fix(x)) === fix(x)`), sem rede, sem shell, sem `child_process`, sem `catch` cego.
|
|
46
|
+
*
|
|
47
|
+
* NOTA DE AUTORIA: este arquivo NÃO contém literais em-dash/en-dash em lugar nenhum (nem em
|
|
48
|
+
* comentário) - os padrões são escritos como escapes `\u2014`/`\u2013`. O módulo que remove o
|
|
49
|
+
* caractere não o carrega.
|
|
50
|
+
*
|
|
51
|
+
* Node >= 18 (lookbehind de regex). Story SF10.11; ADR-018 Adendo F6-a.
|
|
52
|
+
*/
|
|
53
|
+
|
|
54
|
+
const fs = require('node:fs');
|
|
55
|
+
const tools = require('./pod-export-tools.cjs');
|
|
56
|
+
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
// TABELA DECLARADA DE SUBSTITUIÇÃO (`DF-SF10.11-3`).
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* REGRA DE AUTORIA - LEIA ANTES DE ACRESCENTAR UMA ENTRADA:
|
|
63
|
+
*
|
|
64
|
+
* 1. A tabela NÃO é derivada do detector do veto. `lexical-check.cjs` recebe `--pattern "[..]"`:
|
|
65
|
+
* um detector diz O QUE é proibido, nunca COM O QUE substituir. A substituição é conhecimento
|
|
66
|
+
* de VOZ DO DONO, autorada e aprovada por ele (No Invention). Inverter o detector seria
|
|
67
|
+
* inventar semântica.
|
|
68
|
+
* 2. Uma entrada só entra se o caractere for SINTATICAMENTE INERTE em TODOS os tipos de arquivo
|
|
69
|
+
* que a fase produz (Markdown, HTML, CSS, JS). U+2014 e U+2013 são inertes em qualquer posição
|
|
70
|
+
* dos quatro. "Normalizar aspas", por contraste, QUEBRARIA atributo HTML e está PROIBIDO sem
|
|
71
|
+
* escopo por tipo de arquivo. Esta restrição é o que impede a tabela de virar um vetor de
|
|
72
|
+
* corrupção conforme cresce.
|
|
73
|
+
* 3. A deriva fixer<->veto é FAIL-SAFE por construção: se alguém mudar `voz.lexico_proibido` e os
|
|
74
|
+
* args do veto sem atualizar esta tabela, o fixer apenas deixa de ajudar e O VETO VOLTA A
|
|
75
|
+
* BLOQUEAR. Nenhum caminho de deriva produz verde indevido. A golden rule de autoria
|
|
76
|
+
* (`carousel-builder.md`: editar voz e args juntos) estende-se a esta tabela.
|
|
77
|
+
* 4. O ponto de chamada NÃO muda ao acrescentar uma entrada: `postProcessAttempt` itera a tabela.
|
|
78
|
+
* Regra nova = uma entrada aqui + a decisão do dono registrada. Nunca uma story de infra nova.
|
|
79
|
+
*
|
|
80
|
+
* Entradas aprovadas pelo dono (Daniel) em 2026-08-01, story SF10.11 (nenhuma outra substituição
|
|
81
|
+
* entra sem NOVA decisão dele).
|
|
82
|
+
*/
|
|
83
|
+
const SUBSTITUTIONS = [
|
|
84
|
+
{
|
|
85
|
+
id: 'em-dash-entre-espacos',
|
|
86
|
+
classe: 'prosa',
|
|
87
|
+
// U+2014 cercado por espaço horizontal dos DOIS lados, entre não-espaços. Os lookarounds são
|
|
88
|
+
// de largura zero de propósito: cadeias (`a - b - c`) convergem numa passada só.
|
|
89
|
+
pattern: /(?<=\S)[ \t\u00A0]+\u2014[ \t\u00A0]+(?=\S)/gu,
|
|
90
|
+
replacement: ', ',
|
|
91
|
+
porque: 'em-dash entre espaços é o "tell" de IA na prosa; a voz do dono usa vírgula (decisão do dono, SF10.11).',
|
|
92
|
+
veto_que_alivia: 'lexical-check.cjs --pattern "[\\u2014\\u2013]" --max 0',
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
id: 'en-dash-entre-digitos',
|
|
96
|
+
classe: 'intervalos numéricos',
|
|
97
|
+
// U+2013 ENTRE dígitos (ex.: 2020-2024, com en-dash). Lookbehind/lookahead de largura zero: cadeias
|
|
98
|
+
// (`1-2-3` encadeados) convergem numa passada só.
|
|
99
|
+
pattern: /(?<=\d)\u2013(?=\d)/gu,
|
|
100
|
+
replacement: '-',
|
|
101
|
+
porque: 'intervalo numérico com en-dash é o mesmo "tell"; hífen ASCII preserva a leitura (decisão do dono, SF10.11).',
|
|
102
|
+
veto_que_alivia: 'lexical-check.cjs --pattern "[\\u2014\\u2013]" --max 0',
|
|
103
|
+
},
|
|
104
|
+
];
|
|
105
|
+
|
|
106
|
+
// ---------------------------------------------------------------------------
|
|
107
|
+
// REGIÕES PROTEGIDAS (AC8 / `DF-SF10.11-3`) - o fixer é NO-OP dentro delas.
|
|
108
|
+
// ---------------------------------------------------------------------------
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Blocos que o FRAMEWORK escreve dentro de um artefato e que o fixer NUNCA pode tocar.
|
|
112
|
+
*
|
|
113
|
+
* Caso vigente: o bloco de MEDIDA do `phash-gate.cjs`, que o veto de pHash grava em
|
|
114
|
+
* `artifacts/visuals.md` - o mesmo artefato sobre o qual este fixer roda DEPOIS. Hoje o bloco é
|
|
115
|
+
* gerado por código e não emite token banido (`NOTE-4` do gate de SF10.8), então a proteção é
|
|
116
|
+
* no-op de fato; ela existe para que continue sendo no-op quando a tabela crescer.
|
|
117
|
+
*
|
|
118
|
+
* Os delimitadores são DECLARADOS aqui (e não importados de `phash-gate.cjs`) para não arrastar um
|
|
119
|
+
* veto blessed que spawna Chrome para dentro do grafo de require do executor. A cópia literal é
|
|
120
|
+
* amarrada por ASSERÇÃO PERMANENTE na suíte (`pod-export-postprocess.test.cjs`), que compara estas
|
|
121
|
+
* constantes com `phash.MEASURE_BEGIN`/`MEASURE_END`: qualquer deriva fica VERMELHA, nunca muda.
|
|
122
|
+
*
|
|
123
|
+
* Marcador de início SEM fim: a região é protegida até o fim do arquivo e um AVISO é registrado no
|
|
124
|
+
* relatório (nunca silencioso). Conservador quanto a corrupção; seguro quanto a evasão, porque o
|
|
125
|
+
* veto roda depois sobre o arquivo INTEIRO - um artefato que "escondesse" texto dentro do marcador
|
|
126
|
+
* continuaria sendo bloqueado pelo `lexical-check`.
|
|
127
|
+
*/
|
|
128
|
+
const PROTECTED_REGIONS = [
|
|
129
|
+
{
|
|
130
|
+
id: 'phash-medida-similaridade',
|
|
131
|
+
begin: '<!-- pc:medida-similaridade:inicio -->',
|
|
132
|
+
end: '<!-- pc:medida-similaridade:fim -->',
|
|
133
|
+
porque: 'bloco de MEDIDA escrito pelo veto phash-gate.cjs no artefato que ele verifica (AC8/NOTE-4 de SF10.8).',
|
|
134
|
+
},
|
|
135
|
+
];
|
|
136
|
+
|
|
137
|
+
// Tetos DECLARADOS (o relatório vira mensagem de correção na SF10.12: precisa ser limitado).
|
|
138
|
+
const MAX_FIX_PASSES = 8; // convergência da tabela; estourar = tabela oscilante = FALHA ALTA.
|
|
139
|
+
const MAX_DIFF_LINES_PER_FILE = 20; // linhas de diff por arquivo no relatório.
|
|
140
|
+
const MAX_DIFF_LINE_CHARS = 200; // recorte de cada linha do diff.
|
|
141
|
+
|
|
142
|
+
// ---------------------------------------------------------------------------
|
|
143
|
+
// Núcleo de texto (puro, sem I/O).
|
|
144
|
+
// ---------------------------------------------------------------------------
|
|
145
|
+
|
|
146
|
+
/** Clone da regex por uso: nunca compartilhar `lastIndex` entre chamadas. */
|
|
147
|
+
function freshRe(rule) {
|
|
148
|
+
return new RegExp(rule.pattern.source, rule.pattern.flags);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function countMatches(text, rule) {
|
|
152
|
+
const m = text.match(freshRe(rule));
|
|
153
|
+
return m ? m.length : 0;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Uma passada da tabela sobre um trecho NÃO protegido. Só contabiliza a regra que de fato mudou o
|
|
158
|
+
* texto (uma substituição idêntica ao original não é uma correção).
|
|
159
|
+
*/
|
|
160
|
+
function applyTableOnce(text, table) {
|
|
161
|
+
let out = text;
|
|
162
|
+
const hits = [];
|
|
163
|
+
for (const rule of table) {
|
|
164
|
+
const before = out;
|
|
165
|
+
const n = countMatches(before, rule);
|
|
166
|
+
if (n === 0) continue;
|
|
167
|
+
out = before.replace(freshRe(rule), rule.replacement);
|
|
168
|
+
if (out !== before) hits.push({ id: rule.id, count: n });
|
|
169
|
+
}
|
|
170
|
+
return { text: out, hits };
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Parte o texto em segmentos alternando protegido/não-protegido. Genérico em N regiões e em N
|
|
175
|
+
* ocorrências de cada uma.
|
|
176
|
+
*/
|
|
177
|
+
function splitProtected(text, regions) {
|
|
178
|
+
let segs = [{ text, protected: false }];
|
|
179
|
+
const warnings = [];
|
|
180
|
+
for (const r of regions) {
|
|
181
|
+
const next = [];
|
|
182
|
+
for (const seg of segs) {
|
|
183
|
+
if (seg.protected) { next.push(seg); continue; }
|
|
184
|
+
let rest = seg.text;
|
|
185
|
+
for (;;) {
|
|
186
|
+
const b = rest.indexOf(r.begin);
|
|
187
|
+
if (b < 0) { next.push({ text: rest, protected: false }); break; }
|
|
188
|
+
const e = rest.indexOf(r.end, b + r.begin.length);
|
|
189
|
+
if (e < 0) {
|
|
190
|
+
warnings.push(`região protegida "${r.id}": marcador de INÍCIO sem marcador de FIM; protegido até o fim do arquivo (o veto segue verificando o arquivo inteiro)`);
|
|
191
|
+
next.push({ text: rest.slice(0, b), protected: false });
|
|
192
|
+
next.push({ text: rest.slice(b), protected: true });
|
|
193
|
+
break;
|
|
194
|
+
}
|
|
195
|
+
const end = e + r.end.length;
|
|
196
|
+
next.push({ text: rest.slice(0, b), protected: false });
|
|
197
|
+
next.push({ text: rest.slice(b, end), protected: true });
|
|
198
|
+
rest = rest.slice(end);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
segs = next;
|
|
202
|
+
}
|
|
203
|
+
return { segs, warnings };
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Aplica a tabela até o PONTO FIXO, fora das regiões protegidas.
|
|
208
|
+
*
|
|
209
|
+
* A idempotência (`fix(fix(x)) === fix(x)`) é ESTRUTURAL, não um acidente feliz de cada regex:
|
|
210
|
+
* a função só devolve um texto sobre o qual mais uma passada da tabela não muda nada. Vale para as
|
|
211
|
+
* duas entradas de hoje e para qualquer entrada futura. Tabela que NUNCA alcança ponto fixo (uma
|
|
212
|
+
* entrada cuja substituição volta a casar e CRESCE, ex.: `A` -> `AA`) estoura `MAX_FIX_PASSES` e
|
|
213
|
+
* FALHA ALTO - nunca fica girando nem devolve resultado dependente de quantas passadas rodaram.
|
|
214
|
+
* (Um par que se desfaz DENTRO da mesma passada, `A`->`B` e `B`->`A`, é identidade: a passada
|
|
215
|
+
* inteira não muda nada, o resultado é estável e o veto continua sendo quem bloqueia.)
|
|
216
|
+
*
|
|
217
|
+
* @returns {{ text: string, changed: boolean, rules: Array<{id:string,count:number}>, replacements: number, warnings: string[] }}
|
|
218
|
+
*/
|
|
219
|
+
function fixText(text, { table = SUBSTITUTIONS, protectedRegions = PROTECTED_REGIONS } = {}) {
|
|
220
|
+
if (typeof text !== 'string') throw new Error('pod-export-postprocess.fixText: `text` precisa ser string');
|
|
221
|
+
const { segs, warnings } = splitProtected(text, protectedRegions);
|
|
222
|
+
const counts = new Map();
|
|
223
|
+
const out = segs.map((seg) => {
|
|
224
|
+
if (seg.protected) return seg.text;
|
|
225
|
+
let cur = seg.text;
|
|
226
|
+
for (let pass = 1; pass <= MAX_FIX_PASSES; pass++) {
|
|
227
|
+
const step = applyTableOnce(cur, table);
|
|
228
|
+
if (step.text === cur) return cur; // ponto fixo
|
|
229
|
+
for (const h of step.hits) counts.set(h.id, (counts.get(h.id) || 0) + h.count);
|
|
230
|
+
cur = step.text;
|
|
231
|
+
}
|
|
232
|
+
if (applyTableOnce(cur, table).text !== cur) {
|
|
233
|
+
throw new Error(
|
|
234
|
+
`pod-export-postprocess: a tabela de substituição NÃO alcançou ponto fixo em ${MAX_FIX_PASSES} passadas - ` +
|
|
235
|
+
'há entrada cuja substituição volta a casar consigo mesma (ex.: `A` -> `AA`). Corrija a tabela; ' +
|
|
236
|
+
'o run PARA aqui (um fixer cujo resultado depende do número de passadas é pior que nenhum fixer).',
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
return cur;
|
|
240
|
+
}).join('');
|
|
241
|
+
const rules = [...counts.entries()].map(([id, count]) => ({ id, count }));
|
|
242
|
+
const replacements = rules.reduce((a, r) => a + r.count, 0);
|
|
243
|
+
return { text: out, changed: out !== text, rules, replacements, warnings };
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
function clip(line) {
|
|
247
|
+
const s = line === undefined ? '' : line;
|
|
248
|
+
return s.length > MAX_DIFF_LINE_CHARS ? `${s.slice(0, MAX_DIFF_LINE_CHARS)}[...]` : s;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/** Diff MÍNIMO por linha (só o que mudou), limitado - vira mensagem de modelo na SF10.12. */
|
|
252
|
+
function lineDiff(before, after) {
|
|
253
|
+
const A = before.split('\n');
|
|
254
|
+
const B = after.split('\n');
|
|
255
|
+
const lines = [];
|
|
256
|
+
let truncated = false;
|
|
257
|
+
const n = Math.max(A.length, B.length);
|
|
258
|
+
for (let i = 0; i < n; i++) {
|
|
259
|
+
if (A[i] === B[i]) continue;
|
|
260
|
+
if (lines.length >= MAX_DIFF_LINES_PER_FILE) { truncated = true; break; }
|
|
261
|
+
lines.push({ line: i + 1, before: clip(A[i]), after: clip(B[i]) });
|
|
262
|
+
}
|
|
263
|
+
return { lines, truncated };
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// ---------------------------------------------------------------------------
|
|
267
|
+
// Domínio + I/O (o mínimo, síncrono).
|
|
268
|
+
// ---------------------------------------------------------------------------
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Domínio do fixer (`DF-SF10.11-1`): paths de `write_file` BEM-SUCEDIDOS da tentativa, sem
|
|
272
|
+
* duplicatas e na ordem de escrita. `openrouter_image` (binário), `read_image` e `http_fetch`
|
|
273
|
+
* ficam de fora por construção - não é `write_file`.
|
|
274
|
+
*/
|
|
275
|
+
function writtenPathsFromTrail(toolTrail) {
|
|
276
|
+
const seen = new Set();
|
|
277
|
+
const out = [];
|
|
278
|
+
for (const t of toolTrail || []) {
|
|
279
|
+
if (!t || t.name !== 'write_file' || t.ok !== true) continue;
|
|
280
|
+
const rel = typeof t.arg === 'string' ? t.arg.trim() : '';
|
|
281
|
+
if (rel === '' || seen.has(rel)) continue;
|
|
282
|
+
seen.add(rel);
|
|
283
|
+
out.push(rel);
|
|
284
|
+
}
|
|
285
|
+
return out;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* FIND-1 (gate de QA da SF10.11, débito Low pago na SF10.12): paths que `openrouter_image` gravou
|
|
290
|
+
* COM SUCESSO nesta tentativa. Conteúdo BINÁRIO - ler como UTF-8 e regravar corrompe (medido pelo
|
|
291
|
+
* QA: 16B -> 21B, sha alterado, bytes inválidos virando U+FFFD).
|
|
292
|
+
*
|
|
293
|
+
* Existe porque `write_file` e `openrouter_image` compartilham o MESMO espaço de nomes dentro do
|
|
294
|
+
* runDir: um path escrito como texto e DEPOIS sobrescrito por uma imagem continua no trail de
|
|
295
|
+
* `write_file`, e o domínio de `DF-SF10.11-1` o alcançaria. A subtração é por path ABSOLUTO
|
|
296
|
+
* resolvido (em `postProcessAttempt`), nunca por comparação de string: `./assets/x.png` e
|
|
297
|
+
* `assets/x.png` são o mesmo arquivo e uma comparação literal deixaria a evasão aberta.
|
|
298
|
+
*
|
|
299
|
+
* Só `ok === true`: `openrouterImage` resolve o path e só grava DEPOIS de a API responder
|
|
300
|
+
* (`pod-export-tools.cjs`), então uma chamada falha não deixou binário naquele path - subtrair por
|
|
301
|
+
* ela removeria do domínio um arquivo de TEXTO legítimo, que é a perda oposta (o fixer deixaria de
|
|
302
|
+
* ajudar em silêncio).
|
|
303
|
+
*/
|
|
304
|
+
function imagePathsFromTrail(toolTrail) {
|
|
305
|
+
const seen = new Set();
|
|
306
|
+
const out = [];
|
|
307
|
+
for (const t of toolTrail || []) {
|
|
308
|
+
if (!t || t.name !== 'openrouter_image' || t.ok !== true) continue;
|
|
309
|
+
const rel = typeof t.arg === 'string' ? t.arg.trim() : '';
|
|
310
|
+
if (rel === '' || seen.has(rel)) continue;
|
|
311
|
+
seen.add(rel);
|
|
312
|
+
out.push(rel);
|
|
313
|
+
}
|
|
314
|
+
return out;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Lê, corrige e REESCREVE um arquivo do domínio. Fail-loud sem `catch` cego: `ENOENT` é o ÚNICO
|
|
319
|
+
* errno com tratamento SANCIONADO (vira mensagem acionável e PARA o run - sumiço entre a escrita e
|
|
320
|
+
* o fix é impossível pelas tools atuais, logo é sinal de bug); qualquer outro errno sobe cru.
|
|
321
|
+
*/
|
|
322
|
+
function fixFile(absPath, relPath, opts) {
|
|
323
|
+
let before;
|
|
324
|
+
try {
|
|
325
|
+
before = fs.readFileSync(absPath, 'utf8');
|
|
326
|
+
} catch (e) {
|
|
327
|
+
if (e.code === 'ENOENT') {
|
|
328
|
+
throw new Error(
|
|
329
|
+
`pod-export-postprocess: "${relPath}" está no toolTrail de write_file da tentativa mas NÃO existe ` +
|
|
330
|
+
`em disco (${absPath}). As tools do export não removem arquivo: isso é sinal de BUG, e o run PARA ` +
|
|
331
|
+
'aqui em vez de verificar um estado que ninguém sabe descrever (DF-SF10.11-1).',
|
|
332
|
+
);
|
|
333
|
+
}
|
|
334
|
+
throw e;
|
|
335
|
+
}
|
|
336
|
+
const r = fixText(before, opts);
|
|
337
|
+
if (!r.changed) return { path: relPath, changed: false, replacements: 0, rules: [], diff: [], diffTruncated: false, warnings: r.warnings };
|
|
338
|
+
fs.writeFileSync(absPath, r.text, 'utf8');
|
|
339
|
+
const d = lineDiff(before, r.text);
|
|
340
|
+
return { path: relPath, changed: true, replacements: r.replacements, rules: r.rules, diff: d.lines, diffTruncated: d.truncated, warnings: r.warnings };
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* PASSO 2 do laço (`DF-SF10.11+12-1`): corrige TODOS os arquivos escritos na tentativa, ANTES de
|
|
345
|
+
* `motor.advance`. Chamado por `execPhase` em `pod-export-executor.cjs`.
|
|
346
|
+
*
|
|
347
|
+
* @returns relatório ESTRUTURADO (AC4) - evidência de auditoria E insumo da mensagem de correção
|
|
348
|
+
* da SF10.12 (`DF-SF10.12-1(ii)`), nunca só log:
|
|
349
|
+
* { changed, scanned, totalReplacements, files: [{ path, replacements, rules[], diff[], diffTruncated }],
|
|
350
|
+
* warnings[], skippedBinary[] }
|
|
351
|
+
* `scanned` conta os arquivos de TEXTO efetivamente lidos (o domínio MENOS `skippedBinary`);
|
|
352
|
+
* `skippedBinary` nomeia os paths que uma imagem sobrescreveu nesta tentativa (FIND-1) - nunca
|
|
353
|
+
* silencioso, pelo mesmo princípio dos `warnings`.
|
|
354
|
+
*/
|
|
355
|
+
function postProcessAttempt({ runDir, toolTrail, log = () => {}, table = SUBSTITUTIONS, protectedRegions = PROTECTED_REGIONS }) {
|
|
356
|
+
if (!runDir) throw new Error('pod-export-postprocess: `runDir` é obrigatório');
|
|
357
|
+
const rels = writtenPathsFromTrail(toolTrail);
|
|
358
|
+
// FIND-1: o domínio de texto MENOS os arquivos que uma imagem sobrescreveu nesta tentativa.
|
|
359
|
+
// Comparação por path ABSOLUTO resolvido pela MESMA função que as tools usam para gravar - é o
|
|
360
|
+
// que torna a subtração imune a grafias diferentes do mesmo arquivo.
|
|
361
|
+
const binaryAbs = new Set(imagePathsFromTrail(toolTrail).map((rel) => tools.confinedResolveWritable(runDir, rel)));
|
|
362
|
+
const files = [];
|
|
363
|
+
const warnings = [];
|
|
364
|
+
const skippedBinary = [];
|
|
365
|
+
let totalReplacements = 0;
|
|
366
|
+
for (const rel of rels) {
|
|
367
|
+
// Herda a contenção das tools (traversal, path absoluto e escrita sob `inputs/` já negados).
|
|
368
|
+
const abs = tools.confinedResolveWritable(runDir, rel);
|
|
369
|
+
if (binaryAbs.has(abs)) { skippedBinary.push(rel); continue; } // FIND-1 - nunca ler binário como UTF-8.
|
|
370
|
+
const r = fixFile(abs, rel, { table, protectedRegions });
|
|
371
|
+
for (const w of r.warnings) warnings.push(`${rel}: ${w}`);
|
|
372
|
+
if (!r.changed) continue;
|
|
373
|
+
files.push({ path: r.path, replacements: r.replacements, rules: r.rules, diff: r.diff, diffTruncated: r.diffTruncated });
|
|
374
|
+
totalReplacements += r.replacements;
|
|
375
|
+
}
|
|
376
|
+
const report = { changed: files.length > 0, scanned: rels.length - skippedBinary.length, totalReplacements, files, warnings, skippedBinary };
|
|
377
|
+
// AC4 - NUNCA silencioso: o que mudou, em que arquivo e por qual entrada da tabela.
|
|
378
|
+
if (report.changed) {
|
|
379
|
+
for (const f of files) {
|
|
380
|
+
log(` [fixer] ${f.path}: ${f.replacements} substituição(ões) [${f.rules.map((x) => `${x.id}x${x.count}`).join(', ')}]`);
|
|
381
|
+
}
|
|
382
|
+
} else if (report.scanned > 0) {
|
|
383
|
+
log(` [fixer] nada a corrigir em ${report.scanned} arquivo(s) escrito(s) nesta tentativa`);
|
|
384
|
+
}
|
|
385
|
+
// FIND-1 - a subtração do domínio é AUDITÁVEL: o operador vê que o arquivo existiu no trail de
|
|
386
|
+
// write_file e foi deixado intacto de propósito, em vez de sumir do relatório sem explicação.
|
|
387
|
+
for (const p of skippedBinary) log(` [fixer] ${p}: PULADO (sobrescrito por openrouter_image nesta tentativa; binário nunca é lido como UTF-8)`);
|
|
388
|
+
for (const w of warnings) log(` [fixer] AVISO: ${w}`);
|
|
389
|
+
return report;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
/**
|
|
393
|
+
* COSTURA DECLARADA PARA A SF10.12 (`DF-SF10.12-1(ii)`): renderiza o relatório como bloco de texto
|
|
394
|
+
* para a mensagem que retoma a conversa depois do veto reprovar - o modelo precisa saber o que o
|
|
395
|
+
* fixer já mudou no arquivo que ele está vendo, senão reescreve por cima. Produção passa a chamar
|
|
396
|
+
* isto na SF10.12; aqui ele nasce testado, junto do relatório que o alimenta (AC4).
|
|
397
|
+
*/
|
|
398
|
+
function renderFixMessage(report) {
|
|
399
|
+
if (!report || !report.changed) return '';
|
|
400
|
+
const L = ['## Correções mecânicas JÁ APLICADAS por código (não as desfaça)'];
|
|
401
|
+
L.push('Um pós-processador determinístico normalizou os arquivos abaixo DEPOIS da sua escrita e ANTES da verificação.');
|
|
402
|
+
L.push('O texto em disco é o "depois". Mantenha essa forma ao editar.');
|
|
403
|
+
for (const f of report.files) {
|
|
404
|
+
L.push('', `### ${f.path} (${f.replacements} substituição(ões): ${f.rules.map((r) => r.id).join(', ')})`);
|
|
405
|
+
for (const d of f.diff) L.push(`- linha ${d.line}: "${d.before}" -> "${d.after}"`);
|
|
406
|
+
if (f.diffTruncated) L.push(`- (diff truncado em ${MAX_DIFF_LINES_PER_FILE} linhas)`);
|
|
407
|
+
}
|
|
408
|
+
return L.join('\n');
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
module.exports = {
|
|
412
|
+
SUBSTITUTIONS,
|
|
413
|
+
PROTECTED_REGIONS,
|
|
414
|
+
MAX_FIX_PASSES,
|
|
415
|
+
MAX_DIFF_LINES_PER_FILE,
|
|
416
|
+
MAX_DIFF_LINE_CHARS,
|
|
417
|
+
fixText,
|
|
418
|
+
applyTableOnce,
|
|
419
|
+
splitProtected,
|
|
420
|
+
lineDiff,
|
|
421
|
+
countMatches,
|
|
422
|
+
writtenPathsFromTrail,
|
|
423
|
+
imagePathsFromTrail,
|
|
424
|
+
fixFile,
|
|
425
|
+
postProcessAttempt,
|
|
426
|
+
renderFixMessage,
|
|
427
|
+
};
|