wizz-method 2.17.2 → 2.19.0

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.
Files changed (177) hide show
  1. package/THIRD-PARTY-NOTICES.md +12 -0
  2. package/package.json +5 -3
  3. package/removals.txt +10 -0
  4. package/skills-registry.yaml +72 -42
  5. package/src/bmm-skills/1-analysis/wizz-set-feature/SKILL.md +9 -9
  6. package/src/bmm-skills/4-implementation/wizz-create-story/SKILL.md +1 -1
  7. package/src/bmm-skills/4-implementation/wizz-dev-story/SKILL.md +1 -1
  8. package/src/bmm-skills/4-implementation/wizz-qa-generate-e2e-tests/SKILL.md +1 -1
  9. package/src/bmm-skills/4-implementation/wizz-qa-generate-e2e-tests/checklist.md +1 -1
  10. package/src/bmm-skills/4-implementation/wizz-quick-dev/SKILL.md +1 -1
  11. package/src/bmm-skills/4-implementation/wizz-sprint-status/SKILL.md +5 -5
  12. package/src/bmm-skills/module-help.csv +1 -1
  13. package/src/bmm-skills/module.yaml +1 -1
  14. package/src/core-skills/_shared/handoff-protocol.md +5 -3
  15. package/src/modules/lowticket/skills/wizz-lowticket-funil/SKILL.md +1 -1
  16. package/src/modules/lowticket/skills/wizz-lowticket-guia/SKILL.md +1 -1
  17. package/src/modules/lowticket/skills/wizz-lowticket-metodologia/SKILL.md +1 -1
  18. package/src/modules/lowticket/skills/wizz-lowticket-minerador/SKILL.md +1 -1
  19. package/src/modules/lowticket/skills/wizz-lowticket-pagina/SKILL.md +1 -1
  20. package/src/modules/lowticket/skills/wizz-lowticket-trafego/SKILL.md +1 -1
  21. package/src/modules/wizz/_shared/cerebro.md +7 -7
  22. package/src/modules/wizz/_shared/communication-rules.md +1 -1
  23. package/src/modules/wizz/_shared/despacho-barato.md +1 -1
  24. package/src/modules/wizz/_shared/encerramento.md +4 -3
  25. package/src/modules/wizz/_shared/model-ladder.md +10 -0
  26. package/src/modules/wizz/_shared/organizacao.md +8 -4
  27. package/src/modules/wizz/_shared/token-economy.md +1 -1
  28. package/src/modules/wizz/_shared/video-pipeline.md +13 -3
  29. package/src/modules/wizz/agents/wizz-ads/SKILL.md +4 -1
  30. package/src/modules/wizz/agents/wizz-ads/customize.toml +12 -3
  31. package/src/modules/wizz/agents/wizz-ads/knowledge/playbook.md +36 -0
  32. package/src/modules/wizz/agents/wizz-copy/SKILL.md +4 -1
  33. package/src/modules/wizz/agents/wizz-copy/customize.toml +2 -3
  34. package/src/modules/wizz/agents/wizz-copy/knowledge/playbook.md +34 -0
  35. package/src/modules/wizz/agents/wizz-designer/SKILL.md +2 -2
  36. package/src/modules/wizz/agents/wizz-designer/customize.toml +2 -3
  37. package/src/modules/wizz/agents/wizz-growth/SKILL.md +4 -1
  38. package/src/modules/wizz/agents/wizz-growth/customize.toml +33 -4
  39. package/src/modules/wizz/agents/wizz-growth/knowledge/playbook.md +39 -0
  40. package/src/modules/wizz/agents/wizz-maestro/SKILL.md +7 -9
  41. package/src/modules/wizz/agents/wizz-maestro/customize.toml +2 -3
  42. package/src/modules/wizz/agents/wizz-memoria/SKILL.md +7 -7
  43. package/src/modules/wizz/agents/wizz-memoria/customize.toml +5 -6
  44. package/src/modules/wizz/agents/wizz-qa/SKILL.md +5 -6
  45. package/src/modules/wizz/agents/wizz-qa/customize.toml +3 -4
  46. package/src/modules/wizz/agents/wizz-seo/SKILL.md +4 -1
  47. package/src/modules/wizz/agents/wizz-seo/customize.toml +2 -3
  48. package/src/modules/wizz/agents/wizz-seo/knowledge/playbook.md +31 -0
  49. package/src/modules/wizz/agents/wizz-social/SKILL.md +5 -3
  50. package/src/modules/wizz/agents/wizz-social/customize.toml +12 -3
  51. package/src/modules/wizz/overrides/wizz-agent-analyst.toml +2 -2
  52. package/src/modules/wizz/overrides/wizz-agent-architect.toml +3 -3
  53. package/src/modules/wizz/overrides/wizz-agent-dev.toml +3 -3
  54. package/src/modules/wizz/overrides/wizz-agent-pm.toml +2 -2
  55. package/src/modules/wizz/overrides/wizz-agent-tech-writer.toml +2 -2
  56. package/src/modules/wizz/overrides/wizz-agent-ux-designer.toml +2 -2
  57. package/src/modules/wizz/subagents/codex/wizz-exec-standard.toml +1 -1
  58. package/src/modules/wizz/subagents/codex/wizz-exec-strong.toml +1 -1
  59. package/src/modules/wizz/subagents/gemini/wizz-exec-standard.md +1 -1
  60. package/src/modules/wizz/subagents/gemini/wizz-exec-strong.md +1 -1
  61. package/src/modules/wizz/subagents/opencode/wizz-exec-standard.md +1 -1
  62. package/src/modules/wizz/subagents/opencode/wizz-exec-strong.md +1 -1
  63. package/src/modules/wizz/subagents/spec.yaml +6 -6
  64. package/src/modules/wizz/subagents/wizz-exec-standard.md +1 -1
  65. package/src/modules/wizz/subagents/wizz-exec-strong.md +1 -1
  66. package/src/skills-lib/_shared/complexity-signal.md +8 -9
  67. package/src/skills-lib/_shared/dispatch-rule.yaml +21 -0
  68. package/src/skills-lib/{cerebro → wizz-cerebro}/SKILL.md +1 -1
  69. package/src/skills-lib/{ctc-align → wizz-ctc-align}/SKILL.md +1 -1
  70. package/src/skills-lib/{enhance-prompt → wizz-enhance-prompt}/SKILL.md +1 -1
  71. package/src/skills-lib/{find-skills → wizz-find-skills}/SKILL.md +1 -1
  72. package/src/skills-lib/wizz-hook-extractor/LICENSE +21 -0
  73. package/src/skills-lib/wizz-hook-extractor/SKILL.md +56 -0
  74. package/src/skills-lib/wizz-hook-extractor/references/examples.md +59 -0
  75. package/src/skills-lib/wizz-hook-extractor/references/formulas.md +136 -0
  76. package/src/skills-lib/wizz-hook-extractor/scripts/read-post.sh +83 -0
  77. package/src/skills-lib/wizz-huashu-design/references/sfx-library.md +1 -1
  78. package/src/skills-lib/wizz-huashu-design/scripts/add-music.sh +1 -1
  79. package/src/skills-lib/wizz-huashu-design/scripts/html2pptx.js +45 -37
  80. package/src/skills-lib/wizz-huashu-design/scripts/mix-voiceover.sh +1 -1
  81. package/src/skills-lib/wizz-huashu-design/scripts/narrate-pipeline.mjs +11 -5
  82. package/src/skills-lib/wizz-huashu-design/scripts/test_scripts.py +209 -0
  83. package/src/skills-lib/wizz-huashu-design/scripts/tts-doubao.mjs +42 -28
  84. package/src/skills-lib/wizz-ig-profile-optimizer/LICENSE +21 -0
  85. package/src/skills-lib/wizz-ig-profile-optimizer/SKILL.md +74 -0
  86. package/src/skills-lib/wizz-ig-profile-optimizer/scripts/capture-profile.sh +41 -0
  87. package/src/skills-lib/wizz-ig-profile-optimizer/scripts/limits.mjs +82 -0
  88. package/src/skills-lib/wizz-inicio-de-projeto/SKILL.md +1 -1
  89. package/src/skills-lib/wizz-launch-readiness/SKILL.md +7 -7
  90. package/src/skills-lib/wizz-launch-readiness/references/02-seguranca.md +3 -3
  91. package/src/skills-lib/wizz-launch-readiness/references/03-seo-descoberta.md +5 -5
  92. package/src/skills-lib/wizz-launch-readiness/references/04-analytics-medicao.md +1 -1
  93. package/src/skills-lib/wizz-launch-readiness/references/05-conteudo-prova-social.md +6 -6
  94. package/src/skills-lib/wizz-launch-readiness/references/06-legal-lgpd.md +1 -1
  95. package/src/skills-lib/wizz-launch-readiness/references/08-fusao-priorizacao.md +1 -1
  96. package/src/skills-lib/wizz-offer-forge/SKILL.md +3 -3
  97. package/src/skills-lib/{pesquisa-de-publico-do-piva → wizz-pesquisa-de-publico-do-piva}/README.md +1 -1
  98. package/src/skills-lib/{pesquisa-de-publico-do-piva → wizz-pesquisa-de-publico-do-piva}/SKILL.md +1 -1
  99. package/src/skills-lib/wizz-router/SKILL.md +3 -3
  100. package/src/skills-lib/wizz-router/references/routing-table-flat.md +11 -9
  101. package/src/skills-lib/{security-audit-pentest → wizz-security-audit-pentest}/SKILL.md +1 -1
  102. package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/SKILL.md +1 -1
  103. package/src/skills-lib/wizz-video-effects/SKILL.md +4 -3
  104. package/src/skills-lib/wizz-video-effects/references/data-contract.md +3 -3
  105. package/src/skills-lib/wizz-video-effects/scripts/fill_breaths.py +15 -1
  106. package/src/skills-lib/wizz-video-effects/scripts/test_fill_breaths.py +20 -0
  107. package/src/skills-lib/wizz-video-styles/SKILL.md +11 -5
  108. package/src/skills-lib/wizz-video-styles/data/recipes.json +65 -2
  109. package/src/skills-lib/wizz-video-styles/data/references.json +386 -1
  110. package/src/skills-lib/wizz-video-styles/data/styles.json +109 -0
  111. package/src/skills-lib/wizz-video-styles/references/generated-prompts.md +70 -0
  112. package/src/skills-lib/wizz-video-styles/references/measured-patterns.md +2 -0
  113. package/src/skills-lib/wizz-video-styles/references/style-picker.md +8 -4
  114. package/src/skills-lib/wizz-video-styles/references/styles/tipografia-cinetica.md +68 -0
  115. package/src/skills-lib/wizz-video-styles/references/styles/ui-morph.md +68 -0
  116. package/src/skills-lib/wizz-video-styles/scripts/analyze.sh +23 -10
  117. package/src/skills-lib/wizz-video-styles/scripts/beat_grid.py +68 -0
  118. package/src/skills-lib/wizz-video-styles/scripts/references.mjs +265 -0
  119. package/src/skills-lib/wizz-web-security/SKILL.md +1 -1
  120. package/tools/fetch-assets.mjs +1 -1
  121. package/tools/hooks/README.md +18 -14
  122. package/tools/hooks/rtk-rewrite.js +95 -0
  123. package/tools/hooks/security-defensive-context.js +17 -1
  124. package/tools/hooks/session-rules.js +25 -5
  125. package/tools/hooks/wizz-arrumar.js +126 -12
  126. package/tools/hooks/wizz-artifact-guard.js +41 -7
  127. package/tools/hooks/wizz-cerebro-lib.js +239 -0
  128. package/tools/hooks/wizz-close-reminder.js +124 -0
  129. package/tools/hooks/wizz-debug-lib.js +55 -0
  130. package/tools/hooks/wizz-decision-trace.js +19 -2
  131. package/tools/hooks/wizz-feature.js +20 -4
  132. package/tools/hooks/wizz-router-enforce.js +30 -13
  133. package/tools/installer/command-text.js +243 -0
  134. package/tools/installer/commands/catalog.js +2 -0
  135. package/tools/installer/commands/doctor.js +10 -12
  136. package/tools/installer/commands/fetch-assets.js +5 -5
  137. package/tools/installer/commands/install.js +6 -7
  138. package/tools/installer/commands/resolve.js +17 -17
  139. package/tools/installer/commands/trace-report.js +40 -37
  140. package/tools/installer/core/doctor.js +60 -55
  141. package/tools/installer/core/hooks-settings.js +88 -14
  142. package/tools/installer/core/hooks-smoke.js +134 -0
  143. package/tools/installer/core/installer.js +61 -52
  144. package/tools/installer/core/quick-update.js +2 -3
  145. package/tools/installer/install-text.js +201 -0
  146. package/tools/installer/modules/channel-plan.js +2 -2
  147. package/tools/installer/modules/env-vars.js +5 -6
  148. package/tools/installer/modules/skills-lib.js +1 -1
  149. package/tools/installer/ui.js +17 -9
  150. /package/src/skills-lib/{cerebro → wizz-cerebro}/references/comandos-pesquisa-e-memoria.md +0 -0
  151. /package/src/skills-lib/{cerebro → wizz-cerebro}/references/comandos-rotina-e-captura.md +0 -0
  152. /package/src/skills-lib/{cerebro → wizz-cerebro}/references/comandos-sessao.md +0 -0
  153. /package/src/skills-lib/{ctc-align → wizz-ctc-align}/scripts/align.py +0 -0
  154. /package/src/skills-lib/{enhance-prompt → wizz-enhance-prompt}/README.md +0 -0
  155. /package/src/skills-lib/{enhance-prompt → wizz-enhance-prompt}/references/KEYWORDS.md +0 -0
  156. /package/src/skills-lib/{pesquisa-de-publico-do-piva → wizz-pesquisa-de-publico-do-piva}/assets/template.html +0 -0
  157. /package/src/skills-lib/{pesquisa-de-publico-do-piva → wizz-pesquisa-de-publico-do-piva}/prompts.md +0 -0
  158. /package/src/skills-lib/{security-audit-pentest → wizz-security-audit-pentest}/references/stage-1-validacao-entrada.md +0 -0
  159. /package/src/skills-lib/{security-audit-pentest → wizz-security-audit-pentest}/references/stage-2-autorizacao.md +0 -0
  160. /package/src/skills-lib/{security-audit-pentest → wizz-security-audit-pentest}/references/stage-3-abuso-volume.md +0 -0
  161. /package/src/skills-lib/{security-audit-pentest → wizz-security-audit-pentest}/references/stage-4-vazamento-resposta.md +0 -0
  162. /package/src/skills-lib/{security-audit-pentest → wizz-security-audit-pentest}/references/stage-5-fusao-plano.md +0 -0
  163. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/01-cta-principal.md +0 -0
  164. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/02-barra-fixa-mobile.md +0 -0
  165. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/03-tempo-de-resposta.md +0 -0
  166. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/04-prova-social.md +0 -0
  167. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/05-faq-decisao.md +0 -0
  168. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/06-imagens-reais.md +0 -0
  169. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/07-endereco-como-chegar.md +0 -0
  170. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/08-titles.md +0 -0
  171. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/09-open-graph.md +0 -0
  172. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/10-breadcrumbs.md +0 -0
  173. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/11-alt-text.md +0 -0
  174. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/12-schema-local.md +0 -0
  175. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/13-robots-sitemap.md +0 -0
  176. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/14-privacidade-termos.md +0 -0
  177. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/15-medicao.md +0 -0
@@ -0,0 +1,243 @@
1
+ /**
2
+ * Text of the maintenance commands that run on an existing install:
3
+ * `wizz doctor` (core/doctor.js + core/hooks-smoke.js), `wizz resolve` and
4
+ * `wizz trace-report`. Merged into install-text.js, so `it()` and the en/pt
5
+ * key-parity test cover these keys too (pendência de 2026-10-15: these three
6
+ * commands only spoke Portuguese).
7
+ *
8
+ * The language comes from install-text.js `useCommandLang()`: WIZZ_LANG,
9
+ * then `communication_language` of the install, then English.
10
+ */
11
+
12
+ const en = {
13
+ // wizz doctor (commands/doctor.js)
14
+ doctorTitle: 'wizz doctor — project diagnosis\n',
15
+ doctorSummary: 'Summary: {ok} ok, {warn} warn, {error} error.',
16
+ doctorNextErrors: 'Next step: fix the ERROR items above (wizz update restores the hook files) and run wizz doctor again.',
17
+ doctorNextWarns: 'Next step: warns are optional or degrade single features; follow the hint in each block when it makes sense.',
18
+ doctorResolveHint: 'For the customization snapshots, the command is: wizz resolve',
19
+ doctorAllGood: 'All good: install intact, tools in place and no drift in _wizz/.',
20
+ doctorFailed: 'wizz doctor failed: {error}',
21
+
22
+ // checks (core/doctor.js)
23
+ docSkipped: 'skipped.',
24
+ docHooksMissingFiles: 'Hook files missing in _wizz/hooks/: {list}. Run wizz update to restore them.',
25
+ docHooksNotRegistered:
26
+ 'Files ok, but not registered in the PROJECT settings ({settings}): {list}. Not in the GLOBAL settings either ({global}). Run wizz install to register them in the project, or register them globally.',
27
+ docHooksSkippedNote: ' ({n} already registered in the global settings {global}, ok)',
28
+ docHooksOk: '{n} hooks checked{note}.',
29
+ docNoInstallHooks: 'No Wizz install in this directory (_wizz/ missing); project hooks not checked. Run wizz install.',
30
+ docRtkMissing:
31
+ 'rtk not found on PATH. Optional, but without it the rtk-rewrite.sh hook is not registered and the token savings do not run. Install: cargo install rtk',
32
+ docRtkOld: 'rtk {installed} is older than the hook floor ({floor}); the rewrite fails with a warn. Update: cargo install rtk',
33
+ docRtkOk: 'rtk {version} on PATH.',
34
+ docVersionUnknown: '(version not reported)',
35
+ docJqMissing:
36
+ 'jq not found on PATH. The rtk-rewrite.sh hook needs it; without jq the Bash rewrite warns and carries on without rewriting. Install: brew install jq',
37
+ docJqOk: 'jq on PATH.',
38
+ docPyOptional: 'Optional: the core runs on Node alone; Python only enables the skills that ship their own script ({skills}).',
39
+ docPyFull: 'Python {version} via {command} (tomllib ok): the Python skills run too.',
40
+ docPyFullNoPython3: 'Python {version} exists via {command}, but the scripts call python3, which is not on PATH. {optional}',
41
+ docPyPartial: 'Python {version} on PATH, without tomllib (the skills with their own script need 3.11+). {optional}',
42
+ docPyUnsupported: 'Python {version} is too old (the skills with their own script need 3.11+). {optional}',
43
+ docPyNone: 'python3 not found on PATH. {optional} To get them: brew install python3 (macOS).',
44
+ docDriftNoManifest:
45
+ 'files-manifest.csv not found in _wizz/_config/. Without it drift cannot be detected; run wizz update to generate it.',
46
+ docDriftEmpty: 'files-manifest.csv is empty, nothing to compare.',
47
+ docDriftOk: '{n} files match files-manifest.csv.',
48
+ docDriftChanged: '{n} changed',
49
+ docDriftMissing: '{n} missing',
50
+ docDriftAnd: ' and ',
51
+ docDriftWarn:
52
+ 'Drift in _wizz/: {parts} against files-manifest.csv (e.g. {examples}). Manual edits in _wizz/ are lost on the next update: move them to _wizz/custom/ and run wizz update.',
53
+ docNoInstallDrift: 'No Wizz install in this directory; drift not checked. Run wizz install.',
54
+ docResolvedNone: 'No installed skill has a customize.toml; nothing to resolve.',
55
+ docResolvedNoIndex: 'Index {file} missing or unreadable: cannot tell whether the {n} snapshots are up to date. Run wizz resolve.',
56
+ docResolvedOk: '{n} snapshots in _wizz/_resolved/ match the inputs that generated them.',
57
+ docResolvedMissing: '{n} without snapshot ({list})',
58
+ docResolvedStale: '{n} with a stale snapshot ({list})',
59
+ docResolvedPrefixStale: 'stale snapshot: run wizz resolve',
60
+ docResolvedPrefix: 'run wizz resolve',
61
+ docNoInstallResolved: 'No Wizz install in this directory; _wizz/_resolved/ snapshots not checked. Run wizz install.',
62
+ docInstrNoBlock: '{file} without the Wizz block at the top (run wizz install)',
63
+ docInstrNone: 'No CLAUDE.md/AGENTS.md in the project.',
64
+ docInstrOk: 'Wizz block present, no legacy rule.',
65
+ 'docLegacy.gsd': 'GSD was replaced by the Wizz Method phases and checkpoints',
66
+ 'docLegacy.superpowers': 'superpowers was replaced by the Wizz Method',
67
+ 'docLegacy.bmad': 'plain BMAD commands and folders became wizz-* and _wizz/',
68
+ 'docLegacy.modelo-aposentado': 'retired model ID; the Wizz ladder uses the current aliases',
69
+
70
+ // hooks-run (core/hooks-smoke.js)
71
+ hrBroke: '{id}: broke ({why}){tail}',
72
+ hrNoLibs: '{id}: cannot load its libs ({line})',
73
+ hrSwallowed: '{id}: swallowed error ({line})',
74
+ hrPartialCopy: 'Partial copy in _wizz/hooks/? Run wizz update to restore it.',
75
+ hrOk: '{n} hook(s) run with a minimal payload, no swallowed error.',
76
+
77
+ // wizz resolve (commands/resolve.js)
78
+ rsNoInstall: 'No Wizz install in this directory (_wizz/ missing). Run wizz install first.',
79
+ rsSkillMissing: 'Skill "{skill}" has no customize.toml anywhere in this project.',
80
+ rsSearched: 'Looked in:\n {list}',
81
+ rsOneDone: 'wizz resolve — {written} snapshot written, {skipped} skipped (skill {skill}).',
82
+ rsConfigOk: '_config.json rewritten',
83
+ rsConfigMissing: '_config.json NOT generated (config.toml missing or invalid)',
84
+ rsNoToml: 'No customize.toml in this project (neither in _wizz/ nor in the IDE skill folders).',
85
+ rsPruned: '{n} orphan snapshot(s) removed from _wizz/_resolved/.',
86
+ rsUpdateHint: '{config}. If the install looks incomplete, run: wizz update',
87
+ rsWritten: '{n} snapshot(s) written',
88
+ rsSkipped: '{n} skipped',
89
+ rsOrphans: '{n} orphan(s) removed',
90
+ rsDone: 'wizz resolve — {parts} in _wizz/_resolved/.',
91
+ rsSkippedNote:
92
+ 'Skipped skills have an invalid customize.toml: their snapshot was removed and activation falls back to the raw customize.toml until the file is fixed.',
93
+ rsFailed: 'wizz resolve failed: {error}',
94
+
95
+ // wizz trace-report (commands/trace-report.js)
96
+ trCatalog: 'Catalog: {n} skills ({file})',
97
+ trDecisions: 'Decision traces: {n}',
98
+ trSelected: 'Selected (sel): {n} ({pct})',
99
+ trDiscarded: 'Discarded with reason: {n} ({pct})',
100
+ trNever: 'Never considered: {n} ({pct})',
101
+ trCoverage: 'Catalog coverage: {pct}',
102
+ trNoDecisions: '(no decision trace found; run with WIZZ_TRACE=1 and close routed requests to generate data)',
103
+ trNeverNone: 'Never considered: none, catalog 100% covered.',
104
+ trNeverHeader: 'Never considered:',
105
+ trFile: 'File: {file}',
106
+ trTotal: 'Total lines: {n}',
107
+ trTrivial: 'Trivial: {n}',
108
+ trRouted: 'Routed: {n}',
109
+ trModeWizz: ' wizz mode: {n}',
110
+ trModeFlat: ' flat mode: {n}',
111
+ trModeNull: ' null mode: {n}',
112
+ trWarnings: 'With warnings: {n}',
113
+ trPeriod: 'Period: {first} → {last}',
114
+ trCorrupted: 'Ignored lines (corrupted): {n}',
115
+ trLadderTotal: 'Routed requests with ladder data: {n}',
116
+ trLadderExec: 'Invoked some wizz-exec-*: {n} ({pct})',
117
+ trByRoute: 'By route:',
118
+ trNoData: ' (no data)',
119
+ trByTier: 'By tier (execs) (wizz-exec-*, legacy names count in the new tier):',
120
+ trNoTrace: 'No trace found.',
121
+ trExpected: 'Expected location: {file}',
122
+ trHowTo: 'Run install and turn on the routing meter, or export WIZZ_TRACE=1.',
123
+ trCatalogFail: 'Could not read the skill catalog: {error}',
124
+ trCatalogExpected: 'Expected at: {file}',
125
+ trCoverageTitle: 'Skill Catalog Coverage',
126
+ trLadderTitle: 'Model Ladder Adherence',
127
+ trFailed: 'Trace report failed: {error}',
128
+ };
129
+
130
+ const pt = {
131
+ doctorTitle: 'wizz doctor — diagnóstico do projeto\n',
132
+ doctorSummary: 'Resumo: {ok} ok, {warn} warn, {error} error.',
133
+ doctorNextErrors: 'Próximo passo: corrija os itens com ERROR acima (wizz update repõe os arquivos de hook) e rode wizz doctor de novo.',
134
+ doctorNextWarns: 'Próximo passo: os warns são opcionais ou degradam features pontuais; siga a dica de cada bloco quando fizer sentido.',
135
+ doctorResolveHint: 'Para os snapshots de customização, o comando é: wizz resolve',
136
+ doctorAllGood: 'Tudo certo: instalação íntegra, tools no lugar e sem drift em _wizz/.',
137
+ doctorFailed: 'wizz doctor falhou: {error}',
138
+
139
+ docSkipped: 'pulado.',
140
+ docHooksMissingFiles: 'Faltam arquivos de hook em _wizz/hooks/: {list}. Execute wizz update para repor.',
141
+ docHooksNotRegistered:
142
+ 'Arquivos ok, mas sem registro no settings do PROJETO ({settings}): {list}. Também não estão no settings GLOBAL ({global}). Rode wizz install para registrar no projeto, ou registre no global.',
143
+ docHooksSkippedNote: ' ({n} já registrado(s) no settings global {global}, ok)',
144
+ docHooksOk: '{n} hooks verificados{note}.',
145
+ docNoInstallHooks: 'Sem instalação Wizz neste diretório (_wizz/ ausente); hooks do projeto não verificados. Rode wizz install.',
146
+ docRtkMissing:
147
+ 'rtk não encontrado no PATH. Opcional, mas sem ele o hook rtk-rewrite.sh não é registrado e a economia de tokens não roda. Instale: cargo install rtk',
148
+ docRtkOld: 'rtk {installed} é mais antigo que o piso do hook ({floor}); o rewrite falha em warn. Atualize: cargo install rtk',
149
+ docRtkOk: 'rtk {version} no PATH.',
150
+ docVersionUnknown: '(versão não informada)',
151
+ docJqMissing:
152
+ 'jq não encontrado no PATH. O hook rtk-rewrite.sh precisa dele; sem jq o rewrite de Bash avisa e segue sem reescrever. Instale: brew install jq',
153
+ docJqOk: 'jq no PATH.',
154
+ docPyOptional: 'Opcional: o núcleo roda só com Node; Python só habilita as skills com script próprio ({skills}).',
155
+ docPyFull: 'Python {version} via {command} (tomllib ok): as skills Python também rodam.',
156
+ docPyFullNoPython3: 'Python {version} existe via {command}, mas os scripts chamam python3, que não está no PATH. {optional}',
157
+ docPyPartial: 'Python {version} no PATH, sem tomllib (as skills com script próprio pedem 3.11+). {optional}',
158
+ docPyUnsupported: 'Python {version} é antigo demais (as skills com script próprio pedem 3.11+). {optional}',
159
+ docPyNone: 'python3 não encontrado no PATH. {optional} Para tê-las: brew install python3 (macOS).',
160
+ docDriftNoManifest:
161
+ 'files-manifest.csv não encontrado em _wizz/_config/. Sem ele não dá para detectar drift; rode wizz update para gerar.',
162
+ docDriftEmpty: 'files-manifest.csv vazio, nada a comparar.',
163
+ docDriftOk: '{n} arquivos batem com o files-manifest.csv.',
164
+ docDriftChanged: '{n} alterado(s)',
165
+ docDriftMissing: '{n} ausente(s)',
166
+ docDriftAnd: ' e ',
167
+ docDriftWarn:
168
+ 'Drift em _wizz/: {parts} contra o files-manifest.csv (ex.: {examples}). Edições manuais em _wizz/ são perdidas no próximo update: mova para _wizz/custom/ e rode wizz update.',
169
+ docNoInstallDrift: 'Sem instalação Wizz neste diretório; drift não verificado. Rode wizz install.',
170
+ docResolvedNone: 'Nenhuma skill com customize.toml instalada; nada a resolver.',
171
+ docResolvedNoIndex: 'Índice {file} ausente ou ilegível: não dá para saber se os {n} snapshots estão atualizados. Rode wizz resolve.',
172
+ docResolvedOk: '{n} snapshots em _wizz/_resolved/ batem com as entradas que os geraram.',
173
+ docResolvedMissing: '{n} sem snapshot ({list})',
174
+ docResolvedStale: '{n} com snapshot obsoleto ({list})',
175
+ docResolvedPrefixStale: 'snapshot obsoleto: rode wizz resolve',
176
+ docResolvedPrefix: 'rode wizz resolve',
177
+ docNoInstallResolved: 'Sem instalação Wizz neste diretório; snapshots de _wizz/_resolved/ não verificados. Rode wizz install.',
178
+ docInstrNoBlock: '{file} sem o bloco Wizz no topo (rode wizz install)',
179
+ docInstrNone: 'Sem CLAUDE.md/AGENTS.md no projeto.',
180
+ docInstrOk: 'Bloco Wizz presente, nenhuma regra legada.',
181
+ 'docLegacy.gsd': 'GSD foi substituído pelas fases e checkpoints do Wizz Method',
182
+ 'docLegacy.superpowers': 'superpowers foi substituído pelo Wizz Method',
183
+ 'docLegacy.bmad': 'comandos e pastas do BMAD puro viraram wizz-* e _wizz/',
184
+ 'docLegacy.modelo-aposentado': 'ID de modelo aposentado; a escada do Wizz usa os apelidos atuais',
185
+
186
+ hrBroke: '{id}: quebrou ({why}){tail}',
187
+ hrNoLibs: '{id}: não carrega suas libs ({line})',
188
+ hrSwallowed: '{id}: erro engolido ({line})',
189
+ hrPartialCopy: 'Cópia parcial em _wizz/hooks/? Execute wizz update para repor.',
190
+ hrOk: '{n} hook(s) executados com payload mínimo, sem erro engolido.',
191
+
192
+ rsNoInstall: 'Nenhuma instalação Wizz neste diretório (_wizz/ ausente). Rode wizz install primeiro.',
193
+ rsSkillMissing: 'Skill "{skill}" não tem customize.toml em lugar nenhum deste projeto.',
194
+ rsSearched: 'Procurei em:\n {list}',
195
+ rsOneDone: 'wizz resolve — {written} snapshot gravado, {skipped} pulado (skill {skill}).',
196
+ rsConfigOk: '_config.json regravado',
197
+ rsConfigMissing: '_config.json NÃO gerado (config.toml ausente ou inválido)',
198
+ rsNoToml: 'Nenhum customize.toml neste projeto (nem em _wizz/, nem nas pastas de skill dos IDEs).',
199
+ rsPruned: '{n} snapshot(s) órfão(s) removido(s) de _wizz/_resolved/.',
200
+ rsUpdateHint: '{config}. Se a instalação parece incompleta, rode: wizz update',
201
+ rsWritten: '{n} snapshot(s) gravado(s)',
202
+ rsSkipped: '{n} pulado(s)',
203
+ rsOrphans: '{n} órfão(s) removido(s)',
204
+ rsDone: 'wizz resolve — {parts} em _wizz/_resolved/.',
205
+ rsSkippedNote:
206
+ 'Skills puladas têm customize.toml inválido: o snapshot delas foi removido e a ativação cai no customize.toml bruto até o arquivo ser corrigido.',
207
+ rsFailed: 'wizz resolve falhou: {error}',
208
+
209
+ trCatalog: 'Catálogo: {n} skills ({file})',
210
+ trDecisions: 'Traces de decisão: {n}',
211
+ trSelected: 'Selecionadas (sel): {n} ({pct})',
212
+ trDiscarded: 'Descartadas c/ motivo: {n} ({pct})',
213
+ trNever: 'Nunca consideradas: {n} ({pct})',
214
+ trCoverage: 'Cobertura do catálogo: {pct}',
215
+ trNoDecisions: '(nenhum trace de decisão encontrado; rode com WIZZ_TRACE=1 e feche pedidos roteados pra gerar dados)',
216
+ trNeverNone: 'Nunca consideradas: nenhuma, catálogo 100% coberto.',
217
+ trNeverHeader: 'Nunca consideradas:',
218
+ trFile: 'Arquivo: {file}',
219
+ trTotal: 'Total de linhas: {n}',
220
+ trTrivial: 'Triviais: {n}',
221
+ trRouted: 'Roteados: {n}',
222
+ trModeWizz: ' modo wizz: {n}',
223
+ trModeFlat: ' modo flat: {n}',
224
+ trModeNull: ' modo nulo: {n}',
225
+ trWarnings: 'Com warnings: {n}',
226
+ trPeriod: 'Período: {first} → {last}',
227
+ trCorrupted: 'Linhas ignoradas (corrompidas): {n}',
228
+ trLadderTotal: 'Pedidos roteados com dado de escada: {n}',
229
+ trLadderExec: 'Invocaram algum wizz-exec-*: {n} ({pct})',
230
+ trByRoute: 'Por rota:',
231
+ trNoData: ' (sem dados)',
232
+ trByTier: 'Por tier (execs) (wizz-exec-*, nomes legados contam no tier novo):',
233
+ trNoTrace: 'Nenhum trace encontrado.',
234
+ trExpected: 'Local esperado: {file}',
235
+ trHowTo: 'Rode o install e ligue o medidor de roteamento, ou exporte WIZZ_TRACE=1.',
236
+ trCatalogFail: 'Não foi possível ler o catálogo de skills: {error}',
237
+ trCatalogExpected: 'Esperado em: {file}',
238
+ trCoverageTitle: 'Cobertura do Catálogo de Skills',
239
+ trLadderTitle: 'Aderência à Escada de Modelos',
240
+ trFailed: 'Trace report falhou: {error}',
241
+ };
242
+
243
+ module.exports = { en, pt };
@@ -84,4 +84,6 @@ module.exports = {
84
84
  process.stdout.write(lines.join('\n'));
85
85
  },
86
86
  renderCatalog,
87
+ isSkillInstalled,
88
+ shortWhen,
87
89
  };
@@ -11,6 +11,7 @@ const os = require('node:os');
11
11
  const prompts = require('../prompts');
12
12
  const { runDoctor } = require('../core/doctor');
13
13
  const { findWizzDir } = require('../core/installer');
14
+ const { it, useCommandLang } = require('../install-text');
14
15
 
15
16
  /**
16
17
  * Path do `settings.json` GLOBAL do usuário. Mesmo override que o installer
@@ -54,7 +55,7 @@ const STATUS_LABEL = {
54
55
 
55
56
  module.exports = {
56
57
  command: 'doctor',
57
- description: 'Diagnóstico do projeto Wizz: hooks, rtk, jq, python e drift de _wizz/',
58
+ description: 'Diagnose the Wizz project: hooks, rtk, jq, python and drift in _wizz/',
58
59
  options: [],
59
60
  // Exportado para teste (item 17 fase3, bug 9): prova, a partir do comando
60
61
  // real da CLI, que o leitor de settings.json GLOBAL usado por checkHooks
@@ -65,6 +66,7 @@ module.exports = {
65
66
  const projectDir = process.cwd();
66
67
  const { wizzDir } = findWizzDir(projectDir);
67
68
  const hasInstall = path.basename(wizzDir) && require('../fs-native').existsSync(wizzDir);
69
+ useCommandLang(hasInstall ? wizzDir : null);
68
70
 
69
71
  const { results, exitCode } = await runDoctor({
70
72
  deps: {
@@ -75,7 +77,7 @@ module.exports = {
75
77
  },
76
78
  });
77
79
 
78
- await prompts.log.message('wizz doctor — diagnóstico do projeto\n');
80
+ await prompts.log.message(it('doctorTitle'));
79
81
 
80
82
  for (const r of results) {
81
83
  const line = `[${STATUS_LABEL[r.status]}] ${r.check}: ${r.detail}`;
@@ -93,28 +95,24 @@ module.exports = {
93
95
  const oks = results.filter((r) => r.status === 'ok').length;
94
96
 
95
97
  await prompts.log.message('');
96
- await prompts.log.message(`Resumo: ${oks} ok, ${warns} warn, ${errors} error.`);
98
+ await prompts.log.message(it('doctorSummary', { ok: oks, warn: warns, error: errors }));
97
99
 
98
100
  const staleResolved = results.find((r) => r.check === 'resolved' && r.status === 'warn');
99
101
 
100
102
  if (errors > 0) {
101
- await prompts.log.message(
102
- 'Próximo passo: corrija os itens com ERROR acima (wizz update repor os arquivos de hook) e rode wizz doctor de novo.',
103
- );
103
+ await prompts.log.message(it('doctorNextErrors'));
104
104
  } else if (warns > 0) {
105
- await prompts.log.message(
106
- 'Próximo passo: os warns são opcionais ou degradam features pontuais; siga a dica de cada bloco quando fizer sentido.',
107
- );
105
+ await prompts.log.message(it('doctorNextWarns'));
108
106
  if (staleResolved) {
109
- await prompts.log.message('Para os snapshots de customização, o comando é: wizz resolve');
107
+ await prompts.log.message(it('doctorResolveHint'));
110
108
  }
111
109
  } else {
112
- await prompts.log.message('Tudo certo: instalação íntegra, tools no lugar e sem drift em _wizz/.');
110
+ await prompts.log.message(it('doctorAllGood'));
113
111
  }
114
112
 
115
113
  process.exit(exitCode);
116
114
  } catch (error) {
117
- await prompts.log.error(`wizz doctor falhou: ${error.message}`);
115
+ await prompts.log.error(it('doctorFailed', { error: error.message }));
118
116
  if (process.env.WIZZ_DEBUG) {
119
117
  await prompts.log.message(error.stack);
120
118
  }
@@ -22,12 +22,12 @@
22
22
 
23
23
  module.exports = {
24
24
  command: 'fetch-assets',
25
- description: 'Baixa sob demanda os assets pesados (MP3 do huashu-design, fontes do canvas-design)',
25
+ description: 'Download the heavy assets on demand (huashu-design MP3s, canvas-design fonts)',
26
26
  options: [
27
- ['--bundle <name>', 'Bundle a baixar (huashu-audio | canvas-fonts)'],
28
- ['--dest <dir>', 'Destino da extração (default: local do bundle dentro do pacote wizz-method)'],
29
- ['--force', 'Ignora o cache e rebaixa mesmo se os arquivos já existirem'],
30
- ['--all', 'Baixa todos os bundles conhecidos'],
27
+ ['--bundle <name>', 'Bundle to download (huashu-audio | canvas-fonts)'],
28
+ ['--dest <dir>', 'Extraction target (default: the bundle location inside the wizz-method package)'],
29
+ ['--force', 'Ignore the cache and download again even if the files exist'],
30
+ ['--all', 'Download every known bundle'],
31
31
  ],
32
32
  action: async (options) => {
33
33
  const { fetchNamedBundle, BUNDLES } = await import('../../fetch-assets.mjs');
@@ -1,3 +1,4 @@
1
+ const { it } = require('../install-text');
1
2
  const path = require('node:path');
2
3
  const prompts = require('../prompts');
3
4
  const { Installer } = require('../core/installer');
@@ -139,14 +140,12 @@ module.exports = {
139
140
  // isQuickUpdate() gate in core/installer.js). Say so in the final
140
141
  // summary too, not just as a menu hint and an in-run log line, so
141
142
  // the "no new skills" outcome is never a silent surprise.
142
- await prompts.log.info(
143
- 'Skills/MCPs/CLIs não foram alterados (Quick Update). Para provisioná-los, rode install e escolha "Modify Wizz Installation".',
144
- );
143
+ await prompts.log.info(it('quickUpdateNoSkills'));
145
144
  if (result.warnings > 0) {
146
- await prompts.log.warn(`Concluído com ${result.warnings} aviso(s). Veja o resumo acima para detalhes.`);
145
+ await prompts.log.warn(it('doneWarnings', { n: result.warnings }));
147
146
  }
148
147
  if (result.errors > 0) {
149
- await prompts.log.error(`Concluído com ${result.errors} falha(s) real(is). Veja o resumo acima para detalhes.`);
148
+ await prompts.log.error(it('doneErrors', { n: result.errors }));
150
149
  process.exit(1);
151
150
  }
152
151
  process.exit(0);
@@ -169,10 +168,10 @@ module.exports = {
169
168
  // count means a real failure happened and the exit code must reflect it.
170
169
  if (result) {
171
170
  if (result.warnings > 0) {
172
- await prompts.log.warn(`Concluído com ${result.warnings} aviso(s). Veja o resumo acima para detalhes.`);
171
+ await prompts.log.warn(it('doneWarnings', { n: result.warnings }));
173
172
  }
174
173
  if (result.errors > 0) {
175
- await prompts.log.error(`Concluído com ${result.errors} falha(s) real(is). Veja o resumo acima para detalhes.`);
174
+ await prompts.log.error(it('doneErrors', { n: result.errors }));
176
175
  process.exit(1);
177
176
  }
178
177
  if (result.success) {
@@ -31,18 +31,20 @@ const prompts = require('../prompts');
31
31
  const fs = require('../fs-native');
32
32
  const { findWizzDir } = require('../core/installer');
33
33
  const { resolveAll, resolveOne } = require('../core/resolved-customizations');
34
+ const { it, useCommandLang } = require('../install-text');
34
35
 
35
36
  module.exports = {
36
37
  command: 'resolve',
37
- description: 'Regenera os snapshots de customização em _wizz/_resolved/ (todas as skills ou uma)',
38
- options: [['--skill <name>', 'Regenera só a skill indicada (nome do diretório, ex.: wizz-maestro)']],
38
+ description: 'Regenerate the customization snapshots in _wizz/_resolved/ (all skills or one)',
39
+ options: [['--skill <name>', 'Regenerate only this skill (directory name, e.g. wizz-maestro)']],
39
40
  action: async (options = {}) => {
40
41
  try {
41
42
  const projectDir = process.cwd();
42
43
  const { wizzDir } = findWizzDir(projectDir);
44
+ useCommandLang(fs.existsSync(wizzDir) ? wizzDir : null);
43
45
 
44
46
  if (!fs.existsSync(wizzDir)) {
45
- await prompts.log.error('Nenhuma instalação Wizz neste diretório (_wizz/ ausente). Rode wizz install primeiro.');
47
+ await prompts.log.error(it('rsNoInstall'));
46
48
  process.exit(1);
47
49
  return;
48
50
  }
@@ -53,39 +55,37 @@ module.exports = {
53
55
  if (skillName) {
54
56
  const result = await resolveOne(projectDir, wizzDir, skillName, { warn, includeDeployed: true });
55
57
  if (!result.found) {
56
- await prompts.log.error(`Skill "${skillName}" não tem customize.toml em lugar nenhum deste projeto.`);
57
- await prompts.log.message(`Procurei em:\n ${(result.searched || []).join('\n ')}`);
58
+ await prompts.log.error(it('rsSkillMissing', { skill: skillName }));
59
+ await prompts.log.message(it('rsSearched', { list: (result.searched || []).join('\n ') }));
58
60
  process.exit(1);
59
61
  return;
60
62
  }
61
- await prompts.log.message(`wizz resolve — ${result.written} snapshot gravado, ${result.skipped} pulado (skill ${skillName}).`);
63
+ await prompts.log.message(it('rsOneDone', { written: result.written, skipped: result.skipped, skill: skillName }));
62
64
  process.exit(0);
63
65
  return;
64
66
  }
65
67
 
66
68
  const result = await resolveAll({ projectRoot: projectDir, wizzDir, warn, includeDeployed: true });
67
- const configNote = result.config ? '_config.json regravado' : '_config.json NÃO gerado (config.toml ausente ou inválido)';
69
+ const configNote = result.config ? it('rsConfigOk') : it('rsConfigMissing');
68
70
  if (result.written === 0 && result.skipped === 0) {
69
- await prompts.log.warn('Nenhum customize.toml neste projeto (nem em _wizz/, nem nas pastas de skill dos IDEs).');
71
+ await prompts.log.warn(it('rsNoToml'));
70
72
  if (result.pruned.length > 0) {
71
- await prompts.log.message(`${result.pruned.length} snapshot(s) órfão(s) removido(s) de _wizz/_resolved/.`);
73
+ await prompts.log.message(it('rsPruned', { n: result.pruned.length }));
72
74
  }
73
- await prompts.log.message(`${configNote}. Se a instalação parece incompleta, rode: wizz update`);
75
+ await prompts.log.message(it('rsUpdateHint', { config: configNote }));
74
76
  process.exit(0);
75
77
  return;
76
78
  }
77
- const parts = [`${result.written} snapshot(s) gravado(s)`, `${result.skipped} pulado(s)`];
78
- if (result.pruned.length > 0) parts.push(`${result.pruned.length} órfão(s) removido(s)`);
79
+ const parts = [it('rsWritten', { n: result.written }), it('rsSkipped', { n: result.skipped })];
80
+ if (result.pruned.length > 0) parts.push(it('rsOrphans', { n: result.pruned.length }));
79
81
  parts.push(configNote);
80
- await prompts.log.message(`wizz resolve — ${parts.join(', ')} em _wizz/_resolved/.`);
82
+ await prompts.log.message(it('rsDone', { parts: parts.join(', ') }));
81
83
  if (result.skipped > 0) {
82
- await prompts.log.message(
83
- 'Skills puladas têm customize.toml inválido: o snapshot delas foi removido e a ativação cai no customize.toml bruto até o arquivo ser corrigido.',
84
- );
84
+ await prompts.log.message(it('rsSkippedNote'));
85
85
  }
86
86
  process.exit(0);
87
87
  } catch (error) {
88
- await prompts.log.error(`wizz resolve falhou: ${error.message}`);
88
+ await prompts.log.error(it('rsFailed', { error: error.message }));
89
89
  if (process.env.WIZZ_DEBUG) {
90
90
  await prompts.log.message(error.stack);
91
91
  }
@@ -15,6 +15,7 @@ const yaml = require('yaml');
15
15
  const fs = require('../fs-native');
16
16
  const prompts = require('../prompts');
17
17
  const { getProjectRoot } = require('../project-root');
18
+ const { it, useCommandLang } = require('../install-text');
18
19
 
19
20
  function getTraceFile() {
20
21
  return process.env.WIZZ_TRACE_FILE || path.join(os.homedir(), '.claude', 'wizz-trace.jsonl');
@@ -36,8 +37,8 @@ function getRegistryFile() {
36
37
  // Lê e parseia skills-registry.yaml, devolvendo o catálogo de ids de
37
38
  // skills em ordem alfabética estável (mesma lista independente da ordem em
38
39
  // que as áreas/skills aparecem no YAML). Escopo deliberado: só as skills
39
- // `areas.*.skills[]` e as cross-cutting `utility[]` (find-skills,
40
- // enhance-prompt, wizz-router; também são skills de verdade em
40
+ // `areas.*.skills[]` e as cross-cutting `utility[]` (wizz-find-skills,
41
+ // wizz-enhance-prompt, wizz-router; também são skills de verdade em
41
42
  // src/skills-lib/). CLIs/MCPs/squads ficam de fora: `sel`/`desc` no
42
43
  // marcador de decisão podem citar agentes ou skills (ver encerramento.md),
43
44
  // mas este comando mede especificamente subutilização de SKILL, não de
@@ -122,20 +123,20 @@ function aggregateCoverage(entries, catalogIds) {
122
123
  function formatCoverageSummary(stats, registryFile) {
123
124
  const consideredCount = stats.catalogTotal - stats.neverConsidered.length;
124
125
  const lines = [
125
- `Catálogo: ${stats.catalogTotal} skills (${registryFile})`,
126
- `Traces de decisão: ${stats.decisionCount}`,
127
- `Selecionadas (sel): ${stats.selectedCount} (${pct(stats.selectedCount, stats.catalogTotal)})`,
128
- `Descartadas c/ motivo: ${stats.discardedOnlyCount} (${pct(stats.discardedOnlyCount, stats.catalogTotal)})`,
129
- `Nunca consideradas: ${stats.neverConsidered.length} (${pct(stats.neverConsidered.length, stats.catalogTotal)})`,
130
- `Cobertura do catálogo: ${pct(consideredCount, stats.catalogTotal)}`,
126
+ it('trCatalog', { n: stats.catalogTotal, file: registryFile }),
127
+ it('trDecisions', { n: stats.decisionCount }),
128
+ it('trSelected', { n: stats.selectedCount, pct: pct(stats.selectedCount, stats.catalogTotal) }),
129
+ it('trDiscarded', { n: stats.discardedOnlyCount, pct: pct(stats.discardedOnlyCount, stats.catalogTotal) }),
130
+ it('trNever', { n: stats.neverConsidered.length, pct: pct(stats.neverConsidered.length, stats.catalogTotal) }),
131
+ it('trCoverage', { pct: pct(consideredCount, stats.catalogTotal) }),
131
132
  ];
132
133
 
133
134
  if (stats.decisionCount === 0) {
134
- lines.push('', '(nenhum trace de decisão encontrado; rode com WIZZ_TRACE=1 e feche pedidos roteados pra gerar dados)');
135
+ lines.push('', it('trNoDecisions'));
135
136
  } else if (stats.neverConsidered.length === 0) {
136
- lines.push('', 'Nunca consideradas: nenhuma, catálogo 100% coberto.');
137
+ lines.push('', it('trNeverNone'));
137
138
  } else {
138
- lines.push('', 'Nunca consideradas:');
139
+ lines.push('', it('trNeverHeader'));
139
140
  for (const id of stats.neverConsidered) lines.push(` ${id}`);
140
141
  }
141
142
 
@@ -293,18 +294,18 @@ function pct(part, total) {
293
294
 
294
295
  function formatSummary(stats, traceFile) {
295
296
  const lines = [
296
- `Arquivo: ${traceFile}`,
297
- `Total de linhas: ${stats.total}`,
298
- `Triviais: ${stats.trivialCount}`,
299
- `Roteados: ${stats.routedCount}`,
300
- ` modo wizz: ${stats.byMode.wizz}`,
301
- ` modo flat: ${stats.byMode.flat}`,
302
- ` modo nulo: ${stats.byMode.null}`,
303
- `Com warnings: ${stats.warningsCount}`,
304
- `Período: ${stats.firstTs || '—'} → ${stats.lastTs || '—'}`,
297
+ it('trFile', { file: traceFile }),
298
+ it('trTotal', { n: stats.total }),
299
+ it('trTrivial', { n: stats.trivialCount }),
300
+ it('trRouted', { n: stats.routedCount }),
301
+ it('trModeWizz', { n: stats.byMode.wizz }),
302
+ it('trModeFlat', { n: stats.byMode.flat }),
303
+ it('trModeNull', { n: stats.byMode.null }),
304
+ it('trWarnings', { n: stats.warningsCount }),
305
+ it('trPeriod', { first: stats.firstTs || '—', last: stats.lastTs || '—' }),
305
306
  ];
306
307
  if (stats.corruptedCount > 0) {
307
- lines.push(`Linhas ignoradas (corrompidas): ${stats.corruptedCount}`);
308
+ lines.push(it('trCorrupted', { n: stats.corruptedCount }));
308
309
  }
309
310
  return lines.join('\n');
310
311
  }
@@ -316,14 +317,14 @@ const ROUTE_DISPLAY_ORDER = ['agent:*', 'maestro', 'flat', 'outro'];
316
317
  function formatLadderSummary(ladderStats) {
317
318
  const byTier = ladderStats.byTier || {};
318
319
  const lines = [
319
- `Pedidos roteados com dado de escada: ${ladderStats.total}`,
320
- `Invocaram algum wizz-exec-*: ${ladderStats.withExec} (${pct(ladderStats.withExec, ladderStats.total)})`,
321
- 'Por rota:',
320
+ it('trLadderTotal', { n: ladderStats.total }),
321
+ it('trLadderExec', { n: ladderStats.withExec, pct: pct(ladderStats.withExec, ladderStats.total) }),
322
+ it('trByRoute'),
322
323
  ];
323
324
 
324
325
  const routes = ROUTE_DISPLAY_ORDER.filter((route) => ladderStats.byRoute[route]);
325
326
  if (routes.length === 0) {
326
- lines.push(' (sem dados)');
327
+ lines.push(it('trNoData'));
327
328
  } else {
328
329
  for (const route of routes) {
329
330
  const bucket = ladderStats.byRoute[route];
@@ -331,10 +332,10 @@ function formatLadderSummary(ladderStats) {
331
332
  }
332
333
  }
333
334
 
334
- lines.push('Por tier (execs) (wizz-exec-*, nomes legados contam no tier novo):');
335
+ lines.push(it('trByTier'));
335
336
  const tiers = TIER_DISPLAY_ORDER.filter((tier) => byTier[tier]);
336
337
  if (tiers.length === 0) {
337
- lines.push(' (sem dados)');
338
+ lines.push(it('trNoData'));
338
339
  } else {
339
340
  for (const tier of tiers) {
340
341
  lines.push(` ${tier.padEnd(10)} ${byTier[tier]}`);
@@ -346,16 +347,18 @@ function formatLadderSummary(ladderStats) {
346
347
 
347
348
  module.exports = {
348
349
  command: 'trace-report',
349
- description: 'Resume o arquivo local de trace do roteamento (WIZZ_TRACE)',
350
- options: [['--coverage', 'Cruza o catálogo de skills do registry contra os traces: mede skills nunca consideradas no roteamento']],
350
+ description: 'Summarize the local routing trace file (WIZZ_TRACE)',
351
+ options: [['--coverage', 'Cross the registry skill catalog with the traces: measures skills never considered in routing']],
351
352
  action: async (options) => {
352
353
  try {
354
+ const wizzDir = path.join(process.cwd(), '_wizz');
355
+ useCommandLang(fs.existsSync(wizzDir) ? wizzDir : null);
353
356
  const traceFile = getTraceFile();
354
357
 
355
358
  if (!(await fs.pathExists(traceFile))) {
356
- await prompts.log.warn('Nenhum trace encontrado.');
357
- await prompts.log.message(`Local esperado: ${traceFile}`);
358
- await prompts.log.message('Rode o install e ligue o medidor de roteamento, ou exporte WIZZ_TRACE=1.');
359
+ await prompts.log.warn(it('trNoTrace'));
360
+ await prompts.log.message(it('trExpected', { file: traceFile }));
361
+ await prompts.log.message(it('trHowTo'));
359
362
  process.exit(0);
360
363
  return;
361
364
  }
@@ -386,14 +389,14 @@ module.exports = {
386
389
  try {
387
390
  catalogIds = collectSkillCatalog(registryFile);
388
391
  } catch (error) {
389
- await prompts.log.error(`Não foi possível ler o catálogo de skills: ${error.message}`);
390
- await prompts.log.message(`Esperado em: ${registryFile}`);
392
+ await prompts.log.error(it('trCatalogFail', { error: error.message }));
393
+ await prompts.log.message(it('trCatalogExpected', { file: registryFile }));
391
394
  process.exit(1);
392
395
  return;
393
396
  }
394
397
 
395
398
  const coverageStats = aggregateCoverage(entries, catalogIds);
396
- await prompts.box(formatCoverageSummary(coverageStats, registryFile), 'Cobertura do Catálogo de Skills');
399
+ await prompts.box(formatCoverageSummary(coverageStats, registryFile), it('trCoverageTitle'));
397
400
  process.exit(0);
398
401
  return;
399
402
  }
@@ -403,11 +406,11 @@ module.exports = {
403
406
  await prompts.box(formatSummary(stats, traceFile), 'Wizz Trace Report');
404
407
 
405
408
  const ladderStats = aggregateLadder(entries);
406
- await prompts.box(formatLadderSummary(ladderStats), 'Aderência à Escada de Modelos');
409
+ await prompts.box(formatLadderSummary(ladderStats), it('trLadderTitle'));
407
410
 
408
411
  process.exit(0);
409
412
  } catch (error) {
410
- await prompts.log.error(`Trace report failed: ${error.message}`);
413
+ await prompts.log.error(it('trFailed', { error: error.message }));
411
414
  if (process.env.WIZZ_DEBUG) {
412
415
  await prompts.log.message(error.stack);
413
416
  }