jarvis-ai-framework 2.1.1 → 3.2.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 (266) hide show
  1. package/AGENTS.md +14 -115
  2. package/agents/AGENTS.md +11 -23
  3. package/agents/README.md +27 -129
  4. package/agents/engineering/data/eng.data-engineer.agent.md +11 -34
  5. package/agents/engineering/eng.advisor.agent.md +56 -0
  6. package/agents/engineering/eng.agent.md +14 -24
  7. package/agents/engineering/eng.bug-hunter.md +7 -15
  8. package/agents/engineering/eng.dev-code-reviewer.md +1 -1
  9. package/agents/engineering/eng.frontend.agent.md +3 -7
  10. package/agents/engineering/eng.rpa.agent.md +2 -8
  11. package/agents/engineering/qa/eng.qa.quality-strategist.md +6 -11
  12. package/agents/engineering/qa/eng.qa.test-architect.md +8 -18
  13. package/agents/engineering/qa/eng.qa.test-planner.md +10 -14
  14. package/agents/engineering/qa/eng.qa.testing-engineer.md +91 -24
  15. package/agents/product/prod.discovery-interviewer.md +3 -3
  16. package/bin/README.md +142 -0
  17. package/bin/commands/docs-publish.js +105 -141
  18. package/bin/commands/docs-sync.js +66 -104
  19. package/bin/commands/info.js +7 -27
  20. package/bin/commands/init.js +23 -51
  21. package/bin/commands/install-rtk.js +9 -3
  22. package/bin/commands/list.js +5 -18
  23. package/bin/commands/map.js +20 -5
  24. package/bin/commands/qa-signoff.js +58 -55
  25. package/bin/commands/tokens.js +14 -17
  26. package/bin/commands/whoami.js +30 -26
  27. package/bin/jarvis.js +9 -163
  28. package/bin/lib/auth/session.js +20 -20
  29. package/bin/lib/cli/program.js +219 -0
  30. package/bin/lib/cli/shared-options.js +29 -0
  31. package/bin/lib/config/constants.js +59 -2
  32. package/bin/lib/config/ide-config.js +4 -8
  33. package/bin/lib/core/profile-filter.js +4 -1
  34. package/bin/lib/core/scanner.js +3 -29
  35. package/bin/lib/core/sync-engine.js +21 -14
  36. package/bin/lib/core/token-report.js +12 -2
  37. package/bin/lib/docs/fetch-file.js +39 -0
  38. package/bin/lib/docs/publish-file.js +194 -0
  39. package/bin/lib/docs/redis-cache.js +49 -0
  40. package/bin/lib/docs/validate-frontmatter.js +9 -39
  41. package/bin/lib/env-loader.js +11 -34
  42. package/bin/lib/flow-map/parse.js +11 -5
  43. package/bin/lib/flow-map/render.js +5 -2
  44. package/bin/lib/flow-map/tree.js +59 -10
  45. package/bin/lib/tasks/comment.js +40 -35
  46. package/bin/lib/utils/frontmatter.js +57 -0
  47. package/bin/lib/utils/git-parser.js +4 -6
  48. package/bin/lib/utils/npmrc-parser.js +6 -13
  49. package/bin/lib/utils/paths.js +2 -4
  50. package/bin/lib/utils/ui.js +3 -9
  51. package/bin/lib/vcs/api.js +25 -41
  52. package/bin/lib/vcs/create-issue.js +49 -33
  53. package/bin/lib/vcs/create-merge.js +47 -31
  54. package/bin/lib/vcs/fetch-raw.js +35 -23
  55. package/package.json +14 -5
  56. package/rules/engineering/eng-rules.md +1 -1
  57. package/rules/engineering/eng-security-rules.md +18 -16
  58. package/rules/engineering/eng.bump-rules.md +3 -2
  59. package/rules/engineering/eng.docs-scraping-rules.md +4 -4
  60. package/rules/engineering/eng.integrations-rules.md +6 -4
  61. package/rules/engineering/eng.skills-rules.md +1 -1
  62. package/rules/engineering/eng.specializations-rules.md +18 -4
  63. package/rules/engineering/frontend/eng.frontend-rules.md +1 -4
  64. package/rules/engineering/qa/eng.qa.cypress-standards-rules.md +1 -1
  65. package/rules/engineering/rpa/eng.rpa-rules.md +4 -9
  66. package/rules-on-demand/engineering/eng.pre-pr-rules.md +1 -1
  67. package/rules-on-demand/engineering/eng.start-rules.md +2 -0
  68. package/skills/AGENTS.md +52 -87
  69. package/skills/SKILLS-ROADMAP.md +47 -128
  70. package/skills/eng-ai/SKILL.md +270 -0
  71. package/skills/eng-ai/references/1-fundamentos-ml.md +24 -0
  72. package/skills/eng-ai/references/10-arquitetura-solucoes-ia.md +24 -0
  73. package/skills/eng-ai/references/11-governanca-ia.md +24 -0
  74. package/skills/eng-ai/references/12-seguranca-ia-responsavel.md +25 -0
  75. package/skills/eng-ai/references/2-matematica-estatistica.md +24 -0
  76. package/skills/eng-ai/references/3-dados-para-ia.md +24 -0
  77. package/skills/eng-ai/references/4-deep-learning-fundacionais.md +24 -0
  78. package/skills/eng-ai/references/5-llms-chatbots-agentes-rag.md +25 -0
  79. package/skills/eng-ai/references/6-avaliacao-experimentacao.md +24 -0
  80. package/skills/eng-ai/references/7-engenharia-sistemas-ia.md +24 -0
  81. package/skills/eng-ai/references/8-mlops-plataforma.md +24 -0
  82. package/skills/eng-ai/references/9-produto-ia.md +24 -0
  83. package/skills/eng-ai/references/especializacoes.md +17 -0
  84. package/skills/eng-automation/SKILL.md +290 -0
  85. package/skills/eng-automation/references/1-fundamentos-automacao.md +25 -0
  86. package/skills/eng-automation/references/10-ingestao-dados.md +25 -0
  87. package/skills/eng-automation/references/11-captcha-antibot.md +25 -0
  88. package/skills/eng-automation/references/12-limites-taxa-sessoes.md +25 -0
  89. package/skills/eng-automation/references/13-agendamento-orquestracao.md +24 -0
  90. package/skills/eng-automation/references/14-retentativa-erros.md +25 -0
  91. package/skills/eng-automation/references/15-autenticacao-credenciais.md +24 -0
  92. package/skills/eng-automation/references/16-observabilidade-confiabilidade.md +24 -0
  93. package/skills/eng-automation/references/2-aquisicao-dados.md +25 -0
  94. package/skills/eng-automation/references/3-automacao-navegador.md +24 -0
  95. package/skills/eng-automation/references/4-scraping-crawling.md +25 -0
  96. package/skills/eng-automation/references/5-apis-rest-graphql-soap.md +26 -0
  97. package/skills/eng-automation/references/6-webhooks-integracao.md +25 -0
  98. package/skills/eng-automation/references/7-rpa.md +25 -0
  99. package/skills/eng-automation/references/8-extracao-estruturada.md +25 -0
  100. package/skills/eng-automation/references/9-extracao-documentos.md +25 -0
  101. package/skills/eng-automation/references/especializacoes.md +18 -0
  102. package/skills/eng-backend-nestjs/SKILL.md +1 -1
  103. package/skills/eng-data/SKILL.md +271 -0
  104. package/skills/eng-data/references/1-fundamentos-dados.md +24 -0
  105. package/skills/eng-data/references/10-ciencia-dados.md +24 -0
  106. package/skills/eng-data/references/11-dataops-plataforma.md +24 -0
  107. package/skills/eng-data/references/12-seguranca-privacidade.md +24 -0
  108. package/skills/eng-data/references/2-modelagem-dados.md +24 -0
  109. package/skills/eng-data/references/3-bancos-dados.md +24 -0
  110. package/skills/eng-data/references/4-arquitetura-dados.md +24 -0
  111. package/skills/eng-data/references/5-pipelines-integracao.md +24 -0
  112. package/skills/eng-data/references/6-qualidade-dados.md +24 -0
  113. package/skills/eng-data/references/7-governanca-metadados.md +24 -0
  114. package/skills/eng-data/references/8-estatistica-analise.md +24 -0
  115. package/skills/eng-data/references/9-analytics-bi.md +24 -0
  116. package/skills/eng-data/references/especializacoes.md +20 -0
  117. package/skills/eng-frontend/SKILL.md +12 -5
  118. package/skills/eng-frontend/references/13-design-system.md +48 -0
  119. package/skills/eng-frontend/references/14-microfrontend.md +46 -0
  120. package/skills/eng-global-task-comment/SKILL.md +3 -3
  121. package/skills/eng-platform/SKILL.md +331 -0
  122. package/skills/eng-platform/references/1-fundamentos-sistemas.md +23 -0
  123. package/skills/eng-platform/references/10-resiliencia-arquitetura.md +24 -0
  124. package/skills/eng-platform/references/11-plataforma-devex.md +24 -0
  125. package/skills/eng-platform/references/12-finops-custos.md +24 -0
  126. package/skills/eng-platform/references/13-seguranca-fundamentos.md +26 -0
  127. package/skills/eng-platform/references/14-profiling-performance.md +23 -0
  128. package/skills/eng-platform/references/15-testes-carga-chaos.md +23 -0
  129. package/skills/eng-platform/references/16-cache-multicamada.md +22 -0
  130. package/skills/eng-platform/references/2-redes.md +23 -0
  131. package/skills/eng-platform/references/3-cloud.md +24 -0
  132. package/skills/eng-platform/references/4-iac-automacao.md +24 -0
  133. package/skills/eng-platform/references/5-containers-orquestracao.md +25 -0
  134. package/skills/eng-platform/references/6-cicd-entrega.md +24 -0
  135. package/skills/eng-platform/references/7-observabilidade.md +24 -0
  136. package/skills/eng-platform/references/8-confiabilidade-sre.md +24 -0
  137. package/skills/eng-platform/references/9-seguranca-infra.md +26 -0
  138. package/skills/eng-platform/references/especializacoes.md +34 -0
  139. package/skills/eng-qa/SKILL.md +283 -0
  140. package/skills/eng-qa/references/1-fundamentos-qualidade.md +25 -0
  141. package/skills/eng-qa/references/10-confiabilidade.md +25 -0
  142. package/skills/eng-qa/references/11-seguranca.md +24 -0
  143. package/skills/eng-qa/references/12-acessibilidade.md +24 -0
  144. package/skills/eng-qa/references/13-dados-testes.md +24 -0
  145. package/skills/eng-qa/references/14-gestao-testes-defeitos.md +25 -0
  146. package/skills/eng-qa/references/15-arquitetura-qa.md +25 -0
  147. package/skills/eng-qa/references/2-estrategia-planejamento.md +25 -0
  148. package/skills/eng-qa/references/3-design-testes.md +25 -0
  149. package/skills/eng-qa/references/4-manual-exploratorio.md +24 -0
  150. package/skills/eng-qa/references/5-automacao-testes.md +25 -0
  151. package/skills/eng-qa/references/6-api-integracao.md +25 -0
  152. package/skills/eng-qa/references/7-contrato.md +24 -0
  153. package/skills/eng-qa/references/8-interface-compat-mobile.md +24 -0
  154. package/skills/eng-qa/references/9-performance.md +24 -0
  155. package/skills/eng-qa/references/especializacoes.md +29 -0
  156. package/skills/eng-qa-planner/SKILL.md +264 -0
  157. package/skills/jarvis-context-detect/SKILL.md +1 -1
  158. package/skills/jarvis-context-detect/assets/context-profile-template.md +1 -1
  159. package/skills/jarvis-create-specialization/SKILL.md +8 -0
  160. package/skills/jarvis-docs-central/README.md +31 -28
  161. package/skills/jarvis-docs-central/SKILL.md +5 -5
  162. package/skills/jarvis-init/SKILL.md +9 -8
  163. package/skills/jarvis-init/assets/passo-adicionar-stacks.md +47 -18
  164. package/skills/jarvis-list-specializations/SKILL.md +30 -17
  165. package/skills/jarvis-report-issue/SKILL.md +1 -1
  166. package/taxonomy.md +4 -16
  167. package/templates/AGENTS.md +2 -0
  168. package/templates/ENV-template.md +20 -2
  169. package/templates/engineering/advisor-template.md +65 -0
  170. package/templates/engineering/architecture-template.md +52 -4
  171. package/templates/engineering/qa/qa.sprint-plan-template.md +1 -1
  172. package/workflows/AGENTS.md +3 -1
  173. package/workflows/README.md +0 -10
  174. package/workflows/engineering/data/data.new-pipeline.md +6 -5
  175. package/workflows/engineering/eng.bug-audit.md +4 -14
  176. package/workflows/engineering/eng.debug.md +4 -20
  177. package/workflows/engineering/eng.plan.md +4 -26
  178. package/workflows/engineering/eng.pr.md +13 -63
  179. package/workflows/engineering/eng.pre-pr.md +14 -51
  180. package/workflows/engineering/eng.review.md +7 -13
  181. package/workflows/engineering/eng.rpa.robot.md +3 -9
  182. package/workflows/engineering/eng.start.md +37 -32
  183. package/workflows/engineering/eng.work.md +17 -40
  184. package/workflows/engineering/qa/eng.qa-sprint-planning.md +1 -1
  185. package/workflows/product/prod.spec.discovery.md +2 -2
  186. package/workflows/warm-up.md +35 -63
  187. package/agents/engineering/eng.cybersecurity.agent.md +0 -486
  188. package/agents/engineering/qa/eng.qa.cypress-specialist.md +0 -112
  189. package/bin/lib/docs/fetch-file.sh +0 -41
  190. package/bin/lib/docs/publish-file.sh +0 -284
  191. package/rules/engineering/qa/eng.qa.exploratory-session-rules.md +0 -137
  192. package/rules/engineering/qa/eng.qa.quality-gate-scoring-rules.md +0 -181
  193. package/rules/engineering/qa/eng.qa.tech-spec-validation-criteria-rules.md +0 -120
  194. package/skills/eng-ai-engineer/SKILL.md +0 -303
  195. package/skills/eng-data-bi/SKILL.md +0 -206
  196. package/skills/eng-data-debug/SKILL.md +0 -314
  197. package/skills/eng-data-engineer/SKILL.md +0 -266
  198. package/skills/eng-data-onboard/SKILL.md +0 -317
  199. package/skills/eng-data-orchestrator/SKILL.md +0 -433
  200. package/skills/eng-devops-performance-engineer/SKILL.md +0 -319
  201. package/skills/eng-frontend-design-system/SKILL.md +0 -155
  202. package/skills/eng-frontend-design-system/references/1-estrutura-pacote.md +0 -57
  203. package/skills/eng-frontend-design-system/references/2-tokens.md +0 -116
  204. package/skills/eng-frontend-design-system/references/3-componentes.md +0 -165
  205. package/skills/eng-frontend-design-system/references/4-storybook.md +0 -85
  206. package/skills/eng-frontend-design-system/references/5-auditoria-versionamento.md +0 -76
  207. package/skills/eng-frontend-microfrontend/SKILL.md +0 -164
  208. package/skills/eng-frontend-microfrontend/references/1-criando-remote.md +0 -109
  209. package/skills/eng-frontend-microfrontend/references/2-configurando-shell.md +0 -70
  210. package/skills/eng-frontend-microfrontend/references/3-contratos-interface.md +0 -73
  211. package/skills/eng-frontend-microfrontend/references/4-shared-dependencies.md +0 -48
  212. package/skills/eng-frontend-microfrontend/references/5-event-bus.md +0 -59
  213. package/skills/eng-frontend-microfrontend/references/6-monorepo-deploy.md +0 -77
  214. package/skills/eng-frontend-microfrontend/references/7-troubleshooting.md +0 -45
  215. package/skills/eng-global-browser-extension-builder/SKILL.md +0 -392
  216. package/skills/eng-global-jira-comment/SKILL.md +0 -27
  217. package/skills/eng-qa-a11y-audit/SKILL.md +0 -276
  218. package/skills/eng-qa-bug-report/SKILL.md +0 -877
  219. package/skills/eng-qa-bug-report/TASK_MANAGERS.md +0 -138
  220. package/skills/eng-qa-bug-report/references/1-integracao-task-managers.md +0 -148
  221. package/skills/eng-qa-bug-report/references/2-exemplos-de-uso.md +0 -46
  222. package/skills/eng-qa-bug-report/references/3-bug-to-test.md +0 -45
  223. package/skills/eng-qa-cypress-e2e/SKILL.md +0 -184
  224. package/skills/eng-qa-dev-guide/SKILL.md +0 -173
  225. package/skills/eng-qa-e2e/SKILL.md +0 -407
  226. package/skills/eng-qa-e2e-spec-writer/SKILL.md +0 -329
  227. package/skills/eng-qa-exploratory/SKILL.md +0 -196
  228. package/skills/eng-qa-gate/SKILL.md +0 -377
  229. package/skills/eng-qa-gate/assets/checklist-validacao.md +0 -291
  230. package/skills/eng-qa-graphql-contract/SKILL.md +0 -263
  231. package/skills/eng-qa-quality-report/SKILL.md +0 -419
  232. package/skills/eng-qa-test-plan/SKILL.md +0 -473
  233. package/skills/eng-qa-testsprite/SKILL.md +0 -332
  234. package/skills/eng-qa-testsprite/references/testsprite-mcp.md +0 -224
  235. package/skills/eng-qa-unit-test/SKILL.md +0 -478
  236. package/skills/eng-scraper/SKILL.md +0 -260
  237. package/skills/eng-scraper/references/1-puppeteer.md +0 -140
  238. package/skills/eng-scraper/references/2-playwright-cheerio-pdf.md +0 -82
  239. package/skills/eng-scraper/references/3-anti-bot.md +0 -94
  240. package/skills/eng-scraper/references/4-resiliencia-etl-monitoramento.md +0 -137
  241. package/skills/eng-scraper-robot-builder/SKILL.md +0 -377
  242. package/skills/eng-security-cybersecurity/SKILL.md +0 -250
  243. package/skills/eng-security-cybersecurity/references/1-owasp-top-10.md +0 -331
  244. package/skills/eng-security-cybersecurity/references/2-secrets-management.md +0 -31
  245. package/skills/eng-security-cybersecurity/references/3-input-validation.md +0 -43
  246. package/skills/eng-security-cybersecurity/references/4-compliance.md +0 -20
  247. package/skills/eng-security-patch/SKILL.md +0 -388
  248. package/skills/eng-security-threat-model/SKILL.md +0 -171
  249. package/skills/eng-security-triage/SKILL.md +0 -276
  250. package/templates/engineering/qa/eng.qa.quality-gate-examples-template.md +0 -311
  251. package/templates/engineering/qa/eng.qa.quality-gate-report-template.md +0 -249
  252. package/templates/engineering/qa/qa.cypress-test-template.md +0 -172
  253. package/templates/engineering/qa/qa.exploratory-session-template.md +0 -148
  254. package/templates/engineering/qa/qa.quality-report-template.md +0 -130
  255. package/workflows/engineering/eng.security-audit.md +0 -319
  256. package/workflows/engineering/eng.security-incident.md +0 -281
  257. package/workflows/engineering/eng.security-pipeline.md +0 -219
  258. package/workflows/engineering/eng.security-review.md +0 -241
  259. package/workflows/engineering/qa/eng.qa-dev-quality-guide.md +0 -57
  260. package/workflows/engineering/qa/eng.qa-e2e-test-generation.md +0 -57
  261. package/workflows/engineering/qa/eng.qa-exploratory-session.md +0 -68
  262. package/workflows/engineering/qa/eng.qa-quality-gate-validation.md +0 -209
  263. package/workflows/engineering/qa/eng.qa-quality-report.md +0 -85
  264. /package/skills/{eng-qa-test-plan → eng-qa-planner}/assets/test-coverage-template.md +0 -0
  265. /package/skills/{eng-qa-test-plan → eng-qa-planner}/assets/test-patterns.md +0 -0
  266. /package/templates/{CDD aplicado a Prompts.md → cdd-aplicado-a-prompts.md} +0 -0
package/bin/jarvis.js CHANGED
@@ -1,169 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { argv, exit } from "node:process";
4
- import { readFileSync } from "node:fs";
5
- import { dirname, join } from "node:path";
6
- import { fileURLToPath } from "node:url";
7
- import { init } from "./commands/init.js";
8
- import { list } from "./commands/list.js";
9
- import { info } from "./commands/info.js";
10
- import { whoami } from "./commands/whoami.js";
11
- import { docsSync } from "./commands/docs-sync.js";
12
- import { docsPublish } from "./commands/docs-publish.js"
13
- import { qaSignoff } from "./commands/qa-signoff.js";
14
- import { installRtk } from "./commands/install-rtk.js";
15
- import { tokens } from "./commands/tokens.js";
16
- import { map } from "./commands/map.js";
17
- import { formatIDEsList } from "./lib/config/ide-config.js";
18
- import { showBanner, BLUE, GREEN, YELLOW, DIM, NC } from "./lib/utils/ui.js";
19
- import { logger } from "./lib/utils/logger.js";
3
+ import { buildProgram } from "./lib/cli/program.js";
20
4
 
21
- const __filename = fileURLToPath(import.meta.url);
22
- const __dirname = dirname(__filename);
23
- const args = argv.slice(2);
24
- const command = args[0];
5
+ const program = buildProgram();
25
6
 
26
- // Lazy loading do package.json (só quando necessário)
27
- let _version = null;
28
- function getVersion() {
29
- if (_version === null) {
30
- const packageJson = JSON.parse(
31
- readFileSync(join(__dirname, "../package.json"), "utf-8"),
32
- );
33
- _version = packageJson.version;
34
- }
35
- return _version;
7
+ // Sem comando: mostra a ajuda e sai com sucesso (não é um erro de uso).
8
+ // O default do commander para esse caso é process.exit(1); aqui replicamos
9
+ // o comportamento do dispatcher antigo, que apenas chamava help() e seguia.
10
+ if (process.argv.length <= 2) {
11
+ program.outputHelp();
12
+ process.exit(0);
36
13
  }
37
14
 
38
- function help() {
39
- showBanner();
40
-
41
- logger.info(`${BLUE}📚 Ajuda${NC}\n`);
42
-
43
- logger.info(`${YELLOW}Uso:${NC}`);
44
- logger.info(
45
- ` ${GREEN}jarvis init${NC} [--ide <ide>] Bootstrap framework no workspace`,
46
- );
47
- logger.info(
48
- ` ${GREEN}jarvis list${NC} Listar agents, skills & workflows`,
49
- );
50
- logger.info(
51
- ` ${GREEN}jarvis info${NC} <type/name> Detalhes de um prompt`,
52
- );
53
- logger.info(
54
- ` ${GREEN}jarvis whoami${NC} Exibir identidade (ENV.md / git / SO)`,
55
- );
56
- logger.info(
57
- ` ${GREEN}jarvis logout${NC} Remover auth.json legado`,
58
- );
59
- logger.info(
60
- ` ${GREEN}jarvis docs sync${NC} [--silent] [--verbose] Sincronizar docs do central-docs`,
61
- );
62
- logger.info(
63
- ` ${GREEN}jarvis docs publish${NC} --file <path> --tipo <tipo> --feature <slug> [--squad <squad>] [--workspace <workspace>]`,
64
- );
65
- logger.info(
66
- ` ${GREEN}jarvis install-rtk${NC} Instalar RTK (token killer — economia 60-90%)`,
67
- );
68
- logger.info(
69
- ` ${GREEN}jarvis tokens${NC} [--hub <h> --position <p> --area <a> --squad <s>] [--rtk] [--json] Estimar o que carrega no início da sessão (perfil do ENV.md se sem flags)`,
70
- );
71
- logger.info(
72
- ` ${GREEN}jarvis map${NC} <nome> [--depth N] [--reverse] Mapa do que um workflow, skill ou agente chama (ou, com --reverse, quem o chama)`,
73
- );
74
- logger.info(
75
- ` ${GREEN}jarvis qa-signoff${NC} [--branch <branch>] [--max-age <horas>] Verificar sign-off QA (usado pelo CI)`,
76
- );
77
- logger.info(
78
- ` ${GREEN}jarvis --version${NC} Versão instalada`,
79
- );
80
- logger.info("");
81
-
82
- logger.info(`${YELLOW}IDEs Suportadas:${NC}`);
83
- logger.info(` ${formatIDEsList()}`);
84
- logger.info("");
85
-
86
- logger.info(`${YELLOW}🚀 Começar:${NC}`);
87
- logger.info(
88
- ` ${DIM}1.${NC} npm install -g ${GREEN}/caminho/para/jarvis${NC}`,
89
- );
90
- logger.info(` ${DIM}2.${NC} ${GREEN}jarvis init${NC} --ide cursor`);
91
- logger.info(` ${DIM}3.${NC} No chat da IDE: ${GREEN}/jarvis-init${NC}`);
92
- logger.info("");
93
-
94
- logger.info(`${BLUE}📖 Exemplos:${NC}`);
95
- logger.info(
96
- ` ${GREEN}jarvis list${NC} Listar todos os prompts`,
97
- );
98
- logger.info(
99
- ` ${GREEN}jarvis info agent/eng${NC} Detalhes do agent eng`,
100
- );
101
- logger.info(
102
- ` ${GREEN}jarvis docs sync${NC} Sincronizar docs do central-docs`,
103
- );
104
- logger.info(
105
- ` ${GREEN}jarvis docs publish --file ./docs/ard.md --tipo ard --feature auth-jwt${NC}`,
106
- );
107
- logger.info("");
108
- }
109
-
110
- function parseFlags(args) {
111
- const flags = {};
112
- for (let i = 0; i < args.length; i++) {
113
- if (args[i].startsWith("--")) {
114
- const key = args[i].slice(2);
115
- flags[key] =
116
- args[i + 1] && !args[i + 1].startsWith("--") ? args[++i] : true;
117
- } else {
118
- flags._ = flags._ || [];
119
- flags._.push(args[i]);
120
- }
121
- }
122
- return flags;
123
- }
124
-
125
- const flags = parseFlags(args.slice(1));
126
-
127
- const commands = {
128
- init: () => init(flags),
129
- list: () => list(flags),
130
- ls: () => list(flags),
131
- info: () => info(flags._?.[0], flags),
132
- logout: () => whoami({ ...flags, logout: true }),
133
- whoami: () => whoami(flags),
134
- docs: () => {
135
- const subcommand = flags._?.[0];
136
- if (subcommand === "sync") {
137
- return docsSync(flags);
138
- } else if (subcommand === "publish") {
139
- return docsPublish(flags);
140
- } else {
141
- logger.error("\n Subcomando inválido para docs\n");
142
- logger.info("Uso:");
143
- logger.info(` ${GREEN}jarvis docs sync${NC} [--silent] [--verbose]`);
144
- logger.info(
145
- ` ${GREEN}jarvis docs publish${NC} --file <path> --tipo <prd|frd|ard|rfc> --feature <slug> [--squad <squad>] [--workspace <workspace>]`,
146
- );
147
- logger.info("");
148
- exit(1);
149
- }
150
- },
151
- "install-rtk": () => installRtk(flags),
152
- "qa-signoff": () => qaSignoff(flags),
153
- tokens: () => tokens(flags),
154
- map: () => map(flags),
155
- "--version": () => logger.info(getVersion()),
156
- "-v": () => logger.info(getVersion()),
157
- "--help": () => help(),
158
- "-h": () => help(),
159
- };
160
-
161
- if (command in commands) {
162
- await commands[command]();
163
- } else if (!command) {
164
- help();
165
- } else {
166
- logger.error(`\n Unknown command: ${command}\n`);
167
- help();
168
- exit(1);
169
- }
15
+ await program.parseAsync(process.argv);
@@ -1,22 +1,22 @@
1
- import { existsSync, readFileSync, unlinkSync } from 'node:fs'
2
- import { execSync } from 'node:child_process'
3
- import { join } from 'node:path'
4
- import { homedir, userInfo } from 'node:os'
1
+ import { existsSync, readFileSync, unlinkSync } from "node:fs";
2
+ import { execSync } from "node:child_process";
3
+ import { join } from "node:path";
4
+ import { homedir, userInfo } from "node:os";
5
5
 
6
- const SESSION_FILE = join(homedir(), '.jarvis', 'auth.json')
6
+ const SESSION_FILE = join(homedir(), ".jarvis", "auth.json");
7
7
 
8
8
  export function readSession() {
9
- if (!existsSync(SESSION_FILE)) return null
9
+ if (!existsSync(SESSION_FILE)) return null;
10
10
  try {
11
- return JSON.parse(readFileSync(SESSION_FILE, 'utf-8'))
11
+ return JSON.parse(readFileSync(SESSION_FILE, "utf-8"));
12
12
  } catch {
13
- return null
13
+ return null;
14
14
  }
15
15
  }
16
16
 
17
17
  export function clearSession() {
18
18
  if (existsSync(SESSION_FILE)) {
19
- unlinkSync(SESSION_FILE)
19
+ unlinkSync(SESSION_FILE);
20
20
  }
21
21
  }
22
22
 
@@ -25,32 +25,32 @@ export function clearSession() {
25
25
  * Order: ENV.md USER → git user.email → OS username → "local"
26
26
  */
27
27
  export function resolveUser(env = {}) {
28
- const envUser = typeof env.USER === 'string' ? env.USER.trim() : ''
29
- if (envUser) return { id: envUser, source: 'ENV.md' }
28
+ const envUser = typeof env.USER === "string" ? env.USER.trim() : "";
29
+ if (envUser) return { id: envUser, source: "ENV.md" };
30
30
 
31
31
  try {
32
- const email = execSync('git config --get user.email', {
33
- encoding: 'utf8',
34
- stdio: ['ignore', 'pipe', 'ignore'],
35
- }).trim()
36
- if (email) return { id: email, source: 'git' }
32
+ const email = execSync("git config --get user.email", {
33
+ encoding: "utf8",
34
+ stdio: ["ignore", "pipe", "ignore"],
35
+ }).trim();
36
+ if (email) return { id: email, source: "git" };
37
37
  } catch {
38
38
  // ignore
39
39
  }
40
40
 
41
41
  try {
42
- const username = userInfo().username
43
- if (username) return { id: username, source: 'os' }
42
+ const username = userInfo().username;
43
+ if (username) return { id: username, source: "os" };
44
44
  } catch {
45
45
  // ignore
46
46
  }
47
47
 
48
- return { id: 'local', source: 'fallback' }
48
+ return { id: "local", source: "fallback" };
49
49
  }
50
50
 
51
51
  /**
52
52
  * Identity used as dev_id. Never requires jarvis login.
53
53
  */
54
54
  export function getAuthUser(env = {}) {
55
- return resolveUser(env).id
55
+ return resolveUser(env).id;
56
56
  }
@@ -0,0 +1,219 @@
1
+ /**
2
+ * @fileoverview Monta o `program` do commander — único lugar que precisa mudar
3
+ * para adicionar, remover ou alterar um comando do CLI `jarvis`.
4
+ *
5
+ * Os arquivos de `bin/commands/*.js` continuam puros: cada um exporta uma
6
+ * função `async (flags) => {...}` sem saber nada sobre commander. Este módulo
7
+ * só traduz as opções do commander (camelCase: `--env-file` -> `envFile`)
8
+ * para o formato antigo que essas funções já esperam (`flags["env-file"]`,
9
+ * `flags._` para positionals) — ver `architecture.md` da sessão `eng/72`,
10
+ * Decisão 3.3.
11
+ * @module cli/program
12
+ */
13
+
14
+ import { readFileSync } from "node:fs";
15
+ import { dirname, join } from "node:path";
16
+ import { fileURLToPath } from "node:url";
17
+ import { Command } from "commander";
18
+
19
+ import { init } from "../../commands/init.js";
20
+ import { list } from "../../commands/list.js";
21
+ import { info } from "../../commands/info.js";
22
+ import { whoami } from "../../commands/whoami.js";
23
+ import { docsSync } from "../../commands/docs-sync.js";
24
+ import { docsPublish } from "../../commands/docs-publish.js";
25
+ import { qaSignoff } from "../../commands/qa-signoff.js";
26
+ import { installRtk } from "../../commands/install-rtk.js";
27
+ import { tokens } from "../../commands/tokens.js";
28
+ import { map } from "../../commands/map.js";
29
+ import { runCreateMerge } from "../vcs/create-merge.js";
30
+ import { runCreateIssue } from "../vcs/create-issue.js";
31
+ import { runFetchRaw } from "../vcs/fetch-raw.js";
32
+ import { runComment } from "../tasks/comment.js";
33
+ import { fetchFile } from "../docs/fetch-file.js";
34
+ import { formatIDEsList } from "../config/ide-config.js";
35
+ import { showBanner } from "../utils/ui.js";
36
+ import { withEnvOptions, withLogOptions } from "./shared-options.js";
37
+
38
+ const __dirname = dirname(fileURLToPath(import.meta.url));
39
+
40
+ function getVersion() {
41
+ const packageJson = JSON.parse(readFileSync(join(__dirname, "../../../package.json"), "utf-8"));
42
+ return packageJson.version;
43
+ }
44
+
45
+ /**
46
+ * Remonta as opções do commander (camelCase) no formato antigo de `flags`
47
+ * que `bin/commands/*.js` espera. `extra` (positionals, `logout: true`, etc.)
48
+ * é aplicado por último e sempre vence.
49
+ * @param {Record<string, unknown>} options
50
+ * @param {Record<string, unknown>} [extra]
51
+ */
52
+ function toLegacyFlags(options, extra = {}) {
53
+ const { envFile, maxAge, ...rest } = options;
54
+ const flags = { ...rest };
55
+ if (envFile !== undefined) flags["env-file"] = envFile;
56
+ if (maxAge !== undefined) flags["max-age"] = maxAge;
57
+ return { ...flags, ...extra };
58
+ }
59
+
60
+ /**
61
+ * `parent.command(name)` + `allowUnknownOption()` + `allowExcessArguments()`.
62
+ * O commander não propaga essas duas configurações do pai para os
63
+ * subcomandos — precisa repetir em cada um para manter a mesma
64
+ * permissividade do parser manual antigo, que nunca validava flag nem
65
+ * contava argumentos (ver `architecture.md` da sessão `eng/72`, Decisão 3.4).
66
+ * @param {Command} parent
67
+ * @param {string} name
68
+ */
69
+ function cmd(parent, name) {
70
+ return parent.command(name).allowUnknownOption().allowExcessArguments();
71
+ }
72
+
73
+ /** @returns {Command} */
74
+ export function buildProgram() {
75
+ const program = new Command("jarvis")
76
+ .description("Framework Jarvis para desenvolvimento assistido por IA")
77
+ .version(getVersion(), "-v, --version", "Versão instalada")
78
+ .allowUnknownOption() // o parser antigo nunca validava flags — mantém a mesma permissividade
79
+ .allowExcessArguments()
80
+ .showHelpAfterError(true);
81
+
82
+ program.addHelpText("beforeAll", () => {
83
+ showBanner();
84
+ return "";
85
+ });
86
+ program.addHelpText("after", () => `\nIDEs Suportadas:\n ${formatIDEsList()}\n`);
87
+
88
+ const initCmd = cmd(program, "init")
89
+ .description("Bootstrap do framework no workspace")
90
+ .option("--ide <ide>", "IDE a configurar (pula o menu interativo)")
91
+ .option("--force", "Sobrescreve a instalação existente sem perguntar");
92
+ withLogOptions(initCmd).action((options) => init(toLegacyFlags(options)));
93
+
94
+ cmd(program, "list")
95
+ .alias("ls")
96
+ .description("Listar agents, skills & workflows")
97
+ .argument("[type]", "Filtra por tipo: agent, skill ou workflow")
98
+ .option("--type <type>", "Mesmo filtro que o positional acima")
99
+ .action((type, options) => list(toLegacyFlags(options, { _: [type].filter(Boolean) })));
100
+
101
+ cmd(program, "info")
102
+ .description("Detalhes de um prompt")
103
+ .argument("[target]", "Ex: agent/eng.agent, skill/eng-backend")
104
+ .action((target) => info(target));
105
+
106
+ const whoamiCmd = cmd(program, "whoami").description("Exibir identidade (ENV.md / git / SO)");
107
+ withEnvOptions(withLogOptions(whoamiCmd)).action((options) => whoami(toLegacyFlags(options)));
108
+
109
+ const logoutCmd = cmd(program, "logout").description("Remover auth.json legado");
110
+ withLogOptions(logoutCmd).action((options) => whoami(toLegacyFlags(options, { logout: true })));
111
+
112
+ const docs = cmd(program, "docs").description("Sincronizar ou publicar documentação");
113
+
114
+ const docsSyncCmd = cmd(docs, "sync").description(
115
+ "Sincronizar docs do central-docs (usado por /warm-up)"
116
+ );
117
+ withEnvOptions(withLogOptions(docsSyncCmd)).action((options) => docsSync(toLegacyFlags(options)));
118
+
119
+ cmd(docs, "fetch")
120
+ .description(
121
+ "Buscar um arquivo do central-docs, com cache Redis best-effort (lê CENTRAL_DOCS_REPO do ambiente)"
122
+ )
123
+ .argument("<file-path>", "Path do arquivo dentro do repo central-docs")
124
+ .argument("[ref]", "Branch/ref", "main")
125
+ .action(async (filePath, ref) => {
126
+ try {
127
+ const content = await fetchFile(filePath, ref);
128
+ process.stdout.write(content);
129
+ } catch (error) {
130
+ console.error(error.message);
131
+ process.exit(error.code === 404 ? 2 : 1);
132
+ }
133
+ });
134
+
135
+ const docsPublishCmd = cmd(docs, "publish")
136
+ .description("Publicar documento no central-docs (branch + MR/PR)")
137
+ .option("--file <path>", "Caminho do arquivo local")
138
+ .option("--tipo <tipo>", "prd|frd|ard|rfc|swagger|qa-report")
139
+ .option("--feature <slug>", "Slug da feature (kebab-case)")
140
+ .option("--squad <squad>", "Override do SQUAD do ENV.md")
141
+ .option("--workspace <workspace>", "Override do WORKSPACE do ENV.md");
142
+ withEnvOptions(withLogOptions(docsPublishCmd)).action((options) =>
143
+ docsPublish(toLegacyFlags(options))
144
+ );
145
+
146
+ const installRtkCmd = cmd(program, "install-rtk").description(
147
+ "Instalar RTK (token killer — economia 60-90% em tokens de shell)"
148
+ );
149
+ withLogOptions(installRtkCmd).action((options) => installRtk(toLegacyFlags(options)));
150
+
151
+ const qaSignoffCmd = cmd(program, "qa-signoff")
152
+ .description("Verificar sign-off QA válido para a branch atual (usado pelo CI)")
153
+ .option("--branch <branch>", "Branch a verificar (padrão: lido do git)")
154
+ .option("--max-age <horas>", "Validade máxima em horas (padrão: 24)");
155
+ withEnvOptions(qaSignoffCmd).action((options) => qaSignoff(toLegacyFlags(options)));
156
+
157
+ cmd(program, "tokens")
158
+ .description("Estimar o que carrega no início da sessão")
159
+ .option("--hub <hub>")
160
+ .option("--position <position>")
161
+ .option("--area <area>")
162
+ .option("--squad <squad>")
163
+ .option("--rtk", "Força RTK ligado (padrão: lido do ENV.md)")
164
+ .option("--json", "Saída em JSON")
165
+ .option("--ide <ide>")
166
+ .option("--env-file <path>")
167
+ .action((options) => tokens(toLegacyFlags(options)));
168
+
169
+ cmd(program, "map")
170
+ .description("Mapa de chamadas de um workflow, skill ou agente")
171
+ .argument("[name]", "Nome do workflow, skill ou agente")
172
+ .option("--depth <n>", "Profundidade máxima")
173
+ .option("--reverse", "Mostra quem chama, em vez do que é chamado")
174
+ .action((name, options) => map(toLegacyFlags(options, { _: [name].filter(Boolean) })));
175
+
176
+ const vcs = cmd(program, "vcs").description("Adapters de Git host (GitLab/GitHub/Bitbucket)");
177
+
178
+ cmd(vcs, "create-merge")
179
+ .description("Abrir um MR/PR")
180
+ .option("--source <branch>")
181
+ .option("--target <branch>")
182
+ .option("--title <titulo>")
183
+ .option("--body-file <path>")
184
+ .option("--repo <url>", "Padrão: git remote get-url origin")
185
+ .action((options) =>
186
+ runCreateMerge({
187
+ source: options.source,
188
+ target: options.target,
189
+ title: options.title,
190
+ bodyFile: options.bodyFile,
191
+ repo: options.repo,
192
+ })
193
+ );
194
+
195
+ cmd(vcs, "create-issue")
196
+ .description("Abrir uma issue")
197
+ .option("--repo <url-ou-path>")
198
+ .option("--title <titulo>")
199
+ .option("--body-file <path>")
200
+ .action((options) =>
201
+ runCreateIssue({ repo: options.repo, title: options.title, bodyFile: options.bodyFile })
202
+ );
203
+
204
+ cmd(vcs, "fetch-raw")
205
+ .description("Buscar o conteúdo bruto de um arquivo no central-docs (lê CENTRAL_DOCS_REPO)")
206
+ .argument("[file-path]")
207
+ .argument("[ref]", "Branch/ref", "main")
208
+ .action((filePath, ref) => runFetchRaw(filePath, ref));
209
+
210
+ const tasks = cmd(program, "tasks").description("Adapters de task manager");
211
+
212
+ cmd(tasks, "comment")
213
+ .description("Comentar num card (Jira/Linear/GitHub/Asana — lê TASK_MANAGER do ENV.md)")
214
+ .argument("[card-key]")
215
+ .argument("[message...]", "Texto do comentário (pode ter espaços)")
216
+ .action((cardKey, messageParts) => runComment(cardKey, messageParts.join(" ")));
217
+
218
+ return program;
219
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @fileoverview Opções do commander repetidas entre vários comandos — evita
3
+ * reescrever `.option(...)` em cada registro de `program.js`.
4
+ * @module cli/shared-options
5
+ */
6
+
7
+ /**
8
+ * `--ide`/`--env-file`, usados por todo comando que resolve o ENV.md
9
+ * (via `env-loader.js#resolveEnvPath`).
10
+ * @param {import("commander").Command} cmd
11
+ * @returns {import("commander").Command}
12
+ */
13
+ export function withEnvOptions(cmd) {
14
+ return cmd
15
+ .option("--ide <ide>", "IDE alvo (ex: claude, windsurf, cursor)")
16
+ .option("--env-file <path>", "Path explícito do ENV.md");
17
+ }
18
+
19
+ /**
20
+ * `-q/--quiet`, `-v/--verbose`, `--silent` — lidos por `logger.js#configureFromFlags`.
21
+ * @param {import("commander").Command} cmd
22
+ * @returns {import("commander").Command}
23
+ */
24
+ export function withLogOptions(cmd) {
25
+ return cmd
26
+ .option("-q, --quiet", "Só mostra erros")
27
+ .option("-v, --verbose", "Mostra detalhes extras (nível debug)")
28
+ .option("--silent", "Não mostra nada, nem erros");
29
+ }
@@ -78,6 +78,64 @@ export const OBSOLETE_PATHS = Object.freeze([
78
78
  "rules/engineering/eng.pre-pr-rules.md",
79
79
  "rules/engineering/eng.tech-spec-rules.md",
80
80
  "rules/engineering/eng.breakdown-subtasks-rules.md",
81
+ // Consolidação de QA (removidos): área QA ficou só com eng-qa (base) e eng-qa-planner
82
+ "skills/eng-qa-test-plan",
83
+ "skills/eng-qa-gate",
84
+ "skills/eng-qa-cypress-e2e",
85
+ "skills/eng-qa-dev-guide",
86
+ "skills/eng-qa-exploratory",
87
+ "skills/eng-qa-bug-report",
88
+ "skills/eng-qa-quality-report",
89
+ "skills/eng-qa-testsprite",
90
+ "skills/eng-qa-a11y-audit",
91
+ "skills/eng-qa-graphql-contract",
92
+ "skills/eng-qa-e2e-spec-writer",
93
+ "skills/eng-qa-e2e",
94
+ "skills/eng-qa-unit-test",
95
+ "workflows/engineering/qa/eng.qa-dev-quality-guide.md",
96
+ "workflows/engineering/qa/eng.qa-e2e-test-generation.md",
97
+ "workflows/engineering/qa/eng.qa-exploratory-session.md",
98
+ "workflows/engineering/qa/eng.qa-quality-gate-validation.md",
99
+ "workflows/engineering/qa/eng.qa-quality-report.md",
100
+ "rules/engineering/qa/eng.qa.exploratory-session-rules.md",
101
+ "rules/engineering/qa/eng.qa.quality-gate-scoring-rules.md",
102
+ "rules/engineering/qa/eng.qa.tech-spec-validation-criteria-rules.md",
103
+ "templates/engineering/qa/eng.qa.quality-gate-examples-template.md",
104
+ "templates/engineering/qa/eng.qa.quality-gate-report-template.md",
105
+ "templates/engineering/qa/qa.cypress-test-template.md",
106
+ "templates/engineering/qa/qa.exploratory-session-template.md",
107
+ "templates/engineering/qa/qa.quality-report-template.md",
108
+ // Descontinuação da área security (removidos): segurança de app fica em eng-backend/eng-frontend,
109
+ // segurança de infra e fundamentos entram em eng-platform ou em PLATFORM_SPECIALIZATIONS
110
+ "skills/eng-security-cybersecurity",
111
+ "skills/eng-security-threat-model",
112
+ "skills/eng-security-triage",
113
+ "skills/eng-security-patch",
114
+ "agents/engineering/eng.cybersecurity.agent.md",
115
+ "workflows/engineering/eng.security-review.md",
116
+ "workflows/engineering/eng.security-incident.md",
117
+ "workflows/engineering/eng.security-audit.md",
118
+ "workflows/engineering/eng.security-pipeline.md",
119
+ // eng-automation-robot-builder (removido): conversão de fluxo manual em robô Playwright
120
+ // via Stagehand — sem skill de substituição hoje
121
+ "skills/eng-automation-robot-builder",
122
+ // eng-ai-engineer (removido): virou a base neutra eng-ai (padrão eng-backend, com references/)
123
+ "skills/eng-ai-engineer",
124
+ // Consolidação de data (removidos): área data ficou só com a base eng-data (padrão eng-backend)
125
+ "skills/eng-data-engineer",
126
+ "skills/eng-data-bi",
127
+ "skills/eng-data-debug",
128
+ "skills/eng-data-onboard",
129
+ "skills/eng-data-orchestrator",
130
+ // eng-global-browser-extension-builder (removido): sem uso real no framework
131
+ "skills/eng-global-browser-extension-builder",
132
+ // eng-devops-performance-engineer (removido): profiling, load testing/chaos e cache
133
+ // multi-camada entraram no eng-platform (temas 14, 15, 16)
134
+ "skills/eng-devops-performance-engineer",
135
+ // eng-frontend-design-system e eng-frontend-microfrontend (removidos): princípios agnósticos
136
+ // entraram na base eng-frontend (temas 13, 14)
137
+ "skills/eng-frontend-design-system",
138
+ "skills/eng-frontend-microfrontend",
81
139
  ]);
82
140
 
83
141
  /**
@@ -106,7 +164,7 @@ export const OPENCODE_MODEL_MAP = Object.freeze({
106
164
  "gpt-4.1": "openai/gpt-4.1",
107
165
  "gpt-4.1-mini": "openai/gpt-4.1-mini",
108
166
  "gpt-4.1-nano": "openai/gpt-4.1-nano",
109
- "o3": "openai/o3",
167
+ o3: "openai/o3",
110
168
  "o3-mini": "openai/o3-mini",
111
169
  "o4-mini": "openai/o4-mini",
112
170
  // Google
@@ -178,4 +236,3 @@ export const KIRO_HUB_FILE_PATTERNS = Object.freeze({
178
236
  DATA: "**/*.py,**/*.sql,**/*.ipynb",
179
237
  AI: "**/*.ts,**/*.py",
180
238
  });
181
-
@@ -111,25 +111,21 @@ function _validateIDEConfig(config) {
111
111
  throw new Error(`IDE config inválida: 'name' é obrigatório (string)`);
112
112
  }
113
113
  if (!config.value || typeof config.value !== "string") {
114
- throw new Error(
115
- `IDE config inválida: 'value' é obrigatório (string) para ${config.name}`,
116
- );
114
+ throw new Error(`IDE config inválida: 'value' é obrigatório (string) para ${config.name}`);
117
115
  }
118
116
  if (typeof config.supported !== "boolean") {
119
- throw new Error(
120
- `IDE config inválida: 'supported' é obrigatório (boolean) para ${config.name}`,
121
- );
117
+ throw new Error(`IDE config inválida: 'supported' é obrigatório (boolean) para ${config.name}`);
122
118
  }
123
119
  if (!config.workflowsFolder || typeof config.workflowsFolder !== "string") {
124
120
  throw new Error(
125
- `IDE config inválida: 'workflowsFolder' é obrigatório (string) para ${config.name}`,
121
+ `IDE config inválida: 'workflowsFolder' é obrigatório (string) para ${config.name}`
126
122
  );
127
123
  }
128
124
  // Validar valores conhecidos
129
125
  const knownFolders = [DEFAULT_WORKFLOWS_FOLDER, COMMANDS_FOLDER, STEERING_FOLDER];
130
126
  if (!knownFolders.includes(config.workflowsFolder)) {
131
127
  logger.warn(
132
- `⚠️ Atenção: IDE '${config.name}' usa workflowsFolder customizado: '${config.workflowsFolder}'`,
128
+ `⚠️ Atenção: IDE '${config.name}' usa workflowsFolder customizado: '${config.workflowsFolder}'`
133
129
  );
134
130
  }
135
131
  }
@@ -57,7 +57,10 @@ export function parseAppliesTo(content) {
57
57
 
58
58
  function axisMatches(list, value) {
59
59
  if (list.toLowerCase() === "all") return true;
60
- return list.split(",").map((s) => s.trim()).includes(value);
60
+ return list
61
+ .split(",")
62
+ .map((s) => s.trim())
63
+ .includes(value);
61
64
  }
62
65
 
63
66
  /**