@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,473 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
/**
|
|
4
|
+
* pod-export-release.cjs — MECANISMO de release + selo de paridade do épico pod-export
|
|
5
|
+
* (F4, Story SF10.6). É o PRIMEIRO componente que ORQUESTRA os 4 juntos e sela o lock:
|
|
6
|
+
*
|
|
7
|
+
* compile (F1, import) → executor (F2, import — lado EXPORT) → G5-determinístico (NOVO)
|
|
8
|
+
* → pc-arena (ADR-009, import — reveal-gate reusado) → selo aditivo no export.lock.json
|
|
9
|
+
*
|
|
10
|
+
* Invariante-mãe de F4 (ADR-018 Adendo F4): o selo `release: sealed` só existe quando DOIS
|
|
11
|
+
* vereditos independentes são VERDE — o G5-determinístico (máquina) E a arena cega (humano) —
|
|
12
|
+
* sobre o MESMO `pod_sha` em inputs pinados. Qualquer ausência/incompletude/divergência =
|
|
13
|
+
* VERMELHO fail-loud que NÃO escreve o selo e sai não-zero.
|
|
14
|
+
*
|
|
15
|
+
* CLI (seção "Arquitetura" de sf10.6.story.md):
|
|
16
|
+
* node scripts/pod-export-release.cjs release <pod> --pod-dir <dir> \
|
|
17
|
+
* [--if-changed] --baseline-dir <dir> --arena-dir <expDir> \
|
|
18
|
+
* [--payload <file>] [--no-endpoint-check] [--sealed-by <id>] [--lock <path>]
|
|
19
|
+
*
|
|
20
|
+
* Gatilhos (DF4-4):
|
|
21
|
+
* MANUAL = `release <pod>` (sem --if-changed): dono refresca; roda (a)-(d), sela se VERDE.
|
|
22
|
+
* AUTO = `release <pod> --if-changed`: recompila fresco, compara pod_sha vs o do lock
|
|
23
|
+
* comitado. IGUAL → no-op (exit 0, nada resela). DIFERENTE → DETECTA-e-BLOQUEIA
|
|
24
|
+
* (exit != 0), sinaliza "reselagem de paridade humana necessária" — NUNCA sela
|
|
25
|
+
* unattended (a arena exige julgamento humano cego — DF4-4 supersede a Decisão 5).
|
|
26
|
+
*
|
|
27
|
+
* FRONTEIRAS (Escopo OUT de SF10.6): `pod-export-compile.cjs`, `pod-export-executor.cjs`,
|
|
28
|
+
* `arena.cjs` e `pc-run-pod.cjs` são consumidos SÓ por import/invocação — nenhum tem lógica
|
|
29
|
+
* interna tocada. NÃO gera o baseline (ação humana/operacional de SF10.7), NÃO roda a sessão
|
|
30
|
+
* de arena (só LÊ o experimento já revelado), NÃO julga conteúdo. Sem git push/PR (pc-devops).
|
|
31
|
+
*
|
|
32
|
+
* Node >= 18, zero dependências externas. Rede/execução INJETÁVEL (deps) → CI hermética.
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
const fs = require('node:fs');
|
|
36
|
+
const os = require('node:os');
|
|
37
|
+
const path = require('node:path');
|
|
38
|
+
const crypto = require('node:crypto');
|
|
39
|
+
|
|
40
|
+
const compileMod = require('./pod-export-compile.cjs');
|
|
41
|
+
const executorMod = require('./pod-export-executor.cjs');
|
|
42
|
+
const arena = require('./arena.cjs');
|
|
43
|
+
|
|
44
|
+
const REPO_ROOT = path.resolve(__dirname, '..');
|
|
45
|
+
|
|
46
|
+
// Contrato F0/DF4-2/DF4-3 (constantes, nunca hardcode espalhado).
|
|
47
|
+
const ARTIFACT_COUNT = 7; // inventário de 7 peças (DF4-2 crit 1).
|
|
48
|
+
const ARM_EXPORT = 'EXPORT'; // arms fixados por contrato (DF4-3), exatamente os do F0.
|
|
49
|
+
const ARM_BASELINE = 'BASELINE';
|
|
50
|
+
const RELEASE_STATUS_SEALED = 'sealed';
|
|
51
|
+
|
|
52
|
+
class ReleaseError extends Error {}
|
|
53
|
+
function fail(msg) { throw new ReleaseError(msg); }
|
|
54
|
+
|
|
55
|
+
function sha256(buf) { return crypto.createHash('sha256').update(buf).digest('hex'); }
|
|
56
|
+
function sha256File(p) { return sha256(fs.readFileSync(p)); }
|
|
57
|
+
|
|
58
|
+
/** Serialização canônica (chaves ordenadas recursivamente) → comparação estável de modelo pinado. */
|
|
59
|
+
function stableStringify(v) {
|
|
60
|
+
if (Array.isArray(v)) return `[${v.map(stableStringify).join(',')}]`;
|
|
61
|
+
if (v && typeof v === 'object') {
|
|
62
|
+
return `{${Object.keys(v).sort().map((k) => `${JSON.stringify(k)}:${stableStringify(v[k])}`).join(',')}}`;
|
|
63
|
+
}
|
|
64
|
+
return JSON.stringify(v);
|
|
65
|
+
}
|
|
66
|
+
function sameModel(a, b) { return stableStringify(a) === stableStringify(b); }
|
|
67
|
+
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
// (b) G5-determinístico — comparador NOVO (DF4-2). NÃO reusa harness-g5-lite (semântica
|
|
70
|
+
// diferente: aquele DIRIGE runs próprios; este COMPARA dois conjuntos JÁ produzidos).
|
|
71
|
+
// Compara o manifesto EXPORT (saída do executor) × baseline.manifest.json sobre campos de
|
|
72
|
+
// máquina. Qualquer divergência = VERMELHO com o CAMPO que divergiu na mensagem.
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* @param exportManifest { pod_sha, modelo_pinado, artifacts:[], complete } (lado EXPORT — do executor)
|
|
77
|
+
* @param baseline { pod_sha, modelo_pinado, artifacts:[7], vetos:{}, complete } (baseline.manifest.json)
|
|
78
|
+
* @param sealedPodSha pod_sha da recompilação fresca (o que se vai selar)
|
|
79
|
+
* @param lockModel lock.modelo_pinado da recompilação fresca (3ª ponta do binding de modelo)
|
|
80
|
+
* @returns { verdict:'green'|'red', divergence?:string, checks:{...} }
|
|
81
|
+
*/
|
|
82
|
+
function compareG5(exportManifest, baseline, sealedPodSha, lockModel) {
|
|
83
|
+
const red = (field, msg) => ({ verdict: 'red', divergence: field, message: msg });
|
|
84
|
+
|
|
85
|
+
// (4) binding de versão (DF4-5): baseline.pod_sha == sealed_pod_sha == export.pod_sha.
|
|
86
|
+
if (baseline.pod_sha !== sealedPodSha) {
|
|
87
|
+
return red('pod_sha', `binding de versão: baseline.pod_sha (${short(baseline.pod_sha)}) != sealed_pod_sha (${short(sealedPodSha)}) — o baseline foi gerado de OUTRA versão do pod (DF4-2 crit 4). VERMELHO.`);
|
|
88
|
+
}
|
|
89
|
+
if (exportManifest.pod_sha !== sealedPodSha) {
|
|
90
|
+
return red('pod_sha', `binding de versão: export.pod_sha (${short(exportManifest.pod_sha)}) != sealed_pod_sha (${short(sealedPodSha)}) — o run EXPORT não é da versão que se sela. VERMELHO.`);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// (1) inventário: conjunto de nomes == e contagem 7 em ambos.
|
|
94
|
+
const expSet = new Set(exportManifest.artifacts || []);
|
|
95
|
+
const baseSet = new Set(baseline.artifacts || []);
|
|
96
|
+
if (baseSet.size !== ARTIFACT_COUNT) {
|
|
97
|
+
return red('inventario', `inventário: BASELINE tem ${baseSet.size} peça(s), esperado ${ARTIFACT_COUNT} (DF4-2 crit 1). VERMELHO.`);
|
|
98
|
+
}
|
|
99
|
+
if (expSet.size !== ARTIFACT_COUNT) {
|
|
100
|
+
return red('inventario', `inventário: EXPORT tem ${expSet.size} peça(s), esperado ${ARTIFACT_COUNT}. VERMELHO.`);
|
|
101
|
+
}
|
|
102
|
+
const onlyExport = [...expSet].filter((x) => !baseSet.has(x));
|
|
103
|
+
const onlyBase = [...baseSet].filter((x) => !expSet.has(x));
|
|
104
|
+
if (onlyExport.length || onlyBase.length) {
|
|
105
|
+
return red('inventario', `inventário: conjuntos de peças divergem — só no EXPORT: [${onlyExport.join(', ')}]; só no BASELINE: [${onlyBase.join(', ')}]. VERMELHO.`);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// (2) vetos: 3 fases VERDES em AMBOS os lados. EXPORT: a run atingiu `complete`.
|
|
109
|
+
// BASELINE: `vetos` todos green + complete:true no manifesto.
|
|
110
|
+
if (exportManifest.complete !== true) {
|
|
111
|
+
return red('vetos', 'vetos: a run EXPORT NÃO atingiu `complete` no motor (alguma fase bloqueou/veto vermelho). VERMELHO.');
|
|
112
|
+
}
|
|
113
|
+
if (baseline.complete !== true) {
|
|
114
|
+
return red('vetos', 'vetos: BASELINE não está `complete:true` no manifesto. VERMELHO.');
|
|
115
|
+
}
|
|
116
|
+
const baseVetos = baseline.vetos || {};
|
|
117
|
+
const notGreen = Object.entries(baseVetos).filter(([, v]) => v !== 'green').map(([k]) => k);
|
|
118
|
+
if (Object.keys(baseVetos).length === 0) {
|
|
119
|
+
return red('vetos', 'vetos: BASELINE sem campo `vetos` — impossível confirmar 3 fases verdes. VERMELHO.');
|
|
120
|
+
}
|
|
121
|
+
if (notGreen.length) {
|
|
122
|
+
return red('vetos', `vetos: fase(s) não-verde(s) no BASELINE: [${notGreen.join(', ')}]. VERMELHO.`);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// (3) modelo pinado: EXPORT == lock == BASELINE.
|
|
126
|
+
if (!sameModel(exportManifest.modelo_pinado, lockModel)) {
|
|
127
|
+
return red('modelo_pinado', 'modelo pinado: o modelo efetivamente usado na run EXPORT != lock.modelo_pinado. VERMELHO.');
|
|
128
|
+
}
|
|
129
|
+
if (!sameModel(baseline.modelo_pinado, lockModel)) {
|
|
130
|
+
return red('modelo_pinado', 'modelo pinado: baseline.modelo_pinado != lock.modelo_pinado. VERMELHO.');
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return {
|
|
134
|
+
verdict: 'green',
|
|
135
|
+
checks: {
|
|
136
|
+
pod_sha: sealedPodSha,
|
|
137
|
+
inventario: [...expSet].sort(),
|
|
138
|
+
vetos: baseVetos,
|
|
139
|
+
modelo_pinado: lockModel,
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
function short(sha) { return sha ? String(sha).slice(0, 8) : '(vazio)'; }
|
|
144
|
+
|
|
145
|
+
// ---------------------------------------------------------------------------
|
|
146
|
+
// (c) Insumo pc-arena (DF4-3) — consumido por diretório do experimento + IMPORT de arena.cjs.
|
|
147
|
+
// Reveal-gate REUSADO como anti-selo-no-escuro; veredito por verdictForAxis(BASELINE, EXPORT).
|
|
148
|
+
// Ausência/incompleto/não-revelado/BASELINE-vence = VERMELHO. NUNCA default-verde.
|
|
149
|
+
// ---------------------------------------------------------------------------
|
|
150
|
+
|
|
151
|
+
function arenaVerdict(arenaDir) {
|
|
152
|
+
const red = (msg) => ({ verdict: 'red', message: msg });
|
|
153
|
+
if (!arenaDir) return red('arena: --arena-dir ausente — selo no escuro proibido (DF4-3). VERMELHO.');
|
|
154
|
+
let state;
|
|
155
|
+
try {
|
|
156
|
+
state = arena.loadState(arenaDir);
|
|
157
|
+
} catch (e) {
|
|
158
|
+
// Dir/arquivos ausentes ou state corrompido: bloqueia (nunca trata como passe).
|
|
159
|
+
return red(`arena: experimento ausente/ilegível em ${arenaDir} (${e.message}). VERMELHO.`);
|
|
160
|
+
}
|
|
161
|
+
// Reveal-gate reusado: exige revelado E todas as rodadas pontuadas.
|
|
162
|
+
const scored = arena.scoredRoundsCount(state);
|
|
163
|
+
if (scored !== state.rounds) {
|
|
164
|
+
return red(`arena: experimento INCOMPLETO (${scored}/${state.rounds} rodadas pontuadas). VERMELHO.`);
|
|
165
|
+
}
|
|
166
|
+
if (state.revealed !== true) {
|
|
167
|
+
return red('arena: experimento NÃO revelado (reveal-gate) — o release não muta o arena; sele só o já-revelado. VERMELHO.');
|
|
168
|
+
}
|
|
169
|
+
const arms = state.arms || [];
|
|
170
|
+
if (!arms.includes(ARM_EXPORT) || !arms.includes(ARM_BASELINE)) {
|
|
171
|
+
return red(`arena: arms devem ser exatamente {${ARM_EXPORT}, ${ARM_BASELINE}} (DF4-3); achei [${arms.join(', ')}]. VERMELHO.`);
|
|
172
|
+
}
|
|
173
|
+
const verdictCfg = (state.rubric && state.rubric.verdict) || {};
|
|
174
|
+
const minDiff = verdictCfg.minDiff;
|
|
175
|
+
const kOfN = verdictCfg.kOfN;
|
|
176
|
+
if (typeof minDiff !== 'number' || !Number.isInteger(kOfN)) {
|
|
177
|
+
return red('arena: rubric.verdict.{minDiff,kOfN} ausente/inválido no experimento. VERMELHO.');
|
|
178
|
+
}
|
|
179
|
+
let t;
|
|
180
|
+
try {
|
|
181
|
+
t = arena.tally(arenaDir);
|
|
182
|
+
} catch (e) {
|
|
183
|
+
return red(`arena: falha ao agregar (tally): ${e.message}. VERMELHO.`);
|
|
184
|
+
}
|
|
185
|
+
const perBaseline = t.perRoundByArm[ARM_BASELINE];
|
|
186
|
+
const perExport = t.perRoundByArm[ARM_EXPORT];
|
|
187
|
+
// verdictForAxis(A=BASELINE, B=EXPORT): winner 'A'=BASELINE vence → VERMELHO;
|
|
188
|
+
// 'B'=EXPORT vence → verde; 'tie'=paridade → verde (export em paridade-ou-melhor).
|
|
189
|
+
let v;
|
|
190
|
+
try {
|
|
191
|
+
v = arena.verdictForAxis(perBaseline, perExport, minDiff, kOfN);
|
|
192
|
+
} catch (e) {
|
|
193
|
+
return red(`arena: veredito indefinido: ${e.message}. VERMELHO.`);
|
|
194
|
+
}
|
|
195
|
+
const sealedMapSha = sha256File(arena.sealedPath(arenaDir));
|
|
196
|
+
const base = {
|
|
197
|
+
winner: v.winner, means: { [ARM_EXPORT]: v.meanB, [ARM_BASELINE]: v.meanA },
|
|
198
|
+
minDiff, kOfN, rounds: state.rounds, sealed_map_sha256: sealedMapSha,
|
|
199
|
+
};
|
|
200
|
+
if (v.winner === 'A') {
|
|
201
|
+
return { ...base, verdict: 'red', message: `arena: BASELINE SUPERA o EXPORT (>= ${minDiff} em >= ${kOfN} rodada(s)) — regressão de conteúdo. VERMELHO.` };
|
|
202
|
+
}
|
|
203
|
+
// 'B' (EXPORT vence) ou 'tie' (paridade) → não-vermelho.
|
|
204
|
+
return { ...base, verdict: 'green' };
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// ---------------------------------------------------------------------------
|
|
208
|
+
// (d) Selo (DF4-1) — ADITIVO: recompila fresco (já feito), serializa o lock canônico de F1 e
|
|
209
|
+
// ACRESCENTA a chave de topo `release`. Voláteis (`at`/`sealed_by`) FORA de qualquer hash
|
|
210
|
+
// (coerente com AC4/F1: pod_sha e bundle_hashes já vêm calculados no lock, nunca do arquivo).
|
|
211
|
+
// ---------------------------------------------------------------------------
|
|
212
|
+
|
|
213
|
+
function buildReleaseField({ trigger, sealedPodSha, frameworkVersion, sealedBy, at, g5, g5EvidenceRel, g5Sha, arenaDir, av }) {
|
|
214
|
+
return {
|
|
215
|
+
status: RELEASE_STATUS_SEALED,
|
|
216
|
+
at, // VOLÁTIL — metadado de auditoria (fora de qualquer hash).
|
|
217
|
+
trigger, // 'manual' (AUTO nunca sela — DF4-4).
|
|
218
|
+
sealed_pod_sha: sealedPodSha, // DEVE == lock.pod_sha (asserido no selar).
|
|
219
|
+
framework_version: frameworkVersion,
|
|
220
|
+
sealed_by: sealedBy, // VOLÁTIL.
|
|
221
|
+
evidence: {
|
|
222
|
+
g5: { verdict: g5.verdict, path: g5EvidenceRel, sha256: g5Sha },
|
|
223
|
+
arena: {
|
|
224
|
+
verdict: av.verdict,
|
|
225
|
+
arena_dir: arenaDir,
|
|
226
|
+
sealed_map_sha256: av.sealed_map_sha256,
|
|
227
|
+
means: av.means, minDiff: av.minDiff, kOfN: av.kOfN, rounds: av.rounds,
|
|
228
|
+
},
|
|
229
|
+
},
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/** Escreve a evidência G5 e devolve { rel, abs, sha256 } (o selo referencia por path+sha256). */
|
|
234
|
+
function writeG5Evidence(exportsPodDir, sealedPodSha, payload) {
|
|
235
|
+
const dir = path.join(exportsPodDir, 'release-evidence');
|
|
236
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
237
|
+
const rel = path.join('release-evidence', `g5-${short(sealedPodSha)}.json`);
|
|
238
|
+
const abs = path.join(exportsPodDir, rel);
|
|
239
|
+
fs.writeFileSync(abs, `${JSON.stringify(payload, null, 2)}\n`, 'utf8');
|
|
240
|
+
return { rel, abs, sha256: sha256File(abs) };
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/** Serializa o lock FRESCO + `release` acrescentado ao final (aditivo). Reusa serializeLock de F1. */
|
|
244
|
+
function serializeSealedLock(freshLock, releaseField) {
|
|
245
|
+
const out = { ...freshLock, release: releaseField };
|
|
246
|
+
return compileMod.serializeLock(out);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// ---------------------------------------------------------------------------
|
|
250
|
+
// (a) Lado EXPORT — produzido pelo executor de F2. Injetável (deps.runExport): em CI é um
|
|
251
|
+
// stub hermético; em produção (SF10.7) drive-a o bundle real contra o payload pinado.
|
|
252
|
+
// ---------------------------------------------------------------------------
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Default: drive REAL do bundle via executor de F2 (import — INTOCADO). Só é exercido com
|
|
256
|
+
* --payload + chaves reais (SF10.7 — execução real). Devolve o manifesto EXPORT.
|
|
257
|
+
* Em CI a suíte injeta `deps.runExport`, jamais este default (sem API real — SF10.6 hermético).
|
|
258
|
+
*/
|
|
259
|
+
async function defaultRunExport({ pod, podDir, freshLock, bundleFiles, payloadPath, runsRoot, deps = {}, log }) {
|
|
260
|
+
if (!payloadPath) {
|
|
261
|
+
fail('execução real do bundle EXPORT requer --payload <file> (cenário pinado) — o wiring do payload/mapa de 7 peças do pod real é SF10.7. Em CI, injete deps.runExport.');
|
|
262
|
+
}
|
|
263
|
+
// Bundle+lock frescos em dir efêmero (o executor lê o bundle e confere coerência de versão).
|
|
264
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), `pex-rel-${pod}-`));
|
|
265
|
+
const bundleDir = path.join(tmp, 'bundle');
|
|
266
|
+
compileMod.writeBundle(bundleDir, bundleFiles);
|
|
267
|
+
const lockPath = path.join(tmp, 'export.lock.json');
|
|
268
|
+
fs.writeFileSync(lockPath, compileMod.serializeLock(freshLock), 'utf8');
|
|
269
|
+
const payload = JSON.parse(fs.readFileSync(path.resolve(payloadPath), 'utf8'));
|
|
270
|
+
payload.__dir = path.dirname(path.resolve(payloadPath));
|
|
271
|
+
const run = executorMod.setupRun({ bundleDir, lockOverride: lockPath, payload, deps, log });
|
|
272
|
+
const motor = require('./pc-run-pod.cjs');
|
|
273
|
+
const runId = `rel-${Date.now()}`;
|
|
274
|
+
const memoryPodDir = fs.mkdtempSync(path.join(os.tmpdir(), 'pex-mem-'));
|
|
275
|
+
const { ctx } = motor.startRun({ workflowPath: `${run.bundleRoot}/workflow.yaml`, podRootOverride: run.bundleRoot, pod: run.pod, workflow: run.workflow, runsRoot, runId, memoryPodDir });
|
|
276
|
+
const r = await executorMod.drive(ctx, run, {});
|
|
277
|
+
return extractExportManifest(ctx.runDir, freshLock, { complete: r.complete === true });
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Extrai o manifesto EXPORT de um runDir completo: inventário (peças escritas em `artifacts/`),
|
|
282
|
+
* modelo pinado (do lock — o que o bundle usou) e pod_sha (do lock fresco). `complete` vem do drive.
|
|
283
|
+
* Genérico; o mapa exato das 7 peças do pod real é confirmado em SF10.7.
|
|
284
|
+
*/
|
|
285
|
+
function extractExportManifest(runDir, freshLock, { complete }) {
|
|
286
|
+
const artDir = path.join(runDir, 'artifacts');
|
|
287
|
+
const artifacts = fs.existsSync(artDir)
|
|
288
|
+
? fs.readdirSync(artDir).filter((f) => fs.statSync(path.join(artDir, f)).isFile()).sort()
|
|
289
|
+
: [];
|
|
290
|
+
return {
|
|
291
|
+
pod_sha: freshLock.pod_sha,
|
|
292
|
+
modelo_pinado: freshLock.modelo_pinado,
|
|
293
|
+
artifacts,
|
|
294
|
+
complete: complete === true,
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// ---------------------------------------------------------------------------
|
|
299
|
+
// Orquestração — release(pod, opts). O MESMO code-path de (a)-(d) serve MANUAL e a reselagem
|
|
300
|
+
// humana do AUTO; a ÚNICA diferença de --if-changed é a checagem de diff ANTES de entrar nele.
|
|
301
|
+
// ---------------------------------------------------------------------------
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* @returns {status:'noop'|'blocked'|'red'|'sealed', ...}. NÃO chama process.exit (o CLI decide).
|
|
305
|
+
*/
|
|
306
|
+
async function release(pod, opts = {}) {
|
|
307
|
+
const log = opts.log || ((m) => console.log(m));
|
|
308
|
+
const repoRoot = opts.repoRoot || REPO_ROOT;
|
|
309
|
+
const exportsPodDir = path.join(repoRoot, 'exports', pod);
|
|
310
|
+
const lockPath = opts.lockPath || path.join(exportsPodDir, 'export.lock.json');
|
|
311
|
+
if (!opts.podDir) fail('release: --pod-dir <dir> obrigatório (path do pod-fonte v0.3 a recompilar) — o compilador não resolve pod por nome (contrato F1).');
|
|
312
|
+
|
|
313
|
+
// --- Recompilação FRESCA (import de F1 — nunca reimplementa o compilador). DF4-1. ---
|
|
314
|
+
const { lock: freshLock, bundleFiles } = await compileMod.compile(opts.podDir, {
|
|
315
|
+
pinsPath: opts.pinsPath,
|
|
316
|
+
checkEndpoint: opts.checkEndpoint !== false,
|
|
317
|
+
fetchImpl: opts.fetchImpl,
|
|
318
|
+
apiKey: opts.apiKey,
|
|
319
|
+
});
|
|
320
|
+
const sealedPodSha = freshLock.pod_sha;
|
|
321
|
+
log(`[compile] pod "${pod}" recompilado fresco — pod_sha=${sealedPodSha}`);
|
|
322
|
+
|
|
323
|
+
// --- (e) Gatilho AUTO (--if-changed): DETECTA-e-BLOQUEIA. NUNCA sela unattended (DF4-4). ---
|
|
324
|
+
if (opts.ifChanged) {
|
|
325
|
+
if (!fs.existsSync(lockPath)) {
|
|
326
|
+
fail(`--if-changed: lock comitado ausente (${path.relative(repoRoot, lockPath)}) — nada com que comparar. Rode o release MANUAL para selar a 1ª vez.`);
|
|
327
|
+
}
|
|
328
|
+
const committed = JSON.parse(fs.readFileSync(lockPath, 'utf8'));
|
|
329
|
+
if (committed.pod_sha === sealedPodSha) {
|
|
330
|
+
log(`[auto] SEM mudança — pod_sha idêntico ao do lock comitado (${short(sealedPodSha)}). No-op: nada resela.`);
|
|
331
|
+
return { status: 'noop', changed: false, pod_sha: sealedPodSha };
|
|
332
|
+
}
|
|
333
|
+
// Mudou: o insumo arena exige julgamento humano cego → AUTO não pode selar sozinho.
|
|
334
|
+
log(`[auto] MUDANÇA detectada — pod_sha fresco (${short(sealedPodSha)}) != lock comitado (${short(committed.pod_sha)}).`);
|
|
335
|
+
log('[auto] BLOQUEIO: reselagem de PARIDADE HUMANA necessária (baseline fresco + sessão pc-arena). Nada foi selado (DF4-4).');
|
|
336
|
+
return { status: 'blocked', changed: true, pod_sha: sealedPodSha, committed_pod_sha: committed.pod_sha,
|
|
337
|
+
message: 'pod alterado desde o último selo — rode o release MANUAL humano (baseline + arena) antes de embarcar.' };
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
// --- MANUAL / reselagem humana: caminho completo (a)-(d). ---
|
|
341
|
+
if (!opts.baselineDir) fail('release MANUAL: --baseline-dir <dir> obrigatório (o baseline vem de fora — SF10.7; o release nunca o gera).');
|
|
342
|
+
if (!opts.arenaDir) fail('release MANUAL: --arena-dir <expDir> obrigatório (experimento pc-arena já revelado) — selo no escuro proibido.');
|
|
343
|
+
|
|
344
|
+
const baseline = loadBaselineManifest(opts.baselineDir);
|
|
345
|
+
|
|
346
|
+
// (a) lado EXPORT (executor de F2, ou stub hermético injetado).
|
|
347
|
+
const runExport = (opts.deps && opts.deps.runExport) || defaultRunExport;
|
|
348
|
+
const exportManifest = await runExport({
|
|
349
|
+
pod, podDir: opts.podDir, freshLock, bundleFiles,
|
|
350
|
+
payloadPath: opts.payloadPath,
|
|
351
|
+
runsRoot: opts.runsRoot || path.join(repoRoot, '.power-claude', 'pod-export-runs'),
|
|
352
|
+
deps: (opts.deps && opts.deps.executor) || {}, log,
|
|
353
|
+
});
|
|
354
|
+
|
|
355
|
+
// (b) G5-determinístico.
|
|
356
|
+
const g5 = compareG5(exportManifest, baseline, sealedPodSha, freshLock.modelo_pinado);
|
|
357
|
+
log(`[g5] veredito ${g5.verdict.toUpperCase()}${g5.divergence ? ` (divergência: ${g5.divergence})` : ''}`);
|
|
358
|
+
|
|
359
|
+
// (c) veredito pc-arena.
|
|
360
|
+
const av = arenaVerdict(opts.arenaDir);
|
|
361
|
+
log(`[arena] veredito ${av.verdict.toUpperCase()}${av.winner ? ` (winner: ${av.winner})` : ''}`);
|
|
362
|
+
|
|
363
|
+
// (d) selo condicional — SÓ quando (b) E (c) NÃO-vermelhos. VERMELHO não escreve/altera o lock.
|
|
364
|
+
if (g5.verdict === 'red' || av.verdict === 'red') {
|
|
365
|
+
const why = [g5.verdict === 'red' ? `G5: ${g5.message}` : null, av.verdict === 'red' ? `ARENA: ${av.message}` : null].filter(Boolean).join('\n ');
|
|
366
|
+
return { status: 'red', g5, arena: av, sealed: false, message: why };
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// VERDE nos dois: grava evidência G5, monta o campo `release` e ACRESCENTA ao lock fresco.
|
|
370
|
+
const frameworkVersion = freshLock.framework_version;
|
|
371
|
+
const g5Ev = writeG5Evidence(exportsPodDir, sealedPodSha, {
|
|
372
|
+
pod, sealed_pod_sha: sealedPodSha,
|
|
373
|
+
export: { artifacts: exportManifest.artifacts, complete: exportManifest.complete, modelo_pinado: exportManifest.modelo_pinado },
|
|
374
|
+
baseline: { pod_sha: baseline.pod_sha, artifacts: baseline.artifacts, vetos: baseline.vetos, complete: baseline.complete, modelo_pinado: baseline.modelo_pinado },
|
|
375
|
+
verdict: g5.verdict, checks: g5.checks,
|
|
376
|
+
});
|
|
377
|
+
const at = opts.now || new Date().toISOString();
|
|
378
|
+
const sealedBy = opts.sealedBy || 'Daniel';
|
|
379
|
+
const releaseField = buildReleaseField({
|
|
380
|
+
trigger: 'manual', sealedPodSha, frameworkVersion, sealedBy, at,
|
|
381
|
+
g5, g5EvidenceRel: g5Ev.rel, g5Sha: g5Ev.sha256, arenaDir: opts.arenaDir, av,
|
|
382
|
+
});
|
|
383
|
+
fs.mkdirSync(exportsPodDir, { recursive: true });
|
|
384
|
+
fs.writeFileSync(lockPath, serializeSealedLock(freshLock, releaseField), 'utf8');
|
|
385
|
+
log(`[selo] SEALED — ${path.relative(repoRoot, lockPath)} (release aditivo; hashes de conteúdo intocados). evidência: ${g5Ev.rel}`);
|
|
386
|
+
return { status: 'sealed', sealed: true, pod_sha: sealedPodSha, release: releaseField, g5, arena: av };
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
function loadBaselineManifest(baselineDir) {
|
|
390
|
+
const p = path.join(baselineDir, 'baseline.manifest.json');
|
|
391
|
+
if (!fs.existsSync(p)) fail(`baseline.manifest.json ausente em ${baselineDir} (schema DF4-2) — o release NÃO gera baseline (SF10.7). VERMELHO por ausência de insumo.`);
|
|
392
|
+
let m;
|
|
393
|
+
try { m = JSON.parse(fs.readFileSync(p, 'utf8')); } catch (e) { fail(`baseline.manifest.json inválido (${p}): ${e.message}`); }
|
|
394
|
+
for (const k of ['pod_sha', 'modelo_pinado', 'artifacts', 'vetos', 'complete']) {
|
|
395
|
+
if (!(k in m)) fail(`baseline.manifest.json sem campo obrigatório "${k}" (schema DF4-2).`);
|
|
396
|
+
}
|
|
397
|
+
return m;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
// ---------------------------------------------------------------------------
|
|
401
|
+
// CLI.
|
|
402
|
+
// ---------------------------------------------------------------------------
|
|
403
|
+
|
|
404
|
+
function parseArgs(argv) {
|
|
405
|
+
const flags = {}; const positionals = [];
|
|
406
|
+
for (let i = 0; i < argv.length; i++) {
|
|
407
|
+
const a = argv[i];
|
|
408
|
+
if (a === '--if-changed') flags.ifChanged = true;
|
|
409
|
+
else if (a === '--no-endpoint-check') flags.noEndpoint = true;
|
|
410
|
+
else if (a === '--pod-dir') flags.podDir = argv[++i];
|
|
411
|
+
else if (a === '--baseline-dir') flags.baselineDir = argv[++i];
|
|
412
|
+
else if (a === '--arena-dir') flags.arenaDir = argv[++i];
|
|
413
|
+
else if (a === '--payload') flags.payload = argv[++i];
|
|
414
|
+
else if (a === '--sealed-by') flags.sealedBy = argv[++i];
|
|
415
|
+
else if (a === '--lock') flags.lock = argv[++i];
|
|
416
|
+
else if (a === '--pins') flags.pins = argv[++i];
|
|
417
|
+
else positionals.push(a);
|
|
418
|
+
}
|
|
419
|
+
return { flags, positionals };
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
async function main() {
|
|
423
|
+
const { flags, positionals } = parseArgs(process.argv.slice(2));
|
|
424
|
+
const sub = positionals[0];
|
|
425
|
+
const pod = positionals[1];
|
|
426
|
+
if (sub !== 'release' || !pod) {
|
|
427
|
+
console.error('Uso: node scripts/pod-export-release.cjs release <pod> --pod-dir <dir> [--if-changed] [--baseline-dir <dir>] [--arena-dir <expDir>] [--payload <file>] [--no-endpoint-check] [--sealed-by <id>] [--lock <path>]');
|
|
428
|
+
process.exit(2);
|
|
429
|
+
}
|
|
430
|
+
try {
|
|
431
|
+
const r = await release(pod, {
|
|
432
|
+
podDir: flags.podDir,
|
|
433
|
+
ifChanged: Boolean(flags.ifChanged),
|
|
434
|
+
baselineDir: flags.baselineDir,
|
|
435
|
+
arenaDir: flags.arenaDir,
|
|
436
|
+
payloadPath: flags.payload,
|
|
437
|
+
sealedBy: flags.sealedBy,
|
|
438
|
+
lockPath: flags.lock ? path.resolve(flags.lock) : undefined,
|
|
439
|
+
pinsPath: flags.pins ? path.resolve(flags.pins) : undefined,
|
|
440
|
+
checkEndpoint: !flags.noEndpoint,
|
|
441
|
+
});
|
|
442
|
+
// Códigos de saída: sealed/noop = 0; red/blocked = 1 (bloqueia o embarque, fail-loud).
|
|
443
|
+
if (r.status === 'sealed') { console.log('[OK] paridade selada — bundle liberado para embarque.'); process.exit(0); }
|
|
444
|
+
if (r.status === 'noop') { console.log('[OK] sem mudança — nenhuma reselagem necessária.'); process.exit(0); }
|
|
445
|
+
if (r.status === 'blocked') { console.error(`[BLOQUEADO] ${r.message}`); process.exit(1); }
|
|
446
|
+
console.error(`[VERMELHO] paridade REPROVADA — selo NÃO escrito:\n ${r.message}`); process.exit(1);
|
|
447
|
+
} catch (e) {
|
|
448
|
+
if (e instanceof ReleaseError || e instanceof compileMod.CompileError) {
|
|
449
|
+
console.error(`[FALHA] ${e.message}`); process.exit(1);
|
|
450
|
+
}
|
|
451
|
+
throw e;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
if (require.main === module) main();
|
|
456
|
+
|
|
457
|
+
module.exports = {
|
|
458
|
+
release,
|
|
459
|
+
compareG5,
|
|
460
|
+
arenaVerdict,
|
|
461
|
+
buildReleaseField,
|
|
462
|
+
serializeSealedLock,
|
|
463
|
+
writeG5Evidence,
|
|
464
|
+
extractExportManifest,
|
|
465
|
+
loadBaselineManifest,
|
|
466
|
+
stableStringify,
|
|
467
|
+
sameModel,
|
|
468
|
+
parseArgs,
|
|
469
|
+
ARTIFACT_COUNT,
|
|
470
|
+
ARM_EXPORT,
|
|
471
|
+
ARM_BASELINE,
|
|
472
|
+
ReleaseError,
|
|
473
|
+
};
|