jarvis-ai-framework 2.1.0 → 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 (303) hide show
  1. package/AGENTS.md +22 -122
  2. package/agents/AGENTS.md +20 -24
  3. package/agents/README.md +25 -129
  4. package/agents/engineering/data/eng.data-engineer.agent.md +12 -35
  5. package/agents/engineering/eng.agent.md +18 -30
  6. package/agents/engineering/eng.bug-hunter.md +9 -12
  7. package/agents/engineering/eng.dev-code-reviewer.md +5 -1
  8. package/agents/engineering/eng.docs-writer.md +3 -3
  9. package/agents/engineering/eng.frontend.agent.md +13 -8
  10. package/agents/engineering/eng.rpa.agent.md +5 -13
  11. package/agents/engineering/eng.ux-designer.agent.md +4 -0
  12. package/agents/engineering/qa/eng.qa.quality-champion-task-agent.md +4 -0
  13. package/agents/engineering/qa/eng.qa.quality-strategist.md +13 -8
  14. package/agents/engineering/qa/eng.qa.test-architect.md +16 -15
  15. package/agents/engineering/qa/eng.qa.test-planner.md +22 -17
  16. package/agents/engineering/qa/eng.qa.testing-engineer.md +99 -15
  17. package/agents/product/prod.discovery-interviewer.md +22 -3
  18. package/agents/product/prod.pm-checker.md +4 -0
  19. package/bin/README.md +142 -0
  20. package/bin/commands/docs-publish.js +105 -141
  21. package/bin/commands/docs-sync.js +66 -104
  22. package/bin/commands/info.js +7 -27
  23. package/bin/commands/init.js +23 -51
  24. package/bin/commands/install-rtk.js +9 -3
  25. package/bin/commands/list.js +5 -18
  26. package/bin/commands/map.js +58 -0
  27. package/bin/commands/qa-signoff.js +58 -55
  28. package/bin/commands/tokens.js +90 -0
  29. package/bin/commands/whoami.js +30 -26
  30. package/bin/jarvis.js +9 -153
  31. package/bin/lib/auth/session.js +20 -20
  32. package/bin/lib/cli/program.js +219 -0
  33. package/bin/lib/cli/shared-options.js +29 -0
  34. package/bin/lib/config/constants.js +70 -2
  35. package/bin/lib/config/ide-config.js +4 -8
  36. package/bin/lib/core/profile-filter.js +116 -0
  37. package/bin/lib/core/scanner.js +5 -31
  38. package/bin/lib/core/sync-engine.js +21 -14
  39. package/bin/lib/core/token-report.js +100 -0
  40. package/bin/lib/docs/fetch-file.js +39 -0
  41. package/bin/lib/docs/publish-file.js +194 -0
  42. package/bin/lib/docs/redis-cache.js +49 -0
  43. package/bin/lib/docs/validate-frontmatter.js +9 -39
  44. package/bin/lib/env-loader.js +11 -34
  45. package/bin/lib/flow-map/index.js +65 -0
  46. package/bin/lib/flow-map/parse.js +223 -0
  47. package/bin/lib/flow-map/render.js +89 -0
  48. package/bin/lib/flow-map/tree.js +248 -0
  49. package/bin/lib/tasks/comment.js +40 -35
  50. package/bin/lib/utils/frontmatter.js +57 -0
  51. package/bin/lib/utils/git-parser.js +4 -6
  52. package/bin/lib/utils/npmrc-parser.js +6 -13
  53. package/bin/lib/utils/paths.js +2 -4
  54. package/bin/lib/utils/ui.js +3 -9
  55. package/bin/lib/vcs/api.js +25 -41
  56. package/bin/lib/vcs/create-issue.js +49 -33
  57. package/bin/lib/vcs/create-merge.js +47 -31
  58. package/bin/lib/vcs/fetch-raw.js +35 -23
  59. package/members.md +1 -1
  60. package/package.json +15 -4
  61. package/rules/AGENTS.md +18 -7
  62. package/rules/engineering/eng-rules.md +3 -13
  63. package/rules/engineering/eng-security-rules.md +19 -18
  64. package/rules/engineering/eng.bump-rules.md +3 -2
  65. package/rules/engineering/eng.docs-scraping-rules.md +4 -4
  66. package/rules/engineering/eng.integrations-rules.md +3 -7
  67. package/rules/engineering/eng.skills-rules.md +1 -5
  68. package/rules/engineering/eng.specializations-rules.md +18 -8
  69. package/rules/engineering/frontend/eng.frontend-rules.md +1 -4
  70. package/rules/engineering/qa/eng.qa.cypress-standards-rules.md +1 -1
  71. package/rules/engineering/rpa/eng.rpa-rules.md +4 -9
  72. package/rules/product/README.md +1 -0
  73. package/rules/product/prod-rules.md +1 -4
  74. package/rules/product/prod.spec-rules.md +0 -4
  75. package/rules/rtk-rules.md +0 -1
  76. package/{rules → rules-on-demand}/engineering/eng.breakdown-subtasks-rules.md +0 -4
  77. package/{rules → rules-on-demand}/engineering/eng.plan-rules.md +0 -4
  78. package/{rules → rules-on-demand}/engineering/eng.pr-rules.md +0 -4
  79. package/{rules → rules-on-demand}/engineering/eng.pre-pr-rules.md +0 -4
  80. package/{rules → rules-on-demand}/engineering/eng.start-rules.md +0 -4
  81. package/{rules → rules-on-demand}/engineering/eng.tech-spec-rules.md +1 -2
  82. package/{rules → rules-on-demand}/engineering/eng.work-rules.md +0 -4
  83. package/skills/AGENTS.md +69 -106
  84. package/skills/SKILLS-ROADMAP.md +47 -132
  85. package/skills/eng-ai/SKILL.md +270 -0
  86. package/skills/eng-ai/references/1-fundamentos-ml.md +24 -0
  87. package/skills/eng-ai/references/10-arquitetura-solucoes-ia.md +24 -0
  88. package/skills/eng-ai/references/11-governanca-ia.md +24 -0
  89. package/skills/eng-ai/references/12-seguranca-ia-responsavel.md +25 -0
  90. package/skills/eng-ai/references/2-matematica-estatistica.md +24 -0
  91. package/skills/eng-ai/references/3-dados-para-ia.md +24 -0
  92. package/skills/eng-ai/references/4-deep-learning-fundacionais.md +24 -0
  93. package/skills/eng-ai/references/5-llms-chatbots-agentes-rag.md +25 -0
  94. package/skills/eng-ai/references/6-avaliacao-experimentacao.md +24 -0
  95. package/skills/eng-ai/references/7-engenharia-sistemas-ia.md +24 -0
  96. package/skills/eng-ai/references/8-mlops-plataforma.md +24 -0
  97. package/skills/eng-ai/references/9-produto-ia.md +24 -0
  98. package/skills/eng-ai/references/especializacoes.md +17 -0
  99. package/skills/eng-automation/SKILL.md +290 -0
  100. package/skills/eng-automation/references/1-fundamentos-automacao.md +25 -0
  101. package/skills/eng-automation/references/10-ingestao-dados.md +25 -0
  102. package/skills/eng-automation/references/11-captcha-antibot.md +25 -0
  103. package/skills/eng-automation/references/12-limites-taxa-sessoes.md +25 -0
  104. package/skills/eng-automation/references/13-agendamento-orquestracao.md +24 -0
  105. package/skills/eng-automation/references/14-retentativa-erros.md +25 -0
  106. package/skills/eng-automation/references/15-autenticacao-credenciais.md +24 -0
  107. package/skills/eng-automation/references/16-observabilidade-confiabilidade.md +24 -0
  108. package/skills/eng-automation/references/2-aquisicao-dados.md +25 -0
  109. package/skills/eng-automation/references/3-automacao-navegador.md +24 -0
  110. package/skills/eng-automation/references/4-scraping-crawling.md +25 -0
  111. package/skills/eng-automation/references/5-apis-rest-graphql-soap.md +26 -0
  112. package/skills/eng-automation/references/6-webhooks-integracao.md +25 -0
  113. package/skills/eng-automation/references/7-rpa.md +25 -0
  114. package/skills/eng-automation/references/8-extracao-estruturada.md +25 -0
  115. package/skills/eng-automation/references/9-extracao-documentos.md +25 -0
  116. package/skills/eng-automation/references/especializacoes.md +18 -0
  117. package/skills/eng-backend/SKILL.md +6 -0
  118. package/skills/eng-backend-arch-c4/SKILL.md +10 -4
  119. package/skills/eng-backend-microservices-trace/SKILL.md +6 -0
  120. package/skills/eng-backend-nestjs/SKILL.md +17 -462
  121. package/skills/eng-backend-nestjs/references/1-arquitetura-modulos.md +54 -0
  122. package/skills/eng-backend-nestjs/references/2-guards-autenticacao.md +118 -0
  123. package/skills/eng-backend-nestjs/references/3-interceptors-pipes-filters.md +113 -0
  124. package/skills/eng-backend-nestjs/references/4-config-logging.md +61 -0
  125. package/skills/eng-backend-nestjs/references/5-testes.md +83 -0
  126. package/skills/eng-backend-nestjs/references/6-problemas-comuns.md +53 -0
  127. package/skills/eng-backend-rabbitmq/SKILL.md +15 -298
  128. package/skills/eng-backend-rabbitmq/references/1-referencia-endpoints.md +28 -0
  129. package/skills/eng-backend-rabbitmq/references/2-codigo-consumer-producer.md +90 -0
  130. package/skills/eng-backend-rabbitmq/references/3-arquiteturas-comuns.md +101 -0
  131. package/skills/eng-backend-rabbitmq/references/4-troubleshooting.md +93 -0
  132. package/skills/eng-data/SKILL.md +271 -0
  133. package/skills/eng-data/references/1-fundamentos-dados.md +24 -0
  134. package/skills/eng-data/references/10-ciencia-dados.md +24 -0
  135. package/skills/eng-data/references/11-dataops-plataforma.md +24 -0
  136. package/skills/eng-data/references/12-seguranca-privacidade.md +24 -0
  137. package/skills/eng-data/references/2-modelagem-dados.md +24 -0
  138. package/skills/eng-data/references/3-bancos-dados.md +24 -0
  139. package/skills/eng-data/references/4-arquitetura-dados.md +24 -0
  140. package/skills/eng-data/references/5-pipelines-integracao.md +24 -0
  141. package/skills/eng-data/references/6-qualidade-dados.md +24 -0
  142. package/skills/eng-data/references/7-governanca-metadados.md +24 -0
  143. package/skills/eng-data/references/8-estatistica-analise.md +24 -0
  144. package/skills/eng-data/references/9-analytics-bi.md +24 -0
  145. package/skills/eng-data/references/especializacoes.md +20 -0
  146. package/skills/eng-frontend/SKILL.md +18 -5
  147. package/skills/eng-frontend/references/13-design-system.md +48 -0
  148. package/skills/eng-frontend/references/14-microfrontend.md +46 -0
  149. package/skills/eng-global-docs-write/SKILL.md +10 -5
  150. package/skills/eng-global-pr/SKILL.md +7 -1
  151. package/skills/eng-global-task-comment/SKILL.md +8 -2
  152. package/skills/eng-platform/SKILL.md +331 -0
  153. package/skills/eng-platform/references/1-fundamentos-sistemas.md +23 -0
  154. package/skills/eng-platform/references/10-resiliencia-arquitetura.md +24 -0
  155. package/skills/eng-platform/references/11-plataforma-devex.md +24 -0
  156. package/skills/eng-platform/references/12-finops-custos.md +24 -0
  157. package/skills/eng-platform/references/13-seguranca-fundamentos.md +26 -0
  158. package/skills/eng-platform/references/14-profiling-performance.md +23 -0
  159. package/skills/eng-platform/references/15-testes-carga-chaos.md +23 -0
  160. package/skills/eng-platform/references/16-cache-multicamada.md +22 -0
  161. package/skills/eng-platform/references/2-redes.md +23 -0
  162. package/skills/eng-platform/references/3-cloud.md +24 -0
  163. package/skills/eng-platform/references/4-iac-automacao.md +24 -0
  164. package/skills/eng-platform/references/5-containers-orquestracao.md +25 -0
  165. package/skills/eng-platform/references/6-cicd-entrega.md +24 -0
  166. package/skills/eng-platform/references/7-observabilidade.md +24 -0
  167. package/skills/eng-platform/references/8-confiabilidade-sre.md +24 -0
  168. package/skills/eng-platform/references/9-seguranca-infra.md +26 -0
  169. package/skills/eng-platform/references/especializacoes.md +34 -0
  170. package/skills/eng-qa/SKILL.md +283 -0
  171. package/skills/eng-qa/references/1-fundamentos-qualidade.md +25 -0
  172. package/skills/eng-qa/references/10-confiabilidade.md +25 -0
  173. package/skills/eng-qa/references/11-seguranca.md +24 -0
  174. package/skills/eng-qa/references/12-acessibilidade.md +24 -0
  175. package/skills/eng-qa/references/13-dados-testes.md +24 -0
  176. package/skills/eng-qa/references/14-gestao-testes-defeitos.md +25 -0
  177. package/skills/eng-qa/references/15-arquitetura-qa.md +25 -0
  178. package/skills/eng-qa/references/2-estrategia-planejamento.md +25 -0
  179. package/skills/eng-qa/references/3-design-testes.md +25 -0
  180. package/skills/eng-qa/references/4-manual-exploratorio.md +24 -0
  181. package/skills/eng-qa/references/5-automacao-testes.md +25 -0
  182. package/skills/eng-qa/references/6-api-integracao.md +25 -0
  183. package/skills/eng-qa/references/7-contrato.md +24 -0
  184. package/skills/eng-qa/references/8-interface-compat-mobile.md +24 -0
  185. package/skills/eng-qa/references/9-performance.md +24 -0
  186. package/skills/eng-qa/references/especializacoes.md +29 -0
  187. package/skills/eng-qa-planner/SKILL.md +264 -0
  188. package/skills/jarvis-context-detect/SKILL.md +7 -1
  189. package/skills/jarvis-context-detect/assets/context-profile-template.md +1 -1
  190. package/skills/jarvis-create-specialization/SKILL.md +14 -0
  191. package/skills/jarvis-docs-central/README.md +31 -28
  192. package/skills/jarvis-docs-central/SKILL.md +11 -5
  193. package/skills/jarvis-docs-index/SKILL.md +10 -2
  194. package/skills/jarvis-evolution-architect/SKILL.md +6 -0
  195. package/skills/jarvis-init/SKILL.md +22 -15
  196. package/skills/jarvis-init/assets/passo-adicionar-stacks.md +47 -18
  197. package/skills/jarvis-list-specializations/SKILL.md +36 -17
  198. package/skills/jarvis-report-issue/SKILL.md +7 -1
  199. package/skills/product-roadmap-report/SKILL.md +8 -0
  200. package/skills/product-specs/SKILL.md +9 -0
  201. package/skills/product-specs-update/SKILL.md +6 -0
  202. package/taxonomy.md +16 -28
  203. package/templates/AGENTS.md +2 -0
  204. package/templates/ENV-template.md +10 -2
  205. package/templates/engineering/qa/qa.sprint-plan-template.md +1 -1
  206. package/templates/engineering/tech-spec-delivery-template.md +179 -0
  207. package/workflows/AGENTS.md +14 -2
  208. package/workflows/README.md +8 -16
  209. package/workflows/all-tools.md +7 -1
  210. package/workflows/engineering/data/data.contract.md +8 -0
  211. package/workflows/engineering/data/data.new-pipeline.md +15 -4
  212. package/workflows/engineering/eng.breakdown-subtasks.md +9 -0
  213. package/workflows/engineering/eng.bug-audit.md +10 -13
  214. package/workflows/engineering/eng.build-tech-spec.md +17 -146
  215. package/workflows/engineering/eng.create-ard-from-code.md +8 -0
  216. package/workflows/engineering/eng.create-ard.md +8 -0
  217. package/workflows/engineering/eng.create-rfc.md +7 -0
  218. package/workflows/engineering/eng.debug.md +5 -21
  219. package/workflows/engineering/eng.docs.md +9 -0
  220. package/workflows/engineering/eng.light-arch.md +7 -0
  221. package/workflows/engineering/eng.plan.md +15 -2
  222. package/workflows/engineering/eng.pr.md +24 -30
  223. package/workflows/engineering/eng.pre-pr.md +33 -15
  224. package/workflows/engineering/eng.review.md +18 -11
  225. package/workflows/engineering/eng.rpa.robot.md +17 -7
  226. package/workflows/engineering/eng.start.md +33 -12
  227. package/workflows/engineering/eng.work.md +25 -17
  228. package/workflows/engineering/frontend/eng.frontend-component.md +7 -0
  229. package/workflows/engineering/frontend/eng.frontend-perf-audit.md +8 -0
  230. package/workflows/engineering/frontend/eng.frontend-review.md +8 -0
  231. package/workflows/engineering/qa/eng.qa-refinement-entry.md +7 -0
  232. package/workflows/engineering/qa/eng.qa-release-signoff.md +6 -0
  233. package/workflows/engineering/qa/eng.qa-sprint-planning.md +7 -1
  234. package/workflows/product/prod.roadmap.preview.md +9 -0
  235. package/workflows/product/prod.spec.ard.md +97 -0
  236. package/workflows/product/prod.spec.breakdown.md +10 -0
  237. package/workflows/product/prod.spec.clarify.md +8 -2
  238. package/workflows/product/prod.spec.discovery.md +11 -1
  239. package/workflows/product/prod.spec.epic.md +8 -0
  240. package/workflows/product/prod.spec.frd.md +7 -0
  241. package/workflows/product/prod.spec.issue.md +6 -0
  242. package/workflows/product/prod.spec.md +15 -1
  243. package/workflows/product/prod.spec.prd.md +7 -0
  244. package/workflows/taxonomy.md +58 -6
  245. package/workflows/warm-up.md +47 -60
  246. package/agents/engineering/eng.cybersecurity.agent.md +0 -488
  247. package/agents/engineering/qa/eng.qa.cypress-specialist.md +0 -109
  248. package/bin/lib/docs/fetch-file.sh +0 -41
  249. package/bin/lib/docs/publish-file.sh +0 -284
  250. package/rules/engineering/eng.downstream-flow-rules.md +0 -297
  251. package/rules/engineering/qa/eng.qa.exploratory-session-rules.md +0 -137
  252. package/rules/engineering/qa/eng.qa.quality-gate-scoring-rules.md +0 -181
  253. package/rules/engineering/qa/eng.qa.tech-spec-validation-criteria-rules.md +0 -120
  254. package/skills/eng-ai-engineer/SKILL.md +0 -297
  255. package/skills/eng-data-bi/SKILL.md +0 -200
  256. package/skills/eng-data-debug/SKILL.md +0 -308
  257. package/skills/eng-data-engineer/SKILL.md +0 -257
  258. package/skills/eng-data-onboard/SKILL.md +0 -311
  259. package/skills/eng-data-orchestrator/SKILL.md +0 -427
  260. package/skills/eng-devops-performance-engineer/SKILL.md +0 -313
  261. package/skills/eng-frontend-design-system/SKILL.md +0 -621
  262. package/skills/eng-frontend-microfrontend/SKILL.md +0 -604
  263. package/skills/eng-global-browser-extension-builder/SKILL.md +0 -386
  264. package/skills/eng-global-jira-comment/SKILL.md +0 -21
  265. package/skills/eng-qa-a11y-audit/SKILL.md +0 -270
  266. package/skills/eng-qa-bug-report/SKILL.md +0 -1089
  267. package/skills/eng-qa-bug-report/TASK_MANAGERS.md +0 -138
  268. package/skills/eng-qa-cypress-e2e/SKILL.md +0 -178
  269. package/skills/eng-qa-dev-guide/SKILL.md +0 -165
  270. package/skills/eng-qa-e2e/SKILL.md +0 -401
  271. package/skills/eng-qa-e2e-spec-writer/SKILL.md +0 -323
  272. package/skills/eng-qa-exploratory/SKILL.md +0 -189
  273. package/skills/eng-qa-gate/SKILL.md +0 -371
  274. package/skills/eng-qa-gate/assets/checklist-validacao.md +0 -291
  275. package/skills/eng-qa-graphql-contract/SKILL.md +0 -257
  276. package/skills/eng-qa-quality-report/SKILL.md +0 -413
  277. package/skills/eng-qa-test-plan/SKILL.md +0 -467
  278. package/skills/eng-qa-testsprite/SKILL.md +0 -326
  279. package/skills/eng-qa-testsprite/references/testsprite-mcp.md +0 -224
  280. package/skills/eng-qa-unit-test/SKILL.md +0 -472
  281. package/skills/eng-scraper/SKILL.md +0 -684
  282. package/skills/eng-scraper-robot-builder/SKILL.md +0 -371
  283. package/skills/eng-security-cybersecurity/SKILL.md +0 -646
  284. package/skills/eng-security-patch/SKILL.md +0 -382
  285. package/skills/eng-security-threat-model/SKILL.md +0 -165
  286. package/skills/eng-security-triage/SKILL.md +0 -270
  287. package/templates/engineering/qa/eng.qa.quality-gate-examples-template.md +0 -311
  288. package/templates/engineering/qa/eng.qa.quality-gate-report-template.md +0 -249
  289. package/templates/engineering/qa/qa.cypress-test-template.md +0 -172
  290. package/templates/engineering/qa/qa.exploratory-session-template.md +0 -148
  291. package/templates/engineering/qa/qa.quality-report-template.md +0 -130
  292. package/workflows/engineering/eng.security-audit.md +0 -312
  293. package/workflows/engineering/eng.security-incident.md +0 -275
  294. package/workflows/engineering/eng.security-pipeline.md +0 -210
  295. package/workflows/engineering/eng.security-review.md +0 -235
  296. package/workflows/engineering/qa/eng.qa-dev-quality-guide.md +0 -51
  297. package/workflows/engineering/qa/eng.qa-e2e-test-generation.md +0 -51
  298. package/workflows/engineering/qa/eng.qa-exploratory-session.md +0 -60
  299. package/workflows/engineering/qa/eng.qa-quality-gate-validation.md +0 -202
  300. package/workflows/engineering/qa/eng.qa-quality-report.md +0 -78
  301. /package/skills/{eng-qa-test-plan → eng-qa-planner}/assets/test-coverage-template.md +0 -0
  302. /package/skills/{eng-qa-test-plan → eng-qa-planner}/assets/test-patterns.md +0 -0
  303. /package/templates/{CDD aplicado a Prompts.md → cdd-aplicado-a-prompts.md} +0 -0
@@ -10,21 +10,109 @@ model: sonnet
10
10
  Você é um **engenheiro de testes** focado em escrever testes práticos que verificam se o código
11
11
  realmente funciona como pretendido — tanto testes unitários quanto E2E Cypress.
12
12
 
13
- ## Skills de Referência
13
+ ## Skills Disponíveis
14
14
 
15
- | Skill | Quando Usar | Arquivo |
16
- |-------|-------------|---------|
17
- | **eng-qa-cypress-e2e** | Para gerar specs Cypress + TypeScript para fluxos de usuário | `$IDE/skills/eng-qa-cypress-e2e/SKILL.md` |
18
- | **eng-qa-unit-test** | Para templates e padrões ao **escrever** testes unitários | `$IDE/skills/eng-qa-unit-test/SKILL.md` |
19
- | **eng-qa-test-plan** | Para **analisar** cobertura antes de escrever | `$IDE/skills/eng-qa-test-plan/SKILL.md` |
20
- | **eng-qa-testsprite** | Para testes E2E/API em linguagem natural via Stagehand | `$IDE/skills/eng-qa-testsprite/SKILL.md` |
21
- | **eng-qa-dev-guide** | Para orientar devs sobre cobertura sem escrever o teste | `$IDE/skills/eng-qa-dev-guide/SKILL.md` |
15
+ ### eng-qa
16
+ Para gerar specs E2E, escrever testes unitários e orientar devs sobre cobertura — base de QA, complementada pela especialização registrada em `QA_SPECIALIZATIONS`:
17
+ - Arquivo: `$IDE/skills/eng-qa/SKILL.md`
18
+
19
+ ### eng-qa-planner
20
+ Para **analisar** cobertura antes de escrever:
21
+ - Arquivo: `$IDE/skills/eng-qa-planner/SKILL.md`
22
+
23
+ ### jarvis-context-detect (CDD)
24
+ Para detecção automatizada do contexto (calibração contextual do agente):
25
+ - Arquivo: `$IDE/skills/jarvis-context-detect/SKILL.md`
26
+ - Uso: `/jarvis-context-detect {TASK_MANAGER_KEY}`
22
27
 
23
28
  > **Stack E2E primária**: Cypress + TypeScript com Page Objects, `data-testid` e `cy.intercept`.
24
29
  > Consultar `$RULES_FOLDER/engineering/qa/eng.qa.cypress-standards-rules.md` para convenções do projeto.
25
30
  >
26
31
  > **Testes unitários**: linguagem/framework nativo do projeto (TypeScript/Jest, Python/pytest, etc.)
27
- > O `eng-qa-testsprite` cobre E2E via Stagehand (linguagem natural) — complementa, não substitui Cypress.
32
+ > A especialização de E2E registrada em `QA_SPECIALIZATIONS` (via a base `eng-qa`) complementa, não substitui Cypress.
33
+
34
+ ---
35
+
36
+ ## Cypress E2E — Domínio e Debugging
37
+
38
+ > 🔒 **Fonte de verdade de convenções**: `$RULES_FOLDER/engineering/qa/eng.qa.cypress-standards-rules.md`
39
+ > Sempre ler antes de sugerir padrões ou gerar código. Para **gerar** uma spec nova, use a especialização de Cypress registrada em `QA_SPECIALIZATIONS` (via a base `eng-qa`); esta seção cobre o julgamento por trás de revisar, debugar e manter specs existentes.
40
+
41
+ ### Domínios de Expertise
42
+
43
+ #### Page Objects
44
+ - Estrutura fluent (retorno `this`)
45
+ - Organização por domínio vs. por página
46
+ - Herança e composição entre Page Objects
47
+ - Quando criar vs. quando estender um existente
48
+
49
+ #### Custom Commands
50
+ - Tipagem com TypeScript (`Cypress.Commands.add`)
51
+ - Declaração em `support/index.d.ts`
52
+ - Commands de autenticação via `cy.request` (não via UI)
53
+ - Commands de setup de estado (seed de dados, limpeza)
54
+
55
+ #### Fixtures e Intercepts
56
+ - Estrutura de pastas de fixtures por domínio
57
+ - Tipagem de fixtures com tipos do projeto (`cy.fixture<T>`)
58
+ - Padrões de `cy.intercept` para REST e GraphQL
59
+ - Gestão de aliases e `cy.wait`
60
+ - Estratégia de intercept para diferentes cenários (sucesso, erro, timeout)
61
+
62
+ #### Viewport e Responsividade
63
+ - `cy.viewport()` para testes multi-device
64
+ - Breakpoints a cobrir conforme o projeto
65
+ - Configuração em `cypress.config.ts`
66
+
67
+ #### Configuração e CI
68
+ - `cypress.config.ts` — baseUrl, env, retries, video
69
+ - Estratégia de retries para flakiness (retry ≠ resolver o problema)
70
+ - Paralelização com Cypress Cloud ou via CI nativo
71
+ - Variáveis de ambiente seguras (`Cypress.env()` vs. hardcode)
72
+ - Artefatos de CI: screenshots, vídeos, relatórios
73
+
74
+ ### Debugging de Testes Flaky
75
+
76
+ Causas comuns e soluções:
77
+
78
+ | Causa | Sintoma | Solução |
79
+ |-------|---------|---------|
80
+ | Race condition | Teste falha 1 em 5 vezes | Usar `cy.wait('@alias')` em vez de `cy.wait(ms)` |
81
+ | Estado compartilhado | Teste passa isolado, falha em suite | `beforeEach` garante estado limpo |
82
+ | Animação/transição | Clique em elemento não dispara | `.should('be.visible')` antes de `.click()` |
83
+ | Dados dinâmicos | Assertion em texto que muda | Usar `contain` em vez de `eq`, ou mockar dado |
84
+ | API real | Falha intermitente por timeout | Interceptar sempre — nunca depender de API real |
85
+ | Seletor frágil | Falha após deploy de UI | Migrar para `data-testid` |
86
+
87
+ ### Para Debugging de Spec Cypress
88
+
89
+ 1. Perguntar: o teste falha sempre ou às vezes? (determina se é flaky ou quebrado)
90
+ 2. Pedir o erro e o trecho de código relevante
91
+ 3. Identificar a causa raiz antes de sugerir solução
92
+ 4. Nunca recomendar aumentar retry como solução definitiva
93
+
94
+ ### Para Revisão de Spec Cypress
95
+
96
+ Ler a spec fornecida e verificar:
97
+ - Seletores: algum usando classe/id? → migrar para `data-testid`
98
+ - Intercepts: alguma API não interceptada? → adicionar
99
+ - Dependência entre testes: algum `it` depende de outro? → corrigir
100
+ - `cy.wait(ms)` hardcoded? → substituir por alias
101
+ - Page Object ausente? → criar ou indicar onde adicionar
102
+
103
+ ### Regras Específicas de Cypress
104
+
105
+ **Nunca**
106
+ - Sugerir `cy.wait({número})` como solução — identificar a causa real da espera
107
+ - Aceitar seletores por classe CSS em specs novas
108
+ - Recomendar retry como fix de flakiness — é um paliativo, não solução
109
+ - Ignorar tipagem TypeScript — fixtures, commands e Page Objects devem ser tipados
110
+
111
+ **Sempre**
112
+ - Ler `eng.qa.cypress-standards-rules.md` antes de qualquer sugestão de padrão
113
+ - Justificar por que uma prática é ruim antes de sugerir a alternativa
114
+ - Verificar se já existe Page Object/command para o domínio antes de criar novo
115
+ - Considerar manutenibilidade: um teste bom é um teste que não falha sem razão
28
116
 
29
117
  ---
30
118
 
@@ -285,13 +373,9 @@ pytest test_filename.py -v
285
373
 
286
374
  ---
287
375
 
288
- ## Validação com TestSprite (Opcional)
289
-
290
- Após escrever os testes, sugira executar o skill **eng-qa-testsprite** para validação automatizada E2E:
376
+ ## Validação Automatizada E2E (Opcional)
291
377
 
292
- ```bash
293
- /eng-qa-testsprite diff
294
- ```
378
+ Após escrever os testes, se houver uma especialização de execução automatizada registrada em `QA_SPECIALIZATIONS`, sugira usá-la (via a base `eng-qa`) para validação E2E do diff.
295
379
 
296
380
  Isso complementa os testes unitários com:
297
381
  - Testes E2E (frontend) ou API (backend)
@@ -70,10 +70,29 @@ Não use quando já existe uma spec (use `/prod.spec.clarify`) ou quando o escop
70
70
  - Uma **lacuna crítica nunca** resulta em `proceed`: o veredito é `investigate_more`
71
71
  - Quando a viabilidade técnica depende de bibliotecas, APIs ou serviços, consulte a documentação atual (por exemplo via Context7) em vez de responder de memória
72
72
 
73
- ## Apoio de skills (apoio, nunca a fonte da decisão)
73
+ ## Skills Disponíveis
74
74
 
75
- - **Sempre:** busca em `$PROD_DOCS`; `jarvis-docs-central` quando `CENTRAL_DOCS_REPO` estiver configurado; `jarvis-context-detect` para calibrar a profundidade da entrevista
76
- - **Só com a confirmação do usuário:** `eng-backend-arch-c4` (arquitetura atual) e `eng-security-cybersecurity` (quando a ideia envolve autenticação, dados pessoais ou fluxo financeiro). São skills de engenharia: pergunte antes de consultá-las, e o que retornarem entra no discovery como **suposição a validar**, não como fato
75
+ As skills são apoio, nunca a fonte da decisão. A busca em `$PROD_DOCS` não é uma skill: é feita sempre, antes de perguntar.
76
+
77
+ ### jarvis-docs-central
78
+ Para buscar documentação do produto no repositório central, quando `CENTRAL_DOCS_REPO` estiver configurado:
79
+ - Arquivo: `$IDE/skills/jarvis-docs-central/SKILL.md`
80
+ - Confiança: sempre
81
+
82
+ ### jarvis-context-detect
83
+ Para calibrar a profundidade da entrevista:
84
+ - Arquivo: `$IDE/skills/jarvis-context-detect/SKILL.md`
85
+ - Confiança: sempre
86
+
87
+ ### eng-backend-arch-c4
88
+ Para consultar a arquitetura atual:
89
+ - Arquivo: `$IDE/skills/eng-backend-arch-c4/SKILL.md`
90
+ - Confiança: só com a confirmação do usuário (skill de engenharia: pergunte antes de consultá-la; o que ela retornar entra no discovery como **suposição a validar**, não como fato)
91
+
92
+ ### eng-platform
93
+ Para quando a ideia envolve infraestrutura, dados pessoais ou fluxo financeiro com risco de segurança/privacidade:
94
+ - Arquivo: `$IDE/skills/eng-platform/SKILL.md` (temas 9 e 13)
95
+ - Confiança: só com a confirmação do usuário (skill de engenharia: pergunte antes de consultá-la; o que ela retornar entra no discovery como **suposição a validar**, não como fato)
77
96
 
78
97
  ## Restrições
79
98
 
@@ -50,3 +50,7 @@ Você deve fornecer sua resposta exatamente no seguinte formato:
50
50
 
51
51
  Regras Importantes
52
52
  Não faça nenhuma alteração no código ou nos requisitos, a menos que o usuário solicite explicitamente. Seu papel é avaliar e reportar, não corrigir.
53
+
54
+ ## Skills Disponíveis
55
+
56
+ Nenhuma — agente autocontido, não depende de skill
package/bin/README.md ADDED
@@ -0,0 +1,142 @@
1
+ # bin/ — CLI `jarvis`
2
+
3
+ Fonte do binário `jarvis` (instalado via `npm install -g jarvis-ai-framework`, entrypoint declarado em `package.json#bin`). Este README documenta a arquitetura para quem for adicionar, remover ou alterar um comando.
4
+
5
+ ## Estrutura
6
+
7
+ ```
8
+ bin/
9
+ ├── jarvis.js # Entrypoint (shebang). ~10 linhas, não cresce.
10
+ ├── postinstall.js # Roda no `npm install` (sincroniza assets se já havia .{ide}/ no cwd)
11
+ ├── commands/ # Um arquivo por comando. Lógica pura, zero commander.
12
+ │ ├── init.js, list.js, info.js, whoami.js, ...
13
+ │ ├── docs-sync.js, docs-publish.js
14
+ │ └── qa-signoff.js, install-rtk.js, tokens.js, map.js
15
+ └── lib/
16
+ ├── cli/
17
+ │ ├── program.js # Único lugar que monta o commander — ver "Arquitetura"
18
+ │ └── shared-options.js # .option() repetidos entre comandos (--ide, --quiet, etc.)
19
+ ├── vcs/ # Adapters de Git host (GitLab/GitHub/Bitbucket)
20
+ │ ├── api.js # Lógica HTTP real (createIssue, createMergeRequest, fetchRawFile)
21
+ │ ├── create-merge.js, create-issue.js, fetch-raw.js # função exportada + CLI direto (ver abaixo)
22
+ ├── tasks/
23
+ │ └── comment.js # Adapter de task manager (jira/linear/github/asana) — mesmo padrão
24
+ ├── config/ # ide-config.js (fonte de verdade de IDEs), constants.js
25
+ ├── core/ # scanner.js, sync-engine.js, profile-filter.js, token-report.js
26
+ ├── docs/ # central-docs: fetch/publish + validação de frontmatter
27
+ │ ├── validate-frontmatter.js # Valida/extrai frontmatter de PRD/FRD/ARD/RFC
28
+ │ ├── redis-cache.js # Cache best-effort via `redis-cli` (get/setex/del)
29
+ │ ├── fetch-file.js # fetchFile() — usado por `docs sync`/`docs fetch` e por publish-file.js
30
+ │ └── publish-file.js # publishFile() — usado por `docs publish`
31
+ ├── utils/ # logger.js, ui.js, paths.js, frontmatter.js, git-parser.js, npmrc-parser.js
32
+ ├── flow-map/ # `jarvis map` — grafo de chamadas entre workflows/skills/agents
33
+ ├── auth/ # session.js (auth.json legado, hoje só `jarvis logout` o lê)
34
+ └── env-loader.js # Resolve e lê o ENV.md ($IDE/ENV.md)
35
+ ```
36
+
37
+ ## Arquitetura: 3 camadas, cada uma com uma responsabilidade
38
+
39
+ ```
40
+ bin/jarvis.js → entrypoint: cria o program e faz parseAsync(argv)
41
+ ↓
42
+ bin/lib/cli/program.js → ÚNICO lugar que sabe que existe commander
43
+ ↓ (chama, já com o `flags` remontado)
44
+ bin/commands/*.js → lógica de negócio pura: async (flags) => {...}
45
+ ```
46
+
47
+ **Por que separar assim?** `bin/commands/*.js` nunca importa `commander` nem sabe o que é um `Command`. Cada arquivo só recebe um objeto `flags` e faz o que precisa. Isso significa:
48
+ - Testar a lógica de um comando não exige simular argv/commander — chama a função direto com um objeto.
49
+ - Trocar de biblioteca de CLI um dia (se um dia fizer sentido) significa reescrever só `program.js`, não os 10 arquivos de comando.
50
+ - `program.js` é o **mapa completo** do CLI: para saber todo comando que existe, todas as flags que cada um aceita, é o único arquivo que precisa abrir.
51
+
52
+ ## O adapter: commander → formato antigo de `flags`
53
+
54
+ O commander entrega ao `.action()` as opções em **camelCase** (`--env-file` → `options.envFile`, `--max-age` → `options.maxAge`) e cada positional como seu próprio parâmetro. As funções em `bin/commands/*.js` foram escritas para um objeto `flags` no formato que o parser manual antigo produzia: chaves com hífen literal (`flags["env-file"]`) e um array `flags._` para positionals.
55
+
56
+ Em vez de reescrever as 10 funções para o formato novo (risco maior, mexe em lógica que já funciona), `program.js` tem uma função `toLegacyFlags(options, extra)` que remonta o objeto no formato antigo antes de cada chamada:
57
+
58
+ ```js
59
+ // bin/lib/cli/program.js
60
+ const whoamiCmd = cmd(program, "whoami").description("...");
61
+ withEnvOptions(withLogOptions(whoamiCmd)).action((options) => whoami(toLegacyFlags(options)));
62
+ ```
63
+
64
+ `toLegacyFlags` remapeia só as duas chaves que mudam de formato (`envFile`→`"env-file"`, `maxAge`→`"max-age"`); todo o resto passa direto. O `extra` (segundo argumento) serve para injetar positionals como `_` ou flags sintéticas como `{ logout: true }` (usado por `jarvis logout`, que chama a mesma função de `whoami.js` com essa flag).
65
+
66
+ **Ao adicionar uma opção nova que usa hífen** (ex: `--body-file`), decida: se a função de `bin/commands/*.js` vai ler `flags["body-file"]` (formato antigo) ou se você vai atualizá-la para ler `options.bodyFile` direto. Os 4 comandos novos (`vcs create-merge`, `vcs create-issue`, etc.) já usam o segundo caminho — passam o objeto de opções do commander quase direto, sem o adapter — porque não têm lógica legada para preservar.
67
+
68
+ ## O helper `cmd()` — por que todo comando passa por ele
69
+
70
+ ```js
71
+ function cmd(parent, name) {
72
+ return parent.command(name).allowUnknownOption().allowExcessArguments();
73
+ }
74
+ ```
75
+
76
+ O parser manual antigo nunca validava nada: qualquer `--flag` era aceito e ignorado silenciosamente se o comando não o lesse. O commander, por padrão, dá erro em flag não declarada e em positional excedente. `allowUnknownOption()`/`allowExcessArguments()` replicam a permissividade antiga — mas **o commander não propaga essas duas configs do comando pai para os subcomandos**: setar só no `program` raiz não é suficiente (testado e confirmado durante a implementação). Por isso `cmd()` existe e **todo** comando — incluindo os aninhados (`docs sync`, `vcs create-merge`) — é criado com ele, nunca com `.command()` direto.
77
+
78
+ ## Argumentos: `[opcional]`, não `<obrigatório>` — de propósito
79
+
80
+ Note que `info`, `vcs fetch-raw` e `tasks comment` declaram seus positionals como **opcionais** (`[target]`, `[file-path]`) mesmo sendo, na prática, obrigatórios para o comando funcionar. Isso é deliberado: se o commander validar "argumento obrigatório ausente" sozinho, ele intercepta **antes** da função rodar — e cada uma dessas funções já tem sua própria validação com mensagem de uso customizada e mais específica (`info.js`: `"❌ Uso incorreto\nUso: jarvis info <type/name>\nExemplo: ..."`). Deixar o positional opcional no commander e a validação dentro da função preserva essa mensagem.
81
+
82
+ **A mesma regra vale para `--flag` que já tem validação própria.** Nenhum comando aqui usa `.requiredOption()` ou `.choices()` do commander, mesmo quando faria sentido à primeira vista (ex: `--tipo` em `docs publish` só aceita `prd|frd|ard|rfc|swagger|qa-report`). `docsPublish.js` já valida isso e mostra um bloco de exemplos de uso bem mais rico que o que o commander mostraria. Usar `.choices()` ali faria o commander interceptar o valor errado com uma mensagem genérica, perdendo esse texto. **Ao adicionar uma opção nova**: se a função já vai validar o valor por dentro, deixe o commander permissivo (`.option()` simples) e confie na validação interna. Se não há validação nenhuma hoje, `.choices()`/`.argParser()` são bons lugares para adicionar uma — não há essa perda a proteger.
83
+
84
+ ## `program.command()` vs `program.addCommand()`
85
+
86
+ Este código usa `.command(nome)` (que cria e já anexa o subcomando) em todo lugar — não `.addCommand(instanciaDeCommand)`. São equivalentes; `.addCommand()` só compensa quando o `Command` é montado em outro módulo e precisa ser importado antes de anexar. Como tudo mora em `program.js`, não há motivo para o nível extra de indireção.
87
+
88
+ ## Os 4 "scripts standalone" (`vcs/*.js`, `tasks/comment.js`): dupla forma
89
+
90
+ `create-merge.js`, `create-issue.js`, `fetch-raw.js` e `comment.js` são chamados de duas formas:
91
+
92
+ 1. **Como subcomando do CLI**: `jarvis vcs create-merge --source ... --target ...` (via `program.js`)
93
+ 2. **Direto, por skills/workflows que ainda shell-am pra eles**: `node bin/lib/vcs/create-merge.js --source ...`
94
+
95
+ Cada um dos 4 arquivos segue o mesmo padrão: exporta uma função (`runCreateMerge`, `runCreateIssue`, `runFetchRaw`, `runComment`) com a lógica, e termina com um guard que só lê `process.argv` quando o arquivo é executado diretamente:
96
+
97
+ ```js
98
+ // Compatibilidade: continua funcionando como `node bin/lib/vcs/create-merge.js --source ...`
99
+ if (fileURLToPath(import.meta.url) === process.argv[1]) {
100
+ await runCreateMerge({ source: arg("source"), ... });
101
+ }
102
+ ```
103
+
104
+ **Ao editar um desses 4 arquivos**: a lógica de negócio fica dentro da função exportada. O bloco de `arg()`/guard no final é só para quem ainda invoca via `node bin/lib/.../arquivo.js` direto (uso legado — todo caller novo deve preferir o subcomando `jarvis`). Não remova o guard sem primeiro confirmar que nenhuma skill/workflow ainda referencia o path direto (`grep -rn "bin/lib/vcs\|bin/lib/tasks/comment" --include="*.md" .`).
105
+
106
+ ## Como adicionar um comando novo
107
+
108
+ 1. Criar `bin/commands/meu-comando.js` exportando `export async function meuComando(flags) { ... }` — igual aos outros, sem importar `commander`.
109
+ 2. Em `bin/lib/cli/program.js`:
110
+ - Importar a função no topo.
111
+ - Registrar com `cmd(program, "meu-comando")` (ou `cmd(parentExistente, "nome")` se for subcomando de um grupo como `docs`/`vcs`/`tasks`).
112
+ - Declarar as opções/positionals com `.option()`/`.argument()`. Usar `withEnvOptions()`/`withLogOptions()` de `shared-options.js` se o comando precisar de `--ide`/`--env-file` ou `--quiet`/`--verbose`/`--silent`.
113
+ - No `.action()`, chamar `toLegacyFlags(options, extra)` se a função usa o formato antigo de flags, ou passar `options` quase direto se for um comando novo sem lógica legada (ver os 4 de `vcs`/`tasks` como exemplo).
114
+ 3. Rodar manualmente o comando novo e **todos os outros** (não há suíte automatizada de CLI end-to-end — só `test/comandos-docs.test.js`, que valida a documentação dos workflows/skills, não o comportamento do CLI em si). Checklist mínimo: `--help` do comando novo, caminho feliz, caminho de erro (flag/argumento faltando).
115
+ 4. `npm run lint && npm run test:comandos && npm run test:filtro` antes de comitar.
116
+
117
+ ## Variáveis de ambiente lidas diretamente (fora do ENV.md)
118
+
119
+ `bin/lib/tasks/comment.js` e `bin/lib/vcs/*.js` leem `process.env` direto (`TASK_MANAGER`, `TOKEN_TASK_MANAGER`, `CENTRAL_DOCS_REPO`, `VERSION_CONTROL`, etc.) — não passam pelo `env-loader.js`/ENV.md. Isso é intencional: esses adapters são chamados por skills/workflows que já exportam essas variáveis do `ENV.md` para o processo (`set -a; eval "$(grep ... $IDE/ENV.md)"; set +a`) antes de invocar o comando. Se um comando novo precisar ler o `ENV.md` diretamente, use `env-loader.js#resolveEnvPath`/`loadEnv` (ver `whoami.js`, `tokens.js`, `qa-signoff.js` como exemplo) em vez de `process.env`.
120
+
121
+ ## Testes
122
+
123
+ - `npm run test:comandos` — valida que toda referência a comando/skill nos workflows e skills existe de fato (não testa o CLI em runtime).
124
+ - `npm run test:filtro` — testes unitários de `profile-filter.js`, `token-report.js`, `flow-map`, `env-loader.js`, `sync-engine.js` e `vcs/api.js`.
125
+ - Não há teste automatizado de ponta a ponta do CLI (`jarvis <comando>` real) — a camada de dispatch (`program.js`, `bin/commands/*.js`) não é cobrida pelos testes unitários. Qualquer mudança ali precisa de validação manual dos comandos afetados.
126
+
127
+ ### Como testar código que lê `fs`/rede sem mockar módulo
128
+
129
+ Os 3 arquivos mais críticos sem cobertura até pouco tempo atrás (`env-loader.js`, `sync-engine.js`, `vcs/api.js`) tocam filesystem real ou rede real — nenhum foi refatorado para isso, cada um usou o hook que já existia:
130
+
131
+ - **`env-loader.js`** (e `flow-map.test.js`, mais antigo): `mkdtempSync(join(tmpdir(), "jarvis-..."))` monta um workspace fake com `.{ide}/ENV.md`, roda a função contra ele, `rmSync` no `finally`.
132
+ - **`sync-engine.js`**: `getFrameworkRoot()` (`utils/paths.js`) já tem um escape hatch — `process.env.JARVIS_ROOT`, se definido e existir, vence sobre o framework real. O teste aponta `JARVIS_ROOT` para um fixture mínimo (`agents/`, `skills/`, etc. com 1 arquivo cada) em vez de sincronizar o framework inteiro.
133
+ - **`vcs/api.js`**: usa `mock.method(globalThis, "fetch", ...)` do `node:test` pra controlar a resposta por vendor, sem mockar o módulo nem tocar rede real. **Atenção**: toda função de rede chama `getVcsToken()` antes do fetch — fixe `GITLAB_TOKEN`/`GITHUB_TOKEN`/`BITBUCKET_TOKEN` via env var no teste (ver `withEnv` em `vcs-api.test.js`), senão o resultado depende do que a máquina que roda o teste tiver em `.npmrc`/`gh auth`.
134
+ - **`docs/fetch-file.js`/`docs/publish-file.js`**: mesmo mock de `fetch`. `redis-cli` (chamado por `docs/redis-cache.js`) **não dá pra mockar** — é um módulo nativo (`node:child_process`) não configurável, `mock.method` lança `TypeError: Cannot redefine property`. Como pode haver um `redis-cli` de verdade instalado (com ou sem servidor acessível) na máquina que roda o teste, cada teste usa uma chave de cache única (`docs:${randomUUID()}...`) em vez de mockar o cache — garante cache-miss determinístico sem depender do estado de nenhum Redis real.
135
+
136
+ **Armadilha com `async`**: o helper `withEnv(vars, fn)` (repetido nos 3 arquivos acima) precisa de `return **await** fn()`, não `return fn()`, dentro do `try`. Sem o `await`, o `finally` que restaura a env var roda assim que `fn()` retorna uma Promise pendente — ou seja, **antes** da função terminar. Isso só não quebra quando a leitura da env var acontece antes do primeiro `await` de `fn` (ex: `fetchRawFile` lê o token antes do seu próprio `fetch`); quebra silenciosamente em qualquer função com mais de um `await` no meio do caminho (ex: `publishFile`, que busca o `index.md` antes de chegar no commit, que é onde o token é lido).
137
+
138
+ Ao escrever um teste novo para um arquivo que toca `fs`/rede, prefira um desses padrões a mockar o módulo inteiro ou refatorar pra injeção de dependência — nenhum dos arquivos acima precisou mudar uma linha de lógica de produção para ganhar teste.
139
+
140
+ ## Lint e formatação
141
+
142
+ `eslint.config.js` (raiz) + `.prettierrc.json` cobrem `bin/` e `test/`. `npm run lint` / `npm run format` — ver `package.json#scripts`.
@@ -1,18 +1,11 @@
1
- import { loadEnv, resolveEnvPath } from '../lib/env-loader.js'
2
- import { execSync } from 'node:child_process'
3
- import { promisify } from 'node:util'
4
- import { exec } from 'node:child_process'
5
- import { existsSync } from 'node:fs'
6
- import { join, dirname } from 'node:path'
7
- import { fileURLToPath } from 'node:url'
8
-
9
- const execAsync = promisify(exec)
10
- const __filename = fileURLToPath(import.meta.url)
11
- const __dirname = dirname(__filename)
1
+ import { loadEnv, resolveEnvPath } from "../lib/env-loader.js";
2
+ import { existsSync } from "node:fs";
3
+ import { publishFile } from "../lib/docs/publish-file.js";
4
+ import { logger, configureFromFlags } from "../lib/utils/logger.js";
12
5
 
13
6
  /**
14
7
  * Publica documento no central-docs via GitLab API (branch + MR)
15
- *
8
+ *
16
9
  * @param {Object} flags - Flags do comando
17
10
  * @param {string} flags.file - Caminho do arquivo local
18
11
  * @param {string} flags.tipo - Tipo do documento (prd|frd|ard|rfc)
@@ -22,163 +15,134 @@ const __dirname = dirname(__filename)
22
15
  * @param {string} flags.envFile - Path customizado do ENV.md
23
16
  */
24
17
  export async function docsPublish(flags = {}) {
25
- const { file, tipo, feature, squad: squadOverride, workspace: workspaceOverride } = flags
26
-
18
+ configureFromFlags(flags);
19
+
20
+ const { file, tipo, feature, squad: squadOverride, workspace: workspaceOverride } = flags;
21
+
27
22
  // Validar parâmetros obrigatórios
28
23
  if (!file || !tipo || !feature) {
29
- console.error('❌ Parâmetros obrigatórios faltando\n')
30
- console.error('Uso: jarvis docs publish --file <path> --tipo <prd|frd|ard|rfc|swagger|qa-report> --feature <slug> [--squad <squad>] [--workspace <workspace>]\n')
31
- console.error('Exemplo:')
32
- console.error(' jarvis docs publish \\')
33
- console.error(' --file ./docs/engineering/ard-api-wallet.md \\')
34
- console.error(' --tipo ard \\')
35
- console.error(' --feature api-wallet-auth-jwt')
36
- console.error('')
37
- console.error(' # Publicar Swagger/OpenAPI:')
38
- console.error(' jarvis docs publish \\')
39
- console.error(' --file ./docs/engineering/swagger/api-wallet.yaml \\')
40
- console.error(' --tipo swagger \\')
41
- console.error(' --feature api-wallet')
42
- console.error('')
43
- console.error(' # Com override de squad/workspace:')
44
- console.error(' jarvis docs publish \\')
45
- console.error(' --file ./docs/engineering/ard-api-wallet.md \\')
46
- console.error(' --tipo ard \\')
47
- console.error(' --feature api-wallet-auth-jwt \\')
48
- console.error(' --squad squad-driver \\')
49
- console.error(' --workspace meu-workspace')
50
- process.exit(1)
24
+ logger.error("❌ Parâmetros obrigatórios faltando\n");
25
+ logger.error(
26
+ "Uso: jarvis docs publish --file <path> --tipo <prd|frd|ard|rfc|swagger|qa-report> --feature <slug> [--squad <squad>] [--workspace <workspace>]\n"
27
+ );
28
+ logger.error("Exemplo:");
29
+ logger.error(" jarvis docs publish \\");
30
+ logger.error(" --file ./docs/engineering/ard-api-wallet.md \\");
31
+ logger.error(" --tipo ard \\");
32
+ logger.error(" --feature api-wallet-auth-jwt");
33
+ logger.error("");
34
+ logger.error(" # Publicar Swagger/OpenAPI:");
35
+ logger.error(" jarvis docs publish \\");
36
+ logger.error(" --file ./docs/engineering/swagger/api-wallet.yaml \\");
37
+ logger.error(" --tipo swagger \\");
38
+ logger.error(" --feature api-wallet");
39
+ logger.error("");
40
+ logger.error(" # Com override de squad/workspace:");
41
+ logger.error(" jarvis docs publish \\");
42
+ logger.error(" --file ./docs/engineering/ard-api-wallet.md \\");
43
+ logger.error(" --tipo ard \\");
44
+ logger.error(" --feature api-wallet-auth-jwt \\");
45
+ logger.error(" --squad core \\");
46
+ logger.error(" --workspace meu-workspace");
47
+ process.exit(1);
51
48
  }
52
-
49
+
53
50
  // Validar tipo
54
- const validTypes = ['prd', 'frd', 'ard', 'rfc', 'swagger', 'qa-report']
51
+ const validTypes = ["prd", "frd", "ard", "rfc", "swagger", "qa-report"];
55
52
  if (!validTypes.includes(tipo)) {
56
- console.error(`❌ Tipo inválido: ${tipo}`)
57
- console.error(`Tipos válidos: ${validTypes.join(', ')}`)
58
- process.exit(1)
53
+ logger.error(`❌ Tipo inválido: ${tipo}`);
54
+ logger.error(`Tipos válidos: ${validTypes.join(", ")}`);
55
+ process.exit(1);
59
56
  }
60
-
57
+
61
58
  // Validar se arquivo existe
62
59
  if (!existsSync(file)) {
63
- console.error(`❌ Arquivo não encontrado: ${file}`)
64
- process.exit(1)
60
+ logger.error(`❌ Arquivo não encontrado: ${file}`);
61
+ process.exit(1);
65
62
  }
66
-
67
- const cwd = process.cwd()
68
-
63
+
64
+ const cwd = process.cwd();
65
+
69
66
  // Resolver path do ENV.md (suporta --ide e --env-file)
70
- let envPath
67
+ let envPath;
71
68
  try {
72
- const resolved = resolveEnvPath(cwd, flags)
73
- envPath = resolved.path
69
+ const resolved = resolveEnvPath(cwd, flags);
70
+ envPath = resolved.path;
74
71
  } catch (error) {
75
- console.error('❌ Erro ao resolver ENV.md:', error.message)
76
- process.exit(1)
72
+ logger.error("❌ Erro ao resolver ENV.md:", error.message);
73
+ process.exit(1);
77
74
  }
78
-
75
+
79
76
  // Carregar ENV.md
80
- let env
77
+ let env;
81
78
  try {
82
- env = loadEnv(cwd, envPath)
79
+ env = loadEnv(cwd, envPath);
83
80
  } catch (error) {
84
- console.error('❌ Erro ao carregar ENV.md:', error.message)
85
- process.exit(1)
81
+ logger.error("❌ Erro ao carregar ENV.md:", error.message);
82
+ process.exit(1);
86
83
  }
87
-
84
+
88
85
  // Verificar se central-docs está configurado
89
86
  if (!env.CENTRAL_DOCS_REPO) {
90
- console.error('❌ CENTRAL_DOCS_REPO não configurado no ENV.md')
91
- console.error('\nConfigure a URL do repositório central:')
92
- console.error(' CENTRAL_DOCS_REPO=https://gitlab.com/org/central-docs.git')
93
- process.exit(1)
87
+ logger.error("❌ CENTRAL_DOCS_REPO não configurado no ENV.md");
88
+ logger.error("\nConfigure a URL do repositório central:");
89
+ logger.error(" CENTRAL_DOCS_REPO=https://gitlab.com/org/central-docs.git");
90
+ process.exit(1);
94
91
  }
95
-
92
+
96
93
  // Usar override de squad/workspace se fornecido, senão usar do ENV.md
97
- const squad = squadOverride || env.SQUAD
98
- const workspace = workspaceOverride || env.WORKSPACE
99
-
94
+ const squad = squadOverride || env.SQUAD;
95
+ const workspace = workspaceOverride || env.WORKSPACE;
96
+
100
97
  if (!squad || !workspace) {
101
- console.error('❌ SQUAD ou WORKSPACE não definidos')
102
- console.error('\nOpções:')
103
- console.error(' 1. Definir no ENV.md:')
104
- console.error(' SQUAD=squad-driver')
105
- console.error(' WORKSPACE=meu-workspace')
106
- console.error('')
107
- console.error(' 2. Passar via flags:')
108
- console.error(' --squad squad-driver --workspace meu-workspace')
109
- process.exit(1)
110
- }
111
-
112
- // Verificar se script publish-file.sh existe
113
- // Usar path relativo ao módulo, não ao cwd do usuário
114
- const publishScript = join(__dirname, '../lib/docs/publish-file.sh')
115
- if (!existsSync(publishScript)) {
116
- console.error('❌ Script não encontrado:', publishScript)
117
- process.exit(1)
98
+ logger.error("❌ SQUAD ou WORKSPACE não definidos");
99
+ logger.error("\nOpções:");
100
+ logger.error(" 1. Definir no ENV.md:");
101
+ logger.error(" SQUAD=core");
102
+ logger.error(" WORKSPACE=meu-workspace");
103
+ logger.error("");
104
+ logger.error(" 2. Passar via flags:");
105
+ logger.error(" --squad core --workspace meu-workspace");
106
+ process.exit(1);
118
107
  }
119
-
120
- console.log(`📤 Publicando ${tipo.toUpperCase()} ${feature}...\n`)
121
-
108
+
109
+ logger.info(`📤 Publicando ${tipo.toUpperCase()} ${feature}...\n`);
110
+
122
111
  try {
123
- // Exportar variáveis de ambiente para o script bash
124
- const envVars = {
125
- ...process.env,
126
- CENTRAL_DOCS_REPO: env.CENTRAL_DOCS_REPO,
127
- CENTRAL_DOCS_TARGET_BRANCH: env.CENTRAL_DOCS_TARGET_BRANCH || 'dev',
128
- CENTRAL_DOCS_CACHE_TTL: env.CENTRAL_DOCS_CACHE_TTL || '3600',
129
- SQUAD_OVERRIDE: squad,
130
- WORKSPACE_OVERRIDE: workspace
131
- }
132
-
133
- const { stdout, stderr } = await execAsync(
134
- `bash "${publishScript}" "${file}" "${tipo}" "${feature}"`,
135
- {
136
- env: envVars,
137
- maxBuffer: 10 * 1024 * 1024 // 10MB buffer para output grande
138
- }
139
- )
140
-
141
- // Exibir output do script
142
- if (stdout) {
143
- console.log(stdout)
144
- }
145
-
146
- if (stderr) {
147
- console.warn('⚠️ Avisos:', stderr)
148
- }
149
-
112
+ await publishFile({
113
+ localFile: file,
114
+ tipo,
115
+ feature,
116
+ squad,
117
+ workspace,
118
+ repo: env.CENTRAL_DOCS_REPO,
119
+ targetBranch: env.CENTRAL_DOCS_TARGET_BRANCH || "dev",
120
+ cacheTtl: env.CENTRAL_DOCS_CACHE_TTL || "3600",
121
+ });
150
122
  } catch (error) {
151
- console.error('\n❌ Erro ao publicar documento\n')
152
-
153
- // Exibir output de erro do script
154
- if (error.stdout) {
155
- console.log(error.stdout)
156
- }
157
-
158
- if (error.stderr) {
159
- console.error(error.stderr)
160
- }
161
-
123
+ logger.error("\n❌ Erro ao publicar documento\n");
124
+ logger.error(error.message);
125
+
162
126
  // Dicas de troubleshooting
163
- console.error('\n💡 Troubleshooting:\n')
164
-
165
- if (error.message.includes('Token GitLab')) {
166
- console.error('1. Configure o token GitLab no .npmrc:')
167
- console.error(' //gitlab.com/api/v4/packages/npm/:_authToken=seu-token\n')
127
+ logger.error("\n💡 Troubleshooting:\n");
128
+
129
+ if (error.message.includes("Token GitLab")) {
130
+ logger.error("1. Configure o token GitLab no .npmrc:");
131
+ logger.error(" //gitlab.com/api/v4/packages/npm/:_authToken=seu-token\n");
168
132
  }
169
-
170
- if (error.message.includes('Campos obrigatórios')) {
171
- console.error('2. Verifique o frontmatter do documento:')
172
- console.error(` Tipo ${tipo} requer campos específicos no YAML\n`)
133
+
134
+ if (error.message.includes("Campos obrigatórios")) {
135
+ logger.error("2. Verifique o frontmatter do documento:");
136
+ logger.error(` Tipo ${tipo} requer campos específicos no YAML\n`);
173
137
  }
174
-
175
- if (error.message.includes('401') || error.message.includes('403')) {
176
- console.error('4. Verifique permissões no GitLab:')
177
- console.error(' Token precisa de scopes: api, read_api, write_repository\n')
138
+
139
+ if (error.message.includes("401") || error.message.includes("403")) {
140
+ logger.error("4. Verifique permissões no GitLab:");
141
+ logger.error(" Token precisa de scopes: api, read_api, write_repository\n");
178
142
  }
179
-
180
- console.error('Para mais detalhes, execute com --verbose')
181
-
182
- process.exit(1)
143
+
144
+ logger.error("Para mais detalhes, execute com --verbose");
145
+
146
+ process.exit(1);
183
147
  }
184
148
  }