@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.
- package/README.md +11 -2
- package/README.pt-BR.md +11 -2
- package/dist/commands/config.js +4 -0
- package/dist/commands/schema.js +21 -21
- package/dist/core/completions/installers/zsh-installer.d.ts +0 -8
- package/dist/core/completions/installers/zsh-installer.js +3 -31
- package/dist/core/config.js +3 -2
- package/dist/core/global-config.d.ts +6 -1
- package/dist/core/global-config.js +15 -16
- package/dist/core/parsers/requirement-blocks.js +5 -5
- package/dist/core/parsers/spec-structure.js +1 -1
- package/dist/core/profile-sync-drift.js +1 -0
- package/dist/core/profiles.d.ts +2 -2
- package/dist/core/profiles.js +2 -1
- package/dist/core/shared/skill-generation.js +3 -1
- package/dist/core/shared/tool-detection.d.ts +2 -2
- package/dist/core/shared/tool-detection.js +2 -0
- package/dist/core/specs-apply.js +1 -1
- package/dist/core/templates/skill-templates.d.ts +1 -1
- package/dist/core/templates/skill-templates.js +1 -1
- package/dist/core/templates/workflows/code-review.d.ts +10 -0
- package/dist/core/templates/workflows/code-review.js +21 -0
- package/dist/core/templates/workflows/sync-specs.js +2 -2
- package/dist/core/tools-manager.js +1 -0
- package/dist/core/update.d.ts +6 -0
- package/dist/core/update.js +21 -0
- package/dist/core/validation/validator.js +2 -2
- package/dist/messages/index.d.ts +34 -2
- package/dist/messages/index.js +182 -12
- package/package.json +1 -1
- package/schemas/spec-driven/schema.yaml +78 -78
- package/schemas/spec-driven/templates/design.md +5 -5
- package/schemas/spec-driven/templates/proposal.md +9 -9
- package/schemas/spec-driven/templates/spec.md +5 -5
- package/schemas/spec-driven/templates/tasks.md +6 -6
- package/dist/core/templates/workflows/upstream-sync.d.ts +0 -10
- package/dist/core/templates/workflows/upstream-sync.js +0 -116
package/dist/core/update.js
CHANGED
|
@@ -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) {
|
package/dist/messages/index.d.ts
CHANGED
|
@@ -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
|
};
|
package/dist/messages/index.js
CHANGED
|
@@ -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) =>
|
|
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) =>
|
|
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
|
-
##
|
|
1360
|
+
## Why
|
|
1325
1361
|
|
|
1326
1362
|
[1-2 frases explicando o problema/oportunidade]
|
|
1327
1363
|
|
|
1328
|
-
##
|
|
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
|
-
##
|
|
1428
|
+
## ADDED Requirements
|
|
1393
1429
|
|
|
1394
|
-
###
|
|
1430
|
+
### Requirement: <Nome>
|
|
1395
1431
|
|
|
1396
|
-
<
|
|
1432
|
+
O sistema SHALL <descrição do que o sistema deve fazer>
|
|
1397
1433
|
|
|
1398
|
-
####
|
|
1434
|
+
#### Scenario: <Nome do cenário>
|
|
1399
1435
|
|
|
1400
|
-
- **
|
|
1401
|
-
- **
|
|
1402
|
-
- **
|
|
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 -
|
|
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
|
@@ -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:
|
|
7
|
+
description: Documento de proposta inicial que descreve a mudança
|
|
8
8
|
template: proposal.md
|
|
9
9
|
instruction: |
|
|
10
|
-
|
|
10
|
+
Crie o documento de proposta que estabelece o WHY (por que) esta mudança é necessária.
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
- **Why**: 1-2
|
|
14
|
-
- **What Changes**:
|
|
15
|
-
- **Capabilities**:
|
|
16
|
-
- **New Capabilities**:
|
|
17
|
-
- **Modified Capabilities**:
|
|
18
|
-
- **Impact**:
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
|
|
25
|
-
|
|
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
|
-
|
|
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:
|
|
32
|
+
description: Especificações detalhadas da mudança
|
|
33
33
|
template: spec.md
|
|
34
34
|
instruction: |
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
-
|
|
39
|
-
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
- **ADDED Requirements**:
|
|
43
|
-
- **MODIFIED Requirements**:
|
|
44
|
-
- **REMOVED Requirements**:
|
|
45
|
-
- **RENAMED Requirements**:
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
-
|
|
49
|
-
- Use SHALL/MUST
|
|
50
|
-
-
|
|
51
|
-
- **CRITICAL**:
|
|
52
|
-
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
1.
|
|
56
|
-
2.
|
|
57
|
-
3.
|
|
58
|
-
4.
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
|
|
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:
|
|
87
|
+
description: Documento de design técnico com detalhes de implementação
|
|
88
88
|
template: design.md
|
|
89
89
|
instruction: |
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
-
|
|
94
|
-
-
|
|
95
|
-
-
|
|
96
|
-
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
- **Context**:
|
|
100
|
-
- **Goals / Non-Goals**:
|
|
101
|
-
- **Decisions**:
|
|
102
|
-
- **Risks / Trade-offs**:
|
|
103
|
-
- **Migration Plan**:
|
|
104
|
-
- **Open Questions**:
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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:
|
|
115
|
+
description: Checklist de implementação com tarefas rastreáveis
|
|
116
116
|
template: tasks.md
|
|
117
117
|
instruction: |
|
|
118
|
-
|
|
118
|
+
Crie a lista de tarefas que detalha o trabalho de implementação.
|
|
119
119
|
|
|
120
|
-
**
|
|
121
|
-
checkbox
|
|
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
|
-
|
|
124
|
-
-
|
|
125
|
-
-
|
|
126
|
-
-
|
|
127
|
-
-
|
|
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
|
-
|
|
143
|
-
|
|
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
|
-
|
|
153
|
-
Pause
|
|
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.
|