@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,368 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
/**
|
|
4
|
+
* forge-upgrade-pod.cjs — formaliza um pod EXISTENTE em v0.3 (Story SF1.4, item e).
|
|
5
|
+
*
|
|
6
|
+
* upgrade-in-place (SPEC §G4): NÃO regenera do zero. Preserva os agentes já
|
|
7
|
+
* validados, gera os artefatos ausentes proporcionais ao tier, e aplica a
|
|
8
|
+
* RECONCILIAÇÃO WORKFLOW-AWARE BOUNDED (v4) sobre cada agente preservado.
|
|
9
|
+
*
|
|
10
|
+
* Pipeline: (1) *assess de tier sobre o pod existente → (2) gera artefatos
|
|
11
|
+
* ausentes (forge-generate.cjs, preservando agentes) → (3) reconciliação bounded
|
|
12
|
+
* → (4) valida estático (validate-pod-workflow.cjs) → (5) smoke dinâmico (SF1.3,
|
|
13
|
+
* quando disponível) → (6) pod-critic *review (gate G6) → (7) registro.
|
|
14
|
+
* Passos 5–6 são despachados FORA deste script (agente/QA); ele cobre 1–4 e a
|
|
15
|
+
* reconciliação, e SINALIZA quando um agente excede o bound (recomenda *new).
|
|
16
|
+
*
|
|
17
|
+
* Bound da reconciliação (v4) — APENAS:
|
|
18
|
+
* (i) remover auto-sequenciamento / auto-chamada a outro agente;
|
|
19
|
+
* (ii) escopar a saída do agente ao artefato da etapa (nota workflow-aware).
|
|
20
|
+
* Qualquer coisa além disso (reescrever papel, refazer comandos, redividir
|
|
21
|
+
* responsabilidades — ex.: agente que DECIDE sozinho entre caminhos do processo)
|
|
22
|
+
* EXCEDE o bound ⇒ o comando reporta e recomenda `*new` para aquele agente,
|
|
23
|
+
* sem forçar a reconciliação (Risco 2).
|
|
24
|
+
*
|
|
25
|
+
* Uso:
|
|
26
|
+
* node scripts/forge-upgrade-pod.cjs <podDir> [--critical] [--handoffs N] [--apply]
|
|
27
|
+
* (sem --apply: dry-run, não escreve nos agentes; imprime o plano)
|
|
28
|
+
*
|
|
29
|
+
* Node >= 18, sem dependências externas.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
const fs = require('node:fs');
|
|
33
|
+
const path = require('node:path');
|
|
34
|
+
const { classifyTier } = require('./forge-assess-tier.cjs');
|
|
35
|
+
const { generatePod } = require('./forge-generate.cjs');
|
|
36
|
+
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// Padrões de reconciliação (v4). Auditáveis e num único lugar.
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
|
|
41
|
+
// (i) Auto-sequenciamento: o agente chama/invoca/despacha OUTRO agente por conta
|
|
42
|
+
// própria (o runner passa a orquestrar, não o agente). Casável por linha.
|
|
43
|
+
const AUTO_SEQUENCING = [
|
|
44
|
+
/\bdepois\s+(disso|de\s+\w+)[^.]*\b(chame|invoque|acione|despache|passe\s+para|delegue)\b/i,
|
|
45
|
+
/\b(chame|invoque|acione|despache|delegue)\s+(o\s+)?(agente|subagente)\b/i,
|
|
46
|
+
/\bem\s+seguida[^.]*\b(chame|invoque|acione|despache)\b/i,
|
|
47
|
+
/\bpassa?\s+(a\s+bola|o\s+bastão)\s+(para|ao)\b/i,
|
|
48
|
+
];
|
|
49
|
+
|
|
50
|
+
// (ii) Fora do bound: o agente ORQUESTRA/DECIDE o fluxo — escolhe sozinho entre
|
|
51
|
+
// caminhos do processo, não apenas produz um artefato. Isso é cirurgia de
|
|
52
|
+
// capacidade, não ajuste de prosa ⇒ recomenda *new.
|
|
53
|
+
//
|
|
54
|
+
// [SF6.1 fix round — CONCERNS-1] O 3º regex era `/orquestr[ao]\b[^.]*\b(...agentes)\b/`:
|
|
55
|
+
// o `[^.]*` GULOSO (inclui newlines) casava "Orquestra a criação de novos pods,
|
|
56
|
+
// AGENTES" (papel-de-domínio: `agentes` é OBJETO DA CRIAÇÃO, não alvo de orquestração
|
|
57
|
+
// de fluxo) como se fosse auto-sequenciamento em runtime — falso-positivo em QUALQUER
|
|
58
|
+
// agente orquestrador. Refino: a palavra-de-processo tem de ser o OBJETO DIRETO (near)
|
|
59
|
+
// de "orquestra" — só artigos/quantificadores entre elas —, distinguindo "orquestra
|
|
60
|
+
// AS ETAPAS / OS AGENTES" (fluxo/dispatch, out-of-bound) de "orquestra A CRIAÇÃO DE
|
|
61
|
+
// agentes" (domínio: um substantivo de criação governa o objeto → não casa). Sem `[^.]*`.
|
|
62
|
+
const OUT_OF_BOUND = [
|
|
63
|
+
/\bdecid[ei]\s+(sozinho\s+)?(entre|qual)\b[^.]*\bcaminho/i,
|
|
64
|
+
/\bescolhe\s+(o\s+)?(caminho|fluxo|rota|pipeline)\b/i,
|
|
65
|
+
/\borquestr[ao]\s+(?:(?:o|a|os|as|todo|toda|todos|todas)\s+)*(?:fases?|etapas?|pipelines?|fluxos?|agentes?|processos?)\b/i,
|
|
66
|
+
/\bramifica\s+(o\s+)?(fluxo|processo)\s+entre\b/i,
|
|
67
|
+
];
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Reconcilia o texto de UM agente dentro do bound.
|
|
71
|
+
* Retorna { status, text, removed[], reason }.
|
|
72
|
+
* status 'recommend-new' ⇒ excede o bound; text inalterado, reason preenchido.
|
|
73
|
+
* status 'reconciled' ⇒ dentro do bound; text ajustado, removed[] lista as
|
|
74
|
+
* linhas de auto-sequenciamento retiradas.
|
|
75
|
+
* status 'clean' ⇒ nada a reconciliar.
|
|
76
|
+
*/
|
|
77
|
+
function reconcileAgent(text) {
|
|
78
|
+
// Detecção de excesso de bound PRIMEIRO — nunca "forçar" preservação.
|
|
79
|
+
for (const re of OUT_OF_BOUND) {
|
|
80
|
+
const m = text.match(re);
|
|
81
|
+
if (m) {
|
|
82
|
+
return {
|
|
83
|
+
status: 'recommend-new',
|
|
84
|
+
text,
|
|
85
|
+
removed: [],
|
|
86
|
+
reason: `agente decide/orquestra o fluxo ("${m[0].trim()}") — excede o bound (reescrever papel), recomenda *new`,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const lines = text.split(/\r?\n/);
|
|
92
|
+
const removed = [];
|
|
93
|
+
const kept = [];
|
|
94
|
+
for (const line of lines) {
|
|
95
|
+
if (AUTO_SEQUENCING.some((re) => re.test(line))) {
|
|
96
|
+
removed.push(line.trim());
|
|
97
|
+
continue; // (i) remove a auto-chamada — o runner orquestra.
|
|
98
|
+
}
|
|
99
|
+
kept.push(line);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (removed.length === 0) {
|
|
103
|
+
return { status: 'clean', text, removed: [], reason: null };
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// (ii) escopar output à etapa: nota workflow-aware, sem reescrever o papel.
|
|
107
|
+
let out = kept.join('\n');
|
|
108
|
+
const scopeNote =
|
|
109
|
+
'\n> [reconciliação v0.3] Este agente é invocado POR ETAPA pelo runner ' +
|
|
110
|
+
'(`pc-run-pod`): produz apenas o artefato da sua etapa, a partir do template, ' +
|
|
111
|
+
'e NÃO se auto-sequencia — a orquestração é do runner.\n';
|
|
112
|
+
if (!out.includes('[reconciliação v0.3]')) out += scopeNote;
|
|
113
|
+
|
|
114
|
+
return { status: 'reconciled', text: out, removed, reason: null };
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** Lê os agentes do pod (arquivos .md em agents/, exceto README). */
|
|
118
|
+
function readAgents(podDir) {
|
|
119
|
+
const dir = path.join(podDir, 'agents');
|
|
120
|
+
if (!fs.existsSync(dir)) return [];
|
|
121
|
+
return fs
|
|
122
|
+
.readdirSync(dir)
|
|
123
|
+
.filter((f) => f.endsWith('.md') && f !== 'README.md')
|
|
124
|
+
.map((f) => ({ name: f.replace(/\.md$/, ''), file: path.join(dir, f) }));
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** Erro de fail-loud: ordem do DAG não declarada (ADR-005 Decisão B → exit 2). */
|
|
128
|
+
class SpecRequiredError extends Error {
|
|
129
|
+
constructor(message) {
|
|
130
|
+
super(message);
|
|
131
|
+
this.name = 'SpecRequiredError';
|
|
132
|
+
this.exitCode = 2;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** Carrega a spec de ordem: `--spec <file>` OU `pods/<pod>/pod-spec.json`. */
|
|
137
|
+
function loadSpec(podDir, opts) {
|
|
138
|
+
const specPath = opts.spec ? path.resolve(opts.spec) : path.join(podDir, 'pod-spec.json');
|
|
139
|
+
if (!fs.existsSync(specPath)) return null;
|
|
140
|
+
let data;
|
|
141
|
+
try {
|
|
142
|
+
data = JSON.parse(fs.readFileSync(specPath, 'utf8'));
|
|
143
|
+
} catch (e) {
|
|
144
|
+
throw new Error(`pod-spec.json inválido (${path.relative(process.cwd(), specPath)}): ${e.message}`);
|
|
145
|
+
}
|
|
146
|
+
return { path: specPath, data };
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/** Fontes candidatas para AUTORAR a spec (README do pod; wf-*.yaml de squad legado). */
|
|
150
|
+
function specSourceCandidates(podDir) {
|
|
151
|
+
const out = [];
|
|
152
|
+
const readme = path.join(podDir, 'README.md');
|
|
153
|
+
if (fs.existsSync(readme)) out.push(`${path.relative(process.cwd(), readme)} (fluxo descrito na prosa do pod)`);
|
|
154
|
+
// squad legado correlato: <repo>/squads/<base>/workflows, base = nome do pod sem sufixo "-method".
|
|
155
|
+
const base = path.basename(podDir).replace(/-method$/, '');
|
|
156
|
+
const legacyWf = path.resolve(podDir, '..', '..', 'squads', base, 'workflows');
|
|
157
|
+
if (fs.existsSync(legacyWf)) {
|
|
158
|
+
for (const f of fs.readdirSync(legacyWf).filter((n) => /^wf-.*\.ya?ml$/.test(n))) {
|
|
159
|
+
out.push(`${path.relative(process.cwd(), path.join(legacyWf, f))} (workflow legado — evidência de reconciliação, ADR-005 §B4)`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (out.length === 0) out.push('(nenhuma fonte auto-detectada; autore pod-spec.json a partir do domínio)');
|
|
163
|
+
return out;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Executa o upgrade-in-place sobre um pod existente.
|
|
168
|
+
* A ORDEM DO DAG é DADO DECLARADO (ADR-005 Decisão B): exige `pods/<pod>/pod-spec.json`
|
|
169
|
+
* ou `--spec <file>`. Sem declaração ⇒ SpecRequiredError (exit 2). NUNCA readdir/alfabético.
|
|
170
|
+
* apply=false ⇒ dry-run (não escreve nos agentes). Retorna um relatório estruturado.
|
|
171
|
+
*/
|
|
172
|
+
function upgradePod(podDir, opts = {}) {
|
|
173
|
+
const apply = Boolean(opts.apply);
|
|
174
|
+
const agents = readAgents(podDir); // TODOS os agentes do pod (reconciliação + tier).
|
|
175
|
+
if (agents.length === 0) throw new Error(`nenhum agente em ${podDir}/agents/`);
|
|
176
|
+
|
|
177
|
+
// (0) Fonte da ordem do DAG — obrigatória (ADR-005 Decisão B). Fail-loud sem ela.
|
|
178
|
+
const loaded = loadSpec(podDir, opts);
|
|
179
|
+
if (!loaded) {
|
|
180
|
+
const candidates = specSourceCandidates(podDir);
|
|
181
|
+
throw new SpecRequiredError(
|
|
182
|
+
`ordem do DAG não declarada para o pod "${path.basename(podDir)}". ` +
|
|
183
|
+
`Crie pods/${path.basename(podDir)}/pod-spec.json (ou passe --spec <file>): ` +
|
|
184
|
+
`spec.agents[] ORDENADO = ordem topológica do DAG (ADR-005 — a ordem é dado declarado, ` +
|
|
185
|
+
`nunca readdir/alfabético).\nFontes candidatas para AUTORAR a spec:\n` +
|
|
186
|
+
candidates.map((c) => ` - ${c}`).join('\n'),
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
const spec = loaded.data;
|
|
190
|
+
const specAgents = Array.isArray(spec.agents) ? spec.agents : [];
|
|
191
|
+
if (specAgents.length === 0) throw new Error(`spec sem agents[] ordenado (${path.relative(process.cwd(), loaded.path)})`);
|
|
192
|
+
|
|
193
|
+
// (1) Valida a spec contra o disco. Agente na spec sem arquivo ⇒ erro.
|
|
194
|
+
const diskNames = new Set(agents.map((a) => a.name));
|
|
195
|
+
const workflowNames = new Set();
|
|
196
|
+
for (const sa of specAgents) {
|
|
197
|
+
const nm = typeof sa === 'string' ? sa : sa.name;
|
|
198
|
+
if (!nm) throw new Error(`entrada de agents[] na spec sem "name"`);
|
|
199
|
+
if (!diskNames.has(nm)) throw new Error(`agente "${nm}" declarado na spec sem arquivo em agents/${nm}.md`);
|
|
200
|
+
workflowNames.add(nm);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// (2) *assess de tier sobre TODOS os agentes do pod (ADR-005 §B3), não só os do workflow.
|
|
204
|
+
const assessment = classifyTier({
|
|
205
|
+
pod: spec.pod || path.basename(podDir),
|
|
206
|
+
agents: agents.map((a) => a.name),
|
|
207
|
+
workflows: fs.existsSync(path.join(podDir, 'workflows'))
|
|
208
|
+
? fs.readdirSync(path.join(podDir, 'workflows')).filter((f) => /^wf-.*\.ya?ml$/.test(f)).length
|
|
209
|
+
: 0,
|
|
210
|
+
handoffs: Number(opts.handoffs || spec.handoffs || 0),
|
|
211
|
+
dna: Boolean(opts.dna || spec.dna),
|
|
212
|
+
critical: Boolean(opts.critical || spec.critical),
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
// (3) gera artefatos na ORDEM DA SPEC (agents[] ordenado = etapas do DAG). O generator
|
|
216
|
+
// só escreve em workflows/ templates/ squad-io.yaml memory/, nunca em agents/ (AC6).
|
|
217
|
+
const genSpec = {
|
|
218
|
+
pod: spec.pod || path.basename(podDir),
|
|
219
|
+
workflowId: spec.workflowId,
|
|
220
|
+
agents: specAgents, // ORDEM = declaração da spec (com sections/veto por etapa).
|
|
221
|
+
handoffs: Number(opts.handoffs || spec.handoffs || 0),
|
|
222
|
+
dna: Boolean(opts.dna || spec.dna),
|
|
223
|
+
critical: Boolean(opts.critical || spec.critical),
|
|
224
|
+
// Forma STANDARD-interface (ADR-004 adendo): propaga `interface` da spec — suprime
|
|
225
|
+
// wf/squad-io fabricados (validado contra handoffs:0 dentro de generatePod).
|
|
226
|
+
interface: spec.interface === true,
|
|
227
|
+
// Memória em SIMPLE segue opcional no upgrade (SPEC §G2): mesma flag da geração.
|
|
228
|
+
memoryOpt: Boolean(opts.withMemory) || spec.memoryOpt === true,
|
|
229
|
+
// SF12.4a/ADR-030 — propaga os 3 campos canônicos + escada_de_voz da spec CARREGADA
|
|
230
|
+
// (`--spec`/`pod-spec.json`) para a spec EFETIVAMENTE RECEBIDA por generatePod
|
|
231
|
+
// (AC48c cláusula 1: o relato de `derived` é sobre ESTE objeto, não sobre disco).
|
|
232
|
+
// Ausentes na spec carregada ⇒ ausentes aqui também ⇒ generatePod reporta (AC48c).
|
|
233
|
+
ritmo: spec.ritmo,
|
|
234
|
+
contrato_entrada: spec.contrato_entrada,
|
|
235
|
+
entregavel: spec.entregavel,
|
|
236
|
+
escada_de_voz: spec.escada_de_voz,
|
|
237
|
+
};
|
|
238
|
+
// STANDARD/COMPLEX recebe/mantém a memória operante; SIMPLE só sob --with-memory.
|
|
239
|
+
// C.1/SF3.1 (fecha G1): repassa o `assessment.tier` AGREGADO — computado acima sobre
|
|
240
|
+
// TODOS os agentes+workflows do pod (linhas ~195-204) mas até aqui IGNORADO — como
|
|
241
|
+
// tierOverride. Antes, generatePod re-classificava pela spec isolada (só os agentes
|
|
242
|
+
// do workflow), rebaixando silenciosamente um pod COMPLEX a SIMPLE e pulando
|
|
243
|
+
// squad-io/memória. Agora o aparato proporcional ao pod inteiro é gerado.
|
|
244
|
+
// Bug real (ADR-004 §2, confirmado na branch SF6.2): generatePod era chamado
|
|
245
|
+
// INCONDICIONALMENTE — até o dry-run escrevia no pod. Fix: dry-run repassa
|
|
246
|
+
// dryRun=true → generatePod computa o PLANO (written[]/skipped[]) SEM tocar disco.
|
|
247
|
+
// Toda escrita (generatePod + reconciliação §245 + spec §250) fica sob --apply.
|
|
248
|
+
const gen = generatePod(genSpec, podDir, {
|
|
249
|
+
withMemory: Boolean(opts.withMemory) || spec.memoryOpt === true,
|
|
250
|
+
tierOverride: assessment.tier,
|
|
251
|
+
dryRun: !apply,
|
|
252
|
+
// SF12.4a/ADR-030 Bloco O (AC48/Emenda 1) — `*upgrade-pod` é sempre 'derived': a spec
|
|
253
|
+
// é SINTETIZADA de um pod já em disco, nunca autorada fresca. Preserva o comportamento
|
|
254
|
+
// atual (campo ausente nunca para o processo) e reporta o que falta (AC48c).
|
|
255
|
+
specOrigin: 'derived',
|
|
256
|
+
// SF12.6/ADR-030 Bloco C (Decisão 7.2) — leniência POR PATH para o guard novo (`wf`
|
|
257
|
+
// fail-loud). `opts.allowDivergentOverwrite` (repetível via `--allow-divergent-overwrite
|
|
258
|
+
// <path>`) chega como array de strings relativas ao cwd — resolvidas a absoluto aqui
|
|
259
|
+
// (generatePod compara por path.resolve). Ausente ⇒ [] (leniência SEMPRE por path,
|
|
260
|
+
// nunca "sim para tudo" — AC12).
|
|
261
|
+
allowDivergentOverwrite: (opts.allowDivergentOverwrite || []).map((p) => path.resolve(p)),
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
// (4) reconciliação bounded sobre CADA agente do pod (inclui os fora do workflow).
|
|
265
|
+
const reconciliation = [];
|
|
266
|
+
for (const a of agents) {
|
|
267
|
+
const before = fs.readFileSync(a.file, 'utf8');
|
|
268
|
+
const r = reconcileAgent(before);
|
|
269
|
+
const inWorkflow = workflowNames.has(a.name);
|
|
270
|
+
reconciliation.push({ agent: a.name, status: r.status, removed: r.removed, reason: r.reason, inWorkflow });
|
|
271
|
+
if (apply && r.status === 'reconciled') fs.writeFileSync(a.file, r.text);
|
|
272
|
+
// status 'recommend-new' e 'clean' NÃO alteram o arquivo (preservação).
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// (5) persiste a spec COM o pod quando aplicada via --spec (fonte da verdade em git).
|
|
276
|
+
if (apply && opts.spec) {
|
|
277
|
+
const dest = path.join(podDir, 'pod-spec.json');
|
|
278
|
+
if (path.resolve(opts.spec) !== path.resolve(dest)) {
|
|
279
|
+
fs.writeFileSync(dest, JSON.stringify(spec, null, 2) + '\n');
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
const recommendNew = reconciliation.filter((r) => r.status === 'recommend-new').map((r) => r.agent);
|
|
284
|
+
const notInWorkflow = reconciliation.filter((r) => !r.inWorkflow).map((r) => r.agent);
|
|
285
|
+
|
|
286
|
+
return {
|
|
287
|
+
tier: assessment.tier,
|
|
288
|
+
assessment,
|
|
289
|
+
generated: gen.written,
|
|
290
|
+
skipped: gen.skipped,
|
|
291
|
+
// SF12.6/ADR-030 Bloco C — repassa o relato por classe do guard novo (merged[] já
|
|
292
|
+
// existia; divergent[]/preserved[] são novos — AC11-AC15).
|
|
293
|
+
merged: gen.merged,
|
|
294
|
+
divergent: gen.divergent,
|
|
295
|
+
preserved: gen.preserved,
|
|
296
|
+
reconciliation,
|
|
297
|
+
recommendNew,
|
|
298
|
+
notInWorkflow,
|
|
299
|
+
applied: apply,
|
|
300
|
+
specPath: loaded.path,
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
function main() {
|
|
305
|
+
const args = process.argv.slice(2);
|
|
306
|
+
let podDir = null;
|
|
307
|
+
const opts = { allowDivergentOverwrite: [] };
|
|
308
|
+
for (let i = 0; i < args.length; i++) {
|
|
309
|
+
if (args[i] === '--apply') opts.apply = true;
|
|
310
|
+
else if (args[i] === '--critical') opts.critical = true;
|
|
311
|
+
else if (args[i] === '--dna') opts.dna = true;
|
|
312
|
+
else if (args[i] === '--with-memory') opts.withMemory = true;
|
|
313
|
+
else if (args[i] === '--handoffs') opts.handoffs = Number(args[++i]);
|
|
314
|
+
else if (args[i] === '--spec') opts.spec = args[++i];
|
|
315
|
+
// SF12.6/ADR-030 Bloco C (AC18, Decisão 7.2) — repetível; forma nua (sem valor) é um erro
|
|
316
|
+
// de uso comum, não a leniência global proibida (essa é sobre a FORMA do dado dentro de
|
|
317
|
+
// generatePod — aqui é só coleta de path por path).
|
|
318
|
+
else if (args[i] === '--allow-divergent-overwrite') opts.allowDivergentOverwrite.push(args[++i]);
|
|
319
|
+
else podDir = args[i];
|
|
320
|
+
}
|
|
321
|
+
if (!podDir) {
|
|
322
|
+
console.error('Uso: node scripts/forge-upgrade-pod.cjs <podDir> [--spec <file>] [--critical] [--dna] ' +
|
|
323
|
+
'[--with-memory] [--handoffs N] [--allow-divergent-overwrite <path>]... [--apply]');
|
|
324
|
+
process.exit(2);
|
|
325
|
+
}
|
|
326
|
+
let r;
|
|
327
|
+
try {
|
|
328
|
+
r = upgradePod(path.resolve(podDir), opts);
|
|
329
|
+
} catch (e) {
|
|
330
|
+
console.error(`[erro] ${e.message}`);
|
|
331
|
+
process.exit(e && e.exitCode ? e.exitCode : 1);
|
|
332
|
+
}
|
|
333
|
+
console.log(`tier: ${r.tier}${r.applied ? '' : ' (dry-run — use --apply para gravar a reconciliação)'}`);
|
|
334
|
+
console.log(`ordem do DAG: declarada em ${path.relative(process.cwd(), r.specPath)}`);
|
|
335
|
+
console.log('artefatos gerados (ausentes):');
|
|
336
|
+
for (const w of r.generated) console.log(` + ${path.relative(process.cwd(), w)}`);
|
|
337
|
+
if (r.merged && r.merged.length) {
|
|
338
|
+
console.log('merge (squad-io.yaml — seções preservadas + novas):');
|
|
339
|
+
for (const m of r.merged) console.log(` ~ ${path.relative(process.cwd(), m)}`);
|
|
340
|
+
}
|
|
341
|
+
if (r.preserved && r.preserved.length) {
|
|
342
|
+
console.log('templates PRESERVADOS (divergem do que seria gerado — write-once, ADR-030 Decisão 7.1):');
|
|
343
|
+
for (const p of r.preserved) console.log(` = ${path.relative(process.cwd(), p)}`);
|
|
344
|
+
}
|
|
345
|
+
if (r.divergent && r.divergent.length) {
|
|
346
|
+
console.log('artefatos DIVERGENTES da spec (guard por classe, ADR-030 Bloco C):');
|
|
347
|
+
for (const d of r.divergent) console.log(` ! ${path.relative(process.cwd(), d)}`);
|
|
348
|
+
}
|
|
349
|
+
console.log('reconciliação por agente (bounded):');
|
|
350
|
+
for (const rec of r.reconciliation) {
|
|
351
|
+
const wf = rec.inWorkflow ? '' : ' [not-in-workflow]';
|
|
352
|
+
const detail = rec.status === 'recommend-new' ? ` — ${rec.reason}`
|
|
353
|
+
: rec.status === 'reconciled' ? ` — ${rec.removed.length} auto-sequenciamento(s) removido(s)` : '';
|
|
354
|
+
console.log(` · ${rec.agent}: ${rec.status}${wf}${detail}`);
|
|
355
|
+
}
|
|
356
|
+
if (r.notInWorkflow.length) {
|
|
357
|
+
console.log(`\n·· fora deste workflow (preservados no pod): ${r.notInWorkflow.join(', ')}`);
|
|
358
|
+
}
|
|
359
|
+
if (r.recommendNew.length) {
|
|
360
|
+
console.log(`\n>> RECOMENDA *new para: ${r.recommendNew.join(', ')} (excedem o bound — não foram forçados).`);
|
|
361
|
+
}
|
|
362
|
+
console.log('\nPróximo: validate-pod-workflow.cjs (estático) → smoke (SF1.3) → pod-critic *review (G6) → registro.');
|
|
363
|
+
process.exit(0);
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
if (require.main === module) main();
|
|
367
|
+
|
|
368
|
+
module.exports = { upgradePod, reconcileAgent, readAgents, loadSpec, specSourceCandidates, SpecRequiredError, AUTO_SEQUENCING, OUT_OF_BOUND };
|