@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.

Files changed (467) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +121 -0
  3. package/bin/cli.js +124 -0
  4. package/installer/__tests__/doctor-ready-oracles.test.cjs +140 -0
  5. package/installer/__tests__/merge-settings.test.cjs +330 -0
  6. package/installer/adopt.js +161 -0
  7. package/installer/copy.js +203 -0
  8. package/installer/doctor.js +266 -0
  9. package/installer/install.js +155 -0
  10. package/installer/manifest.js +102 -0
  11. package/installer/motor-scripts.js +50 -0
  12. package/installer/motor-scripts.json +39 -0
  13. package/installer/uninstall.js +99 -0
  14. package/installer/update.js +376 -0
  15. package/installer/util.js +113 -0
  16. package/installer/wizard.js +64 -0
  17. package/package.json +26 -0
  18. package/scripts/__fixtures__/anti-path-demo/agents/ap-writer.md +13 -0
  19. package/scripts/__fixtures__/anti-path-demo/templates/write-tmpl.md +7 -0
  20. package/scripts/__fixtures__/anti-path-demo/workflows/wf-ap.smoke.json +10 -0
  21. package/scripts/__fixtures__/anti-path-demo/workflows/wf-ap.yaml +25 -0
  22. package/scripts/__fixtures__/assess-tier/retrofit-leve/pod/agents/content-chief.md +1 -0
  23. package/scripts/__fixtures__/assess-tier/retrofit-leve/pod/workflows/wf-criacao-redteam.yaml +3 -0
  24. package/scripts/__fixtures__/assess-tier/retrofit-leve/pod-spec.json +13 -0
  25. package/scripts/__fixtures__/fidelity/fake-green-average-in-band.yaml +21 -0
  26. package/scripts/__fixtures__/fidelity/fake-green-average.yaml +18 -0
  27. package/scripts/__fixtures__/fidelity/fake-green-denominator.yaml +19 -0
  28. package/scripts/__fixtures__/fidelity/fake-green-missing-evidence.yaml +18 -0
  29. package/scripts/__fixtures__/fidelity/fake-green-threshold.yaml +18 -0
  30. package/scripts/__fixtures__/fidelity/fake-green-weight.yaml +18 -0
  31. package/scripts/__fixtures__/fidelity/golden.yaml +31 -0
  32. package/scripts/__fixtures__/fidelity/trindade-incoherent.yaml +15 -0
  33. package/scripts/__fixtures__/forge-canonical/pod-spec-example.json +37 -0
  34. package/scripts/__fixtures__/migrate-squad/authored/agents/offer-engineer.md +17 -0
  35. package/scripts/__fixtures__/migrate-squad/authored/knowledge/no-source.md +7 -0
  36. package/scripts/__fixtures__/migrate-squad/authored/knowledge/value-stack-method.md +8 -0
  37. package/scripts/__fixtures__/migrate-squad/authored/specs/wf-sample.smoke.json +24 -0
  38. package/scripts/__fixtures__/migrate-squad/authored/specs/wf-sample.spec.json +45 -0
  39. package/scripts/__fixtures__/migrate-squad/legacy-squad/HEADLINE.md +3 -0
  40. package/scripts/__fixtures__/migrate-squad/legacy-squad/README.md +4 -0
  41. package/scripts/__fixtures__/migrate-squad/legacy-squad/agents/hormozi-offer.md +14 -0
  42. package/scripts/__fixtures__/migrate-squad/legacy-squad/checklists/dead-redundant.md +4 -0
  43. package/scripts/__fixtures__/migrate-squad/legacy-squad/checklists/method-guide.md +6 -0
  44. package/scripts/__fixtures__/migrate-squad/legacy-squad/checklists/veto-screen.md +4 -0
  45. package/scripts/__fixtures__/migrate-squad/legacy-squad/config/config.yaml +2 -0
  46. package/scripts/__fixtures__/migrate-squad/legacy-squad/data/case-library.md +3 -0
  47. package/scripts/__fixtures__/migrate-squad/legacy-squad/scripts/validate-mvn.py +16 -0
  48. package/scripts/__fixtures__/migrate-squad/legacy-squad/sops/sop-sample.md +3 -0
  49. package/scripts/__fixtures__/migrate-squad/legacy-squad/squad-io.yaml +14 -0
  50. package/scripts/__fixtures__/migrate-squad/legacy-squad/tasks/gather-context.md +7 -0
  51. package/scripts/__fixtures__/migrate-squad/legacy-squad/templates/output-tmpl.md +5 -0
  52. package/scripts/__fixtures__/migrate-squad/legacy-squad/workflows/wf-sample.yaml +24 -0
  53. package/scripts/__fixtures__/pipeline/pipelines/pipeline-checkpoint.yaml +21 -0
  54. package/scripts/__fixtures__/pipeline/pipelines/pipeline-demo.yaml +22 -0
  55. package/scripts/__fixtures__/pipeline/pods/pipe-a/agents/maker.md +13 -0
  56. package/scripts/__fixtures__/pipeline/pods/pipe-a/memory/learnings.consolidated.md +8 -0
  57. package/scripts/__fixtures__/pipeline/pods/pipe-a/memory/learnings.jsonl +83 -0
  58. package/scripts/__fixtures__/pipeline/pods/pipe-a/templates/make-tmpl.md +8 -0
  59. package/scripts/__fixtures__/pipeline/pods/pipe-a/workflows/wf-a.yaml +16 -0
  60. package/scripts/__fixtures__/pipeline/pods/pipe-b/agents/user.md +13 -0
  61. package/scripts/__fixtures__/pipeline/pods/pipe-b/memory/learnings.consolidated.md +8 -0
  62. package/scripts/__fixtures__/pipeline/pods/pipe-b/memory/learnings.jsonl +14 -0
  63. package/scripts/__fixtures__/pipeline/pods/pipe-b/templates/use-tmpl.md +6 -0
  64. package/scripts/__fixtures__/pipeline/pods/pipe-b/workflows/wf-b.yaml +16 -0
  65. package/scripts/__fixtures__/pod-run/agents/forge-chief.md +13 -0
  66. package/scripts/__fixtures__/pod-run/agents/pod-critic.md +13 -0
  67. package/scripts/__fixtures__/pod-run/templates/build-tmpl.md +8 -0
  68. package/scripts/__fixtures__/pod-run/templates/gate-tmpl.md +6 -0
  69. package/scripts/__fixtures__/pod-run/workflows/wf-min.yaml +43 -0
  70. package/scripts/__fixtures__/pod-run/workflows/wf-skip-modes.yaml +50 -0
  71. package/scripts/__fixtures__/pod-workflow/invalid-checkpoint-all-skippable.yaml +30 -0
  72. package/scripts/__fixtures__/pod-workflow/invalid-checkpoint-criteria-escalar-de-bloco.yaml +40 -0
  73. package/scripts/__fixtures__/pod-workflow/invalid-checkpoint-skip-mode-desconhecido.yaml +30 -0
  74. package/scripts/__fixtures__/pod-workflow/invalid-checkpoint-unknown-key.yaml +29 -0
  75. package/scripts/__fixtures__/pod-workflow/invalid-cycle.yaml +26 -0
  76. package/scripts/__fixtures__/pod-workflow/invalid-fix-loop-backedge.yaml +29 -0
  77. package/scripts/__fixtures__/pod-workflow/invalid-fix-loop-forward.yaml +29 -0
  78. package/scripts/__fixtures__/pod-workflow/invalid-handoff-open.yaml +27 -0
  79. package/scripts/__fixtures__/pod-workflow/invalid-knowledge-shape.yaml +18 -0
  80. package/scripts/__fixtures__/pod-workflow/invalid-missing-agent.yaml +15 -0
  81. package/scripts/__fixtures__/pod-workflow/invalid-missing-outputs.yaml +15 -0
  82. package/scripts/__fixtures__/pod-workflow/invalid-missing-template.yaml +15 -0
  83. package/scripts/__fixtures__/pod-workflow/invalid-missing-veto.yaml +13 -0
  84. package/scripts/__fixtures__/pod-workflow/invalid-template-not-on-disk.yaml +16 -0
  85. package/scripts/__fixtures__/pod-workflow/invalid-veto-prose.yaml +17 -0
  86. package/scripts/__fixtures__/pod-workflow/knowledge/a.md +4 -0
  87. package/scripts/__fixtures__/pod-workflow/knowledge/b.md +4 -0
  88. package/scripts/__fixtures__/pod-workflow/knowledge/c.md +4 -0
  89. package/scripts/__fixtures__/pod-workflow/templates/step-tmpl.md +7 -0
  90. package/scripts/__fixtures__/pod-workflow/valid-checkpoint-skip-modes.yaml +29 -0
  91. package/scripts/__fixtures__/pod-workflow/valid-fix-loop.yaml +30 -0
  92. package/scripts/__fixtures__/pod-workflow/valid-knowledge.yaml +30 -0
  93. package/scripts/__fixtures__/pod-workflow/valid-veto-always-true.yaml +20 -0
  94. package/scripts/__fixtures__/pod-workflow/valid.yaml +27 -0
  95. package/scripts/__fixtures__/smoke-canary/agents/canary-reporter.md +13 -0
  96. package/scripts/__fixtures__/smoke-canary/agents/canary-researcher.md +13 -0
  97. package/scripts/__fixtures__/smoke-canary/agents/canary-synth.md +13 -0
  98. package/scripts/__fixtures__/smoke-canary/memory/learnings.consolidated.md +10 -0
  99. package/scripts/__fixtures__/smoke-canary/memory/learnings.jsonl +448 -0
  100. package/scripts/__fixtures__/smoke-canary/templates/report-tmpl.md +9 -0
  101. package/scripts/__fixtures__/smoke-canary/templates/research-tmpl.md +7 -0
  102. package/scripts/__fixtures__/smoke-canary/templates/synth-tmpl.md +9 -0
  103. package/scripts/__fixtures__/smoke-canary/workflows/wf-canary.smoke.json +11 -0
  104. package/scripts/__fixtures__/smoke-canary/workflows/wf-canary.yaml +53 -0
  105. package/scripts/__fixtures__/source-audit/fake-green-bronze-unsignaled.yaml +10 -0
  106. package/scripts/__fixtures__/source-audit/fake-green-counts.yaml +9 -0
  107. package/scripts/__fixtures__/source-audit/fake-green-missing-evidence.yaml +9 -0
  108. package/scripts/__fixtures__/source-audit/fake-green-unclassified.yaml +10 -0
  109. package/scripts/__fixtures__/source-audit/fake-green-verdict.yaml +10 -0
  110. package/scripts/__fixtures__/source-audit/golden-blocked.yaml +10 -0
  111. package/scripts/__fixtures__/source-audit/golden.yaml +11 -0
  112. package/scripts/__fixtures__/sweep-forms/agents/forms-count.md +13 -0
  113. package/scripts/__fixtures__/sweep-forms/agents/forms-field.md +13 -0
  114. package/scripts/__fixtures__/sweep-forms/agents/forms-fileref.md +13 -0
  115. package/scripts/__fixtures__/sweep-forms/agents/forms-json.md +13 -0
  116. package/scripts/__fixtures__/sweep-forms/agents/forms-section.md +13 -0
  117. package/scripts/__fixtures__/sweep-forms/specs/wf-forms.spec.json +5 -0
  118. package/scripts/__fixtures__/sweep-forms/templates/t_count.md +5 -0
  119. package/scripts/__fixtures__/sweep-forms/templates/t_field.md +3 -0
  120. package/scripts/__fixtures__/sweep-forms/templates/t_fileref.md +3 -0
  121. package/scripts/__fixtures__/sweep-forms/templates/t_json.md +0 -0
  122. package/scripts/__fixtures__/sweep-forms/templates/t_section.md +3 -0
  123. package/scripts/__fixtures__/sweep-forms/workflows/wf-forms.smoke.json +13 -0
  124. package/scripts/__fixtures__/sweep-forms/workflows/wf-forms.yaml +67 -0
  125. package/scripts/__fixtures__/validate-story-acs-corpus/corpus-1-noop-state-json.fixture.md +18 -0
  126. package/scripts/__fixtures__/validate-story-acs-corpus/corpus-2-crash-buildworkflowyaml.fixture.md +26 -0
  127. package/scripts/__fixtures__/validate-story-acs-corpus/corpus-3-nasce-verde-skip-modes.fixture.md +29 -0
  128. package/scripts/__fixtures__/validate-story-acs-corpus/corpus-4-guarda-sem-irmao.fixture.md +17 -0
  129. package/scripts/__fixtures__/validate-story-acs-corpus/corpus-5a-diff-stat-sem-guarda.fixture.md +17 -0
  130. package/scripts/__fixtures__/validate-story-acs-corpus/corpus-5b-test-f-sobre-diretorio.fixture.md +20 -0
  131. package/scripts/__fixtures__/veto-checks/copy-clean.md +4 -0
  132. package/scripts/__fixtures__/veto-checks/copy-dashes.md +4 -0
  133. package/scripts/__fixtures__/veto-checks/n8n-bad.md +18 -0
  134. package/scripts/__fixtures__/veto-checks/n8n-ok.md +22 -0
  135. package/scripts/__fixtures__/veto-checks/page-bad.html +7 -0
  136. package/scripts/__fixtures__/veto-checks/phash/copy.png +0 -0
  137. package/scripts/__fixtures__/veto-checks/phash/distinct.png +0 -0
  138. package/scripts/__fixtures__/veto-checks/phash/distinct2.png +0 -0
  139. package/scripts/__fixtures__/veto-checks/phash/make-fixtures.cjs +203 -0
  140. package/scripts/__fixtures__/veto-checks/phash/ref.png +0 -0
  141. package/scripts/__fixtures__/veto-checks/slide-ok.html +15 -0
  142. package/scripts/__fixtures__/veto-checks/slide-overflow.html +14 -0
  143. package/scripts/__fixtures__/veto-checks/sweep-pod/agents/vc-checker.md +13 -0
  144. package/scripts/__fixtures__/veto-checks/sweep-pod/templates/check-tmpl.md +6 -0
  145. package/scripts/__fixtures__/veto-checks/sweep-pod/workflows/wf-vc.smoke.json +10 -0
  146. package/scripts/__fixtures__/veto-checks/sweep-pod/workflows/wf-vc.yaml +19 -0
  147. package/scripts/__fixtures__/voz-do-dono/README.md +23 -0
  148. package/scripts/__fixtures__/voz-do-dono/dono-escalar.yaml +9 -0
  149. package/scripts/__fixtures__/voz-do-dono/dono-guia.yaml +10 -0
  150. package/scripts/__fixtures__/voz-do-dono/peca-3a-pessoa.md +6 -0
  151. package/scripts/__fixtures__/voz-do-dono/peca-com-lexico-proibido.md +6 -0
  152. package/scripts/__fixtures__/voz-do-dono/peca-limpa-1a-pessoa.md +6 -0
  153. package/scripts/__tests__/derive-ready-transitions.test.cjs +269 -0
  154. package/scripts/__tests__/enforce-cycle-authority.test.cjs +869 -0
  155. package/scripts/__tests__/enforce-git-push-authority.test.cjs +701 -0
  156. package/scripts/__tests__/enforce-ready-oracles.test.cjs +745 -0
  157. package/scripts/__tests__/motor-scripts.test.cjs +339 -0
  158. package/scripts/__tests__/pc-run-pod-counter.test.cjs +58 -0
  159. package/scripts/__tests__/pc-run-pod.test.cjs +578 -0
  160. package/scripts/__tests__/validate-pod-workflow.test.cjs +90 -0
  161. package/scripts/__tests__/validate-story-acs.test.cjs +607 -0
  162. package/scripts/anti-path.test.cjs +163 -0
  163. package/scripts/arena.cjs +514 -0
  164. package/scripts/arena.test.cjs +213 -0
  165. package/scripts/brief-leitura-obrigatoria.test.cjs +364 -0
  166. package/scripts/consolidate-knowledge-runner.test.cjs +249 -0
  167. package/scripts/default-funcional.test.cjs +153 -0
  168. package/scripts/derive-ready-transitions.cjs +325 -0
  169. package/scripts/forge-additive.test.cjs +158 -0
  170. package/scripts/forge-assess-tier.cjs +205 -0
  171. package/scripts/forge-assess-tier.test.cjs +114 -0
  172. package/scripts/forge-canonical.test.cjs +624 -0
  173. package/scripts/forge-generate.cjs +1303 -0
  174. package/scripts/forge-harden-learning.cjs +921 -0
  175. package/scripts/forge-harden-learning.test.cjs +242 -0
  176. package/scripts/forge-ingest-memory.cjs +136 -0
  177. package/scripts/forge-upgrade-pod.cjs +368 -0
  178. package/scripts/forge.test.cjs +609 -0
  179. package/scripts/harden-knowledge.test.cjs +612 -0
  180. package/scripts/harness-g5-lite.cjs +243 -0
  181. package/scripts/harness-g5-lite.test.cjs +134 -0
  182. package/scripts/hn-carousel-contrato-entrada.test.cjs +96 -0
  183. package/scripts/migrate-squad-orchestration.test.cjs +146 -0
  184. package/scripts/migration-manifest-sf3.2.test.cjs +382 -0
  185. package/scripts/migration-manifest-sf3.3.test.cjs +170 -0
  186. package/scripts/migration-manifest-sf5.5.test.cjs +189 -0
  187. package/scripts/migration-manifest.cjs +1146 -0
  188. package/scripts/migration-manifest.test.cjs +186 -0
  189. package/scripts/npm-scope-invocation.test.cjs +194 -0
  190. package/scripts/owner-layer.cjs +442 -0
  191. package/scripts/owner-layer.test.cjs +358 -0
  192. package/scripts/pc-run-pipeline.cjs +289 -0
  193. package/scripts/pc-run-pipeline.test.cjs +256 -0
  194. package/scripts/pc-run-pod-countgte.test.cjs +66 -0
  195. package/scripts/pc-run-pod.cjs +1355 -0
  196. package/scripts/phash-gate.test.cjs +433 -0
  197. package/scripts/pod-export-compile.cjs +487 -0
  198. package/scripts/pod-export-compile.test.cjs +312 -0
  199. package/scripts/pod-export-executor.cjs +678 -0
  200. package/scripts/pod-export-executor.test.cjs +1341 -0
  201. package/scripts/pod-export-hardening.test.cjs +531 -0
  202. package/scripts/pod-export-postprocess.cjs +427 -0
  203. package/scripts/pod-export-postprocess.test.cjs +558 -0
  204. package/scripts/pod-export-queue-race.test.cjs +865 -0
  205. package/scripts/pod-export-release.cjs +473 -0
  206. package/scripts/pod-export-release.test.cjs +267 -0
  207. package/scripts/pod-export-service.cjs +1297 -0
  208. package/scripts/pod-export-service.test.cjs +489 -0
  209. package/scripts/pod-export-tools.cjs +470 -0
  210. package/scripts/pod-export-ui.cjs +805 -0
  211. package/scripts/pod-export-ui.test.cjs +301 -0
  212. package/scripts/pod-memory-budget.test.cjs +309 -0
  213. package/scripts/pod-memory-note.cjs +357 -0
  214. package/scripts/pod-memory-note.test.cjs +452 -0
  215. package/scripts/pod-memory.cjs +1252 -0
  216. package/scripts/pod-memory.test.cjs +951 -0
  217. package/scripts/render-png.test.cjs +307 -0
  218. package/scripts/smoke-isolation.test.cjs +100 -0
  219. package/scripts/smoke-pod-workflow.cjs +755 -0
  220. package/scripts/smoke-sweep.test.cjs +170 -0
  221. package/scripts/validate-adopt.js +235 -0
  222. package/scripts/validate-branding.js +84 -0
  223. package/scripts/validate-budgets.js +140 -0
  224. package/scripts/validate-fidelity-output.cjs +267 -0
  225. package/scripts/validate-fidelity-output.test.cjs +101 -0
  226. package/scripts/validate-install.js +230 -0
  227. package/scripts/validate-no-clone.cjs +220 -0
  228. package/scripts/validate-no-clone.test.cjs +77 -0
  229. package/scripts/validate-pipeline.cjs +145 -0
  230. package/scripts/validate-pod-workflow.cjs +878 -0
  231. package/scripts/validate-source-audit.cjs +170 -0
  232. package/scripts/validate-source-audit.test.cjs +90 -0
  233. package/scripts/validate-story-acs.cjs +862 -0
  234. package/scripts/validate-update-scope-motor.js +421 -0
  235. package/scripts/veto-checks/html-valid.cjs +92 -0
  236. package/scripts/veto-checks/lexical-check.cjs +62 -0
  237. package/scripts/veto-checks/phash-gate.cjs +589 -0
  238. package/scripts/veto-checks/render-gate.cjs +165 -0
  239. package/scripts/veto-checks/render-png.cjs +358 -0
  240. package/scripts/veto-checks.test.cjs +219 -0
  241. package/scripts/watcher-audit.cjs +178 -0
  242. package/template/.claude/CLAUDE.md +103 -0
  243. package/template/.claude/agents/pc-analyst.md +100 -0
  244. package/template/.claude/agents/pc-architect.md +32 -0
  245. package/template/.claude/agents/pc-dev.md +27 -0
  246. package/template/.claude/agents/pc-devops.md +45 -0
  247. package/template/.claude/agents/pc-planner.md +32 -0
  248. package/template/.claude/agents/pc-po.md +25 -0
  249. package/template/.claude/agents/pc-qa.md +25 -0
  250. package/template/.claude/commands/power/academy.md +9 -0
  251. package/template/.claude/commands/power/automation.md +9 -0
  252. package/template/.claude/commands/power/content-carousel.md +267 -0
  253. package/template/.claude/commands/power/content.md +9 -0
  254. package/template/.claude/commands/power/dev.md +9 -0
  255. package/template/.claude/commands/power/forge.md +224 -0
  256. package/template/.claude/commands/power/hormozi.md +221 -0
  257. package/template/.claude/commands/power/modo.md +57 -0
  258. package/template/.claude/hooks/README.md +114 -0
  259. package/template/.claude/hooks/context-budget.cjs +64 -0
  260. package/template/.claude/hooks/enforce-cycle-authority.cjs +457 -0
  261. package/template/.claude/hooks/enforce-git-push-authority.cjs +925 -0
  262. package/template/.claude/hooks/enforce-ready-oracles.cjs +502 -0
  263. package/template/.claude/rules/authority.md +76 -0
  264. package/template/.claude/rules/curadoria-de-conhecimento.md +30 -0
  265. package/template/.claude/rules/model-matrix.md +34 -0
  266. package/template/.claude/rules/orchestration.md +133 -0
  267. package/template/.claude/settings.json +50 -0
  268. package/template/.claude/skills/pc-apply-qa-fixes/SKILL.md +108 -0
  269. package/template/.claude/skills/pc-apply-qa-fixes/references/fix-loop.md +40 -0
  270. package/template/.claude/skills/pc-apply-qa-fixes/references/fix-request-template.md +70 -0
  271. package/template/.claude/skills/pc-arena/SKILL.md +96 -0
  272. package/template/.claude/skills/pc-close-story/SKILL.md +105 -0
  273. package/template/.claude/skills/pc-commit/SKILL.md +108 -0
  274. package/template/.claude/skills/pc-develop-story/SKILL.md +116 -0
  275. package/template/.claude/skills/pc-full-cycle/SKILL.md +150 -0
  276. package/template/.claude/skills/pc-pipeline/SKILL.md +63 -0
  277. package/template/.claude/skills/pc-pipeline/references/gate-templates.md +46 -0
  278. package/template/.claude/skills/pc-review-story/SKILL.md +129 -0
  279. package/template/.claude/skills/pc-review-story/references/false-positive-detection.md +50 -0
  280. package/template/.claude/skills/pc-review-story/references/nfr-assess.md +47 -0
  281. package/template/.claude/skills/pc-review-story/references/risk-profile.md +75 -0
  282. package/template/.claude/skills/pc-review-story/references/security-checklist.md +69 -0
  283. package/template/.claude/skills/pc-review-story/references/test-design.md +37 -0
  284. package/template/.claude/skills/pc-review-story/references/trace-requirements.md +46 -0
  285. package/template/.claude/skills/pc-run-pod/SKILL.md +123 -0
  286. package/template/.claude/skills/pc-validate-story/SKILL.md +114 -0
  287. package/template/.claude/skills/pc-wave/SKILL.md +133 -0
  288. package/template/.env.example +10 -0
  289. package/template/knowledge/analyst/brainstorming.md +40 -0
  290. package/template/knowledge/analyst/brief-skeleton.md +32 -0
  291. package/template/knowledge/analyst/competitor-skeleton.md +39 -0
  292. package/template/knowledge/analyst/elicitation-menu.md +49 -0
  293. package/template/knowledge/analyst/market-research-skeleton.md +36 -0
  294. package/template/knowledge/analyst/research-prompt-structure.md +48 -0
  295. package/template/knowledge/analyst/roi-skeleton.md +51 -0
  296. package/template/knowledge/voice-dna/README.md +99 -0
  297. package/template/knowledge/voice-dna/voice-dna.example.yaml +157 -0
  298. package/template/pods/README.md +64 -0
  299. package/template/pods/academy/README.md +37 -0
  300. package/template/pods/academy/agents/academy-chief.md +27 -0
  301. package/template/pods/academy/examples/palestra.example.md +142 -0
  302. package/template/pods/academy/pod-spec.json +44 -0
  303. package/template/pods/academy/templates/materiais-tmpl.md +17 -0
  304. package/template/pods/academy/templates/revisao-didatica-tmpl.md +20 -0
  305. package/template/pods/academy/workflows/wf-materiais-revisao.yaml +30 -0
  306. package/template/pods/authority-content/README.md +43 -0
  307. package/template/pods/authority-content/agents/content-chief.md +28 -0
  308. package/template/pods/authority-content/pod-spec.json +45 -0
  309. package/template/pods/authority-content/templates/criacao-na-voz-tmpl.md +17 -0
  310. package/template/pods/authority-content/templates/red-team-factual-tmpl.md +23 -0
  311. package/template/pods/authority-content/workflows/wf-criacao-redteam.yaml +30 -0
  312. package/template/pods/automation/README.md +37 -0
  313. package/template/pods/automation/agents/langgraph-architect.md +30 -0
  314. package/template/pods/automation/agents/n8n-architect.md +30 -0
  315. package/template/pods/automation/examples/README.md +46 -0
  316. package/template/pods/automation/examples/n8n-content-radar.example.json +380 -0
  317. package/template/pods/automation/knowledge/langgraph-patterns.md +126 -0
  318. package/template/pods/automation/knowledge/n8n-patterns.md +131 -0
  319. package/template/pods/automation/memory/README.md +16 -0
  320. package/template/pods/automation/memory/learnings.consolidated.md +8 -0
  321. package/template/pods/automation/memory/learnings.jsonl +0 -0
  322. package/template/pods/automation/pod-spec.json +109 -0
  323. package/template/pods/automation/specs/wf-langgraph-build.spec.json +107 -0
  324. package/template/pods/automation/squad-io.yaml +28 -0
  325. package/template/pods/automation/templates/lg-build-tmpl.md +17 -0
  326. package/template/pods/automation/templates/lg-design-tmpl.md +23 -0
  327. package/template/pods/automation/templates/lg-discover-tmpl.md +20 -0
  328. package/template/pods/automation/templates/lg-handoff-tmpl.md +20 -0
  329. package/template/pods/automation/templates/lg-test-tmpl.md +20 -0
  330. package/template/pods/automation/templates/n8n-build-tmpl.md +14 -0
  331. package/template/pods/automation/templates/n8n-design-tmpl.md +23 -0
  332. package/template/pods/automation/templates/n8n-discover-tmpl.md +20 -0
  333. package/template/pods/automation/templates/n8n-handoff-tmpl.md +20 -0
  334. package/template/pods/automation/templates/n8n-test-tmpl.md +20 -0
  335. package/template/pods/automation/workflows/wf-langgraph-build.smoke.json +11 -0
  336. package/template/pods/automation/workflows/wf-langgraph-build.yaml +64 -0
  337. package/template/pods/automation/workflows/wf-n8n-build.smoke.json +11 -0
  338. package/template/pods/automation/workflows/wf-n8n-build.yaml +65 -0
  339. package/template/pods/content-carousel/README.md +91 -0
  340. package/template/pods/content-carousel/agents/carousel-builder.md +28 -0
  341. package/template/pods/content-carousel/agents/carousel-visual.md +24 -0
  342. package/template/pods/content-carousel/agents/hn-curator.md +74 -0
  343. package/template/pods/content-carousel/config/heuristic-watcher-rubric.yaml +59 -0
  344. package/template/pods/content-carousel/knowledge/aquisicao-ancora.md +443 -0
  345. package/template/pods/content-carousel/knowledge/cta-brief.md +25 -0
  346. package/template/pods/content-carousel/knowledge/dono.example.yaml +45 -0
  347. package/template/pods/content-carousel/knowledge/identidade-visual-mascote.md +62 -0
  348. package/template/pods/content-carousel/knowledge/image-generation.md +62 -0
  349. package/template/pods/content-carousel/knowledge/selecao-de-ancora.md +60 -0
  350. package/template/pods/content-carousel/knowledge/slides-html.md +56 -0
  351. package/template/pods/content-carousel/memory/README.md +18 -0
  352. package/template/pods/content-carousel/memory/learnings.consolidated.md +6 -0
  353. package/template/pods/content-carousel/memory/learnings.jsonl +0 -0
  354. package/template/pods/content-carousel/pod-spec.json +100 -0
  355. package/template/pods/content-carousel/squad-io.yaml +10 -0
  356. package/template/pods/content-carousel/templates/assembly-tmpl.md +23 -0
  357. package/template/pods/content-carousel/templates/digest-tmpl.md +29 -0
  358. package/template/pods/content-carousel/templates/visuals-tmpl.md +20 -0
  359. package/template/pods/content-carousel/workflows/wf-content-carousel.smoke.json +23 -0
  360. package/template/pods/content-carousel/workflows/wf-content-carousel.yaml +80 -0
  361. package/template/pods/dev-ia/README.md +45 -0
  362. package/template/pods/dev-ia/agents/db-architect.md +33 -0
  363. package/template/pods/dev-ia/agents/ux-architect.md +29 -0
  364. package/template/pods/dev-ia/knowledge/db/migration-protocol.md +95 -0
  365. package/template/pods/dev-ia/knowledge/db/rls-patterns.md +101 -0
  366. package/template/pods/dev-ia/knowledge/db/schema-review-checklist.md +76 -0
  367. package/template/pods/dev-ia/memory/README.md +16 -0
  368. package/template/pods/dev-ia/memory/learnings.consolidated.md +8 -0
  369. package/template/pods/dev-ia/memory/learnings.jsonl +0 -0
  370. package/template/pods/dev-ia/pod-spec.json +34 -0
  371. package/template/pods/dev-ia/templates/schema-review-tmpl.md +23 -0
  372. package/template/pods/dev-ia/templates/ux-flow-review-tmpl.md +23 -0
  373. package/template/pods/dev-ia/tools/db-ops/backup-manager.sh +321 -0
  374. package/template/pods/dev-ia/tools/db-ops/best-practices-auditor.sh +534 -0
  375. package/template/pods/dev-ia/tools/db-ops/bootstrap-runner.sh +255 -0
  376. package/template/pods/dev-ia/tools/db-ops/data-loader.sh +616 -0
  377. package/template/pods/dev-ia/tools/db-ops/detect-database.sh +113 -0
  378. package/template/pods/dev-ia/tools/db-ops/explain-analyzer.sh +285 -0
  379. package/template/pods/dev-ia/tools/db-ops/health-checker.sh +323 -0
  380. package/template/pods/dev-ia/tools/db-ops/migration-runner.sh +308 -0
  381. package/template/pods/dev-ia/tools/db-ops/postgresql-schema-loader.sh +334 -0
  382. package/template/pods/dev-ia/tools/db-ops/query-runner.sh +171 -0
  383. package/template/pods/dev-ia/tools/db-ops/rls-policy-installer.sh +480 -0
  384. package/template/pods/dev-ia/tools/db-ops/rls-test-suite.sh +172 -0
  385. package/template/pods/dev-ia/tools/db-ops/schema-context-loader.sh +176 -0
  386. package/template/pods/hormozi-method/README.md +52 -0
  387. package/template/pods/hormozi-method/agents/acquisition-strategist.md +33 -0
  388. package/template/pods/hormozi-method/agents/conversion-copywriter.md +34 -0
  389. package/template/pods/hormozi-method/agents/monetization-architect.md +35 -0
  390. package/template/pods/hormozi-method/agents/offer-engineer.md +37 -0
  391. package/template/pods/hormozi-method/knowledge/core-four-leads.md +51 -0
  392. package/template/pods/hormozi-method/knowledge/grand-slam-offer.md +66 -0
  393. package/template/pods/hormozi-method/knowledge/growth-decision.md +38 -0
  394. package/template/pods/hormozi-method/knowledge/hooks-and-ads.md +56 -0
  395. package/template/pods/hormozi-method/knowledge/launch-email.md +31 -0
  396. package/template/pods/hormozi-method/knowledge/money-model.md +46 -0
  397. package/template/pods/hormozi-method/knowledge/opportunity-screening.md +44 -0
  398. package/template/pods/hormozi-method/knowledge/pages.md +25 -0
  399. package/template/pods/hormozi-method/knowledge/pos-lancamento-leads.md +56 -0
  400. package/template/pods/hormozi-method/knowledge/pricing.md +36 -0
  401. package/template/pods/hormozi-method/knowledge/retention-ltv.md +37 -0
  402. package/template/pods/hormozi-method/knowledge/scale-roadmap.md +35 -0
  403. package/template/pods/hormozi-method/knowledge/swipefiles-curados.md +44 -0
  404. package/template/pods/hormozi-method/knowledge/value-equation-diagnostic.md +77 -0
  405. package/template/pods/hormozi-method/memory/README.md +16 -0
  406. package/template/pods/hormozi-method/memory/learnings.consolidated.md +6 -0
  407. package/template/pods/hormozi-method/memory/learnings.jsonl +0 -0
  408. package/template/pods/hormozi-method/pod-spec.json +50 -0
  409. package/template/pods/hormozi-method/specs/wf-full-launch-sequence.spec.json +149 -0
  410. package/template/pods/hormozi-method/specs/wf-lead-magnet-pipeline.spec.json +125 -0
  411. package/template/pods/hormozi-method/specs/wf-money-model-design.spec.json +117 -0
  412. package/template/pods/hormozi-method/specs/wf-paid-ads-campaign.spec.json +132 -0
  413. package/template/pods/hormozi-method/specs/wf-scaling-diagnostic.spec.json +121 -0
  414. package/template/pods/hormozi-method/squad-io.yaml +43 -0
  415. package/template/pods/hormozi-method/templates/conversion-copywriter-tmpl.md +20 -0
  416. package/template/pods/hormozi-method/templates/launch-execucao-tmpl.md +17 -0
  417. package/template/pods/hormozi-method/templates/launch-fechamento-tmpl.md +17 -0
  418. package/template/pods/hormozi-method/templates/launch-pos-tmpl.md +17 -0
  419. package/template/pods/hormozi-method/templates/launch-preparacao-tmpl.md +17 -0
  420. package/template/pods/hormozi-method/templates/lm-copy-tmpl.md +17 -0
  421. package/template/pods/hormozi-method/templates/lm-distribuicao-tmpl.md +18 -0
  422. package/template/pods/hormozi-method/templates/lm-estrategia-tmpl.md +17 -0
  423. package/template/pods/hormozi-method/templates/mm-arquitetura-tmpl.md +18 -0
  424. package/template/pods/hormozi-method/templates/mm-copy-tmpl.md +17 -0
  425. package/template/pods/hormozi-method/templates/mm-diagnostico-tmpl.md +14 -0
  426. package/template/pods/hormozi-method/templates/monetization-architect-tmpl.md +17 -0
  427. package/template/pods/hormozi-method/templates/offer-engineer-tmpl.md +20 -0
  428. package/template/pods/hormozi-method/templates/paid-criativos-tmpl.md +19 -0
  429. package/template/pods/hormozi-method/templates/paid-fundacao-tmpl.md +17 -0
  430. package/template/pods/hormozi-method/templates/paid-teste-escala-tmpl.md +17 -0
  431. package/template/pods/hormozi-method/templates/scaling-diagnostico-tmpl.md +17 -0
  432. package/template/pods/hormozi-method/templates/scaling-priorizacao-tmpl.md +17 -0
  433. package/template/pods/hormozi-method/templates/scaling-roadmap-tmpl.md +17 -0
  434. package/template/pods/hormozi-method/workflows/wf-full-launch-sequence.smoke.json +12 -0
  435. package/template/pods/hormozi-method/workflows/wf-full-launch-sequence.yaml +56 -0
  436. package/template/pods/hormozi-method/workflows/wf-grand-slam-offer.smoke.json +11 -0
  437. package/template/pods/hormozi-method/workflows/wf-grand-slam-offer.yaml +45 -0
  438. package/template/pods/hormozi-method/workflows/wf-lead-magnet-pipeline.smoke.json +9 -0
  439. package/template/pods/hormozi-method/workflows/wf-lead-magnet-pipeline.yaml +45 -0
  440. package/template/pods/hormozi-method/workflows/wf-money-model-design.smoke.json +11 -0
  441. package/template/pods/hormozi-method/workflows/wf-money-model-design.yaml +45 -0
  442. package/template/pods/hormozi-method/workflows/wf-paid-ads-campaign.smoke.json +9 -0
  443. package/template/pods/hormozi-method/workflows/wf-paid-ads-campaign.yaml +46 -0
  444. package/template/pods/hormozi-method/workflows/wf-scaling-diagnostic.smoke.json +11 -0
  445. package/template/pods/hormozi-method/workflows/wf-scaling-diagnostic.yaml +44 -0
  446. package/template/pods/squad-forge/README.md +53 -0
  447. package/template/pods/squad-forge/agents/forge-chief.md +31 -0
  448. package/template/pods/squad-forge/agents/mind-extractor.md +29 -0
  449. package/template/pods/squad-forge/agents/pod-critic.md +26 -0
  450. package/template/pods/squad-forge/config/heuristic-watcher-rubric.yaml +74 -0
  451. package/template/pods/squad-forge/knowledge/fidelity-rubric.yaml +176 -0
  452. package/template/pods/squad-forge/knowledge/g6-memory-check.md +17 -0
  453. package/template/pods/squad-forge/knowledge/memory-ingest.md +16 -0
  454. package/template/pods/squad-forge/knowledge/source-audit-rubric.yaml +60 -0
  455. package/template/pods/squad-forge/memory/README.md +16 -0
  456. package/template/pods/squad-forge/memory/learnings.consolidated.md +8 -0
  457. package/template/pods/squad-forge/memory/learnings.jsonl +0 -0
  458. package/template/pods/squad-forge/pod-spec.json +166 -0
  459. package/template/pods/squad-forge/squad-io.yaml +13 -0
  460. package/template/pods/squad-forge/tasks/pipeline.md +158 -0
  461. package/template/pods/squad-forge/templates/discovery-tmpl.md +40 -0
  462. package/template/pods/squad-forge/templates/generation-tmpl.md +18 -0
  463. package/template/pods/squad-forge/templates/red-team-tmpl.md +17 -0
  464. package/template/pods/squad-forge/templates/register-tmpl.md +17 -0
  465. package/template/pods/squad-forge/templates/workflow-tmpl.yaml +101 -0
  466. package/template/pods/squad-forge/workflows/wf-forge.smoke.json +12 -0
  467. package/template/pods/squad-forge/workflows/wf-forge.yaml +60 -0
@@ -0,0 +1,99 @@
1
+ 'use strict';
2
+ /**
3
+ * uninstall.js — remoção do POWER CLAUDE do cwd.
4
+ *
5
+ * Regras:
6
+ * - Remove EXATAMENTE os arquivos do manifest cujo hash continua idêntico ao
7
+ * instalado.
8
+ * - Arquivos modificados pelo usuário (ou mesclados, origin "merged"): lista e
9
+ * pergunta um a um; em --yes, preserva todos.
10
+ * - Remove diretórios que ficarem vazios.
11
+ * - NUNCA toca em arquivos fora do manifest.
12
+ */
13
+
14
+ const fs = require('node:fs');
15
+ const path = require('node:path');
16
+ const { readManifest, manifestPath, MANIFEST_DIR, sha256OfFile } = require('./manifest');
17
+ const { createPrompter, pruneEmptyDirs } = require('./util');
18
+
19
+ async function uninstall({ yes = false } = {}) {
20
+ const destDir = process.cwd();
21
+ const manifest = readManifest(destDir);
22
+ if (!manifest) {
23
+ console.error('Nenhuma instalação encontrada (.power-claude/manifest.json ausente). Nada a fazer.');
24
+ return 1;
25
+ }
26
+
27
+ console.log(`POWER CLAUDE uninstall — ${destDir} (versão instalada: ${manifest.version})\n`);
28
+
29
+ const intact = [];
30
+ const modified = [];
31
+ const missing = [];
32
+ for (const entry of manifest.files) {
33
+ const p = path.join(destDir, ...entry.path.split('/'));
34
+ if (!fs.existsSync(p)) {
35
+ missing.push(entry);
36
+ } else if (entry.origin === 'merged' || sha256OfFile(p) !== entry.sha256) {
37
+ modified.push(entry);
38
+ } else {
39
+ intact.push(entry);
40
+ }
41
+ }
42
+
43
+ const toRemove = [...intact];
44
+ const preserved = [];
45
+
46
+ if (modified.length > 0) {
47
+ console.log('Arquivos modificados por você (ou mesclados com seu conteúdo) desde a instalação:');
48
+ for (const entry of modified) console.log(` - ${entry.path}${entry.origin === 'merged' ? ' (merged)' : ''}`);
49
+ if (yes) {
50
+ console.log('Modo --yes: todos os modificados serão PRESERVADOS.\n');
51
+ preserved.push(...modified);
52
+ } else {
53
+ const prompter = createPrompter();
54
+ try {
55
+ for (const entry of modified) {
56
+ const remove = await prompter.confirm(` Remover ${entry.path} mesmo modificado?`, false);
57
+ if (remove) toRemove.push(entry);
58
+ else preserved.push(entry);
59
+ }
60
+ } finally {
61
+ prompter.close();
62
+ }
63
+ }
64
+ }
65
+
66
+ let removedCount = 0;
67
+ for (const entry of toRemove) {
68
+ const p = path.join(destDir, ...entry.path.split('/'));
69
+ try {
70
+ fs.unlinkSync(p);
71
+ removedCount++;
72
+ pruneEmptyDirs(path.dirname(p), destDir);
73
+ } catch (error) {
74
+ console.error(`Erro ao remover ${entry.path}: ${error.message}`);
75
+ }
76
+ }
77
+
78
+ // Remove o manifest e o diretório .power-claude se vazio.
79
+ try {
80
+ fs.unlinkSync(manifestPath(destDir));
81
+ pruneEmptyDirs(path.join(destDir, MANIFEST_DIR), destDir);
82
+ } catch (error) {
83
+ console.error(`Erro ao remover manifest: ${error.message}`);
84
+ }
85
+
86
+ console.log('\n--- Relatório de remoção ---');
87
+ console.log(`Removidos: ${removedCount}`);
88
+ if (preserved.length > 0) {
89
+ console.log('Preservados (modificados por você):');
90
+ for (const entry of preserved) console.log(` - ${entry.path}`);
91
+ }
92
+ if (missing.length > 0) {
93
+ console.log(`Já ausentes: ${missing.length}`);
94
+ }
95
+ console.log('\nPOWER CLAUDE removido.');
96
+ return 0;
97
+ }
98
+
99
+ module.exports = { uninstall };
@@ -0,0 +1,376 @@
1
+ 'use strict';
2
+ /**
3
+ * update.js — atualização de uma instalação existente do POWER CLAUDE.
4
+ *
5
+ * Recompara template atual vs manifest:
6
+ * - arquivo intacto (hash no disco == hash do manifest) → atualiza para a
7
+ * versão nova do template;
8
+ * - modificado pelo usuário → mostra diff resumido e pergunta (--yes preserva
9
+ * o do usuário);
10
+ * - novos arquivos do template → adiciona;
11
+ * - pods que o usuário optou por não instalar (nenhum rastro no manifest nem
12
+ * no disco) continuam de fora;
13
+ * - `.claude/settings.json` → re-merge aditivo (`hooks`/`permissions` acrescentam
14
+ * a entrada nova do template sem remover o que o usuário tem; nas demais
15
+ * chaves, chaves novas do template entram, chaves do usuário são preservadas).
16
+ *
17
+ * `--scope motor` (SF10.20 / ADR-019 `DF-SF10.20-5`): restringe a atualização às
18
+ * entradas de `motor-scripts.json` (ADR-007) cujo owner está instalado, e trata
19
+ * divergência como DEFASAGEM (sobrescreve), não como customização do usuário. Ver
20
+ * `updateScopedMotor` abaixo para o porquê de a precedência ser outra nesse escopo.
21
+ */
22
+
23
+ const fs = require('node:fs');
24
+ const path = require('node:path');
25
+ const { readManifest, writeManifest, sha256OfFile } = require('./manifest');
26
+ const { walkFiles, createPrompter, ensureParentDir, diffSummary } = require('./util');
27
+ const { podOf, SETTINGS_REL } = require('./copy');
28
+ const { motorEntries, ownerInstalled } = require('./motor-scripts');
29
+
30
+ const SCOPES = new Set(['motor']);
31
+
32
+ async function update({ yes = false, scope = null } = {}) {
33
+ const destDir = process.cwd();
34
+ const pkgRoot = path.resolve(__dirname, '..');
35
+ const templateDir = path.join(pkgRoot, 'template');
36
+ const pkg = require(path.join(pkgRoot, 'package.json'));
37
+
38
+ if (scope !== null && !SCOPES.has(scope)) {
39
+ console.error(`Escopo desconhecido: "${scope}". Escopos válidos: ${[...SCOPES].join(', ')}.`);
40
+ return 2;
41
+ }
42
+
43
+ const manifest = readManifest(destDir);
44
+ if (!manifest) {
45
+ console.error('Nenhuma instalação encontrada. Rode "power-claude install" primeiro.');
46
+ return 1;
47
+ }
48
+
49
+ if (scope === 'motor') return updateScopedMotor({ yes, destDir, pkgRoot, pkg, manifest });
50
+
51
+ console.log(`POWER CLAUDE update — ${manifest.version} → ${pkg.version} em ${destDir}\n`);
52
+
53
+ const manifestMap = new Map(manifest.files.map((f) => [f.path, f]));
54
+ const installedPods = new Set(
55
+ manifest.files.map((f) => podOf(f.path)).filter(Boolean)
56
+ );
57
+
58
+ // Fontes: template/ inteiro + scripts do motor (manifest ADR-007) do pacote.
59
+ // Incluir nas MESMAS listas `sources` — o contrato de preservação existente é
60
+ // keyed por path+hash, não por viver sob template/ (nenhum caminho paralelo).
61
+ const sources = walkFiles(templateDir).map((rel) => ({ rel, src: path.join(templateDir, ...rel.split('/')) }));
62
+ for (const { path: rel } of motorEntries()) {
63
+ const src = path.join(pkgRoot, ...rel.split('/'));
64
+ if (fs.existsSync(src)) sources.push({ rel, src });
65
+ }
66
+
67
+ const report = { updated: [], added: [], preserved: [], unchanged: [], merged: [], skippedPods: new Set() };
68
+ const newEntries = [];
69
+ const prompter = yes ? null : createPrompter();
70
+
71
+ try {
72
+ for (const { rel, src } of sources) {
73
+ const pod = podOf(rel);
74
+ const destPath = path.join(destDir, ...rel.split('/'));
75
+ const destExists = fs.existsSync(destPath);
76
+ const entry = manifestMap.get(rel);
77
+
78
+ // Pod que o usuário optou por não instalar: sem rastro no manifest nem no disco.
79
+ if (pod && !installedPods.has(pod) && !destExists && !entry) {
80
+ report.skippedPods.add(pod);
81
+ continue;
82
+ }
83
+
84
+ // settings.json: re-merge aditivo (hooks/permissions; override raso nas demais chaves).
85
+ if (rel === SETTINGS_REL && destExists) {
86
+ const result = remergeSettings(src, destPath);
87
+ if (result.merged) {
88
+ newEntries.push({ path: rel, sha256: result.sha256, origin: 'merged' });
89
+ report.merged.push(rel);
90
+ } else {
91
+ report.preserved.push(`${rel} (JSON inválido no destino; mantido sem merge)`);
92
+ if (entry) newEntries.push(entry);
93
+ }
94
+ continue;
95
+ }
96
+
97
+ const srcHash = sha256OfFile(src);
98
+
99
+ if (!destExists) {
100
+ // Novo no template, ou removido do disco: (re)instala.
101
+ ensureParentDir(destPath);
102
+ fs.copyFileSync(src, destPath);
103
+ newEntries.push({ path: rel, sha256: srcHash });
104
+ (entry ? report.updated : report.added).push(rel);
105
+ continue;
106
+ }
107
+
108
+ const destHash = sha256OfFile(destPath);
109
+
110
+ if (destHash === srcHash) {
111
+ newEntries.push({ path: rel, sha256: srcHash });
112
+ report.unchanged.push(rel);
113
+ continue;
114
+ }
115
+
116
+ const userModified = !entry || destHash !== entry.sha256 || entry.origin === 'merged';
117
+ if (!userModified) {
118
+ // Intacto desde a instalação → atualiza sem perguntar.
119
+ fs.copyFileSync(src, destPath);
120
+ newEntries.push({ path: rel, sha256: srcHash });
121
+ report.updated.push(rel);
122
+ continue;
123
+ }
124
+
125
+ // Modificado pelo usuário: diff resumido + decisão.
126
+ let overwrite = false;
127
+ if (!yes && prompter) {
128
+ printDiffSummary(rel, destPath, src);
129
+ overwrite = await prompter.confirm(` Substituir SEU ${rel} pela versão nova do template?`, false);
130
+ }
131
+ if (overwrite) {
132
+ fs.copyFileSync(src, destPath);
133
+ newEntries.push({ path: rel, sha256: srcHash });
134
+ report.updated.push(rel);
135
+ } else {
136
+ report.preserved.push(rel);
137
+ if (entry) newEntries.push(entry); // mantém o hash de instalação original
138
+ }
139
+ }
140
+ } finally {
141
+ if (prompter) prompter.close();
142
+ }
143
+
144
+ // Arquivos do manifest que saíram do template: permanecem no disco e no manifest.
145
+ const sourceRels = new Set(sources.map((s) => s.rel));
146
+ for (const entry of manifest.files) {
147
+ if (!sourceRels.has(entry.path)) {
148
+ newEntries.push(entry);
149
+ report.preserved.push(`${entry.path} (não faz mais parte do template; mantido)`);
150
+ }
151
+ }
152
+
153
+ writeManifest(destDir, {
154
+ version: pkg.version,
155
+ installedAt: manifest.installedAt,
156
+ updatedAt: new Date().toISOString(),
157
+ files: newEntries,
158
+ });
159
+
160
+ report.skippedPods = [...report.skippedPods];
161
+ console.log('\n--- Relatório de atualização ---');
162
+ console.log(`Atualizados: ${report.updated.length}`);
163
+ console.log(`Adicionados (novos no template): ${report.added.length}`);
164
+ console.log(`Sem mudança: ${report.unchanged.length}`);
165
+ if (report.merged.length > 0) console.log(`Mesclados: ${report.merged.join(', ')}`);
166
+ if (report.preserved.length > 0) {
167
+ console.log('Preservados (seus, não sobrescritos):');
168
+ for (const f of report.preserved) console.log(` - ${f}`);
169
+ }
170
+ if (report.skippedPods.length > 0) {
171
+ console.log(`Pods não instalados (mantidos de fora): ${report.skippedPods.join(', ')}`);
172
+ }
173
+ console.log('\nAtualização concluída.');
174
+ return 0;
175
+ }
176
+
177
+ /**
178
+ * SF10.20 / ADR-019 `DF-SF10.20-5` — plano do sync escopado ao motor. PURO (só lê
179
+ * disco, nada escreve) para que a tabela de auditoria e o teste vejam exatamente o
180
+ * mesmo cálculo que a escrita usa.
181
+ *
182
+ * Estados: `same` (byte-idêntico), `stale` (diverge → será sobrescrito), `missing`
183
+ * (ausente → será instalado), `skipped-owner` (owner do script não instalado neste
184
+ * projeto — ADR-007 Decisão 3; fora do escopo, não é dívida).
185
+ */
186
+ function planMotorSync({ pkgRoot, destDir }) {
187
+ const rows = [];
188
+ for (const { path: rel, owner } of motorEntries()) {
189
+ const src = path.join(pkgRoot, ...rel.split('/'));
190
+ if (!fs.existsSync(src)) continue; // entrada do manifesto sem fonte no pacote
191
+ if (!ownerInstalled(destDir, owner)) {
192
+ rows.push({ rel, owner, state: 'skipped-owner', srcHash: null, destHash: null });
193
+ continue;
194
+ }
195
+ const destPath = path.join(destDir, ...rel.split('/'));
196
+ const srcHash = sha256OfFile(src);
197
+ if (!fs.existsSync(destPath)) {
198
+ rows.push({ rel, owner, state: 'missing', srcHash, destHash: null });
199
+ continue;
200
+ }
201
+ const destHash = sha256OfFile(destPath);
202
+ rows.push({ rel, owner, state: destHash === srcHash ? 'same' : 'stale', srcHash, destHash });
203
+ }
204
+ return rows;
205
+ }
206
+
207
+ /**
208
+ * `power-claude update --scope motor`.
209
+ *
210
+ * Duas diferenças deliberadas em relação ao update completo, ambas de ADR-019:
211
+ *
212
+ * 1. ESCOPO — só as entradas de `motor-scripts.json` com owner instalado. O update
213
+ * sem escopo avalia o `template/` inteiro (centenas de arquivos: settings, hooks,
214
+ * skills, agentes), superfície sem relação causal com um motor defasado (ADR-004).
215
+ *
216
+ * 2. PRECEDÊNCIA — divergência é DEFASAGEM, não customização. No update completo,
217
+ * `destHash !== entry.sha256` significa "o usuário mexeu, preserve"; aplicada a
218
+ * scripts de motor, essa regra faz o sync reportar SUCESSO preservando justamente
219
+ * o binário velho que causou o defeito (é o achado que derrubou a presunção
220
+ * `adopt && update` da SF10.20). Aqui vale a semântica que o `install` sempre teve
221
+ * (`motor-scripts.js`: a cópia do motor é incondicional): script de motor não tem
222
+ * semântica de fork do usuário.
223
+ *
224
+ * Guarda-corpo da precedência: a tabela `sha256 antes → depois` é impressa ANTES de
225
+ * qualquer escrita, e a confirmação é ÚNICA para o conjunto (nunca 15 prompts, que é
226
+ * como se erra o clique no arquivo que importa). Reversível por git.
227
+ */
228
+ async function updateScopedMotor({ yes, destDir, pkgRoot, pkg, manifest }) {
229
+ console.log(`POWER CLAUDE update --scope motor — framework ${pkg.version} em ${destDir}`);
230
+ console.log('Escopo: scripts do motor (installer/motor-scripts.json, ADR-007) com owner instalado.\n');
231
+
232
+ const rows = planMotorSync({ pkgRoot, destDir });
233
+ const toWrite = rows.filter((r) => r.state === 'stale' || r.state === 'missing');
234
+ const same = rows.filter((r) => r.state === 'same');
235
+ const skipped = rows.filter((r) => r.state === 'skipped-owner');
236
+
237
+ printMotorTable(rows);
238
+ console.log(
239
+ `\nsame ${same.length} · defasados ${rows.filter((r) => r.state === 'stale').length} · ` +
240
+ `ausentes ${rows.filter((r) => r.state === 'missing').length} · owner-ausente(pulado) ${skipped.length}`
241
+ );
242
+
243
+ if (toWrite.length === 0) {
244
+ console.log('\nMotor já sincronizado — nada a escrever.');
245
+ // SF11.1 — o REGISTRO é recarimbado mesmo quando nenhum ARQUIVO muda.
246
+ //
247
+ // `frameworkRoot` (manifest.js) responde "de onde este comando rodou", e só é
248
+ // gravado por `writeManifest`. Enquanto esta função retornava aqui, uma instalação
249
+ // JÁ SINCRONIZADA não tinha nenhum comando suportado capaz de reancorar o campo
250
+ // (`adopt` recusa com manifest presente) — e o valor envelhecido só se manifesta
251
+ // muito depois, degradando para placeholder o comando de correção que a SF10.20
252
+ // criou, exatamente quando o dono está com uma rodada quebrada e mais precisa dele.
253
+ //
254
+ // O que é recarimbado: `frameworkRoot` e `updatedAt`. O que NÃO muda: `version`
255
+ // (mesma regra das linhas abaixo), as entradas de `files` (repassadas verbatim —
256
+ // nada é reclassificado, adicionado nem removido) e o relatório de console, que
257
+ // continua dizendo que nenhum arquivo foi escrito, porque nenhum foi.
258
+ writeManifest(destDir, {
259
+ version: manifest.version,
260
+ installedAt: manifest.installedAt,
261
+ updatedAt: new Date().toISOString(),
262
+ files: manifest.files,
263
+ });
264
+ console.log(
265
+ `Manifest: proveniência recarimbada (frameworkRoot=${pkgRoot}, updatedAt) — ` +
266
+ `0 arquivos escritos, ${manifest.files.length} entradas inalteradas, version mantida em ${manifest.version}.`
267
+ );
268
+ return 0;
269
+ }
270
+
271
+ if (!yes) {
272
+ const prompter = createPrompter();
273
+ let go = false;
274
+ try {
275
+ console.log(
276
+ '\nOs arquivos marcados DEFASADO serão SOBRESCRITOS (script de motor não tem\n' +
277
+ 'semântica de fork do usuário — divergência aqui é defasagem). Reversível por git.'
278
+ );
279
+ go = await prompter.confirm(`Aplicar as ${toWrite.length} escritas acima?`, false);
280
+ } finally {
281
+ prompter.close();
282
+ }
283
+ if (!go) {
284
+ console.log('\nCancelado — nenhum arquivo escrito.');
285
+ return 0;
286
+ }
287
+ }
288
+
289
+ for (const row of toWrite) {
290
+ const src = path.join(pkgRoot, ...row.rel.split('/'));
291
+ const destPath = path.join(destDir, ...row.rel.split('/'));
292
+ ensureParentDir(destPath);
293
+ fs.copyFileSync(src, destPath);
294
+ }
295
+
296
+ // Manifest: só as entradas DENTRO do escopo são reescritas; todo o resto do
297
+ // manifest fica intacto (um update escopado não pode alegar nada sobre o template).
298
+ const inScope = new Set(rows.filter((r) => r.state !== 'skipped-owner').map((r) => r.rel));
299
+ const entries = manifest.files.filter((f) => !inScope.has(f.path));
300
+ for (const row of rows) {
301
+ if (row.state === 'skipped-owner') continue;
302
+ entries.push({ path: row.rel, sha256: row.srcHash });
303
+ }
304
+
305
+ // `version` NÃO é bumpada: o template não foi atualizado, e um número que alegasse
306
+ // o contrário seria a mesma mentira que ADR-019 rejeitou nos oráculos de versão.
307
+ writeManifest(destDir, {
308
+ version: manifest.version,
309
+ installedAt: manifest.installedAt,
310
+ updatedAt: new Date().toISOString(),
311
+ files: entries,
312
+ });
313
+
314
+ console.log(`\n--- Relatório (escopo motor) ---`);
315
+ console.log(`Sobrescritos (defasados): ${rows.filter((r) => r.state === 'stale').length}`);
316
+ console.log(`Instalados (ausentes): ${rows.filter((r) => r.state === 'missing').length}`);
317
+ console.log(`Já idênticos: ${same.length}`);
318
+ console.log(`Manifest: ${inScope.size} entradas de motor regravadas; version mantida em ${manifest.version} (escopo não cobre o template).`);
319
+ const cliPath = path.join(pkgRoot, 'bin', 'cli.js');
320
+ console.log(
321
+ '\nAVISO — escopo é sticky por decisão sua, não pelo manifest: rodar\n' +
322
+ ` node ${cliPath} update\n` +
323
+ 'SEM --scope motor neste projeto volta a avaliar o template inteiro, instalando os\n' +
324
+ 'arquivos de template ausentes. Ver docs/mecanismos/update-scope-motor.md.'
325
+ );
326
+ console.log('\nAtualização (escopo motor) concluída.');
327
+ return 0;
328
+ }
329
+
330
+ function printMotorTable(rows) {
331
+ const width = Math.max(...rows.map((r) => r.rel.length), 4);
332
+ const label = { same: 'IGUAL ', stale: 'DEFASADO', missing: 'AUSENTE ', 'skipped-owner': 'PULADO ' };
333
+ console.log(`estado ${'path'.padEnd(width)} sha256 instalado → sha256 framework`);
334
+ for (const r of rows) {
335
+ const before = r.destHash ? r.destHash.slice(0, 12) : (r.state === 'missing' ? '(ausente) ' : '(n/a) ');
336
+ const after = r.srcHash ? r.srcHash.slice(0, 12) : '(n/a)';
337
+ const suffix = r.state === 'skipped-owner' ? `owner ${r.owner} não instalado` : `${before} → ${after}`;
338
+ console.log(`${label[r.state]} ${r.rel.padEnd(width)} ${suffix}`);
339
+ }
340
+ }
341
+
342
+ function remergeSettings(srcPath, destPath) {
343
+ const { shallowMergeSettings } = require('./copy');
344
+ const { sha256OfBuffer } = require('./manifest');
345
+ const templateObj = JSON.parse(fs.readFileSync(srcPath, 'utf8'));
346
+ let userObj;
347
+ try {
348
+ userObj = JSON.parse(fs.readFileSync(destPath, 'utf8'));
349
+ } catch {
350
+ return { merged: false };
351
+ }
352
+ const mergedObj = shallowMergeSettings(templateObj, userObj);
353
+ const content = JSON.stringify(mergedObj, null, 2) + '\n';
354
+ fs.writeFileSync(destPath, content, 'utf8');
355
+ return { merged: true, sha256: sha256OfBuffer(Buffer.from(content, 'utf8')) };
356
+ }
357
+
358
+ function printDiffSummary(rel, userPath, templatePath) {
359
+ try {
360
+ const userText = fs.readFileSync(userPath, 'utf8');
361
+ const templateText = fs.readFileSync(templatePath, 'utf8');
362
+ const diff = diffSummary(userText, templateText);
363
+ console.log(`\n ${rel} — diff resumido (seu arquivo → template novo):`);
364
+ console.log(` +${diff.added} linha(s) novas, -${diff.removed} linha(s) suas sairiam`);
365
+ for (const line of diff.sampleAdded) console.log(` + ${truncate(line)}`);
366
+ for (const line of diff.sampleRemoved) console.log(` - ${truncate(line)}`);
367
+ } catch {
368
+ console.log(`\n ${rel} — conteúdo binário ou ilegível; diff indisponível.`);
369
+ }
370
+ }
371
+
372
+ function truncate(line, max = 80) {
373
+ return line.length > max ? line.slice(0, max - 1) + '…' : line;
374
+ }
375
+
376
+ module.exports = { update, planMotorSync, remergeSettings };
@@ -0,0 +1,113 @@
1
+ 'use strict';
2
+ /**
3
+ * util.js — helpers compartilhados do instalador POWER CLAUDE.
4
+ * Node >= 18, sem dependências externas.
5
+ */
6
+
7
+ const fs = require('node:fs');
8
+ const path = require('node:path');
9
+ const readline = require('node:readline');
10
+
11
+ /** Converte um path relativo para separadores POSIX (formato canônico do manifest). */
12
+ function toPosix(relPath) {
13
+ return relPath.split(path.sep).join('/');
14
+ }
15
+
16
+ /**
17
+ * Percorre um diretório recursivamente e retorna os paths relativos (POSIX)
18
+ * de todos os arquivos, ordenados.
19
+ */
20
+ function walkFiles(rootDir) {
21
+ const out = [];
22
+ if (!fs.existsSync(rootDir)) return out;
23
+ const stack = [rootDir];
24
+ while (stack.length > 0) {
25
+ const dir = stack.pop();
26
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
27
+ const full = path.join(dir, entry.name);
28
+ if (entry.isDirectory()) {
29
+ stack.push(full);
30
+ } else if (entry.isFile()) {
31
+ out.push(toPosix(path.relative(rootDir, full)));
32
+ }
33
+ }
34
+ }
35
+ return out.sort();
36
+ }
37
+
38
+ /** Cria um prompter interativo (readline). Feche com .close() ao terminar. */
39
+ function createPrompter() {
40
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
41
+ return {
42
+ ask(question) {
43
+ return new Promise((resolve) => rl.question(question, (answer) => resolve(answer.trim())));
44
+ },
45
+ async confirm(question, defaultYes = true) {
46
+ const suffix = defaultYes ? ' [S/n] ' : ' [s/N] ';
47
+ const answer = (await this.ask(question + suffix)).toLowerCase();
48
+ if (answer === '') return defaultYes;
49
+ return answer === 's' || answer === 'sim' || answer === 'y' || answer === 'yes';
50
+ },
51
+ close() {
52
+ rl.close();
53
+ },
54
+ };
55
+ }
56
+
57
+ /** Garante que o diretório pai de filePath existe. */
58
+ function ensureParentDir(filePath) {
59
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
60
+ }
61
+
62
+ /**
63
+ * Remove diretórios vazios subindo a partir de startDir até (exclusive) stopDir.
64
+ */
65
+ function pruneEmptyDirs(startDir, stopDir) {
66
+ let dir = startDir;
67
+ const stop = path.resolve(stopDir);
68
+ while (path.resolve(dir) !== stop && path.resolve(dir).startsWith(stop)) {
69
+ try {
70
+ const entries = fs.readdirSync(dir);
71
+ if (entries.length > 0) break;
72
+ fs.rmdirSync(dir);
73
+ } catch {
74
+ break;
75
+ }
76
+ dir = path.dirname(dir);
77
+ }
78
+ }
79
+
80
+ /**
81
+ * Resumo de diff entre dois textos (sem LCS — contagem por multiconjunto de linhas).
82
+ * Retorna { added, removed, sampleAdded, sampleRemoved }.
83
+ */
84
+ function diffSummary(oldText, newText, sampleSize = 5) {
85
+ const count = (lines) => {
86
+ const map = new Map();
87
+ for (const l of lines) map.set(l, (map.get(l) || 0) + 1);
88
+ return map;
89
+ };
90
+ const oldLines = oldText.split(/\r?\n/);
91
+ const newLines = newText.split(/\r?\n/);
92
+ const oldCount = count(oldLines);
93
+ const newCount = count(newLines);
94
+
95
+ const removed = [];
96
+ for (const [line, n] of oldCount) {
97
+ const extra = n - (newCount.get(line) || 0);
98
+ for (let i = 0; i < extra; i++) removed.push(line);
99
+ }
100
+ const added = [];
101
+ for (const [line, n] of newCount) {
102
+ const extra = n - (oldCount.get(line) || 0);
103
+ for (let i = 0; i < extra; i++) added.push(line);
104
+ }
105
+ return {
106
+ added: added.length,
107
+ removed: removed.length,
108
+ sampleAdded: added.slice(0, sampleSize),
109
+ sampleRemoved: removed.slice(0, sampleSize),
110
+ };
111
+ }
112
+
113
+ module.exports = { toPosix, walkFiles, createPrompter, ensureParentDir, pruneEmptyDirs, diffSummary };
@@ -0,0 +1,64 @@
1
+ 'use strict';
2
+ /**
3
+ * wizard.js — perguntas de instalação do POWER CLAUDE.
4
+ *
5
+ * 3 perguntas:
6
+ * 1. Instalar todos os pods? [S/n] — se n, lista para escolher.
7
+ * 2. Inicializar git com commit inicial? [S/n] — pulada se já houver .git.
8
+ * 3. Informativo: .env.example para preencher depois.
9
+ *
10
+ * Modo --yes assume os padrões: todos os pods, git sim.
11
+ */
12
+
13
+ const fs = require('node:fs');
14
+ const path = require('node:path');
15
+
16
+ /**
17
+ * @param {object} opts
18
+ * @param {boolean} opts.yes
19
+ * @param {string[]} opts.pods nomes dos pods disponíveis
20
+ * @param {string} opts.destDir projeto destino
21
+ * @param {object|null} opts.prompter
22
+ * @returns {Promise<{selectedPods: string[], initGit: boolean}>}
23
+ */
24
+ async function runWizard({ yes, pods, destDir, prompter }) {
25
+ const hasGit = fs.existsSync(path.join(destDir, '.git'));
26
+
27
+ if (yes || !prompter) {
28
+ return { selectedPods: [...pods], initGit: !hasGit };
29
+ }
30
+
31
+ // Pergunta 1 — pods
32
+ let selectedPods = [...pods];
33
+ const allPods = await prompter.confirm(`Instalar todos os ${pods.length} pods?`, true);
34
+ if (!allPods) {
35
+ console.log('\nPods disponíveis:');
36
+ pods.forEach((name, i) => console.log(` ${i + 1}. ${name}`));
37
+ const answer = await prompter.ask('Quais instalar? (números separados por vírgula, vazio = todos) ');
38
+ const indexes = answer
39
+ .split(',')
40
+ .map((s) => Number.parseInt(s.trim(), 10))
41
+ .filter((n) => Number.isInteger(n) && n >= 1 && n <= pods.length);
42
+ if (indexes.length > 0) {
43
+ selectedPods = [...new Set(indexes)].sort((a, b) => a - b).map((n) => pods[n - 1]);
44
+ }
45
+ }
46
+
47
+ // Pergunta 2 — git
48
+ let initGit = false;
49
+ if (hasGit) {
50
+ console.log('\nRepositório git já existe — etapa de git init pulada.');
51
+ } else {
52
+ initGit = await prompter.confirm('Inicializar git com commit inicial?', true);
53
+ }
54
+
55
+ // Pergunta 3 — informativo
56
+ console.log(
57
+ '\nDica: se o template incluir um .env.example, copie-o para .env e preencha' +
58
+ ' suas variáveis depois da instalação. O .env nunca deve ser commitado.'
59
+ );
60
+
61
+ return { selectedPods, initGit };
62
+ }
63
+
64
+ module.exports = { runWizard };
package/package.json ADDED
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "@daniellins/power-claude",
3
+ "version": "0.16.3",
4
+ "description": "Lean, budget-gated agent framework for Claude Code — pods by job-to-be-done",
5
+ "author": "Daniel Lins",
6
+ "license": "MIT",
7
+ "bin": {
8
+ "power-claude": "bin/cli.js"
9
+ },
10
+ "publishConfig": {
11
+ "access": "public"
12
+ },
13
+ "engines": {
14
+ "node": ">=18"
15
+ },
16
+ "files": [
17
+ "bin",
18
+ "installer",
19
+ "template",
20
+ "scripts"
21
+ ],
22
+ "scripts": {
23
+ "test": "node scripts/validate-install.js && node scripts/validate-adopt.js && node scripts/validate-update-scope-motor.js && node scripts/__tests__/validate-pod-workflow.test.cjs && node scripts/__tests__/pc-run-pod.test.cjs && node scripts/__tests__/pc-run-pod-counter.test.cjs && node scripts/pc-run-pod-countgte.test.cjs && node scripts/forge.test.cjs && node scripts/forge-assess-tier.test.cjs && node scripts/forge-additive.test.cjs && node scripts/forge-canonical.test.cjs && node scripts/migration-manifest.test.cjs && node scripts/migration-manifest-sf3.2.test.cjs && node scripts/migration-manifest-sf3.3.test.cjs && node scripts/migration-manifest-sf5.5.test.cjs && node scripts/validate-no-clone.test.cjs && node scripts/migrate-squad-orchestration.test.cjs && node scripts/pod-memory.test.cjs && node scripts/pod-memory-budget.test.cjs && node scripts/pod-memory-note.test.cjs && node scripts/forge-harden-learning.test.cjs && node scripts/harden-knowledge.test.cjs && node scripts/consolidate-knowledge-runner.test.cjs && node scripts/smoke-pod-workflow.cjs scripts/__fixtures__/smoke-canary/workflows/wf-canary.yaml && node scripts/smoke-sweep.test.cjs && node scripts/smoke-isolation.test.cjs && node scripts/harness-g5-lite.test.cjs && node scripts/__tests__/motor-scripts.test.cjs && node scripts/validate-fidelity-output.test.cjs && node scripts/validate-source-audit.test.cjs && node scripts/arena.test.cjs && node scripts/veto-checks.test.cjs && node scripts/phash-gate.test.cjs && node scripts/render-png.test.cjs && node scripts/hn-carousel-contrato-entrada.test.cjs && node scripts/anti-path.test.cjs && node scripts/brief-leitura-obrigatoria.test.cjs && node scripts/pc-run-pipeline.test.cjs && node scripts/pod-export-compile.test.cjs && node scripts/pod-export-executor.test.cjs && node scripts/pod-export-postprocess.test.cjs && node scripts/pod-export-release.test.cjs && node scripts/pod-export-service.test.cjs && node scripts/pod-export-ui.test.cjs && node scripts/pod-export-hardening.test.cjs && node scripts/pod-export-queue-race.test.cjs && node scripts/npm-scope-invocation.test.cjs && node scripts/default-funcional.test.cjs && node scripts/owner-layer.test.cjs && node scripts/__tests__/enforce-cycle-authority.test.cjs && node scripts/__tests__/enforce-git-push-authority.test.cjs && node scripts/__tests__/validate-story-acs.test.cjs && node scripts/__tests__/enforce-ready-oracles.test.cjs && node scripts/__tests__/derive-ready-transitions.test.cjs && node installer/__tests__/doctor-ready-oracles.test.cjs && node installer/__tests__/merge-settings.test.cjs",
24
+ "validate": "node scripts/validate-budgets.js template/pods template/.claude/agents && node scripts/validate-branding.js && node scripts/validate-no-clone.cjs template"
25
+ }
26
+ }