@dynamicworks/br-openspec 1.3.1

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 (291) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +210 -0
  3. package/README.pt-BR.md +212 -0
  4. package/bin/openspec.js +3 -0
  5. package/dist/cli/index.d.ts +2 -0
  6. package/dist/cli/index.js +484 -0
  7. package/dist/commands/change.d.ts +35 -0
  8. package/dist/commands/change.js +278 -0
  9. package/dist/commands/completion.d.ts +72 -0
  10. package/dist/commands/completion.js +258 -0
  11. package/dist/commands/config.d.ts +36 -0
  12. package/dist/commands/config.js +553 -0
  13. package/dist/commands/feedback.d.ts +9 -0
  14. package/dist/commands/feedback.js +184 -0
  15. package/dist/commands/schema.d.ts +6 -0
  16. package/dist/commands/schema.js +869 -0
  17. package/dist/commands/show.d.ts +14 -0
  18. package/dist/commands/show.js +133 -0
  19. package/dist/commands/spec.d.ts +15 -0
  20. package/dist/commands/spec.js +226 -0
  21. package/dist/commands/tools.d.ts +11 -0
  22. package/dist/commands/tools.js +252 -0
  23. package/dist/commands/validate.d.ts +24 -0
  24. package/dist/commands/validate.js +295 -0
  25. package/dist/commands/workflow/index.d.ts +17 -0
  26. package/dist/commands/workflow/index.js +12 -0
  27. package/dist/commands/workflow/instructions.d.ts +29 -0
  28. package/dist/commands/workflow/instructions.js +328 -0
  29. package/dist/commands/workflow/new-change.d.ts +11 -0
  30. package/dist/commands/workflow/new-change.js +44 -0
  31. package/dist/commands/workflow/schemas.d.ts +10 -0
  32. package/dist/commands/workflow/schemas.js +35 -0
  33. package/dist/commands/workflow/shared.d.ts +57 -0
  34. package/dist/commands/workflow/shared.js +117 -0
  35. package/dist/commands/workflow/status.d.ts +14 -0
  36. package/dist/commands/workflow/status.js +76 -0
  37. package/dist/commands/workflow/templates.d.ts +16 -0
  38. package/dist/commands/workflow/templates.js +70 -0
  39. package/dist/core/archive.d.ts +11 -0
  40. package/dist/core/archive.js +322 -0
  41. package/dist/core/artifact-graph/graph.d.ts +56 -0
  42. package/dist/core/artifact-graph/graph.js +141 -0
  43. package/dist/core/artifact-graph/index.d.ts +8 -0
  44. package/dist/core/artifact-graph/index.js +14 -0
  45. package/dist/core/artifact-graph/instruction-loader.d.ts +143 -0
  46. package/dist/core/artifact-graph/instruction-loader.js +217 -0
  47. package/dist/core/artifact-graph/outputs.d.ts +14 -0
  48. package/dist/core/artifact-graph/outputs.js +39 -0
  49. package/dist/core/artifact-graph/resolver.d.ts +81 -0
  50. package/dist/core/artifact-graph/resolver.js +258 -0
  51. package/dist/core/artifact-graph/schema.d.ts +13 -0
  52. package/dist/core/artifact-graph/schema.js +108 -0
  53. package/dist/core/artifact-graph/state.d.ts +12 -0
  54. package/dist/core/artifact-graph/state.js +31 -0
  55. package/dist/core/artifact-graph/types.d.ts +45 -0
  56. package/dist/core/artifact-graph/types.js +43 -0
  57. package/dist/core/available-tools.d.ts +17 -0
  58. package/dist/core/available-tools.js +43 -0
  59. package/dist/core/command-generation/adapters/amazon-q.d.ts +13 -0
  60. package/dist/core/command-generation/adapters/amazon-q.js +26 -0
  61. package/dist/core/command-generation/adapters/antigravity.d.ts +13 -0
  62. package/dist/core/command-generation/adapters/antigravity.js +26 -0
  63. package/dist/core/command-generation/adapters/auggie.d.ts +13 -0
  64. package/dist/core/command-generation/adapters/auggie.js +27 -0
  65. package/dist/core/command-generation/adapters/bob.d.ts +14 -0
  66. package/dist/core/command-generation/adapters/bob.js +45 -0
  67. package/dist/core/command-generation/adapters/claude.d.ts +13 -0
  68. package/dist/core/command-generation/adapters/claude.js +50 -0
  69. package/dist/core/command-generation/adapters/cline.d.ts +14 -0
  70. package/dist/core/command-generation/adapters/cline.js +27 -0
  71. package/dist/core/command-generation/adapters/codebuddy.d.ts +13 -0
  72. package/dist/core/command-generation/adapters/codebuddy.js +28 -0
  73. package/dist/core/command-generation/adapters/codex.d.ts +16 -0
  74. package/dist/core/command-generation/adapters/codex.js +39 -0
  75. package/dist/core/command-generation/adapters/continue.d.ts +13 -0
  76. package/dist/core/command-generation/adapters/continue.js +28 -0
  77. package/dist/core/command-generation/adapters/costrict.d.ts +13 -0
  78. package/dist/core/command-generation/adapters/costrict.js +27 -0
  79. package/dist/core/command-generation/adapters/crush.d.ts +13 -0
  80. package/dist/core/command-generation/adapters/crush.js +30 -0
  81. package/dist/core/command-generation/adapters/cursor.d.ts +14 -0
  82. package/dist/core/command-generation/adapters/cursor.js +44 -0
  83. package/dist/core/command-generation/adapters/factory.d.ts +13 -0
  84. package/dist/core/command-generation/adapters/factory.js +27 -0
  85. package/dist/core/command-generation/adapters/gemini.d.ts +13 -0
  86. package/dist/core/command-generation/adapters/gemini.js +26 -0
  87. package/dist/core/command-generation/adapters/github-copilot.d.ts +13 -0
  88. package/dist/core/command-generation/adapters/github-copilot.js +26 -0
  89. package/dist/core/command-generation/adapters/iflow.d.ts +13 -0
  90. package/dist/core/command-generation/adapters/iflow.js +29 -0
  91. package/dist/core/command-generation/adapters/index.d.ts +32 -0
  92. package/dist/core/command-generation/adapters/index.js +32 -0
  93. package/dist/core/command-generation/adapters/junie.d.ts +13 -0
  94. package/dist/core/command-generation/adapters/junie.js +26 -0
  95. package/dist/core/command-generation/adapters/kilocode.d.ts +14 -0
  96. package/dist/core/command-generation/adapters/kilocode.js +23 -0
  97. package/dist/core/command-generation/adapters/kiro.d.ts +13 -0
  98. package/dist/core/command-generation/adapters/kiro.js +26 -0
  99. package/dist/core/command-generation/adapters/lingma.d.ts +13 -0
  100. package/dist/core/command-generation/adapters/lingma.js +30 -0
  101. package/dist/core/command-generation/adapters/opencode.d.ts +13 -0
  102. package/dist/core/command-generation/adapters/opencode.js +29 -0
  103. package/dist/core/command-generation/adapters/pi.d.ts +18 -0
  104. package/dist/core/command-generation/adapters/pi.js +55 -0
  105. package/dist/core/command-generation/adapters/qoder.d.ts +13 -0
  106. package/dist/core/command-generation/adapters/qoder.js +30 -0
  107. package/dist/core/command-generation/adapters/qwen.d.ts +13 -0
  108. package/dist/core/command-generation/adapters/qwen.js +26 -0
  109. package/dist/core/command-generation/adapters/roocode.d.ts +14 -0
  110. package/dist/core/command-generation/adapters/roocode.js +27 -0
  111. package/dist/core/command-generation/adapters/windsurf.d.ts +14 -0
  112. package/dist/core/command-generation/adapters/windsurf.js +51 -0
  113. package/dist/core/command-generation/generator.d.ts +21 -0
  114. package/dist/core/command-generation/generator.js +27 -0
  115. package/dist/core/command-generation/index.d.ts +22 -0
  116. package/dist/core/command-generation/index.js +24 -0
  117. package/dist/core/command-generation/registry.d.ts +36 -0
  118. package/dist/core/command-generation/registry.js +98 -0
  119. package/dist/core/command-generation/types.d.ts +56 -0
  120. package/dist/core/command-generation/types.js +8 -0
  121. package/dist/core/completions/command-registry.d.ts +7 -0
  122. package/dist/core/completions/command-registry.js +462 -0
  123. package/dist/core/completions/completion-provider.d.ts +60 -0
  124. package/dist/core/completions/completion-provider.js +102 -0
  125. package/dist/core/completions/factory.d.ts +64 -0
  126. package/dist/core/completions/factory.js +75 -0
  127. package/dist/core/completions/generators/bash-generator.d.ts +32 -0
  128. package/dist/core/completions/generators/bash-generator.js +174 -0
  129. package/dist/core/completions/generators/fish-generator.d.ts +32 -0
  130. package/dist/core/completions/generators/fish-generator.js +157 -0
  131. package/dist/core/completions/generators/powershell-generator.d.ts +33 -0
  132. package/dist/core/completions/generators/powershell-generator.js +208 -0
  133. package/dist/core/completions/generators/zsh-generator.d.ts +44 -0
  134. package/dist/core/completions/generators/zsh-generator.js +250 -0
  135. package/dist/core/completions/installers/bash-installer.d.ts +87 -0
  136. package/dist/core/completions/installers/bash-installer.js +319 -0
  137. package/dist/core/completions/installers/fish-installer.d.ts +43 -0
  138. package/dist/core/completions/installers/fish-installer.js +143 -0
  139. package/dist/core/completions/installers/powershell-installer.d.ts +102 -0
  140. package/dist/core/completions/installers/powershell-installer.js +400 -0
  141. package/dist/core/completions/installers/zsh-installer.d.ts +125 -0
  142. package/dist/core/completions/installers/zsh-installer.js +450 -0
  143. package/dist/core/completions/templates/bash-templates.d.ts +6 -0
  144. package/dist/core/completions/templates/bash-templates.js +24 -0
  145. package/dist/core/completions/templates/fish-templates.d.ts +7 -0
  146. package/dist/core/completions/templates/fish-templates.js +39 -0
  147. package/dist/core/completions/templates/powershell-templates.d.ts +6 -0
  148. package/dist/core/completions/templates/powershell-templates.js +25 -0
  149. package/dist/core/completions/templates/zsh-templates.d.ts +6 -0
  150. package/dist/core/completions/templates/zsh-templates.js +36 -0
  151. package/dist/core/completions/types.d.ts +79 -0
  152. package/dist/core/completions/types.js +2 -0
  153. package/dist/core/config-prompts.d.ts +9 -0
  154. package/dist/core/config-prompts.js +34 -0
  155. package/dist/core/config-schema.d.ts +86 -0
  156. package/dist/core/config-schema.js +213 -0
  157. package/dist/core/config.d.ts +18 -0
  158. package/dist/core/config.js +38 -0
  159. package/dist/core/converters/json-converter.d.ts +6 -0
  160. package/dist/core/converters/json-converter.js +51 -0
  161. package/dist/core/global-config.d.ts +44 -0
  162. package/dist/core/global-config.js +125 -0
  163. package/dist/core/index.d.ts +2 -0
  164. package/dist/core/index.js +3 -0
  165. package/dist/core/init.d.ts +37 -0
  166. package/dist/core/init.js +549 -0
  167. package/dist/core/is-project-initialized.d.ts +12 -0
  168. package/dist/core/is-project-initialized.js +18 -0
  169. package/dist/core/legacy-cleanup.d.ts +162 -0
  170. package/dist/core/legacy-cleanup.js +515 -0
  171. package/dist/core/list.d.ts +9 -0
  172. package/dist/core/list.js +172 -0
  173. package/dist/core/migration.d.ts +23 -0
  174. package/dist/core/migration.js +109 -0
  175. package/dist/core/parsers/change-parser.d.ts +13 -0
  176. package/dist/core/parsers/change-parser.js +197 -0
  177. package/dist/core/parsers/markdown-parser.d.ts +26 -0
  178. package/dist/core/parsers/markdown-parser.js +228 -0
  179. package/dist/core/parsers/requirement-blocks.d.ts +37 -0
  180. package/dist/core/parsers/requirement-blocks.js +201 -0
  181. package/dist/core/parsers/spec-structure.d.ts +9 -0
  182. package/dist/core/parsers/spec-structure.js +88 -0
  183. package/dist/core/profile-sync-drift.d.ts +38 -0
  184. package/dist/core/profile-sync-drift.js +200 -0
  185. package/dist/core/profiles.d.ts +26 -0
  186. package/dist/core/profiles.js +40 -0
  187. package/dist/core/project-config.d.ts +64 -0
  188. package/dist/core/project-config.js +224 -0
  189. package/dist/core/schemas/base.schema.d.ts +13 -0
  190. package/dist/core/schemas/base.schema.js +13 -0
  191. package/dist/core/schemas/change.schema.d.ts +73 -0
  192. package/dist/core/schemas/change.schema.js +31 -0
  193. package/dist/core/schemas/index.d.ts +4 -0
  194. package/dist/core/schemas/index.js +4 -0
  195. package/dist/core/schemas/spec.schema.d.ts +18 -0
  196. package/dist/core/schemas/spec.schema.js +15 -0
  197. package/dist/core/shared/index.d.ts +8 -0
  198. package/dist/core/shared/index.js +8 -0
  199. package/dist/core/shared/skill-generation.d.ts +49 -0
  200. package/dist/core/shared/skill-generation.js +96 -0
  201. package/dist/core/shared/tool-detection.d.ts +71 -0
  202. package/dist/core/shared/tool-detection.js +158 -0
  203. package/dist/core/specs-apply.d.ts +73 -0
  204. package/dist/core/specs-apply.js +393 -0
  205. package/dist/core/styles/palette.d.ts +7 -0
  206. package/dist/core/styles/palette.js +8 -0
  207. package/dist/core/templates/index.d.ts +8 -0
  208. package/dist/core/templates/index.js +9 -0
  209. package/dist/core/templates/skill-templates.d.ts +20 -0
  210. package/dist/core/templates/skill-templates.js +19 -0
  211. package/dist/core/templates/types.d.ts +19 -0
  212. package/dist/core/templates/types.js +5 -0
  213. package/dist/core/templates/workflows/apply-change.d.ts +10 -0
  214. package/dist/core/templates/workflows/apply-change.js +308 -0
  215. package/dist/core/templates/workflows/archive-change.d.ts +10 -0
  216. package/dist/core/templates/workflows/archive-change.js +271 -0
  217. package/dist/core/templates/workflows/bulk-archive-change.d.ts +10 -0
  218. package/dist/core/templates/workflows/bulk-archive-change.js +492 -0
  219. package/dist/core/templates/workflows/continue-change.d.ts +10 -0
  220. package/dist/core/templates/workflows/continue-change.js +232 -0
  221. package/dist/core/templates/workflows/explore.d.ts +10 -0
  222. package/dist/core/templates/workflows/explore.js +463 -0
  223. package/dist/core/templates/workflows/feedback.d.ts +9 -0
  224. package/dist/core/templates/workflows/feedback.js +108 -0
  225. package/dist/core/templates/workflows/ff-change.d.ts +10 -0
  226. package/dist/core/templates/workflows/ff-change.js +198 -0
  227. package/dist/core/templates/workflows/new-change.d.ts +10 -0
  228. package/dist/core/templates/workflows/new-change.js +21 -0
  229. package/dist/core/templates/workflows/onboard.d.ts +10 -0
  230. package/dist/core/templates/workflows/onboard.js +21 -0
  231. package/dist/core/templates/workflows/propose.d.ts +10 -0
  232. package/dist/core/templates/workflows/propose.js +216 -0
  233. package/dist/core/templates/workflows/sync-specs.d.ts +10 -0
  234. package/dist/core/templates/workflows/sync-specs.js +272 -0
  235. package/dist/core/templates/workflows/upstream-sync.d.ts +10 -0
  236. package/dist/core/templates/workflows/upstream-sync.js +116 -0
  237. package/dist/core/templates/workflows/verify-change.d.ts +10 -0
  238. package/dist/core/templates/workflows/verify-change.js +21 -0
  239. package/dist/core/tools-manager.d.ts +56 -0
  240. package/dist/core/tools-manager.js +215 -0
  241. package/dist/core/update.d.ts +77 -0
  242. package/dist/core/update.js +538 -0
  243. package/dist/core/validation/constants.d.ts +34 -0
  244. package/dist/core/validation/constants.js +40 -0
  245. package/dist/core/validation/types.d.ts +18 -0
  246. package/dist/core/validation/types.js +2 -0
  247. package/dist/core/validation/validator.d.ts +33 -0
  248. package/dist/core/validation/validator.js +419 -0
  249. package/dist/core/view.d.ts +8 -0
  250. package/dist/core/view.js +169 -0
  251. package/dist/index.d.ts +3 -0
  252. package/dist/index.js +3 -0
  253. package/dist/messages/index.d.ts +867 -0
  254. package/dist/messages/index.js +1960 -0
  255. package/dist/prompts/searchable-multi-select.d.ts +28 -0
  256. package/dist/prompts/searchable-multi-select.js +160 -0
  257. package/dist/telemetry/config.d.ts +38 -0
  258. package/dist/telemetry/config.js +136 -0
  259. package/dist/telemetry/index.d.ts +31 -0
  260. package/dist/telemetry/index.js +165 -0
  261. package/dist/ui/ascii-patterns.d.ts +16 -0
  262. package/dist/ui/ascii-patterns.js +133 -0
  263. package/dist/ui/welcome-screen.d.ts +10 -0
  264. package/dist/ui/welcome-screen.js +147 -0
  265. package/dist/utils/change-metadata.d.ts +51 -0
  266. package/dist/utils/change-metadata.js +147 -0
  267. package/dist/utils/change-utils.d.ts +62 -0
  268. package/dist/utils/change-utils.js +121 -0
  269. package/dist/utils/command-references.d.ts +18 -0
  270. package/dist/utils/command-references.js +20 -0
  271. package/dist/utils/file-system.d.ts +41 -0
  272. package/dist/utils/file-system.js +302 -0
  273. package/dist/utils/index.d.ts +6 -0
  274. package/dist/utils/index.js +9 -0
  275. package/dist/utils/interactive.d.ts +18 -0
  276. package/dist/utils/interactive.js +21 -0
  277. package/dist/utils/item-discovery.d.ts +4 -0
  278. package/dist/utils/item-discovery.js +72 -0
  279. package/dist/utils/match.d.ts +3 -0
  280. package/dist/utils/match.js +22 -0
  281. package/dist/utils/shell-detection.d.ts +20 -0
  282. package/dist/utils/shell-detection.js +41 -0
  283. package/dist/utils/task-progress.d.ts +8 -0
  284. package/dist/utils/task-progress.js +37 -0
  285. package/package.json +84 -0
  286. package/schemas/spec-driven/schema.yaml +153 -0
  287. package/schemas/spec-driven/templates/design.md +19 -0
  288. package/schemas/spec-driven/templates/proposal.md +23 -0
  289. package/schemas/spec-driven/templates/spec.md +8 -0
  290. package/schemas/spec-driven/templates/tasks.md +9 -0
  291. package/scripts/postinstall.js +83 -0
@@ -0,0 +1,1960 @@
1
+ /**
2
+ * Catálogo centralizado de mensagens do BR-OpenSpec em Português Brasileiro.
3
+ *
4
+ * Este módulo reúne todas as mensagens exibidas ao usuário para facilitar
5
+ * manutenção, revisão e consistência linguística.
6
+ */
7
+ // ═══════════════════════════════════════════════════════════
8
+ // CLI — Descrições de comandos (src/cli/index.ts)
9
+ // ═══════════════════════════════════════════════════════════
10
+ export const CLI_DESCRIPTIONS = {
11
+ root: 'Sistema de desenvolvimento orientado a especificações com IA',
12
+ init: 'Inicializa o BR-OpenSpec no seu projeto',
13
+ experimental: 'Alias para init (descontinuado)',
14
+ update: 'Atualiza os arquivos de instruções do BR-OpenSpec',
15
+ list: 'Lista itens (alterações por padrão). Use --specs para listar especificações.',
16
+ view: 'Exibe um painel interativo de especificações e alterações',
17
+ change: 'Gerencia propostas de alteração do BR-OpenSpec',
18
+ changeShow: 'Exibe uma proposta de alteração em JSON ou markdown',
19
+ changeList: 'Lista todas as alterações ativas (DESCONTINUADO: use "openspec list")',
20
+ changeValidate: 'Valida uma proposta de alteração',
21
+ archive: 'Arquiva uma alteração concluída e atualiza as especificações principais',
22
+ spec: 'Gerencia e visualiza especificações do BR-OpenSpec',
23
+ specShow: 'Exibe uma especificação específica',
24
+ specList: 'Lista todas as especificações disponíveis',
25
+ specValidate: 'Valida a estrutura de uma especificação',
26
+ validate: 'Valida alterações e especificações',
27
+ show: 'Exibe uma alteração ou especificação',
28
+ feedback: 'Envia feedback sobre o BR-OpenSpec',
29
+ completion: 'Gerencia autocomplete do shell para a CLI do BR-OpenSpec',
30
+ completionGenerate: 'Gera script de autocomplete para um shell (saída no stdout)',
31
+ completionInstall: 'Instala script de autocomplete para um shell',
32
+ completionUninstall: 'Remove script de autocomplete de um shell',
33
+ __complete: 'Saída de dados de autocomplete em formato legível por máquinas (uso interno)',
34
+ status: 'Exibe o status de conclusão dos artefatos de uma alteração',
35
+ instructions: 'Exibe instruções enriquecidas para criar um artefato ou aplicar tarefas',
36
+ templates: 'Mostra os caminhos dos templates resolvidos para todos os artefatos de um esquema',
37
+ schemas: 'Lista os esquemas de fluxo de trabalho disponíveis com descrições',
38
+ new: 'Cria novos itens',
39
+ newChange: 'Cria um novo diretório de alteração',
40
+ // Opções globais
41
+ noColor: 'Desativa cores na saída',
42
+ tools: (availableToolIds) => `Configura ferramentas de IA não interativamente. Use "all", "none" ou uma lista separada por vírgula: ${availableToolIds}`,
43
+ force: 'Limpa arquivos legados automaticamente sem perguntar',
44
+ profile: 'Sobrescreve o perfil da configuração global (core ou custom)',
45
+ // Opções — init / experimental
46
+ experimentalTool: 'Ferramenta de IA alvo (mapeia para --tools)',
47
+ experimentalNoInteractive: 'Desativa prompts interativos',
48
+ toolsOption: 'Configura ferramentas de IA não interativamente. Use "all", "none" ou IDs separados por vírgula',
49
+ // Opções — update
50
+ updateForce: 'Força atualização mesmo quando as ferramentas estão atualizadas',
51
+ // Opções — list
52
+ listSpecs: 'Lista especificações em vez de alterações',
53
+ listChanges: 'Lista alterações explicitamente (padrão)',
54
+ listSort: 'Ordem de classificação: "recent" (padrão) ou "name"',
55
+ listJson: 'Saída como JSON (para uso programático)',
56
+ // Opções — change show
57
+ changeShowJson: 'Saída como JSON',
58
+ changeShowDeltasOnly: 'Exibe apenas deltas (somente JSON)',
59
+ changeShowRequirementsOnly: 'Alias para --deltas-only (descontinuado)',
60
+ changeShowNoInteractive: 'Desativa prompts interativos',
61
+ // Opções — change validate
62
+ changeValidateStrict: 'Ativa modo de validação estrita',
63
+ changeValidateJson: 'Saída do relatório de validação como JSON',
64
+ changeValidateNoInteractive: 'Desativa prompts interativos',
65
+ // Opções — change list
66
+ changeListJson: 'Saída como JSON',
67
+ changeListLong: 'Exibe ID e título com contagens',
68
+ // Opções — archive
69
+ archiveYes: 'Pula confirmações interativas',
70
+ // Opções genéricas — yes
71
+ yesSkipConfirm: 'Pula confirmações interativas',
72
+ archiveSkipSpecs: 'Ignora operações de atualização de especificação (útil para alterações de infraestrutura, ferramentas ou apenas documentação)',
73
+ archiveNoValidate: 'Ignora validação (não recomendado, requer confirmação)',
74
+ // Opções — validate
75
+ validateAll: 'Valida todas as alterações e especificações',
76
+ validateChanges: 'Valida todas as alterações',
77
+ validateSpecs: 'Valida todas as especificações',
78
+ validateType: 'Especifica o tipo do item quando ambíguo: change|spec',
79
+ validateStrict: 'Ativa modo de validação estrita',
80
+ validateJson: 'Saída dos resultados de validação como JSON',
81
+ validateConcurrency: 'Máximo de validações concorrentes (padrão: env OPENSPEC_CONCURRENCY ou 6)',
82
+ validateNoInteractive: 'Desativa prompts interativos',
83
+ // Opções — show
84
+ showJson: 'Saída como JSON',
85
+ showType: 'Especifica o tipo do item quando ambíguo: change|spec',
86
+ showDeltasOnly: 'Exibe apenas deltas (somente JSON, alteração)',
87
+ showRequirementsOnly: 'Alias para --deltas-only (descontinuado, alteração)',
88
+ showRequirements: 'Somente JSON: Exibe apenas requisitos (exclui cenários)',
89
+ showNoScenarios: 'Somente JSON: Exclui conteúdo de cenários',
90
+ showRequirement: 'Somente JSON: Exibe requisito específico pelo ID (base 1)',
91
+ showNoInteractive: 'Desativa prompts interativos',
92
+ // Opções — feedback
93
+ feedbackBody: 'Descrição detalhada do feedback',
94
+ // Opções — completion install
95
+ completionVerbose: 'Mostra saída detalhada da instalação',
96
+ // Opções — status
97
+ statusChange: 'Nome da alteração para exibir o status',
98
+ statusSchema: 'Sobrescreve o esquema (auto-detectado do config.yaml)',
99
+ statusJson: 'Saída como JSON',
100
+ // Opções — instructions
101
+ instructionsChange: 'Nome da alteração',
102
+ instructionsSchema: 'Sobrescreve o esquema (auto-detectado do config.yaml)',
103
+ instructionsJson: 'Saída como JSON',
104
+ // Opções — templates
105
+ templatesSchema: (defaultSchema) => `Esquema a usar (padrão: ${defaultSchema})`,
106
+ templatesJson: 'Saída como JSON mapeando IDs de artefatos para caminhos de templates',
107
+ // Opções — schemas
108
+ schemasJson: 'Saída como JSON (para uso por agentes)',
109
+ // Opções — new change
110
+ newChangeDescription: 'Descrição a adicionar ao README.md',
111
+ newChangeSchema: (defaultSchema) => `Esquema de fluxo de trabalho a usar (padrão: ${defaultSchema})`,
112
+ // Opções — spec show
113
+ specShowJson: 'Saída como JSON',
114
+ specShowRequirements: 'Somente JSON: Exibe apenas requisitos (exclui cenários)',
115
+ specShowNoScenarios: 'Somente JSON: Exclui conteúdo de cenários',
116
+ specShowRequirement: 'Somente JSON: Exibe requisito específico pelo ID (base 1)',
117
+ specShowNoInteractive: 'Desativa prompts interativos',
118
+ // Opções — spec list
119
+ specListJson: 'Saída como JSON',
120
+ specListLong: 'Exibe id e título com contagens',
121
+ // Opções — spec validate
122
+ specValidateStrict: 'Ativa modo de validação estrita',
123
+ specValidateJson: 'Saída do relatório de validação como JSON',
124
+ specValidateNoInteractive: 'Desativa prompts interativos',
125
+ };
126
+ export const CLI_MESSAGES = {
127
+ unknownError: 'Erro desconhecido',
128
+ notADirectory: (path) => `O caminho "${path}" não é um diretório`,
129
+ directoryWillBeCreated: (path) => `O diretório "${path}" não existe, ele será criado.`,
130
+ cannotAccessPath: (path, err) => `Não foi possível acessar o caminho "${path}": ${err}`,
131
+ experimentalDeprecated: 'Nota: "openspec experimental" está descontinuado. Use "openspec init" em vez disso.',
132
+ error: (err) => `Erro: ${err}`,
133
+ // Avisos de comandos descontinuados
134
+ changeCommandsDeprecated: 'Aviso: Os comandos "openspec change ..." estão descontinuados. Prefira comandos iniciados por verbo (ex: "openspec list", "openspec validate --changes").',
135
+ specCommandsDeprecated: 'Aviso: Os comandos "openspec spec ..." estão descontinuados. Prefira comandos iniciados por verbo (ex: "openspec show", "openspec validate --specs").',
136
+ changeListDeprecated: 'Aviso: "openspec change list" está descontinuado. Use "openspec list".',
137
+ projectLocalNotImplemented: 'Erro: Configuração local de projeto ainda não implementada',
138
+ };
139
+ // ═══════════════════════════════════════════════════════════
140
+ // Comandos — Alteração (src/commands/change.ts)
141
+ // ═══════════════════════════════════════════════════════════
142
+ export const CHANGE_MESSAGES = {
143
+ selectChangeToShow: 'Selecione uma alteração para exibir',
144
+ noChangeSpecifiedNoActive: 'Nenhuma alteração especificada. Nenhuma alteração ativa encontrada.',
145
+ missingWhySection: 'A alteração deve ter uma seção Why',
146
+ missingWhatChangesSection: 'A alteração deve ter uma seção What Changes',
147
+ noChangeSpecifiedAvailable: (ids) => `Nenhuma alteração especificada. IDs disponíveis: ${ids}`,
148
+ hintViewChanges: 'Dica: use "openspec change list" para ver as alterações disponíveis.',
149
+ changeNotFound: (name, path) => `Alteração "${name}" não encontrada em ${path}`,
150
+ requirementsOnlyDeprecated: 'A flag --requirements-only está descontinuada; use --deltas-only em vez disso.',
151
+ noItemsFound: 'Nenhum item encontrado.',
152
+ selectChangeToValidate: 'Selecione uma alteração para validar',
153
+ changeIsValid: (name) => `Alteração "${name}" é válida`,
154
+ changeHasIssues: (name) => `Alteração "${name}" tem problemas`,
155
+ nextSteps: 'Próximos passos:',
156
+ ensureDeltasInSpecs: 'Certifique-se de que a alteração tenha deltas em specs/: use os cabeçalhos ## ADDED/MODIFIED/REMOVED/RENAMED Requirements',
157
+ eachRequirementNeedsScenario: 'Cada requisito DEVE incluir pelo menos um bloco #### Scenario:',
158
+ debugParsedDeltas: 'Depure os deltas analisados: openspec change show <id> --json --deltas-only',
159
+ unableToRead: '(não foi possível ler)',
160
+ tasks: (completed, total) => `[tarefas ${completed}/${total}]`,
161
+ deltas: (count) => `[deltas ${count}]`,
162
+ };
163
+ // ═══════════════════════════════════════════════════════════
164
+ // Comandos — Especificação (src/commands/spec.ts)
165
+ // ═══════════════════════════════════════════════════════════
166
+ export const SPEC_MESSAGES = {
167
+ selectSpecToShow: 'Selecione uma especificação para exibir',
168
+ missingSpecId: 'Argumento obrigatório <spec-id> ausente',
169
+ missingPurposeSection: 'A especificação deve ter uma seção Purpose',
170
+ missingRequirementsSection: 'A especificação deve ter uma seção Requirements',
171
+ specNotFound: (id) => `Especificação '${id}' não encontrada em openspec/specs/${id}/spec.md`,
172
+ requirementsAndRequirementConflict: 'As opções --requirements e --requirement não podem ser usadas juntas',
173
+ requirementNotFound: (id) => `Requisito ${id} não encontrado`,
174
+ specIsValid: (id) => `Especificação '${id}' é válida`,
175
+ specHasIssues: (id) => `Especificação '${id}' tem problemas`,
176
+ noItemsFound: 'Nenhum item encontrado.',
177
+ requirementCount: (count) => `[requisitos ${count}]`,
178
+ selectSpecToValidate: 'Selecione uma especificação para validar',
179
+ };
180
+ // ═══════════════════════════════════════════════════════════
181
+ // Comandos — Exibir (src/commands/show.ts)
182
+ // ═══════════════════════════════════════════════════════════
183
+ export const SHOW_MESSAGES = {
184
+ whatToShow: 'O que você gostaria de exibir?',
185
+ optionChange: 'Alteração',
186
+ optionSpec: 'Especificação',
187
+ noChangesFound: 'Nenhuma alteração encontrada.',
188
+ noSpecsFound: 'Nenhuma especificação encontrada.',
189
+ pickChange: 'Escolha uma alteração',
190
+ pickSpec: 'Escolha uma especificação',
191
+ nothingToShow: 'Nada para exibir. Tente um dos seguintes:',
192
+ showItemHint: ' openspec show <item>',
193
+ showChangeHint: ' openspec change show',
194
+ showSpecHint: ' openspec spec show',
195
+ runInteractiveHint: 'Ou execute em um terminal interativo.',
196
+ unknownItem: (name) => `Item desconhecido '${name}'`,
197
+ didYouMean: (suggestions) => `Você quis dizer: ${suggestions}?`,
198
+ ambiguousItem: (name) => `Item '${name}' é ambíguo e corresponde tanto a uma alteração quanto a uma especificação.`,
199
+ passTypeHint: 'Passe --type change|spec, ou use: openspec change show / openspec spec show',
200
+ ignoringFlags: (type, flags) => `Aviso: Ignorando flags que não se aplicam a ${type}: ${flags}`,
201
+ };
202
+ // ═══════════════════════════════════════════════════════════
203
+ // Comandos — Validar (src/commands/validate.ts)
204
+ // ═══════════════════════════════════════════════════════════
205
+ export const VALIDATE_MESSAGES = {
206
+ whatToValidate: 'O que você gostaria de validar?',
207
+ optionAll: 'Tudo (alterações + especificações)',
208
+ optionAllChanges: 'Todas as alterações',
209
+ optionAllSpecs: 'Todas as especificações',
210
+ optionPickOne: 'Escolher uma alteração ou especificação específica',
211
+ pickAnItem: 'Escolha um item',
212
+ noItemsToValidate: 'Nenhum item encontrado para validar.',
213
+ nothingToValidate: 'Nada para validar. Tente um dos seguintes:',
214
+ validateAllHint: ' openspec validate --all',
215
+ validateChangesHint: ' openspec validate --changes',
216
+ validateSpecsHint: ' openspec validate --specs',
217
+ validateItemHint: ' openspec validate <nome-do-item>',
218
+ runInteractiveHint: 'Ou execute em um terminal interativo.',
219
+ unknownItem: (name) => `Item desconhecido '${name}'`,
220
+ didYouMean: (suggestions) => `Você quis dizer: ${suggestions}?`,
221
+ ambiguousItem: (name) => `Item '${name}' é ambíguo e corresponde tanto a uma alteração quanto a uma especificação.`,
222
+ passTypeHint: 'Passe --type change|spec, ou use: openspec change validate / openspec spec validate',
223
+ changeIsValid: (id) => `Alteração '${id}' é válida`,
224
+ specIsValid: (id) => `Especificação '${id}' é válida`,
225
+ changeHasIssues: (id) => `Alteração '${id}' tem problemas`,
226
+ specHasIssues: (id) => `Especificação '${id}' tem problemas`,
227
+ nextStepsChange: 'Próximos passos:',
228
+ ensureDeltasInSpecs: 'Certifique-se de que a alteração tenha deltas em specs/: use os cabeçalhos ## ADDED/MODIFIED/REMOVED/RENAMED Requirements',
229
+ eachRequirementNeedsScenario: 'Cada requisito DEVE incluir pelo menos um bloco #### Scenario:',
230
+ debugParsedDeltas: 'Depure os deltas analisados: openspec change show <id> --json --deltas-only',
231
+ nextStepsSpec: 'Próximos passos:',
232
+ ensurePurposeAndRequirements: 'Certifique-se de que a especificação inclua as seções ## Purpose e ## Requirements',
233
+ requirementScenarioBullet: '- Cada requisito DEVE incluir pelo menos um bloco #### Scenario:',
234
+ rerunWithJson: 'Execute novamente com --json para ver o relatório estruturado',
235
+ validating: 'Validando...',
236
+ validatingProgress: (current, total) => `Validando (${current}/${total})...`,
237
+ noItemsFoundToValidate: 'Nenhum item encontrado para validar.',
238
+ totals: (passed, failed, total) => `Totais: ${passed} aprovado(s), ${failed} reprovado(s) (${total} itens)`,
239
+ passed: 'aprovado',
240
+ failed: 'reprovado',
241
+ };
242
+ // ═══════════════════════════════════════════════════════════
243
+ // Core — Listar (src/core/list.ts)
244
+ // ═══════════════════════════════════════════════════════════
245
+ export const LIST_MESSAGES = {
246
+ noChangesDir: "Diretório de alterações do BR-OpenSpec não encontrado. Execute 'openspec init' primeiro.",
247
+ noActiveChanges: 'Nenhuma alteração ativa encontrada.',
248
+ noSpecsFound: 'Nenhuma especificação encontrada.',
249
+ changesHeader: 'Alterações:',
250
+ specsHeader: 'Especificações:',
251
+ relativeTime: {
252
+ justNow: 'agora mesmo',
253
+ minutesAgo: (m) => `${m}min atrás`,
254
+ hoursAgo: (h) => `${h}h atrás`,
255
+ daysAgo: (d) => `${d}d atrás`,
256
+ },
257
+ requirements: (count) => `requisitos ${count}`,
258
+ statusLabels: {
259
+ noTasks: 'sem-tarefas',
260
+ complete: 'concluído',
261
+ inProgress: 'em-andamento',
262
+ },
263
+ };
264
+ // ═══════════════════════════════════════════════════════════
265
+ // Core — Visualizar (src/core/view.ts)
266
+ // ═══════════════════════════════════════════════════════════
267
+ export const VIEW_MESSAGES = {
268
+ noOpenspecDir: 'Diretório openspec não encontrado',
269
+ dashboardTitle: 'Painel BR-OpenSpec',
270
+ draftChanges: 'Alterações em Rascunho',
271
+ activeChanges: 'Alterações Ativas',
272
+ completedChanges: 'Alterações Concluídas',
273
+ specifications: 'Especificações',
274
+ summary: 'Resumo:',
275
+ specsSummary: (totalSpecs, totalRequirements) => `Especificações: ${totalSpecs} specs, ${totalRequirements} requisitos`,
276
+ draftChangesCount: (count) => `Alterações em Rascunho: ${count}`,
277
+ activeChangesCount: (count) => `Alterações Ativas: ${count} em andamento`,
278
+ completedChangesCount: (count) => `Alterações Concluídas: ${count}`,
279
+ taskProgress: (completed, total, percentage) => `Progresso de Tarefas: ${completed}/${total} (${percentage}% concluído)`,
280
+ requirementLabel: (count) => count === 1 ? 'requisito' : 'requisitos',
281
+ listHint: (cmd) => `Use ${cmd} para visualizações detalhadas`,
282
+ listHintCommands: (cmd1, cmd2) => `Use ${cmd1} ou ${cmd2} para visualizações detalhadas`,
283
+ };
284
+ // ═══════════════════════════════════════════════════════════
285
+ // Core — Arquivar (src/core/archive.ts)
286
+ // ═══════════════════════════════════════════════════════════
287
+ export const ARCHIVE_MESSAGES = {
288
+ noChangesDir: "Diretório de alterações do BR-OpenSpec não encontrado. Execute 'openspec init' primeiro.",
289
+ changeNotFound: (name) => `Alteração '${name}' não encontrada.`,
290
+ noChangeSelected: 'Nenhuma alteração selecionada. Cancelando.',
291
+ noActiveChanges: 'Nenhuma alteração ativa encontrada.',
292
+ selectChangeToArchive: 'Selecione uma alteração para arquivar',
293
+ proposalWarnings: 'Avisos na proposta proposal.md (não bloqueante):',
294
+ validationErrorsInDeltas: 'Erros de validação nos deltas da alteração:',
295
+ validationFailed: 'Validação falhou. Corrija os erros antes de arquivar.',
296
+ skipValidationHint: 'Para pular a validação (não recomendado), use a flag --no-validate.',
297
+ skipValidationWarning: 'Aviso: Pular a validação pode arquivar especificações inválidas. Continuar? (s/N)',
298
+ archiveCancelled: 'Arquivamento cancelado.',
299
+ skipValidationLog: (timestamp, name) => `[${timestamp}] Validação ignorada para a alteração: ${name}`,
300
+ affectedFiles: (path) => `Arquivos afetados: ${path}`,
301
+ skipValidationFlagWarning: 'Aviso: Pular a validação pode arquivar especificações inválidas.',
302
+ taskStatus: (status) => `Status das tarefas: ${status}`,
303
+ incompleteTasksWarning: (count) => `Aviso: ${count} tarefa(s) incompleta(s) encontrada(s). Continuar?`,
304
+ incompleteTasksContinuing: (count) => `Aviso: ${count} tarefa(s) incompleta(s) encontrada(s). Continuando devido à flag --yes.`,
305
+ skipSpecUpdates: 'Ignorando atualizações de especificação (flag --skip-specs fornecida).',
306
+ specsToUpdate: 'Especificações para atualizar:',
307
+ actionUpdate: 'atualizar',
308
+ actionCreate: 'criar',
309
+ specUpdateStatus: (capability, status) => ` ${capability}: ${status}`,
310
+ proceedWithSpecUpdates: 'Prosseguir com as atualizações de especificação?',
311
+ skipSpecUpdatesProceeding: 'Ignorando atualizações de especificação. Prosseguindo com o arquivamento.',
312
+ validationErrorsInRebuiltSpec: (name) => `Erros de validação na especificação reconstruída para ${name} (as alterações não serão escritas):`,
313
+ abortedNoChanges: 'Abortado. Nenhum arquivo foi alterado.',
314
+ totals: (added, modified, removed, renamed) => `Totais: + ${added}, ~ ${modified}, - ${removed}, → ${renamed}`,
315
+ specsUpdatedSuccessfully: 'Especificações atualizadas com sucesso.',
316
+ archiveAlreadyExists: (name) => `O arquivamento '${name}' já existe.`,
317
+ changeArchived: (changeName, archiveName) => `Alteração '${changeName}' arquivada como '${archiveName}'.`,
318
+ removedRequirementsIgnored: (specName, count) => `⚠️ Aviso: ${specName} - ${count} requisito(s) REMOVED ignorado(s) para nova spec (nada a remover).`,
319
+ };
320
+ // ═══════════════════════════════════════════════════════════
321
+ // Core — Inicializar (src/core/init.ts)
322
+ // ═══════════════════════════════════════════════════════════
323
+ export const INIT_MESSAGES = {
324
+ welcomeTitle: 'Bem-vindo ao BR-OpenSpec',
325
+ welcomeSubtitle: 'Um framework leve orientado a especificações',
326
+ setupWillConfigure: 'Esta configuração irá configurar:',
327
+ agentSkills: ' • Agent Skills para ferramentas de IA',
328
+ slashCommands: ' • Comandos /opsx:*',
329
+ quickStart: 'Início rápido após a configuração:',
330
+ cmdNewChange: 'Criar uma alteração',
331
+ cmdContinue: 'Próximo artefato',
332
+ cmdApply: 'Implementar tarefas',
333
+ pressEnter: 'Pressione Enter para selecionar ferramentas...',
334
+ insufficientPermissions: (path) => `Permissões insuficientes para escrever em ${path}`,
335
+ invalidProfile: (profile) => `Perfil inválido "${profile}". Perfis disponíveis: core, custom`,
336
+ upgradeLegacyPrompt: 'Atualizar e limpar arquivos legados?',
337
+ initializationCancelled: 'Inicialização cancelada.',
338
+ skipPromptHint: 'Execute com --force para pular esta pergunta, ou remova manualmente os arquivos legados.',
339
+ cleaningLegacy: 'Limpando arquivos legados...',
340
+ legacyCleaned: 'Arquivos legados limpos',
341
+ noToolsDetected: (tools) => `Nenhuma ferramenta detectada e nenhuma flag --tools fornecida. Ferramentas válidas:\n ${tools}\n\nUse --tools all, --tools none, ou --tools claude,cursor,...`,
342
+ noToolsAvailable: 'Nenhuma ferramenta disponível para geração de skills.',
343
+ selectToolsPrompt: (count) => `Selecione as ferramentas para configurar (${count} disponíveis)`,
344
+ selectAtLeastOneTool: 'Selecione pelo menos uma ferramenta',
345
+ atLeastOneToolRequired: 'Pelo menos uma ferramenta deve ser selecionada',
346
+ toolsOptionRequired: 'A opção --tools requer um valor. Use "all", "none", ou uma lista de IDs separada por vírgula.',
347
+ toolsOptionRequiresToolId: 'A opção --tools requer pelo menos um ID de ferramenta quando não usar "all" ou "none".',
348
+ cannotCombineReservedValues: 'Não é possível combinar valores reservados "all" ou "none" com IDs de ferramentas específicos.',
349
+ invalidTools: (invalid, available) => `Ferramenta(s) inválida(s): ${invalid}. Valores disponíveis: ${available}`,
350
+ unknownTool: (toolId, validTools) => `Ferramenta desconhecida '${toolId}'. Ferramentas válidas:\n ${validTools}`,
351
+ toolNoSkillSupport: (toolId, validTools) => `Ferramenta '${toolId}' não suporta geração de skills.\nFerramentas com suporte a geração de skills:\n ${validTools}`,
352
+ creatingStructure: 'Criando estrutura do BR-OpenSpec...',
353
+ structureCreated: 'Estrutura do BR-OpenSpec criada',
354
+ settingUp: (name) => `Configurando ${name}...`,
355
+ setupComplete: (name) => `Configuração concluída para ${name}`,
356
+ setupFailed: (name) => `Falha na configuração de ${name}`,
357
+ setupCompleteTitle: 'Configuração do BR-OpenSpec Concluída',
358
+ created: (names) => `Criados: ${names}`,
359
+ refreshed: (names) => `Atualizados: ${names}`,
360
+ failed: (errors) => `Falhas: ${errors}`,
361
+ commandsSkipped: (tools) => `Comandos ignorados para: ${tools} (sem adaptador)`,
362
+ removedCommands: (count) => `Removidos: ${count} arquivos de comando (entrega: skills)`,
363
+ removedSkills: (count) => `Removidos: ${count} diretórios de skill (entrega: commands)`,
364
+ skillsAndCommandsCount: (skills, commands, dirs) => `${skills} skills e ${commands} commands em ${dirs}/`,
365
+ skillsCount: (skills, dirs) => `${skills} skills em ${dirs}/`,
366
+ commandsCount: (commands, dirs) => `${commands} commands em ${dirs}/`,
367
+ configCreated: (schema) => `Config: openspec/config.yaml (schema: ${schema})`,
368
+ configExists: (name) => `Config: openspec/${name} (existe)`,
369
+ configSkipped: 'Config: ignorado (modo não interativo)',
370
+ gettingStarted: 'Início rápido:',
371
+ startFirstChangePropose: (cmd) => `Inicie sua primeira alteração: ${cmd}`,
372
+ startFirstChangeNew: (cmd) => `Inicie sua primeira alteração: ${cmd}`,
373
+ configureWorkflowsHint: "Execute 'openspec config profile' para configurar seus fluxos de trabalho.",
374
+ learnMore: (url) => `Saiba mais: ${url}`,
375
+ feedback: (url) => `Feedback: ${url}`,
376
+ restartIDE: 'Reinicie sua IDE para que os comandos de barra tenham efeito.',
377
+ configuredPreselected: (names) => `BR-OpenSpec configurado: ${names} (pré-selecionado)`,
378
+ detectedToolsLabel: (names, label) => `Diretórios de ferramentas detectados: ${names} (${label})`,
379
+ preselectedFirstTime: 'pré-selecionado para configuração inicial',
380
+ notPreselected: 'não pré-selecionado',
381
+ };
382
+ // ═══════════════════════════════════════════════════════════
383
+ // Comandos — Ferramentas (src/commands/tools.ts)
384
+ // ═══════════════════════════════════════════════════════════
385
+ export const TOOLS_MESSAGES = {
386
+ notInitialized: 'Este projeto não foi inicializado com o BR-OpenSpec.\n Execute `openspec init` primeiro.',
387
+ noToolsToAdd: 'Nenhuma ferramenta especificada para adicionar.',
388
+ noToolsToRemove: 'Nenhuma ferramenta especificada para remover.',
389
+ adding: (name) => `Adicionando ${name}...`,
390
+ added: (name) => `Adicionado ${name}`,
391
+ failedToAdd: (name) => `Falha ao adicionar ${name}`,
392
+ addedList: (names) => `Adicionados: ${names}`,
393
+ failedList: (items) => `Falhas: ${items}`,
394
+ restartIDE: 'Reinicie sua IDE para que os comandos de barra tenham efeito.',
395
+ removing: (name) => `Removendo ${name}...`,
396
+ removed: (name) => `Removido ${name}`,
397
+ failedToRemove: (name) => `Falha ao remover ${name}`,
398
+ removedList: (names) => `Removidos: ${names}`,
399
+ removedCounts: (skills, commands) => ` ${skills} diretório(s) de skill e ${commands} arquivo(s) de comando removidos`,
400
+ currentlyConfigured: (names) => `Configurados atualmente: ${names}`,
401
+ noToolsConfigured: 'Nenhuma ferramenta configurada atualmente.',
402
+ selectToolsToConfigure: (count) => `Selecione as ferramentas para configurar (${count} disponíveis)`,
403
+ noChanges: 'Nenhuma alteração.',
404
+ description: 'Adiciona ou remove configurações de IDE/Agente de Código. Exibe uma lista de verificação interativa quando nenhuma flag é fornecida.',
405
+ addOption: 'Adiciona ferramentas (IDs separados por vírgula ou "all")',
406
+ removeOption: 'Remove ferramentas (IDs separados por vírgula ou "all")',
407
+ cannotAddAndRemoveSame: (tools) => `Não é possível adicionar e remover as mesmas ferramentas: ${tools}`,
408
+ noFlagNonInteractive: 'Nenhuma flag --add ou --remove foi fornecida e o terminal não é interativo.\n Use --add <ferramentas> ou --remove <ferramentas> para operar não interativamente.',
409
+ addRemoveRequiresValue: 'A opção --add/--remove requer um valor. Use "all" ou uma lista de IDs de ferramentas separados por vírgula.',
410
+ cannotCombineReserved: 'Não é possível combinar valores reservados "all" ou "none" com IDs de ferramentas específicos.',
411
+ invalidTools: (invalid, available) => `Ferramenta(s) inválida(s): ${invalid}. Disponíveis: ${available}`,
412
+ };
413
+ // ═══════════════════════════════════════════════════════════
414
+ // Comandos — Configuração (src/commands/config.ts)
415
+ // ═══════════════════════════════════════════════════════════
416
+ export const CONFIG_MESSAGES = {
417
+ viewAndModify: 'Visualiza e modifica a configuração global do BR-OpenSpec',
418
+ showLocation: 'Mostra o caminho do arquivo de configuração',
419
+ showAllSettings: 'Mostra todas as configurações atuais',
420
+ getValue: 'Obtém um valor específico (raw, scriptável)',
421
+ setValue: 'Define um valor (coerção de tipos automática)',
422
+ removeKey: 'Remove uma chave (reverte para o padrão)',
423
+ resetConfig: 'Restaura a configuração para os padrões',
424
+ openInEditor: 'Abre a configuração no $EDITOR',
425
+ configureProfile: 'Configura o perfil do fluxo de trabalho (seletor interativo ou atalho de preset)',
426
+ schemaDescription: 'Descrição do esquema:',
427
+ selectArtifacts: 'Selecione os artefatos para incluir:',
428
+ setAsDefaultSchema: 'Definir como esquema padrão do projeto?',
429
+ resetConfirm: 'Restaurar todas as configurações para os padrões?',
430
+ whatToConfigure: 'O que você deseja configurar?',
431
+ deliveryMode: 'Modo de entrega (como os fluxos de trabalho são instalados):',
432
+ selectWorkflows: 'Selecione os fluxos de trabalho a tornar disponíveis:',
433
+ applyChangesNow: 'Aplicar alterações a este projeto agora?',
434
+ profileSettings: 'Configurações de perfil:',
435
+ invalidConfigKey: (key, reason) => `Chave de configuração inválida "${key}".${reason}`,
436
+ useConfigList: 'Use "openspec config list" para ver as chaves disponíveis.',
437
+ passAllowUnknown: 'Passe --allow-unknown para ignorar esta verificação.',
438
+ invalidConfiguration: (error) => `Configuração inválida - ${error}`,
439
+ setKeyValue: (key, value) => `Definido ${key} = ${value}`,
440
+ unsetKey: (key) => `Removido ${key} (revertido para o padrão)`,
441
+ keyNotSet: (key) => `Chave "${key}" não estava definida`,
442
+ resetAllRequired: 'Erro: A flag --all é obrigatória para reset',
443
+ resetUsage: 'Uso: openspec config reset --all [-y]',
444
+ resetCancelled: 'Reset cancelado.',
445
+ configurationReset: 'Configuração restaurada para os padrões',
446
+ noEditorConfigured: 'Erro: Nenhum editor configurado',
447
+ setEditorEnv: 'Defina a variável de ambiente EDITOR ou VISUAL para o seu editor preferido',
448
+ editorExample: 'Exemplo: export EDITOR=vim',
449
+ configFileNotFound: (path) => `Erro: Arquivo de configuração não encontrado em ${path}`,
450
+ invalidJson: (path) => `Erro: JSON inválido em ${path}`,
451
+ unableToValidateConfig: (error) => `Erro: Não foi possível validar a configuração - ${error}`,
452
+ configUpdated: 'Configuração atualizada. Execute `openspec update` nos seus projetos para aplicar.',
453
+ unknownProfilePreset: (preset) => `Erro: Preset de perfil desconhecido "${preset}". Presets disponíveis: core`,
454
+ interactiveModeRequired: 'Modo interativo necessário. Use `openspec config profile core` ou defina a configuração via ambiente/flags.',
455
+ currentProfileSettings: 'Configurações atuais do perfil',
456
+ profileLabel: (profile, source) => ` perfil: ${profile ?? '?'} ${source}`,
457
+ deliveryLabel: (delivery, source) => source ? ` entrega: ${delivery ?? '?'} ${source}` : ` Entrega: ${delivery ?? '?'}`,
458
+ workflowsLabel: (summary) => ` Fluxos de trabalho: ${summary}`,
459
+ workflowsSelectedCount: (count, profile) => `${count} selecionados (${profile})`,
460
+ workflowsAdded: (names) => `adicionados ${names}`,
461
+ workflowsRemoved: (names) => `removidos ${names}`,
462
+ workflowsDiffLabel: (changes) => `fluxos de trabalho: ${changes}`,
463
+ workflowLabel: (name) => `Fluxo de trabalho: ${name}`,
464
+ coreWorkflowsNote: (workflows) => ` fluxos: ${workflows} (do perfil core)`,
465
+ explicitWorkflowsNote: (workflows) => ` fluxos: ${workflows} (explícito)`,
466
+ noWorkflowsNote: ' fluxos: (nenhum)',
467
+ deliveryHelp: ' Entrega = onde os fluxos de trabalho são instalados (skills, commands, ou both)',
468
+ workflowsHelp: ' Fluxos de trabalho = quais ações estão disponíveis (propose, explore, apply, etc.)',
469
+ deliveryAndWorkflows: 'Entrega e fluxos de trabalho',
470
+ deliveryAndWorkflowsDesc: 'Atualiza modo de instalação e ações disponíveis juntos',
471
+ deliveryOnly: 'Apenas entrega',
472
+ deliveryOnlyDesc: 'Altera onde os fluxos de trabalho são instalados',
473
+ workflowsOnly: 'Apenas fluxos de trabalho',
474
+ workflowsOnlyDesc: 'Altera quais ações de fluxo de trabalho estão disponíveis',
475
+ keepCurrentSettings: 'Manter configurações atuais (sair)',
476
+ keepCurrentSettingsDesc: 'Sair sem alterar a configuração',
477
+ noConfigChanges: 'Nenhuma alteração na configuração.',
478
+ warningGlobalConfigNotApplied: 'Aviso: A configuração global não foi aplicada a este projeto. Execute `openspec update` para sincronizar.',
479
+ bothSkillsAndCommands: 'Ambos (skills + commands)',
480
+ bothSkillsAndCommandsDesc: 'Instala fluxos de trabalho como skills e comandos de barra',
481
+ skillsOnly: 'Apenas skills',
482
+ skillsOnlyDesc: 'Instala fluxos de trabalho apenas como skills',
483
+ commandsOnly: 'Apenas commands',
484
+ commandsOnlyDesc: 'Instala fluxos de trabalho apenas como comandos de barra',
485
+ currentSuffix: ' [atual]',
486
+ configChanges: 'Alterações na configuração:',
487
+ updateFailed: '`openspec update` falhou. Execute-o manualmente para aplicar as alterações do perfil.',
488
+ configProfileCancelled: 'Configuração de perfil cancelada.',
489
+ spaceToToggle: 'Espaço para alternar, Enter para confirmar',
490
+ configScopeOption: 'Escopo da configuração (apenas "global" suportado atualmente)',
491
+ forceStringOption: 'Força o valor a ser armazenado como string',
492
+ allowUnknownOption: 'Permite definir chaves desconhecidas',
493
+ resetAllOption: 'Restaura toda a configuração (obrigatório)',
494
+ skipConfirmationOption: 'Ignora prompts de confirmação',
495
+ outputAsJson: 'Saída como JSON',
496
+ // Workflow names
497
+ workflowProposeName: 'Propor alteração',
498
+ workflowProposeDesc: 'Cria proposta, design e tarefas a partir de uma solicitação',
499
+ workflowExploreName: 'Explorar ideias',
500
+ workflowExploreDesc: 'Investiga um problema antes da implementação',
501
+ workflowNewName: 'Nova alteração',
502
+ workflowNewDesc: 'Cria um scaffold de alteração rapidamente',
503
+ workflowContinueName: 'Continuar alteração',
504
+ workflowContinueDesc: 'Retoma o trabalho em uma alteração existente',
505
+ workflowApplyName: 'Aplicar tarefas',
506
+ workflowApplyDesc: 'Implementa as tarefas da alteração atual',
507
+ workflowFastForwardName: 'Avanço rápido',
508
+ workflowFastForwardDesc: 'Executa um fluxo de implementação mais rápido',
509
+ workflowSyncName: 'Sincronizar specs',
510
+ workflowSyncDesc: 'Sincroniza artefatos da alteração com as especificações',
511
+ workflowArchiveName: 'Arquivar alteração',
512
+ workflowArchiveDesc: 'Finaliza e arquiva uma alteração concluída',
513
+ workflowBulkArchiveName: 'Arquivamento em massa',
514
+ workflowBulkArchiveDesc: 'Arquiva múltiplas alterações concluídas juntas',
515
+ workflowVerifyName: 'Verificar alteração',
516
+ workflowVerifyDesc: 'Executa verificações contra uma alteração',
517
+ workflowOnboardName: 'Onboarding',
518
+ workflowOnboardDesc: 'Fluxo de onboarding guiado para o BR-OpenSpec',
519
+ };
520
+ // ═══════════════════════════════════════════════════════════
521
+ // Comandos — Esquema (src/commands/schema.ts)
522
+ // ═══════════════════════════════════════════════════════════
523
+ export const SCHEMA_MESSAGES = {
524
+ manageWorkflows: 'Gerencia esquemas de fluxo de trabalho [experimental]',
525
+ showResolve: 'Mostra de onde um esquema é resolvido',
526
+ validateStructure: 'Valida a estrutura de um esquema e seus templates',
527
+ copySchema: 'Copia um esquema existente para o projeto para customização',
528
+ createSchema: 'Cria um novo esquema local para o projeto',
529
+ schemaNotFound: 'schema.yaml não encontrado',
530
+ failedToReadFile: (err) => `Falha ao ler o arquivo: ${err}`,
531
+ parseError: (err) => `Erro de análise: ${err}`,
532
+ templateNotFound: (template, artifact) => `Arquivo de template '${template}' não encontrado para o artefato '${artifact}'`,
533
+ noProjectSchemasDir: 'Nenhum diretório de esquemas do projeto encontrado',
534
+ experimentalWarning: 'Nota: Os comandos de esquema são experimentais e podem mudar.',
535
+ listAllSchemasOption: 'Lista todos os esquemas com suas fontes de resolução',
536
+ noSchemasFound: 'Nenhum esquema encontrado.',
537
+ projectSchemasHeader: 'Esquemas do projeto:',
538
+ userSchemasHeader: 'Esquemas do usuário:',
539
+ packageSchemasHeader: 'Esquemas do pacote:',
540
+ shadowsLabel: (sources) => ` (sombras: ${sources})`,
541
+ schemaNameRequired: 'Erro: Nome do esquema é obrigatório (ou use --all para listar todos os esquemas)',
542
+ schemaNotFoundError: (name) => `Erro: Esquema '${name}' não encontrado`,
543
+ availableSchemas: (schemas) => `Esquemas disponíveis: ${schemas}`,
544
+ schemaLabel: (name) => `Esquema: ${name}`,
545
+ sourceLabel: (source) => `Fonte: ${source}`,
546
+ pathLabel: (path) => `Caminho: ${path}`,
547
+ shadowsHeader: 'Sombras:',
548
+ shadowEntry: (source, path) => ` ${source}: ${path}`,
549
+ verboseOption: 'Mostra etapas detalhadas de validação',
550
+ validatingEntry: (name) => `Validando ${name}...`,
551
+ noSchemasInProject: 'Nenhum esquema encontrado no projeto.',
552
+ validationResultsHeader: 'Resultados da Validação:',
553
+ validationStatus: (valid, name) => ` ${valid ? '✓' : '✗'} ${name}`,
554
+ issueLine: (level, message) => ` ${level}: ${message}`,
555
+ schemaIsValid: (name) => `✓ Esquema '${name}' é válido`,
556
+ schemaHasErrors: (name) => `✗ Esquema '${name}' tem erros:`,
557
+ forceOption: 'Sobrescreve o destino existente',
558
+ invalidSchemaName: (name) => `Nome de esquema inválido '${name}'. Use kebab-case (ex: my-workflow)`,
559
+ schemaNamesKebabCase: 'Nomes de esquema devem ser kebab-case (ex: my-workflow)',
560
+ schemaSourceNotFound: (source) => `Esquema '${source}' não encontrado`,
561
+ schemaAlreadyExists: (name) => `Esquema '${name}' já existe`,
562
+ suggestionForceOverwrite: 'Use --force para sobrescrever',
563
+ schemaAlreadyExistsAt: (name, path) => `Erro: Esquema '${name}' já existe em ${path}`,
564
+ removingExistingSchema: (name) => `Removendo esquema existente '${name}'...`,
565
+ forkingSchema: (source, dest) => `Copiando '${source}' para '${dest}'...`,
566
+ forkedSchema: (source, dest) => `Copiado '${source}' para '${dest}'`,
567
+ sourceLabel2: (path, location) => `Fonte: ${path} (${location})`,
568
+ destinationLabel: (path) => `Destino: ${path}`,
569
+ customizeSchemaAt: 'Agora você pode customizar o esquema em:',
570
+ forkFailed: 'Falha na cópia',
571
+ descriptionOption: 'Descrição do esquema',
572
+ artifactsOption: 'IDs de artefatos separados por vírgula (proposal,specs,design,tasks)',
573
+ defaultSchemaDescription: (name) => `Esquema de fluxo de trabalho customizado para ${name}`,
574
+ defaultOption: 'Define como esquema padrão do projeto',
575
+ noDefaultOption: 'Não perguntar para definir como padrão',
576
+ forceOption2: 'Sobrescreve o esquema existente',
577
+ suggestionForkOrForce: 'Use --force para sobrescrever ou "openspec schema fork" para copiar',
578
+ atLeastOneArtifact: 'Erro: Pelo menos um artefato deve ser selecionado',
579
+ unknownArtifact: (id) => `Artefato desconhecido '${id}'`,
580
+ validArtifacts: (ids) => `Artefatos válidos: ${ids}`,
581
+ creatingSchema: (name) => `Criando esquema '${name}'...`,
582
+ schemaCreated: (name) => `Criado esquema '${name}'`,
583
+ schemaCreatedAt: (path) => `Esquema criado em: ${path}`,
584
+ artifactsLabel: (ids) => `Artefatos: ${ids}`,
585
+ setAsDefaultSchemaLabel: 'Definido como esquema padrão do projeto.',
586
+ nextStepsHeader: 'Próximos passos:',
587
+ editSchemaYaml: (path) => ` 1. Edite ${path}/schema.yaml para customizar artefatos`,
588
+ modifyTemplates: ' 2. Modifique templates no diretório do esquema',
589
+ useWithSchema: (name) => ` 3. Use com: openspec new --schema ${name}`,
590
+ creationFailed: 'Falha na criação',
591
+ outputAsJson: 'Saída como JSON',
592
+ checkingSchemaExists: ' Verificando se schema.yaml existe...',
593
+ parsingYaml: ' Analisando YAML...',
594
+ validatingSchemaStructure: ' Validando estrutura do esquema...',
595
+ checkingTemplateFiles: ' Verificando arquivos de template...',
596
+ dependencyGraphPassed: ' Validação do grafo de dependências passou (via parseSchema)',
597
+ };
598
+ // ═══════════════════════════════════════════════════════════
599
+ // Comandos — Completions (src/commands/completion.ts)
600
+ // ═══════════════════════════════════════════════════════════
601
+ export const COMPLETION_MESSAGES = {
602
+ removeConfigConfirm: (path) => `Remover a configuração do BR-OpenSpec de ${path}?`,
603
+ shellNotSupported: (shell, supported) => `Erro: Shell '${shell}' ainda não é suportado. Suportados atualmente: ${supported}`,
604
+ couldNotDetectShell: 'Erro: Não foi possível detectar o shell automaticamente. Especifique o shell explicitamente.',
605
+ usageCompletion: (operation) => `Uso: openspec completion ${operation} [shell]`,
606
+ currentlySupported: (supported) => `Suportados atualmente: ${supported}`,
607
+ installingCompletion: (shell) => `Instalando script de autocomplete para ${shell}...`,
608
+ installSuccess: (message) => `✓ ${message}`,
609
+ installedTo: (path) => ` Instalado em: ${path}`,
610
+ backupCreated: (path) => ` Backup criado: ${path}`,
611
+ configFileConfigured: (path) => ` ${path} configurado automaticamente`,
612
+ restartShell: (cmd) => `Reinicie o shell ou execute: ${cmd}`,
613
+ installFailed: (message) => `✗ ${message}`,
614
+ failedToInstall: (error) => `✗ Falha ao instalar script de autocomplete: ${error}`,
615
+ uninstallCancelled: 'Desinstalação cancelada.',
616
+ uninstallingCompletion: (shell) => `Desinstalando script de autocomplete para ${shell}...`,
617
+ uninstallSuccess: (message) => `✓ ${message}`,
618
+ uninstallFailed: (message) => `✗ ${message}`,
619
+ failedToUninstall: (error) => `✗ Falha ao desinstalar script de autocomplete: ${error}`,
620
+ zshScriptRemoved: (path) => `Script de autocomplete removido de ${path}`,
621
+ zshConfigRemoved: 'Configuração do BR-OpenSpec removida de ~/.zshrc',
622
+ bashAlreadyInstalled: 'O script de autocomplete já está instalado e atualizado',
623
+ bashAlreadyInstalledDetail: 'O script de autocomplete já está instalado e atualizado.',
624
+ bashAlreadyInstalledHint: 'Se o autocomplete não estiver funcionando, tente: exec bash',
625
+ bashUpdatedWithBackup: 'Script de autocomplete atualizado com sucesso (versão anterior salva em backup)',
626
+ bashUpdated: 'Script de autocomplete atualizado com sucesso',
627
+ bashInstalledWithBashrc: 'Script de autocomplete instalado e .bashrc configurado com sucesso',
628
+ bashInstalled: 'Script de autocomplete instalado com sucesso para Bash',
629
+ bashNotInstalled: 'Script de autocomplete não instalado',
630
+ bashUninstalled: 'Script de autocomplete desinstalado com sucesso',
631
+ bashFailedToInstall: (error) => `Falha ao instalar script de autocomplete: ${error}`,
632
+ bashFailedToUninstall: (error) => `Falha ao desinstalar script de autocomplete: ${error}`,
633
+ bashScriptInstalled: 'Script de autocomplete instalado com sucesso.',
634
+ bashAddToBashrc: 'Para ativar o autocomplete, adicione o seguinte ao seu arquivo ~/.bashrc:',
635
+ bashSourceComment: '# Carrega os autocompletes do BR-OpenSpec',
636
+ bashThenRestartShell: (cmd) => `Depois reinicie o shell ou execute: ${cmd}`,
637
+ zshAlreadyInstalled: 'Script de autocomplete já está instalado (atualizado)',
638
+ zshAlreadyInstalledDetail: 'O script de autocomplete já está instalado e atualizado.',
639
+ zshAlreadyInstalledHint: 'Se o autocomplete não estiver funcionando, tente: exec zsh',
640
+ zshUpdatedWithBackup: 'Script de autocomplete atualizado com sucesso (versão anterior salva em backup)',
641
+ zshUpdated: 'Script de autocomplete atualizado com sucesso',
642
+ zshInstalledOhMyZsh: 'Script de autocomplete instalado com sucesso para Oh My Zsh',
643
+ zshInstalledWithZshrc: 'Script de autocomplete instalado e .zshrc configurado com sucesso',
644
+ zshInstalled: 'Script de autocomplete instalado com sucesso para Zsh',
645
+ zshFailedToInstall: (error) => `Falha ao instalar script de autocomplete: ${error}`,
646
+ zshOhMyZshFpathNote: 'Nota: Oh My Zsh normalmente carrega automaticamente os scripts de autocomplete do diretório custom/completions.',
647
+ zshOhMyZshFpathVerify: (dir) => `Verifique se ${dir} está no seu fpath executando:`,
648
+ zshOhMyZshFpathRestart: 'Se não for encontrado, o autocomplete pode não funcionar. Reinicie o shell para garantir que as alterações tenham efeito.',
649
+ zshOhMyZshInstalledDir: 'Script de autocomplete instalado no diretório de completions do Oh My Zsh.',
650
+ zshOhMyZshAutoActivate: 'O autocomplete deve ativar automaticamente.',
651
+ zshInstalledDir: 'Script de autocomplete instalado em ~/.zsh/completions/',
652
+ zshAddToZshrc: 'Para ativar o autocomplete, adicione o seguinte ao seu arquivo ~/.zshrc:',
653
+ zshFpathComment: '# Adiciona diretório de completions ao fpath',
654
+ zshCompinitComment: '# Inicializa o sistema de autocomplete',
655
+ zshThenRestartShell: (cmd) => `Depois reinicie o shell ou execute: ${cmd}`,
656
+ zshCheckExistingLines: (path) => `Verifique se estas linhas já existem em ${path} antes de adicioná-las.`,
657
+ activeChange: 'alteração ativa',
658
+ specification: 'especificação',
659
+ archivedChange: 'alteração arquivada',
660
+ bashCompletionNotDetected: '⚠️ Aviso: pacote bash-completion não detectado',
661
+ bashCompletionRequired: 'O script de autocomplete requer bash-completion para funcionar.',
662
+ installWith: 'Instale-o com:',
663
+ addToBashProfile: 'Depois adicione ao seu ~/.bash_profile:',
664
+ warningSkippingProfile: (path, err) => `Aviso: Ignorando ${path}: ${err}`,
665
+ warningCouldNotConfigure: (path, err) => `Aviso: Não foi possível configurar ${path}: ${err}`,
666
+ warningCouldNotRead: (path, err) => `Aviso: Não foi possível ler ${path}: ${err}`,
667
+ warningStartMarkerWithoutEnd: (path) => `Aviso: Marcador de início encontrado mas sem marcador de fim em ${path}`,
668
+ warningCouldNotClean: (path, err) => `Aviso: Não foi possível limpar ${path}: ${err}`,
669
+ warningCouldNotRemoveLegacy: (path, err) => `Aviso: Não foi possível remover arquivo legado ${path}: ${err}`,
670
+ powershellCompletionHeader: '# Script de autocompletar PowerShell para a CLI do BR-OpenSpec',
671
+ powershellCompletionNote: '# Gerado automaticamente - não edite manualmente',
672
+ };
673
+ // ═══════════════════════════════════════════════════════════
674
+ // Comandos — Feedback (src/commands/feedback.ts)
675
+ // ═══════════════════════════════════════════════════════════
676
+ export const FEEDBACK_MESSAGES = {
677
+ submitFeedback: 'Envia feedback sobre o BR-OpenSpec',
678
+ githubCliNotFound: '⚠️ GitHub CLI não encontrado. Submissão manual necessária.',
679
+ githubAuthRequired: '⚠️ Autenticação do GitHub necessária. Submissão manual necessária.',
680
+ formattedFeedbackHeader: '\n--- FEEDBACK FORMATADO ---',
681
+ titleLabel: (title) => `Título: ${title}`,
682
+ labelsFeedback: 'Labels: feedback',
683
+ bodyLabel: '\nCorpo:',
684
+ endFeedback: '\n--- FIM DO FEEDBACK ---\n',
685
+ submitManually: 'Por favor, envie seu feedback manualmente:',
686
+ autoSubmitHint: '\nPara envio automático no futuro: gh auth login',
687
+ feedbackSubmitted: '\n✓ Feedback enviado com sucesso!',
688
+ issueUrl: (url) => `URL da Issue: ${url}\n`,
689
+ feedbackTitle: (message) => `Feedback: ${message}`,
690
+ submittedVia: 'Enviado via BR-OpenSpec CLI',
691
+ versionLabel: (version) => `- Versão: ${version}`,
692
+ platformLabel: (platform) => `- Plataforma: ${platform}`,
693
+ timestampLabel: (timestamp) => `- Timestamp: ${timestamp}`,
694
+ };
695
+ // ═══════════════════════════════════════════════════════════
696
+ // UI / Tela de boas-vindas (src/ui/welcome-screen.ts)
697
+ // ═══════════════════════════════════════════════════════════
698
+ export const UI_MESSAGES = {
699
+ welcomeTitle: 'Bem-vindo ao BR-OpenSpec',
700
+ welcomeSubtitle: 'Um framework leve orientado a especificações',
701
+ setupWillConfigure: 'Esta configuração irá configurar:',
702
+ agentSkills: ' • Agent Skills para ferramentas de IA',
703
+ slashCommands: ' • Comandos /opsx:*',
704
+ quickStart: 'Início rápido após a configuração:',
705
+ cmdNewChange: 'Criar uma alteração',
706
+ cmdContinue: 'Próximo artefato',
707
+ cmdApply: 'Implementar tarefas',
708
+ pressEnter: 'Pressione Enter para selecionar ferramentas...',
709
+ };
710
+ // ═══════════════════════════════════════════════════════════
711
+ // Prompts — Seleção múltipla com busca (src/prompts/searchable-multi-select.ts)
712
+ // ═══════════════════════════════════════════════════════════
713
+ export const PROMPT_MESSAGES = {
714
+ invalid: 'Inválido',
715
+ none: '(nenhum)',
716
+ noneSelected: '(nenhum selecionado)',
717
+ selected: 'Selecionados:',
718
+ search: 'Buscar:',
719
+ typeToFilter: 'digite para filtrar',
720
+ navigate: 'navegar',
721
+ toggle: 'alternar',
722
+ remove: 'remover',
723
+ confirm: 'confirmar',
724
+ noMatches: 'Nenhuma correspondência',
725
+ configured: '(configurado)',
726
+ detected: '(detectado)',
727
+ refresh: '(atualizar)',
728
+ selectedLabel: '(selecionado)',
729
+ };
730
+ // ═══════════════════════════════════════════════════════════
731
+ // Utilitários
732
+ // ═══════════════════════════════════════════════════════════
733
+ export const UTILS_MESSAGES = {
734
+ failedToReadTasks: (path, err) => `Falha ao ler o arquivo de tarefas em ${path}: ${err}`,
735
+ };
736
+ // ═══════════════════════════════════════════════════════════
737
+ // Core — Atualizar (src/core/update.ts)
738
+ // ═══════════════════════════════════════════════════════════
739
+ export const UPDATE_MESSAGES = {
740
+ noOpenspecDir: "Diretório do BR-OpenSpec não encontrado. Execute 'openspec init' primeiro.",
741
+ noConfiguredTools: 'Nenhuma ferramenta configurada encontrada.',
742
+ runInitHint: 'Execute "openspec init" para configurar ferramentas.',
743
+ forceUpdating: (count, tools) => `Forçando atualização de ${count} ferramenta(s): ${tools}`,
744
+ updatingTool: (name) => `Atualizando ${name}...`,
745
+ updatedTool: (name) => `Atualizado ${name}`,
746
+ failedToUpdate: (name) => `Falha ao atualizar ${name}`,
747
+ updated: (tools, version) => `✓ Atualizados: ${tools} (v${version})`,
748
+ failed: (errors) => `✗ Falhas: ${errors}`,
749
+ removedCommands: (count) => `Removidos: ${count} arquivos de comando (entrega: skills)`,
750
+ removedSkills: (count) => `Removidos: ${count} diretórios de skill (entrega: commands)`,
751
+ removedDeselectedCommands: (count) => `Removidos: ${count} arquivos de comando (fluxos de trabalho desselecionados)`,
752
+ removedDeselectedSkills: (count) => `Removidos: ${count} diretórios de skill (fluxos de trabalho desselecionados)`,
753
+ gettingStarted: 'Início rápido:',
754
+ cmdNew: ' /opsx:new Iniciar uma nova alteração',
755
+ cmdContinue: ' /opsx:continue Criar o próximo artefato',
756
+ cmdApply: ' /opsx:apply Implementar tarefas',
757
+ learnMore: (url) => `Saiba mais: ${url}`,
758
+ restartIDE: 'Reinicie sua IDE para que as alterações tenham efeito.',
759
+ allUpToDate: (count, version) => `✓ Todas as ${count} ferramenta(s) estão atualizadas (v${version})`,
760
+ toolsList: (tools) => ` Ferramentas: ${tools}`,
761
+ useForceHint: 'Use --force para atualizar os arquivos mesmo assim.',
762
+ updatingPlan: (count, updates) => `Atualizando ${count} ferramenta(s): ${updates}`,
763
+ alreadyUpToDate: (tools) => `Já atualizadas: ${tools}`,
764
+ detectedNewTools: (noun, names, pronoun) => `Detectadas novas ${noun}: ${names}. Execute 'openspec init' para adicionar ${pronoun}.`,
765
+ toolNoun: 'ferramenta',
766
+ toolsNoun: 'ferramentas',
767
+ it: 'ela',
768
+ them: 'elas',
769
+ extraWorkflowsNote: (count) => `Nota: ${count} fluxos de trabalho extras não estão no perfil (use \`openspec config profile\` para gerenciar)`,
770
+ cleaningLegacy: 'Limpando arquivos legados...',
771
+ legacyCleaned: 'Arquivos legados limpos',
772
+ forceLegacyHint: '⚠ Execute com --force para limpar automaticamente arquivos legados, ou execute de forma interativa.',
773
+ upgradeLegacyPrompt: 'Atualizar e limpar arquivos legados?',
774
+ skippingLegacyCleanup: 'Ignorando limpeza de legados. Continuando com a atualização de skills...',
775
+ toolsDetectedFromLegacy: 'Ferramentas detectadas de artefatos legados:',
776
+ setupSkillsFor: (tools) => `Configurando skills para: ${tools}`,
777
+ selectToolsNewSkillSystem: 'Selecione as ferramentas para configurar com o novo sistema de skills:',
778
+ skippingToolSetup: 'Ignorando configuração de ferramentas.',
779
+ settingUp: (name) => `Configurando ${name}...`,
780
+ setupComplete: (name) => `Configuração concluída para ${name}`,
781
+ failedToSetup: (name) => `Falha ao configurar ${name}`,
782
+ };
783
+ // ═══════════════════════════════════════════════════════════
784
+ // Utilitários — Progresso de Tarefas (src/utils/task-progress.ts)
785
+ // ═══════════════════════════════════════════════════════════
786
+ export const TASK_PROGRESS_MESSAGES = {
787
+ noTasks: 'Sem tarefas',
788
+ complete: '✓ Concluído',
789
+ tasksCount: (completed, total) => `${completed}/${total} tarefas`,
790
+ };
791
+ // ═══════════════════════════════════════════════════════════
792
+ // Utilitários — Sistema de Arquivos (src/utils/file-system.ts)
793
+ // ═══════════════════════════════════════════════════════════
794
+ export const FILE_SYSTEM_MESSAGES = {
795
+ endMarkerBeforeStart: (filePath) => `Estado de marcador inválido em ${filePath}. O marcador final aparece antes do inicial.`,
796
+ invalidMarkerState: (filePath, startFound, endFound) => `Estado de marcador inválido em ${filePath}. Marcador inicial encontrado: ${startFound}, Marcador final encontrado: ${endFound}`,
797
+ unableToCheckFileExists: (filePath, error) => `Não foi possível verificar se o arquivo existe em ${filePath}: ${error}`,
798
+ unableToCheckDirExists: (dirPath, error) => `Não foi possível verificar se o diretório existe em ${dirPath}: ${error}`,
799
+ pathComponentNotDir: (dirPath) => `Componente do caminho ${dirPath} existe mas não é um diretório`,
800
+ errorCheckingDir: (dir, error) => `Erro ao verificar diretório ${dir}: ${error}`,
801
+ unableToDetermineWritePermissions: (filePath, error) => `Não foi possível determinar permissões de escrita para ${filePath}: ${error}`,
802
+ insufficientPermissions: (dirPath, error) => `Permissões insuficientes para escrever em ${dirPath}: ${error}`,
803
+ couldNotCleanUpTestFile: (filePath, error) => `Não foi possível limpar arquivo de teste ${filePath}: ${error}`,
804
+ };
805
+ // ═══════════════════════════════════════════════════════════
806
+ // Core — Validação (src/core/validation/validator.ts)
807
+ // ═══════════════════════════════════════════════════════════
808
+ export const VALIDATOR_MESSAGES = {
809
+ unknownError: 'Erro desconhecido',
810
+ duplicateRequirementAdded: (name) => `Requisito duplicado em ADDED: "${name}"`,
811
+ missingRequirementTextAdded: (name) => `ADDED "${name}" está sem texto de requisito`,
812
+ missingShallOrMustAdded: (name) => `ADDED "${name}" deve conter SHALL ou MUST`,
813
+ missingScenarioAdded: (name) => `ADDED "${name}" deve incluir pelo menos um cenário`,
814
+ duplicateRequirementModified: (name) => `Requisito duplicado em MODIFIED: "${name}"`,
815
+ missingRequirementTextModified: (name) => `MODIFIED "${name}" está sem texto de requisito`,
816
+ missingShallOrMustModified: (name) => `MODIFIED "${name}" deve conter SHALL ou MUST`,
817
+ missingScenarioModified: (name) => `MODIFIED "${name}" deve incluir pelo menos um cenário`,
818
+ duplicateRequirementRemoved: (name) => `Requisito duplicado em REMOVED: "${name}"`,
819
+ duplicateFromRenamed: (name) => `FROM duplicado em RENAMED: "${name}"`,
820
+ duplicateToRenamed: (name) => `TO duplicado em RENAMED: "${name}"`,
821
+ requirementInModifiedAndRemoved: (name) => `Requisito presente em MODIFIED e REMOVED: "${name}"`,
822
+ requirementInModifiedAndAdded: (name) => `Requisito presente em MODIFIED e ADDED: "${name}"`,
823
+ requirementInAddedAndRemoved: (name) => `Requisito presente em ADDED e REMOVED: "${name}"`,
824
+ modifiedReferencesOldRenamed: (to) => `MODIFIED referencia nome antigo de RENAMED. Use o novo cabeçalho para "${to}"`,
825
+ renamedToCollidesAdded: (to) => `RENAMED TO colide com ADDED para "${to}"`,
826
+ deltaSectionsEmpty: (sections) => `Seções de delta ${sections} foram encontradas, mas nenhuma entrada de requisito foi analisada. Certifique-se de que cada seção inclua pelo menos um bloco "### Requirement:" (REMOVED pode usar sintaxe de lista com marcadores).`,
827
+ noDeltaSectionsFound: 'Nenhuma seção de delta encontrada. Adicione cabeçalhos como "## ADDED Requirements" ou mova notas que não sejam deltas para fora de specs/.',
828
+ };
829
+ // ═══════════════════════════════════════════════════════════
830
+ // Comandos — Workflow (src/commands/workflow/*.ts)
831
+ // ═══════════════════════════════════════════════════════════
832
+ export const WORKFLOW_MESSAGES = {
833
+ // instructions.ts
834
+ generatingInstructions: 'Gerando instruções...',
835
+ missingArtifactArgument: (artifacts) => `Argumento obrigatório <artifact> ausente. Artefatos válidos:\n ${artifacts}`,
836
+ artifactNotFound: (artifactId, schemaName, artifacts) => `Artefato '${artifactId}' não encontrado no esquema '${schemaName}'. Artefatos válidos:\n ${artifacts}`,
837
+ unmetDependenciesWarning: 'Este artefato possui dependências não satisfeitas. Complete-as primeiro ou prossiga com cautela.',
838
+ missingDependencies: (deps) => `Pendentes: ${deps}`,
839
+ createArtifactTask: (artifactId, changeName) => `Crie o artefato ${artifactId} para a alteração "${changeName}".`,
840
+ readFilesForContext: 'Leia estes arquivos para contexto antes de criar este artefato:',
841
+ writeTo: (filePath) => `Escreva em: ${filePath}`,
842
+ unlocksArtifacts: (artifacts) => `Completar este artefato habilita: ${artifacts}`,
843
+ generatingApplyInstructions: 'Gerando instruções de aplicação...',
844
+ cannotApplyMissingArtifacts: (artifacts) => `Não é possível aplicar esta alteração ainda. Artefatos ausentes: ${artifacts}.\nUse a skill openspec-continue-change para criar os artefatos ausentes primeiro.`,
845
+ missingTrackingFile: (filename) => `O arquivo ${filename} está ausente e deve ser criado.\nUse openspec-continue-change para gerar o arquivo de rastreamento.`,
846
+ trackingFileNoTasks: (filename) => `O arquivo ${filename} existe mas não contém tarefas.\nAdicione tarefas a ${filename} ou regenere-o com openspec-continue-change.`,
847
+ allTasksComplete: 'Todas as tarefas estão concluídas! Esta alteração está pronta para ser arquivada.\nConsidere executar testes e revisar as alterações antes de arquivar.',
848
+ allArtifactsCompleteProceed: 'Todos os artefatos necessários estão completos. Prossiga com a implementação.',
849
+ readContextAndWorkTasks: 'Leia os arquivos de contexto, trabalhe nas tarefas pendentes, marque como concluído conforme avança.\nPare se encontrar bloqueios ou precisar de esclarecimentos.',
850
+ applyTitle: (changeName) => `## Aplicar: ${changeName}`,
851
+ schemaLabel: (schemaName) => `Esquema: ${schemaName}`,
852
+ blockedTitle: '### ⚠️ Bloqueado',
853
+ missingArtifactsLabel: (artifacts) => `Artefatos ausentes: ${artifacts}`,
854
+ createMissingFirst: 'Use a skill openspec-continue-change para criá-los primeiro.',
855
+ contextFilesTitle: '### Arquivos de Contexto',
856
+ progressTitle: '### Progresso',
857
+ progressComplete: (complete, total) => `${complete}/${total} concluído`,
858
+ progressCompleteWithCheck: (complete, total) => `${complete}/${total} concluído ✓`,
859
+ tasksTitle: '### Tarefas',
860
+ instructionTitle: '### Instrução',
861
+ // new-change.ts
862
+ missingNameArgument: 'Argumento obrigatório <name> ausente',
863
+ creatingChange: (name, schema) => `Criando alteração '${name}'${schema ? ` com esquema '${schema}'` : ''}...`,
864
+ createdChange: (name, schema) => `Alteração '${name}' criada em openspec/changes/${name}/ (esquema: ${schema})`,
865
+ failedToCreateChange: (name) => `Falha ao criar alteração '${name}'`,
866
+ // schemas.ts
867
+ availableSchemas: 'Esquemas disponíveis:',
868
+ projectLabel: ' (projeto)',
869
+ userOverrideLabel: ' (substituição de usuário)',
870
+ artifactsLabel: (artifacts) => `Artefatos: ${artifacts}`,
871
+ // shared.ts
872
+ noChangesFound: 'Nenhuma alteração encontrada. Crie uma com: openspec new change <nome>',
873
+ missingChangeOption: (available) => `Opção obrigatória --change ausente. Alterações disponíveis:\n ${available}`,
874
+ invalidChangeName: (name, error) => `Nome de alteração inválido '${name}': ${error}`,
875
+ changeNotFoundNoChanges: (name) => `Alteração '${name}' não encontrada. Nenhuma alteração existe. Crie uma com: openspec new change <nome>`,
876
+ changeNotFound: (name, available) => `Alteração '${name}' não encontrada. Alterações disponíveis:\n ${available}`,
877
+ schemaNotFound: (name, available) => available ? `Esquema '${name}' não encontrado. Esquemas disponíveis:\n ${available}` : `Esquema '${name}' não encontrado`,
878
+ schemaReadFailed: (path, err) => `Falha ao ler o esquema em '${path}': ${err}`,
879
+ schemaInvalid: (path, err) => `Esquema inválido em '${path}': ${err}`,
880
+ schemaParseFailed: (path, err) => `Falha ao analisar o esquema em '${path}': ${err}`,
881
+ // status.ts
882
+ loadingChangeStatus: 'Carregando status da alteração...',
883
+ noActiveChanges: 'Nenhuma alteração ativa. Crie uma com: openspec new change <nome>',
884
+ changeLabel: (name) => `Alteração: ${name}`,
885
+ schemaLabel2: (name) => `Esquema: ${name}`,
886
+ progressArtifacts: (done, total) => `Progresso: ${done}/${total} artefatos concluídos`,
887
+ allArtifactsComplete: 'Todos os artefatos concluídos!',
888
+ blockedBy: (deps) => ` (bloqueado por: ${deps})`,
889
+ // templates.ts
890
+ loadingTemplates: 'Carregando templates...',
891
+ schemaLabel3: (name) => `Esquema: ${name}`,
892
+ sourceLabel: (source) => `Fonte: ${source}`,
893
+ };
894
+ // ═══════════════════════════════════════════════════════════
895
+ // Core — Migração (src/core/migration.ts)
896
+ // ═══════════════════════════════════════════════════════════
897
+ export const MIGRATION_MESSAGES = {
898
+ migrated: (count) => `Migrado: perfil customizado com ${count} fluxos de trabalho`,
899
+ newInThisVersion: "Novo nesta versão: /opsx:propose. Experimente 'openspec config profile core' para a experiência simplificada.",
900
+ };
901
+ // ═══════════════════════════════════════════════════════════
902
+ // Core — Limpeza de Legados (src/core/legacy-cleanup.ts)
903
+ // ═══════════════════════════════════════════════════════════
904
+ export const LEGACY_CLEANUP_MESSAGES = {
905
+ failedToModify: (file, error) => `Falha ao modificar ${file}: ${error}`,
906
+ failedToDeleteDir: (dir, error) => `Falha ao excluir diretório ${dir}: ${error}`,
907
+ failedToDeleteFile: (file, error) => `Falha ao excluir ${file}: ${error}`,
908
+ failedToDeleteOpenspecAgents: (error) => `Falha ao excluir openspec/AGENTS.md: ${error}`,
909
+ cleanedUpHeader: 'Arquivos legados limpos:',
910
+ removedFile: (file) => ` ✓ Removido ${file}`,
911
+ removedDir: (dir) => ` ✓ Removido ${dir}/ (substituído por /opsx:*)`,
912
+ removedMarkers: (file) => ` ✓ Marcadores BR-OpenSpec removidos de ${file}`,
913
+ errorsHeader: 'Erros durante a limpeza:',
914
+ errorItem: (error) => ` ⚠ ${error}`,
915
+ explanationReplacedBySkills: 'substituído por skills/',
916
+ explanationReplacedByToolSkills: (toolDir) => `substituído por ${toolDir}/skills/`,
917
+ explanationObsoleteWorkflow: 'arquivo de fluxo de trabalho obsoleto',
918
+ explanationRemovingMarkers: 'removendo marcadores BR-OpenSpec',
919
+ upgradeHeader: 'Atualizando para o novo BR-OpenSpec',
920
+ upgradeLine1: 'O BR-OpenSpec agora usa agent skills, o padrão emergente entre agentes de codificação',
921
+ upgradeLine2: 'Isso simplifica sua configuração enquanto mantém tudo funcionando',
922
+ upgradeLine3: 'como antes.',
923
+ filesToRemoveHeader: 'Arquivos a remover',
924
+ filesToRemoveSubheader: 'Nenhum conteúdo do usuário a preservar:',
925
+ filesToUpdateHeader: 'Arquivos a atualizar',
926
+ filesToUpdateSubheader: 'Os marcadores BR-OpenSpec serão removidos, seu conteúdo será preservado:',
927
+ needsAttention: 'Precisa da sua atenção',
928
+ projectMdItem: ' • openspec/project.md',
929
+ projectMdWontDelete: ' Não excluiremos este arquivo. Ele pode conter contexto útil do projeto.',
930
+ projectMdContextLine1: ' O novo openspec/config.yaml tem uma seção "context:" para contexto',
931
+ projectMdContextLine2: ' de planejamento. Isso é incluído em toda solicitação BR-OpenSpec e funciona mais',
932
+ projectMdContextLine3: ' confiavelmente que a abordagem antiga do project.md.',
933
+ projectMdReviewLine1: ' Revise o project.md, mova qualquer conteúdo útil para a seção context',
934
+ projectMdReviewLine2: ' do config.yaml, depois exclua o arquivo quando estiver pronto.',
935
+ };
936
+ // ═══════════════════════════════════════════════════════════
937
+ // Core — Configuração do Projeto (src/core/project-config.ts)
938
+ // ═══════════════════════════════════════════════════════════
939
+ export const PROJECT_CONFIG_MESSAGES = {
940
+ invalidSchemaField: "Campo 'schema' inválido na configuração (deve ser uma string não vazia)",
941
+ contextTooLarge: (size, limit) => `Contexto muito grande (${size}KB, limite: ${limit}KB)`,
942
+ ignoringContextField: 'Ignorando campo de contexto',
943
+ invalidContextField: "Campo 'context' inválido na configuração (deve ser string)",
944
+ emptyRulesForArtifact: (artifactId) => `Algumas regras para '${artifactId}' são strings vazias, ignorando-as`,
945
+ rulesMustBeArrayOfStrings: (artifactId) => `Regras para '${artifactId}' devem ser um array de strings, ignorando as regras deste artefato`,
946
+ invalidRulesField: "Campo 'rules' inválido na configuração (deve ser um objeto)",
947
+ };
948
+ // ═══════════════════════════════════════════════════════════
949
+ // Templates de Workflow — Nova Change (src/core/templates/workflows/new-change.ts)
950
+ // ═══════════════════════════════════════════════════════════
951
+ export const NEW_CHANGE_TEMPLATE_MESSAGES = {
952
+ skillDescription: 'Inicie uma nova change do BR-OpenSpec usando o workflow experimental de artifacts. Use quando o usuário quiser criar uma nova funcionalidade, correção ou modificação com uma abordagem estruturada passo a passo.',
953
+ skillInstructions: `Inicie uma nova change usando a abordagem experimental orientada a artifacts.
954
+
955
+ **Entrada**: A solicitação do usuário deve incluir um nome de change (kebab-case) OU uma descrição do que ele quer construir.
956
+
957
+ **Passos**
958
+
959
+ 1. **Se nenhuma entrada clara for fornecida, pergunte o que ele quer construir**
960
+
961
+ Use a ferramenta **AskUserQuestion** (aberta, sem opções pré-definidas) para perguntar:
962
+ > "Em qual change você quer trabalhar? Descreva o que quer construir ou corrigir."
963
+
964
+ A partir da descrição dele, derive um nome kebab-case (por exemplo, "adicionar autenticação de usuário" → \`add-user-auth\`).
965
+
966
+ **IMPORTANTE**: NÃO prossiga sem entender o que o usuário quer construir.
967
+
968
+ 2. **Determine o schema de workflow**
969
+
970
+ Use o schema padrão (omitir \`--schema\`) a menos que o usuário solicite explicitamente um workflow diferente.
971
+
972
+ **Use um schema diferente apenas se o usuário mencionar:**
973
+ - Um nome de schema específico → use \`--schema <nome>\`
974
+ - "mostrar workflows" ou "quais workflows" → execute \`openspec schemas --json\` e deixe-o escolher
975
+
976
+ **Caso contrário**: Omita \`--schema\` para usar o padrão.
977
+
978
+ 3. **Crie o diretório da change**
979
+ \`\`\`bash
980
+ openspec new change "<nome>"
981
+ \`\`\`
982
+ Adicione \`--schema <nome>\` apenas se o usuário solicitou um workflow específico.
983
+ Isso cria uma change com scaffold em \`openspec/changes/<nome>/\` com o schema selecionado.
984
+
985
+ 4. **Mostre o status dos artifacts**
986
+ \`\`\`bash
987
+ openspec status --change "<nome>"
988
+ \`\`\`
989
+ Isso mostra quais artifacts precisam ser criados e quais estão prontos (dependências satisfeitas).
990
+
991
+ 5. **Obtenha instruções para o primeiro artifact**
992
+ O primeiro artifact depende do schema (por exemplo, \`proposal\` para spec-driven).
993
+ Verifique a saída do status para encontrar o primeiro artifact com status "ready".
994
+ \`\`\`bash
995
+ openspec instructions <primeiro-artifact-id> --change "<nome>"
996
+ \`\`\`
997
+ Isso produz o template e contexto para criar o primeiro artifact.
998
+
999
+ 6. **PARE e aguarde direção do usuário**
1000
+
1001
+ **Saída**
1002
+
1003
+ Após completar os passos, resuma:
1004
+ - Nome da change e localização
1005
+ - Schema/workflow sendo usado e sua sequência de artifacts
1006
+ - Status atual (0/N artifacts completos)
1007
+ - O template para o primeiro artifact
1008
+ - Prompt: "Pronto para criar o primeiro artifact? Basta descrever do que se trata esta change e eu elaboro um rascunho, ou peça-me para continuar."
1009
+
1010
+ **Guardrails**
1011
+ - NÃO crie nenhum artifact ainda - apenas mostre as instruções
1012
+ - NÃO avance além de mostrar o template do primeiro artifact
1013
+ - Se o nome for inválido (não kebab-case), peça um nome válido
1014
+ - Se uma change com aquele nome já existir, sugira continuar aquela change em vez disso
1015
+ - Passe --schema se estiver usando um workflow não padrão`,
1016
+ skillCompatibility: 'Requer openspec CLI.',
1017
+ opsxDescription: 'Inicie uma nova change usando o workflow experimental de artifacts (OPSX)',
1018
+ opsxContent: `Inicie uma nova change usando a abordagem experimental orientada a artifacts.
1019
+
1020
+ **Entrada**: O argumento após \`/opsx:new\` é o nome da change (kebab-case), OU uma descrição do que o usuário quer construir.
1021
+
1022
+ **Passos**
1023
+
1024
+ 1. **Se nenhuma entrada for fornecida, pergunte o que ele quer construir**
1025
+
1026
+ Use a ferramenta **AskUserQuestion** (aberta, sem opções pré-definidas) para perguntar:
1027
+ > "Em qual change você quer trabalhar? Descreva o que quer construir ou corrigir."
1028
+
1029
+ A partir da descrição dele, derive um nome kebab-case (por exemplo, "adicionar autenticação de usuário" → \`add-user-auth\`).
1030
+
1031
+ **IMPORTANTE**: NÃO prossiga sem entender o que o usuário quer construir.
1032
+
1033
+ 2. **Determine o schema de workflow**
1034
+
1035
+ Use o schema padrão (omitir \`--schema\`) a menos que o usuário solicite explicitamente um workflow diferente.
1036
+
1037
+ **Use um schema diferente apenas se o usuário mencionar:**
1038
+ - Um nome de schema específico → use \`--schema <nome>\`
1039
+ - "mostrar workflows" ou "quais workflows" → execute \`openspec schemas --json\` e deixe-o escolher
1040
+
1041
+ **Caso contrário**: Omita \`--schema\` para usar o padrão.
1042
+
1043
+ 3. **Crie o diretório da change**
1044
+ \`\`\`bash
1045
+ openspec new change "<nome>"
1046
+ \`\`\`
1047
+ Adicione \`--schema <nome>\` apenas se o usuário solicitou um workflow específico.
1048
+ Isso cria uma change com scaffold em \`openspec/changes/<nome>/\` com o schema selecionado.
1049
+
1050
+ 4. **Mostre o status dos artifacts**
1051
+ \`\`\`bash
1052
+ openspec status --change "<nome>"
1053
+ \`\`\`
1054
+ Isso mostra quais artifacts precisam ser criados e quais estão prontos (dependências satisfeitas).
1055
+
1056
+ 5. **Obtenha instruções para o primeiro artifact**
1057
+ O primeiro artifact depende do schema. Verifique a saída do status para encontrar o primeiro artifact com status "ready".
1058
+ \`\`\`bash
1059
+ openspec instructions <primeiro-artifact-id> --change "<nome>"
1060
+ \`\`\`
1061
+ Isso produz o template e contexto para criar o primeiro artifact.
1062
+
1063
+ 6. **PARE e aguarde direção do usuário**
1064
+
1065
+ **Saída**
1066
+
1067
+ Após completar os passos, resuma:
1068
+ - Nome da change e localização
1069
+ - Schema/workflow sendo usado e sua sequência de artifacts
1070
+ - Status atual (0/N artifacts completos)
1071
+ - O template para o primeiro artifact
1072
+ - Prompt: "Pronto para criar o primeiro artifact? Execute \`/opsx:continue\` ou apenas descreva do que se trata esta change e eu elaboro um rascunho."
1073
+
1074
+ **Guardrails**
1075
+ - NÃO crie nenhum artifact ainda - apenas mostre as instruções
1076
+ - NÃO avance além de mostrar o template do primeiro artifact
1077
+ - Se o nome for inválido (não kebab-case), peça um nome válido
1078
+ - Se uma change com aquele nome já existir, sugira usar \`/opsx:continue\` em vez disso
1079
+ - Passe --schema se estiver usando um workflow não padrão`,
1080
+ };
1081
+ // ═══════════════════════════════════════════════════════════
1082
+ // Templates de Workflow — Onboard (src/core/templates/workflows/onboard.ts)
1083
+ // ═══════════════════════════════════════════════════════════
1084
+ export const ONBOARD_TEMPLATE_MESSAGES = {
1085
+ skillDescription: 'Onboarding guiado para o BR-OpenSpec - percorra um ciclo completo de workflow com narração e trabalho real na codebase.',
1086
+ skillCompatibility: 'Requer openspec CLI.',
1087
+ opsxDescription: 'Onboarding guiado - percorra um ciclo completo de workflow do BR-OpenSpec com narração',
1088
+ instructions: `Guie o usuário através de seu primeiro ciclo completo de workflow do BR-OpenSpec. Esta é uma experiência de ensino - você fará trabalho real na codebase dele enquanto explica cada passo.
1089
+
1090
+ ---
1091
+
1092
+ ## Pré-voo
1093
+
1094
+ Antes de começar, verifique se o CLI do BR-OpenSpec está instalado:
1095
+
1096
+ \`\`\`bash
1097
+ # Unix/macOS
1098
+ openspec --version 2>&1 || echo "CLI_NOT_INSTALLED"
1099
+ # Windows (PowerShell)
1100
+ # if (Get-Command openspec -ErrorAction SilentlyContinue) { openspec --version } else { echo "CLI_NOT_INSTALLED" }
1101
+ \`\`\`
1102
+
1103
+ **Se o CLI não estiver instalado:**
1104
+ > O CLI do BR-OpenSpec não está instalado. Instale-o primeiro, depois volte para \`/opsx:onboard\`.
1105
+
1106
+ Pare aqui se não estiver instalado.
1107
+
1108
+ ---
1109
+
1110
+ ## Fase 1: Boas-vindas
1111
+
1112
+ Exiba:
1113
+
1114
+ \`\`\`
1115
+ ## Bem-vindo ao BR-OpenSpec!
1116
+
1117
+ Eu vou te guiar através de um ciclo completo de change - da ideia à implementação - usando uma tarefa real na sua codebase. Ao longo do caminho, você aprenderá o workflow fazendo.
1118
+
1119
+ **O que faremos:**
1120
+ 1. Escolher uma tarefa pequena e real na sua codebase
1121
+ 2. Explorar o problema brevemente
1122
+ 3. Criar uma change (o container para nosso trabalho)
1123
+ 4. Construir os artifacts: proposal → specs → design → tasks
1124
+ 5. Implementar as tarefas
1125
+ 6. Arquivar a change concluída
1126
+
1127
+ **Tempo:** ~15-20 minutos
1128
+
1129
+ Vamos começar encontrando algo para trabalhar.
1130
+ \`\`\`
1131
+
1132
+ ---
1133
+
1134
+ ## Fase 2: Seleção de Tarefa
1135
+
1136
+ ### Análise da Codebase
1137
+
1138
+ Escaneie a codebase em busca de pequenas oportunidades de melhoria. Procure por:
1139
+
1140
+ 1. **Comentários TODO/FIXME** - Pesquise por \`TODO\`, \`FIXME\`, \`HACK\`, \`XXX\` em arquivos de código
1141
+ 2. **Tratamento de erros ausente** - Blocos \`catch\` que engolem erros, operações arriscadas sem try-catch
1142
+ 3. **Funções sem testes** - Relacione \`src/\` com diretórios de teste
1143
+ 4. **Problemas de tipos** - Tipos \`any\` em arquivos TypeScript (\`: any\`, \`as any\`)
1144
+ 5. **Artifacts de debug** - Declarações \`console.log\`, \`console.debug\`, \`debugger\` em código não-debug
1145
+ 6. **Validação ausente** - Handlers de entrada de usuário sem validação
1146
+
1147
+ Verifique também a atividade recente do git:
1148
+ \`\`\`bash
1149
+ # Unix/macOS
1150
+ git log --oneline -10 2>/dev/null || echo "Sem histórico git"
1151
+ # Windows (PowerShell)
1152
+ # git log --oneline -10 2>$null; if ($LASTEXITCODE -ne 0) { echo "Sem histórico git" }
1153
+ \`\`\`
1154
+
1155
+ ### Apresente Sugestões
1156
+
1157
+ A partir da sua análise, apresente 3-4 sugestões específicas:
1158
+
1159
+ \`\`\`
1160
+ ## Sugestões de Tarefas
1161
+
1162
+ Com base no escaneamento da sua codebase, aqui estão algumas boas tarefas iniciais:
1163
+
1164
+ **1. [Tarefa mais promissora]**
1165
+ Local: \`src/caminho/para/arquivo.ts:42\`
1166
+ Escopo: ~1-2 arquivos, ~20-30 linhas
1167
+ Por que é boa: [breve razão]
1168
+
1169
+ **2. [Segunda tarefa]**
1170
+ Local: \`src/outro/arquivo.ts\`
1171
+ Escopo: ~1 arquivo, ~15 linhas
1172
+ Por que é boa: [breve razão]
1173
+
1174
+ **3. [Terceira tarefa]**
1175
+ Local: [local]
1176
+ Escopo: [estimativa]
1177
+ Por que é boa: [breve razão]
1178
+
1179
+ **4. Outra coisa?**
1180
+ Me diga no que você gostaria de trabalhar.
1181
+
1182
+ Qual tarefa te interessa? (Escolha um número ou descreva a sua)
1183
+ \`\`\`
1184
+
1185
+ **Se nada for encontrado:** Volte a perguntar o que o usuário quer construir:
1186
+ > Não encontrei vitórias rápidas óbvias na sua codebase. Qual é algo pequeno que você vem querendo adicionar ou corrigir?
1187
+
1188
+ ### Guardrail de Escopo
1189
+
1190
+ Se o usuário escolher ou descrever algo muito grande (funcionalidade principal, trabalho de vários dias):
1191
+
1192
+ \`\`\`
1193
+ Essa é uma tarefa valiosa, mas provavelmente maior do que o ideal para sua primeira execução do BR-OpenSpec.
1194
+
1195
+ Para aprender o workflow, menor é melhor - permite ver o ciclo completo sem ficar preso em detalhes de implementação.
1196
+
1197
+ **Opções:**
1198
+ 1. **Fatiar menor** - Qual é a menor peça útil de [tarefa dele]? Talvez apenas [fatia específica]?
1199
+ 2. **Escolher outra coisa** - Uma das outras sugestões, ou uma tarefa pequena diferente?
1200
+ 3. **Fazer assim mesmo** - Se você realmente quiser encarar isso, podemos. Só saiba que vai demorar mais.
1201
+
1202
+ O que você prefere?
1203
+ \`\`\`
1204
+
1205
+ Deixe o usuário sobrepor se insistir - este é um guardrail suave.
1206
+
1207
+ ---
1208
+
1209
+ ## Fase 3: Demonstração do Explore
1210
+
1211
+ Uma vez que uma tarefa seja selecionada, demonstre brevemente o modo explore:
1212
+
1213
+ \`\`\`
1214
+ Antes de criarmos uma change, deixe-me rapidamente te mostrar o **modo explore** - é como você pensa sobre problemas antes de se comprometer com uma direção.
1215
+ \`\`\`
1216
+
1217
+ Gaste 1-2 minutos investigando o código relevante:
1218
+ - Leia o(s) arquivo(s) envolvido(s)
1219
+ - Desenhe um diagrama ASCII rápido se ajudar
1220
+ - Note quaisquer considerações
1221
+
1222
+ \`\`\`
1223
+ ## Exploração Rápida
1224
+
1225
+ [Sua breve análise - o que você encontrou, quaisquer considerações]
1226
+
1227
+ ┌─────────────────────────────────────────┐
1228
+ │ [Opcional: diagrama ASCII se útil] │
1229
+ └─────────────────────────────────────────┘
1230
+
1231
+ O modo explore (\`/opsx:explore\`) é para esse tipo de pensamento - investigar antes de implementar. Você pode usá-lo a qualquer momento que precisar pensar sobre um problema.
1232
+
1233
+ Agora vamos criar uma change para conter nosso trabalho.
1234
+ \`\`\`
1235
+
1236
+ **PAUSA** - Aguarde confirmação do usuário antes de prosseguir.
1237
+
1238
+ ---
1239
+
1240
+ ## Fase 4: Criar a Change
1241
+
1242
+ **EXPLIQUE:**
1243
+ \`\`\`
1244
+ ## Criando uma Change
1245
+
1246
+ Uma "change" no BR-OpenSpec é um container para todo o pensamento e planejamento em torno de uma peça de trabalho. Ela fica em \`openspec/changes/<nome>/\` e armazena seus artifacts - proposal, specs, design, tasks.
1247
+
1248
+ Deixe-me criar uma para nossa tarefa.
1249
+ \`\`\`
1250
+
1251
+ **FAÇA:** Crie a change com um nome kebab-case derivado:
1252
+ \`\`\`bash
1253
+ openspec new change "<nome-derivado>"
1254
+ \`\`\`
1255
+
1256
+ **MOSTRE:**
1257
+ \`\`\`
1258
+ Criado: \`openspec/changes/<nome>/\`
1259
+
1260
+ A estrutura de pastas:
1261
+ \`\`\`
1262
+ openspec/changes/<nome>/
1263
+ ├── proposal.md ← Por que estamos fazendo isso (vazio, vamos preencher)
1264
+ ├── design.md ← Como vamos construir (vazio)
1265
+ ├── specs/ ← Requisitos detalhados (vazio)
1266
+ └── tasks.md ← Checklist de implementação (vazio)
1267
+ \`\`\`
1268
+
1269
+ Agora vamos preencher o primeiro artifact - a proposal.
1270
+ \`\`\`
1271
+
1272
+ ---
1273
+
1274
+ ## Fase 5: Proposal
1275
+
1276
+ **EXPLIQUE:**
1277
+ \`\`\`
1278
+ ## A Proposal
1279
+
1280
+ A proposal captura **por que** estamos fazendo esta change e **o que** ela envolve em alto nível. É o "pitch de elevador" para o trabalho.
1281
+
1282
+ Vou elaborar uma com base na nossa tarefa.
1283
+ \`\`\`
1284
+
1285
+ **FAÇA:** Elabore o conteúdo da proposal (ainda não salve):
1286
+
1287
+ \`\`\`
1288
+ Aqui está um rascunho de proposal:
1289
+
1290
+ ---
1291
+
1292
+ ## Por Que
1293
+
1294
+ [1-2 frases explicando o problema/oportunidade]
1295
+
1296
+ ## O Que Muda
1297
+
1298
+ [Bullet points do que será diferente]
1299
+
1300
+ ## Capabilities
1301
+
1302
+ ### Novas Capabilities
1303
+ - \`<nome-capability>\`: [breve descrição]
1304
+
1305
+ ### Capabilities Modificadas
1306
+ <!-- Se modificar comportamento existente -->
1307
+
1308
+ ## Impacto
1309
+
1310
+ - \`src/caminho/para/arquivo.ts\`: [o que muda]
1311
+ - [outros arquivos se aplicável]
1312
+
1313
+ ---
1314
+
1315
+ Isso captura a intenção? Posso ajustar antes de salvá-la.
1316
+ \`\`\`
1317
+
1318
+ **PAUSA** - Aguarde aprovação/feedback do usuário.
1319
+
1320
+ Após aprovação, salve a proposal:
1321
+ \`\`\`bash
1322
+ openspec instructions proposal --change "<nome>" --json
1323
+ \`\`\`
1324
+ Depois escreva o conteúdo em \`openspec/changes/<nome>/proposal.md\`.
1325
+
1326
+ \`\`\`
1327
+ Proposal salva. Este é seu documento de "por que" - você sempre pode voltar e refiná-lo à medida que o entendimento evolui.
1328
+
1329
+ Próximo: specs.
1330
+ \`\`\`
1331
+
1332
+ ---
1333
+
1334
+ ## Fase 6: Specs
1335
+
1336
+ **EXPLIQUE:**
1337
+ \`\`\`
1338
+ ## Specs
1339
+
1340
+ Os specs definem **o que** estamos construindo em termos precisos e testáveis. Eles usam um formato de requisito/cenário que torna o comportamento esperado cristalino.
1341
+
1342
+ Para uma tarefa pequena como esta, talvez precisemos apenas de um arquivo spec.
1343
+ \`\`\`
1344
+
1345
+ **FAÇA:** Crie o arquivo spec:
1346
+ \`\`\`bash
1347
+ # Unix/macOS
1348
+ mkdir -p openspec/changes/<nome>/specs/<nome-capability>
1349
+ # Windows (PowerShell)
1350
+ # New-Item -ItemType Directory -Force -Path "openspec/changes/<nome>/specs/<nome-capability>"
1351
+ \`\`\`
1352
+
1353
+ Elabore o conteúdo do spec:
1354
+
1355
+ \`\`\`
1356
+ Aqui está o spec:
1357
+
1358
+ ---
1359
+
1360
+ ## Requisitos ADICIONADOS
1361
+
1362
+ ### Requisito: <Nome>
1363
+
1364
+ <Descrição do que o sistema deve fazer>
1365
+
1366
+ #### Cenário: <Nome do cenário>
1367
+
1368
+ - **QUANDO** <condição de gatilho>
1369
+ - **ENTÃO** <resultado esperado>
1370
+ - **E** <resultado adicional se necessário>
1371
+
1372
+ ---
1373
+
1374
+ Este formato - QUANDO/ENTÃO/E - torna os requisitos testáveis. Você pode literalmente lê-los como casos de teste.
1375
+ \`\`\`
1376
+
1377
+ Salve em \`openspec/changes/<nome>/specs/<capability>/spec.md\`.
1378
+
1379
+ ---
1380
+
1381
+ ## Fase 7: Design
1382
+
1383
+ **EXPLIQUE:**
1384
+ \`\`\`
1385
+ ## Design
1386
+
1387
+ O design captura **como** vamos construir - decisões técnicas, tradeoffs, abordagem.
1388
+
1389
+ Para changes pequenas, isto pode ser breve. Tudo bem - nem toda change precisa de discussão profunda de design.
1390
+ \`\`\`
1391
+
1392
+ **FAÇA:** Elabore design.md:
1393
+
1394
+ \`\`\`
1395
+ Aqui está o design:
1396
+
1397
+ ---
1398
+
1399
+ ## Contexto
1400
+
1401
+ [Contexto breve sobre o estado atual]
1402
+
1403
+ ## Objetivos / Não-Objetivos
1404
+
1405
+ **Objetivos:**
1406
+ - [O que estamos tentando alcançar]
1407
+
1408
+ **Não-Objetivos:**
1409
+ - [O que está explicitamente fora do escopo]
1410
+
1411
+ ## Decisões
1412
+
1413
+ ### Decisão 1: [Decisão-chave]
1414
+
1415
+ [Explicação da abordagem e racional]
1416
+
1417
+ ---
1418
+
1419
+ Para uma tarefa pequena, isto captura as decisões-chave sem over-engineering.
1420
+ \`\`\`
1421
+
1422
+ Salve em \`openspec/changes/<nome>/design.md\`.
1423
+
1424
+ ---
1425
+
1426
+ ## Fase 8: Tasks
1427
+
1428
+ **EXPLIQUE:**
1429
+ \`\`\`
1430
+ ## Tasks
1431
+
1432
+ Finalmente, quebramos o trabalho em tarefas de implementação - checkboxes que impulsionam a fase de apply.
1433
+
1434
+ Elas devem ser pequenas, claras e em ordem lógica.
1435
+ \`\`\`
1436
+
1437
+ **FAÇA:** Gere tarefas baseadas nos specs e design:
1438
+
1439
+ \`\`\`
1440
+ Aqui estão as tarefas de implementação:
1441
+
1442
+ ---
1443
+
1444
+ ## 1. [Categoria ou arquivo]
1445
+
1446
+ - [ ] 1.1 [Tarefa específica]
1447
+ - [ ] 1.2 [Tarefa específica]
1448
+
1449
+ ## 2. Verificar
1450
+
1451
+ - [ ] 2.1 [Etapa de verificação]
1452
+
1453
+ ---
1454
+
1455
+ Cada checkbox se torna uma unidade de trabalho na fase de apply. Pronto para implementar?
1456
+ \`\`\`
1457
+
1458
+ **PAUSA** - Aguarde o usuário confirmar que está pronto para implementar.
1459
+
1460
+ Salve em \`openspec/changes/<nome>/tasks.md\`.
1461
+
1462
+ ---
1463
+
1464
+ ## Fase 9: Apply (Implementação)
1465
+
1466
+ **EXPLIQUE:**
1467
+ \`\`\`
1468
+ ## Implementação
1469
+
1470
+ Agora implementamos cada tarefa, marcando-as à medida que avançamos. Anunciarei cada uma e ocasionalmente notarei como os specs/design informaram a abordagem.
1471
+ \`\`\`
1472
+
1473
+ **FAÇA:** Para cada tarefa:
1474
+
1475
+ 1. Anuncie: "Trabalhando na tarefa N: [descrição]"
1476
+ 2. Implemente a mudança na codebase
1477
+ 3. Referencie specs/design naturalmente: "O spec diz X, então estou fazendo Y"
1478
+ 4. Marque como concluída em tasks.md: \`- [ ]\` → \`- [x]\`
1479
+ 5. Breve status: "✓ Tarefa N concluída"
1480
+
1481
+ Mantenha a narração leve - não explique cada linha de código.
1482
+
1483
+ Após todas as tarefas:
1484
+
1485
+ \`\`\`
1486
+ ## Implementação Concluída
1487
+
1488
+ Todas as tarefas concluídas:
1489
+ - [x] Tarefa 1
1490
+ - [x] Tarefa 2
1491
+ - [x] ...
1492
+
1493
+ A change está implementada! Mais um passo - vamos arquivá-la.
1494
+ \`\`\`
1495
+
1496
+ ---
1497
+
1498
+ ## Fase 10: Archive
1499
+
1500
+ **EXPLIQUE:**
1501
+ \`\`\`
1502
+ ## Arquivamento
1503
+
1504
+ Quando uma change está completa, nós a arquivamos. Isso a move de \`openspec/changes/\` para \`openspec/changes/archive/YYYY-MM-DD-<nome>/\`.
1505
+
1506
+ As changes arquivadas se tornam o histórico de decisões do seu projeto - você sempre pode encontrá-las depois para entender por que algo foi construído de certa forma.
1507
+ \`\`\`
1508
+
1509
+ **FAÇA:**
1510
+ \`\`\`bash
1511
+ openspec archive "<nome>"
1512
+ \`\`\`
1513
+
1514
+ **MOSTRE:**
1515
+ \`\`\`
1516
+ Arquivado em: \`openspec/changes/archive/YYYY-MM-DD-<nome>/\`
1517
+
1518
+ A change agora faz parte do histórico do seu projeto. O código está na sua codebase, o registro de decisão está preservado.
1519
+ \`\`\`
1520
+
1521
+ ---
1522
+
1523
+ ## Fase 11: Recapitulação e Próximos Passos
1524
+
1525
+ \`\`\`
1526
+ ## Parabéns!
1527
+
1528
+ Você acabou de completar um ciclo completo do BR-OpenSpec:
1529
+
1530
+ 1. **Explore** - Pensou sobre o problema
1531
+ 2. **New** - Criou um container de change
1532
+ 3. **Proposal** - Capturou POR QUE
1533
+ 4. **Specs** - Definiu O QUE em detalhes
1534
+ 5. **Design** - Decidiu COMO
1535
+ 6. **Tasks** - Quebrou em passos
1536
+ 7. **Apply** - Implementou o trabalho
1537
+ 8. **Archive** - Preservou o registro
1538
+
1539
+ Este mesmo ritmo funciona para qualquer tamanho de change - uma pequena correção ou uma funcionalidade principal.
1540
+
1541
+ ---
1542
+
1543
+ ## Referência de Comandos
1544
+
1545
+ **Workflow principal:**
1546
+
1547
+ | Comando | O que faz |
1548
+ |-------------------|---------------------------------------------|
1549
+ | \`/opsx:propose\` | Cria uma change e gera todos os artifacts |
1550
+ | \`/opsx:explore\` | Pensa sobre problemas antes/durante o trabalho |
1551
+ | \`/opsx:apply\` | Implementa tarefas de uma change |
1552
+ | \`/opsx:archive\` | Arquiva uma change concluída |
1553
+
1554
+ **Comandos adicionais:**
1555
+
1556
+ | Comando | O que faz |
1557
+ |--------------------|--------------------------------------------------------|
1558
+ | \`/opsx:new\` | Inicia uma nova change, passo a passo pelos artifacts |
1559
+ | \`/opsx:continue\` | Continua trabalhando em uma change existente |
1560
+ | \`/opsx:ff\` | Fast-forward: cria todos os artifacts de uma vez |
1561
+ | \`/opsx:verify\` | Verifica se implementação corresponde aos artifacts |
1562
+
1563
+ ---
1564
+
1565
+ ## E Agora?
1566
+
1567
+ Experimente \`/opsx:propose\` em algo que você realmente quer construir. Você já pegou o ritmo!
1568
+ \`\`\`
1569
+
1570
+ ---
1571
+
1572
+ ## Tratamento de Saída Graciosa
1573
+
1574
+ ### Usuário quer parar no meio do caminho
1575
+
1576
+ Se o usuário disser que precisa parar, quer pausar, ou parecer desengajado:
1577
+
1578
+ \`\`\`
1579
+ Sem problema! Sua change está salva em \`openspec/changes/<nome>/\`.
1580
+
1581
+ Para retomar de onde paramos depois:
1582
+ - \`/opsx:continue <nome>\` - Retoma a criação de artifacts
1583
+ - \`/opsx:apply <nome>\` - Pula para implementação (se tasks existirem)
1584
+
1585
+ O trabalho não será perdido. Volte quando estiver pronto.
1586
+ \`\`\`
1587
+
1588
+ Saia graciosamente sem pressão.
1589
+
1590
+ ### Usuário apenas quer a referência de comandos
1591
+
1592
+ Se o usuário disser que apenas quer ver os comandos ou pular o tutorial:
1593
+
1594
+ \`\`\`
1595
+ ## Referência Rápida do BR-OpenSpec
1596
+
1597
+ **Workflow principal:**
1598
+
1599
+ | Comando | O que faz |
1600
+ |--------------------------|---------------------------------------------|
1601
+ | \`/opsx:propose <nome>\` | Cria uma change e gera todos os artifacts |
1602
+ | \`/opsx:explore\` | Pensa sobre problemas (sem mudanças de código) |
1603
+ | \`/opsx:apply <nome>\` | Implementa tarefas |
1604
+ | \`/opsx:archive <nome>\` | Arquiva quando concluído |
1605
+
1606
+ **Comandos adicionais:**
1607
+
1608
+ | Comando | O que faz |
1609
+ |---------------------------|----------------------------------|
1610
+ | \`/opsx:new <nome>\` | Inicia uma nova change, passo a passo |
1611
+ | \`/opsx:continue <nome>\` | Continua uma change existente |
1612
+ | \`/opsx:ff <nome>\` | Fast-forward: todos os artifacts de uma vez |
1613
+ | \`/opsx:verify <nome>\` | Verifica implementação |
1614
+
1615
+ Experimente \`/opsx:propose\` para iniciar sua primeira change.
1616
+ \`\`\`
1617
+
1618
+ Saia graciosamente.
1619
+
1620
+ ---
1621
+
1622
+ ## Guardrails
1623
+
1624
+ - **Siga o padrão EXPLICAR → FAZER → MOSTRAR → PAUSA** nas transições-chave (após explore, após rascunho de proposal, após tasks, após archive)
1625
+ - **Mantenha a narração leve** durante a implementação - ensine sem pregar
1626
+ - **Não pule fases** mesmo se a change for pequena - o objetivo é ensinar o workflow
1627
+ - **Pause para confirmação** nos pontos marcados, mas não exagere nas pausas
1628
+ - **Trate saídas graciosamente** - nunca pressione o usuário a continuar
1629
+ - **Use tarefas reais da codebase** - não simule ou use exemplos falsos
1630
+ - **Ajuste o escopo gentilmente** - guie para tarefas menores mas respeite a escolha do usuário`,
1631
+ };
1632
+ // ═══════════════════════════════════════════════════════════
1633
+ // Templates de Workflow — Verificar Change (src/core/templates/workflows/verify-change.ts)
1634
+ // ═══════════════════════════════════════════════════════════
1635
+ export const VERIFY_CHANGE_TEMPLATE_MESSAGES = {
1636
+ skillDescription: 'Verifica se a implementação corresponde aos artifacts da change. Use quando o usuário quiser validar que a implementação está completa, correta e coerente antes de arquivar.',
1637
+ skillCompatibility: 'Requer openspec CLI.',
1638
+ opsxDescription: 'Verifica se a implementação corresponde aos artifacts da change antes de arquivar',
1639
+ skillInstructions: `Verifica se uma implementação corresponde aos artifacts da change (specs, tasks, design).
1640
+
1641
+ **Entrada**: Opcionalmente especifique um nome de change. Se omitido, verifique se pode ser inferido do contexto da conversa. Se vago ou ambíguo, você DEVE solicitar as changes disponíveis.
1642
+
1643
+ **Passos**
1644
+
1645
+ 1. **Se nenhum nome de change for fornecido, solicite a seleção**
1646
+
1647
+ Execute \`openspec list --json\` para obter as changes disponíveis. Use a ferramenta **AskUserQuestion** para permitir que o usuário selecione.
1648
+
1649
+ Mostre as changes que possuem tarefas de implementação (o artifact tasks existe).
1650
+ Inclua o schema usado para cada change, se disponível.
1651
+ Marque as changes com tarefas incompletas como "(Em Progresso)".
1652
+
1653
+ **IMPORTANTE**: NÃO adivinhe ou selecione automaticamente uma change. Sempre deixe o usuário escolher.
1654
+
1655
+ 2. **Verifique o status para entender o schema**
1656
+ \`\`\`bash
1657
+ openspec status --change "<nome>" --json
1658
+ \`\`\`
1659
+ Analise o JSON para entender:
1660
+ - \`schemaName\`: O workflow sendo usado (por exemplo, "spec-driven")
1661
+ - Quais artifacts existem para esta change
1662
+
1663
+ 3. **Obtenha o diretório da change e carregue os artifacts**
1664
+
1665
+ \`\`\`bash
1666
+ openspec instructions apply --change "<nome>" --json
1667
+ \`\`\`
1668
+
1669
+ Isso retorna o diretório da change e \`contextFiles\` (artifact ID -> array de caminhos de arquivos concretos). Leia todos os artifacts disponíveis de \`contextFiles\`.
1670
+
1671
+ 4. **Inicialize a estrutura do relatório de verificação**
1672
+
1673
+ Crie uma estrutura de relatório com três dimensões:
1674
+ - **Completeness**: Acompanhe tasks e cobertura de specs
1675
+ - **Correctness**: Acompanhe implementação de requisitos e cobertura de cenários
1676
+ - **Coherence**: Acompanhe aderência ao design e consistência de padrões
1677
+
1678
+ Cada dimensão pode ter issues CRITICAL, WARNING ou SUGGESTION.
1679
+
1680
+ 5. **Verifique Completeness**
1681
+
1682
+ **Conclusão de Tasks**:
1683
+ - Se \`contextFiles.tasks\` existir, leia cada caminho de arquivo nele
1684
+ - Analise checkboxes: \`- [ ]\` (incompleto) vs \`- [x]\` (concluído)
1685
+ - Conte tasks concluídas vs total
1686
+ - Se houver tasks incompletas:
1687
+ - Adicione issue CRITICAL para cada task incompleta
1688
+ - Recomendação: "Complete task: <descrição>" ou "Mark as done if already implemented"
1689
+
1690
+ **Cobertura de Specs**:
1691
+ - Se delta specs existirem em \`openspec/changes/<nome>/specs/\`:
1692
+ - Extraia todos os requisitos (marcados com "### Requirement:")
1693
+ - Para cada requisito:
1694
+ - Procure no codebase por palavras-chave relacionadas ao requisito
1695
+ - Avalie se a implementação provavelmente existe
1696
+ - Se requisitos parecerem não implementados:
1697
+ - Adicione issue CRITICAL: "Requirement not found: <nome do requisito>"
1698
+ - Recomendação: "Implement requirement X: <descrição>"
1699
+
1700
+ 6. **Verifique Correctness**
1701
+
1702
+ **Mapeamento de Implementação de Requisitos**:
1703
+ - Para cada requisito dos delta specs:
1704
+ - Procure no codebase por evidências de implementação
1705
+ - Se encontrado, anote os caminhos de arquivo e intervalos de linha
1706
+ - Avalie se a implementação corresponde à intenção do requisito
1707
+ - Se divergência for detectada:
1708
+ - Adicione WARNING: "Implementation may diverge from spec: <detalhes>"
1709
+ - Recomendação: "Review <arquivo>:<linhas> contra requirement X"
1710
+
1711
+ **Cobertura de Cenários**:
1712
+ - Para cada cenário nos delta specs (marcado com "#### Scenario:"):
1713
+ - Verifique se as condições são tratadas no código
1714
+ - Verifique se existem testes cobrindo o cenário
1715
+ - Se o cenário parecer não coberto:
1716
+ - Adicione WARNING: "Scenario not covered: <nome do cenário>"
1717
+ - Recomendação: "Add test or implementation for scenario: <descrição>"
1718
+
1719
+ 7. **Verifique Coherence**
1720
+
1721
+ **Aderência ao Design**:
1722
+ - Se \`contextFiles.design\` existir:
1723
+ - Extraia decisões-chave (procure por seções como "Decision:", "Approach:", "Architecture:")
1724
+ - Verifique se a implementação segue essas decisões
1725
+ - Se contradição for detectada:
1726
+ - Adicione WARNING: "Design decision not followed: <decisão>"
1727
+ - Recomendação: "Update implementation or revise design.md to match reality"
1728
+ - Se não houver design.md: Pule a verificação de aderência ao design, anote "No design.md to verify against"
1729
+
1730
+ **Consistência de Padrões de Código**:
1731
+ - Revise o novo código quanto à consistência com os padrões do projeto
1732
+ - Verifique nomenclatura de arquivos, estrutura de diretórios, estilo de código
1733
+ - Se houver desvios significativos:
1734
+ - Adicione SUGGESTION: "Code pattern deviation: <detalhes>"
1735
+ - Recomendação: "Consider following project pattern: <exemplo>"
1736
+
1737
+ 8. **Gere o Relatório de Verificação**
1738
+
1739
+ **Scorecard de Resumo**:
1740
+ \`\`\`
1741
+ ## Verification Report: <nome-change>
1742
+
1743
+ ### Summary
1744
+ | Dimension | Status |
1745
+ |--------------|------------------|
1746
+ | Completeness | X/Y tasks, N reqs|
1747
+ | Correctness | M/N reqs covered |
1748
+ | Coherence | Followed/Issues |
1749
+ \`\`\`
1750
+
1751
+ **Issues por Prioridade**:
1752
+
1753
+ 1. **CRITICAL** (Deve corrigir antes de arquivar):
1754
+ - Tasks incompletas
1755
+ - Implementações de requisitos ausentes
1756
+ - Cada uma com recomendação específica e acionável
1757
+
1758
+ 2. **WARNING** (Deveria corrigir):
1759
+ - Divergências de spec/design
1760
+ - Cobertura de cenário ausente
1761
+ - Cada uma com recomendação específica
1762
+
1763
+ 3. **SUGGESTION** (Bom corrigir):
1764
+ - Inconsistências de padrão
1765
+ - Melhorias menores
1766
+ - Cada uma com recomendação específica
1767
+
1768
+ **Avaliação Final**:
1769
+ - Se houver issues CRITICAL: "X critical issue(s) found. Fix before archiving."
1770
+ - Se houver apenas warnings: "No critical issues. Y warning(s) to consider. Ready for archive (with noted improvements)."
1771
+ - Se tudo estiver claro: "All checks passed. Ready for archive."
1772
+
1773
+ **Heurísticas de Verificação**
1774
+
1775
+ - **Completeness**: Foque em itens de checklist objetivos (checkboxes, lista de requisitos)
1776
+ - **Correctness**: Use busca por palavras-chave, análise de caminhos de arquivo, inferência razoável — não exija certeza perfeita
1777
+ - **Coherence**: Procure inconsistências gritantes, não seja meticuloso com estilo
1778
+ - **False Positives**: Quando incerto, prefira SUGGESTION ao invés de WARNING, WARNING ao invés de CRITICAL
1779
+ - **Actionability**: Cada issue deve ter uma recomendação específica com referências de arquivo/linha quando aplicável
1780
+
1781
+ **Degradação Graciosa**
1782
+
1783
+ - Se apenas tasks.md existir: verifique apenas a conclusão de tasks, pule verificações de spec/design
1784
+ - Se tasks + specs existirem: verifique completeness e correctness, pule design
1785
+ - Se todos os artifacts existirem: verifique as três dimensões
1786
+ - Sempre anote quais verificações foram puladas e por quê
1787
+
1788
+ **Formato de Saída**
1789
+
1790
+ Use markdown claro com:
1791
+ - Tabela para scorecard de resumo
1792
+ - Listas agrupadas para issues (CRITICAL/WARNING/SUGGESTION)
1793
+ - Referências de código no formato: \`arquivo.ts:123\`
1794
+ - Recomendações específicas e acionáveis
1795
+ - Sem sugestões vagas como "consider reviewing"`,
1796
+ opsxContent: `Verifica se uma implementação corresponde aos artifacts da change (specs, tasks, design).
1797
+
1798
+ **Entrada**: Opcionalmente especifique um nome de change após \`/opsx:verify\` (por exemplo, \`/opsx:verify add-auth\`). Se omitido, verifique se pode ser inferido do contexto da conversa. Se vago ou ambíguo, você DEVE solicitar as changes disponíveis.
1799
+
1800
+ **Passos**
1801
+
1802
+ 1. **Se nenhum nome de change for fornecido, solicite a seleção**
1803
+
1804
+ Execute \`openspec list --json\` para obter as changes disponíveis. Use a ferramenta **AskUserQuestion** para permitir que o usuário selecione.
1805
+
1806
+ Mostre as changes que possuem tarefas de implementação (o artifact tasks existe).
1807
+ Inclua o schema usado para cada change, se disponível.
1808
+ Marque as changes com tarefas incompletas como "(Em Progresso)".
1809
+
1810
+ **IMPORTANTE**: NÃO adivinhe ou selecione automaticamente uma change. Sempre deixe o usuário escolher.
1811
+
1812
+ 2. **Verifique o status para entender o schema**
1813
+ \`\`\`bash
1814
+ openspec status --change "<nome>" --json
1815
+ \`\`\`
1816
+ Analise o JSON para entender:
1817
+ - \`schemaName\`: O workflow sendo usado (por exemplo, "spec-driven")
1818
+ - Quais artifacts existem para esta change
1819
+
1820
+ 3. **Obtenha o diretório da change e carregue os artifacts**
1821
+
1822
+ \`\`\`bash
1823
+ openspec instructions apply --change "<nome>" --json
1824
+ \`\`\`
1825
+
1826
+ Isso retorna o diretório da change e \`contextFiles\` (artifact ID -> array de caminhos de arquivos concretos). Leia todos os artifacts disponíveis de \`contextFiles\`.
1827
+
1828
+ 4. **Inicialize a estrutura do relatório de verificação**
1829
+
1830
+ Crie uma estrutura de relatório com três dimensões:
1831
+ - **Completeness**: Acompanhe tasks e cobertura de specs
1832
+ - **Correctness**: Acompanhe implementação de requisitos e cobertura de cenários
1833
+ - **Coherence**: Acompanhe aderência ao design e consistência de padrões
1834
+
1835
+ Cada dimensão pode ter issues CRITICAL, WARNING ou SUGGESTION.
1836
+
1837
+ 5. **Verifique Completeness**
1838
+
1839
+ **Conclusão de Tasks**:
1840
+ - Se \`contextFiles.tasks\` existir, leia cada caminho de arquivo nele
1841
+ - Analise checkboxes: \`- [ ]\` (incompleto) vs \`- [x]\` (concluído)
1842
+ - Conte tasks concluídas vs total
1843
+ - Se houver tasks incompletas:
1844
+ - Adicione issue CRITICAL para cada task incompleta
1845
+ - Recomendação: "Complete task: <descrição>" ou "Mark as done if already implemented"
1846
+
1847
+ **Cobertura de Specs**:
1848
+ - Se delta specs existirem em \`openspec/changes/<nome>/specs/\`:
1849
+ - Extraia todos os requisitos (marcados com "### Requirement:")
1850
+ - Para cada requisito:
1851
+ - Procure no codebase por palavras-chave relacionadas ao requisito
1852
+ - Avalie se a implementação provavelmente existe
1853
+ - Se requisitos parecerem não implementados:
1854
+ - Adicione issue CRITICAL: "Requirement not found: <nome do requisito>"
1855
+ - Recomendação: "Implement requirement X: <descrição>"
1856
+
1857
+ 6. **Verifique Correctness**
1858
+
1859
+ **Mapeamento de Implementação de Requisitos**:
1860
+ - Para cada requisito dos delta specs:
1861
+ - Procure no codebase por evidências de implementação
1862
+ - Se encontrado, anote os caminhos de arquivo e intervalos de linha
1863
+ - Avalie se a implementação corresponde à intenção do requisito
1864
+ - Se divergência for detectada:
1865
+ - Adicione WARNING: "Implementation may diverge from spec: <detalhes>"
1866
+ - Recomendação: "Review <arquivo>:<linhas> contra requirement X"
1867
+
1868
+ **Cobertura de Cenários**:
1869
+ - Para cada cenário nos delta specs (marcado com "#### Scenario:"):
1870
+ - Verifique se as condições são tratadas no código
1871
+ - Verifique se existem testes cobrindo o cenário
1872
+ - Se o cenário parecer não coberto:
1873
+ - Adicione WARNING: "Scenario not covered: <nome do cenário>"
1874
+ - Recomendação: "Add test or implementation for scenario: <descrição>"
1875
+
1876
+ 7. **Verifique Coherence**
1877
+
1878
+ **Aderência ao Design**:
1879
+ - Se \`contextFiles.design\` existir:
1880
+ - Extraia decisões-chave (procure por seções como "Decision:", "Approach:", "Architecture:")
1881
+ - Verifique se a implementação segue essas decisões
1882
+ - Se contradição for detectada:
1883
+ - Adicione WARNING: "Design decision not followed: <decisão>"
1884
+ - Recomendação: "Update implementation or revise design.md to match reality"
1885
+ - Se não houver design.md: Pule a verificação de aderência ao design, anote "No design.md to verify against"
1886
+
1887
+ **Consistência de Padrões de Código**:
1888
+ - Revise o novo código quanto à consistência com os padrões do projeto
1889
+ - Verifique nomenclatura de arquivos, estrutura de diretórios, estilo de código
1890
+ - Se houver desvios significativos:
1891
+ - Adicione SUGGESTION: "Code pattern deviation: <detalhes>"
1892
+ - Recomendação: "Consider following project pattern: <exemplo>"
1893
+
1894
+ 8. **Gere o Relatório de Verificação**
1895
+
1896
+ **Scorecard de Resumo**:
1897
+ \`\`\`
1898
+ ## Verification Report: <nome-change>
1899
+
1900
+ ### Summary
1901
+ | Dimension | Status |
1902
+ |--------------|------------------|
1903
+ | Completeness | X/Y tasks, N reqs|
1904
+ | Correctness | M/N reqs covered |
1905
+ | Coherence | Followed/Issues |
1906
+ \`\`\`
1907
+
1908
+ **Issues por Prioridade**:
1909
+
1910
+ 1. **CRITICAL** (Deve corrigir antes de arquivar):
1911
+ - Tasks incompletas
1912
+ - Implementações de requisitos ausentes
1913
+ - Cada uma com recomendação específica e acionável
1914
+
1915
+ 2. **WARNING** (Deveria corrigir):
1916
+ - Divergências de spec/design
1917
+ - Cobertura de cenário ausente
1918
+ - Cada uma com recomendação específica
1919
+
1920
+ 3. **SUGGESTION** (Bom corrigir):
1921
+ - Inconsistências de padrão
1922
+ - Melhorias menores
1923
+ - Cada uma com recomendação específica
1924
+
1925
+ **Avaliação Final**:
1926
+ - Se houver issues CRITICAL: "X critical issue(s) found. Fix before archiving."
1927
+ - Se houver apenas warnings: "No critical issues. Y warning(s) to consider. Ready for archive (with noted improvements)."
1928
+ - Se tudo estiver claro: "All checks passed. Ready for archive."
1929
+
1930
+ **Heurísticas de Verificação**
1931
+
1932
+ - **Completeness**: Foque em itens de checklist objetivos (checkboxes, lista de requisitos)
1933
+ - **Correctness**: Use busca por palavras-chave, análise de caminhos de arquivo, inferência razoável — não exija certeza perfeita
1934
+ - **Coherence**: Procure inconsistências gritantes, não seja meticuloso com estilo
1935
+ - **False Positives**: Quando incerto, prefira SUGGESTION ao invés de WARNING, WARNING ao invés de CRITICAL
1936
+ - **Actionability**: Cada issue deve ter uma recomendação específica com referências de arquivo/linha quando aplicável
1937
+
1938
+ **Degradação Graciosa**
1939
+
1940
+ - Se apenas tasks.md existir: verifique apenas a conclusão de tasks, pule verificações de spec/design
1941
+ - Se tasks + specs existirem: verifique completeness e correctness, pule design
1942
+ - Se todos os artifacts existirem: verifique as três dimensões
1943
+ - Sempre anote quais verificações foram puladas e por quê
1944
+
1945
+ **Formato de Saída**
1946
+
1947
+ Use markdown claro com:
1948
+ - Tabela para scorecard de resumo
1949
+ - Listas agrupadas para issues (CRITICAL/WARNING/SUGGESTION)
1950
+ - Referências de código no formato: \`arquivo.ts:123\`
1951
+ - Recomendações específicas e acionáveis
1952
+ - Sem sugestões vagas como "consider reviewing"`,
1953
+ };
1954
+ // ═══════════════════════════════════════════════════════════
1955
+ // Telemetry (src/telemetry/index.ts)
1956
+ // ═══════════════════════════════════════════════════════════
1957
+ export const TELEMETRY_MESSAGES = {
1958
+ firstRunNotice: 'Aviso: o BR-OpenSpec coleta estatísticas de uso anônimas. Para optar por não participar, defina OPENSPEC_TELEMETRY=0',
1959
+ };
1960
+ //# sourceMappingURL=index.js.map