jarvis-ai-framework 2.1.1 → 3.0.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 (259) hide show
  1. package/AGENTS.md +14 -115
  2. package/agents/AGENTS.md +11 -23
  3. package/agents/README.md +25 -129
  4. package/agents/engineering/data/eng.data-engineer.agent.md +11 -34
  5. package/agents/engineering/eng.agent.md +14 -24
  6. package/agents/engineering/eng.bug-hunter.md +7 -15
  7. package/agents/engineering/eng.dev-code-reviewer.md +1 -1
  8. package/agents/engineering/eng.frontend.agent.md +3 -7
  9. package/agents/engineering/eng.rpa.agent.md +2 -8
  10. package/agents/engineering/qa/eng.qa.quality-strategist.md +6 -11
  11. package/agents/engineering/qa/eng.qa.test-architect.md +8 -18
  12. package/agents/engineering/qa/eng.qa.test-planner.md +10 -14
  13. package/agents/engineering/qa/eng.qa.testing-engineer.md +91 -24
  14. package/agents/product/prod.discovery-interviewer.md +3 -3
  15. package/bin/README.md +142 -0
  16. package/bin/commands/docs-publish.js +105 -141
  17. package/bin/commands/docs-sync.js +66 -104
  18. package/bin/commands/info.js +7 -27
  19. package/bin/commands/init.js +23 -51
  20. package/bin/commands/install-rtk.js +9 -3
  21. package/bin/commands/list.js +5 -18
  22. package/bin/commands/map.js +20 -5
  23. package/bin/commands/qa-signoff.js +58 -55
  24. package/bin/commands/tokens.js +14 -17
  25. package/bin/commands/whoami.js +30 -26
  26. package/bin/jarvis.js +9 -163
  27. package/bin/lib/auth/session.js +20 -20
  28. package/bin/lib/cli/program.js +219 -0
  29. package/bin/lib/cli/shared-options.js +29 -0
  30. package/bin/lib/config/constants.js +59 -2
  31. package/bin/lib/config/ide-config.js +4 -8
  32. package/bin/lib/core/profile-filter.js +4 -1
  33. package/bin/lib/core/scanner.js +3 -29
  34. package/bin/lib/core/sync-engine.js +21 -14
  35. package/bin/lib/core/token-report.js +12 -2
  36. package/bin/lib/docs/fetch-file.js +39 -0
  37. package/bin/lib/docs/publish-file.js +194 -0
  38. package/bin/lib/docs/redis-cache.js +49 -0
  39. package/bin/lib/docs/validate-frontmatter.js +9 -39
  40. package/bin/lib/env-loader.js +11 -34
  41. package/bin/lib/flow-map/parse.js +11 -5
  42. package/bin/lib/flow-map/render.js +5 -2
  43. package/bin/lib/flow-map/tree.js +59 -10
  44. package/bin/lib/tasks/comment.js +40 -35
  45. package/bin/lib/utils/frontmatter.js +57 -0
  46. package/bin/lib/utils/git-parser.js +4 -6
  47. package/bin/lib/utils/npmrc-parser.js +6 -13
  48. package/bin/lib/utils/paths.js +2 -4
  49. package/bin/lib/utils/ui.js +3 -9
  50. package/bin/lib/vcs/api.js +25 -41
  51. package/bin/lib/vcs/create-issue.js +49 -33
  52. package/bin/lib/vcs/create-merge.js +47 -31
  53. package/bin/lib/vcs/fetch-raw.js +35 -23
  54. package/package.json +14 -5
  55. package/rules/engineering/eng-rules.md +1 -1
  56. package/rules/engineering/eng-security-rules.md +18 -16
  57. package/rules/engineering/eng.bump-rules.md +3 -2
  58. package/rules/engineering/eng.docs-scraping-rules.md +4 -4
  59. package/rules/engineering/eng.integrations-rules.md +3 -3
  60. package/rules/engineering/eng.skills-rules.md +1 -1
  61. package/rules/engineering/eng.specializations-rules.md +18 -4
  62. package/rules/engineering/frontend/eng.frontend-rules.md +1 -4
  63. package/rules/engineering/qa/eng.qa.cypress-standards-rules.md +1 -1
  64. package/rules/engineering/rpa/eng.rpa-rules.md +4 -9
  65. package/skills/AGENTS.md +52 -87
  66. package/skills/SKILLS-ROADMAP.md +47 -128
  67. package/skills/eng-ai/SKILL.md +270 -0
  68. package/skills/eng-ai/references/1-fundamentos-ml.md +24 -0
  69. package/skills/eng-ai/references/10-arquitetura-solucoes-ia.md +24 -0
  70. package/skills/eng-ai/references/11-governanca-ia.md +24 -0
  71. package/skills/eng-ai/references/12-seguranca-ia-responsavel.md +25 -0
  72. package/skills/eng-ai/references/2-matematica-estatistica.md +24 -0
  73. package/skills/eng-ai/references/3-dados-para-ia.md +24 -0
  74. package/skills/eng-ai/references/4-deep-learning-fundacionais.md +24 -0
  75. package/skills/eng-ai/references/5-llms-chatbots-agentes-rag.md +25 -0
  76. package/skills/eng-ai/references/6-avaliacao-experimentacao.md +24 -0
  77. package/skills/eng-ai/references/7-engenharia-sistemas-ia.md +24 -0
  78. package/skills/eng-ai/references/8-mlops-plataforma.md +24 -0
  79. package/skills/eng-ai/references/9-produto-ia.md +24 -0
  80. package/skills/eng-ai/references/especializacoes.md +17 -0
  81. package/skills/eng-automation/SKILL.md +290 -0
  82. package/skills/eng-automation/references/1-fundamentos-automacao.md +25 -0
  83. package/skills/eng-automation/references/10-ingestao-dados.md +25 -0
  84. package/skills/eng-automation/references/11-captcha-antibot.md +25 -0
  85. package/skills/eng-automation/references/12-limites-taxa-sessoes.md +25 -0
  86. package/skills/eng-automation/references/13-agendamento-orquestracao.md +24 -0
  87. package/skills/eng-automation/references/14-retentativa-erros.md +25 -0
  88. package/skills/eng-automation/references/15-autenticacao-credenciais.md +24 -0
  89. package/skills/eng-automation/references/16-observabilidade-confiabilidade.md +24 -0
  90. package/skills/eng-automation/references/2-aquisicao-dados.md +25 -0
  91. package/skills/eng-automation/references/3-automacao-navegador.md +24 -0
  92. package/skills/eng-automation/references/4-scraping-crawling.md +25 -0
  93. package/skills/eng-automation/references/5-apis-rest-graphql-soap.md +26 -0
  94. package/skills/eng-automation/references/6-webhooks-integracao.md +25 -0
  95. package/skills/eng-automation/references/7-rpa.md +25 -0
  96. package/skills/eng-automation/references/8-extracao-estruturada.md +25 -0
  97. package/skills/eng-automation/references/9-extracao-documentos.md +25 -0
  98. package/skills/eng-automation/references/especializacoes.md +18 -0
  99. package/skills/eng-backend-nestjs/SKILL.md +1 -1
  100. package/skills/eng-data/SKILL.md +271 -0
  101. package/skills/eng-data/references/1-fundamentos-dados.md +24 -0
  102. package/skills/eng-data/references/10-ciencia-dados.md +24 -0
  103. package/skills/eng-data/references/11-dataops-plataforma.md +24 -0
  104. package/skills/eng-data/references/12-seguranca-privacidade.md +24 -0
  105. package/skills/eng-data/references/2-modelagem-dados.md +24 -0
  106. package/skills/eng-data/references/3-bancos-dados.md +24 -0
  107. package/skills/eng-data/references/4-arquitetura-dados.md +24 -0
  108. package/skills/eng-data/references/5-pipelines-integracao.md +24 -0
  109. package/skills/eng-data/references/6-qualidade-dados.md +24 -0
  110. package/skills/eng-data/references/7-governanca-metadados.md +24 -0
  111. package/skills/eng-data/references/8-estatistica-analise.md +24 -0
  112. package/skills/eng-data/references/9-analytics-bi.md +24 -0
  113. package/skills/eng-data/references/especializacoes.md +20 -0
  114. package/skills/eng-frontend/SKILL.md +12 -5
  115. package/skills/eng-frontend/references/13-design-system.md +48 -0
  116. package/skills/eng-frontend/references/14-microfrontend.md +46 -0
  117. package/skills/eng-global-task-comment/SKILL.md +2 -2
  118. package/skills/eng-platform/SKILL.md +331 -0
  119. package/skills/eng-platform/references/1-fundamentos-sistemas.md +23 -0
  120. package/skills/eng-platform/references/10-resiliencia-arquitetura.md +24 -0
  121. package/skills/eng-platform/references/11-plataforma-devex.md +24 -0
  122. package/skills/eng-platform/references/12-finops-custos.md +24 -0
  123. package/skills/eng-platform/references/13-seguranca-fundamentos.md +26 -0
  124. package/skills/eng-platform/references/14-profiling-performance.md +23 -0
  125. package/skills/eng-platform/references/15-testes-carga-chaos.md +23 -0
  126. package/skills/eng-platform/references/16-cache-multicamada.md +22 -0
  127. package/skills/eng-platform/references/2-redes.md +23 -0
  128. package/skills/eng-platform/references/3-cloud.md +24 -0
  129. package/skills/eng-platform/references/4-iac-automacao.md +24 -0
  130. package/skills/eng-platform/references/5-containers-orquestracao.md +25 -0
  131. package/skills/eng-platform/references/6-cicd-entrega.md +24 -0
  132. package/skills/eng-platform/references/7-observabilidade.md +24 -0
  133. package/skills/eng-platform/references/8-confiabilidade-sre.md +24 -0
  134. package/skills/eng-platform/references/9-seguranca-infra.md +26 -0
  135. package/skills/eng-platform/references/especializacoes.md +34 -0
  136. package/skills/eng-qa/SKILL.md +283 -0
  137. package/skills/eng-qa/references/1-fundamentos-qualidade.md +25 -0
  138. package/skills/eng-qa/references/10-confiabilidade.md +25 -0
  139. package/skills/eng-qa/references/11-seguranca.md +24 -0
  140. package/skills/eng-qa/references/12-acessibilidade.md +24 -0
  141. package/skills/eng-qa/references/13-dados-testes.md +24 -0
  142. package/skills/eng-qa/references/14-gestao-testes-defeitos.md +25 -0
  143. package/skills/eng-qa/references/15-arquitetura-qa.md +25 -0
  144. package/skills/eng-qa/references/2-estrategia-planejamento.md +25 -0
  145. package/skills/eng-qa/references/3-design-testes.md +25 -0
  146. package/skills/eng-qa/references/4-manual-exploratorio.md +24 -0
  147. package/skills/eng-qa/references/5-automacao-testes.md +25 -0
  148. package/skills/eng-qa/references/6-api-integracao.md +25 -0
  149. package/skills/eng-qa/references/7-contrato.md +24 -0
  150. package/skills/eng-qa/references/8-interface-compat-mobile.md +24 -0
  151. package/skills/eng-qa/references/9-performance.md +24 -0
  152. package/skills/eng-qa/references/especializacoes.md +29 -0
  153. package/skills/eng-qa-planner/SKILL.md +264 -0
  154. package/skills/jarvis-context-detect/SKILL.md +1 -1
  155. package/skills/jarvis-context-detect/assets/context-profile-template.md +1 -1
  156. package/skills/jarvis-create-specialization/SKILL.md +8 -0
  157. package/skills/jarvis-docs-central/README.md +31 -28
  158. package/skills/jarvis-docs-central/SKILL.md +5 -5
  159. package/skills/jarvis-init/SKILL.md +8 -8
  160. package/skills/jarvis-init/assets/passo-adicionar-stacks.md +47 -18
  161. package/skills/jarvis-list-specializations/SKILL.md +30 -17
  162. package/skills/jarvis-report-issue/SKILL.md +1 -1
  163. package/taxonomy.md +4 -16
  164. package/templates/ENV-template.md +10 -2
  165. package/templates/engineering/qa/qa.sprint-plan-template.md +1 -1
  166. package/workflows/AGENTS.md +3 -1
  167. package/workflows/README.md +0 -10
  168. package/workflows/engineering/data/data.new-pipeline.md +6 -5
  169. package/workflows/engineering/eng.bug-audit.md +4 -14
  170. package/workflows/engineering/eng.debug.md +4 -20
  171. package/workflows/engineering/eng.pr.md +10 -28
  172. package/workflows/engineering/eng.pre-pr.md +11 -19
  173. package/workflows/engineering/eng.review.md +7 -13
  174. package/workflows/engineering/eng.rpa.robot.md +3 -9
  175. package/workflows/engineering/eng.start.md +16 -11
  176. package/workflows/engineering/eng.work.md +10 -18
  177. package/workflows/engineering/qa/eng.qa-sprint-planning.md +1 -1
  178. package/workflows/product/prod.spec.discovery.md +2 -2
  179. package/workflows/warm-up.md +35 -63
  180. package/agents/engineering/eng.cybersecurity.agent.md +0 -486
  181. package/agents/engineering/qa/eng.qa.cypress-specialist.md +0 -112
  182. package/bin/lib/docs/fetch-file.sh +0 -41
  183. package/bin/lib/docs/publish-file.sh +0 -284
  184. package/rules/engineering/qa/eng.qa.exploratory-session-rules.md +0 -137
  185. package/rules/engineering/qa/eng.qa.quality-gate-scoring-rules.md +0 -181
  186. package/rules/engineering/qa/eng.qa.tech-spec-validation-criteria-rules.md +0 -120
  187. package/skills/eng-ai-engineer/SKILL.md +0 -303
  188. package/skills/eng-data-bi/SKILL.md +0 -206
  189. package/skills/eng-data-debug/SKILL.md +0 -314
  190. package/skills/eng-data-engineer/SKILL.md +0 -266
  191. package/skills/eng-data-onboard/SKILL.md +0 -317
  192. package/skills/eng-data-orchestrator/SKILL.md +0 -433
  193. package/skills/eng-devops-performance-engineer/SKILL.md +0 -319
  194. package/skills/eng-frontend-design-system/SKILL.md +0 -155
  195. package/skills/eng-frontend-design-system/references/1-estrutura-pacote.md +0 -57
  196. package/skills/eng-frontend-design-system/references/2-tokens.md +0 -116
  197. package/skills/eng-frontend-design-system/references/3-componentes.md +0 -165
  198. package/skills/eng-frontend-design-system/references/4-storybook.md +0 -85
  199. package/skills/eng-frontend-design-system/references/5-auditoria-versionamento.md +0 -76
  200. package/skills/eng-frontend-microfrontend/SKILL.md +0 -164
  201. package/skills/eng-frontend-microfrontend/references/1-criando-remote.md +0 -109
  202. package/skills/eng-frontend-microfrontend/references/2-configurando-shell.md +0 -70
  203. package/skills/eng-frontend-microfrontend/references/3-contratos-interface.md +0 -73
  204. package/skills/eng-frontend-microfrontend/references/4-shared-dependencies.md +0 -48
  205. package/skills/eng-frontend-microfrontend/references/5-event-bus.md +0 -59
  206. package/skills/eng-frontend-microfrontend/references/6-monorepo-deploy.md +0 -77
  207. package/skills/eng-frontend-microfrontend/references/7-troubleshooting.md +0 -45
  208. package/skills/eng-global-browser-extension-builder/SKILL.md +0 -392
  209. package/skills/eng-global-jira-comment/SKILL.md +0 -27
  210. package/skills/eng-qa-a11y-audit/SKILL.md +0 -276
  211. package/skills/eng-qa-bug-report/SKILL.md +0 -877
  212. package/skills/eng-qa-bug-report/TASK_MANAGERS.md +0 -138
  213. package/skills/eng-qa-bug-report/references/1-integracao-task-managers.md +0 -148
  214. package/skills/eng-qa-bug-report/references/2-exemplos-de-uso.md +0 -46
  215. package/skills/eng-qa-bug-report/references/3-bug-to-test.md +0 -45
  216. package/skills/eng-qa-cypress-e2e/SKILL.md +0 -184
  217. package/skills/eng-qa-dev-guide/SKILL.md +0 -173
  218. package/skills/eng-qa-e2e/SKILL.md +0 -407
  219. package/skills/eng-qa-e2e-spec-writer/SKILL.md +0 -329
  220. package/skills/eng-qa-exploratory/SKILL.md +0 -196
  221. package/skills/eng-qa-gate/SKILL.md +0 -377
  222. package/skills/eng-qa-gate/assets/checklist-validacao.md +0 -291
  223. package/skills/eng-qa-graphql-contract/SKILL.md +0 -263
  224. package/skills/eng-qa-quality-report/SKILL.md +0 -419
  225. package/skills/eng-qa-test-plan/SKILL.md +0 -473
  226. package/skills/eng-qa-testsprite/SKILL.md +0 -332
  227. package/skills/eng-qa-testsprite/references/testsprite-mcp.md +0 -224
  228. package/skills/eng-qa-unit-test/SKILL.md +0 -478
  229. package/skills/eng-scraper/SKILL.md +0 -260
  230. package/skills/eng-scraper/references/1-puppeteer.md +0 -140
  231. package/skills/eng-scraper/references/2-playwright-cheerio-pdf.md +0 -82
  232. package/skills/eng-scraper/references/3-anti-bot.md +0 -94
  233. package/skills/eng-scraper/references/4-resiliencia-etl-monitoramento.md +0 -137
  234. package/skills/eng-scraper-robot-builder/SKILL.md +0 -377
  235. package/skills/eng-security-cybersecurity/SKILL.md +0 -250
  236. package/skills/eng-security-cybersecurity/references/1-owasp-top-10.md +0 -331
  237. package/skills/eng-security-cybersecurity/references/2-secrets-management.md +0 -31
  238. package/skills/eng-security-cybersecurity/references/3-input-validation.md +0 -43
  239. package/skills/eng-security-cybersecurity/references/4-compliance.md +0 -20
  240. package/skills/eng-security-patch/SKILL.md +0 -388
  241. package/skills/eng-security-threat-model/SKILL.md +0 -171
  242. package/skills/eng-security-triage/SKILL.md +0 -276
  243. package/templates/engineering/qa/eng.qa.quality-gate-examples-template.md +0 -311
  244. package/templates/engineering/qa/eng.qa.quality-gate-report-template.md +0 -249
  245. package/templates/engineering/qa/qa.cypress-test-template.md +0 -172
  246. package/templates/engineering/qa/qa.exploratory-session-template.md +0 -148
  247. package/templates/engineering/qa/qa.quality-report-template.md +0 -130
  248. package/workflows/engineering/eng.security-audit.md +0 -319
  249. package/workflows/engineering/eng.security-incident.md +0 -281
  250. package/workflows/engineering/eng.security-pipeline.md +0 -219
  251. package/workflows/engineering/eng.security-review.md +0 -241
  252. package/workflows/engineering/qa/eng.qa-dev-quality-guide.md +0 -57
  253. package/workflows/engineering/qa/eng.qa-e2e-test-generation.md +0 -57
  254. package/workflows/engineering/qa/eng.qa-exploratory-session.md +0 -68
  255. package/workflows/engineering/qa/eng.qa-quality-gate-validation.md +0 -209
  256. package/workflows/engineering/qa/eng.qa-quality-report.md +0 -85
  257. /package/skills/{eng-qa-test-plan → eng-qa-planner}/assets/test-coverage-template.md +0 -0
  258. /package/skills/{eng-qa-test-plan → eng-qa-planner}/assets/test-patterns.md +0 -0
  259. /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
  /**