@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.
- package/LICENSE +22 -0
- package/README.md +210 -0
- package/README.pt-BR.md +212 -0
- package/bin/openspec.js +3 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +484 -0
- package/dist/commands/change.d.ts +35 -0
- package/dist/commands/change.js +278 -0
- package/dist/commands/completion.d.ts +72 -0
- package/dist/commands/completion.js +258 -0
- package/dist/commands/config.d.ts +36 -0
- package/dist/commands/config.js +553 -0
- package/dist/commands/feedback.d.ts +9 -0
- package/dist/commands/feedback.js +184 -0
- package/dist/commands/schema.d.ts +6 -0
- package/dist/commands/schema.js +869 -0
- package/dist/commands/show.d.ts +14 -0
- package/dist/commands/show.js +133 -0
- package/dist/commands/spec.d.ts +15 -0
- package/dist/commands/spec.js +226 -0
- package/dist/commands/tools.d.ts +11 -0
- package/dist/commands/tools.js +252 -0
- package/dist/commands/validate.d.ts +24 -0
- package/dist/commands/validate.js +295 -0
- package/dist/commands/workflow/index.d.ts +17 -0
- package/dist/commands/workflow/index.js +12 -0
- package/dist/commands/workflow/instructions.d.ts +29 -0
- package/dist/commands/workflow/instructions.js +328 -0
- package/dist/commands/workflow/new-change.d.ts +11 -0
- package/dist/commands/workflow/new-change.js +44 -0
- package/dist/commands/workflow/schemas.d.ts +10 -0
- package/dist/commands/workflow/schemas.js +35 -0
- package/dist/commands/workflow/shared.d.ts +57 -0
- package/dist/commands/workflow/shared.js +117 -0
- package/dist/commands/workflow/status.d.ts +14 -0
- package/dist/commands/workflow/status.js +76 -0
- package/dist/commands/workflow/templates.d.ts +16 -0
- package/dist/commands/workflow/templates.js +70 -0
- package/dist/core/archive.d.ts +11 -0
- package/dist/core/archive.js +322 -0
- package/dist/core/artifact-graph/graph.d.ts +56 -0
- package/dist/core/artifact-graph/graph.js +141 -0
- package/dist/core/artifact-graph/index.d.ts +8 -0
- package/dist/core/artifact-graph/index.js +14 -0
- package/dist/core/artifact-graph/instruction-loader.d.ts +143 -0
- package/dist/core/artifact-graph/instruction-loader.js +217 -0
- package/dist/core/artifact-graph/outputs.d.ts +14 -0
- package/dist/core/artifact-graph/outputs.js +39 -0
- package/dist/core/artifact-graph/resolver.d.ts +81 -0
- package/dist/core/artifact-graph/resolver.js +258 -0
- package/dist/core/artifact-graph/schema.d.ts +13 -0
- package/dist/core/artifact-graph/schema.js +108 -0
- package/dist/core/artifact-graph/state.d.ts +12 -0
- package/dist/core/artifact-graph/state.js +31 -0
- package/dist/core/artifact-graph/types.d.ts +45 -0
- package/dist/core/artifact-graph/types.js +43 -0
- package/dist/core/available-tools.d.ts +17 -0
- package/dist/core/available-tools.js +43 -0
- package/dist/core/command-generation/adapters/amazon-q.d.ts +13 -0
- package/dist/core/command-generation/adapters/amazon-q.js +26 -0
- package/dist/core/command-generation/adapters/antigravity.d.ts +13 -0
- package/dist/core/command-generation/adapters/antigravity.js +26 -0
- package/dist/core/command-generation/adapters/auggie.d.ts +13 -0
- package/dist/core/command-generation/adapters/auggie.js +27 -0
- package/dist/core/command-generation/adapters/bob.d.ts +14 -0
- package/dist/core/command-generation/adapters/bob.js +45 -0
- package/dist/core/command-generation/adapters/claude.d.ts +13 -0
- package/dist/core/command-generation/adapters/claude.js +50 -0
- package/dist/core/command-generation/adapters/cline.d.ts +14 -0
- package/dist/core/command-generation/adapters/cline.js +27 -0
- package/dist/core/command-generation/adapters/codebuddy.d.ts +13 -0
- package/dist/core/command-generation/adapters/codebuddy.js +28 -0
- package/dist/core/command-generation/adapters/codex.d.ts +16 -0
- package/dist/core/command-generation/adapters/codex.js +39 -0
- package/dist/core/command-generation/adapters/continue.d.ts +13 -0
- package/dist/core/command-generation/adapters/continue.js +28 -0
- package/dist/core/command-generation/adapters/costrict.d.ts +13 -0
- package/dist/core/command-generation/adapters/costrict.js +27 -0
- package/dist/core/command-generation/adapters/crush.d.ts +13 -0
- package/dist/core/command-generation/adapters/crush.js +30 -0
- package/dist/core/command-generation/adapters/cursor.d.ts +14 -0
- package/dist/core/command-generation/adapters/cursor.js +44 -0
- package/dist/core/command-generation/adapters/factory.d.ts +13 -0
- package/dist/core/command-generation/adapters/factory.js +27 -0
- package/dist/core/command-generation/adapters/gemini.d.ts +13 -0
- package/dist/core/command-generation/adapters/gemini.js +26 -0
- package/dist/core/command-generation/adapters/github-copilot.d.ts +13 -0
- package/dist/core/command-generation/adapters/github-copilot.js +26 -0
- package/dist/core/command-generation/adapters/iflow.d.ts +13 -0
- package/dist/core/command-generation/adapters/iflow.js +29 -0
- package/dist/core/command-generation/adapters/index.d.ts +32 -0
- package/dist/core/command-generation/adapters/index.js +32 -0
- package/dist/core/command-generation/adapters/junie.d.ts +13 -0
- package/dist/core/command-generation/adapters/junie.js +26 -0
- package/dist/core/command-generation/adapters/kilocode.d.ts +14 -0
- package/dist/core/command-generation/adapters/kilocode.js +23 -0
- package/dist/core/command-generation/adapters/kiro.d.ts +13 -0
- package/dist/core/command-generation/adapters/kiro.js +26 -0
- package/dist/core/command-generation/adapters/lingma.d.ts +13 -0
- package/dist/core/command-generation/adapters/lingma.js +30 -0
- package/dist/core/command-generation/adapters/opencode.d.ts +13 -0
- package/dist/core/command-generation/adapters/opencode.js +29 -0
- package/dist/core/command-generation/adapters/pi.d.ts +18 -0
- package/dist/core/command-generation/adapters/pi.js +55 -0
- package/dist/core/command-generation/adapters/qoder.d.ts +13 -0
- package/dist/core/command-generation/adapters/qoder.js +30 -0
- package/dist/core/command-generation/adapters/qwen.d.ts +13 -0
- package/dist/core/command-generation/adapters/qwen.js +26 -0
- package/dist/core/command-generation/adapters/roocode.d.ts +14 -0
- package/dist/core/command-generation/adapters/roocode.js +27 -0
- package/dist/core/command-generation/adapters/windsurf.d.ts +14 -0
- package/dist/core/command-generation/adapters/windsurf.js +51 -0
- package/dist/core/command-generation/generator.d.ts +21 -0
- package/dist/core/command-generation/generator.js +27 -0
- package/dist/core/command-generation/index.d.ts +22 -0
- package/dist/core/command-generation/index.js +24 -0
- package/dist/core/command-generation/registry.d.ts +36 -0
- package/dist/core/command-generation/registry.js +98 -0
- package/dist/core/command-generation/types.d.ts +56 -0
- package/dist/core/command-generation/types.js +8 -0
- package/dist/core/completions/command-registry.d.ts +7 -0
- package/dist/core/completions/command-registry.js +462 -0
- package/dist/core/completions/completion-provider.d.ts +60 -0
- package/dist/core/completions/completion-provider.js +102 -0
- package/dist/core/completions/factory.d.ts +64 -0
- package/dist/core/completions/factory.js +75 -0
- package/dist/core/completions/generators/bash-generator.d.ts +32 -0
- package/dist/core/completions/generators/bash-generator.js +174 -0
- package/dist/core/completions/generators/fish-generator.d.ts +32 -0
- package/dist/core/completions/generators/fish-generator.js +157 -0
- package/dist/core/completions/generators/powershell-generator.d.ts +33 -0
- package/dist/core/completions/generators/powershell-generator.js +208 -0
- package/dist/core/completions/generators/zsh-generator.d.ts +44 -0
- package/dist/core/completions/generators/zsh-generator.js +250 -0
- package/dist/core/completions/installers/bash-installer.d.ts +87 -0
- package/dist/core/completions/installers/bash-installer.js +319 -0
- package/dist/core/completions/installers/fish-installer.d.ts +43 -0
- package/dist/core/completions/installers/fish-installer.js +143 -0
- package/dist/core/completions/installers/powershell-installer.d.ts +102 -0
- package/dist/core/completions/installers/powershell-installer.js +400 -0
- package/dist/core/completions/installers/zsh-installer.d.ts +125 -0
- package/dist/core/completions/installers/zsh-installer.js +450 -0
- package/dist/core/completions/templates/bash-templates.d.ts +6 -0
- package/dist/core/completions/templates/bash-templates.js +24 -0
- package/dist/core/completions/templates/fish-templates.d.ts +7 -0
- package/dist/core/completions/templates/fish-templates.js +39 -0
- package/dist/core/completions/templates/powershell-templates.d.ts +6 -0
- package/dist/core/completions/templates/powershell-templates.js +25 -0
- package/dist/core/completions/templates/zsh-templates.d.ts +6 -0
- package/dist/core/completions/templates/zsh-templates.js +36 -0
- package/dist/core/completions/types.d.ts +79 -0
- package/dist/core/completions/types.js +2 -0
- package/dist/core/config-prompts.d.ts +9 -0
- package/dist/core/config-prompts.js +34 -0
- package/dist/core/config-schema.d.ts +86 -0
- package/dist/core/config-schema.js +213 -0
- package/dist/core/config.d.ts +18 -0
- package/dist/core/config.js +38 -0
- package/dist/core/converters/json-converter.d.ts +6 -0
- package/dist/core/converters/json-converter.js +51 -0
- package/dist/core/global-config.d.ts +44 -0
- package/dist/core/global-config.js +125 -0
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.js +3 -0
- package/dist/core/init.d.ts +37 -0
- package/dist/core/init.js +549 -0
- package/dist/core/is-project-initialized.d.ts +12 -0
- package/dist/core/is-project-initialized.js +18 -0
- package/dist/core/legacy-cleanup.d.ts +162 -0
- package/dist/core/legacy-cleanup.js +515 -0
- package/dist/core/list.d.ts +9 -0
- package/dist/core/list.js +172 -0
- package/dist/core/migration.d.ts +23 -0
- package/dist/core/migration.js +109 -0
- package/dist/core/parsers/change-parser.d.ts +13 -0
- package/dist/core/parsers/change-parser.js +197 -0
- package/dist/core/parsers/markdown-parser.d.ts +26 -0
- package/dist/core/parsers/markdown-parser.js +228 -0
- package/dist/core/parsers/requirement-blocks.d.ts +37 -0
- package/dist/core/parsers/requirement-blocks.js +201 -0
- package/dist/core/parsers/spec-structure.d.ts +9 -0
- package/dist/core/parsers/spec-structure.js +88 -0
- package/dist/core/profile-sync-drift.d.ts +38 -0
- package/dist/core/profile-sync-drift.js +200 -0
- package/dist/core/profiles.d.ts +26 -0
- package/dist/core/profiles.js +40 -0
- package/dist/core/project-config.d.ts +64 -0
- package/dist/core/project-config.js +224 -0
- package/dist/core/schemas/base.schema.d.ts +13 -0
- package/dist/core/schemas/base.schema.js +13 -0
- package/dist/core/schemas/change.schema.d.ts +73 -0
- package/dist/core/schemas/change.schema.js +31 -0
- package/dist/core/schemas/index.d.ts +4 -0
- package/dist/core/schemas/index.js +4 -0
- package/dist/core/schemas/spec.schema.d.ts +18 -0
- package/dist/core/schemas/spec.schema.js +15 -0
- package/dist/core/shared/index.d.ts +8 -0
- package/dist/core/shared/index.js +8 -0
- package/dist/core/shared/skill-generation.d.ts +49 -0
- package/dist/core/shared/skill-generation.js +96 -0
- package/dist/core/shared/tool-detection.d.ts +71 -0
- package/dist/core/shared/tool-detection.js +158 -0
- package/dist/core/specs-apply.d.ts +73 -0
- package/dist/core/specs-apply.js +393 -0
- package/dist/core/styles/palette.d.ts +7 -0
- package/dist/core/styles/palette.js +8 -0
- package/dist/core/templates/index.d.ts +8 -0
- package/dist/core/templates/index.js +9 -0
- package/dist/core/templates/skill-templates.d.ts +20 -0
- package/dist/core/templates/skill-templates.js +19 -0
- package/dist/core/templates/types.d.ts +19 -0
- package/dist/core/templates/types.js +5 -0
- package/dist/core/templates/workflows/apply-change.d.ts +10 -0
- package/dist/core/templates/workflows/apply-change.js +308 -0
- package/dist/core/templates/workflows/archive-change.d.ts +10 -0
- package/dist/core/templates/workflows/archive-change.js +271 -0
- package/dist/core/templates/workflows/bulk-archive-change.d.ts +10 -0
- package/dist/core/templates/workflows/bulk-archive-change.js +492 -0
- package/dist/core/templates/workflows/continue-change.d.ts +10 -0
- package/dist/core/templates/workflows/continue-change.js +232 -0
- package/dist/core/templates/workflows/explore.d.ts +10 -0
- package/dist/core/templates/workflows/explore.js +463 -0
- package/dist/core/templates/workflows/feedback.d.ts +9 -0
- package/dist/core/templates/workflows/feedback.js +108 -0
- package/dist/core/templates/workflows/ff-change.d.ts +10 -0
- package/dist/core/templates/workflows/ff-change.js +198 -0
- package/dist/core/templates/workflows/new-change.d.ts +10 -0
- package/dist/core/templates/workflows/new-change.js +21 -0
- package/dist/core/templates/workflows/onboard.d.ts +10 -0
- package/dist/core/templates/workflows/onboard.js +21 -0
- package/dist/core/templates/workflows/propose.d.ts +10 -0
- package/dist/core/templates/workflows/propose.js +216 -0
- package/dist/core/templates/workflows/sync-specs.d.ts +10 -0
- package/dist/core/templates/workflows/sync-specs.js +272 -0
- package/dist/core/templates/workflows/upstream-sync.d.ts +10 -0
- package/dist/core/templates/workflows/upstream-sync.js +116 -0
- package/dist/core/templates/workflows/verify-change.d.ts +10 -0
- package/dist/core/templates/workflows/verify-change.js +21 -0
- package/dist/core/tools-manager.d.ts +56 -0
- package/dist/core/tools-manager.js +215 -0
- package/dist/core/update.d.ts +77 -0
- package/dist/core/update.js +538 -0
- package/dist/core/validation/constants.d.ts +34 -0
- package/dist/core/validation/constants.js +40 -0
- package/dist/core/validation/types.d.ts +18 -0
- package/dist/core/validation/types.js +2 -0
- package/dist/core/validation/validator.d.ts +33 -0
- package/dist/core/validation/validator.js +419 -0
- package/dist/core/view.d.ts +8 -0
- package/dist/core/view.js +169 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/messages/index.d.ts +867 -0
- package/dist/messages/index.js +1960 -0
- package/dist/prompts/searchable-multi-select.d.ts +28 -0
- package/dist/prompts/searchable-multi-select.js +160 -0
- package/dist/telemetry/config.d.ts +38 -0
- package/dist/telemetry/config.js +136 -0
- package/dist/telemetry/index.d.ts +31 -0
- package/dist/telemetry/index.js +165 -0
- package/dist/ui/ascii-patterns.d.ts +16 -0
- package/dist/ui/ascii-patterns.js +133 -0
- package/dist/ui/welcome-screen.d.ts +10 -0
- package/dist/ui/welcome-screen.js +147 -0
- package/dist/utils/change-metadata.d.ts +51 -0
- package/dist/utils/change-metadata.js +147 -0
- package/dist/utils/change-utils.d.ts +62 -0
- package/dist/utils/change-utils.js +121 -0
- package/dist/utils/command-references.d.ts +18 -0
- package/dist/utils/command-references.js +20 -0
- package/dist/utils/file-system.d.ts +41 -0
- package/dist/utils/file-system.js +302 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/interactive.d.ts +18 -0
- package/dist/utils/interactive.js +21 -0
- package/dist/utils/item-discovery.d.ts +4 -0
- package/dist/utils/item-discovery.js +72 -0
- package/dist/utils/match.d.ts +3 -0
- package/dist/utils/match.js +22 -0
- package/dist/utils/shell-detection.d.ts +20 -0
- package/dist/utils/shell-detection.js +41 -0
- package/dist/utils/task-progress.d.ts +8 -0
- package/dist/utils/task-progress.js +37 -0
- package/package.json +84 -0
- package/schemas/spec-driven/schema.yaml +153 -0
- package/schemas/spec-driven/templates/design.md +19 -0
- package/schemas/spec-driven/templates/proposal.md +23 -0
- package/schemas/spec-driven/templates/spec.md +8 -0
- package/schemas/spec-driven/templates/tasks.md +9 -0
- 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
|