jarvis-ai-framework 2.1.1 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +14 -115
- package/agents/AGENTS.md +11 -23
- package/agents/README.md +27 -129
- package/agents/engineering/data/eng.data-engineer.agent.md +11 -34
- package/agents/engineering/eng.advisor.agent.md +56 -0
- package/agents/engineering/eng.agent.md +14 -24
- package/agents/engineering/eng.bug-hunter.md +7 -15
- package/agents/engineering/eng.dev-code-reviewer.md +1 -1
- package/agents/engineering/eng.frontend.agent.md +3 -7
- package/agents/engineering/eng.rpa.agent.md +2 -8
- package/agents/engineering/qa/eng.qa.quality-strategist.md +6 -11
- package/agents/engineering/qa/eng.qa.test-architect.md +8 -18
- package/agents/engineering/qa/eng.qa.test-planner.md +10 -14
- package/agents/engineering/qa/eng.qa.testing-engineer.md +91 -24
- package/agents/product/prod.discovery-interviewer.md +3 -3
- package/bin/README.md +142 -0
- package/bin/commands/docs-publish.js +105 -141
- package/bin/commands/docs-sync.js +66 -104
- package/bin/commands/info.js +7 -27
- package/bin/commands/init.js +23 -51
- package/bin/commands/install-rtk.js +9 -3
- package/bin/commands/list.js +5 -18
- package/bin/commands/map.js +20 -5
- package/bin/commands/qa-signoff.js +58 -55
- package/bin/commands/tokens.js +14 -17
- package/bin/commands/whoami.js +30 -26
- package/bin/jarvis.js +9 -163
- package/bin/lib/auth/session.js +20 -20
- package/bin/lib/cli/program.js +219 -0
- package/bin/lib/cli/shared-options.js +29 -0
- package/bin/lib/config/constants.js +59 -2
- package/bin/lib/config/ide-config.js +4 -8
- package/bin/lib/core/profile-filter.js +4 -1
- package/bin/lib/core/scanner.js +3 -29
- package/bin/lib/core/sync-engine.js +21 -14
- package/bin/lib/core/token-report.js +12 -2
- package/bin/lib/docs/fetch-file.js +39 -0
- package/bin/lib/docs/publish-file.js +194 -0
- package/bin/lib/docs/redis-cache.js +49 -0
- package/bin/lib/docs/validate-frontmatter.js +9 -39
- package/bin/lib/env-loader.js +11 -34
- package/bin/lib/flow-map/parse.js +11 -5
- package/bin/lib/flow-map/render.js +5 -2
- package/bin/lib/flow-map/tree.js +59 -10
- package/bin/lib/tasks/comment.js +40 -35
- package/bin/lib/utils/frontmatter.js +57 -0
- package/bin/lib/utils/git-parser.js +4 -6
- package/bin/lib/utils/npmrc-parser.js +6 -13
- package/bin/lib/utils/paths.js +2 -4
- package/bin/lib/utils/ui.js +3 -9
- package/bin/lib/vcs/api.js +25 -41
- package/bin/lib/vcs/create-issue.js +49 -33
- package/bin/lib/vcs/create-merge.js +47 -31
- package/bin/lib/vcs/fetch-raw.js +35 -23
- package/package.json +14 -5
- package/rules/engineering/eng-rules.md +1 -1
- package/rules/engineering/eng-security-rules.md +18 -16
- package/rules/engineering/eng.bump-rules.md +3 -2
- package/rules/engineering/eng.docs-scraping-rules.md +4 -4
- package/rules/engineering/eng.integrations-rules.md +6 -4
- package/rules/engineering/eng.skills-rules.md +1 -1
- package/rules/engineering/eng.specializations-rules.md +18 -4
- package/rules/engineering/frontend/eng.frontend-rules.md +1 -4
- package/rules/engineering/qa/eng.qa.cypress-standards-rules.md +1 -1
- package/rules/engineering/rpa/eng.rpa-rules.md +4 -9
- package/rules-on-demand/engineering/eng.pre-pr-rules.md +1 -1
- package/rules-on-demand/engineering/eng.start-rules.md +2 -0
- package/skills/AGENTS.md +52 -87
- package/skills/SKILLS-ROADMAP.md +47 -128
- package/skills/eng-ai/SKILL.md +270 -0
- package/skills/eng-ai/references/1-fundamentos-ml.md +24 -0
- package/skills/eng-ai/references/10-arquitetura-solucoes-ia.md +24 -0
- package/skills/eng-ai/references/11-governanca-ia.md +24 -0
- package/skills/eng-ai/references/12-seguranca-ia-responsavel.md +25 -0
- package/skills/eng-ai/references/2-matematica-estatistica.md +24 -0
- package/skills/eng-ai/references/3-dados-para-ia.md +24 -0
- package/skills/eng-ai/references/4-deep-learning-fundacionais.md +24 -0
- package/skills/eng-ai/references/5-llms-chatbots-agentes-rag.md +25 -0
- package/skills/eng-ai/references/6-avaliacao-experimentacao.md +24 -0
- package/skills/eng-ai/references/7-engenharia-sistemas-ia.md +24 -0
- package/skills/eng-ai/references/8-mlops-plataforma.md +24 -0
- package/skills/eng-ai/references/9-produto-ia.md +24 -0
- package/skills/eng-ai/references/especializacoes.md +17 -0
- package/skills/eng-automation/SKILL.md +290 -0
- package/skills/eng-automation/references/1-fundamentos-automacao.md +25 -0
- package/skills/eng-automation/references/10-ingestao-dados.md +25 -0
- package/skills/eng-automation/references/11-captcha-antibot.md +25 -0
- package/skills/eng-automation/references/12-limites-taxa-sessoes.md +25 -0
- package/skills/eng-automation/references/13-agendamento-orquestracao.md +24 -0
- package/skills/eng-automation/references/14-retentativa-erros.md +25 -0
- package/skills/eng-automation/references/15-autenticacao-credenciais.md +24 -0
- package/skills/eng-automation/references/16-observabilidade-confiabilidade.md +24 -0
- package/skills/eng-automation/references/2-aquisicao-dados.md +25 -0
- package/skills/eng-automation/references/3-automacao-navegador.md +24 -0
- package/skills/eng-automation/references/4-scraping-crawling.md +25 -0
- package/skills/eng-automation/references/5-apis-rest-graphql-soap.md +26 -0
- package/skills/eng-automation/references/6-webhooks-integracao.md +25 -0
- package/skills/eng-automation/references/7-rpa.md +25 -0
- package/skills/eng-automation/references/8-extracao-estruturada.md +25 -0
- package/skills/eng-automation/references/9-extracao-documentos.md +25 -0
- package/skills/eng-automation/references/especializacoes.md +18 -0
- package/skills/eng-backend-nestjs/SKILL.md +1 -1
- package/skills/eng-data/SKILL.md +271 -0
- package/skills/eng-data/references/1-fundamentos-dados.md +24 -0
- package/skills/eng-data/references/10-ciencia-dados.md +24 -0
- package/skills/eng-data/references/11-dataops-plataforma.md +24 -0
- package/skills/eng-data/references/12-seguranca-privacidade.md +24 -0
- package/skills/eng-data/references/2-modelagem-dados.md +24 -0
- package/skills/eng-data/references/3-bancos-dados.md +24 -0
- package/skills/eng-data/references/4-arquitetura-dados.md +24 -0
- package/skills/eng-data/references/5-pipelines-integracao.md +24 -0
- package/skills/eng-data/references/6-qualidade-dados.md +24 -0
- package/skills/eng-data/references/7-governanca-metadados.md +24 -0
- package/skills/eng-data/references/8-estatistica-analise.md +24 -0
- package/skills/eng-data/references/9-analytics-bi.md +24 -0
- package/skills/eng-data/references/especializacoes.md +20 -0
- package/skills/eng-frontend/SKILL.md +12 -5
- package/skills/eng-frontend/references/13-design-system.md +48 -0
- package/skills/eng-frontend/references/14-microfrontend.md +46 -0
- package/skills/eng-global-task-comment/SKILL.md +3 -3
- package/skills/eng-platform/SKILL.md +331 -0
- package/skills/eng-platform/references/1-fundamentos-sistemas.md +23 -0
- package/skills/eng-platform/references/10-resiliencia-arquitetura.md +24 -0
- package/skills/eng-platform/references/11-plataforma-devex.md +24 -0
- package/skills/eng-platform/references/12-finops-custos.md +24 -0
- package/skills/eng-platform/references/13-seguranca-fundamentos.md +26 -0
- package/skills/eng-platform/references/14-profiling-performance.md +23 -0
- package/skills/eng-platform/references/15-testes-carga-chaos.md +23 -0
- package/skills/eng-platform/references/16-cache-multicamada.md +22 -0
- package/skills/eng-platform/references/2-redes.md +23 -0
- package/skills/eng-platform/references/3-cloud.md +24 -0
- package/skills/eng-platform/references/4-iac-automacao.md +24 -0
- package/skills/eng-platform/references/5-containers-orquestracao.md +25 -0
- package/skills/eng-platform/references/6-cicd-entrega.md +24 -0
- package/skills/eng-platform/references/7-observabilidade.md +24 -0
- package/skills/eng-platform/references/8-confiabilidade-sre.md +24 -0
- package/skills/eng-platform/references/9-seguranca-infra.md +26 -0
- package/skills/eng-platform/references/especializacoes.md +34 -0
- package/skills/eng-qa/SKILL.md +283 -0
- package/skills/eng-qa/references/1-fundamentos-qualidade.md +25 -0
- package/skills/eng-qa/references/10-confiabilidade.md +25 -0
- package/skills/eng-qa/references/11-seguranca.md +24 -0
- package/skills/eng-qa/references/12-acessibilidade.md +24 -0
- package/skills/eng-qa/references/13-dados-testes.md +24 -0
- package/skills/eng-qa/references/14-gestao-testes-defeitos.md +25 -0
- package/skills/eng-qa/references/15-arquitetura-qa.md +25 -0
- package/skills/eng-qa/references/2-estrategia-planejamento.md +25 -0
- package/skills/eng-qa/references/3-design-testes.md +25 -0
- package/skills/eng-qa/references/4-manual-exploratorio.md +24 -0
- package/skills/eng-qa/references/5-automacao-testes.md +25 -0
- package/skills/eng-qa/references/6-api-integracao.md +25 -0
- package/skills/eng-qa/references/7-contrato.md +24 -0
- package/skills/eng-qa/references/8-interface-compat-mobile.md +24 -0
- package/skills/eng-qa/references/9-performance.md +24 -0
- package/skills/eng-qa/references/especializacoes.md +29 -0
- package/skills/eng-qa-planner/SKILL.md +264 -0
- package/skills/jarvis-context-detect/SKILL.md +1 -1
- package/skills/jarvis-context-detect/assets/context-profile-template.md +1 -1
- package/skills/jarvis-create-specialization/SKILL.md +8 -0
- package/skills/jarvis-docs-central/README.md +31 -28
- package/skills/jarvis-docs-central/SKILL.md +5 -5
- package/skills/jarvis-init/SKILL.md +9 -8
- package/skills/jarvis-init/assets/passo-adicionar-stacks.md +47 -18
- package/skills/jarvis-list-specializations/SKILL.md +30 -17
- package/skills/jarvis-report-issue/SKILL.md +1 -1
- package/taxonomy.md +4 -16
- package/templates/AGENTS.md +2 -0
- package/templates/ENV-template.md +20 -2
- package/templates/engineering/advisor-template.md +65 -0
- package/templates/engineering/architecture-template.md +52 -4
- package/templates/engineering/qa/qa.sprint-plan-template.md +1 -1
- package/workflows/AGENTS.md +3 -1
- package/workflows/README.md +0 -10
- package/workflows/engineering/data/data.new-pipeline.md +6 -5
- package/workflows/engineering/eng.bug-audit.md +4 -14
- package/workflows/engineering/eng.debug.md +4 -20
- package/workflows/engineering/eng.plan.md +4 -26
- package/workflows/engineering/eng.pr.md +13 -63
- package/workflows/engineering/eng.pre-pr.md +14 -51
- package/workflows/engineering/eng.review.md +7 -13
- package/workflows/engineering/eng.rpa.robot.md +3 -9
- package/workflows/engineering/eng.start.md +37 -32
- package/workflows/engineering/eng.work.md +17 -40
- package/workflows/engineering/qa/eng.qa-sprint-planning.md +1 -1
- package/workflows/product/prod.spec.discovery.md +2 -2
- package/workflows/warm-up.md +35 -63
- package/agents/engineering/eng.cybersecurity.agent.md +0 -486
- package/agents/engineering/qa/eng.qa.cypress-specialist.md +0 -112
- package/bin/lib/docs/fetch-file.sh +0 -41
- package/bin/lib/docs/publish-file.sh +0 -284
- package/rules/engineering/qa/eng.qa.exploratory-session-rules.md +0 -137
- package/rules/engineering/qa/eng.qa.quality-gate-scoring-rules.md +0 -181
- package/rules/engineering/qa/eng.qa.tech-spec-validation-criteria-rules.md +0 -120
- package/skills/eng-ai-engineer/SKILL.md +0 -303
- package/skills/eng-data-bi/SKILL.md +0 -206
- package/skills/eng-data-debug/SKILL.md +0 -314
- package/skills/eng-data-engineer/SKILL.md +0 -266
- package/skills/eng-data-onboard/SKILL.md +0 -317
- package/skills/eng-data-orchestrator/SKILL.md +0 -433
- package/skills/eng-devops-performance-engineer/SKILL.md +0 -319
- package/skills/eng-frontend-design-system/SKILL.md +0 -155
- package/skills/eng-frontend-design-system/references/1-estrutura-pacote.md +0 -57
- package/skills/eng-frontend-design-system/references/2-tokens.md +0 -116
- package/skills/eng-frontend-design-system/references/3-componentes.md +0 -165
- package/skills/eng-frontend-design-system/references/4-storybook.md +0 -85
- package/skills/eng-frontend-design-system/references/5-auditoria-versionamento.md +0 -76
- package/skills/eng-frontend-microfrontend/SKILL.md +0 -164
- package/skills/eng-frontend-microfrontend/references/1-criando-remote.md +0 -109
- package/skills/eng-frontend-microfrontend/references/2-configurando-shell.md +0 -70
- package/skills/eng-frontend-microfrontend/references/3-contratos-interface.md +0 -73
- package/skills/eng-frontend-microfrontend/references/4-shared-dependencies.md +0 -48
- package/skills/eng-frontend-microfrontend/references/5-event-bus.md +0 -59
- package/skills/eng-frontend-microfrontend/references/6-monorepo-deploy.md +0 -77
- package/skills/eng-frontend-microfrontend/references/7-troubleshooting.md +0 -45
- package/skills/eng-global-browser-extension-builder/SKILL.md +0 -392
- package/skills/eng-global-jira-comment/SKILL.md +0 -27
- package/skills/eng-qa-a11y-audit/SKILL.md +0 -276
- package/skills/eng-qa-bug-report/SKILL.md +0 -877
- package/skills/eng-qa-bug-report/TASK_MANAGERS.md +0 -138
- package/skills/eng-qa-bug-report/references/1-integracao-task-managers.md +0 -148
- package/skills/eng-qa-bug-report/references/2-exemplos-de-uso.md +0 -46
- package/skills/eng-qa-bug-report/references/3-bug-to-test.md +0 -45
- package/skills/eng-qa-cypress-e2e/SKILL.md +0 -184
- package/skills/eng-qa-dev-guide/SKILL.md +0 -173
- package/skills/eng-qa-e2e/SKILL.md +0 -407
- package/skills/eng-qa-e2e-spec-writer/SKILL.md +0 -329
- package/skills/eng-qa-exploratory/SKILL.md +0 -196
- package/skills/eng-qa-gate/SKILL.md +0 -377
- package/skills/eng-qa-gate/assets/checklist-validacao.md +0 -291
- package/skills/eng-qa-graphql-contract/SKILL.md +0 -263
- package/skills/eng-qa-quality-report/SKILL.md +0 -419
- package/skills/eng-qa-test-plan/SKILL.md +0 -473
- package/skills/eng-qa-testsprite/SKILL.md +0 -332
- package/skills/eng-qa-testsprite/references/testsprite-mcp.md +0 -224
- package/skills/eng-qa-unit-test/SKILL.md +0 -478
- package/skills/eng-scraper/SKILL.md +0 -260
- package/skills/eng-scraper/references/1-puppeteer.md +0 -140
- package/skills/eng-scraper/references/2-playwright-cheerio-pdf.md +0 -82
- package/skills/eng-scraper/references/3-anti-bot.md +0 -94
- package/skills/eng-scraper/references/4-resiliencia-etl-monitoramento.md +0 -137
- package/skills/eng-scraper-robot-builder/SKILL.md +0 -377
- package/skills/eng-security-cybersecurity/SKILL.md +0 -250
- package/skills/eng-security-cybersecurity/references/1-owasp-top-10.md +0 -331
- package/skills/eng-security-cybersecurity/references/2-secrets-management.md +0 -31
- package/skills/eng-security-cybersecurity/references/3-input-validation.md +0 -43
- package/skills/eng-security-cybersecurity/references/4-compliance.md +0 -20
- package/skills/eng-security-patch/SKILL.md +0 -388
- package/skills/eng-security-threat-model/SKILL.md +0 -171
- package/skills/eng-security-triage/SKILL.md +0 -276
- package/templates/engineering/qa/eng.qa.quality-gate-examples-template.md +0 -311
- package/templates/engineering/qa/eng.qa.quality-gate-report-template.md +0 -249
- package/templates/engineering/qa/qa.cypress-test-template.md +0 -172
- package/templates/engineering/qa/qa.exploratory-session-template.md +0 -148
- package/templates/engineering/qa/qa.quality-report-template.md +0 -130
- package/workflows/engineering/eng.security-audit.md +0 -319
- package/workflows/engineering/eng.security-incident.md +0 -281
- package/workflows/engineering/eng.security-pipeline.md +0 -219
- package/workflows/engineering/eng.security-review.md +0 -241
- package/workflows/engineering/qa/eng.qa-dev-quality-guide.md +0 -57
- package/workflows/engineering/qa/eng.qa-e2e-test-generation.md +0 -57
- package/workflows/engineering/qa/eng.qa-exploratory-session.md +0 -68
- package/workflows/engineering/qa/eng.qa-quality-gate-validation.md +0 -209
- package/workflows/engineering/qa/eng.qa-quality-report.md +0 -85
- /package/skills/{eng-qa-test-plan → eng-qa-planner}/assets/test-coverage-template.md +0 -0
- /package/skills/{eng-qa-test-plan → eng-qa-planner}/assets/test-patterns.md +0 -0
- /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 {
|
|
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
|
|
22
|
-
const __dirname = dirname(__filename);
|
|
23
|
-
const args = argv.slice(2);
|
|
24
|
-
const command = args[0];
|
|
5
|
+
const program = buildProgram();
|
|
25
6
|
|
|
26
|
-
//
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
|
|
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);
|
package/bin/lib/auth/session.js
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
import { existsSync, readFileSync, unlinkSync } from
|
|
2
|
-
import { execSync } from
|
|
3
|
-
import { join } from
|
|
4
|
-
import { homedir, userInfo } from
|
|
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(),
|
|
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,
|
|
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 ===
|
|
29
|
-
if (envUser) return { id: envUser, source:
|
|
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(
|
|
33
|
-
encoding:
|
|
34
|
-
stdio: [
|
|
35
|
-
}).trim()
|
|
36
|
-
if (email) return { id: email, source:
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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
|
|
60
|
+
return list
|
|
61
|
+
.split(",")
|
|
62
|
+
.map((s) => s.trim())
|
|
63
|
+
.includes(value);
|
|
61
64
|
}
|
|
62
65
|
|
|
63
66
|
/**
|