@noclaf/cli 0.4.12 → 0.4.14
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/README.md +17 -0
- package/dist/cli/commands/completion.js +111 -0
- package/dist/cli/commands/completion.js.map +1 -0
- package/dist/cli/commands/init.js +12 -12
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/sync.js +15 -7
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/commands/validate-plan.js +42 -0
- package/dist/cli/commands/validate-plan.js.map +1 -0
- package/dist/cli/flows/completion.js +62 -0
- package/dist/cli/flows/completion.js.map +1 -0
- package/dist/cli/flows/sections.js +69 -82
- package/dist/cli/flows/sections.js.map +1 -1
- package/dist/cli.js +4 -0
- package/dist/cli.js.map +1 -1
- package/dist/config.js +47 -26
- package/dist/config.js.map +1 -1
- package/dist/lib/hooks.js +27 -43
- package/dist/lib/hooks.js.map +1 -1
- package/dist/lib/provision.js +3 -3
- package/dist/lib/provision.js.map +1 -1
- package/dist/lib/rules.js +56 -86
- package/dist/lib/rules.js.map +1 -1
- package/dist/lib/sections.js +68 -64
- package/dist/lib/sections.js.map +1 -1
- package/dist/lib/skills.js +9 -6
- package/dist/lib/skills.js.map +1 -1
- package/dist/lib/validate-plan-delegate.js +105 -0
- package/dist/lib/validate-plan-delegate.js.map +1 -0
- package/dist/mcp-server.js +2 -2
- package/dist/mcp-server.js.map +1 -1
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/validate-plan.js +57 -0
- package/dist/tools/validate-plan.js.map +1 -0
- package/package.json +1 -1
package/dist/lib/rules.js
CHANGED
|
@@ -1,53 +1,18 @@
|
|
|
1
|
-
import { existsSync, readFileSync
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { skillsDir } from './skills.js';
|
|
4
|
+
import { DEV_ROLE, GENERAL } from './sections.js';
|
|
4
5
|
/**
|
|
5
|
-
* Rules do harness —
|
|
6
|
-
*
|
|
7
|
-
*
|
|
6
|
+
* Rules do harness — convenções versionadas no `noclaf-skills`, na mesma taxonomia
|
|
7
|
+
* da seleção: `rules/<role>/<área|general>/<stack|general>/rules.md`. O geral do role
|
|
8
|
+
* fica em `rules/<role>/general/general-rules.md`.
|
|
8
9
|
*
|
|
9
|
-
* Este módulo
|
|
10
|
+
* Este módulo lê + concatena (determinístico) pela `Selection`, e o CLI grava o
|
|
11
|
+
* resultado no repo (`docs/_rules`). Rules são de código → só o role `dev`.
|
|
10
12
|
*/
|
|
11
13
|
const RULES_ROOT = 'rules';
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
/** Nome do arquivo de regras **gerais da área** (sempre valem, não é stack escolhível). */
|
|
15
|
-
export const AREA_GENERAL = 'rules';
|
|
16
|
-
function rulesDir(dir) {
|
|
17
|
-
return join(dir, RULES_ROOT);
|
|
18
|
-
}
|
|
19
|
-
/** Áreas disponíveis = subpastas de `rules/` (menos `general`). */
|
|
20
|
-
export function discoverRuleAreas(dir = skillsDir()) {
|
|
21
|
-
const root = rulesDir(dir);
|
|
22
|
-
if (!existsSync(root))
|
|
23
|
-
return [];
|
|
24
|
-
return readdirSync(root, { withFileTypes: true })
|
|
25
|
-
.filter((e) => e.isDirectory() && e.name !== GENERAL_AREA && !e.name.startsWith('.'))
|
|
26
|
-
.map((e) => e.name)
|
|
27
|
-
.sort();
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Stacks **escolhíveis** de uma área = arquivos `.md` em `rules/<área>/`, menos o
|
|
31
|
-
* `rules.md` (regras gerais da área, sempre incluídas) e o README.
|
|
32
|
-
*/
|
|
33
|
-
export function discoverRuleStacks(area, dir = skillsDir()) {
|
|
34
|
-
const adir = join(rulesDir(dir), area);
|
|
35
|
-
if (!existsSync(adir))
|
|
36
|
-
return [];
|
|
37
|
-
return readdirSync(adir, { withFileTypes: true })
|
|
38
|
-
.filter((e) => e.isFile() && e.name.toLowerCase().endsWith('.md'))
|
|
39
|
-
.map((e) => e.name.replace(/\.md$/i, ''))
|
|
40
|
-
.filter((id) => id.toLowerCase() !== 'readme' && id.toLowerCase() !== AREA_GENERAL)
|
|
41
|
-
.sort();
|
|
42
|
-
}
|
|
43
|
-
/** Rótulo de exibição da stack — tira o sufixo redundante `-rules` (`django-rules` → `django`). */
|
|
44
|
-
export function stackLabel(stack) {
|
|
45
|
-
return stack.replace(/-rules$/i, '');
|
|
46
|
-
}
|
|
47
|
-
/** Conteúdo cru de `rules/<área>/<file>.md`, ou `null` se não existir. */
|
|
48
|
-
function readRuleRaw(dir, area, file) {
|
|
49
|
-
const p = join(rulesDir(dir), area, `${file}.md`);
|
|
50
|
-
return existsSync(p) ? readFileSync(p, 'utf8') : null;
|
|
14
|
+
function rulePath(dir, ...seg) {
|
|
15
|
+
return join(dir, RULES_ROOT, ...seg);
|
|
51
16
|
}
|
|
52
17
|
/** Separa o frontmatter (`--- … ---`) do corpo. */
|
|
53
18
|
function splitFrontmatter(raw) {
|
|
@@ -62,68 +27,73 @@ function splitFrontmatter(raw) {
|
|
|
62
27
|
}
|
|
63
28
|
return { fm, body: raw.slice(m[0].length) };
|
|
64
29
|
}
|
|
65
|
-
/**
|
|
66
|
-
function
|
|
67
|
-
|
|
68
|
-
|
|
30
|
+
/** Rebaixa headings um nível (`##` → `###`) pra aninharem sob o cabeçalho do bloco. */
|
|
31
|
+
function demoteHeadings(md) {
|
|
32
|
+
return md.replace(/^(#{1,5})(\s)/gm, '#$1$2');
|
|
33
|
+
}
|
|
34
|
+
/** Corpo (sem frontmatter, headings rebaixados) de um arquivo de regra, ou `null`. */
|
|
35
|
+
function readRuleBody(path) {
|
|
36
|
+
if (!existsSync(path))
|
|
69
37
|
return null;
|
|
70
|
-
const body = splitFrontmatter(
|
|
38
|
+
const body = splitFrontmatter(readFileSync(path, 'utf8')).body.trim();
|
|
71
39
|
return body.length > 0 ? demoteHeadings(body) : null;
|
|
72
40
|
}
|
|
73
41
|
/** Skills recomendadas (frontmatter `skills:`) de um arquivo de regra. */
|
|
74
|
-
function
|
|
75
|
-
|
|
76
|
-
if (raw === null)
|
|
42
|
+
function ruleSkillsAt(path) {
|
|
43
|
+
if (!existsSync(path))
|
|
77
44
|
return [];
|
|
78
|
-
return (splitFrontmatter(
|
|
45
|
+
return (splitFrontmatter(readFileSync(path, 'utf8')).fm.skills ?? '')
|
|
79
46
|
.split(/[,\s]+/)
|
|
80
47
|
.map((s) => s.trim())
|
|
81
48
|
.filter(Boolean);
|
|
82
49
|
}
|
|
83
|
-
/**
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
export function collectRuleSkills(areas, stackByArea, dir = skillsDir()) {
|
|
88
|
-
const out = new Set();
|
|
89
|
-
for (const area of areas) {
|
|
90
|
-
for (const s of ruleSkills(dir, area, AREA_GENERAL))
|
|
91
|
-
out.add(s);
|
|
92
|
-
const stack = stackByArea[area];
|
|
93
|
-
if (stack)
|
|
94
|
-
for (const s of ruleSkills(dir, area, stack))
|
|
95
|
-
out.add(s);
|
|
96
|
-
}
|
|
97
|
-
return [...out];
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Rebaixa os headings do conteúdo embutido em um nível (`##` → `###`), pra aninharem
|
|
101
|
-
* sob o cabeçalho do bloco (`## <área> · <stack>`) em vez de virarem irmãos dele.
|
|
102
|
-
*/
|
|
103
|
-
function demoteHeadings(md) {
|
|
104
|
-
return md.replace(/^(#{1,5})(\s)/gm, '#$1$2');
|
|
50
|
+
/** Arquivo de regra geral do role (`rules/<role>/general/general-rules.md`, ou `rules.md`). */
|
|
51
|
+
function generalRule(dir) {
|
|
52
|
+
const named = rulePath(dir, DEV_ROLE, GENERAL, 'general-rules.md');
|
|
53
|
+
return existsSync(named) ? named : rulePath(dir, DEV_ROLE, GENERAL, 'rules.md');
|
|
105
54
|
}
|
|
106
55
|
/**
|
|
107
|
-
* Concatena o harness:
|
|
108
|
-
* área
|
|
109
|
-
*
|
|
56
|
+
* Concatena o harness pela seleção: geral do role + (por área selecionada) o geral da
|
|
57
|
+
* área + o **stack** escolhido. Ordenado (general → áreas alfabéticas). String vazia se
|
|
58
|
+
* nada aplicável. Só o role `dev` tem rules.
|
|
110
59
|
*/
|
|
111
|
-
export function concatenateRules(
|
|
60
|
+
export function concatenateRules(sel, dir = skillsDir()) {
|
|
61
|
+
if (!sel.roles.includes(DEV_ROLE))
|
|
62
|
+
return '';
|
|
112
63
|
const blocks = [];
|
|
113
|
-
const general =
|
|
64
|
+
const general = readRuleBody(generalRule(dir));
|
|
114
65
|
if (general)
|
|
115
66
|
blocks.push(`## general\n\n${general}`);
|
|
116
|
-
for (const area of
|
|
117
|
-
const areaGeneral =
|
|
67
|
+
for (const area of Object.keys(sel.stacks).sort()) {
|
|
68
|
+
const areaGeneral = readRuleBody(rulePath(dir, DEV_ROLE, area, GENERAL, 'rules.md'));
|
|
118
69
|
if (areaGeneral)
|
|
119
70
|
blocks.push(`## ${area}\n\n${areaGeneral}`);
|
|
120
|
-
const stack =
|
|
121
|
-
if (stack) {
|
|
122
|
-
const body =
|
|
71
|
+
const stack = sel.stacks[area];
|
|
72
|
+
if (stack && stack !== GENERAL) {
|
|
73
|
+
const body = readRuleBody(rulePath(dir, DEV_ROLE, area, stack, 'rules.md'));
|
|
123
74
|
if (body)
|
|
124
|
-
blocks.push(`## ${area} · ${
|
|
75
|
+
blocks.push(`## ${area} · ${stack}\n\n${body}`);
|
|
125
76
|
}
|
|
126
77
|
}
|
|
127
78
|
return blocks.join('\n\n');
|
|
128
79
|
}
|
|
80
|
+
/**
|
|
81
|
+
* Skills recomendadas (skills.sh, do frontmatter `skills:`) das áreas/stacks
|
|
82
|
+
* selecionadas — do `rules.md` da área + do stack escolhido. Deduplicado.
|
|
83
|
+
*/
|
|
84
|
+
export function collectRuleSkills(sel, dir = skillsDir()) {
|
|
85
|
+
if (!sel.roles.includes(DEV_ROLE))
|
|
86
|
+
return [];
|
|
87
|
+
const out = new Set();
|
|
88
|
+
for (const area of Object.keys(sel.stacks)) {
|
|
89
|
+
for (const s of ruleSkillsAt(rulePath(dir, DEV_ROLE, area, GENERAL, 'rules.md')))
|
|
90
|
+
out.add(s);
|
|
91
|
+
const stack = sel.stacks[area];
|
|
92
|
+
if (stack && stack !== GENERAL) {
|
|
93
|
+
for (const s of ruleSkillsAt(rulePath(dir, DEV_ROLE, area, stack, 'rules.md')))
|
|
94
|
+
out.add(s);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return [...out];
|
|
98
|
+
}
|
|
129
99
|
//# sourceMappingURL=rules.js.map
|
package/dist/lib/rules.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/lib/rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/lib/rules.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/sections.js
CHANGED
|
@@ -1,85 +1,89 @@
|
|
|
1
1
|
import { existsSync, readdirSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Seleção unificada de conteúdo por **role → área → stack**, com `general` em cascata.
|
|
5
|
+
* Um só modelo dita skills, rules e dependencies — o que o usuário preenche no `init`
|
|
6
|
+
* filtra os três igual.
|
|
7
|
+
*
|
|
8
|
+
* Taxonomia (uniforme nos kinds versionados):
|
|
9
|
+
* skills/<role>/<área|general>/<stack|general>/<skill>/SKILL.md
|
|
10
|
+
* rules/<role>/<área|general>/<stack|general>/rules.md
|
|
11
|
+
* dependencies/<role>/<área|general>/<stack|general>/*.md
|
|
12
|
+
* agents/<role>/<name>.md (role, sem área/stack)
|
|
13
|
+
* commands/<name>.md · hooks/* (flat — sempre dev)
|
|
14
|
+
*
|
|
15
|
+
* Regra de inclusão: role selecionado; `general` do role entra sempre; uma área só
|
|
16
|
+
* entra se selecionada, e dentro dela só o `general` da área + o **stack escolhido**.
|
|
17
|
+
*/
|
|
18
|
+
export const GENERAL = 'general';
|
|
4
19
|
export const DEV_ROLE = 'dev';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const roles = new Set();
|
|
9
|
-
for (const kind of KINDS) {
|
|
10
|
-
const dir = join(rootDir, kind);
|
|
11
|
-
if (!existsSync(dir))
|
|
12
|
-
continue;
|
|
13
|
-
for (const e of readdirSync(dir, { withFileTypes: true })) {
|
|
14
|
-
if (e.isDirectory() && !e.name.startsWith('.'))
|
|
15
|
-
roles.add(e.name);
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
return [...roles].sort();
|
|
20
|
+
/** Roles = subpastas de topo de `skills/` (ex.: `dev`, `management`). */
|
|
21
|
+
export function discoverRoles(dir) {
|
|
22
|
+
return subdirs(join(dir, 'skills'));
|
|
19
23
|
}
|
|
20
|
-
/** Áreas
|
|
21
|
-
export function
|
|
22
|
-
|
|
23
|
-
|
|
24
|
+
/** Áreas de um role = subpastas de `skills/<role>/` menos `general`. */
|
|
25
|
+
export function discoverAreas(dir, role) {
|
|
26
|
+
return subdirs(join(dir, 'skills', role)).filter((a) => a !== GENERAL);
|
|
27
|
+
}
|
|
28
|
+
/** Stacks de uma área = subpastas de `skills/<role>/<área>/` menos `general`. */
|
|
29
|
+
export function discoverStacks(dir, role, area) {
|
|
30
|
+
return subdirs(join(dir, 'skills', role, area)).filter((s) => s !== GENERAL);
|
|
31
|
+
}
|
|
32
|
+
function subdirs(root) {
|
|
33
|
+
if (!existsSync(root))
|
|
24
34
|
return [];
|
|
25
|
-
return readdirSync(
|
|
26
|
-
.filter((e) => e.isDirectory() && !e.name.startsWith('.')
|
|
35
|
+
return readdirSync(root, { withFileTypes: true })
|
|
36
|
+
.filter((e) => e.isDirectory() && !e.name.startsWith('.'))
|
|
27
37
|
.map((e) => e.name)
|
|
28
38
|
.sort();
|
|
29
39
|
}
|
|
30
|
-
/**
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
for (const r of allRoles)
|
|
37
|
-
if (r !== DEV_ROLE)
|
|
38
|
-
roles.add(r);
|
|
39
|
-
}
|
|
40
|
-
return roles;
|
|
41
|
-
}
|
|
42
|
-
/** `commands/dev/x.md` → role `dev`; `skills/dev/front-end/y/SKILL.md` → role `dev`, field `front-end`. */
|
|
43
|
-
function roleFieldOf(relPath) {
|
|
40
|
+
/**
|
|
41
|
+
* Um path é incluído na seleção? Vale pra qualquer kind — aplica a gramática da taxonomia.
|
|
42
|
+
* `commands`/`hooks` são flat e sempre-dev; `agents` filtra por role; `skills`/`rules`/
|
|
43
|
+
* `dependencies` filtram por role → área → stack com `general` em cascata.
|
|
44
|
+
*/
|
|
45
|
+
export function includePath(relPath, sel) {
|
|
44
46
|
const parts = relPath.split('/');
|
|
45
47
|
const kind = parts[0];
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
48
|
+
if (kind === 'commands' || kind === 'hooks')
|
|
49
|
+
return sel.roles.includes(DEV_ROLE);
|
|
50
|
+
const role = parts[1];
|
|
51
|
+
if (!sel.roles.includes(role))
|
|
52
|
+
return false;
|
|
53
|
+
if (kind === 'agents')
|
|
54
|
+
return true; // role já bateu; agents não têm área/stack
|
|
55
|
+
const seg2 = parts[2];
|
|
56
|
+
if (seg2 === undefined || seg2 === GENERAL)
|
|
57
|
+
return true; // geral do role
|
|
58
|
+
if (!(seg2 in sel.stacks))
|
|
59
|
+
return false; // área não selecionada
|
|
60
|
+
const seg3 = parts[3];
|
|
61
|
+
return seg3 === GENERAL || seg3 === sel.stacks[seg2]; // geral da área ou stack escolhido
|
|
49
62
|
}
|
|
50
|
-
/**
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
*/
|
|
54
|
-
export function filterDocsForSection(docs, selection, allRoles) {
|
|
55
|
-
if (!selection)
|
|
63
|
+
/** Filtra docs pela seleção. `undefined` → tudo (sem filtro). */
|
|
64
|
+
export function filterForSelection(docs, sel) {
|
|
65
|
+
if (!sel)
|
|
56
66
|
return docs;
|
|
57
|
-
|
|
58
|
-
const fields = new Set(selection.fields);
|
|
59
|
-
return docs.filter((d) => {
|
|
60
|
-
const { kind, role, field } = roleFieldOf(d.relPath);
|
|
61
|
-
if (!roles.has(role))
|
|
62
|
-
return false;
|
|
63
|
-
if (kind === 'skills' && role === DEV_ROLE && field !== undefined) {
|
|
64
|
-
return field === GENERAL_FIELD || fields.has(field);
|
|
65
|
-
}
|
|
66
|
-
return true;
|
|
67
|
-
});
|
|
67
|
+
return docs.filter((d) => includePath(d.relPath, sel));
|
|
68
68
|
}
|
|
69
69
|
/**
|
|
70
|
-
* Achata os segmentos de
|
|
71
|
-
*
|
|
72
|
-
*
|
|
70
|
+
* Achata os segmentos de taxonomia pro layout on-disk do cliente:
|
|
71
|
+
* skills/<role>/general/<skill>/… → skills/<skill>/…
|
|
72
|
+
* skills/<role>/<área>/<stack>/<skill>/… → skills/<skill>/…
|
|
73
|
+
* agents/<role>/<name> → agents/<name>
|
|
74
|
+
* commands/<name> · hooks/* → inalterado (já flat)
|
|
73
75
|
*/
|
|
74
|
-
export function
|
|
76
|
+
export function flattenSelection(docs) {
|
|
75
77
|
return docs.map((d) => {
|
|
76
78
|
const parts = d.relPath.split('/');
|
|
77
|
-
const
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
79
|
+
const kind = parts[0];
|
|
80
|
+
if (kind === 'agents')
|
|
81
|
+
return { ...d, relPath: `agents/${parts.slice(2).join('/')}` };
|
|
82
|
+
if (kind === 'skills') {
|
|
83
|
+
const rest = parts[2] === GENERAL ? parts.slice(3) : parts.slice(4);
|
|
84
|
+
return { ...d, relPath: `skills/${rest.join('/')}` };
|
|
81
85
|
}
|
|
82
|
-
return
|
|
86
|
+
return d;
|
|
83
87
|
});
|
|
84
88
|
}
|
|
85
89
|
//# sourceMappingURL=sections.js.map
|
package/dist/lib/sections.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sections.js","sourceRoot":"","sources":["../../src/lib/sections.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"sections.js","sourceRoot":"","sources":["../../src/lib/sections.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/skills.js
CHANGED
|
@@ -2,6 +2,7 @@ import { existsSync, readFileSync, readdirSync } from 'node:fs';
|
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
3
|
import { join, relative, sep, dirname } from 'node:path';
|
|
4
4
|
import { skillsCacheDir, skillsCached } from './skills-cache.js';
|
|
5
|
+
import { includePath } from './sections.js';
|
|
5
6
|
/**
|
|
6
7
|
* Diretório do conteúdo das skills. Resolve em ordem: `NOCLAF_SKILLS_DIR`
|
|
7
8
|
* (checkout local), `@noclaf/skills` via require.resolve (dev legado), ou o
|
|
@@ -188,14 +189,16 @@ export function readSkillDocs(dir = skillsDir()) {
|
|
|
188
189
|
}
|
|
189
190
|
/**
|
|
190
191
|
* Docs `dependency` do pacote — libs externas que a CLI oferece instalar no fim do
|
|
191
|
-
* `sync`/`init`.
|
|
192
|
-
*
|
|
192
|
+
* `sync`/`init`. Escopadas pela **seleção** (role/área/stack, `general` em cascata):
|
|
193
|
+
* `dev/general` sempre, mais as da área/stack escolhidos. Sem seleção → todas.
|
|
194
|
+
* Best-effort: `[]` se o pacote não estiver disponível.
|
|
193
195
|
*/
|
|
194
|
-
export function readDependencies(dir = skillsDir()) {
|
|
196
|
+
export function readDependencies(selection, dir = skillsDir()) {
|
|
195
197
|
try {
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
.
|
|
198
|
+
let deps = readSkillDocs(dir).filter((d) => d.type === 'dependency');
|
|
199
|
+
if (selection)
|
|
200
|
+
deps = deps.filter((d) => includePath(d.path, selection));
|
|
201
|
+
return deps.sort((a, b) => a.title.localeCompare(b.title));
|
|
199
202
|
}
|
|
200
203
|
catch {
|
|
201
204
|
return [];
|
package/dist/lib/skills.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/lib/skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/lib/skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { readFileSync } from 'node:fs';
|
|
3
|
+
import { planPath, stripFence } from './plan-delegate.js';
|
|
4
|
+
import { PLAN_ENGINE, engineArgs, engineMissingError, resolveEngineBin, } from './exec-engines.js';
|
|
5
|
+
const SLUG_MAX = 50;
|
|
6
|
+
const SLUG_FALLBACK = 'plan';
|
|
7
|
+
/** Slug git-safe do título do plano p/ o Studio nomear o worktree; degenerado → fallback. Puro. */
|
|
8
|
+
export function suggestSlug(plan) {
|
|
9
|
+
const heading = /^#{1,6}\s+(.+?)\s*$/m.exec(plan)?.[1];
|
|
10
|
+
const title = (heading ?? plan.split('\n').find((l) => l.trim()) ?? '').trim();
|
|
11
|
+
const slug = title
|
|
12
|
+
.normalize('NFD')
|
|
13
|
+
.replace(/\p{Diacritic}/gu, '')
|
|
14
|
+
.toLowerCase()
|
|
15
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
16
|
+
.replace(/^-+|-+$/g, '')
|
|
17
|
+
.slice(0, SLUG_MAX)
|
|
18
|
+
.replace(/-+$/g, '');
|
|
19
|
+
return slug || SLUG_FALLBACK;
|
|
20
|
+
}
|
|
21
|
+
export function planMissingError(project) {
|
|
22
|
+
return `plan.md não encontrado em ${project} — rode \`noclaf plan\` antes de validar`;
|
|
23
|
+
}
|
|
24
|
+
/** Lê o `plan.md` da raiz; ausente/vazio dispara — o caller vira em erro tratado. */
|
|
25
|
+
export function readPlan(project) {
|
|
26
|
+
const content = readFileSync(planPath(project), 'utf8');
|
|
27
|
+
if (!content.trim())
|
|
28
|
+
throw new Error('plan.md vazio');
|
|
29
|
+
return content;
|
|
30
|
+
}
|
|
31
|
+
/** Preâmbulo de triagem: ancora no harness e pede veredito + justificativa parseáveis. */
|
|
32
|
+
export function buildValidatePrompt(plan) {
|
|
33
|
+
return [
|
|
34
|
+
'Você está TRIANDO um plano — não implemente nada, não escreva código, não edite arquivos.',
|
|
35
|
+
'Antes: leia AGENTS.md e docs/_rules/noclaf.md deste projeto e respeite o harness.',
|
|
36
|
+
'Julgue a COMPLEXIDADE do plano frente ao IMPACTO REAL no código deste repositório:',
|
|
37
|
+
'plano amplo/abrangente (muitos módulos, decisões de arquitetura, risco) MERECE uma spec SDD antes;',
|
|
38
|
+
'plano pequeno/localizado pode ir direto para a implementação.',
|
|
39
|
+
'Responda APENAS neste formato, sem cercas de código:',
|
|
40
|
+
'VERDICT: yes|no',
|
|
41
|
+
'REASON: <uma ou duas frases legíveis explicando o porquê>',
|
|
42
|
+
'yes = precisa de spec antes; no = pode implementar direto.',
|
|
43
|
+
'',
|
|
44
|
+
'## Plano (plan.md)',
|
|
45
|
+
plan,
|
|
46
|
+
].join('\n');
|
|
47
|
+
}
|
|
48
|
+
/** Normaliza a resposta do engine em `{ needsSpec, reason }`; ambíguo → dispara. */
|
|
49
|
+
export function parseVerdict(text) {
|
|
50
|
+
const clean = stripFence(text);
|
|
51
|
+
const m = /^[ \t]*VERDICT:[ \t]*(yes|no)\b[ \t]*(.*)$/im.exec(clean);
|
|
52
|
+
if (!m)
|
|
53
|
+
throw new Error('veredito ambíguo: falta a linha `VERDICT: yes|no`');
|
|
54
|
+
const needsSpec = m[1].toLowerCase() === 'yes';
|
|
55
|
+
const rest = clean.replace(m[0], '').trim();
|
|
56
|
+
const reason = (rest || m[2].trim())
|
|
57
|
+
.replace(/^[ \t]*REASON:[ \t]*/i, '')
|
|
58
|
+
.replace(/^[\s—:-]+/, '')
|
|
59
|
+
.trim();
|
|
60
|
+
if (!reason)
|
|
61
|
+
throw new Error('veredito ambíguo: sem justificativa (reason vazio)');
|
|
62
|
+
return { needsSpec, reason };
|
|
63
|
+
}
|
|
64
|
+
function spawnValidate(bin, engine, prompt, project, echo) {
|
|
65
|
+
return new Promise((resolve) => {
|
|
66
|
+
const child = spawn(bin, engineArgs(engine, prompt), {
|
|
67
|
+
cwd: project,
|
|
68
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
69
|
+
});
|
|
70
|
+
let out = '';
|
|
71
|
+
child.stdout.on('data', (d) => (out += d.toString()));
|
|
72
|
+
child.stderr.on('data', (d) => echo && process.stderr.write(d.toString()));
|
|
73
|
+
const fail = (error) => resolve({ ok: false, engine, error });
|
|
74
|
+
child.on('error', (e) => fail(e.message));
|
|
75
|
+
child.on('close', (code) => {
|
|
76
|
+
if (code !== 0)
|
|
77
|
+
return fail(`engine ${engine} falhou (exit ${code})`);
|
|
78
|
+
try {
|
|
79
|
+
resolve({ ok: true, engine, ...parseVerdict(out) });
|
|
80
|
+
}
|
|
81
|
+
catch (e) {
|
|
82
|
+
fail(e.message);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
/** Bloqueante: lê o plano, roda o engine pensante e devolve o veredito. `echo` streama log. */
|
|
88
|
+
export async function runValidatePlan(opts) {
|
|
89
|
+
const engine = opts.engine ?? PLAN_ENGINE;
|
|
90
|
+
let plan;
|
|
91
|
+
try {
|
|
92
|
+
plan = readPlan(opts.project);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return { ok: false, engine, error: planMissingError(opts.project) };
|
|
96
|
+
}
|
|
97
|
+
const bin = resolveEngineBin(engine);
|
|
98
|
+
if (!bin)
|
|
99
|
+
return { ok: false, engine, error: engineMissingError(engine) };
|
|
100
|
+
const result = await spawnValidate(bin, engine, buildValidatePrompt(plan), opts.project, opts.echo === true);
|
|
101
|
+
if (result.ok && result.needsSpec)
|
|
102
|
+
result.suggestedSlug = suggestSlug(plan);
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=validate-plan-delegate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-plan-delegate.js","sourceRoot":"","sources":["../../src/lib/validate-plan-delegate.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp-server.js
CHANGED
|
@@ -131,7 +131,7 @@ async function main() {
|
|
|
131
131
|
// qualquer outro cai pro Claude Code (`~/.claude`).
|
|
132
132
|
const target = client === 'codex' ? codexTarget : claudeTarget;
|
|
133
133
|
try {
|
|
134
|
-
const result = provision({ target,
|
|
134
|
+
const result = provision({ target, selection: projectConfig?.selection });
|
|
135
135
|
const changed = result.files.filter((f) => f.action === 'create' || f.action === 'update');
|
|
136
136
|
const pruned = result.files.filter((f) => f.action === 'prune');
|
|
137
137
|
if (changed.length > 0 || pruned.length > 0) {
|
|
@@ -142,7 +142,7 @@ async function main() {
|
|
|
142
142
|
if (target === claudeTarget) {
|
|
143
143
|
const h = provisionHooks({
|
|
144
144
|
surface: claudeTarget.surface,
|
|
145
|
-
|
|
145
|
+
selection: projectConfig?.selection,
|
|
146
146
|
});
|
|
147
147
|
if (h.installed.length > 0 || h.prunedScripts.length > 0) {
|
|
148
148
|
console.error(`[noclaf-cli] auto-pull: ${h.installed.length} hooks, ` +
|