wizz-method 1.4.0 → 1.4.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.
- package/.claude-plugin/marketplace.json +4 -4
- package/README.md +1 -1
- package/evals/routing/dataset.json +290 -0
- package/evals/routing/run-routing-eval.mjs +89 -0
- package/package.json +11 -3
- package/skills-registry.yaml +65 -28
- package/src/modules/wizz/agents/wizz-ads/SKILL.md +1 -1
- package/src/modules/wizz/agents/wizz-copy/SKILL.md +1 -1
- package/src/modules/wizz/agents/wizz-designer/SKILL.md +6 -8
- package/src/modules/wizz/agents/wizz-growth/SKILL.md +1 -1
- package/src/modules/wizz/agents/wizz-maestro/SKILL.md +6 -5
- package/src/modules/wizz/agents/wizz-memoria/SKILL.md +1 -1
- package/src/modules/wizz/agents/wizz-qa/SKILL.md +1 -1
- package/src/modules/wizz/agents/wizz-seo/SKILL.md +1 -1
- package/src/modules/wizz/agents/wizz-social/SKILL.md +1 -1
- package/src/skills-lib/auth-and-secrets/SKILL.md +29 -11
- package/src/skills-lib/desktop-security/SKILL.md +35 -4
- package/src/skills-lib/premium-landing-ui-researcher/SKILL.md +52 -2083
- package/src/skills-lib/premium-landing-ui-researcher/references/audit-protocol.md +124 -0
- package/src/skills-lib/premium-landing-ui-researcher/references/component-sources.md +336 -0
- package/src/skills-lib/premium-landing-ui-researcher/references/core-goal.md +62 -0
- package/src/skills-lib/premium-landing-ui-researcher/references/dashboard-and-portfolio-modes.md +92 -0
- package/src/skills-lib/premium-landing-ui-researcher/references/handoffs.md +55 -0
- package/src/skills-lib/premium-landing-ui-researcher/references/landing-page-strategy.md +227 -0
- package/src/skills-lib/premium-landing-ui-researcher/references/mandatory-process.md +36 -0
- package/src/skills-lib/premium-landing-ui-researcher/references/output-format-and-quality.md +129 -0
- package/src/skills-lib/premium-landing-ui-researcher/references/prompt-templates.md +206 -0
- package/src/skills-lib/premium-landing-ui-researcher/references/site-levels.md +515 -0
- package/src/skills-lib/premium-landing-ui-researcher/references/source-first-protocol.md +144 -0
- package/src/skills-lib/premium-landing-ui-researcher/references/source-links.md +39 -0
- package/src/skills-lib/premium-landing-ui-researcher/references/stack-and-visual-direction.md +118 -0
- package/src/skills-lib/taste-skill/SKILL.md +33 -1177
- package/src/skills-lib/taste-skill/references/anti-slop-tells.md +110 -0
- package/src/skills-lib/taste-skill/references/architecture-conventions.md +39 -0
- package/src/skills-lib/taste-skill/references/block-library.md +61 -0
- package/src/skills-lib/taste-skill/references/brief-and-dials.md +89 -0
- package/src/skills-lib/taste-skill/references/dark-mode.md +23 -0
- package/src/skills-lib/taste-skill/references/design-directives.md +191 -0
- package/src/skills-lib/taste-skill/references/design-systems.md +267 -0
- package/src/skills-lib/taste-skill/references/motion-patterns.md +167 -0
- package/src/skills-lib/taste-skill/references/pattern-vocabulary.md +78 -0
- package/src/skills-lib/taste-skill/references/performance-a11y.md +33 -0
- package/src/skills-lib/taste-skill/references/preflight-checklist.md +73 -0
- package/src/skills-lib/taste-skill/references/redesign-protocol.md +52 -0
- package/src/skills-lib/web-security/SKILL.md +27 -2
- package/src/skills-lib/wizz-router/SKILL.md +21 -246
- package/src/skills-lib/wizz-router/references/auditoria-360.md +21 -0
- package/src/skills-lib/wizz-router/references/routing-table-flat.md +95 -0
- package/src/squads/advisory-board/agents/ray-dalio.md +0 -20
- package/tools/hooks/README.md +17 -0
- package/tools/hooks/security-defensive-context.js +70 -0
- package/tools/hooks/session-rules.js +38 -0
- package/tools/hooks/wizz-router-enforce.js +188 -0
- package/tools/installer/modules/skills-lib.js +70 -1
- package/tools/sync-global.mjs +84 -0
- package/.claude/settings.local.json +0 -8
- package/src/core-skills/wizz-party-mode/scripts/__pycache__/resolve_party.cpython-314.pyc +0 -0
- package/src/skills-lib/ui-ux-pro-max/scripts/__pycache__/core.cpython-314.pyc +0 -0
- package/src/skills-lib/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-314.pyc +0 -0
- package/src/skills-lib/ui-ux-pro-max/scripts/__pycache__/search.cpython-314.pyc +0 -0
- package/src/skills-lib/ui-ux-pro-max/scripts/graphify-out/cache/0964cef300f753b5cee0cc49777ca97035c85d45c212099405d9ee4da36e523f.json +0 -1
- package/src/skills-lib/ui-ux-pro-max/scripts/graphify-out/cache/21a40f6810c3a6f17acc3580f106171daf78c7b41bbd066bc80448a821ea0adf.json +0 -1
- package/src/skills-lib/ui-ux-pro-max/scripts/graphify-out/cache/69ea15a020ac81b8459e37ef63654398a50c1035fc01c43d8069df217389f7f3.json +0 -1
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* security-defensive-context.js
|
|
3
|
+
*
|
|
4
|
+
* Fonte de verdade: wizz-method/tools/hooks/. Instalar via `npm run sync:global`.
|
|
5
|
+
*
|
|
6
|
+
* Hook PreToolUse: quando o usuário invoca uma skill de segurança, injeta
|
|
7
|
+
* instruções de metodologia que orientam o modelo a trabalhar de forma
|
|
8
|
+
* defensiva, escopada e por dimensão — evitando o padrão de varredura ampla
|
|
9
|
+
* que aciona os safeguards de cibersegurança da Anthropic.
|
|
10
|
+
*
|
|
11
|
+
* v2 (2026-07): contexto genérico por projeto (a v1 hardcodava o stack do MeJu
|
|
12
|
+
* e injetava esse contexto em QUALQUER projeto).
|
|
13
|
+
*
|
|
14
|
+
* IMPORTANTE: guia o COMPORTAMENTO DO MODELO (abordagem + metodologia). Não
|
|
15
|
+
* desativa nem bypassa o safeguard da Anthropic — isso é impossível por hook.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
const SECURITY_SKILLS = new Set([
|
|
19
|
+
// Skills globais instaladas em ~/.claude/skills/
|
|
20
|
+
'web-security',
|
|
21
|
+
'desktop-security',
|
|
22
|
+
// Skills providas por plugins (nomes canônicos verificados)
|
|
23
|
+
'security-review',
|
|
24
|
+
'security-reviewer',
|
|
25
|
+
'security-scan',
|
|
26
|
+
// code-review em variantes de plugin e direto
|
|
27
|
+
'code-review',
|
|
28
|
+
'code-review:code-review',
|
|
29
|
+
]);
|
|
30
|
+
|
|
31
|
+
const DEFENSIVE_CONTEXT =
|
|
32
|
+
'Metodologia de revisao de seguranca (defensiva, escopada):\n\n' +
|
|
33
|
+
'1. ESCOPO: trabalhe por arquivo ou dimensao concreta de cada vez (ex: validacao ' +
|
|
34
|
+
'de entrada num handler, politicas de acesso do banco, headers HTTP). Nunca ' +
|
|
35
|
+
'varredura ampla de todo o codebase num turno unico.\n\n' +
|
|
36
|
+
'2. FOCO DEFENSIVO: o objetivo e hardening do codigo do proprio projeto. Cada ' +
|
|
37
|
+
'achado deve mapear para uma linha/arquivo real e propor a correcao aplicada localmente.\n\n' +
|
|
38
|
+
'3. DIMENSOES PRIORITARIAS (adapte ao stack do projeto atual): (a) auth/sessao; ' +
|
|
39
|
+
'(b) validacao/allowlist de entrada em handlers de escrita; (c) autorizacao no ' +
|
|
40
|
+
'banco (RLS/policies) e funcoes privilegiadas; (d) privacidade LGPD/GDPR — PII, ' +
|
|
41
|
+
'consentimento, retencao; (e) secrets — nada hardcoded em settings/migrations/logs; ' +
|
|
42
|
+
'(f) superficie publica — rate-limit, headers de seguranca, CORS.\n\n' +
|
|
43
|
+
'4. OUTPUT: achados por severidade (CRITICO / ALTO / MEDIO / BAIXO), com arquivo + ' +
|
|
44
|
+
'linha + codigo corrigido sugerido. Nao gerar relatorio ofensivo nem exploits.';
|
|
45
|
+
|
|
46
|
+
let raw = '';
|
|
47
|
+
process.stdin.setEncoding('utf8');
|
|
48
|
+
process.stdin.on('data', (chunk) => (raw += chunk));
|
|
49
|
+
process.stdin.on('end', () => {
|
|
50
|
+
try {
|
|
51
|
+
const payload = JSON.parse(raw);
|
|
52
|
+
const toolName = payload.tool_name || '';
|
|
53
|
+
const skillName = (payload.tool_input && payload.tool_input.skill) || '';
|
|
54
|
+
|
|
55
|
+
if (toolName === 'Skill' && SECURITY_SKILLS.has(skillName)) {
|
|
56
|
+
process.stdout.write(
|
|
57
|
+
JSON.stringify({
|
|
58
|
+
hookSpecificOutput: {
|
|
59
|
+
hookEventName: 'PreToolUse',
|
|
60
|
+
additionalContext: DEFENSIVE_CONTEXT,
|
|
61
|
+
},
|
|
62
|
+
}),
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
// Para qualquer outra skill/tool: sai silenciosamente sem output
|
|
66
|
+
} catch {
|
|
67
|
+
// Parse error: sai silenciosamente, nao bloqueia nada
|
|
68
|
+
}
|
|
69
|
+
process.exit(0);
|
|
70
|
+
});
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// session-rules.js — SessionStart hook
|
|
2
|
+
//
|
|
3
|
+
// Fonte de verdade: wizz-method/tools/hooks/. Instalar via `npm run sync:global`.
|
|
4
|
+
//
|
|
5
|
+
// Injeta as regras de comunicação UMA vez por sessão (antes: no-narration-enforce
|
|
6
|
+
// repetia ~80 tokens em TODO prompt via UserPromptSubmit). Mesmo conteúdo, custo
|
|
7
|
+
// fixo por sessão em vez de custo por prompt.
|
|
8
|
+
|
|
9
|
+
const RULES =
|
|
10
|
+
'REGRA DE COMUNICAÇÃO (permanente, não-negociável): não narrar o passo a passo ' +
|
|
11
|
+
'enquanto trabalha; pausar e perguntar SÓ em decisão do usuário ou risco ' +
|
|
12
|
+
'irreversível; fechar SEMPRE com resumo curto em tópicos, linguagem simples, ' +
|
|
13
|
+
'sem jargão; sem em-dashes; comunicação enxuta por default, expandir só sob demanda.';
|
|
14
|
+
|
|
15
|
+
let input = '';
|
|
16
|
+
const stdinTimeout = setTimeout(() => finish(), 3000);
|
|
17
|
+
process.stdin.setEncoding('utf8');
|
|
18
|
+
process.stdin.on('data', (chunk) => (input += chunk));
|
|
19
|
+
process.stdin.on('end', () => {
|
|
20
|
+
clearTimeout(stdinTimeout);
|
|
21
|
+
finish();
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
function finish() {
|
|
25
|
+
try {
|
|
26
|
+
process.stdout.write(
|
|
27
|
+
JSON.stringify({
|
|
28
|
+
hookSpecificOutput: {
|
|
29
|
+
hookEventName: 'SessionStart',
|
|
30
|
+
additionalContext: RULES,
|
|
31
|
+
},
|
|
32
|
+
}),
|
|
33
|
+
);
|
|
34
|
+
} catch {
|
|
35
|
+
// nunca bloquear
|
|
36
|
+
}
|
|
37
|
+
process.exit(0);
|
|
38
|
+
}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
// wizz-router-enforce.js — UserPromptSubmit hook (v2)
|
|
2
|
+
//
|
|
3
|
+
// Fonte de verdade: wizz-method/tools/hooks/. Instalar em ~/.claude/hooks via
|
|
4
|
+
// `npm run sync:global` (nunca editar a cópia global direto — ela é substituída).
|
|
5
|
+
//
|
|
6
|
+
// v2 (2026-07): detecta projeto Wizz (_wizz/ no cwd ou ancestrais) e injeta uma
|
|
7
|
+
// dica CURTA de delegação direta (maestro/agente da área) em vez do mandato
|
|
8
|
+
// completo do router. Fora de projeto Wizz mantém o router, também em versão
|
|
9
|
+
// curta. Injeção caiu de ~250 para ~50-70 tokens por prompt.
|
|
10
|
+
//
|
|
11
|
+
// Advisory-only: nunca bloqueia o prompt; falha em silêncio.
|
|
12
|
+
|
|
13
|
+
const fs = require('node:fs');
|
|
14
|
+
const path = require('node:path');
|
|
15
|
+
|
|
16
|
+
const TRIVIAL_PATTERNS = [
|
|
17
|
+
// Já é slash command / invocação explícita de skill — já roteado
|
|
18
|
+
/^\s*\//,
|
|
19
|
+
// Conversa pura / saudações
|
|
20
|
+
/^(oi|olá|ola|hey|hi|hello|tudo bem|bom dia|boa tarde|boa noite|obrigad[oa]|valeu|vlw|ok|okay|certo|perfeito|show|massa)\b/i,
|
|
21
|
+
// Typo / rename / ajuste inline pequeno
|
|
22
|
+
/\btypo\b/i,
|
|
23
|
+
/\bcorrige?\s+(esse|este|o|a)?\s*typo\b/i,
|
|
24
|
+
/\brename\s+(a\s+)?(vari[aá]vel|fun[cç][aã]o|arquivo|classe|m[eé]todo)\b/i,
|
|
25
|
+
/\brenomei[ao]\s+(a\s+)?(vari[aá]vel|fun[cç][aã]o|arquivo|classe|m[eé]todo)\b/i,
|
|
26
|
+
// Edição pontual apontando linha específica ("troca X por Y na linha 42")
|
|
27
|
+
/\bna linha \d+\b/i,
|
|
28
|
+
// Resposta a pergunta do próprio router — evita re-injetar no follow-up
|
|
29
|
+
/^(sim|n[aã]o|todas|nenhuma|cancela|dispara?\s+(todas|ambas|essas|todas\s+as\s+skills))/i,
|
|
30
|
+
// Perguntas puras de status / o que foi feito
|
|
31
|
+
/^(o que foi feito|qual o status|me conta|como (t[aá]|est[aá]|ficou|ficaram)|me mostra|explica)/i,
|
|
32
|
+
];
|
|
33
|
+
|
|
34
|
+
// Verbos técnicos de ação que, mesmo em prompt curto, justificam roteamento
|
|
35
|
+
const ACTION_VERBS = [
|
|
36
|
+
'cria',
|
|
37
|
+
'criar',
|
|
38
|
+
'adiciona',
|
|
39
|
+
'adicionar',
|
|
40
|
+
'implementa',
|
|
41
|
+
'implementar',
|
|
42
|
+
'constrói',
|
|
43
|
+
'construir',
|
|
44
|
+
'faz',
|
|
45
|
+
'fazer',
|
|
46
|
+
'desenvolve',
|
|
47
|
+
'desenvolver',
|
|
48
|
+
'refatora',
|
|
49
|
+
'refatorar',
|
|
50
|
+
'muda',
|
|
51
|
+
'mudar',
|
|
52
|
+
'altera',
|
|
53
|
+
'alterar',
|
|
54
|
+
'conserta',
|
|
55
|
+
'consertar',
|
|
56
|
+
'corrige',
|
|
57
|
+
'corrigir',
|
|
58
|
+
'fix',
|
|
59
|
+
'fixes',
|
|
60
|
+
'otimiza',
|
|
61
|
+
'otimizar',
|
|
62
|
+
'improve',
|
|
63
|
+
'redesign',
|
|
64
|
+
'migra',
|
|
65
|
+
'migrar',
|
|
66
|
+
'build',
|
|
67
|
+
'deploy',
|
|
68
|
+
'configura',
|
|
69
|
+
'configurar',
|
|
70
|
+
'setup',
|
|
71
|
+
'integra',
|
|
72
|
+
'integrar',
|
|
73
|
+
'add',
|
|
74
|
+
'update',
|
|
75
|
+
'remove',
|
|
76
|
+
'delete',
|
|
77
|
+
'instala',
|
|
78
|
+
'instalar',
|
|
79
|
+
'testa',
|
|
80
|
+
'testar',
|
|
81
|
+
'audita',
|
|
82
|
+
'auditar',
|
|
83
|
+
'analisa',
|
|
84
|
+
'analisar',
|
|
85
|
+
'melhora',
|
|
86
|
+
'melhorar',
|
|
87
|
+
'escreve',
|
|
88
|
+
'escrever',
|
|
89
|
+
'gera',
|
|
90
|
+
'gerar',
|
|
91
|
+
'revisa',
|
|
92
|
+
'revisar',
|
|
93
|
+
'ajusta',
|
|
94
|
+
'ajustar',
|
|
95
|
+
'monta',
|
|
96
|
+
'montar',
|
|
97
|
+
'plano',
|
|
98
|
+
'planeja',
|
|
99
|
+
'reduz',
|
|
100
|
+
'aumenta',
|
|
101
|
+
'lança',
|
|
102
|
+
'publica',
|
|
103
|
+
];
|
|
104
|
+
|
|
105
|
+
function isTrivial(prompt) {
|
|
106
|
+
const trimmed = String(prompt || '').trim();
|
|
107
|
+
if (!trimmed) return true;
|
|
108
|
+
|
|
109
|
+
// Slash command — já roteado explicitamente
|
|
110
|
+
if (trimmed.startsWith('/')) return true;
|
|
111
|
+
|
|
112
|
+
for (const pattern of TRIVIAL_PATTERNS) {
|
|
113
|
+
if (pattern.test(trimmed)) return true;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Prompt muito curto (< 30 chars) sem verbo de ação conhecido
|
|
117
|
+
if (trimmed.length < 30) {
|
|
118
|
+
const lower = trimmed.toLowerCase();
|
|
119
|
+
const hasActionVerb = ACTION_VERBS.some((v) => lower.includes(v));
|
|
120
|
+
if (!hasActionVerb) return true;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Sobe no máximo 8 níveis procurando _wizz/ (projeto Wizz instalado).
|
|
127
|
+
function findWizzRoot(startDir) {
|
|
128
|
+
let dir = startDir;
|
|
129
|
+
for (let i = 0; i < 8 && dir; i++) {
|
|
130
|
+
try {
|
|
131
|
+
if (fs.existsSync(path.join(dir, '_wizz'))) return dir;
|
|
132
|
+
} catch {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
const parent = path.dirname(dir);
|
|
136
|
+
if (parent === dir) return null;
|
|
137
|
+
dir = parent;
|
|
138
|
+
}
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function buildContext(isWizzProject) {
|
|
143
|
+
if (isWizzProject) {
|
|
144
|
+
return (
|
|
145
|
+
'🎛️ Projeto Wizz: NÃO invoque wizz-router. Pedido complexo (2+ áreas ou ' +
|
|
146
|
+
'2+ fatores altos) → Skill `wizz-maestro`; 1 área e leve → Skill do agente ' +
|
|
147
|
+
'da área (ex: wizz-designer, wizz-quick-dev). Trivial/conversa → direto.'
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
return (
|
|
151
|
+
'🎛️ Pedido não-trivial: invoque a Skill `wizz-router` antes de agir para ' +
|
|
152
|
+
'mapear skills/MCPs (liste candidatas via AskUserQuestion e confirme). ' +
|
|
153
|
+
'Exceção: edição trivial de 1 linha e conversa pura.'
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function runHook() {
|
|
158
|
+
let input = '';
|
|
159
|
+
const stdinTimeout = setTimeout(() => process.exit(0), 3000);
|
|
160
|
+
process.stdin.setEncoding('utf8');
|
|
161
|
+
process.stdin.on('data', (chunk) => (input += chunk));
|
|
162
|
+
process.stdin.on('end', () => {
|
|
163
|
+
clearTimeout(stdinTimeout);
|
|
164
|
+
try {
|
|
165
|
+
const data = JSON.parse(input);
|
|
166
|
+
const prompt = data.prompt || '';
|
|
167
|
+
if (!prompt || isTrivial(prompt)) process.exit(0);
|
|
168
|
+
|
|
169
|
+
const cwd = data.cwd || process.cwd();
|
|
170
|
+
const output = {
|
|
171
|
+
hookSpecificOutput: {
|
|
172
|
+
hookEventName: 'UserPromptSubmit',
|
|
173
|
+
additionalContext: buildContext(Boolean(findWizzRoot(cwd))),
|
|
174
|
+
},
|
|
175
|
+
};
|
|
176
|
+
process.stdout.write(JSON.stringify(output));
|
|
177
|
+
} catch {
|
|
178
|
+
// Falha em silêncio — nunca bloquear o prompt
|
|
179
|
+
process.exit(0);
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
if (require.main === module) {
|
|
185
|
+
runHook();
|
|
186
|
+
} else {
|
|
187
|
+
module.exports = { isTrivial, buildContext, findWizzRoot };
|
|
188
|
+
}
|
|
@@ -13,6 +13,12 @@
|
|
|
13
13
|
// It also installs the registry itself into `_wizz/_config/` so the maestro can
|
|
14
14
|
// read the same file at runtime (the routing source and the install source stay
|
|
15
15
|
// identical by construction). Every step is a no-op when its source is missing.
|
|
16
|
+
//
|
|
17
|
+
// On top of the monolith copy, it also SLICES the registry per area into
|
|
18
|
+
// `_wizz/_config/registry/` (index.yaml + <area>.yaml + _shared.yaml). Area
|
|
19
|
+
// agents read their own slice at runtime instead of the whole ~26KB file; the
|
|
20
|
+
// monolith copy stays in place as the fallback/compat path (see
|
|
21
|
+
// generateRegistrySlices doc below for the exact shape of each slice).
|
|
16
22
|
|
|
17
23
|
const path = require('node:path');
|
|
18
24
|
const fs = require('../fs-native');
|
|
@@ -73,6 +79,64 @@ const isCopyableEntry = (src) => {
|
|
|
73
79
|
return !(name.startsWith('.') && name !== '.gitkeep');
|
|
74
80
|
};
|
|
75
81
|
|
|
82
|
+
// Header stamped on every generated slice — warns readers (humans and agents)
|
|
83
|
+
// not to hand-edit a file that gets clobbered on the next install.
|
|
84
|
+
const SLICE_HEADER =
|
|
85
|
+
'# GERADO PELO INSTALLER — NÃO EDITAR (sobrescrito a cada install).\n' +
|
|
86
|
+
'# Fonte única: skills-registry.yaml na raiz do repo. Esta fatia existe só\n' +
|
|
87
|
+
'# para leitura leve em runtime; qualquer mudança de conteúdo vai no monólito.\n\n';
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Slice the parsed registry into `_wizz/_config/registry/`:
|
|
91
|
+
* - index.yaml: version + areas (only `agent`/`summary`) — a lightweight
|
|
92
|
+
* area→agent map for the maestro to route without loading full skill lists.
|
|
93
|
+
* - <area>.yaml: the full block for that area (skills/mcps/clis/references),
|
|
94
|
+
* wrapped as `area: <name>` + the area's own fields, for the area agent
|
|
95
|
+
* that owns it to read directly instead of the monolith.
|
|
96
|
+
* - _shared.yaml: the cross-cutting sections (utility, mcp_utility,
|
|
97
|
+
* cli_utility, squads) any agent may still need alongside its own slice.
|
|
98
|
+
*
|
|
99
|
+
* ALL areas are sliced regardless of `selectedAreas` — generation is cheap
|
|
100
|
+
* (in-memory yaml.stringify) and this avoids a missing-slice bug if the user
|
|
101
|
+
* later switches to an agent whose area wasn't installed this run.
|
|
102
|
+
*
|
|
103
|
+
* @param {Object} registry - Parsed skills-registry.yaml
|
|
104
|
+
* @param {string} registryDir - Destination dir (`_wizz/_config/registry`)
|
|
105
|
+
* @param {(absPath: string) => void} trackFile - Record an installed file
|
|
106
|
+
*/
|
|
107
|
+
async function generateRegistrySlices(registry, registryDir, trackFile) {
|
|
108
|
+
await fs.ensureDir(registryDir);
|
|
109
|
+
|
|
110
|
+
const areas = (registry && registry.areas) || {};
|
|
111
|
+
|
|
112
|
+
const indexAreas = {};
|
|
113
|
+
for (const [name, area] of Object.entries(areas)) {
|
|
114
|
+
indexAreas[name] = { agent: area && area.agent, summary: area && area.summary };
|
|
115
|
+
}
|
|
116
|
+
const indexPath = path.join(registryDir, 'index.yaml');
|
|
117
|
+
await fs.writeFile(indexPath, SLICE_HEADER + yaml.stringify({ version: registry && registry.version, areas: indexAreas }));
|
|
118
|
+
trackFile(indexPath);
|
|
119
|
+
|
|
120
|
+
for (const [name, area] of Object.entries(areas)) {
|
|
121
|
+
const areaPath = path.join(registryDir, `${name}.yaml`);
|
|
122
|
+
await fs.writeFile(areaPath, SLICE_HEADER + yaml.stringify({ area: name, ...area }));
|
|
123
|
+
trackFile(areaPath);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const sharedPath = path.join(registryDir, '_shared.yaml');
|
|
127
|
+
await fs.writeFile(
|
|
128
|
+
sharedPath,
|
|
129
|
+
SLICE_HEADER +
|
|
130
|
+
yaml.stringify({
|
|
131
|
+
utility: (registry && registry.utility) || [],
|
|
132
|
+
mcp_utility: (registry && registry.mcp_utility) || [],
|
|
133
|
+
cli_utility: (registry && registry.cli_utility) || [],
|
|
134
|
+
squads: (registry && registry.squads) || {},
|
|
135
|
+
}),
|
|
136
|
+
);
|
|
137
|
+
trackFile(sharedPath);
|
|
138
|
+
}
|
|
139
|
+
|
|
76
140
|
/**
|
|
77
141
|
* Copy the area-selected skills from src/skills-lib into `_wizz/skills-lib`, and
|
|
78
142
|
* the registry into `_wizz/_config/skills-registry.yaml`. No-op when sources are
|
|
@@ -129,7 +193,12 @@ async function installSkillsLib({ wizzDir, selectedAreas, trackFile = () => {} }
|
|
|
129
193
|
await fs.copy(srcRegistry, destRegistry);
|
|
130
194
|
trackFile(destRegistry);
|
|
131
195
|
|
|
196
|
+
// Also slice it per area (see generateRegistrySlices) so agents can read a
|
|
197
|
+
// few KB instead of the whole monolith; the copy above stays as fallback.
|
|
198
|
+
const registryDir = path.join(wizzDir, '_config', 'registry');
|
|
199
|
+
await generateRegistrySlices(registry, registryDir, trackFile);
|
|
200
|
+
|
|
132
201
|
return { copied, skipped, registry: true };
|
|
133
202
|
}
|
|
134
203
|
|
|
135
|
-
module.exports = { installSkillsLib, resolveSkillIds };
|
|
204
|
+
module.exports = { installSkillsLib, resolveSkillIds, generateRegistrySlices };
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// sync-global.mjs — sincroniza o repo (fonte de verdade) com o ambiente global
|
|
2
|
+
// do Claude Code (~/.claude), matando o drift repo ↔ instalado.
|
|
3
|
+
//
|
|
4
|
+
// O que sincroniza:
|
|
5
|
+
// 1. Hooks: tools/hooks/*.js → ~/.claude/hooks/
|
|
6
|
+
// 2. Skills: src/skills-lib/<id>/ → ~/.claude/skills/<id>/
|
|
7
|
+
// (apenas skills que JÁ existem no global — não instala skills novas;
|
|
8
|
+
// instalação é papel do installer/npx skills add)
|
|
9
|
+
//
|
|
10
|
+
// Uso: npm run sync:global [-- --dry-run]
|
|
11
|
+
|
|
12
|
+
import fs from 'node:fs';
|
|
13
|
+
import path from 'node:path';
|
|
14
|
+
import os from 'node:os';
|
|
15
|
+
import { fileURLToPath } from 'node:url';
|
|
16
|
+
|
|
17
|
+
const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
18
|
+
const claudeDir = path.join(os.homedir(), '.claude');
|
|
19
|
+
const dryRun = process.argv.includes('--dry-run');
|
|
20
|
+
|
|
21
|
+
function log(msg) {
|
|
22
|
+
console.log(msg);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function copyDirRecursive(src, dest) {
|
|
26
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
27
|
+
for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
|
|
28
|
+
const from = path.join(src, entry.name);
|
|
29
|
+
const to = path.join(dest, entry.name);
|
|
30
|
+
if (entry.isDirectory()) {
|
|
31
|
+
copyDirRecursive(from, to);
|
|
32
|
+
} else if (entry.isFile()) {
|
|
33
|
+
fs.copyFileSync(from, to);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function copyDirReplacing(src, dest) {
|
|
39
|
+
if (!dryRun) {
|
|
40
|
+
fs.rmSync(dest, { recursive: true, force: true });
|
|
41
|
+
copyDirRecursive(src, dest);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// 1) Hooks
|
|
46
|
+
const hooksSrc = path.join(repoRoot, 'tools', 'hooks');
|
|
47
|
+
const hooksDest = path.join(claudeDir, 'hooks');
|
|
48
|
+
let hookCount = 0;
|
|
49
|
+
if (fs.existsSync(hooksSrc) && fs.existsSync(hooksDest)) {
|
|
50
|
+
for (const file of fs.readdirSync(hooksSrc).filter((f) => f.endsWith('.js'))) {
|
|
51
|
+
const from = path.join(hooksSrc, file);
|
|
52
|
+
const to = path.join(hooksDest, file);
|
|
53
|
+
if (!dryRun) fs.copyFileSync(from, to);
|
|
54
|
+
hookCount++;
|
|
55
|
+
log(`hook ${file} → ~/.claude/hooks/`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// 2) Skills já instaladas no global
|
|
60
|
+
const skillsSrc = path.join(repoRoot, 'src', 'skills-lib');
|
|
61
|
+
const skillsDest = path.join(claudeDir, 'skills');
|
|
62
|
+
let synced = 0;
|
|
63
|
+
const skipped = [];
|
|
64
|
+
if (fs.existsSync(skillsSrc) && fs.existsSync(skillsDest)) {
|
|
65
|
+
for (const id of fs.readdirSync(skillsSrc)) {
|
|
66
|
+
const src = path.join(skillsSrc, id);
|
|
67
|
+
const dest = path.join(skillsDest, id);
|
|
68
|
+
if (!fs.statSync(src).isDirectory()) continue;
|
|
69
|
+
if (!fs.existsSync(path.join(src, 'SKILL.md'))) continue; // references/ etc.
|
|
70
|
+
if (!fs.existsSync(dest)) {
|
|
71
|
+
skipped.push(id);
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
copyDirReplacing(src, dest);
|
|
75
|
+
synced++;
|
|
76
|
+
log(`skill ${id} → ~/.claude/skills/${id}/`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
log('');
|
|
81
|
+
log(`${dryRun ? '[dry-run] ' : ''}${hookCount} hook(s), ${synced} skill(s) sincronizada(s).`);
|
|
82
|
+
if (skipped.length > 0) {
|
|
83
|
+
log(`Não instaladas no global (puladas): ${skipped.join(', ')}`);
|
|
84
|
+
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"permissions": {
|
|
3
|
-
"allow": [
|
|
4
|
-
"Bash(node -e \"try{const f=require\\('figlet'\\);f.text\\('WIZZ METHOD',{font:'ANSI Shadow'},\\(e,d\\)=>{if\\(e\\){console.log\\('ERR',e.message\\)}else{console.log\\(d\\)}}\\);}catch\\(e\\){console.log\\('NO_MODULE'\\)}\")",
|
|
5
|
-
"Bash(rtk --version)"
|
|
6
|
-
]
|
|
7
|
-
}
|
|
8
|
-
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"nodes": [{"id": "search", "label": "search.py", "file_type": "code", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/search.py", "source_location": "L1"}, {"id": "search_format_output", "label": "format_output()", "file_type": "code", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/search.py", "source_location": "L30"}, {"id": "search_rationale_31", "label": "Format results for Claude consumption (token-optimized)", "file_type": "rationale", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/search.py", "source_location": "L31"}], "edges": [{"source": "search", "target": "argparse", "relation": "imports", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/search.py", "source_location": "L17", "weight": 1.0}, {"source": "search", "target": "sys", "relation": "imports", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/search.py", "source_location": "L18", "weight": 1.0}, {"source": "search", "target": "io", "relation": "imports", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/search.py", "source_location": "L19", "weight": 1.0}, {"source": "search", "target": "core", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/search.py", "source_location": "L20", "weight": 1.0}, {"source": "search", "target": "design_system", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/search.py", "source_location": "L21", "weight": 1.0}, {"source": "search", "target": "search_format_output", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/search.py", "source_location": "L30", "weight": 1.0}, {"source": "search", "target": "json", "relation": "imports", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/search.py", "source_location": "L103", "weight": 1.0}, {"source": "search", "target": "json", "relation": "imports", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/search.py", "source_location": "L111", "weight": 1.0}, {"source": "search_rationale_31", "target": "search_format_output", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/search.py", "source_location": "L31", "weight": 1.0}]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"nodes": [{"id": "core", "label": "core.py", "file_type": "code", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L1"}, {"id": "core_bm25", "label": "BM25", "file_type": "code", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L96"}, {"id": "core_bm25_init", "label": ".__init__()", "file_type": "code", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L99"}, {"id": "core_bm25_tokenize", "label": ".tokenize()", "file_type": "code", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L109"}, {"id": "core_bm25_fit", "label": ".fit()", "file_type": "code", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L114"}, {"id": "core_bm25_score", "label": ".score()", "file_type": "code", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L133"}, {"id": "core_load_csv", "label": "_load_csv()", "file_type": "code", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L159"}, {"id": "core_search_csv", "label": "_search_csv()", "file_type": "code", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L165"}, {"id": "core_detect_domain", "label": "detect_domain()", "file_type": "code", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L190"}, {"id": "core_search", "label": "search()", "file_type": "code", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L212"}, {"id": "core_search_stack", "label": "search_stack()", "file_type": "code", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L234"}, {"id": "core_rationale_97", "label": "BM25 ranking algorithm for text search", "file_type": "rationale", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L97"}, {"id": "core_rationale_110", "label": "Lowercase, split, remove punctuation, filter short words", "file_type": "rationale", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L110"}, {"id": "core_rationale_115", "label": "Build BM25 index from documents", "file_type": "rationale", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L115"}, {"id": "core_rationale_134", "label": "Score all documents against query", "file_type": "rationale", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L134"}, {"id": "core_rationale_160", "label": "Load CSV and return list of dicts", "file_type": "rationale", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L160"}, {"id": "core_rationale_166", "label": "Core search function using BM25", "file_type": "rationale", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L166"}, {"id": "core_rationale_191", "label": "Auto-detect the most relevant domain from query", "file_type": "rationale", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L191"}, {"id": "core_rationale_213", "label": "Main search function with auto-domain detection", "file_type": "rationale", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L213"}, {"id": "core_rationale_235", "label": "Search stack-specific guidelines", "file_type": "rationale", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L235"}], "edges": [{"source": "core", "target": "csv", "relation": "imports", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L7", "weight": 1.0}, {"source": "core", "target": "re", "relation": "imports", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L8", "weight": 1.0}, {"source": "core", "target": "pathlib", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L9", "weight": 1.0}, {"source": "core", "target": "math", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L10", "weight": 1.0}, {"source": "core", "target": "collections", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L11", "weight": 1.0}, {"source": "core", "target": "core_bm25", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L96", "weight": 1.0}, {"source": "core_bm25", "target": "core_bm25_init", "relation": "method", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L99", "weight": 1.0}, {"source": "core_bm25", "target": "core_bm25_tokenize", "relation": "method", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L109", "weight": 1.0}, {"source": "core_bm25", "target": "core_bm25_fit", "relation": "method", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L114", "weight": 1.0}, {"source": "core_bm25", "target": "core_bm25_score", "relation": "method", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L133", "weight": 1.0}, {"source": "core", "target": "core_load_csv", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L159", "weight": 1.0}, {"source": "core", "target": "core_search_csv", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L165", "weight": 1.0}, {"source": "core", "target": "core_detect_domain", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L190", "weight": 1.0}, {"source": "core", "target": "core_search", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L212", "weight": 1.0}, {"source": "core", "target": "core_search_stack", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L234", "weight": 1.0}, {"source": "core_bm25_fit", "target": "core_bm25_tokenize", "relation": "calls", "confidence": "INFERRED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L116", "weight": 0.8}, {"source": "core_bm25_score", "target": "core_bm25_tokenize", "relation": "calls", "confidence": "INFERRED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L135", "weight": 0.8}, {"source": "core_search_csv", "target": "core_load_csv", "relation": "calls", "confidence": "INFERRED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L170", "weight": 0.8}, {"source": "core_search_csv", "target": "core_bm25", "relation": "calls", "confidence": "INFERRED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L176", "weight": 0.8}, {"source": "core_search_csv", "target": "core_bm25_fit", "relation": "calls", "confidence": "INFERRED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L177", "weight": 0.8}, {"source": "core_search_csv", "target": "core_bm25_score", "relation": "calls", "confidence": "INFERRED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L178", "weight": 0.8}, {"source": "core_search", "target": "core_detect_domain", "relation": "calls", "confidence": "INFERRED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L215", "weight": 0.8}, {"source": "core_search", "target": "core_search_csv", "relation": "calls", "confidence": "INFERRED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L223", "weight": 0.8}, {"source": "core_search_stack", "target": "core_search_csv", "relation": "calls", "confidence": "INFERRED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L244", "weight": 0.8}, {"source": "core_rationale_97", "target": "core_bm25", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L97", "weight": 1.0}, {"source": "core_rationale_110", "target": "core_bm25_tokenize", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L110", "weight": 1.0}, {"source": "core_rationale_115", "target": "core_bm25_fit", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L115", "weight": 1.0}, {"source": "core_rationale_134", "target": "core_bm25_score", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L134", "weight": 1.0}, {"source": "core_rationale_160", "target": "core_load_csv", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L160", "weight": 1.0}, {"source": "core_rationale_166", "target": "core_search_csv", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L166", "weight": 1.0}, {"source": "core_rationale_191", "target": "core_detect_domain", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L191", "weight": 1.0}, {"source": "core_rationale_213", "target": "core_search", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L213", "weight": 1.0}, {"source": "core_rationale_235", "target": "core_search_stack", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/core.py", "source_location": "L235", "weight": 1.0}]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"nodes": [{"id": "design_system", "label": "design_system.py", "file_type": "code", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L1"}, {"id": "design_system_designsystemgenerator", "label": "DesignSystemGenerator", "file_type": "code", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L37"}, {"id": "design_system_designsystemgenerator_init", "label": ".__init__()", "file_type": "code", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L40"}, {"id": "design_system_designsystemgenerator_load_reasoning", "label": "._load_reasoning()", "file_type": "code", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L43"}, {"id": "design_system_designsystemgenerator_multi_domain_search", "label": "._multi_domain_search()", "file_type": "code", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L51"}, {"id": "design_system_designsystemgenerator_find_reasoning_rule", "label": "._find_reasoning_rule()", "file_type": "code", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L64"}, {"id": "design_system_designsystemgenerator_apply_reasoning", "label": "._apply_reasoning()", "file_type": "code", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L88"}, {"id": "design_system_designsystemgenerator_select_best_match", "label": "._select_best_match()", "file_type": "code", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L122"}, {"id": "design_system_designsystemgenerator_extract_results", "label": "._extract_results()", "file_type": "code", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L159"}, {"id": "design_system_designsystemgenerator_generate", "label": ".generate()", "file_type": "code", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L163"}, {"id": "design_system_format_ascii_box", "label": "format_ascii_box()", "file_type": "code", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L242"}, {"id": "design_system_format_markdown", "label": "format_markdown()", "file_type": "code", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L367"}, {"id": "design_system_generate_design_system", "label": "generate_design_system()", "file_type": "code", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L462"}, {"id": "design_system_persist_design_system", "label": "persist_design_system()", "file_type": "code", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L491"}, {"id": "design_system_format_master_md", "label": "format_master_md()", "file_type": "code", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L542"}, {"id": "design_system_format_page_override_md", "label": "format_page_override_md()", "file_type": "code", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L805"}, {"id": "design_system_generate_intelligent_overrides", "label": "_generate_intelligent_overrides()", "file_type": "code", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L914"}, {"id": "design_system_detect_page_type", "label": "_detect_page_type()", "file_type": "code", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L1020"}, {"id": "design_system_rationale_38", "label": "Generates design system recommendations from aggregated searches.", "file_type": "rationale", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L38"}, {"id": "design_system_rationale_44", "label": "Load reasoning rules from CSV.", "file_type": "rationale", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L44"}, {"id": "design_system_rationale_52", "label": "Execute searches across multiple domains.", "file_type": "rationale", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L52"}, {"id": "design_system_rationale_65", "label": "Find matching reasoning rule for a category.", "file_type": "rationale", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L65"}, {"id": "design_system_rationale_89", "label": "Apply reasoning rules to search results.", "file_type": "rationale", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L89"}, {"id": "design_system_rationale_123", "label": "Select best matching result based on priority keywords.", "file_type": "rationale", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L123"}, {"id": "design_system_rationale_160", "label": "Extract results list from search result dict.", "file_type": "rationale", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L160"}, {"id": "design_system_rationale_164", "label": "Generate complete design system recommendation.", "file_type": "rationale", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L164"}, {"id": "design_system_rationale_243", "label": "Format design system as ASCII box with emojis (MCP-style).", "file_type": "rationale", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L243"}, {"id": "design_system_rationale_368", "label": "Format design system as markdown.", "file_type": "rationale", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L368"}, {"id": "design_system_rationale_464", "label": "Main entry point for design system generation. Args: query: Search", "file_type": "rationale", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L464"}, {"id": "design_system_rationale_492", "label": "Persist design system to design-system/<project>/ folder using Master + Override", "file_type": "rationale", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L492"}, {"id": "design_system_rationale_543", "label": "Format design system as MASTER.md with hierarchical override logic.", "file_type": "rationale", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L543"}, {"id": "design_system_rationale_806", "label": "Format a page-specific override file with intelligent AI-generated content.", "file_type": "rationale", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L806"}, {"id": "design_system_rationale_915", "label": "Generate intelligent overrides based on page type using layered search.", "file_type": "rationale", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L915"}, {"id": "design_system_rationale_1021", "label": "Detect page type from context and search results.", "file_type": "rationale", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L1021"}], "edges": [{"source": "design_system", "target": "csv", "relation": "imports", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L16", "weight": 1.0}, {"source": "design_system", "target": "json", "relation": "imports", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L17", "weight": 1.0}, {"source": "design_system", "target": "os", "relation": "imports", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L18", "weight": 1.0}, {"source": "design_system", "target": "datetime", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L19", "weight": 1.0}, {"source": "design_system", "target": "pathlib", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L20", "weight": 1.0}, {"source": "design_system", "target": "core", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L21", "weight": 1.0}, {"source": "design_system", "target": "design_system_designsystemgenerator", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L37", "weight": 1.0}, {"source": "design_system_designsystemgenerator", "target": "design_system_designsystemgenerator_init", "relation": "method", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L40", "weight": 1.0}, {"source": "design_system_designsystemgenerator", "target": "design_system_designsystemgenerator_load_reasoning", "relation": "method", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L43", "weight": 1.0}, {"source": "design_system_designsystemgenerator", "target": "design_system_designsystemgenerator_multi_domain_search", "relation": "method", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L51", "weight": 1.0}, {"source": "design_system_designsystemgenerator", "target": "design_system_designsystemgenerator_find_reasoning_rule", "relation": "method", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L64", "weight": 1.0}, {"source": "design_system_designsystemgenerator", "target": "design_system_designsystemgenerator_apply_reasoning", "relation": "method", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L88", "weight": 1.0}, {"source": "design_system_designsystemgenerator", "target": "design_system_designsystemgenerator_select_best_match", "relation": "method", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L122", "weight": 1.0}, {"source": "design_system_designsystemgenerator", "target": "design_system_designsystemgenerator_extract_results", "relation": "method", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L159", "weight": 1.0}, {"source": "design_system_designsystemgenerator", "target": "design_system_designsystemgenerator_generate", "relation": "method", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L163", "weight": 1.0}, {"source": "design_system", "target": "design_system_format_ascii_box", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L242", "weight": 1.0}, {"source": "design_system", "target": "design_system_format_markdown", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L367", "weight": 1.0}, {"source": "design_system", "target": "design_system_generate_design_system", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L462", "weight": 1.0}, {"source": "design_system", "target": "design_system_persist_design_system", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L491", "weight": 1.0}, {"source": "design_system", "target": "design_system_format_master_md", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L542", "weight": 1.0}, {"source": "design_system", "target": "design_system_format_page_override_md", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L805", "weight": 1.0}, {"source": "design_system", "target": "design_system_generate_intelligent_overrides", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L914", "weight": 1.0}, {"source": "design_system", "target": "design_system_detect_page_type", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L1020", "weight": 1.0}, {"source": "design_system", "target": "argparse", "relation": "imports", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L1057", "weight": 1.0}, {"source": "design_system_designsystemgenerator_init", "target": "design_system_designsystemgenerator_load_reasoning", "relation": "calls", "confidence": "INFERRED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L41", "weight": 0.8}, {"source": "design_system_designsystemgenerator_apply_reasoning", "target": "design_system_designsystemgenerator_find_reasoning_rule", "relation": "calls", "confidence": "INFERRED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L90", "weight": 0.8}, {"source": "design_system_designsystemgenerator_generate", "target": "design_system_designsystemgenerator_apply_reasoning", "relation": "calls", "confidence": "INFERRED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L173", "weight": 0.8}, {"source": "design_system_designsystemgenerator_generate", "target": "design_system_designsystemgenerator_multi_domain_search", "relation": "calls", "confidence": "INFERRED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L177", "weight": 0.8}, {"source": "design_system_designsystemgenerator_generate", "target": "design_system_designsystemgenerator_extract_results", "relation": "calls", "confidence": "INFERRED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L181", "weight": 0.8}, {"source": "design_system_designsystemgenerator_generate", "target": "design_system_designsystemgenerator_select_best_match", "relation": "calls", "confidence": "INFERRED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L186", "weight": 0.8}, {"source": "design_system_generate_design_system", "target": "design_system_designsystemgenerator", "relation": "calls", "confidence": "INFERRED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L478", "weight": 0.8}, {"source": "design_system_generate_design_system", "target": "design_system_designsystemgenerator_generate", "relation": "calls", "confidence": "INFERRED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L479", "weight": 0.8}, {"source": "design_system_generate_design_system", "target": "design_system_persist_design_system", "relation": "calls", "confidence": "INFERRED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L483", "weight": 0.8}, {"source": "design_system_generate_design_system", "target": "design_system_format_markdown", "relation": "calls", "confidence": "INFERRED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L486", "weight": 0.8}, {"source": "design_system_generate_design_system", "target": "design_system_format_ascii_box", "relation": "calls", "confidence": "INFERRED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L487", "weight": 0.8}, {"source": "design_system_persist_design_system", "target": "design_system_format_master_md", "relation": "calls", "confidence": "INFERRED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L522", "weight": 0.8}, {"source": "design_system_persist_design_system", "target": "design_system_format_page_override_md", "relation": "calls", "confidence": "INFERRED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L530", "weight": 0.8}, {"source": "design_system_format_page_override_md", "target": "design_system_generate_intelligent_overrides", "relation": "calls", "confidence": "INFERRED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L812", "weight": 0.8}, {"source": "design_system_generate_intelligent_overrides", "target": "design_system_detect_page_type", "relation": "calls", "confidence": "INFERRED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L938", "weight": 0.8}, {"source": "design_system_rationale_38", "target": "design_system_designsystemgenerator", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L38", "weight": 1.0}, {"source": "design_system_rationale_44", "target": "design_system_designsystemgenerator_load_reasoning", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L44", "weight": 1.0}, {"source": "design_system_rationale_52", "target": "design_system_designsystemgenerator_multi_domain_search", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L52", "weight": 1.0}, {"source": "design_system_rationale_65", "target": "design_system_designsystemgenerator_find_reasoning_rule", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L65", "weight": 1.0}, {"source": "design_system_rationale_89", "target": "design_system_designsystemgenerator_apply_reasoning", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L89", "weight": 1.0}, {"source": "design_system_rationale_123", "target": "design_system_designsystemgenerator_select_best_match", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L123", "weight": 1.0}, {"source": "design_system_rationale_160", "target": "design_system_designsystemgenerator_extract_results", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L160", "weight": 1.0}, {"source": "design_system_rationale_164", "target": "design_system_designsystemgenerator_generate", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L164", "weight": 1.0}, {"source": "design_system_rationale_243", "target": "design_system_format_ascii_box", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L243", "weight": 1.0}, {"source": "design_system_rationale_368", "target": "design_system_format_markdown", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L368", "weight": 1.0}, {"source": "design_system_rationale_464", "target": "design_system_generate_design_system", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L464", "weight": 1.0}, {"source": "design_system_rationale_492", "target": "design_system_persist_design_system", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L492", "weight": 1.0}, {"source": "design_system_rationale_543", "target": "design_system_format_master_md", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L543", "weight": 1.0}, {"source": "design_system_rationale_806", "target": "design_system_format_page_override_md", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L806", "weight": 1.0}, {"source": "design_system_rationale_915", "target": "design_system_generate_intelligent_overrides", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L915", "weight": 1.0}, {"source": "design_system_rationale_1021", "target": "design_system_detect_page_type", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/juniordameto/.claude/skills/ui-ux-pro-max/scripts/design_system.py", "source_location": "L1021", "weight": 1.0}]}
|