@nio-cli/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +280 -0
- package/dist/adapters/supabase/allocation-gateway.js +236 -0
- package/dist/adapters/supabase/allocation-gateway.js.map +1 -0
- package/dist/adapters/supabase/analytics-gateway.js +18 -0
- package/dist/adapters/supabase/analytics-gateway.js.map +1 -0
- package/dist/adapters/supabase/client.js +96 -0
- package/dist/adapters/supabase/client.js.map +1 -0
- package/dist/adapters/supabase/context-gateway.js +23 -0
- package/dist/adapters/supabase/context-gateway.js.map +1 -0
- package/dist/adapters/supabase/gateway.js +18 -0
- package/dist/adapters/supabase/gateway.js.map +1 -0
- package/dist/adapters/supabase/task-gateway.js +450 -0
- package/dist/adapters/supabase/task-gateway.js.map +1 -0
- package/dist/auth.js +118 -0
- package/dist/auth.js.map +1 -0
- package/dist/brand.js +91 -0
- package/dist/brand.js.map +1 -0
- package/dist/cli/commands/auth.js +128 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/clean.js +120 -0
- package/dist/cli/commands/clean.js.map +1 -0
- package/dist/cli/commands/completion.js +114 -0
- package/dist/cli/commands/completion.js.map +1 -0
- package/dist/cli/commands/exec.js +59 -0
- package/dist/cli/commands/exec.js.map +1 -0
- package/dist/cli/commands/init/auth-step.js +49 -0
- package/dist/cli/commands/init/auth-step.js.map +1 -0
- package/dist/cli/commands/init/clients-step.js +76 -0
- package/dist/cli/commands/init/clients-step.js.map +1 -0
- package/dist/cli/commands/init/context-step.js +71 -0
- package/dist/cli/commands/init/context-step.js.map +1 -0
- package/dist/cli/commands/init/index.js +76 -0
- package/dist/cli/commands/init/index.js.map +1 -0
- package/dist/cli/commands/init/project-step.js +105 -0
- package/dist/cli/commands/init/project-step.js.map +1 -0
- package/dist/cli/commands/init/provision-step.js +103 -0
- package/dist/cli/commands/init/provision-step.js.map +1 -0
- package/dist/cli/commands/plan.js +45 -0
- package/dist/cli/commands/plan.js.map +1 -0
- package/dist/cli/commands/skills.js +23 -0
- package/dist/cli/commands/skills.js.map +1 -0
- package/dist/cli/commands/sync.js +296 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/commands/validate-plan.js +42 -0
- package/dist/cli/commands/validate-plan.js.map +1 -0
- package/dist/cli/copy/auth.json +6 -0
- package/dist/cli/copy/flows.json +6 -0
- package/dist/cli/copy/init.json +19 -0
- package/dist/cli/copy/sync.json +3 -0
- package/dist/cli/copy.js +23 -0
- package/dist/cli/copy.js.map +1 -0
- package/dist/cli/flows/clients.js +130 -0
- package/dist/cli/flows/clients.js.map +1 -0
- package/dist/cli/flows/completion.js +63 -0
- package/dist/cli/flows/completion.js.map +1 -0
- package/dist/cli/flows/dependencies.js +114 -0
- package/dist/cli/flows/dependencies.js.map +1 -0
- package/dist/cli/flows/sections.js +85 -0
- package/dist/cli/flows/sections.js.map +1 -0
- package/dist/cli/flows/user-config.js +37 -0
- package/dist/cli/flows/user-config.js.map +1 -0
- package/dist/cli/ui/render.js +237 -0
- package/dist/cli/ui/render.js.map +1 -0
- package/dist/cli/ui/report.js +117 -0
- package/dist/cli/ui/report.js.map +1 -0
- package/dist/cli.js +36 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.js +280 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.js +9 -0
- package/dist/constants.js.map +1 -0
- package/dist/core/ports.js +2 -0
- package/dist/core/ports.js.map +1 -0
- package/dist/core/types.js +7 -0
- package/dist/core/types.js.map +1 -0
- package/dist/database.types.js +11 -0
- package/dist/database.types.js.map +1 -0
- package/dist/lib/active-project.js +28 -0
- package/dist/lib/active-project.js.map +1 -0
- package/dist/lib/autopull.js +13 -0
- package/dist/lib/autopull.js.map +1 -0
- package/dist/lib/client-configs.js +191 -0
- package/dist/lib/client-configs.js.map +1 -0
- package/dist/lib/client-install.js +40 -0
- package/dist/lib/client-install.js.map +1 -0
- package/dist/lib/colors.js +93 -0
- package/dist/lib/colors.js.map +1 -0
- package/dist/lib/cowork-extension.js +143 -0
- package/dist/lib/cowork-extension.js.map +1 -0
- package/dist/lib/dependencies.js +145 -0
- package/dist/lib/dependencies.js.map +1 -0
- package/dist/lib/dependency-install.js +163 -0
- package/dist/lib/dependency-install.js.map +1 -0
- package/dist/lib/duration.js +5 -0
- package/dist/lib/duration.js.map +1 -0
- package/dist/lib/exec-delegate.js +167 -0
- package/dist/lib/exec-delegate.js.map +1 -0
- package/dist/lib/exec-engines.js +72 -0
- package/dist/lib/exec-engines.js.map +1 -0
- package/dist/lib/file-merge.js +33 -0
- package/dist/lib/file-merge.js.map +1 -0
- package/dist/lib/harness.js +90 -0
- package/dist/lib/harness.js.map +1 -0
- package/dist/lib/hooks.js +217 -0
- package/dist/lib/hooks.js.map +1 -0
- package/dist/lib/patterns.js +61 -0
- package/dist/lib/patterns.js.map +1 -0
- package/dist/lib/plan-delegate.js +106 -0
- package/dist/lib/plan-delegate.js.map +1 -0
- package/dist/lib/project-context.js +151 -0
- package/dist/lib/project-context.js.map +1 -0
- package/dist/lib/prompts.js +69 -0
- package/dist/lib/prompts.js.map +1 -0
- package/dist/lib/provision-apply.js +220 -0
- package/dist/lib/provision-apply.js.map +1 -0
- package/dist/lib/provision-collect.js +47 -0
- package/dist/lib/provision-collect.js.map +1 -0
- package/dist/lib/provision.js +45 -0
- package/dist/lib/provision.js.map +1 -0
- package/dist/lib/require-config.js +32 -0
- package/dist/lib/require-config.js.map +1 -0
- package/dist/lib/rules.js +99 -0
- package/dist/lib/rules.js.map +1 -0
- package/dist/lib/sections.js +89 -0
- package/dist/lib/sections.js.map +1 -0
- package/dist/lib/skill-serve.js +129 -0
- package/dist/lib/skill-serve.js.map +1 -0
- package/dist/lib/skills-cache.js +99 -0
- package/dist/lib/skills-cache.js.map +1 -0
- package/dist/lib/skills.js +236 -0
- package/dist/lib/skills.js.map +1 -0
- package/dist/lib/targets.js +151 -0
- package/dist/lib/targets.js.map +1 -0
- package/dist/lib/task-history.js +15 -0
- package/dist/lib/task-history.js.map +1 -0
- package/dist/lib/telemetry.js +51 -0
- package/dist/lib/telemetry.js.map +1 -0
- package/dist/lib/tool-result.js +12 -0
- package/dist/lib/tool-result.js.map +1 -0
- package/dist/lib/validate-plan-delegate.js +107 -0
- package/dist/lib/validate-plan-delegate.js.map +1 -0
- package/dist/lib/version-check.js +89 -0
- package/dist/lib/version-check.js.map +1 -0
- package/dist/matrix-logo.js +122 -0
- package/dist/matrix-logo.js.map +1 -0
- package/dist/mcp-server.js +189 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/session-factory.js +19 -0
- package/dist/session-factory.js.map +1 -0
- package/dist/spinner.js +12 -0
- package/dist/spinner.js.map +1 -0
- package/dist/tools/comment-task.js +72 -0
- package/dist/tools/comment-task.js.map +1 -0
- package/dist/tools/create-task.js +129 -0
- package/dist/tools/create-task.js.map +1 -0
- package/dist/tools/delegate-exec.js +63 -0
- package/dist/tools/delegate-exec.js.map +1 -0
- package/dist/tools/end-allocation.js +38 -0
- package/dist/tools/end-allocation.js.map +1 -0
- package/dist/tools/end-task-allocation.js +37 -0
- package/dist/tools/end-task-allocation.js.map +1 -0
- package/dist/tools/exec-status.js +43 -0
- package/dist/tools/exec-status.js.map +1 -0
- package/dist/tools/get-active-allocation.js +69 -0
- package/dist/tools/get-active-allocation.js.map +1 -0
- package/dist/tools/get-context.js +48 -0
- package/dist/tools/get-context.js.map +1 -0
- package/dist/tools/get-task.js +137 -0
- package/dist/tools/get-task.js.map +1 -0
- package/dist/tools/index.js +44 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/list-my-allocations.js +71 -0
- package/dist/tools/list-my-allocations.js.map +1 -0
- package/dist/tools/list-projects.js +38 -0
- package/dist/tools/list-projects.js.map +1 -0
- package/dist/tools/list-tasks.js +93 -0
- package/dist/tools/list-tasks.js.map +1 -0
- package/dist/tools/move-task.js +82 -0
- package/dist/tools/move-task.js.map +1 -0
- package/dist/tools/plan.js +56 -0
- package/dist/tools/plan.js.map +1 -0
- package/dist/tools/record-delivery.js +71 -0
- package/dist/tools/record-delivery.js.map +1 -0
- package/dist/tools/set-project.js +52 -0
- package/dist/tools/set-project.js.map +1 -0
- package/dist/tools/start-allocation.js +32 -0
- package/dist/tools/start-allocation.js.map +1 -0
- package/dist/tools/start-task-allocation.js +75 -0
- package/dist/tools/start-task-allocation.js.map +1 -0
- package/dist/tools/update-task.js +139 -0
- package/dist/tools/update-task.js.map +1 -0
- package/dist/tools/validate-plan.js +58 -0
- package/dist/tools/validate-plan.js.map +1 -0
- package/dist/version.js +16 -0
- package/dist/version.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, rmSync, lstatSync, readlinkSync } from "node:fs";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { dirname, join, resolve } from "node:path";
|
|
5
|
+
import { VERSION } from "../version.js";
|
|
6
|
+
import { brand } from "../brand.js";
|
|
7
|
+
/**
|
|
8
|
+
* Motor do provisionamento: hash/manifesto (`.<marca>-provision.json`), escrita
|
|
9
|
+
* idempotente e poda do que o nio gravou. `provision.ts` monta a lista e chama
|
|
10
|
+
* `applyProvision`; `uninstallProvision` desfaz pelo mesmo manifesto.
|
|
11
|
+
*/
|
|
12
|
+
export const MANIFEST_NAME = `.${brand.name}-provision.json`;
|
|
13
|
+
export function defaultTargetDir() {
|
|
14
|
+
return join(homedir(), ".claude");
|
|
15
|
+
}
|
|
16
|
+
function sha256(buf) {
|
|
17
|
+
return createHash("sha256").update(buf).digest("hex");
|
|
18
|
+
}
|
|
19
|
+
function readManifest(path) {
|
|
20
|
+
if (!existsSync(path))
|
|
21
|
+
return null;
|
|
22
|
+
try {
|
|
23
|
+
const parsed = JSON.parse(readFileSync(path, "utf-8"));
|
|
24
|
+
if (parsed && typeof parsed === "object" && parsed.files)
|
|
25
|
+
return parsed;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// manifesto corrompido → trata como ausente e reconstrói
|
|
29
|
+
}
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Se um componente de `dir` é symlink com alvo inexistente (dotfiles gerenciando
|
|
34
|
+
* `~/.claude`), materializa o alvo em vez de deixar o `mkdir -p` estourar ENOENT.
|
|
35
|
+
* Retorna `true` se materializou algo. Escrever depois grava através do link.
|
|
36
|
+
*/
|
|
37
|
+
function materializeDanglingLink(dir) {
|
|
38
|
+
let cursor = dir;
|
|
39
|
+
for (;;) {
|
|
40
|
+
let info;
|
|
41
|
+
try {
|
|
42
|
+
info = lstatSync(cursor);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// cursor não existe (parent pendurado) → sobe um nível.
|
|
46
|
+
const parent = dirname(cursor);
|
|
47
|
+
if (parent === cursor)
|
|
48
|
+
return false;
|
|
49
|
+
cursor = parent;
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (info.isSymbolicLink()) {
|
|
53
|
+
const target = resolve(dirname(cursor), readlinkSync(cursor));
|
|
54
|
+
if (existsSync(target))
|
|
55
|
+
return false; // link ok — o ENOENT veio de outro lugar
|
|
56
|
+
mkdirSync(target, { recursive: true });
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
return false; // cursor existe e é real → não há link pendurado acima
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/** `mkdir -p` tolerante a symlinks pendurados de dotfiles (ver acima). */
|
|
63
|
+
export function ensureDir(dir) {
|
|
64
|
+
for (let attempt = 0; attempt < 40; attempt++) {
|
|
65
|
+
try {
|
|
66
|
+
mkdirSync(dir, { recursive: true });
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
if (err.code !== "ENOENT")
|
|
71
|
+
throw err;
|
|
72
|
+
if (!materializeDanglingLink(dir))
|
|
73
|
+
throw err;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
mkdirSync(dir, { recursive: true });
|
|
77
|
+
}
|
|
78
|
+
function writeFile(targetAbs, content) {
|
|
79
|
+
ensureDir(dirname(targetAbs));
|
|
80
|
+
writeFileSync(targetAbs, content);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Núcleo do provisionamento: aplica `docs` no destino, idempotente e não-destrutivo
|
|
84
|
+
* via manifesto. Retorna o plano por arquivo.
|
|
85
|
+
*/
|
|
86
|
+
export function applyProvision(docs, options = {}) {
|
|
87
|
+
const dryRun = options.dryRun ?? false;
|
|
88
|
+
const force = options.force ?? false;
|
|
89
|
+
const prune = options.prune ?? true;
|
|
90
|
+
const targetDir = options.targetDir ?? defaultTargetDir();
|
|
91
|
+
const manifestPath = join(targetDir, MANIFEST_NAME);
|
|
92
|
+
const oldFiles = readManifest(manifestPath)?.files ?? {};
|
|
93
|
+
const files = docs.map((d) => ({
|
|
94
|
+
relPath: d.relPath,
|
|
95
|
+
content: d.content,
|
|
96
|
+
hash: sha256(d.content),
|
|
97
|
+
}));
|
|
98
|
+
const incomingSet = new Set(files.map((f) => f.relPath));
|
|
99
|
+
const results = [];
|
|
100
|
+
const newFiles = {};
|
|
101
|
+
for (const f of files) {
|
|
102
|
+
const targetAbs = join(targetDir, f.relPath);
|
|
103
|
+
// Um arquivo problemático (ex.: symlink de dotfiles quebrado) vira um resultado
|
|
104
|
+
// `write-error` e a sincronização segue — nunca aborta o resto por causa de um.
|
|
105
|
+
try {
|
|
106
|
+
if (!existsSync(targetAbs)) {
|
|
107
|
+
if (!dryRun)
|
|
108
|
+
writeFile(targetAbs, f.content);
|
|
109
|
+
results.push({ relPath: f.relPath, action: "create" });
|
|
110
|
+
newFiles[f.relPath] = f.hash;
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
const existingHash = sha256(readFileSync(targetAbs));
|
|
114
|
+
if (existingHash === f.hash) {
|
|
115
|
+
results.push({ relPath: f.relPath, action: "unchanged" });
|
|
116
|
+
newFiles[f.relPath] = f.hash;
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
// Divergente. Só atualizamos se o arquivo era nosso e o worker não mexeu,
|
|
120
|
+
// ou se ele pediu --force.
|
|
121
|
+
const wasOursUntouched = oldFiles[f.relPath] === existingHash;
|
|
122
|
+
if (wasOursUntouched || force) {
|
|
123
|
+
if (!dryRun)
|
|
124
|
+
writeFile(targetAbs, f.content);
|
|
125
|
+
results.push({
|
|
126
|
+
relPath: f.relPath,
|
|
127
|
+
action: "update",
|
|
128
|
+
detail: wasOursUntouched
|
|
129
|
+
? undefined
|
|
130
|
+
: "forçado sobre arquivo divergente",
|
|
131
|
+
});
|
|
132
|
+
newFiles[f.relPath] = f.hash;
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
results.push({
|
|
136
|
+
relPath: f.relPath,
|
|
137
|
+
action: "skip-conflict",
|
|
138
|
+
detail: oldFiles[f.relPath] !== undefined
|
|
139
|
+
? "editado localmente"
|
|
140
|
+
: "arquivo de terceiros",
|
|
141
|
+
});
|
|
142
|
+
// Não reivindica propriedade: fica de fora do novo manifesto.
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
results.push({
|
|
147
|
+
relPath: f.relPath,
|
|
148
|
+
action: "write-error",
|
|
149
|
+
detail: err.message,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// Prune: o que era nosso mas não veio nesta fonte.
|
|
154
|
+
if (prune) {
|
|
155
|
+
for (const [relPath, oldHash] of Object.entries(oldFiles)) {
|
|
156
|
+
if (incomingSet.has(relPath))
|
|
157
|
+
continue;
|
|
158
|
+
// Ainda existe no bundle (só foi filtrado pela seleção neste run) → NÃO poda;
|
|
159
|
+
// mantém no manifesto pra não perder a propriedade em runs futuros.
|
|
160
|
+
if (options.keep?.has(relPath)) {
|
|
161
|
+
newFiles[relPath] = oldHash;
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
const targetAbs = join(targetDir, relPath);
|
|
165
|
+
if (!existsSync(targetAbs))
|
|
166
|
+
continue;
|
|
167
|
+
const existingHash = sha256(readFileSync(targetAbs));
|
|
168
|
+
if (existingHash === oldHash) {
|
|
169
|
+
if (!dryRun)
|
|
170
|
+
rmSync(targetAbs);
|
|
171
|
+
results.push({ relPath, action: "prune" });
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
results.push({
|
|
175
|
+
relPath,
|
|
176
|
+
action: "prune-kept",
|
|
177
|
+
detail: "modificado localmente — mantido",
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
if (!dryRun) {
|
|
183
|
+
const manifest = {
|
|
184
|
+
version: VERSION,
|
|
185
|
+
generator: brand.packageName,
|
|
186
|
+
files: newFiles,
|
|
187
|
+
};
|
|
188
|
+
mkdirSync(targetDir, { recursive: true });
|
|
189
|
+
writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + "\n", "utf-8");
|
|
190
|
+
}
|
|
191
|
+
return { targetDir, version: VERSION, dryRun, files: results };
|
|
192
|
+
}
|
|
193
|
+
/** Remove só o que o nio instalou (conforme o manifesto), preservando edições locais. */
|
|
194
|
+
export function uninstallProvision(options = {}) {
|
|
195
|
+
const dryRun = options.dryRun ?? false;
|
|
196
|
+
const targetDir = options.targetDir ?? defaultTargetDir();
|
|
197
|
+
const manifestPath = join(targetDir, MANIFEST_NAME);
|
|
198
|
+
const manifest = readManifest(manifestPath);
|
|
199
|
+
const removed = [];
|
|
200
|
+
const kept = [];
|
|
201
|
+
if (manifest) {
|
|
202
|
+
for (const [relPath, hash] of Object.entries(manifest.files)) {
|
|
203
|
+
const targetAbs = join(targetDir, relPath);
|
|
204
|
+
if (!existsSync(targetAbs))
|
|
205
|
+
continue;
|
|
206
|
+
if (sha256(readFileSync(targetAbs)) === hash) {
|
|
207
|
+
if (!dryRun)
|
|
208
|
+
rmSync(targetAbs);
|
|
209
|
+
removed.push(relPath);
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
kept.push(relPath);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
if (!dryRun && existsSync(manifestPath))
|
|
216
|
+
rmSync(manifestPath);
|
|
217
|
+
}
|
|
218
|
+
return { targetDir, removed, kept, dryRun };
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=provision-apply.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provision-apply.js","sourceRoot":"","sources":["../../src/lib/provision-apply.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { existsSync, readFileSync, readdirSync } from "node:fs";
|
|
2
|
+
import { join, relative, sep } from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* Coleta os arquivos sincronizáveis do pacote `@nio-cli/skills` (commands/skills/
|
|
5
|
+
* agents) como uma lista em memória — a fonte que `provision()` filtra/achata
|
|
6
|
+
* (via `sections.ts`) e passa pro motor de aplicação (`provision-apply.ts`).
|
|
7
|
+
*/
|
|
8
|
+
/** Subpastas do pacote `@nio-cli/skills` espelhadas em `~/.claude`. */
|
|
9
|
+
const SYNCED_SUBDIRS = ["commands", "skills", "agents"];
|
|
10
|
+
/** Basenames que nunca são copiados pro destino (READMEs são só do repo). */
|
|
11
|
+
const IGNORED_BASENAMES = new Set([".gitkeep", ".DS_Store", "README.md"]);
|
|
12
|
+
/** Lista arquivos sob `dir` recursivamente, paths relativos a `dir` em estilo POSIX. */
|
|
13
|
+
function listFilesRecursive(dir) {
|
|
14
|
+
const out = [];
|
|
15
|
+
const walk = (abs) => {
|
|
16
|
+
for (const entry of readdirSync(abs, { withFileTypes: true })) {
|
|
17
|
+
if (entry.name === ".DS_Store")
|
|
18
|
+
continue;
|
|
19
|
+
const childAbs = join(abs, entry.name);
|
|
20
|
+
if (entry.isDirectory())
|
|
21
|
+
walk(childAbs);
|
|
22
|
+
else if (entry.isFile())
|
|
23
|
+
out.push(relative(dir, childAbs).split(sep).join("/"));
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
walk(dir);
|
|
27
|
+
return out;
|
|
28
|
+
}
|
|
29
|
+
/** Coleta os arquivos sincronizáveis do pacote (só as subpastas conhecidas). */
|
|
30
|
+
export function collectSkillFiles(dir) {
|
|
31
|
+
const files = [];
|
|
32
|
+
for (const sub of SYNCED_SUBDIRS) {
|
|
33
|
+
const subDir = join(dir, sub);
|
|
34
|
+
if (!existsSync(subDir))
|
|
35
|
+
continue;
|
|
36
|
+
for (const rel of listFilesRecursive(subDir)) {
|
|
37
|
+
const base = rel.split("/").pop() ?? rel;
|
|
38
|
+
if (IGNORED_BASENAMES.has(base))
|
|
39
|
+
continue;
|
|
40
|
+
const abs = join(subDir, rel);
|
|
41
|
+
const content = readFileSync(abs);
|
|
42
|
+
files.push({ relPath: `${sub}/${rel}`, content });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return files;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=provision-collect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provision-collect.js","sourceRoot":"","sources":["../../src/lib/provision-collect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEhD;;;;GAIG;AAEH,uEAAuE;AACvE,MAAM,cAAc,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAU,CAAC;AAEjE,6EAA6E;AAC7E,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;AAO1E,wFAAwF;AACxF,SAAS,kBAAkB,CAAC,GAAW;IACrC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,CAAC,GAAW,EAAQ,EAAE;QACjC,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAC9D,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW;gBAAE,SAAS;YACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,KAAK,CAAC,WAAW,EAAE;gBAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;iBACnC,IAAI,KAAK,CAAC,MAAM,EAAE;gBACrB,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,GAAG,CAAC;AACb,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,SAAS;QAClC,KAAK,MAAM,GAAG,IAAI,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC;YACzC,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC9B,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,GAAG,IAAI,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { brand } from "../brand.js";
|
|
3
|
+
import { claudeTarget } from "./targets.js";
|
|
4
|
+
import { filterDocsForSurface, skillsDir } from "./skills.js";
|
|
5
|
+
import { filterForSelection, flattenSelection } from "./sections.js";
|
|
6
|
+
import { collectSkillFiles } from "./provision-collect.js";
|
|
7
|
+
import { applyProvision } from "./provision-apply.js";
|
|
8
|
+
/**
|
|
9
|
+
* Provisiona skills/commands/agents do nio (o MCP não grava em `~/.claude`; a CLI
|
|
10
|
+
* `sync`/`init` chama `provision()`). Idempotente via manifesto. Coleta em
|
|
11
|
+
* `provision-collect.ts`, motor em `provision-apply.ts` — ambos reexportados daqui.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Copia/atualiza o conteúdo do pacote `@nio-cli/skills` no destino.
|
|
15
|
+
* (`nio sync` / `nio init`.)
|
|
16
|
+
*/
|
|
17
|
+
export function provision(options = {}) {
|
|
18
|
+
const target = options.target ?? claudeTarget;
|
|
19
|
+
const dir = options.skillsDir ?? skillsDir();
|
|
20
|
+
if (!existsSync(dir)) {
|
|
21
|
+
throw new Error(`Pacote de skills não encontrado em ${dir}. Instale/publique ${brand.skillsPackage}.`);
|
|
22
|
+
}
|
|
23
|
+
const rawDocs = collectSkillFiles(dir).map((f) => ({
|
|
24
|
+
relPath: f.relPath,
|
|
25
|
+
content: f.content,
|
|
26
|
+
}));
|
|
27
|
+
// Todos os paths on-disk possíveis do bundle (sem o filtro de seleção). O prune só
|
|
28
|
+
// remove o que NÃO está aqui — o que saiu do bundle de verdade —, nunca o que foi só
|
|
29
|
+
// filtrado pela seleção deste run. Sem isso o auto-pull de um repo com seleção estreita
|
|
30
|
+
// apagava `/implement` & cia. do `~/.claude` global.
|
|
31
|
+
const keep = new Set(target
|
|
32
|
+
.mapDocs(filterDocsForSurface(flattenSelection(rawDocs), target.surface))
|
|
33
|
+
.map((d) => d.relPath));
|
|
34
|
+
const scoped = filterForSelection(rawDocs, options.selection);
|
|
35
|
+
const flat = flattenSelection(scoped);
|
|
36
|
+
const visible = filterDocsForSurface(flat, target.surface);
|
|
37
|
+
const docs = target.mapDocs(visible);
|
|
38
|
+
return applyProvision(docs, {
|
|
39
|
+
...options,
|
|
40
|
+
keep,
|
|
41
|
+
targetDir: options.targetDir ?? target.targetDir(),
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
export { MANIFEST_NAME, applyProvision, ensureDir, uninstallProvision, } from "./provision-apply.js";
|
|
45
|
+
//# sourceMappingURL=provision.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provision.js","sourceRoot":"","sources":["../../src/lib/provision.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,YAAY,EAAwB,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAkB,MAAM,eAAe,CAAC;AACrF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAA+C,MAAM,sBAAsB,CAAC;AAEnG;;;;GAIG;AAEH;;;GAGG;AACH,MAAM,UAAU,SAAS,CACvB,UAAkF,EAAE;IAEpF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,YAAY,CAAC;IAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,IAAI,SAAS,EAAE,CAAC;IAC7C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACb,sCAAsC,GAAG,sBAAsB,KAAK,CAAC,aAAa,GAAG,CACtF,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACjD,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,OAAO,EAAE,CAAC,CAAC,OAAO;KACnB,CAAC,CAAC,CAAC;IAEJ,mFAAmF;IACnF,qFAAqF;IACrF,wFAAwF;IACxF,qDAAqD;IACrD,MAAM,IAAI,GAAG,IAAI,GAAG,CAClB,MAAM;SACH,OAAO,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;SACxE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CACzB,CAAC;IAEF,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,OAAO,cAAc,CAAC,IAAI,EAAE;QAC1B,GAAG,OAAO;QACV,IAAI;QACJ,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,EAAE;KACnD,CAAC,CAAC;AACL,CAAC;AAED,OAAO,EACL,aAAa,EACb,cAAc,EACd,SAAS,EACT,kBAAkB,GAOnB,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { UUID_REGEX } from '../config.js';
|
|
2
|
+
import { errorResult } from './tool-result.js';
|
|
3
|
+
import { loadActiveProjectId } from './active-project.js';
|
|
4
|
+
import { brand } from '../brand.js';
|
|
5
|
+
/**
|
|
6
|
+
* Resolve o projeto efetivo de uma chamada, na ordem:
|
|
7
|
+
* 1. project_id explícito passado na tool (override por chamada)
|
|
8
|
+
* 2. projeto ativo da sessão (`nos_set_project`, só em memória)
|
|
9
|
+
* 3. default do ambiente/arquivo (NIO_PROJECT_ID / nio.json)
|
|
10
|
+
*
|
|
11
|
+
* O repository_id default só é aplicado quando o projeto resolvido é o mesmo do
|
|
12
|
+
* default — evita herdar um repositório de outro projeto.
|
|
13
|
+
*/
|
|
14
|
+
export function resolveProjectConfig(ctx, explicitProjectId) {
|
|
15
|
+
const projectId = explicitProjectId ?? loadActiveProjectId() ?? ctx.config?.project_id;
|
|
16
|
+
if (!projectId) {
|
|
17
|
+
return errorResult(`Nenhum projeto selecionado. Use \`${brand.toolPrefix}list_projects\` para ver os seus e ` +
|
|
18
|
+
`\`${brand.toolPrefix}set_project\` para escolher um (ou passe \`project_id\` direto na chamada).`);
|
|
19
|
+
}
|
|
20
|
+
if (!UUID_REGEX.test(projectId)) {
|
|
21
|
+
return errorResult(`project_id inválido (UUID esperado): ${projectId}`);
|
|
22
|
+
}
|
|
23
|
+
const config = { project_id: projectId };
|
|
24
|
+
if (projectId === ctx.config?.project_id && ctx.config?.repository_id) {
|
|
25
|
+
config.repository_id = ctx.config.repository_id;
|
|
26
|
+
}
|
|
27
|
+
return config;
|
|
28
|
+
}
|
|
29
|
+
export function isErrorResult(value) {
|
|
30
|
+
return typeof value === 'object' && value !== null && 'isError' in value;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=require-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"require-config.js","sourceRoot":"","sources":["../../src/lib/require-config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAsB,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAClC,GAAgB,EAChB,iBAA0B;IAE1B,MAAM,SAAS,GAAG,iBAAiB,IAAI,mBAAmB,EAAE,IAAI,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC;IAEvF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,WAAW,CAChB,qCAAqC,KAAK,CAAC,UAAU,qCAAqC;YACxF,KAAK,KAAK,CAAC,UAAU,6EAA6E,CACrG,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAChC,OAAO,WAAW,CAAC,wCAAwC,SAAS,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,MAAM,GAAkB,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;IACxD,IAAI,SAAS,KAAK,GAAG,CAAC,MAAM,EAAE,UAAU,IAAI,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC;QACtE,MAAM,CAAC,aAAa,GAAG,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC;IAClD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,SAAS,IAAI,KAAK,CAAC;AAC3E,CAAC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { skillsDir } from './skills.js';
|
|
4
|
+
import { DEV_ROLE, GENERAL } from './sections.js';
|
|
5
|
+
/**
|
|
6
|
+
* Rules do harness — convenções versionadas no `nio-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`.
|
|
9
|
+
*
|
|
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`.
|
|
12
|
+
*/
|
|
13
|
+
const RULES_ROOT = 'rules';
|
|
14
|
+
function rulePath(dir, ...seg) {
|
|
15
|
+
return join(dir, RULES_ROOT, ...seg);
|
|
16
|
+
}
|
|
17
|
+
/** Separa o frontmatter (`--- … ---`) do corpo. */
|
|
18
|
+
function splitFrontmatter(raw) {
|
|
19
|
+
const m = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?/.exec(raw);
|
|
20
|
+
if (!m)
|
|
21
|
+
return { fm: {}, body: raw };
|
|
22
|
+
const fm = {};
|
|
23
|
+
for (const line of m[1].split(/\r?\n/)) {
|
|
24
|
+
const mm = /^([A-Za-z0-9_-]+):\s*(.*)$/.exec(line);
|
|
25
|
+
if (mm)
|
|
26
|
+
fm[mm[1]] = mm[2].trim();
|
|
27
|
+
}
|
|
28
|
+
return { fm, body: raw.slice(m[0].length) };
|
|
29
|
+
}
|
|
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))
|
|
37
|
+
return null;
|
|
38
|
+
const body = splitFrontmatter(readFileSync(path, 'utf8')).body.trim();
|
|
39
|
+
return body.length > 0 ? demoteHeadings(body) : null;
|
|
40
|
+
}
|
|
41
|
+
/** Skills recomendadas (frontmatter `skills:`) de um arquivo de regra. */
|
|
42
|
+
function ruleSkillsAt(path) {
|
|
43
|
+
if (!existsSync(path))
|
|
44
|
+
return [];
|
|
45
|
+
return (splitFrontmatter(readFileSync(path, 'utf8')).fm.skills ?? '')
|
|
46
|
+
.split(/[,\s]+/)
|
|
47
|
+
.map((s) => s.trim())
|
|
48
|
+
.filter(Boolean);
|
|
49
|
+
}
|
|
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');
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
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.
|
|
59
|
+
*/
|
|
60
|
+
export function concatenateRules(sel, dir = skillsDir()) {
|
|
61
|
+
if (!sel.roles.includes(DEV_ROLE))
|
|
62
|
+
return '';
|
|
63
|
+
const blocks = [];
|
|
64
|
+
const general = readRuleBody(generalRule(dir));
|
|
65
|
+
if (general)
|
|
66
|
+
blocks.push(`## general\n\n${general}`);
|
|
67
|
+
for (const area of Object.keys(sel.stacks).sort()) {
|
|
68
|
+
const areaGeneral = readRuleBody(rulePath(dir, DEV_ROLE, area, GENERAL, 'rules.md'));
|
|
69
|
+
if (areaGeneral)
|
|
70
|
+
blocks.push(`## ${area}\n\n${areaGeneral}`);
|
|
71
|
+
const stack = sel.stacks[area];
|
|
72
|
+
if (stack && stack !== GENERAL) {
|
|
73
|
+
const body = readRuleBody(rulePath(dir, DEV_ROLE, area, stack, 'rules.md'));
|
|
74
|
+
if (body)
|
|
75
|
+
blocks.push(`## ${area} · ${stack}\n\n${body}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return blocks.join('\n\n');
|
|
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
|
+
}
|
|
99
|
+
//# sourceMappingURL=rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/lib/rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAkB,MAAM,eAAe,CAAC;AAElE;;;;;;;GAOG;AAEH,MAAM,UAAU,GAAG,OAAO,CAAC;AAE3B,SAAS,QAAQ,CAAC,GAAW,EAAE,GAAG,GAAa;IAC7C,OAAO,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC,CAAC;AACvC,CAAC;AAED,mDAAmD;AACnD,SAAS,gBAAgB,CAAC,GAAW;IACnC,MAAM,CAAC,GAAG,mCAAmC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxD,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IACrC,MAAM,EAAE,GAA2B,EAAE,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,MAAM,EAAE,GAAG,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,EAAE;YAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACnC,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;AAC9C,CAAC;AAED,uFAAuF;AACvF,SAAS,cAAc,CAAC,EAAU;IAChC,OAAO,EAAE,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC;AAED,sFAAsF;AACtF,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,IAAI,GAAG,gBAAgB,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACtE,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACvD,CAAC;AAED,0EAA0E;AAC1E,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,OAAO,CAAC,gBAAgB,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC;SAClE,KAAK,CAAC,QAAQ,CAAC;SACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED,+FAA+F;AAC/F,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC;IACnE,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;AAClF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAc,EAAE,MAAc,SAAS,EAAE;IACxE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7C,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,IAAI,OAAO;QAAE,MAAM,CAAC,IAAI,CAAC,iBAAiB,OAAO,EAAE,CAAC,CAAC;IAErD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAClD,MAAM,WAAW,GAAG,YAAY,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;QACrF,IAAI,WAAW;YAAE,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,OAAO,WAAW,EAAE,CAAC,CAAC;QAE7D,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,KAAK,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;YAC5E,IAAI,IAAI;gBAAE,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,OAAO,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAc,EAAE,MAAc,SAAS,EAAE;IACzE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7C,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC7F,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,KAAK,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YAC/B,KAAK,MAAM,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;gBAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { existsSync, readdirSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
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';
|
|
19
|
+
export const DEV_ROLE = 'dev';
|
|
20
|
+
/** Roles = subpastas de topo de `skills/` (ex.: `dev`, `management`). */
|
|
21
|
+
export function discoverRoles(dir) {
|
|
22
|
+
return subdirs(join(dir, 'skills'));
|
|
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))
|
|
34
|
+
return [];
|
|
35
|
+
return readdirSync(root, { withFileTypes: true })
|
|
36
|
+
.filter((e) => e.isDirectory() && !e.name.startsWith('.'))
|
|
37
|
+
.map((e) => e.name)
|
|
38
|
+
.sort();
|
|
39
|
+
}
|
|
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) {
|
|
46
|
+
const parts = relPath.split('/');
|
|
47
|
+
const kind = parts[0];
|
|
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
|
|
62
|
+
}
|
|
63
|
+
/** Filtra docs pela seleção. `undefined` → tudo (sem filtro). */
|
|
64
|
+
export function filterForSelection(docs, sel) {
|
|
65
|
+
if (!sel)
|
|
66
|
+
return docs;
|
|
67
|
+
return docs.filter((d) => includePath(d.relPath, sel));
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
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)
|
|
75
|
+
*/
|
|
76
|
+
export function flattenSelection(docs) {
|
|
77
|
+
return docs.map((d) => {
|
|
78
|
+
const parts = d.relPath.split('/');
|
|
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('/')}` };
|
|
85
|
+
}
|
|
86
|
+
return d;
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=sections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sections.js","sourceRoot":"","sources":["../../src/lib/sections.ts"],"names":[],"mappings":"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"}
|