trackfw 2.9.1 → 2.11.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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trackfw",
3
- "version": "2.9.1",
3
+ "version": "2.11.0",
4
4
  "description": "CLI de governança para entrega de software: ADR → REQ → ROADMAP → kanban. Suporte nativo a agentes de IA (Claude Code, Gemini CLI, Cursor).",
5
5
  "keywords": [
6
6
  "cli",
@@ -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
 
@@ -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
@@ -110,6 +110,7 @@ cmd.action(() => {
110
110
  }
111
111
 
112
112
  console.log('\n✓ trackfw update concluído');
113
+ require('../generators/init').printArchitectNextSteps(process.cwd())
113
114
  });
114
115
 
115
116
  module.exports = cmd;
@@ -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,19 +334,16 @@ 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\`
337
338
 
338
339
  ### Agent Protocol
339
340
  1. **Before starting:** run \`trackfw context\` · read \`docs/agents-working-context.md\`
340
341
  2. **After finishing:** update \`docs/agents-working-context.md\` with what changed
341
342
  3. **Before PR:** \`trackfw validate\` must pass
342
-
343
- ### Key Commands
344
- - \`trackfw context\` — current governance state (always run first)
345
- - \`trackfw status\` — all artifacts and states
346
- - \`trackfw validate\` — governance consistency check
347
- - \`trackfw roadmap move <name> <state>\` — transition roadmap state
348
- - \`trackfw serve\` — live Kanban board at http://localhost:4080
343
+ 4. **ML lifecycle — mandatory:**
344
+ - Starting a ML: edit roadmap \`**Status:** ⬜ Pendente\` → \`**Status:** 🔄 Em andamento\` + commit.
345
+ - Completing a ML: edit roadmap → \`**Status:** ✅ Concluído\` + include in ML commit.
346
+ - Analyzing a roadmap: move from \`backlog/\` to \`analyzing/\`; to \`wip/\` only when coding starts.
349
347
 
350
348
  ### Attention Signal (when you need user input during a task)
351
349
  Write \`docs/roadmaps/.trackfw-attention.json\`:
@@ -353,7 +351,14 @@ Write \`docs/roadmaps/.trackfw-attention.json\`:
353
351
  {"roadmap":"file.md","ml":"ML-1A","message":"what you need","level":"action_required","timestamp":"ISO8601Z"}
354
352
  \`\`\`
355
353
  Delete the file when resolved. Visible as a live banner in \`trackfw serve\`.
356
- ` + RULES_END
354
+ ` +
355
+ '\n### Architecture Directives (mandatory)\n' +
356
+ '- **3-layer arch + no in-memory data:** frontend / backend / database; always DB + ORM — never arrays/globals\n' +
357
+ '- **Auth + Docker + .env from day 1:** never defer auth; containerize early; all config via env vars\n' +
358
+ '- **2-layer validation + API-first:** frontend (UX) + backend (security); define OpenAPI contract first\n' +
359
+ '- **Security wave + test coverage:** red-team review in every roadmap; TDD for critical; min 60%/80%\n' +
360
+ '- Use `/trackfw:architect` to define stack before the first REQ\n' +
361
+ RULES_END
357
362
  }
358
363
 
359
364
  /**
@@ -446,14 +451,17 @@ function generateClaudeMD(cfg) {
446
451
  content += '<!-- Describe what this project does in 2-3 sentences. -->\n\n'
447
452
 
448
453
  content += '## Governance chain\n\n'
449
- content += '```\nADR → REQ → ROADMAP → backlog / wip / blocked / done / abandoned\n```\n\n'
454
+ content += '```\nADR → REQ → ROADMAP → backlog / analyzing / wip / blocked / done / abandoned\n```\n\n'
450
455
 
451
456
  content += '## Agent rules (mandatory)\n\n'
452
457
  content += 'These rules apply to every agent or AI assistant working in this project:\n\n'
453
458
  content += '1. **Never start coding without a REQ and a ROADMAP.** If none exists, create them first.\n'
454
459
  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
460
  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. **Update the roadmap after every ML.** Mark completed MLs as `✅ Concluído` in the roadmap file before moving to the next.\n'
461
+ content += '4. **Ciclo de vida do ML — obrigatório:**\n'
462
+ content += ' - Ao **iniciar** um ML: edite o roadmap alterando `**Status:** ⬜ Pendente` → `**Status:** 🔄 Em andamento` e faça commit do roadmap.\n'
463
+ 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'
464
+ 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
465
  content += '5. **Run `trackfw validate` before every commit.** Zero violations required.\n'
458
466
  content += '6. **ADRs before decisions.** Any architectural or technical decision must have an ADR (`/trackfw:adr`).\n\n'
459
467
 
@@ -635,9 +643,9 @@ trackfw não está instalado. Instale com uma das opções:
635
643
 
636
644
  O formato esperado é: \`<nome-do-roadmap> <estado>\`
637
645
 
638
- Estados válidos: \`backlog\`, \`wip\`, \`blocked\`, \`done\`, \`abandoned\`
646
+ Estados válidos: \`backlog\`, \`analyzing\`, \`wip\`, \`blocked\`, \`done\`, \`abandoned\`
639
647
 
640
- Exemplo: \`/trackfw:move meu-roadmap wip\`
648
+ Exemplo: \`/trackfw:move meu-roadmap analyzing\`
641
649
 
642
650
  Se o comando falhar com \`trackfw: command not found\` ou similar, informe ao usuário:
643
651
  trackfw não está instalado. Instale com:
@@ -808,6 +816,85 @@ git commit -m "docs(trackfw): roadmap <nome> → done"
808
816
  ✅ Implementação concluída.
809
817
  Roadmap: docs/roadmaps/done/<nome>.md
810
818
  Próximo passo: abrir PR com gh pr create
819
+ \`\`\``,
820
+
821
+ '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.
822
+
823
+ ## Passo 1 — Descoberta de Negócio
824
+
825
+ Faça ao usuário as seguintes perguntas em linguagem simples, uma por vez:
826
+
827
+ 1. "O que sua aplicação vai fazer? Descreva em 2-3 frases como se fosse explicar para alguém de fora da TI."
828
+ 2. "Quantas pessoas vão usar esse sistema simultaneamente? (< 10 pessoas / 10-100 pessoas / > 100 pessoas)"
829
+ 3. "Esse sistema vai para produção de verdade ou é um protótipo para validar uma ideia?"
830
+ 4. "Você precisa de login/autenticação de usuários? (Sim / Não / Não sei)"
831
+ 5. "Tem alguma restrição de tecnologia ou preferência da empresa? (ex: só Java, só Microsoft, etc.)"
832
+
833
+ ---
834
+
835
+ ## Passo 2 — Recomendação de Stack
836
+
837
+ Com base nas respostas, escolha **UM** dos combos pré-validados:
838
+
839
+ ### Combo A — Protótipo Rápido
840
+ **Quando usar:** prototipagem, validação de ideia, até ~10 usuários, sem pressão de produção.
841
+ - **Frontend:** React + Vite
842
+ - **Backend:** FastAPI (Python) ou Express (Node.js)
843
+ - **Banco:** SQLite + SQLAlchemy / Prisma
844
+ - **Auth:** JWT simples quando necessário
845
+ - **Docker:** Dockerfile básico para o backend
846
+
847
+ ### Combo B — Sistema Pequeno/Médio em Produção
848
+ **Quando usar:** sistema real, 10-100 usuários, robustez e manutenibilidade.
849
+ - **Frontend:** Next.js (SSR + rotas prontas)
850
+ - **Backend:** FastAPI (Python) ou NestJS (Node.js)
851
+ - **Banco:** PostgreSQL + ORM (SQLAlchemy / Prisma / TypeORM)
852
+ - **Auth:** OAuth2 com JWT (Supabase Auth ou Auth0)
853
+ - **Docker:** docker-compose com frontend + backend + banco
854
+
855
+ ### Combo C — Enterprise / Java
856
+ **Quando usar:** integração com sistemas corporativos, > 100 usuários, exigência de Java.
857
+ - **Frontend:** Angular
858
+ - **Backend:** Spring Boot
859
+ - **Banco:** PostgreSQL + Hibernate
860
+ - **Auth:** Spring Security + OAuth2 (Keycloak ou Azure AD)
861
+ - **Docker:** docker-compose com todos os serviços
862
+
863
+ Apresente o combo recomendado com explicação simples do motivo.
864
+
865
+ ---
866
+
867
+ ## Passo 3 — Arquitetura em Camadas (explicação simples)
868
+
869
+ Explique a arquitetura com uma metáfora de negócio:
870
+
871
+ "Pense na aplicação como um restaurante:
872
+ - **Frontend** = o salão: o que o cliente vê e interage
873
+ - **Backend** = a cozinha: onde as regras de negócio acontecem, nunca exposta diretamente
874
+ - **Banco de dados** = a despensa: onde os dados ficam guardados, acessada só pela cozinha"
875
+
876
+ Reforce as **Architecture Directives** já injetadas no CLAUDE.md deste projeto: separação em 3 camadas sem dados em memória (sempre DB + ORM), auth + Docker + .env desde o dia 1, validação em 2 camadas, contrato OpenAPI antes de codar, wave de segurança em todo roadmap e cobertura mínima de testes (60% protótipo / 80% produção).
877
+
878
+ ---
879
+
880
+ ## Passo 4 — Gerar o ADR de Stack
881
+
882
+ Execute \`/trackfw:adr\` com o título: \`"Stack e arquitetura em camadas — [nome do projeto]"\`
883
+
884
+ O ADR deve registrar a stack escolhida (combo e componentes), motivação baseada nas respostas, alternativas descartadas e princípios de arquitetura adotados.
885
+
886
+ ---
887
+
888
+ ## Passo 5 — Próximos Passos
889
+
890
+ Oriente o usuário:
891
+
892
+ \`\`\`
893
+ ✅ Stack definida. Próximos passos:
894
+
895
+ 1. Crie a REQ da primeira feature com /trackfw:req
896
+ 2. Gere o roadmap em microlotes com /trackfw:roadmap
897
+ 3. Inicie a implementação com /trackfw:implement
811
898
  \`\`\``,
812
899
  }
813
900
 
@@ -901,7 +988,8 @@ function generateClaudeCommandsForce(rootDir) {
901
988
  '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
989
  '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
990
  '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`,
991
+ '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`,
992
+ '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 **Architecture Directives** já injetadas no CLAUDE.md deste projeto: separação em 3 camadas sem dados em memória (sempre DB + ORM), auth + Docker + .env desde o dia 1, validação em 2 camadas, contrato OpenAPI antes de codar, wave de segurança em todo roadmap e 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
993
  }
906
994
 
907
995
  for (const [filename, content] of Object.entries(commands)) {
@@ -948,6 +1036,34 @@ Cadeia: **ADR → REQ → ROADMAP** · Estados: \`backlog / wip / blocked / done
948
1036
  console.log(` ✓ skill global atualizada em ${dest}`)
949
1037
  }
950
1038
 
1039
+ function printArchitectNextSteps(cwd) {
1040
+ const candidates = [
1041
+ { file: 'CLAUDE.md', cmd: 'claude' },
1042
+ { file: '.cursor/rules/trackfw.mdc', cmd: 'cursor .' },
1043
+ { file: '.windsurfrules', cmd: 'windsurf .' },
1044
+ { file: '.github/copilot-instructions.md', cmd: 'code . (Copilot)' },
1045
+ { file: '.amazonq/developer/guidelines.md', cmd: 'code . (Amazon Q)' },
1046
+ { file: 'GEMINI.md', cmd: 'gemini' },
1047
+ { file: 'AGENTS.md', cmd: 'codex' },
1048
+ ]
1049
+
1050
+ const detected = candidates.filter(t => {
1051
+ try { return fs.existsSync(path.join(cwd, t.file)) } catch { return false }
1052
+ })
1053
+
1054
+ const tools = detected.length > 0 ? detected : [{ cmd: 'claude' }]
1055
+
1056
+ console.log()
1057
+ console.log('Próximo passo — inicie com o guia de arquitetura:')
1058
+ console.log()
1059
+ for (const t of tools) {
1060
+ console.log(` ${t.cmd}`)
1061
+ }
1062
+ console.log()
1063
+ console.log(' Execute /trackfw:architect no chat do seu assistente de IA.')
1064
+ console.log()
1065
+ }
1066
+
951
1067
  module.exports = {
952
1068
  GOV_DIRS,
953
1069
  scaffold,
@@ -969,4 +1085,5 @@ module.exports = {
969
1085
  injectRulesForTool,
970
1086
  injectRulesDetected,
971
1087
  trackfwRulesBlock,
1088
+ printArchitectNextSteps,
972
1089
  }