@dynamicworks/br-openspec 2.0.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/README.md +11 -2
  2. package/README.pt-BR.md +11 -2
  3. package/dist/commands/config.js +4 -0
  4. package/dist/commands/schema.js +21 -21
  5. package/dist/core/completions/installers/zsh-installer.d.ts +0 -8
  6. package/dist/core/completions/installers/zsh-installer.js +3 -31
  7. package/dist/core/config.js +3 -2
  8. package/dist/core/global-config.d.ts +6 -1
  9. package/dist/core/global-config.js +15 -16
  10. package/dist/core/parsers/requirement-blocks.js +5 -5
  11. package/dist/core/parsers/spec-structure.js +1 -1
  12. package/dist/core/profile-sync-drift.js +1 -0
  13. package/dist/core/profiles.d.ts +2 -2
  14. package/dist/core/profiles.js +2 -1
  15. package/dist/core/shared/skill-generation.js +3 -1
  16. package/dist/core/shared/tool-detection.d.ts +2 -2
  17. package/dist/core/shared/tool-detection.js +2 -0
  18. package/dist/core/specs-apply.js +1 -1
  19. package/dist/core/templates/skill-templates.d.ts +1 -1
  20. package/dist/core/templates/skill-templates.js +1 -1
  21. package/dist/core/templates/workflows/code-review.d.ts +10 -0
  22. package/dist/core/templates/workflows/code-review.js +21 -0
  23. package/dist/core/templates/workflows/sync-specs.js +2 -2
  24. package/dist/core/tools-manager.js +1 -0
  25. package/dist/core/update.d.ts +6 -0
  26. package/dist/core/update.js +21 -0
  27. package/dist/core/validation/validator.js +2 -2
  28. package/dist/messages/index.d.ts +34 -2
  29. package/dist/messages/index.js +182 -12
  30. package/package.json +1 -1
  31. package/schemas/spec-driven/schema.yaml +78 -78
  32. package/schemas/spec-driven/templates/design.md +5 -5
  33. package/schemas/spec-driven/templates/proposal.md +9 -9
  34. package/schemas/spec-driven/templates/spec.md +5 -5
  35. package/schemas/spec-driven/templates/tasks.md +6 -6
  36. package/dist/core/templates/workflows/upstream-sync.d.ts +0 -10
  37. package/dist/core/templates/workflows/upstream-sync.js +0 -116
@@ -24,6 +24,7 @@ import { WORKFLOW_TO_SKILL_DIR, getCommandConfiguredTools, getConfiguredToolsFor
24
24
  import { scanInstalledWorkflows as scanInstalledWorkflowsShared, migrateIfNeeded as migrateIfNeededShared, } from './migration.js';
25
25
  const require = createRequire(import.meta.url);
26
26
  const { version: OPENSPEC_VERSION } = require('../../package.json');
27
+ const OLD_CORE_WORKFLOWS = ['propose', 'explore', 'apply', 'archive'];
27
28
  /**
28
29
  * Scans installed workflow artifacts (skills and managed commands) across all configured tools.
29
30
  * Returns the union of detected workflow IDs that match ALL_WORKFLOWS.
@@ -96,6 +97,7 @@ export class UpdateCommand {
96
97
  // Still check for new tool directories and extra workflows
97
98
  this.detectNewTools(resolvedProjectPath, configuredTools);
98
99
  this.displayExtraWorkflowsNote(resolvedProjectPath, configuredTools, desiredWorkflows);
100
+ this.displayOldCoreCustomProfileNote(profile, globalConfig.workflows);
99
101
  return;
100
102
  }
101
103
  // 8. Display update plan
@@ -202,6 +204,7 @@ export class UpdateCommand {
202
204
  this.detectNewTools(resolvedProjectPath, configuredAndNewTools);
203
205
  // 14. Display note about extra workflows not in profile
204
206
  this.displayExtraWorkflowsNote(resolvedProjectPath, configuredAndNewTools, desiredWorkflows);
207
+ this.displayOldCoreCustomProfileNote(profile, globalConfig.workflows);
205
208
  // 15. List affected tools
206
209
  if (updatedTools.length > 0) {
207
210
  const toolDisplayNames = updatedTools;
@@ -265,6 +268,24 @@ export class UpdateCommand {
265
268
  console.log(chalk.dim(UPDATE_MESSAGES.extraWorkflowsNote(extraWorkflows.length)));
266
269
  }
267
270
  }
271
+ /**
272
+ * Sugere voltar ao perfil core quando um perfil personalizado ainda
273
+ * corresponde ao conjunto core antigo (anterior ao sync). Mantém os perfis
274
+ * personalizados sob controle do usuário; não os altera.
275
+ */
276
+ displayOldCoreCustomProfileNote(profile, workflows) {
277
+ if (profile !== 'custom' || !workflows) {
278
+ return;
279
+ }
280
+ const workflowSet = new Set(workflows);
281
+ const matchesOldCore = workflowSet.size === OLD_CORE_WORKFLOWS.length &&
282
+ OLD_CORE_WORKFLOWS.every((workflow) => workflowSet.has(workflow));
283
+ if (!matchesOldCore) {
284
+ return;
285
+ }
286
+ console.log(chalk.dim(UPDATE_MESSAGES.oldCoreProfileSyncNote));
287
+ console.log(chalk.dim(UPDATE_MESSAGES.oldCoreProfileSyncHint));
288
+ }
268
289
  /**
269
290
  * Removes skill directories for workflows when delivery changed to commands-only.
270
291
  * Returns the number of directories removed.
@@ -151,7 +151,7 @@ export class Validator {
151
151
  issues.push({ level: 'ERROR', path: entryPath, message: VALIDATOR_MESSAGES.missingRequirementTextAdded(block.name) });
152
152
  }
153
153
  else if (!this.containsShallOrMust(requirementText)) {
154
- issues.push({ level: 'ERROR', path: entryPath, message: VALIDATOR_MESSAGES.missingShallOrMustAdded(block.name) });
154
+ issues.push({ level: 'ERROR', path: entryPath, message: VALIDATOR_MESSAGES.missingShallOrMustAdded(block.name, this.containsShallOrMust(block.name)) });
155
155
  }
156
156
  const scenarioCount = this.countScenarios(block.raw);
157
157
  if (scenarioCount < 1) {
@@ -173,7 +173,7 @@ export class Validator {
173
173
  issues.push({ level: 'ERROR', path: entryPath, message: VALIDATOR_MESSAGES.missingRequirementTextModified(block.name) });
174
174
  }
175
175
  else if (!this.containsShallOrMust(requirementText)) {
176
- issues.push({ level: 'ERROR', path: entryPath, message: VALIDATOR_MESSAGES.missingShallOrMustModified(block.name) });
176
+ issues.push({ level: 'ERROR', path: entryPath, message: VALIDATOR_MESSAGES.missingShallOrMustModified(block.name, this.containsShallOrMust(block.name)) });
177
177
  }
178
178
  const scenarioCount = this.countScenarios(block.raw);
179
179
  if (scenarioCount < 1) {
@@ -3,6 +3,28 @@
3
3
  *
4
4
  * Este módulo reúne todas as mensagens exibidas ao usuário para facilitar
5
5
  * manutenção, revisão e consistência linguística.
6
+ *
7
+ * ─────────────────────────────────────────────────────────────────────────
8
+ * ⚠️ TERMOS RESERVADOS — NÃO TRADUZIR
9
+ * ─────────────────────────────────────────────────────────────────────────
10
+ * O BR-OpenSpec é PT-BR first, mas o FORMATO de spec é um protocolo lido pelo
11
+ * parser e pelo validador. Os marcadores estruturais e as palavras-chave
12
+ * normativas DEVEM permanecer em inglês e em CAIXA ALTA. Só o conteúdo
13
+ * descritivo (nomes, descrições, prosa) é escrito em português.
14
+ *
15
+ * - Palavras-chave normativas (RFC 2119): MUST, MUST NOT, REQUIRED, SHALL,
16
+ * SHALL NOT, SHOULD, SHOULD NOT, RECOMMENDED, MAY, OPTIONAL.
17
+ * - Cabeçalhos de delta/spec: "## ADDED Requirements", "## MODIFIED Requirements",
18
+ * "## REMOVED Requirements", "## RENAMED Requirements", "## Requirements",
19
+ * "### Requirement:", "#### Scenario:".
20
+ * - Cláusulas de cenário (Gherkin): WHEN, THEN, AND, GIVEN, ELSE.
21
+ * - Auxiliares de RENAMED: FROM, TO.
22
+ *
23
+ * Regra geral: qualquer palavra em CAIXA ALTA que represente uma regra, uma
24
+ * operação de delta (ADD/REMOVE/RENAME) ou uma cláusula de cenário fica em
25
+ * inglês. Traduzir esses termos quebra o parsing/validação dos specs.
26
+ * Ver também AGENTS.md ("Termos reservados em inglês").
27
+ * ─────────────────────────────────────────────────────────────────────────
6
28
  */
7
29
  export declare const CLI_DESCRIPTIONS: {
8
30
  root: string;
@@ -458,6 +480,8 @@ export declare const CONFIG_MESSAGES: {
458
480
  workflowBulkArchiveDesc: string;
459
481
  workflowVerifyName: string;
460
482
  workflowVerifyDesc: string;
483
+ workflowCodeReviewName: string;
484
+ workflowCodeReviewDesc: string;
461
485
  workflowOnboardName: string;
462
486
  workflowOnboardDesc: string;
463
487
  };
@@ -719,6 +743,8 @@ export declare const UPDATE_MESSAGES: {
719
743
  it: string;
720
744
  them: string;
721
745
  extraWorkflowsNote: (count: number) => string;
746
+ oldCoreProfileSyncNote: string;
747
+ oldCoreProfileSyncHint: string;
722
748
  cleaningLegacy: string;
723
749
  legacyCleaned: string;
724
750
  forceLegacyHint: string;
@@ -752,11 +778,11 @@ export declare const VALIDATOR_MESSAGES: {
752
778
  unknownError: string;
753
779
  duplicateRequirementAdded: (name: string) => string;
754
780
  missingRequirementTextAdded: (name: string) => string;
755
- missingShallOrMustAdded: (name: string) => string;
781
+ missingShallOrMustAdded: (name: string, keywordInHeader?: boolean) => string;
756
782
  missingScenarioAdded: (name: string) => string;
757
783
  duplicateRequirementModified: (name: string) => string;
758
784
  missingRequirementTextModified: (name: string) => string;
759
- missingShallOrMustModified: (name: string) => string;
785
+ missingShallOrMustModified: (name: string, keywordInHeader?: boolean) => string;
760
786
  missingScenarioModified: (name: string) => string;
761
787
  duplicateRequirementRemoved: (name: string) => string;
762
788
  duplicateFromRenamed: (name: string) => string;
@@ -890,6 +916,12 @@ export declare const VERIFY_CHANGE_TEMPLATE_MESSAGES: {
890
916
  skillInstructions: string;
891
917
  opsxContent: string;
892
918
  };
919
+ export declare const CODE_REVIEW_TEMPLATE_MESSAGES: {
920
+ skillDescription: string;
921
+ skillCompatibility: string;
922
+ opsxDescription: string;
923
+ instructions: string;
924
+ };
893
925
  export declare const TELEMETRY_MESSAGES: {
894
926
  firstRunNotice: string;
895
927
  };
@@ -3,6 +3,28 @@
3
3
  *
4
4
  * Este módulo reúne todas as mensagens exibidas ao usuário para facilitar
5
5
  * manutenção, revisão e consistência linguística.
6
+ *
7
+ * ─────────────────────────────────────────────────────────────────────────
8
+ * ⚠️ TERMOS RESERVADOS — NÃO TRADUZIR
9
+ * ─────────────────────────────────────────────────────────────────────────
10
+ * O BR-OpenSpec é PT-BR first, mas o FORMATO de spec é um protocolo lido pelo
11
+ * parser e pelo validador. Os marcadores estruturais e as palavras-chave
12
+ * normativas DEVEM permanecer em inglês e em CAIXA ALTA. Só o conteúdo
13
+ * descritivo (nomes, descrições, prosa) é escrito em português.
14
+ *
15
+ * - Palavras-chave normativas (RFC 2119): MUST, MUST NOT, REQUIRED, SHALL,
16
+ * SHALL NOT, SHOULD, SHOULD NOT, RECOMMENDED, MAY, OPTIONAL.
17
+ * - Cabeçalhos de delta/spec: "## ADDED Requirements", "## MODIFIED Requirements",
18
+ * "## REMOVED Requirements", "## RENAMED Requirements", "## Requirements",
19
+ * "### Requirement:", "#### Scenario:".
20
+ * - Cláusulas de cenário (Gherkin): WHEN, THEN, AND, GIVEN, ELSE.
21
+ * - Auxiliares de RENAMED: FROM, TO.
22
+ *
23
+ * Regra geral: qualquer palavra em CAIXA ALTA que represente uma regra, uma
24
+ * operação de delta (ADD/REMOVE/RENAME) ou uma cláusula de cenário fica em
25
+ * inglês. Traduzir esses termos quebra o parsing/validação dos specs.
26
+ * Ver também AGENTS.md ("Termos reservados em inglês").
27
+ * ─────────────────────────────────────────────────────────────────────────
6
28
  */
7
29
  // ═══════════════════════════════════════════════════════════
8
30
  // CLI — Descrições de comandos (src/cli/index.ts)
@@ -514,6 +536,8 @@ export const CONFIG_MESSAGES = {
514
536
  workflowBulkArchiveDesc: 'Arquiva múltiplas alterações concluídas juntas',
515
537
  workflowVerifyName: 'Verificar alteração',
516
538
  workflowVerifyDesc: 'Executa verificações contra uma alteração',
539
+ workflowCodeReviewName: 'Code review',
540
+ workflowCodeReviewDesc: 'Revisa diffs, branches ou arquivos com contexto do projeto',
517
541
  workflowOnboardName: 'Onboarding',
518
542
  workflowOnboardDesc: 'Fluxo de onboarding guiado para o BR-OpenSpec',
519
543
  };
@@ -799,6 +823,8 @@ export const UPDATE_MESSAGES = {
799
823
  it: 'ela',
800
824
  them: 'elas',
801
825
  extraWorkflowsNote: (count) => `Nota: ${count} fluxos de trabalho extras não estão no perfil (use \`openspec config profile\` para gerenciar)`,
826
+ oldCoreProfileSyncNote: 'Nota: o perfil core agora inclui o fluxo de trabalho sync. Seu perfil personalizado está mantendo o conjunto antigo de fluxos de trabalho do core.',
827
+ oldCoreProfileSyncHint: 'Execute `openspec config profile core` e depois `openspec update` para adicionar o sync.',
802
828
  cleaningLegacy: 'Limpando arquivos legados...',
803
829
  legacyCleaned: 'Arquivos legados limpos',
804
830
  forceLegacyHint: '⚠ Execute com --force para limpar automaticamente arquivos legados, ou execute de forma interativa.',
@@ -841,11 +867,21 @@ export const VALIDATOR_MESSAGES = {
841
867
  unknownError: 'Erro desconhecido',
842
868
  duplicateRequirementAdded: (name) => `Requisito duplicado em ADDED: "${name}"`,
843
869
  missingRequirementTextAdded: (name) => `ADDED "${name}" está sem texto de requisito`,
844
- missingShallOrMustAdded: (name) => `ADDED "${name}" deve conter SHALL ou MUST`,
870
+ missingShallOrMustAdded: (name, keywordInHeader = false) => {
871
+ const base = `ADDED "${name}" deve conter SHALL ou MUST`;
872
+ return keywordInHeader
873
+ ? `${base} no corpo do requisito, não apenas no cabeçalho. Mova a declaração SHALL/MUST para a linha imediatamente após o cabeçalho "### Requirement: ...".`
874
+ : base;
875
+ },
845
876
  missingScenarioAdded: (name) => `ADDED "${name}" deve incluir pelo menos um cenário`,
846
877
  duplicateRequirementModified: (name) => `Requisito duplicado em MODIFIED: "${name}"`,
847
878
  missingRequirementTextModified: (name) => `MODIFIED "${name}" está sem texto de requisito`,
848
- missingShallOrMustModified: (name) => `MODIFIED "${name}" deve conter SHALL ou MUST`,
879
+ missingShallOrMustModified: (name, keywordInHeader = false) => {
880
+ const base = `MODIFIED "${name}" deve conter SHALL ou MUST`;
881
+ return keywordInHeader
882
+ ? `${base} no corpo do requisito, não apenas no cabeçalho. Mova a declaração SHALL/MUST para a linha imediatamente após o cabeçalho "### Requirement: ...".`
883
+ : base;
884
+ },
849
885
  missingScenarioModified: (name) => `MODIFIED "${name}" deve incluir pelo menos um cenário`,
850
886
  duplicateRequirementRemoved: (name) => `Requisito duplicado em REMOVED: "${name}"`,
851
887
  duplicateFromRenamed: (name) => `FROM duplicado em RENAMED: "${name}"`,
@@ -1321,11 +1357,11 @@ Aqui está um rascunho de proposal:
1321
1357
 
1322
1358
  ---
1323
1359
 
1324
- ## Por Que
1360
+ ## Why
1325
1361
 
1326
1362
  [1-2 frases explicando o problema/oportunidade]
1327
1363
 
1328
- ## O Que Muda
1364
+ ## What Changes
1329
1365
 
1330
1366
  [Bullet points do que será diferente]
1331
1367
 
@@ -1389,21 +1425,21 @@ Aqui está o spec:
1389
1425
 
1390
1426
  ---
1391
1427
 
1392
- ## Requisitos ADICIONADOS
1428
+ ## ADDED Requirements
1393
1429
 
1394
- ### Requisito: <Nome>
1430
+ ### Requirement: <Nome>
1395
1431
 
1396
- <Descrição do que o sistema deve fazer>
1432
+ O sistema SHALL <descrição do que o sistema deve fazer>
1397
1433
 
1398
- #### Cenário: <Nome do cenário>
1434
+ #### Scenario: <Nome do cenário>
1399
1435
 
1400
- - **QUANDO** <condição de gatilho>
1401
- - **ENTÃO** <resultado esperado>
1402
- - **E** <resultado adicional se necessário>
1436
+ - **WHEN** <condição de gatilho>
1437
+ - **THEN** <resultado esperado>
1438
+ - **AND** <resultado adicional se necessário>
1403
1439
 
1404
1440
  ---
1405
1441
 
1406
- Este formato - QUANDO/ENTÃO/E - torna os requisitos testáveis. Você pode literalmente lê-los como casos de teste.
1442
+ Este formato - WHEN/THEN/AND - torna os requisitos testáveis. Você pode literalmente lê-los como casos de teste. Os marcadores estruturais (ADDED Requirements, Requirement, Scenario) e as palavras-chave (WHEN/THEN/AND, SHALL/MUST) ficam SEMPRE em inglês — é o protocolo que o parser e o validador reconhecem. Apenas o conteúdo descritivo é escrito em português.
1407
1443
  \`\`\`
1408
1444
 
1409
1445
  Salve em \`openspec/changes/<nome>/specs/<capability>/spec.md\`.
@@ -1984,6 +2020,140 @@ Use markdown claro com:
1984
2020
  - Sem sugestões vagas como "consider reviewing"`,
1985
2021
  };
1986
2022
  // ═══════════════════════════════════════════════════════════
2023
+ // Templates de Workflow — Code Review (src/core/templates/workflows/code-review.ts)
2024
+ // ═══════════════════════════════════════════════════════════
2025
+ export const CODE_REVIEW_TEMPLATE_MESSAGES = {
2026
+ skillDescription: 'Realiza code review genérico e consciente do projeto. Use quando o usuário quiser revisar um diff, branch, PR, working tree ou conjunto de arquivos antes de mesclar ou continuar.',
2027
+ skillCompatibility: 'Requer acesso aos arquivos do projeto. Git é recomendado para revisar diffs e branches.',
2028
+ opsxDescription: 'Revisa diffs, branches, PRs ou arquivos usando contexto do projeto',
2029
+ instructions: `Realize um code review rigoroso, genérico e consciente do projeto. Seu objetivo é encontrar problemas reais antes do merge — não validar superficialmente, não comentar estilo, não elogiar.
2030
+
2031
+ **Entrada**: Opcionalmente especifique o alvo após \`/opsx:code-review\`: branch, PR, diff, working tree, staged changes, caminho de arquivo ou descrição de escopo. Se omitido, descubra o alvo com segurança.
2032
+
2033
+ **Postura**
2034
+
2035
+ - Você está revisando, não implementando. Não edite arquivos a menos que o usuário peça explicitamente para corrigir.
2036
+ - Aja como um revisor sênior cético: assuma que existe um bug até o código provar o contrário, e fundamente cada finding com evidência concreta no código.
2037
+ - Priorize nesta ordem: correção/regressões → segurança/privacidade → perda ou corrupção de dados → quebra de contrato/compatibilidade → concorrência → comportamento cross-platform → testes ausentes → performance → manutenibilidade.
2038
+ - Estilo e preferência pessoal só viram finding se tiverem impacto concreto (ex.: legibilidade que esconde um bug, violação de um padrão real do projeto).
2039
+ - Findings primeiro, com evidência. Resumo depois.
2040
+ - Calibre a profundidade ao tamanho do diff; em diffs grandes, revise por blocos e priorize as áreas de maior risco.
2041
+ - Sinalize incerteza explicitamente. Nunca invente número de linha, nome de símbolo ou comportamento que você não verificou.
2042
+
2043
+ **Passos**
2044
+
2045
+ 1. **Determine o alvo da review**
2046
+
2047
+ Use o argumento do usuário quando existir. Caso contrário, descubra com segurança:
2048
+ - Confirme se há Git: \`git rev-parse --is-inside-work-tree\`.
2049
+ - Inspecione o estado local: \`git status --short\`, \`git diff\` (unstaged) e \`git diff --staged\`.
2050
+ - Para revisar um branch contra a base: identifique a base provável (ex.: \`git merge-base HEAD origin/main\`) e use \`git diff <base>...HEAD\`.
2051
+ - Para um PR, prefira \`gh pr diff <numero>\` quando o \`gh\` estiver disponível.
2052
+ - Se não houver Git, peça arquivos ou escopo explícitos ao usuário.
2053
+ - Se o alvo continuar ambíguo, pergunte ao usuário o que revisar.
2054
+
2055
+ Não assuma review do repositório inteiro sem confirmação. Leia o diff completo (com contexto de linha) antes de julgar.
2056
+
2057
+ 2. **Entenda a intenção antes de criticar**
2058
+
2059
+ Antes de procurar defeitos, articule o que a mudança tenta fazer e por quê (a partir do título do PR/branch, mensagens de commit, artifacts OpenSpec ou do próprio diff). Um bom review compara o que o código faz com o que deveria fazer; sem a intenção, você só consegue revisar sintaxe.
2060
+
2061
+ 3. **Colete contexto do projeto**
2062
+
2063
+ Leia apenas os arquivos relevantes, priorizando:
2064
+ - \`README.md\`, \`README_*.md\` e docs de contribuição
2065
+ - \`AGENTS.md\`, instruções de agentes e skills existentes do projeto
2066
+ - \`openspec/config.yaml\` e docs de arquitetura/ADRs quando existirem
2067
+ - specs vivas em \`openspec/specs/\` quando relacionadas ao alvo
2068
+ - testes vizinhos ao código alterado (para entender o contrato esperado)
2069
+ - manifests e configs de stack (\`package.json\`, lockfiles, \`tsconfig.json\`, configs de lint/test/build, CI etc.)
2070
+
2071
+ Aplique as instruções encontradas. Em caso de conflito, prefira a orientação mais específica do repositório.
2072
+
2073
+ 4. **Entenda a stack e os comandos de verificação**
2074
+
2075
+ Infira linguagem, framework, package manager e comandos úteis a partir dos arquivos locais.
2076
+
2077
+ Exemplos:
2078
+ - Node/TypeScript: scripts de \`package.json\`, lockfile e \`tsconfig.json\`
2079
+ - Python: \`pyproject.toml\`, \`requirements*.txt\`, configs de pytest/ruff/mypy
2080
+ - Go/Rust: \`go.mod\`, \`Cargo.toml\` e scripts de CI
2081
+
2082
+ 5. **Inclua contexto OpenSpec quando existir**
2083
+
2084
+ Se houver uma change relacionada:
2085
+ - Leia \`proposal.md\`, \`design.md\`, \`tasks.md\` e delta specs disponíveis.
2086
+ - Verifique se o diff preserva a intenção dos artifacts.
2087
+ - Não transforme esta review em \`/opsx:verify\`; use os artifacts apenas como contexto adicional para revisar o código.
2088
+
2089
+ 6. **Revise o código em profundidade**
2090
+
2091
+ Método para cada mudança: leia além do diff (o código ao redor, chamadores e implementações chamadas), rastreie de onde vêm os dados e para onde vão, e teste mentalmente entradas adversárias (vazio, nulo, zero, negativo, muito grande, unicode, concorrente). Não confie no nome de uma função — confirme o que ela faz.
2092
+
2093
+ Procure, por categoria:
2094
+ - **Correção e lógica**: regressões, edge cases e limites (off-by-one), condições invertidas ou incompletas, \`switch\` sem \`break\`/default, retorno/await faltando, suposições falsas sobre a entrada.
2095
+ - **Dados e estado**: mutação de estado compartilhado, ordem de operações, idempotência, transações e atomicidade, invalidação de cache, lifecycle e limpeza de recursos.
2096
+ - **Concorrência**: race conditions, \`await\`/lock faltando, reentrância, deadlock, escrita concorrente.
2097
+ - **Segurança e privacidade**: injeção (SQL/command/path/template), validação e sanitização de entrada não confiável, authn/authz, segredos hardcoded, dados sensíveis vazando em logs/erros, deserialização insegura, SSRF/path traversal.
2098
+ - **Erros e resiliência**: erros engolidos, mensagens que vazam dados, ausência de rollback, retries/timeouts, recursos não liberados em caminho de erro.
2099
+ - **Contratos e compatibilidade**: mudança em API pública, assinatura, schema ou formato persistido; migrações reversíveis; compatibilidade retroativa e versionamento.
2100
+ - **Cross-platform**: separador de caminho, case sensitivity, line endings, shell e encoding quando filesystem/processo estiverem envolvidos.
2101
+ - **Performance**: N+1, complexidade quadrática, I/O ou alocação dentro de loop — reporte apenas quando o impacto for plausível.
2102
+ - **Testes**: cenários novos/quebráveis cobertos, testes negativos e de borda, testes frágeis ou que não exercitam de fato o código.
2103
+ - **Dependências**: nova dependência justificada, versão e licença sãs, risco de supply chain.
2104
+ - **Consistência com o projeto**: aderência a padrões, convenções e decisões reais do repositório (incluindo, quando aplicável, mensagens centralizadas/i18n em vez de texto hardcoded).
2105
+
2106
+ 7. **Valide quando for seguro**
2107
+
2108
+ Rode verificações focadas e proporcionais (typecheck, lint, testes do escopo afetado) quando forem seguras. Não rode comandos destrutivos, dependentes de serviços externos ou desproporcionalmente caros sem explicar/confirmar. Reporte o que rodou e o que pulou (e por quê).
2109
+
2110
+ 8. **Sugira contexto durável do projeto**
2111
+
2112
+ Se o projeto não tiver orientação durável suficiente para reviews (nenhum \`AGENTS.md\`, skill do projeto, docs de contribuição ou contexto em \`openspec/config.yaml\`):
2113
+ - Sugira criar ou enriquecer uma skill/contexto do projeto para futuras reviews, indicando um local concreto (ex.: \`AGENTS.md\` ou uma skill do projeto) e os pontos que ela deveria registrar (padrões, comandos de validação, armadilhas).
2114
+ - Explique brevemente o benefício.
2115
+ - Peça confirmação antes de escrever qualquer arquivo.
2116
+
2117
+ **Formato de Saída**
2118
+
2119
+ Se houver findings, comece por eles, ordenados por severidade. Para cada finding:
2120
+
2121
+ \`\`\`text
2122
+ Findings
2123
+ - [CRITICAL] caminho/arquivo.ext:123 — Título curto e específico
2124
+ Evidência: o que no código causa o problema (cite o trecho/símbolo)
2125
+ Impacto: o que quebra na prática e sob qual condição
2126
+ Correção: ação concreta e mínima
2127
+ Confiança: alta | média | baixa (se < alta, diga a suposição)
2128
+ \`\`\`
2129
+
2130
+ Depois inclua, de forma breve:
2131
+ - alvo revisado
2132
+ - contexto/instruções considerados
2133
+ - validações executadas
2134
+ - validações não executadas e por quê
2135
+ - risco residual ou perguntas abertas
2136
+
2137
+ Se não houver findings, diga claramente que nenhum problema foi encontrado e ainda informe as validações não executadas.
2138
+
2139
+ **Regras de Severidade**
2140
+
2141
+ - **CRITICAL**: bug provável, perda/corrupção de dados, falha de segurança, quebra de contrato, build/test claramente quebrado.
2142
+ - **WARNING**: risco real mas dependente de condição, cobertura ausente para comportamento importante, inconsistência que pode virar regressão.
2143
+ - **SUGGESTION**: melhoria útil, baixa urgência, refino de manutenção.
2144
+
2145
+ **Guardrails**
2146
+
2147
+ - Não altere arquivos durante uma review pura.
2148
+ - Todo finding precisa de evidência concreta; sem evidência, não reporte.
2149
+ - Não reporte o que linter/typecheck/formatter já pegam automaticamente — foque no que essas ferramentas não veem.
2150
+ - Não duplique o mesmo finding; agrupe ocorrências do mesmo problema.
2151
+ - Prefira poucos findings fortes a muitos comentários especulativos.
2152
+ - Não encha a saída com elogios genéricos.
2153
+ - Use referências no formato \`arquivo:linha\`; quando não houver linha exata, cite o menor escopo verificável.
2154
+ - Se a informação for incerta, diga o que verificou e qual suposição está fazendo — e marque a confiança.`,
2155
+ };
2156
+ // ═══════════════════════════════════════════════════════════
1987
2157
  // Telemetry (src/telemetry/index.ts)
1988
2158
  // ═══════════════════════════════════════════════════════════
1989
2159
  export const TELEMETRY_MESSAGES = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dynamicworks/br-openspec",
3
- "version": "2.0.1",
3
+ "version": "2.1.0",
4
4
  "description": "AI-native system for spec-driven development",
5
5
  "keywords": [
6
6
  "openspec",
@@ -4,61 +4,61 @@ description: Fluxo de trabalho BR-OpenSpec padrão - proposta → specs → desi
4
4
  artifacts:
5
5
  - id: proposal
6
6
  generates: proposal.md
7
- description: Initial proposal document outlining the change
7
+ description: Documento de proposta inicial que descreve a mudança
8
8
  template: proposal.md
9
9
  instruction: |
10
- Create the proposal document that establishes WHY this change is needed.
10
+ Crie o documento de proposta que estabelece o WHY (por que) esta mudança é necessária.
11
11
 
12
- Sections:
13
- - **Why**: 1-2 sentences on the problem or opportunity. What problem does this solve? Why now?
14
- - **What Changes**: Bullet list of changes. Be specific about new capabilities, modifications, or removals. Mark breaking changes with **BREAKING**.
15
- - **Capabilities**: Identify which specs will be created or modified:
16
- - **New Capabilities**: List capabilities being introduced. Each becomes a new `specs/<name>/spec.md`. Use kebab-case names (e.g., `user-auth`, `data-export`).
17
- - **Modified Capabilities**: List existing capabilities whose REQUIREMENTS are changing. Only include if spec-level behavior changes (not just implementation details). Each needs a delta spec file. Check `openspec/specs/` for existing spec names. Leave empty if no requirement changes.
18
- - **Impact**: Affected code, APIs, dependencies, or systems.
12
+ Seções:
13
+ - **Why**: 1-2 frases sobre o problema ou oportunidade. Qual problema isso resolve? Por que agora?
14
+ - **What Changes**: Lista de marcadores das mudanças. Seja específico sobre novas capabilities, modificações ou remoções. Marque mudanças incompatíveis com **BREAKING**.
15
+ - **Capabilities**: Identifique quais specs serão criadas ou modificadas:
16
+ - **New Capabilities**: Liste as capabilities sendo introduzidas. Cada uma vira um novo `specs/<name>/spec.md`. Use nomes em kebab-case (ex.: `user-auth`, `data-export`).
17
+ - **Modified Capabilities**: Liste as capabilities existentes cujos REQUIREMENTS estão mudando. Inclua apenas se o comportamento no nível da spec mudar (não apenas detalhes de implementação). Cada uma precisa de um arquivo de spec delta. Verifique `openspec/specs/` para os nomes de spec existentes. Deixe vazio se não houver mudança de requirement.
18
+ - **Impact**: Código, APIs, dependências ou sistemas afetados.
19
19
 
20
- IMPORTANT: The Capabilities section is critical. It creates the contract between
21
- proposal and specs phases. Research existing specs before filling this in.
22
- Each capability listed here will need a corresponding spec file.
20
+ IMPORTANTE: A seção Capabilities é crítica. Ela cria o contrato entre
21
+ as fases de proposta e specs. Pesquise as specs existentes antes de preenchê-la.
22
+ Cada capability listada aqui precisará de um arquivo de spec correspondente.
23
23
 
24
- Keep it concise (1-2 pages). Focus on the "why" not the "how" -
25
- implementation details belong in design.md.
24
+ Mantenha conciso (1-2 páginas). Foque no "porquê", não no "como" -
25
+ detalhes de implementação pertencem ao design.md.
26
26
 
27
- This is the foundation - specs, design, and tasks all build on this.
27
+ Esta é a fundação - specs, design e tarefas se baseiam nela.
28
28
  requires: []
29
29
 
30
30
  - id: specs
31
31
  generates: "specs/**/*.md"
32
- description: Detailed specifications for the change
32
+ description: Especificações detalhadas da mudança
33
33
  template: spec.md
34
34
  instruction: |
35
- Create specification files that define WHAT the system should do.
36
-
37
- Create one spec file per capability listed in the proposal's Capabilities section.
38
- - New capabilities: use the exact kebab-case name from the proposal (specs/<capability>/spec.md).
39
- - Modified capabilities: use the existing spec folder name from openspec/specs/<capability>/ when creating the delta spec at specs/<capability>/spec.md.
40
-
41
- Delta operations (use ## headers):
42
- - **ADDED Requirements**: New capabilities
43
- - **MODIFIED Requirements**: Changed behavior - MUST include full updated content
44
- - **REMOVED Requirements**: Deprecated features - MUST include **Reason** and **Migration**
45
- - **RENAMED Requirements**: Name changes only - use FROM:/TO: format
46
-
47
- Format requirements:
48
- - Each requirement: `### Requirement: <name>` followed by description
49
- - Use SHALL/MUST for normative requirements (avoid should/may)
50
- - Each scenario: `#### Scenario: <name>` with WHEN/THEN format
51
- - **CRITICAL**: Scenarios MUST use exactly 4 hashtags (`####`). Using 3 hashtags or bullets will fail silently.
52
- - Every requirement MUST have at least one scenario.
53
-
54
- MODIFIED requirements workflow:
55
- 1. Locate the existing requirement in openspec/specs/<capability>/spec.md
56
- 2. Copy the ENTIRE requirement block (from `### Requirement:` through all scenarios)
57
- 3. Paste under `## MODIFIED Requirements` and edit to reflect new behavior
58
- 4. Ensure header text matches exactly (whitespace-insensitive)
59
-
60
- Common pitfall: Using MODIFIED with partial content loses detail at archive time.
61
- If adding new concerns without changing existing behavior, use ADDED instead.
35
+ Crie arquivos de especificação que definam o WHAT (o que) o sistema deve fazer.
36
+
37
+ Crie um arquivo de spec por capability listada na seção Capabilities da proposta.
38
+ - Novas capabilities: use o nome exato em kebab-case da proposta (specs/<capability>/spec.md).
39
+ - Capabilities modificadas: use o nome da pasta de spec existente em openspec/specs/<capability>/ ao criar a spec delta em specs/<capability>/spec.md.
40
+
41
+ Operações de delta (use cabeçalhos ##):
42
+ - **ADDED Requirements**: Novas capabilities
43
+ - **MODIFIED Requirements**: Comportamento alterado - MUST incluir o conteúdo atualizado completo
44
+ - **REMOVED Requirements**: Recursos descontinuados - MUST incluir **Reason** e **Migration**
45
+ - **RENAMED Requirements**: Apenas mudanças de nome - use o formato FROM:/TO:
46
+
47
+ Requisitos de formato:
48
+ - Cada requirement: `### Requirement: <name>` seguido de descrição
49
+ - Use SHALL/MUST para requisitos normativos (evite should/may)
50
+ - Cada cenário: `#### Scenario: <name>` no formato WHEN/THEN
51
+ - **CRITICAL**: Os cenários MUST usar exatamente 4 cerquilhas (`####`). Usar 3 cerquilhas ou marcadores falha silenciosamente.
52
+ - Todo requirement MUST ter pelo menos um cenário.
53
+
54
+ Fluxo de trabalho de requirements MODIFIED:
55
+ 1. Localize o requirement existente em openspec/specs/<capability>/spec.md
56
+ 2. Copie o bloco INTEIRO do requirement (de `### Requirement:` até todos os cenários)
57
+ 3. Cole sob `## MODIFIED Requirements` e edite para refletir o novo comportamento
58
+ 4. Garanta que o texto do cabeçalho corresponda exatamente (ignorando espaços em branco)
59
+
60
+ Armadilha comum: Usar MODIFIED com conteúdo parcial perde detalhe no momento do arquivamento.
61
+ Se estiver adicionando novas preocupações sem alterar o comportamento existente, use ADDED.
62
62
 
63
63
  Example:
64
64
  ```
@@ -78,53 +78,53 @@ artifacts:
78
78
  **Migration**: Use new export endpoint at /api/v2/export
79
79
  ```
80
80
 
81
- Specs should be testable - each scenario is a potential test case.
81
+ As specs devem ser testáveis - cada cenário é um possível caso de teste.
82
82
  requires:
83
83
  - proposal
84
84
 
85
85
  - id: design
86
86
  generates: design.md
87
- description: Technical design document with implementation details
87
+ description: Documento de design técnico com detalhes de implementação
88
88
  template: design.md
89
89
  instruction: |
90
- Create the design document that explains HOW to implement the change.
91
-
92
- When to include design.md (create only if any apply):
93
- - Cross-cutting change (multiple services/modules) or new architectural pattern
94
- - New external dependency or significant data model changes
95
- - Security, performance, or migration complexity
96
- - Ambiguity that benefits from technical decisions before coding
97
-
98
- Sections:
99
- - **Context**: Background, current state, constraints, stakeholders
100
- - **Goals / Non-Goals**: What this design achieves and explicitly excludes
101
- - **Decisions**: Key technical choices with rationale (why X over Y?). Include alternatives considered for each decision.
102
- - **Risks / Trade-offs**: Known limitations, things that could go wrong. Format: [Risk] → Mitigation
103
- - **Migration Plan**: Steps to deploy, rollback strategy (if applicable)
104
- - **Open Questions**: Outstanding decisions or unknowns to resolve
105
-
106
- Focus on architecture and approach, not line-by-line implementation.
107
- Reference the proposal for motivation and specs for requirements.
108
-
109
- Good design docs explain the "why" behind technical decisions.
90
+ Crie o documento de design que explica o HOW (como) implementar a mudança.
91
+
92
+ Quando incluir design.md (crie apenas se algum se aplicar):
93
+ - Mudança transversal (múltiplos serviços/módulos) ou novo padrão arquitetural
94
+ - Nova dependência externa ou mudanças significativas no modelo de dados
95
+ - Complexidade de segurança, desempenho ou migração
96
+ - Ambiguidade que se beneficia de decisões técnicas antes de codificar
97
+
98
+ Seções:
99
+ - **Context**: Histórico, estado atual, restrições, partes interessadas
100
+ - **Goals / Non-Goals**: O que este design alcança e o que explicitamente exclui
101
+ - **Decisions**: Principais escolhas técnicas com justificativa (por que X em vez de Y?). Inclua as alternativas consideradas para cada decisão.
102
+ - **Risks / Trade-offs**: Limitações conhecidas, coisas que podem dar errado. Formato: [Risco] → Mitigação
103
+ - **Migration Plan**: Passos para implantar, estratégia de rollback (se aplicável)
104
+ - **Open Questions**: Decisões pendentes ou incógnitas a resolver
105
+
106
+ Foque na arquitetura e na abordagem, não na implementação linha a linha.
107
+ Referencie a proposta para a motivação e as specs para os requirements.
108
+
109
+ Bons documentos de design explicam o "porquê" por trás das decisões técnicas.
110
110
  requires:
111
111
  - proposal
112
112
 
113
113
  - id: tasks
114
114
  generates: tasks.md
115
- description: Implementation checklist with trackable tasks
115
+ description: Checklist de implementação com tarefas rastreáveis
116
116
  template: tasks.md
117
117
  instruction: |
118
- Create the task list that breaks down the implementation work.
118
+ Crie a lista de tarefas que detalha o trabalho de implementação.
119
119
 
120
- **IMPORTANT: Follow the template below exactly.** The apply phase parses
121
- checkbox format to track progress. Tasks not using `- [ ]` won't be tracked.
120
+ **IMPORTANTE: Siga o template abaixo exatamente.** A fase de apply faz o parse
121
+ do formato de checkbox para acompanhar o progresso. Tarefas que não usam `- [ ]` não serão rastreadas.
122
122
 
123
- Guidelines:
124
- - Group related tasks under ## numbered headings
125
- - Each task MUST be a checkbox: `- [ ] X.Y Task description`
126
- - Tasks should be small enough to complete in one session
127
- - Order tasks by dependency (what must be done first?)
123
+ Diretrizes:
124
+ - Agrupe tarefas relacionadas sob cabeçalhos numerados ##
125
+ - Cada tarefa MUST ser um checkbox: `- [ ] X.Y Descrição da tarefa`
126
+ - As tarefas devem ser pequenas o suficiente para serem concluídas em uma sessão
127
+ - Ordene as tarefas por dependência (o que precisa ser feito primeiro?)
128
128
 
129
129
  Example:
130
130
  ```
@@ -139,8 +139,8 @@ artifacts:
139
139
  - [ ] 2.2 Add CSV formatting utilities
140
140
  ```
141
141
 
142
- Reference specs for what needs to be built, design for how to build it.
143
- Each task should be verifiable - you know when it's done.
142
+ Referencie as specs para o que precisa ser construído e o design para como construir.
143
+ Cada tarefa deve ser verificável - você sabe quando ela está concluída.
144
144
  requires:
145
145
  - specs
146
146
  - design
@@ -149,5 +149,5 @@ apply:
149
149
  requires: [tasks]
150
150
  tracks: tasks.md
151
151
  instruction: |
152
- Read context files, work through pending tasks, mark complete as you go.
153
- Pause if you hit blockers or need clarification.
152
+ Leia os arquivos de contexto, execute as tarefas pendentes e marque como concluídas conforme avança.
153
+ Pause se encontrar bloqueios ou precisar de esclarecimentos.