jarvis-ai-framework 2.1.0 → 2.1.1

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 (188) hide show
  1. package/AGENTS.md +10 -9
  2. package/agents/AGENTS.md +9 -1
  3. package/agents/README.md +2 -2
  4. package/agents/engineering/data/eng.data-engineer.agent.md +2 -2
  5. package/agents/engineering/eng.agent.md +4 -6
  6. package/agents/engineering/eng.bug-hunter.md +10 -5
  7. package/agents/engineering/eng.cybersecurity.agent.md +2 -4
  8. package/agents/engineering/eng.dev-code-reviewer.md +4 -0
  9. package/agents/engineering/eng.docs-writer.md +3 -3
  10. package/agents/engineering/eng.frontend.agent.md +17 -8
  11. package/agents/engineering/eng.rpa.agent.md +3 -5
  12. package/agents/engineering/eng.ux-designer.agent.md +4 -0
  13. package/agents/engineering/qa/eng.qa.cypress-specialist.md +8 -5
  14. package/agents/engineering/qa/eng.qa.quality-champion-task-agent.md +4 -0
  15. package/agents/engineering/qa/eng.qa.quality-strategist.md +18 -8
  16. package/agents/engineering/qa/eng.qa.test-architect.md +17 -6
  17. package/agents/engineering/qa/eng.qa.test-planner.md +17 -8
  18. package/agents/engineering/qa/eng.qa.testing-engineer.md +26 -9
  19. package/agents/product/prod.discovery-interviewer.md +22 -3
  20. package/agents/product/prod.pm-checker.md +4 -0
  21. package/bin/commands/map.js +43 -0
  22. package/bin/commands/tokens.js +93 -0
  23. package/bin/jarvis.js +10 -0
  24. package/bin/lib/config/constants.js +11 -0
  25. package/bin/lib/core/profile-filter.js +113 -0
  26. package/bin/lib/core/scanner.js +2 -2
  27. package/bin/lib/core/token-report.js +90 -0
  28. package/bin/lib/flow-map/index.js +65 -0
  29. package/bin/lib/flow-map/parse.js +217 -0
  30. package/bin/lib/flow-map/render.js +86 -0
  31. package/bin/lib/flow-map/tree.js +199 -0
  32. package/members.md +1 -1
  33. package/package.json +4 -2
  34. package/rules/AGENTS.md +18 -7
  35. package/rules/engineering/eng-rules.md +2 -12
  36. package/rules/engineering/eng-security-rules.md +1 -2
  37. package/rules/engineering/eng.integrations-rules.md +0 -4
  38. package/rules/engineering/eng.skills-rules.md +0 -4
  39. package/rules/engineering/eng.specializations-rules.md +0 -4
  40. package/rules/product/README.md +1 -0
  41. package/rules/product/prod-rules.md +1 -4
  42. package/rules/product/prod.spec-rules.md +0 -4
  43. package/rules/rtk-rules.md +0 -1
  44. package/{rules → rules-on-demand}/engineering/eng.breakdown-subtasks-rules.md +0 -4
  45. package/{rules → rules-on-demand}/engineering/eng.plan-rules.md +0 -4
  46. package/{rules → rules-on-demand}/engineering/eng.pr-rules.md +0 -4
  47. package/{rules → rules-on-demand}/engineering/eng.pre-pr-rules.md +0 -4
  48. package/{rules → rules-on-demand}/engineering/eng.start-rules.md +0 -4
  49. package/{rules → rules-on-demand}/engineering/eng.tech-spec-rules.md +1 -2
  50. package/{rules → rules-on-demand}/engineering/eng.work-rules.md +0 -4
  51. package/skills/AGENTS.md +19 -21
  52. package/skills/SKILLS-ROADMAP.md +0 -4
  53. package/skills/eng-ai-engineer/SKILL.md +6 -0
  54. package/skills/eng-backend/SKILL.md +6 -0
  55. package/skills/eng-backend-arch-c4/SKILL.md +10 -4
  56. package/skills/eng-backend-microservices-trace/SKILL.md +6 -0
  57. package/skills/eng-backend-nestjs/SKILL.md +16 -461
  58. package/skills/eng-backend-nestjs/references/1-arquitetura-modulos.md +54 -0
  59. package/skills/eng-backend-nestjs/references/2-guards-autenticacao.md +118 -0
  60. package/skills/eng-backend-nestjs/references/3-interceptors-pipes-filters.md +113 -0
  61. package/skills/eng-backend-nestjs/references/4-config-logging.md +61 -0
  62. package/skills/eng-backend-nestjs/references/5-testes.md +83 -0
  63. package/skills/eng-backend-nestjs/references/6-problemas-comuns.md +53 -0
  64. package/skills/eng-backend-rabbitmq/SKILL.md +15 -298
  65. package/skills/eng-backend-rabbitmq/references/1-referencia-endpoints.md +28 -0
  66. package/skills/eng-backend-rabbitmq/references/2-codigo-consumer-producer.md +90 -0
  67. package/skills/eng-backend-rabbitmq/references/3-arquiteturas-comuns.md +101 -0
  68. package/skills/eng-backend-rabbitmq/references/4-troubleshooting.md +93 -0
  69. package/skills/eng-data-bi/SKILL.md +6 -0
  70. package/skills/eng-data-debug/SKILL.md +6 -0
  71. package/skills/eng-data-engineer/SKILL.md +16 -7
  72. package/skills/eng-data-onboard/SKILL.md +6 -0
  73. package/skills/eng-data-orchestrator/SKILL.md +6 -0
  74. package/skills/eng-devops-performance-engineer/SKILL.md +6 -0
  75. package/skills/eng-frontend/SKILL.md +6 -0
  76. package/skills/eng-frontend-design-system/SKILL.md +13 -479
  77. package/skills/eng-frontend-design-system/references/1-estrutura-pacote.md +57 -0
  78. package/skills/eng-frontend-design-system/references/2-tokens.md +116 -0
  79. package/skills/eng-frontend-design-system/references/3-componentes.md +165 -0
  80. package/skills/eng-frontend-design-system/references/4-storybook.md +85 -0
  81. package/skills/eng-frontend-design-system/references/5-auditoria-versionamento.md +76 -0
  82. package/skills/eng-frontend-microfrontend/SKILL.md +17 -457
  83. package/skills/eng-frontend-microfrontend/references/1-criando-remote.md +109 -0
  84. package/skills/eng-frontend-microfrontend/references/2-configurando-shell.md +70 -0
  85. package/skills/eng-frontend-microfrontend/references/3-contratos-interface.md +73 -0
  86. package/skills/eng-frontend-microfrontend/references/4-shared-dependencies.md +48 -0
  87. package/skills/eng-frontend-microfrontend/references/5-event-bus.md +59 -0
  88. package/skills/eng-frontend-microfrontend/references/6-monorepo-deploy.md +77 -0
  89. package/skills/eng-frontend-microfrontend/references/7-troubleshooting.md +45 -0
  90. package/skills/eng-global-browser-extension-builder/SKILL.md +6 -0
  91. package/skills/eng-global-docs-write/SKILL.md +10 -5
  92. package/skills/eng-global-jira-comment/SKILL.md +6 -0
  93. package/skills/eng-global-pr/SKILL.md +7 -1
  94. package/skills/eng-global-task-comment/SKILL.md +6 -0
  95. package/skills/eng-qa-a11y-audit/SKILL.md +10 -4
  96. package/skills/eng-qa-bug-report/SKILL.md +18 -230
  97. package/skills/eng-qa-bug-report/references/1-integracao-task-managers.md +148 -0
  98. package/skills/eng-qa-bug-report/references/2-exemplos-de-uso.md +46 -0
  99. package/skills/eng-qa-bug-report/references/3-bug-to-test.md +45 -0
  100. package/skills/eng-qa-cypress-e2e/SKILL.md +6 -0
  101. package/skills/eng-qa-dev-guide/SKILL.md +9 -1
  102. package/skills/eng-qa-e2e/SKILL.md +9 -3
  103. package/skills/eng-qa-e2e-spec-writer/SKILL.md +15 -9
  104. package/skills/eng-qa-exploratory/SKILL.md +16 -9
  105. package/skills/eng-qa-gate/SKILL.md +11 -5
  106. package/skills/eng-qa-gate/assets/checklist-validacao.md +1 -1
  107. package/skills/eng-qa-graphql-contract/SKILL.md +9 -3
  108. package/skills/eng-qa-quality-report/SKILL.md +9 -3
  109. package/skills/eng-qa-test-plan/SKILL.md +6 -0
  110. package/skills/eng-qa-testsprite/SKILL.md +10 -4
  111. package/skills/eng-qa-unit-test/SKILL.md +7 -1
  112. package/skills/eng-scraper/SKILL.md +12 -436
  113. package/skills/eng-scraper/references/1-puppeteer.md +140 -0
  114. package/skills/eng-scraper/references/2-playwright-cheerio-pdf.md +82 -0
  115. package/skills/eng-scraper/references/3-anti-bot.md +94 -0
  116. package/skills/eng-scraper/references/4-resiliencia-etl-monitoramento.md +137 -0
  117. package/skills/eng-scraper-robot-builder/SKILL.md +6 -0
  118. package/skills/eng-security-cybersecurity/SKILL.md +13 -409
  119. package/skills/eng-security-cybersecurity/references/1-owasp-top-10.md +331 -0
  120. package/skills/eng-security-cybersecurity/references/2-secrets-management.md +31 -0
  121. package/skills/eng-security-cybersecurity/references/3-input-validation.md +43 -0
  122. package/skills/eng-security-cybersecurity/references/4-compliance.md +20 -0
  123. package/skills/eng-security-patch/SKILL.md +6 -0
  124. package/skills/eng-security-threat-model/SKILL.md +6 -0
  125. package/skills/eng-security-triage/SKILL.md +6 -0
  126. package/skills/jarvis-context-detect/SKILL.md +6 -0
  127. package/skills/jarvis-create-specialization/SKILL.md +6 -0
  128. package/skills/jarvis-docs-central/SKILL.md +6 -0
  129. package/skills/jarvis-docs-index/SKILL.md +10 -2
  130. package/skills/jarvis-evolution-architect/SKILL.md +6 -0
  131. package/skills/jarvis-init/SKILL.md +14 -7
  132. package/skills/jarvis-list-specializations/SKILL.md +6 -0
  133. package/skills/jarvis-report-issue/SKILL.md +6 -0
  134. package/skills/product-roadmap-report/SKILL.md +8 -0
  135. package/skills/product-specs/SKILL.md +9 -0
  136. package/skills/product-specs-update/SKILL.md +6 -0
  137. package/taxonomy.md +12 -12
  138. package/templates/AGENTS.md +2 -0
  139. package/templates/engineering/tech-spec-delivery-template.md +179 -0
  140. package/workflows/AGENTS.md +12 -2
  141. package/workflows/README.md +18 -16
  142. package/workflows/all-tools.md +7 -1
  143. package/workflows/engineering/data/data.contract.md +8 -0
  144. package/workflows/engineering/data/data.new-pipeline.md +10 -0
  145. package/workflows/engineering/eng.breakdown-subtasks.md +9 -0
  146. package/workflows/engineering/eng.bug-audit.md +9 -2
  147. package/workflows/engineering/eng.build-tech-spec.md +17 -146
  148. package/workflows/engineering/eng.create-ard-from-code.md +8 -0
  149. package/workflows/engineering/eng.create-ard.md +8 -0
  150. package/workflows/engineering/eng.create-rfc.md +7 -0
  151. package/workflows/engineering/eng.debug.md +3 -3
  152. package/workflows/engineering/eng.docs.md +9 -0
  153. package/workflows/engineering/eng.light-arch.md +7 -0
  154. package/workflows/engineering/eng.plan.md +15 -2
  155. package/workflows/engineering/eng.pr.md +19 -7
  156. package/workflows/engineering/eng.pre-pr.md +27 -1
  157. package/workflows/engineering/eng.review.md +13 -0
  158. package/workflows/engineering/eng.rpa.robot.md +16 -0
  159. package/workflows/engineering/eng.security-audit.md +7 -0
  160. package/workflows/engineering/eng.security-incident.md +6 -0
  161. package/workflows/engineering/eng.security-pipeline.md +9 -0
  162. package/workflows/engineering/eng.security-review.md +6 -0
  163. package/workflows/engineering/eng.start.md +22 -6
  164. package/workflows/engineering/eng.work.md +18 -2
  165. package/workflows/engineering/frontend/eng.frontend-component.md +7 -0
  166. package/workflows/engineering/frontend/eng.frontend-perf-audit.md +8 -0
  167. package/workflows/engineering/frontend/eng.frontend-review.md +8 -0
  168. package/workflows/engineering/qa/eng.qa-dev-quality-guide.md +6 -0
  169. package/workflows/engineering/qa/eng.qa-e2e-test-generation.md +6 -0
  170. package/workflows/engineering/qa/eng.qa-exploratory-session.md +8 -0
  171. package/workflows/engineering/qa/eng.qa-quality-gate-validation.md +7 -0
  172. package/workflows/engineering/qa/eng.qa-quality-report.md +7 -0
  173. package/workflows/engineering/qa/eng.qa-refinement-entry.md +7 -0
  174. package/workflows/engineering/qa/eng.qa-release-signoff.md +6 -0
  175. package/workflows/engineering/qa/eng.qa-sprint-planning.md +6 -0
  176. package/workflows/product/prod.roadmap.preview.md +9 -0
  177. package/workflows/product/prod.spec.ard.md +97 -0
  178. package/workflows/product/prod.spec.breakdown.md +10 -0
  179. package/workflows/product/prod.spec.clarify.md +8 -2
  180. package/workflows/product/prod.spec.discovery.md +10 -0
  181. package/workflows/product/prod.spec.epic.md +8 -0
  182. package/workflows/product/prod.spec.frd.md +7 -0
  183. package/workflows/product/prod.spec.issue.md +6 -0
  184. package/workflows/product/prod.spec.md +15 -1
  185. package/workflows/product/prod.spec.prd.md +7 -0
  186. package/workflows/taxonomy.md +58 -6
  187. package/workflows/warm-up.md +24 -9
  188. package/rules/engineering/eng.downstream-flow-rules.md +0 -297
@@ -0,0 +1,86 @@
1
+ /**
2
+ * @fileoverview Saída em texto da árvore de chamadas.
3
+ * @module flow-map/render
4
+ */
5
+
6
+ const TYPE_LABEL = {
7
+ workflow: "workflow",
8
+ skill: "skill",
9
+ agent: "agente",
10
+ cli: "CLI",
11
+ mcp: "MCP",
12
+ external: "externo",
13
+ broken: "?",
14
+ unresolved: "?",
15
+ };
16
+
17
+ /**
18
+ * Resume a coluna `Condição` para uma linha: sem crases, "Se" em minúscula e limite de tamanho.
19
+ * @param {string} text
20
+ * @param {number} [max]
21
+ */
22
+ export function summarizeCondition(text, max = 90) {
23
+ let t = text.replace(/[`*]/g, "").replace(/\s+/g, " ").trim();
24
+ if (!t || t === "—") return "";
25
+ t = t.charAt(0).toLowerCase() + t.slice(1);
26
+ return t.length > max ? `${t.slice(0, max - 1).trimEnd()}…` : t;
27
+ }
28
+
29
+ function describe(node) {
30
+ const head = node.kind === "menu" ? node.name : `${node.name} [${TYPE_LABEL[node.kind]}]`;
31
+ const notes = [];
32
+ const condition = summarizeCondition(node.condicao);
33
+ if (node.available) notes.push("disponível");
34
+ if (condition) notes.push(condition);
35
+ if (node.via) notes.push(`via ${node.via}`);
36
+ if (node.kind === "broken" || node.marker === "quebrada") notes.push("referência quebrada");
37
+ else if (node.marker === "a confirmar") notes.push("referência a confirmar");
38
+ if (node.status === "cycle") notes.push("ciclo: já mapeado acima");
39
+ else if (node.status === "seen") notes.push("já mapeado acima");
40
+ else if (node.status === "truncated") notes.push("truncado: use --depth N");
41
+ return notes.length ? `${head} (${notes.join("; ")})` : head;
42
+ }
43
+
44
+ /**
45
+ * @param {import("./tree.js").TreeNode} root
46
+ * @returns {string[]} linhas da árvore
47
+ */
48
+ export function renderTree(root) {
49
+ const lines = [describe(root)];
50
+ if (root.status === "selfContained") lines.push("└── (autocontido: não chama nenhum outro item)");
51
+ else if (root.status === "undeclared") lines.push("└── (sem declaração de chamadas: o item não segue a tabela padronizada)");
52
+
53
+ function walk(node, prefix) {
54
+ node.children.forEach((child, i) => {
55
+ const last = i === node.children.length - 1;
56
+ lines.push(`${prefix}${last ? "└── " : "├── "}${describe(child)}`);
57
+ walk(child, `${prefix}${last ? " " : "│ "}`);
58
+ });
59
+ }
60
+ walk(root, "");
61
+ return lines;
62
+ }
63
+
64
+ /**
65
+ * @param {string} name
66
+ * @param {string} type
67
+ * @param {ReturnType<typeof import("./tree.js").reverseEdges>} edges
68
+ * @returns {string[]}
69
+ */
70
+ export function renderReverse(name, type, edges) {
71
+ const lines = [`Quem chama ${name} [${TYPE_LABEL[type]}]`];
72
+ if (edges.length === 0) {
73
+ lines.push(`└── nenhum artefato chama ${name} — pode ser um ponto de entrada`);
74
+ return lines;
75
+ }
76
+ edges.forEach((e, i) => {
77
+ const notes = [];
78
+ if (e.passo) notes.push(`passo: ${e.passo}`);
79
+ if (e.available) notes.push("disponível");
80
+ const condition = summarizeCondition(e.condicao);
81
+ if (condition) notes.push(condition);
82
+ if (e.via) notes.push(`via ${e.via}`);
83
+ lines.push(`${i === edges.length - 1 ? "└── " : "├── "}${e.from} [${TYPE_LABEL[e.type]}]${notes.length ? ` (${notes.join("; ")})` : ""}`);
84
+ });
85
+ return lines;
86
+ }
@@ -0,0 +1,199 @@
1
+ /**
2
+ * @fileoverview Grafo de chamadas e árvore para frente.
3
+ * @module flow-map/tree
4
+ */
5
+
6
+ import { readFileSync } from "node:fs";
7
+ import { join } from "node:path";
8
+ import { buildIndex } from "./index.js";
9
+ import { parseDeclaration } from "./parse.js";
10
+
11
+ export const DEFAULT_DEPTH = 4;
12
+
13
+ /**
14
+ * Lê o índice e as declarações de todos os artefatos.
15
+ * @param {string} root - Raiz do framework
16
+ */
17
+ export function buildGraph(root) {
18
+ const { items, duplicates } = buildIndex(root);
19
+ const decl = new Map();
20
+ for (const item of items.values()) {
21
+ decl.set(item.name, parseDeclaration(item.type, readFileSync(join(root, item.path), "utf-8")));
22
+ }
23
+ return { items, duplicates, decl };
24
+ }
25
+
26
+ /**
27
+ * @typedef {Object} TreeNode
28
+ * @property {string} name
29
+ * @property {"workflow"|"skill"|"agent"|"cli"|"mcp"|"external"|"broken"|"unresolved"|"menu"} kind
30
+ * @property {string | null} passo
31
+ * @property {string} condicao
32
+ * @property {string | null} via
33
+ * @property {"quebrada"|"a confirmar"|null} marker
34
+ * @property {boolean} available
35
+ * @property {null|"cycle"|"seen"|"truncated"|"undeclared"|"selfContained"} status
36
+ * @property {TreeNode[]} children
37
+ */
38
+
39
+ function hasCalls(graph, name) {
40
+ const d = graph.decl.get(name);
41
+ return Boolean(d) && d.rows.some((r) => r.targets.length > 0);
42
+ }
43
+
44
+ /**
45
+ * Árvore do que o item chama, até `depth` níveis.
46
+ * @param {ReturnType<typeof buildGraph>} graph
47
+ * @param {string} name - Nome de um item do índice
48
+ * @param {{ depth?: number }} [opts]
49
+ * @returns {TreeNode}
50
+ */
51
+ export function forwardTree(graph, name, opts = {}) {
52
+ const depth = opts.depth ?? DEFAULT_DEPTH;
53
+ const expanded = new Set([name]);
54
+
55
+ function base(partial) {
56
+ return { passo: null, condicao: "", via: null, marker: null, available: false, status: null, children: [], ...partial };
57
+ }
58
+
59
+ function childrenOf(itemName, level, ancestors) {
60
+ const d = graph.decl.get(itemName);
61
+ const children = [];
62
+ for (const row of d.rows) {
63
+ if (row.targets.length === 0) continue;
64
+ const grouped = row.targets.filter((t) => t.kind === "internal" || t.kind === "agent").length > 1;
65
+ // Em menu, a condição fica no nó do menu e não se repete em cada alvo.
66
+ const nodes = row.targets.map((t) => targetNode(t, grouped ? { ...row, condicao: "", via: null } : row, level + 1, ancestors));
67
+ if (grouped) {
68
+ children.push(
69
+ base({ name: `menu (${nodes.length} opções)`, kind: "menu", passo: row.passo, condicao: row.condicao, via: row.via, children: nodes }),
70
+ );
71
+ } else {
72
+ children.push(...nodes);
73
+ }
74
+ }
75
+ return children;
76
+ }
77
+
78
+ function targetNode(target, row, level, ancestors) {
79
+ const common = { passo: row.passo, condicao: row.condicao, via: row.via, marker: row.marker, available: row.available };
80
+
81
+ if (["cli", "mcp", "external", "unresolved"].includes(target.kind)) {
82
+ return base({ name: target.name, kind: target.kind, ...common });
83
+ }
84
+ const item = graph.items.get(target.name);
85
+ if (!item) return base({ name: target.name, kind: "broken", ...common, marker: row.marker ?? "quebrada" });
86
+
87
+ const node = base({ name: item.name, kind: item.type, ...common });
88
+ if (ancestors.has(item.name)) node.status = "cycle";
89
+ else if (expanded.has(item.name)) node.status = "seen";
90
+ else if (level >= depth) node.status = hasCalls(graph, item.name) ? "truncated" : null;
91
+ else {
92
+ expanded.add(item.name);
93
+ fill(node, level, new Set([...ancestors, item.name]));
94
+ }
95
+ return node;
96
+ }
97
+
98
+ function fill(node, level, ancestors) {
99
+ const d = graph.decl.get(node.name);
100
+ if (!d.declared) node.status = "undeclared";
101
+ else if (d.selfContained) node.status = "selfContained";
102
+ else node.children = childrenOf(node.name, level, ancestors);
103
+ }
104
+
105
+ const item = graph.items.get(name);
106
+ const root = base({ name, kind: item.type });
107
+ fill(root, 0, new Set([name]));
108
+ return root;
109
+ }
110
+
111
+ function levenshtein(a, b) {
112
+ const row = Array.from({ length: b.length + 1 }, (_, i) => i);
113
+ for (let i = 1; i <= a.length; i++) {
114
+ let prev = row[0];
115
+ row[0] = i;
116
+ for (let j = 1; j <= b.length; j++) {
117
+ const tmp = row[j];
118
+ row[j] = Math.min(row[j] + 1, row[j - 1] + 1, prev + (a[i - 1] === b[j - 1] ? 0 : 1));
119
+ prev = tmp;
120
+ }
121
+ }
122
+ return row[b.length];
123
+ }
124
+
125
+ /**
126
+ * Até 5 nomes parecidos (prefixo, trecho ou distância de edição de até 1 a cada 4 caracteres).
127
+ * @param {Map<string, unknown>} items
128
+ * @param {string} name
129
+ */
130
+ export function suggest(items, name) {
131
+ const lower = name.toLowerCase();
132
+ return [...items.keys()]
133
+ .map((candidate) => {
134
+ const c = candidate.toLowerCase();
135
+ const score = c.startsWith(lower) || lower.startsWith(c) ? 0 : c.includes(lower) || lower.includes(c) ? 1 : levenshtein(lower, c) <= Math.max(1, Math.floor(Math.min(lower.length, c.length) / 4)) ? 2 : null;
136
+ return { candidate, score };
137
+ })
138
+ .filter((s) => s.score !== null)
139
+ .sort((a, b) => a.score - b.score || a.candidate.localeCompare(b.candidate))
140
+ .slice(0, 5)
141
+ .map((s) => s.candidate);
142
+ }
143
+
144
+ /**
145
+ * Quem declara chamar o item (arestas invertidas do mesmo grafo).
146
+ * @param {ReturnType<typeof buildGraph>} graph
147
+ * @param {string} name
148
+ * @returns {Array<{ from: string, type: string, passo: string | null, condicao: string, via: string | null, available: boolean }>}
149
+ */
150
+ export function reverseEdges(graph, name) {
151
+ const edges = [];
152
+ for (const [from, d] of graph.decl) {
153
+ if (from === name) continue;
154
+ for (const row of d.rows) {
155
+ if (row.targets.some((t) => (t.kind === "internal" || t.kind === "agent") && t.name === name)) {
156
+ edges.push({
157
+ from,
158
+ type: graph.items.get(from).type,
159
+ passo: row.passo,
160
+ condicao: row.condicao,
161
+ via: row.via,
162
+ available: row.available,
163
+ });
164
+ }
165
+ }
166
+ }
167
+ return edges.sort((a, b) => a.from.localeCompare(b.from));
168
+ }
169
+
170
+ /**
171
+ * Confere os nomes citados nas declarações.
172
+ * - erro: `/nome` ou `nome (agente)` que não existe, e nomes duplicados no índice;
173
+ * - aviso: linha já marcada "referência quebrada" ou "a confirmar", e artefato sem declaração.
174
+ * @param {ReturnType<typeof buildGraph>} graph
175
+ * @returns {{ errors: Array<{ file: string, name: string, reason: string }>, warnings: Array<{ file: string, name: string, reason: string }> }}
176
+ */
177
+ export function findBrokenReferences(graph) {
178
+ const errors = duplicatesOf(graph);
179
+ const warnings = [];
180
+ for (const [name, d] of graph.decl) {
181
+ const file = graph.items.get(name).path;
182
+ if (!d.declared) warnings.push({ file, name, reason: "sem declaração de chamadas" });
183
+ for (const row of d.rows) {
184
+ for (const t of row.targets) {
185
+ if (t.kind === "unresolved") {
186
+ warnings.push({ file, name: t.name, reason: `referência ${row.marker}` });
187
+ } else if ((t.kind === "internal" || t.kind === "agent") && !graph.items.has(t.name)) {
188
+ if (row.marker) warnings.push({ file, name: t.name, reason: `referência ${row.marker}` });
189
+ else errors.push({ file, name: t.name, reason: "não existe como workflow, skill ou agente" });
190
+ }
191
+ }
192
+ }
193
+ }
194
+ return { errors, warnings };
195
+ }
196
+
197
+ function duplicatesOf(graph) {
198
+ return graph.duplicates.map((name) => ({ file: name, name, reason: "nome repetido entre os artefatos" }));
199
+ }
package/members.md CHANGED
@@ -4,7 +4,7 @@ Lista de membros da organização com suas posições, squads e identificadores.
4
4
 
5
5
  > **Formato**: `Nome Completo | email | posição | slack_user_id`
6
6
  > **Squads válidos**: definidos em `taxonomy.md`
7
- > Preencha via `/members-manager` ou edite esta tabela.
7
+ > Edite esta tabela para cadastrar os membros.
8
8
 
9
9
  ---
10
10
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jarvis-ai-framework",
3
- "version": "2.1.0",
3
+ "version": "2.1.1",
4
4
  "description": "Jarvis framework",
5
5
  "type": "module",
6
6
  "bin": {
@@ -10,7 +10,8 @@
10
10
  "postinstall": "node bin/postinstall.js",
11
11
  "prepublishOnly": "echo 'Publishing jarvis-framework...'",
12
12
  "publish:gitlab": "npm publish",
13
- "test:comandos": "node test/test-comandos-docs.js"
13
+ "test:comandos": "node test/test-comandos-docs.js",
14
+ "test:filtro": "node --test test/profile-filter.test.js test/token-report.test.js test/flow-map.test.js"
14
15
  },
15
16
  "files": [
16
17
  "bin/",
@@ -19,6 +20,7 @@
19
20
  "workflows/",
20
21
  "templates/",
21
22
  "rules/",
23
+ "rules-on-demand/",
22
24
  "taxonomy.md",
23
25
  "members.md",
24
26
  "AGENTS.md",
package/rules/AGENTS.md CHANGED
@@ -13,22 +13,31 @@ A pasta `rules/` contem **regras e diretrizes** que governam o comportamento do
13
13
  ## Estrutura
14
14
 
15
15
  ```
16
- rules/
16
+ rules/ # Sempre carregadas no início da sessão
17
17
  ├── engineering/ # Regras de engenharia
18
18
  │ ├── eng-rules.md # Regras gerais de engenharia
19
- │ ├── eng.start-rules.md # Regras para /eng.start
20
- │ ├── eng.plan-rules.md # Regras para /eng.plan
21
- │ ├── eng.work-rules.md # Regras para /eng.work
22
- │ ├── eng.pr-rules.md # Regras para /eng.pr
23
19
  │ ├── eng.bump-rules.md # Regras para versionamento
24
- │ ├── eng.tech-spec-rules.md # Regras para tech specs
25
20
  │ ├── eng.specializations-rules.md # Carregamento de especializações por stack
26
21
  │ ├── eng.skills-rules.md # Área obrigatória nos skills e aviso de skill inexistente
27
22
  │ └── qa/ # Regras de QA
28
23
  └── product/ # Regras de produto
29
24
  └── prod-rules.md # Regras de especificacao
25
+
26
+ rules-on-demand/ # Lidas pelo workflow que as usa (não carregadas no início)
27
+ └── engineering/
28
+ ├── eng.start-rules.md # Regras para /eng.start
29
+ ├── eng.plan-rules.md # Regras para /eng.plan
30
+ ├── eng.work-rules.md # Regras para /eng.work
31
+ ├── eng.pre-pr-rules.md # Regras para /eng.pre-pr
32
+ ├── eng.pr-rules.md # Regras para /eng.pr
33
+ ├── eng.tech-spec-rules.md # Regras para tech specs
34
+ └── eng.breakdown-subtasks-rules.md # Regras para o breakdown de subtarefas
30
35
  ```
31
36
 
37
+ ### `rules/` x `rules-on-demand/`
38
+
39
+ O Claude Code carrega tudo de `.claude/rules/` no início da sessão: `rules/` fica só com o que vale sempre. Rule de uma etapa só (um comando) vai para `rules-on-demand/`, e o workflow manda lê-la (`rules_file` + "antes de começar, leia..."). O `Applies to` e o filtro por perfil valem nas duas. Efeito: `jarvis tokens`.
40
+
32
41
  ---
33
42
 
34
43
  ## Hierarquia de Regras
@@ -36,7 +45,7 @@ rules/
36
45
  ```
37
46
  1. .windsurf/rules / .cursor/rules (mais alta)
38
47
  2. rules/engineering/eng-rules.md
39
- 3. rules/engineering/eng.{comando}-rules.md
48
+ 3. rules-on-demand/engineering/eng.{comando}-rules.md
40
49
  4. rules/product/prod-rules.md (mais baixa)
41
50
  ```
42
51
 
@@ -80,6 +89,8 @@ Cada arquivo de rule declara para quais perfis se aplica via bloco `applies_to`,
80
89
 
81
90
  **Ao criar uma nova rule**, definir o bloco `applies_to` é obrigatório. Sem ele, a rule é tratada como universal — o que pode ser indesejado para rules domain-specific.
82
91
 
92
+ **Não declarar `trigger:` no frontmatter.** O Claude Code ignora o campo e carrega toda rule da pasta (sem `paths`) no início da sessão. Quem filtra a rule por perfil é o bloco `applies_to`.
93
+
83
94
  ---
84
95
 
85
96
  ## Estrutura de um Arquivo de Regras
@@ -1,5 +1,4 @@
1
1
  ---
2
- trigger: always_on
3
2
  env_file: "@/ENV.md"
4
3
  ---
5
4
 
@@ -171,18 +170,9 @@ env_file: "@/ENV.md"
171
170
 
172
171
  ---
173
172
 
174
- ## 🔄 Fluxo Downstream de Cards
173
+ ## 🔄 Autonomia no card
175
174
 
176
- Ao orientar o usuário sobre transição de status de cards no board (Jira, GitLab, Linear ou equivalente), **sempre consultar**:
177
-
178
- > `$IDE/rules/engineering/eng.downstream-flow-rules.md`
179
-
180
- Este arquivo define:
181
- - Diagrama completo do fluxo (11 estágios)
182
- - Matriz de transições: quem move o quê e quando
183
- - Responsabilidades por papel, mapeadas diretamente de `taxonomy.md`
184
- - Critérios de entrada e saída por estágio
185
- - RACI consolidado
175
+ Ao orientar o usuário sobre a movimentação de cards no board (Jira, GitLab, Linear, GitHub ou equivalente), use o princípio abaixo; não há um fluxo de colunas fixo no framework.
186
176
 
187
177
  **Princípio — autonomia do profissional:**
188
178
  - Quem assumiu o card (**DEV**, **TECH LEAD** ou **PM/TPM/GPM**) pode conduzi-lo **ponta-a-ponta**: puxar, implementar, abrir MR, merge, validar, aceite e preparar/executar deploy.
@@ -1,5 +1,4 @@
1
1
  ---
2
- trigger: always_on
3
2
  env_file: "@/ENV.md"
4
3
  ---
5
4
 
@@ -138,7 +137,7 @@ Usar `jarvis-context-detect` para calibrar a profundidade da analise de seguranc
138
137
  | **Alto** — Audit completo | Usuario invoca `/eng.security-audit` explicitamente | Fan-out + multi-voto (3 votos por achado) | ~200k-1M (subagentes isolados) |
139
138
 
140
139
  O peso do token fica em subagentes isolados — janela da sessao principal nao lota.
141
- PR comum sem risco identificado = zero token extra (so as rules always_on).
140
+ PR comum sem risco identificado = zero token extra (so as rules, que ja ficam carregadas).
142
141
 
143
142
  ---
144
143
 
@@ -1,7 +1,3 @@
1
- ---
2
- trigger: always_on
3
- ---
4
-
5
1
  > **Applies to:** HUB: all | POSITION: all | AREA: all | SQUAD: all
6
2
 
7
3
  # Integrações — vendors via ENV
@@ -1,7 +1,3 @@
1
- ---
2
- trigger: always_on
3
- ---
4
-
5
1
  > **Applies to:** HUB: all | POSITION: all | AREA: ENGINEERING | SQUAD: all
6
2
 
7
3
  # Regras de Skills: área obrigatória e nome inexistente
@@ -1,7 +1,3 @@
1
- ---
2
- trigger: always_on
3
- ---
4
-
5
1
  > **Applies to:** HUB: all | POSITION: all | AREA: ENGINEERING | SQUAD: all
6
2
 
7
3
  # Regras de Especializações por Stack
@@ -15,6 +15,7 @@ Documentação didática (termos por extenso, exemplos, quando usar cada comando
15
15
  | `/prod.spec.discovery` | [prod.spec.discovery.md](../../docs/produto/prod.spec.discovery.md) |
16
16
  | `/prod.spec.prd` | [prod.spec.prd.md](../../docs/produto/prod.spec.prd.md) |
17
17
  | `/prod.spec.frd` | [prod.spec.frd.md](../../docs/produto/prod.spec.frd.md) |
18
+ | `/prod.spec.ard` | [prod.spec.ard.md](../../docs/produto/prod.spec.ard.md) |
18
19
  | `/prod.spec.breakdown` | [prod.spec.breakdown.md](../../docs/produto/prod.spec.breakdown.md) |
19
20
  | `/prod.spec.clarify` | [prod.spec.clarify.md](../../docs/produto/prod.spec.clarify.md) |
20
21
  | `/prod.spec.epic` | [prod.spec.epic.md](../../docs/produto/prod.spec.epic.md) |
@@ -1,7 +1,3 @@
1
- ---
2
- trigger: always_on
3
- ---
4
-
5
1
  > **Applies to:** HUB: all | POSITION: all | AREA: all | SQUAD: all
6
2
 
7
3
  ## Principais Regras
@@ -98,6 +94,7 @@ Sempre siga as instruções de acordo com as relações abaixo.
98
94
  - `$PROD_FLOWS/prod.spec.discovery.md` — Investigação inicial de uma ideia (rascunho estruturado; não define tarefas) → [docs/produto/prod.spec.discovery.md](../../docs/produto/prod.spec.discovery.md)
99
95
  - `$PROD_FLOWS/prod.spec.prd.md` — Documento de Requisitos de Produto (*Product Requirements Document*) → [docs/produto/prod.spec.prd.md](../../docs/produto/prod.spec.prd.md)
100
96
  - `$PROD_FLOWS/prod.spec.frd.md` — Documento de Requisitos Funcionais (*Functional Requirements Document*) → [docs/produto/prod.spec.frd.md](../../docs/produto/prod.spec.frd.md)
97
+ - `$PROD_FLOWS/prod.spec.ard.md` — ARD a partir do produto (requisitos arquiteturais com o PM; conduz o `eng.create-ard`) → [docs/produto/prod.spec.ard.md](../../docs/produto/prod.spec.ard.md)
101
98
  - `$PROD_FLOWS/prod.spec.breakdown.md` — Quebra de especificação grande em fatias → [docs/produto/prod.spec.breakdown.md](../../docs/produto/prod.spec.breakdown.md)
102
99
  - `$PROD_FLOWS/prod.spec.clarify.md` — Esclarecimento de ambiguidades na spec → [docs/produto/prod.spec.clarify.md](../../docs/produto/prod.spec.clarify.md)
103
100
  - `$PROD_FLOWS/prod.spec.epic.md` — Épico (agrupador de histórias/tarefas) → [docs/produto/prod.spec.epic.md](../../docs/produto/prod.spec.epic.md)
@@ -1,7 +1,3 @@
1
- ---
2
- trigger: always_on
3
- ---
4
-
5
1
  > **Applies to:** HUB: all | POSITION: all | AREA: PRODUCT | SQUAD: all
6
2
 
7
3
  # Regras de Escrita de Especificação de Produto
@@ -1,5 +1,4 @@
1
1
  ---
2
- trigger: always_on
3
2
  env_file: "@/ENV.md"
4
3
  ---
5
4
 
@@ -1,7 +1,3 @@
1
- ---
2
- trigger: always_on
3
- ---
4
-
5
1
  > **Applies to:** HUB: all | POSITION: all | AREA: all | SQUAD: all
6
2
 
7
3
  # Regras do Workflow Breakdown Subtasks
@@ -1,7 +1,3 @@
1
- ---
2
- trigger: always_on
3
- ---
4
-
5
1
  > **Applies to:** HUB: all | POSITION: all | AREA: ENGINEERING | SQUAD: all
6
2
 
7
3
  # Regras do Workflow Plan (Planejamento de Execução)
@@ -1,7 +1,3 @@
1
- ---
2
- trigger: always_on
3
- ---
4
-
5
1
  > **Applies to:** HUB: all | POSITION: all | AREA: ENGINEERING | SQUAD: all
6
2
 
7
3
  # Regras do Workflow PR (Pull Request / Merge Request)
@@ -1,7 +1,3 @@
1
- ---
2
- trigger: always_on
3
- ---
4
-
5
1
  > **Applies to:** HUB: all | POSITION: all | AREA: ENGINEERING | SQUAD: all
6
2
 
7
3
  # Regras do Workflow Pre-PR
@@ -1,7 +1,3 @@
1
- ---
2
- trigger: always_on
3
- ---
4
-
5
1
  > **Applies to:** HUB: all | POSITION: all | AREA: ENGINEERING | SQUAD: all
6
2
 
7
3
  # Regras do Workflow Start
@@ -1,5 +1,4 @@
1
1
  ---
2
- trigger: always_on
3
2
  env_file: "@/ENV.md"
4
3
  ---
5
4
 
@@ -43,7 +42,7 @@ Sempre siga as instruções de acordo com as relações abaixo:
43
42
 
44
43
  ### Regras
45
44
 
46
- - **import `$IDE/rules/engineering/eng.tech-spec-rules.md`**: Regras específicas de tech spec (este arquivo)
45
+ - **import `$IDE/rules-on-demand/engineering/eng.tech-spec-rules.md`**: Regras específicas de tech spec (este arquivo)
47
46
 
48
47
  ---
49
48
 
@@ -1,7 +1,3 @@
1
- ---
2
- trigger: always_on
3
- ---
4
-
5
1
  > **Applies to:** HUB: all | POSITION: all | AREA: ENGINEERING | SQUAD: all
6
2
 
7
3
  # Regras do Workflow Work
package/skills/AGENTS.md CHANGED
@@ -122,7 +122,7 @@ skills/
122
122
  └── SKILL.md
123
123
  ```
124
124
 
125
- > Pastas listadas acima refletem skills com `SKILL.md` neste repo. Não invente `skill-creator` / `taxonomy-manager` / `members-manager` se a pasta não existir.
125
+ > Pastas listadas acima refletem skills com `SKILL.md` neste repo. Não cite uma skill que não tenha pasta em `skills/`.
126
126
 
127
127
  ---
128
128
 
@@ -219,10 +219,12 @@ O nome tem a forma `<prefixo>-<área>-<nome>`; **só os dois primeiros segmentos
219
219
  6. **Quando Usar** - Cenarios de uso
220
220
  7. **Padroes Criticos** - Regras mais importantes
221
221
  8. **Fluxo de Trabalho** - Passo a passo
222
- 9. **Regras** - Nunca/Sempre
223
- 10. **Checklist de Conclusao** - Validacao final
224
- 11. **Output** - Artefatos gerados
225
- 12. **Mensagem de Conclusao** - Feedback ao usuario
222
+ 9. **Skills invocados durante a execução do skill** - Subseção (`###`) com a tabela `| Passo | Skill | Condição |` do que o skill chama no próprio fluxo (não vale pré-requisito pedido ao usuário nem sugestão de próximo passo). Sem chamadas, uma linha `Nenhuma — skill autocontida`. Vem depois do fluxo e antes de Tratamento de Erros/Checklist
223
+ O `jarvis map` e o `npm run test:comandos` leem so essa tabela (e, nos agentes, `## Skills Disponíveis` e `## Workflows e Agentes Relacionados`): chamada que existir so no texto corrido nao aparece no mapa, e nome citado que nao existir faz o teste falhar.
224
+ 10. **Regras** - Nunca/Sempre
225
+ 11. **Checklist de Conclusao** - Validacao final
226
+ 12. **Output** - Artefatos gerados
227
+ 13. **Mensagem de Conclusao** - Feedback ao usuario
226
228
 
227
229
  ---
228
230
 
@@ -266,12 +268,9 @@ Skills são invocados de formas diferentes dependendo da IDE:
266
268
  | `/eng.pre-pr` | `eng-qa-test-plan` |
267
269
  | `/eng.pr` | `eng-global-pr` |
268
270
  | QA validation | `eng-qa-gate` |
269
- | Criar skill | `skill-creator` |
270
- | `/taxonomy-manager` | `taxonomy-manager` |
271
271
  | Listar especializações de stack (instaladas e registradas) | `jarvis-list-specializations` |
272
272
  | Criar uma especialização de stack (backend ou frontend) a partir do código do projeto | `jarvis-create-specialization` |
273
273
  | Decisão de arquitetura do Jarvis (agent, skill, workflow ou rule?), simplificação, tendências | `jarvis-evolution-architect` |
274
- | `/members-manager` | `members-manager` |
275
274
  | Mensageria, filas, RabbitMQ, events, consumers, producers | `eng-backend-rabbitmq` (especialização de backend: registrar em `BACKEND_SPECIALIZATIONS`) |
276
275
  | APIs, auth, workers, filas, caching, banco de dados | `eng-backend` (base) + `BACKEND_SPECIALIZATIONS` |
277
276
  | Componentes, UI, estado, estilos, performance, acessibilidade | `eng-frontend` (base) + `FRONTEND_SPECIALIZATIONS` |
@@ -293,19 +292,13 @@ Skills são invocados de formas diferentes dependendo da IDE:
293
292
 
294
293
  ## Criando um Novo Skill
295
294
 
296
- Use o skill-creator:
297
-
298
- ```bash
299
- /skill-creator meu-novo-skill
300
- ```
301
-
302
- Ou manualmente:
295
+ Não há um gerador de skills: a criação é manual.
303
296
 
304
297
  1. Escolher a **área** e o nome no padrão `<prefixo>-<área>-<nome>` (ver "Áreas e nomes")
305
- 2. Criar pasta: `skills/{nome}/`
306
- 3. Copiar template: `skills/skill-creator/assets/SKILL-template.md`
307
- 4. Preencher todos os placeholders, **inclusive `metadata.area`** (e `metadata.stack` se for especialização)
308
- 5. Validar estrutura: `name` igual ao nome da pasta e área reconhecida
298
+ 2. Criar a pasta `skills/{nome}/` com um `SKILL.md`, usando como modelo um skill existente de porte parecido (por exemplo, `eng-qa-gate` para um skill de fluxo, `eng-backend-nestjs` para uma especialização)
299
+ 3. Preencher o frontmatter ("Frontmatter Obrigatorio"), **inclusive `metadata.area`** (e `metadata.stack` se for especialização), e as "Secoes Obrigatorias de um SKILL.md", incluindo a tabela `Skills invocados durante a execução do skill`
300
+ 4. Validar estrutura: `name` igual ao nome da pasta e área reconhecida
301
+ 5. Registrar o skill no `SKILLS-ROADMAP.md` e, se houver comando associado, na tabela "Mapeamento Comando → Skill"
309
302
 
310
303
  ---
311
304
 
@@ -342,12 +335,17 @@ Link para docs existentes? → references/
342
335
 
343
336
  **Regra**: `references/` deve apontar para arquivos LOCAIS, nao URLs web.
344
337
 
338
+ ### Skill grande com temas separaveis: roteador + references/
339
+
340
+ O corpo do `SKILL.md` e carregado inteiro ao invocar a skill. Quando a skill tem **3 ou mais temas que se usam isoladamente** (por exemplo guards, testes, troubleshooting), mantenha no `SKILL.md` so o que vale sempre (objetivo, quando usar, padroes criticos, arvore de decisao, regras, checklist, a tabela de skills invocados) e uma tabela "Referencias" (Tema | Quando ler | Arquivo); cada tema vai para `references/{n}-{tema}.md`. Modelo: `skills/eng-backend/`. Ja seguem o modelo: `eng-backend-nestjs`, `eng-scraper`, `eng-security-cybersecurity`, `eng-backend-rabbitmq`, `eng-frontend-microfrontend`, `eng-frontend-design-system` e `eng-qa-bug-report` (so os temas de apoio: adapters de task manager, exemplos e bug-to-test; o fluxo por modos fica no `SKILL.md`).
341
+
342
+ Nao converta procedimento sequencial (passo 1, 2, 3 que se le de ponta a ponta) nem skill pequena (menos de ~8 KB): nao ha tema para pular, so mais arquivos para ler.
343
+
345
344
  ---
346
345
 
347
346
  ## Referencias
348
347
 
349
- - `skill-creator/SKILL.md` - Skill para criar skills
350
- - `skill-creator/assets/SKILL-template.md` - Template padrao
348
+ - `SKILLS-ROADMAP.md` - Skills existentes e planejadas
351
349
  - `../agents/` - Agentes que usam skills
352
350
  - `../workflows/` - Workflows relacionados
353
351
  - `../rules/` - Regras que skills implementam
@@ -221,10 +221,6 @@ Removidas: `checkin`, `checkout`, `daily`, `task-log`, `send-priority`, `sent-pr
221
221
  - **Trigger**: auto-report de bugs no framework Jarvis via GitLab API
222
222
  - **Status**: `criado`
223
223
 
224
- ### `skill-creator` ✅
225
- - **Trigger**: criação de novos skills
226
- - **Status**: `criado`
227
-
228
224
  ### `jarvis-docs-index` / `jarvis-docs-central` / `jarvis-context-detect` ✅
229
225
  - **Trigger**: indexação de docs, sync com repo central, detecção de contexto
230
226
  - **Status**: `criado`