@noclaf/cli 0.4.11 → 0.4.13
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 +15 -13
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/plan.js +45 -0
- package/dist/cli/commands/plan.js.map +1 -0
- package/dist/cli/commands/sync.js +15 -7
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/flows/clients.js +12 -0
- package/dist/cli/flows/clients.js.map +1 -1
- 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/exec-engines.js +5 -3
- package/dist/lib/exec-engines.js.map +1 -1
- package/dist/lib/hooks.js +27 -43
- package/dist/lib/hooks.js.map +1 -1
- package/dist/lib/plan-delegate.js +105 -0
- package/dist/lib/plan-delegate.js.map +1 -0
- 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/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/plan.js +55 -0
- package/dist/tools/plan.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { readFileSync, renameSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { PLAN_ENGINE, engineArgs, engineMissingError, resolveEngineBin, } from './exec-engines.js';
|
|
5
|
+
/** Semente pré-SDD: estrutura mínima pro engine preencher na primeira rodada. */
|
|
6
|
+
export const PLAN_TEMPLATE = [
|
|
7
|
+
'# Plano',
|
|
8
|
+
'',
|
|
9
|
+
'## Contexto',
|
|
10
|
+
'',
|
|
11
|
+
'## Problema',
|
|
12
|
+
'',
|
|
13
|
+
'## Solução',
|
|
14
|
+
'',
|
|
15
|
+
'## Escopo',
|
|
16
|
+
'',
|
|
17
|
+
'### Fora de escopo',
|
|
18
|
+
'',
|
|
19
|
+
'## Decisões',
|
|
20
|
+
'',
|
|
21
|
+
'## Tarefas',
|
|
22
|
+
'',
|
|
23
|
+
].join('\n');
|
|
24
|
+
export function planPath(project) {
|
|
25
|
+
return join(project, 'plan.md');
|
|
26
|
+
}
|
|
27
|
+
/** Base do refino: conteúdo atual do `plan.md`, ou o template quando ainda não existe. */
|
|
28
|
+
export function planBase(project) {
|
|
29
|
+
try {
|
|
30
|
+
const current = readFileSync(planPath(project), 'utf8');
|
|
31
|
+
return current.trim() ? current : PLAN_TEMPLATE;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return PLAN_TEMPLATE;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/** Preâmbulo de planejamento: ancora no harness e proíbe explicitamente escrever código. */
|
|
38
|
+
export function buildPlanPrompt(instruction, base) {
|
|
39
|
+
return [
|
|
40
|
+
'Você está RASCUNHANDO/REFINANDO um plano — não implemente nada.',
|
|
41
|
+
'Antes: leia AGENTS.md e docs/_rules/noclaf.md deste projeto e respeite o harness.',
|
|
42
|
+
'NÃO escreva código, NÃO edite arquivos, NÃO rode comandos.',
|
|
43
|
+
'Parta do plano atual abaixo e refine-o à luz da instrução; não descarte raciocínio já feito.',
|
|
44
|
+
'Responda APENAS com o markdown final do plan.md, sem cercas de código e sem comentários.',
|
|
45
|
+
'',
|
|
46
|
+
`## Instrução`,
|
|
47
|
+
instruction,
|
|
48
|
+
'',
|
|
49
|
+
'## Plano atual',
|
|
50
|
+
base,
|
|
51
|
+
].join('\n');
|
|
52
|
+
}
|
|
53
|
+
/** O engine às vezes embrulha a resposta em ```markdown — o arquivo não quer a cerca. */
|
|
54
|
+
export function stripFence(text) {
|
|
55
|
+
const t = text.trim();
|
|
56
|
+
const m = /^```[a-zA-Z]*\n([\s\S]*?)\n?```$/.exec(t);
|
|
57
|
+
return (m ? m[1] : t).trim();
|
|
58
|
+
}
|
|
59
|
+
/** Write-then-rename: o plano anterior sobrevive até a escrita concluir. */
|
|
60
|
+
function writeAtomic(project, content) {
|
|
61
|
+
const target = planPath(project);
|
|
62
|
+
const tmp = `${target}.tmp`;
|
|
63
|
+
writeFileSync(tmp, `${content}\n`, 'utf8');
|
|
64
|
+
renameSync(tmp, target);
|
|
65
|
+
return target;
|
|
66
|
+
}
|
|
67
|
+
function spawnPlan(bin, engine, prompt, project, echo) {
|
|
68
|
+
return new Promise((resolve) => {
|
|
69
|
+
const child = spawn(bin, engineArgs(engine, prompt), {
|
|
70
|
+
cwd: project,
|
|
71
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
72
|
+
});
|
|
73
|
+
let markdown = '';
|
|
74
|
+
child.stdout.on('data', (d) => (markdown += d.toString()));
|
|
75
|
+
child.stderr.on('data', (d) => echo && process.stderr.write(d.toString()));
|
|
76
|
+
const fail = (error) => {
|
|
77
|
+
resolve({ ok: false, path: planPath(project), engine, error });
|
|
78
|
+
};
|
|
79
|
+
child.on('error', (e) => fail(e.message));
|
|
80
|
+
child.on('close', (code) => {
|
|
81
|
+
if (code !== 0)
|
|
82
|
+
return fail(`engine ${engine} falhou (exit ${code})`);
|
|
83
|
+
const content = stripFence(markdown);
|
|
84
|
+
if (!content)
|
|
85
|
+
return fail(`engine ${engine} não devolveu markdown`);
|
|
86
|
+
resolve({ ok: true, path: writeAtomic(project, content), engine });
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
/** Bloqueante: roda o engine pensante e escreve o `plan.md`. `echo` streama log no stderr. */
|
|
91
|
+
export function runPlan(opts) {
|
|
92
|
+
const engine = opts.engine ?? PLAN_ENGINE;
|
|
93
|
+
const bin = resolveEngineBin(engine);
|
|
94
|
+
if (!bin) {
|
|
95
|
+
return Promise.resolve({
|
|
96
|
+
ok: false,
|
|
97
|
+
path: planPath(opts.project),
|
|
98
|
+
engine,
|
|
99
|
+
error: engineMissingError(engine),
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
const prompt = buildPlanPrompt(opts.instruction, planBase(opts.project));
|
|
103
|
+
return spawnPlan(bin, engine, prompt, opts.project, opts.echo === true);
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=plan-delegate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-delegate.js","sourceRoot":"","sources":["../../src/lib/plan-delegate.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/provision.js
CHANGED
|
@@ -5,7 +5,7 @@ import { dirname, join, relative, resolve, sep } from "node:path";
|
|
|
5
5
|
import { VERSION } from "../version.js";
|
|
6
6
|
import { claudeTarget } from "./targets.js";
|
|
7
7
|
import { filterDocsForSurface, skillsDir } from "./skills.js";
|
|
8
|
-
import {
|
|
8
|
+
import { filterForSelection, flattenSelection, } from "./sections.js";
|
|
9
9
|
/**
|
|
10
10
|
* Provisiona o conteúdo (skills / commands / agents) do noclaf pros clientes. O MCP
|
|
11
11
|
* não consegue gravar em `~/.claude` sozinho — a CLI (`sync`/`init`) chama `provision()`.
|
|
@@ -242,8 +242,8 @@ export function provision(options = {}) {
|
|
|
242
242
|
relPath: f.relPath,
|
|
243
243
|
content: f.content,
|
|
244
244
|
}));
|
|
245
|
-
const scoped =
|
|
246
|
-
const flat =
|
|
245
|
+
const scoped = filterForSelection(rawDocs, options.selection);
|
|
246
|
+
const flat = flattenSelection(scoped);
|
|
247
247
|
const visible = filterDocsForSurface(flat, target.surface);
|
|
248
248
|
const docs = target.mapDocs(visible);
|
|
249
249
|
return applyProvision(docs, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provision.js","sourceRoot":"","sources":["../../src/lib/provision.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,YAAY,EACZ,aAAa,EACb,SAAS,EACT,WAAW,EACX,MAAM,EACN,SAAS,EACT,YAAY,GACb,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,YAAY,EAAwB,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"provision.js","sourceRoot":"","sources":["../../src/lib/provision.ts"],"names":[],"mappings":"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"}
|
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 [];
|