trackfw 2.9.1 → 2.10.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/package.json +1 -1
- package/src/commands/discover.js +8 -3
- package/src/commands/init.js +3 -0
- package/src/commands/update.js +1 -0
- package/src/generators/init.js +152 -8
package/package.json
CHANGED
package/src/commands/discover.js
CHANGED
|
@@ -61,10 +61,11 @@ function scan(rootDir) {
|
|
|
61
61
|
for (const sub of agentDirs) {
|
|
62
62
|
const wipDir = path.join(roadmapRoot, sub, 'wip');
|
|
63
63
|
const backlogDir = path.join(roadmapRoot, sub, 'backlog');
|
|
64
|
+
const analyzingDir = path.join(roadmapRoot, sub, 'analyzing');
|
|
64
65
|
const doneDir = path.join(roadmapRoot, sub, 'done');
|
|
65
66
|
const abandonedDir = path.join(roadmapRoot, sub, 'abandoned');
|
|
66
67
|
const blockedDir = path.join(roadmapRoot, sub, 'blocked');
|
|
67
|
-
if (isDir(wipDir) || isDir(backlogDir) || isDir(doneDir) || isDir(abandonedDir) || isDir(blockedDir)) {
|
|
68
|
+
if (isDir(wipDir) || isDir(backlogDir) || isDir(analyzingDir) || isDir(doneDir) || isDir(abandonedDir) || isDir(blockedDir)) {
|
|
68
69
|
byAgent = true;
|
|
69
70
|
agents.push(sub);
|
|
70
71
|
}
|
|
@@ -73,13 +74,13 @@ function scan(rootDir) {
|
|
|
73
74
|
r.roadmapNamespacing = 'by_agent';
|
|
74
75
|
r.agents = agents;
|
|
75
76
|
for (const agent of agents) {
|
|
76
|
-
for (const state of ['backlog', 'wip', 'blocked', 'done', 'abandoned']) {
|
|
77
|
+
for (const state of ['backlog', 'analyzing', 'wip', 'blocked', 'done', 'abandoned']) {
|
|
77
78
|
r.roadmapCount += countMD(path.join(roadmapRoot, agent, state));
|
|
78
79
|
}
|
|
79
80
|
}
|
|
80
81
|
} else {
|
|
81
82
|
r.roadmapNamespacing = 'flat';
|
|
82
|
-
for (const state of ['backlog', 'wip', 'blocked', 'done', 'abandoned']) {
|
|
83
|
+
for (const state of ['backlog', 'analyzing', 'wip', 'blocked', 'done', 'abandoned']) {
|
|
83
84
|
r.roadmapCount += countMD(path.join(roadmapRoot, state));
|
|
84
85
|
}
|
|
85
86
|
}
|
|
@@ -395,6 +396,10 @@ cmd.action((opts) => {
|
|
|
395
396
|
} catch (e) {
|
|
396
397
|
console.log(`⚠ agent rules inject partial: ${e.message}`);
|
|
397
398
|
}
|
|
399
|
+
try {
|
|
400
|
+
const generators = require('../generators/init')
|
|
401
|
+
generators.printArchitectNextSteps(cwd)
|
|
402
|
+
} catch (e) {}
|
|
398
403
|
}
|
|
399
404
|
}
|
|
400
405
|
|
package/src/commands/init.js
CHANGED
|
@@ -21,6 +21,7 @@ cmd.action(async () => {
|
|
|
21
21
|
}
|
|
22
22
|
await generators.scaffold(cfg)
|
|
23
23
|
console.log(`\n${t('init.success')}`)
|
|
24
|
+
require('../generators/init').printArchitectNextSteps(process.cwd())
|
|
24
25
|
return
|
|
25
26
|
}
|
|
26
27
|
|
|
@@ -160,6 +161,7 @@ cmd.action(async () => {
|
|
|
160
161
|
}
|
|
161
162
|
await generators.scaffold(cfg)
|
|
162
163
|
console.log(`\n${t('init.success')}`)
|
|
164
|
+
require('../generators/init').printArchitectNextSteps(process.cwd())
|
|
163
165
|
return
|
|
164
166
|
}
|
|
165
167
|
|
|
@@ -178,6 +180,7 @@ cmd.action(async () => {
|
|
|
178
180
|
}
|
|
179
181
|
|
|
180
182
|
console.log(`\n${t('init.success')}`)
|
|
183
|
+
require('../generators/init').printArchitectNextSteps(process.cwd())
|
|
181
184
|
})
|
|
182
185
|
|
|
183
186
|
module.exports = cmd
|
package/src/commands/update.js
CHANGED
package/src/generators/init.js
CHANGED
|
@@ -8,6 +8,7 @@ const GOV_DIRS = [
|
|
|
8
8
|
'docs/adr',
|
|
9
9
|
'docs/req',
|
|
10
10
|
'docs/roadmaps/backlog',
|
|
11
|
+
'docs/roadmaps/analyzing',
|
|
11
12
|
'docs/roadmaps/wip',
|
|
12
13
|
'docs/roadmaps/blocked',
|
|
13
14
|
'docs/roadmaps/done',
|
|
@@ -333,18 +334,31 @@ function trackfwRulesBlock() {
|
|
|
333
334
|
## trackfw — Governance Rules
|
|
334
335
|
|
|
335
336
|
This project uses **trackfw** for AI-native delivery governance.
|
|
336
|
-
Chain: \`ADR → REQ → ROADMAP\` · States: \`backlog / wip / blocked / done / abandoned\`
|
|
337
|
+
Chain: \`ADR → REQ → ROADMAP\` · States: \`backlog / analyzing / wip / blocked / done / abandoned\`
|
|
338
|
+
|
|
339
|
+
\`\`\`
|
|
340
|
+
backlog → roadmaps aguardando execução
|
|
341
|
+
analyzing → roadmap em análise/validação pré-wip
|
|
342
|
+
wip → roadmap em execução ativa (máximo 1)
|
|
343
|
+
blocked → impedido por dependência ou decisão
|
|
344
|
+
done → concluído e validado
|
|
345
|
+
abandoned → descontinuado ou superado
|
|
346
|
+
\`\`\`
|
|
337
347
|
|
|
338
348
|
### Agent Protocol
|
|
339
349
|
1. **Before starting:** run \`trackfw context\` · read \`docs/agents-working-context.md\`
|
|
340
350
|
2. **After finishing:** update \`docs/agents-working-context.md\` with what changed
|
|
341
351
|
3. **Before PR:** \`trackfw validate\` must pass
|
|
352
|
+
4. **Ciclo de vida do ML — obrigatório:**
|
|
353
|
+
- Ao **iniciar** um ML: edite o roadmap alterando \`**Status:** ⬜ Pendente\` → \`**Status:** 🔄 Em andamento\` e faça commit do roadmap.
|
|
354
|
+
- Ao **concluir** um ML: edite o roadmap alterando \`**Status:** 🔄 Em andamento\` → \`**Status:** ✅ Concluído\` e inclua essa mudança no commit do ML.
|
|
355
|
+
- Ao **analisar** um roadmap antes de iniciar: mova o arquivo de \`backlog/\` para \`analyzing/\`; só mova para \`wip/\` ao começar a codificar de fato.
|
|
342
356
|
|
|
343
357
|
### Key Commands
|
|
344
358
|
- \`trackfw context\` — current governance state (always run first)
|
|
345
359
|
- \`trackfw status\` — all artifacts and states
|
|
346
360
|
- \`trackfw validate\` — governance consistency check
|
|
347
|
-
- \`trackfw roadmap move <name> <state>\` — transition roadmap state
|
|
361
|
+
- \`trackfw roadmap move <name> <state>\` — transition roadmap state (\`backlog\`, \`analyzing\`, \`wip\`, \`blocked\`, \`done\`, \`abandoned\`)
|
|
348
362
|
- \`trackfw serve\` — live Kanban board at http://localhost:4080
|
|
349
363
|
|
|
350
364
|
### Attention Signal (when you need user input during a task)
|
|
@@ -353,7 +367,18 @@ Write \`docs/roadmaps/.trackfw-attention.json\`:
|
|
|
353
367
|
{"roadmap":"file.md","ml":"ML-1A","message":"what you need","level":"action_required","timestamp":"ISO8601Z"}
|
|
354
368
|
\`\`\`
|
|
355
369
|
Delete the file when resolved. Visible as a live banner in \`trackfw serve\`.
|
|
356
|
-
` +
|
|
370
|
+
` +
|
|
371
|
+
'\n### Architecture Directives (mandatory)\n' +
|
|
372
|
+
'- **3-layer separation:** frontend / backend / database — never mix concerns\n' +
|
|
373
|
+
'- **No in-memory data:** always database + ORM (never arrays/globals for persistence)\n' +
|
|
374
|
+
'- **Auth from day 1:** never defer — refactoring auth later is very costly\n' +
|
|
375
|
+
'- **Docker + .env from day 1:** containerize early; all config via env vars\n' +
|
|
376
|
+
'- **2-layer validation:** frontend (UX) + backend (security) — never only one\n' +
|
|
377
|
+
'- **API-first:** define OpenAPI contract before coding frontend/backend integration\n' +
|
|
378
|
+
'- **Security wave:** include a red-team review wave in every feature roadmap\n' +
|
|
379
|
+
'- **Test coverage:** TDD for critical logic; min 60% (prototype) / 80% (production)\n' +
|
|
380
|
+
'- Use `/trackfw:architect` to define stack before the first REQ\n' +
|
|
381
|
+
RULES_END
|
|
357
382
|
}
|
|
358
383
|
|
|
359
384
|
/**
|
|
@@ -446,14 +471,17 @@ function generateClaudeMD(cfg) {
|
|
|
446
471
|
content += '<!-- Describe what this project does in 2-3 sentences. -->\n\n'
|
|
447
472
|
|
|
448
473
|
content += '## Governance chain\n\n'
|
|
449
|
-
content += '```\nADR → REQ → ROADMAP → backlog / wip / blocked / done / abandoned\n```\n\n'
|
|
474
|
+
content += '```\nADR → REQ → ROADMAP → backlog / analyzing / wip / blocked / done / abandoned\n```\n\n'
|
|
450
475
|
|
|
451
476
|
content += '## Agent rules (mandatory)\n\n'
|
|
452
477
|
content += 'These rules apply to every agent or AI assistant working in this project:\n\n'
|
|
453
478
|
content += '1. **Never start coding without a REQ and a ROADMAP.** If none exists, create them first.\n'
|
|
454
479
|
content += '2. **Use `/trackfw:implement <req-slug>` to start any implementation.** This skill orchestrates the full flow automatically: finds or generates the roadmap, moves it to `wip/`, executes each ML, updates the roadmap, and moves to `done/`.\n'
|
|
455
480
|
content += '3. **Only one roadmap in `wip/` at a time.** Before starting a new one, complete or move to `blocked/` the current one.\n'
|
|
456
|
-
content += '4. **
|
|
481
|
+
content += '4. **Ciclo de vida do ML — obrigatório:**\n'
|
|
482
|
+
content += ' - Ao **iniciar** um ML: edite o roadmap alterando `**Status:** ⬜ Pendente` → `**Status:** 🔄 Em andamento` e faça commit do roadmap.\n'
|
|
483
|
+
content += ' - Ao **concluir** um ML: edite o roadmap alterando `**Status:** 🔄 Em andamento` → `**Status:** ✅ Concluído` e inclua essa mudança no commit do ML.\n'
|
|
484
|
+
content += ' - Ao **analisar** um roadmap antes de iniciar: mova o arquivo de `backlog/` para `analyzing/`; só mova para `wip/` ao começar a codificar de fato.\n'
|
|
457
485
|
content += '5. **Run `trackfw validate` before every commit.** Zero violations required.\n'
|
|
458
486
|
content += '6. **ADRs before decisions.** Any architectural or technical decision must have an ADR (`/trackfw:adr`).\n\n'
|
|
459
487
|
|
|
@@ -635,9 +663,9 @@ trackfw não está instalado. Instale com uma das opções:
|
|
|
635
663
|
|
|
636
664
|
O formato esperado é: \`<nome-do-roadmap> <estado>\`
|
|
637
665
|
|
|
638
|
-
Estados válidos: \`backlog\`, \`wip\`, \`blocked\`, \`done\`, \`abandoned\`
|
|
666
|
+
Estados válidos: \`backlog\`, \`analyzing\`, \`wip\`, \`blocked\`, \`done\`, \`abandoned\`
|
|
639
667
|
|
|
640
|
-
Exemplo: \`/trackfw:move meu-roadmap
|
|
668
|
+
Exemplo: \`/trackfw:move meu-roadmap analyzing\`
|
|
641
669
|
|
|
642
670
|
Se o comando falhar com \`trackfw: command not found\` ou similar, informe ao usuário:
|
|
643
671
|
trackfw não está instalado. Instale com:
|
|
@@ -808,6 +836,92 @@ git commit -m "docs(trackfw): roadmap <nome> → done"
|
|
|
808
836
|
✅ Implementação concluída.
|
|
809
837
|
Roadmap: docs/roadmaps/done/<nome>.md
|
|
810
838
|
Próximo passo: abrir PR com gh pr create
|
|
839
|
+
\`\`\``,
|
|
840
|
+
|
|
841
|
+
'architect.md': `Você é o guia de arquitetura do trackfw. Ajude o usuário a escolher a stack correta e arquitetar a aplicação em linguagem simples, acessível para times não técnicos.
|
|
842
|
+
|
|
843
|
+
## Passo 1 — Descoberta de Negócio
|
|
844
|
+
|
|
845
|
+
Faça ao usuário as seguintes perguntas em linguagem simples, uma por vez:
|
|
846
|
+
|
|
847
|
+
1. "O que sua aplicação vai fazer? Descreva em 2-3 frases como se fosse explicar para alguém de fora da TI."
|
|
848
|
+
2. "Quantas pessoas vão usar esse sistema simultaneamente? (< 10 pessoas / 10-100 pessoas / > 100 pessoas)"
|
|
849
|
+
3. "Esse sistema vai para produção de verdade ou é um protótipo para validar uma ideia?"
|
|
850
|
+
4. "Você precisa de login/autenticação de usuários? (Sim / Não / Não sei)"
|
|
851
|
+
5. "Tem alguma restrição de tecnologia ou preferência da empresa? (ex: só Java, só Microsoft, etc.)"
|
|
852
|
+
|
|
853
|
+
---
|
|
854
|
+
|
|
855
|
+
## Passo 2 — Recomendação de Stack
|
|
856
|
+
|
|
857
|
+
Com base nas respostas, escolha **UM** dos combos pré-validados:
|
|
858
|
+
|
|
859
|
+
### Combo A — Protótipo Rápido
|
|
860
|
+
**Quando usar:** prototipagem, validação de ideia, até ~10 usuários, sem pressão de produção.
|
|
861
|
+
- **Frontend:** React + Vite
|
|
862
|
+
- **Backend:** FastAPI (Python) ou Express (Node.js)
|
|
863
|
+
- **Banco:** SQLite + SQLAlchemy / Prisma
|
|
864
|
+
- **Auth:** JWT simples quando necessário
|
|
865
|
+
- **Docker:** Dockerfile básico para o backend
|
|
866
|
+
|
|
867
|
+
### Combo B — Sistema Pequeno/Médio em Produção
|
|
868
|
+
**Quando usar:** sistema real, 10-100 usuários, robustez e manutenibilidade.
|
|
869
|
+
- **Frontend:** Next.js (SSR + rotas prontas)
|
|
870
|
+
- **Backend:** FastAPI (Python) ou NestJS (Node.js)
|
|
871
|
+
- **Banco:** PostgreSQL + ORM (SQLAlchemy / Prisma / TypeORM)
|
|
872
|
+
- **Auth:** OAuth2 com JWT (Supabase Auth ou Auth0)
|
|
873
|
+
- **Docker:** docker-compose com frontend + backend + banco
|
|
874
|
+
|
|
875
|
+
### Combo C — Enterprise / Java
|
|
876
|
+
**Quando usar:** integração com sistemas corporativos, > 100 usuários, exigência de Java.
|
|
877
|
+
- **Frontend:** Angular
|
|
878
|
+
- **Backend:** Spring Boot
|
|
879
|
+
- **Banco:** PostgreSQL + Hibernate
|
|
880
|
+
- **Auth:** Spring Security + OAuth2 (Keycloak ou Azure AD)
|
|
881
|
+
- **Docker:** docker-compose com todos os serviços
|
|
882
|
+
|
|
883
|
+
Apresente o combo recomendado com explicação simples do motivo.
|
|
884
|
+
|
|
885
|
+
---
|
|
886
|
+
|
|
887
|
+
## Passo 3 — Arquitetura em Camadas (explicação simples)
|
|
888
|
+
|
|
889
|
+
Explique a arquitetura com uma metáfora de negócio:
|
|
890
|
+
|
|
891
|
+
"Pense na aplicação como um restaurante:
|
|
892
|
+
- **Frontend** = o salão: o que o cliente vê e interage
|
|
893
|
+
- **Backend** = a cozinha: onde as regras de negócio acontecem, nunca exposta diretamente
|
|
894
|
+
- **Banco de dados** = a despensa: onde os dados ficam guardados, acessada só pela cozinha"
|
|
895
|
+
|
|
896
|
+
Reforce as regras obrigatórias:
|
|
897
|
+
- **Nunca dados em memória** (arrays, variáveis globais): sempre banco + ORM
|
|
898
|
+
- **Docker + .env desde o dia 1**: facilita deploys e evita problemas de ambiente
|
|
899
|
+
- **Auth desde o início**: nunca deixe para depois — refatorar auth é muito custoso
|
|
900
|
+
- **Validação em 2 camadas**: frontend (UX) + backend (segurança)
|
|
901
|
+
- **API-first**: defina o contrato OpenAPI antes de codar frontend e backend juntos
|
|
902
|
+
- **Red team wave**: reserve 1 wave de segurança no roadmap para revisar vulnerabilidades
|
|
903
|
+
- **Cobertura mínima de testes**: 60% (protótipo) / 80% (produção)
|
|
904
|
+
|
|
905
|
+
---
|
|
906
|
+
|
|
907
|
+
## Passo 4 — Gerar o ADR de Stack
|
|
908
|
+
|
|
909
|
+
Execute \`/trackfw:adr\` com o título: \`"Stack e arquitetura em camadas — [nome do projeto]"\`
|
|
910
|
+
|
|
911
|
+
O ADR deve registrar a stack escolhida (combo e componentes), motivação baseada nas respostas, alternativas descartadas e princípios de arquitetura adotados.
|
|
912
|
+
|
|
913
|
+
---
|
|
914
|
+
|
|
915
|
+
## Passo 5 — Próximos Passos
|
|
916
|
+
|
|
917
|
+
Oriente o usuário:
|
|
918
|
+
|
|
919
|
+
\`\`\`
|
|
920
|
+
✅ Stack definida. Próximos passos:
|
|
921
|
+
|
|
922
|
+
1. Crie a REQ da primeira feature com /trackfw:req
|
|
923
|
+
2. Gere o roadmap em microlotes com /trackfw:roadmap
|
|
924
|
+
3. Inicie a implementação com /trackfw:implement
|
|
811
925
|
\`\`\``,
|
|
812
926
|
}
|
|
813
927
|
|
|
@@ -901,7 +1015,8 @@ function generateClaudeCommandsForce(rootDir) {
|
|
|
901
1015
|
'req.md': `Execute o seguinte comando bash: \`trackfw req new "$ARGUMENTS"\`\n\nSe o comando falhar com \`trackfw: command not found\` ou similar, informe ao usuário:\n\n\`\`\`\ntrackfw não está instalado. Instale com uma das opções:\n\n curl -sSfL https://github.com/kgsaran/trackfw/releases/latest/download/install.sh | sh\n npm install -g trackfw\n pip install trackfw\n\`\`\``,
|
|
902
1016
|
'validate.md': `Execute o seguinte comando bash: \`trackfw validate\`\n\nSe o comando falhar com \`trackfw: command not found\` ou similar, informe ao usuário:\n\n\`\`\`\ntrackfw não está instalado. Instale com uma das opções:\n\n curl -sSfL https://github.com/kgsaran/trackfw/releases/latest/download/install.sh | sh\n npm install -g trackfw\n pip install trackfw\n\`\`\``,
|
|
903
1017
|
'status.md': `Execute o seguinte comando bash: \`trackfw status\`\n\nSe o comando falhar com \`trackfw: command not found\` ou similar, informe ao usuário:\n\n\`\`\`\ntrackfw não está instalado. Instale com uma das opções:\n\n curl -sSfL https://github.com/kgsaran/trackfw/releases/latest/download/install.sh | sh\n npm install -g trackfw\n pip install trackfw\n\`\`\``,
|
|
904
|
-
'move.md': `Execute o seguinte comando bash: \`trackfw roadmap move $ARGUMENTS\`\n\nO formato esperado é: \`<nome-do-roadmap> <estado>\`\nEstados válidos: \`backlog\`, \`wip\`, \`blocked\`, \`done\`, \`abandoned\`\n\nSe o comando falhar, instale trackfw com:\n curl -sSfL https://github.com/kgsaran/trackfw/releases/latest/download/install.sh | sh`,
|
|
1018
|
+
'move.md': `Execute o seguinte comando bash: \`trackfw roadmap move $ARGUMENTS\`\n\nO formato esperado é: \`<nome-do-roadmap> <estado>\`\nEstados válidos: \`backlog\`, \`analyzing\`, \`wip\`, \`blocked\`, \`done\`, \`abandoned\`\n\nSe o comando falhar, instale trackfw com:\n curl -sSfL https://github.com/kgsaran/trackfw/releases/latest/download/install.sh | sh`,
|
|
1019
|
+
'architect.md': `Você é o guia de arquitetura do trackfw. Ajude o usuário a escolher a stack correta e arquitetar a aplicação em linguagem simples, acessível para times não técnicos.\n\n## Passo 1 — Descoberta de Negócio\n\nFaça ao usuário as seguintes perguntas em linguagem simples, uma por vez:\n\n1. "O que sua aplicação vai fazer? Descreva em 2-3 frases como se fosse explicar para alguém de fora da TI."\n2. "Quantas pessoas vão usar esse sistema simultaneamente? (< 10 pessoas / 10-100 pessoas / > 100 pessoas)"\n3. "Esse sistema vai para produção de verdade ou é um protótipo para validar uma ideia?"\n4. "Você precisa de login/autenticação de usuários? (Sim / Não / Não sei)"\n5. "Tem alguma restrição de tecnologia ou preferência da empresa? (ex: só Java, só Microsoft, etc.)"\n\n---\n\n## Passo 2 — Recomendação de Stack\n\nCom base nas respostas, escolha **UM** dos combos pré-validados:\n\n### Combo A — Protótipo Rápido\n**Quando usar:** prototipagem, validação de ideia, até ~10 usuários, sem pressão de produção.\n- **Frontend:** React + Vite\n- **Backend:** FastAPI (Python) ou Express (Node.js)\n- **Banco:** SQLite + SQLAlchemy / Prisma\n- **Auth:** JWT simples quando necessário\n- **Docker:** Dockerfile básico para o backend\n\n### Combo B — Sistema Pequeno/Médio em Produção\n**Quando usar:** sistema real, 10-100 usuários, robustez e manutenibilidade.\n- **Frontend:** Next.js (SSR + rotas prontas)\n- **Backend:** FastAPI (Python) ou NestJS (Node.js)\n- **Banco:** PostgreSQL + ORM (SQLAlchemy / Prisma / TypeORM)\n- **Auth:** OAuth2 com JWT (Supabase Auth ou Auth0)\n- **Docker:** docker-compose com frontend + backend + banco\n\n### Combo C — Enterprise / Java\n**Quando usar:** integração com sistemas corporativos, > 100 usuários, exigência de Java.\n- **Frontend:** Angular\n- **Backend:** Spring Boot\n- **Banco:** PostgreSQL + Hibernate\n- **Auth:** Spring Security + OAuth2 (Keycloak ou Azure AD)\n- **Docker:** docker-compose com todos os serviços\n\nApresente o combo recomendado com explicação simples do motivo.\n\n---\n\n## Passo 3 — Arquitetura em Camadas (explicação simples)\n\nExplique a arquitetura com uma metáfora de negócio:\n\n"Pense na aplicação como um restaurante:\n- **Frontend** = o salão: o que o cliente vê e interage\n- **Backend** = a cozinha: onde as regras de negócio acontecem, nunca exposta diretamente\n- **Banco de dados** = a despensa: onde os dados ficam guardados, acessada só pela cozinha"\n\nReforce as regras obrigatórias:\n- **Nunca dados em memória** (arrays, variáveis globais): sempre banco + ORM\n- **Docker + .env desde o dia 1**: facilita deploys e evita problemas de ambiente\n- **Auth desde o início**: nunca deixe para depois — refatorar auth é muito custoso\n- **Validação em 2 camadas**: frontend (UX) + backend (segurança)\n- **API-first**: defina o contrato OpenAPI antes de codar frontend e backend juntos\n- **Red team wave**: reserve 1 wave de segurança no roadmap para revisar vulnerabilidades\n- **Cobertura mínima de testes**: 60% (protótipo) / 80% (produção)\n\n---\n\n## Passo 4 — Gerar o ADR de Stack\n\nExecute \`/trackfw:adr\` com o título: \`"Stack e arquitetura em camadas — [nome do projeto]"\`\n\nO ADR deve registrar a stack escolhida (combo e componentes), motivação baseada nas respostas, alternativas descartadas e princípios de arquitetura adotados.\n\n---\n\n## Passo 5 — Próximos Passos\n\nOriente o usuário:\n\n\`\`\`\n✅ Stack definida. Próximos passos:\n\n1. Crie a REQ da primeira feature com /trackfw:req\n2. Gere o roadmap em microlotes com /trackfw:roadmap\n3. Inicie a implementação com /trackfw:implement\n\`\`\``,
|
|
905
1020
|
}
|
|
906
1021
|
|
|
907
1022
|
for (const [filename, content] of Object.entries(commands)) {
|
|
@@ -948,6 +1063,34 @@ Cadeia: **ADR → REQ → ROADMAP** · Estados: \`backlog / wip / blocked / done
|
|
|
948
1063
|
console.log(` ✓ skill global atualizada em ${dest}`)
|
|
949
1064
|
}
|
|
950
1065
|
|
|
1066
|
+
function printArchitectNextSteps(cwd) {
|
|
1067
|
+
const candidates = [
|
|
1068
|
+
{ file: 'CLAUDE.md', cmd: 'claude' },
|
|
1069
|
+
{ file: '.cursor/rules/trackfw.mdc', cmd: 'cursor .' },
|
|
1070
|
+
{ file: '.windsurfrules', cmd: 'windsurf .' },
|
|
1071
|
+
{ file: '.github/copilot-instructions.md', cmd: 'code . (Copilot)' },
|
|
1072
|
+
{ file: '.amazonq/developer/guidelines.md', cmd: 'code . (Amazon Q)' },
|
|
1073
|
+
{ file: 'GEMINI.md', cmd: 'gemini' },
|
|
1074
|
+
{ file: 'AGENTS.md', cmd: 'codex' },
|
|
1075
|
+
]
|
|
1076
|
+
|
|
1077
|
+
const detected = candidates.filter(t => {
|
|
1078
|
+
try { return fs.existsSync(path.join(cwd, t.file)) } catch { return false }
|
|
1079
|
+
})
|
|
1080
|
+
|
|
1081
|
+
const tools = detected.length > 0 ? detected : [{ cmd: 'claude' }]
|
|
1082
|
+
|
|
1083
|
+
console.log()
|
|
1084
|
+
console.log('Próximo passo — inicie com o guia de arquitetura:')
|
|
1085
|
+
console.log()
|
|
1086
|
+
for (const t of tools) {
|
|
1087
|
+
console.log(` ${t.cmd}`)
|
|
1088
|
+
}
|
|
1089
|
+
console.log()
|
|
1090
|
+
console.log(' Execute /trackfw:architect no chat do seu assistente de IA.')
|
|
1091
|
+
console.log()
|
|
1092
|
+
}
|
|
1093
|
+
|
|
951
1094
|
module.exports = {
|
|
952
1095
|
GOV_DIRS,
|
|
953
1096
|
scaffold,
|
|
@@ -969,4 +1112,5 @@ module.exports = {
|
|
|
969
1112
|
injectRulesForTool,
|
|
970
1113
|
injectRulesDetected,
|
|
971
1114
|
trackfwRulesBlock,
|
|
1115
|
+
printArchitectNextSteps,
|
|
972
1116
|
}
|