@promovaweb/specsfy 0.7.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/CHANGELOG.md +23 -0
- package/LICENSE +21 -0
- package/README.md +248 -0
- package/bin/specsfy.cjs +3 -0
- package/dist/backlog.d.ts +17 -0
- package/dist/backlog.d.ts.map +1 -0
- package/dist/backlog.js +73 -0
- package/dist/backlog.js.map +1 -0
- package/dist/catalog.d.ts +33 -0
- package/dist/catalog.d.ts.map +1 -0
- package/dist/catalog.js +135 -0
- package/dist/catalog.js.map +1 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +258 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +14 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +44 -0
- package/dist/config.js.map +1 -0
- package/dist/filesystem.d.ts +19 -0
- package/dist/filesystem.d.ts.map +1 -0
- package/dist/filesystem.js +67 -0
- package/dist/filesystem.js.map +1 -0
- package/dist/github.d.ts +8 -0
- package/dist/github.d.ts.map +1 -0
- package/dist/github.js +36 -0
- package/dist/github.js.map +1 -0
- package/dist/installer.d.ts +48 -0
- package/dist/installer.d.ts.map +1 -0
- package/dist/installer.js +613 -0
- package/dist/installer.js.map +1 -0
- package/dist/main.d.ts +5 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +13 -0
- package/dist/main.js.map +1 -0
- package/dist/progress.d.ts +46 -0
- package/dist/progress.d.ts.map +1 -0
- package/dist/progress.js +148 -0
- package/dist/progress.js.map +1 -0
- package/dist/project-testing.d.ts +27 -0
- package/dist/project-testing.d.ts.map +1 -0
- package/dist/project-testing.js +150 -0
- package/dist/project-testing.js.map +1 -0
- package/dist/skill-lock.d.ts +23 -0
- package/dist/skill-lock.d.ts.map +1 -0
- package/dist/skill-lock.js +80 -0
- package/dist/skill-lock.js.map +1 -0
- package/dist/tui.d.ts +141 -0
- package/dist/tui.d.ts.map +1 -0
- package/dist/tui.js +1219 -0
- package/dist/tui.js.map +1 -0
- package/dist/updater.d.ts +41 -0
- package/dist/updater.d.ts.map +1 -0
- package/dist/updater.js +221 -0
- package/dist/updater.js.map +1 -0
- package/dist/version.d.ts +7 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +7 -0
- package/dist/version.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,613 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Instalação idempotente do framework e das skills do Specsfy.
|
|
3
|
+
*
|
|
4
|
+
* A materialização é delegada ao CLI oficial `skills`; este módulo mantém os
|
|
5
|
+
* fingerprints, protege customizações e gerencia somente blocos identificados.
|
|
6
|
+
*/
|
|
7
|
+
import { createHash } from "node:crypto";
|
|
8
|
+
import { execFile } from "node:child_process";
|
|
9
|
+
import { access, lstat, mkdir, mkdtemp, readFile, readlink, readdir, rm, } from "node:fs/promises";
|
|
10
|
+
import { tmpdir } from "node:os";
|
|
11
|
+
import { basename, join, relative, resolve, sep } from "node:path";
|
|
12
|
+
import { promisify } from "node:util";
|
|
13
|
+
import { isFile, pathExists, readJson, resolvePath, writeTextAtomic, } from "./filesystem.js";
|
|
14
|
+
import { assertConsumerProject, ensureSkillsLock, installedSkillNames, } from "./skill-lock.js";
|
|
15
|
+
const execFileAsync = promisify(execFile);
|
|
16
|
+
export const MONOREPO_REPOSITORY = "https://github.com/promovaweb/specsfy.git";
|
|
17
|
+
export const BASE_DIRECTORY = "skills";
|
|
18
|
+
export const SPECIALISTS_DIRECTORY = "specialists";
|
|
19
|
+
export const BASE_SKILLS = [
|
|
20
|
+
"specsfy-01-inbox",
|
|
21
|
+
"specsfy-02-backlog",
|
|
22
|
+
"specsfy-03-specify",
|
|
23
|
+
"specsfy-04-validate",
|
|
24
|
+
"specsfy-05-tasks",
|
|
25
|
+
"specsfy-06-tdd-bdd",
|
|
26
|
+
"specsfy-07-implement",
|
|
27
|
+
"specsfy-update-spec",
|
|
28
|
+
"specsfy-progress",
|
|
29
|
+
];
|
|
30
|
+
export const AUXILIARY_SKILLS = [
|
|
31
|
+
"specsfy-aux-stack",
|
|
32
|
+
"specsfy-aux-rules",
|
|
33
|
+
"specsfy-aux-database",
|
|
34
|
+
];
|
|
35
|
+
export const DOCUMENTATION_SKILLS = ["specsfy-documentator"];
|
|
36
|
+
export const FRAMEWORK_SKILLS = [
|
|
37
|
+
"specsfy-setup",
|
|
38
|
+
...AUXILIARY_SKILLS,
|
|
39
|
+
...DOCUMENTATION_SKILLS,
|
|
40
|
+
...BASE_SKILLS,
|
|
41
|
+
];
|
|
42
|
+
export const RENAMED_BASE_SKILLS = {
|
|
43
|
+
"specsfy-base-idea": "specsfy-01-inbox",
|
|
44
|
+
"specsfy-base-backlog": "specsfy-02-backlog",
|
|
45
|
+
"specsfy-base-interview": "specsfy-02-backlog",
|
|
46
|
+
"specsfy-base-specify": "specsfy-03-specify",
|
|
47
|
+
"specsfy-base-validate": "specsfy-04-validate",
|
|
48
|
+
"specsfy-base-tasks": "specsfy-05-tasks",
|
|
49
|
+
"specsfy-base-tdd-bdd": "specsfy-06-tdd-bdd",
|
|
50
|
+
"specsfy-base-implement": "specsfy-07-implement",
|
|
51
|
+
"specsfy-base-update-spec": "specsfy-update-spec",
|
|
52
|
+
"specsfy-base-progress": "specsfy-progress",
|
|
53
|
+
"specsfy-base-discuss": "specsfy-02-backlog",
|
|
54
|
+
};
|
|
55
|
+
const FRAMEWORK_START = "<!-- specsfy:framework:start -->";
|
|
56
|
+
const FRAMEWORK_END = "<!-- specsfy:framework:end -->";
|
|
57
|
+
const SPEC_PATH_TOKEN = "{{SPECSFY_SPEC_PATH}}";
|
|
58
|
+
const CONSUMER_SPEC_PATH = ".specsfy/Spec.md";
|
|
59
|
+
const CONSUMER_TEMPLATE_DIRECTORY = ".specsfy/templates";
|
|
60
|
+
const CONSUMER_CUSTOM_TEMPLATE_DIRECTORY = ".specsfy/templates/custom";
|
|
61
|
+
const FRAMEWORK_TEMPLATE_NAMES = [
|
|
62
|
+
"Inbox.md",
|
|
63
|
+
"Backlog.md",
|
|
64
|
+
"Spec.md",
|
|
65
|
+
"Tasks.md",
|
|
66
|
+
"Project.md",
|
|
67
|
+
"Stack.md",
|
|
68
|
+
"Rules.md",
|
|
69
|
+
"Database.md",
|
|
70
|
+
];
|
|
71
|
+
const CONSUMER_EXAMPLE_PATH = ".specsfy/examples/Spec.md";
|
|
72
|
+
/** Instalador de um projeto consumidor explicitamente selecionado. */
|
|
73
|
+
export class SkillInstaller {
|
|
74
|
+
project;
|
|
75
|
+
force;
|
|
76
|
+
constructor(project, force) {
|
|
77
|
+
this.project = resolvePath(project);
|
|
78
|
+
this.force = force;
|
|
79
|
+
}
|
|
80
|
+
/** Valida o destino e cria o lock oficial antes de liberar o instalador. */
|
|
81
|
+
static async create(project, force = false) {
|
|
82
|
+
const installer = new SkillInstaller(project, force);
|
|
83
|
+
await assertConsumerProject(installer.project);
|
|
84
|
+
await ensureSkillsLock(installer.project);
|
|
85
|
+
return installer;
|
|
86
|
+
}
|
|
87
|
+
/** Instala todo o framework base. */
|
|
88
|
+
async installBase() {
|
|
89
|
+
return this.installBaseSelection([...FRAMEWORK_SKILLS]);
|
|
90
|
+
}
|
|
91
|
+
/** Instala um subconjunto válido do framework base. */
|
|
92
|
+
async installBaseSelection(names) {
|
|
93
|
+
const allowed = new Set(FRAMEWORK_SKILLS);
|
|
94
|
+
const invalid = [...new Set(names.filter((name) => !allowed.has(name)))].sort();
|
|
95
|
+
if (invalid.length) {
|
|
96
|
+
throw new Error(`skill do framework desconhecida: ${invalid.join(", ")}`);
|
|
97
|
+
}
|
|
98
|
+
return withRepositoryCheckout(MONOREPO_REPOSITORY, BASE_DIRECTORY, (checkout) => this.installBaseFromCheckout(checkout, names));
|
|
99
|
+
}
|
|
100
|
+
/** Instala framework estrutural e skills a partir de uma origem local. */
|
|
101
|
+
async installBaseFromCheckout(checkout, names = BASE_SKILLS) {
|
|
102
|
+
await this.validateSkillInstallation(checkout, names);
|
|
103
|
+
const legacy = await this.legacyBaseTargets();
|
|
104
|
+
const changed = await this.installFrameworkFromCheckout(checkout);
|
|
105
|
+
changed.push(...(await this.installFromCheckout(checkout, names, "base")), ...(await this.removeLegacyBase(legacy)));
|
|
106
|
+
return changed;
|
|
107
|
+
}
|
|
108
|
+
/** Publica regras, templates, exemplo e blocos gerenciados. */
|
|
109
|
+
async installFrameworkFromCheckout(checkout) {
|
|
110
|
+
const sourceSpec = join(checkout, "Spec.md");
|
|
111
|
+
const sourceExample = join(checkout, "examples", "Spec.md");
|
|
112
|
+
const sourceAgents = join(checkout, "AGENTS.md");
|
|
113
|
+
const templatePaths = Object.fromEntries(FRAMEWORK_TEMPLATE_NAMES.map((name) => [
|
|
114
|
+
name,
|
|
115
|
+
join(checkout, "templates", name),
|
|
116
|
+
]));
|
|
117
|
+
for (const path of [
|
|
118
|
+
sourceSpec,
|
|
119
|
+
...Object.values(templatePaths),
|
|
120
|
+
sourceExample,
|
|
121
|
+
sourceAgents,
|
|
122
|
+
]) {
|
|
123
|
+
if (!(await isFile(path))) {
|
|
124
|
+
throw new Error(`arquivo estrutural ausente na origem: ${path}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
const specContent = await readFile(sourceSpec, "utf8");
|
|
128
|
+
const exampleContent = await readFile(sourceExample, "utf8");
|
|
129
|
+
const templates = Object.fromEntries(await Promise.all(FRAMEWORK_TEMPLATE_NAMES.map(async (name) => [
|
|
130
|
+
name,
|
|
131
|
+
await readFile(templatePaths[name], "utf8"),
|
|
132
|
+
])));
|
|
133
|
+
const agentsBlock = (await extractSourceBlock(sourceAgents)).replace(SPEC_PATH_TOKEN, CONSUMER_SPEC_PATH);
|
|
134
|
+
const claudeBlock = `${FRAMEWORK_START}\n@${CONSUMER_SPEC_PATH}\n${FRAMEWORK_END}`;
|
|
135
|
+
const lock = await this.readLock();
|
|
136
|
+
const previous = lock.framework && typeof lock.framework === "object" ? lock.framework : {};
|
|
137
|
+
const previousTemplates = previous.templates_sha256 &&
|
|
138
|
+
typeof previous.templates_sha256 === "object" &&
|
|
139
|
+
!Array.isArray(previous.templates_sha256)
|
|
140
|
+
? previous.templates_sha256
|
|
141
|
+
: {};
|
|
142
|
+
const plans = [
|
|
143
|
+
[
|
|
144
|
+
join(this.project, CONSUMER_SPEC_PATH),
|
|
145
|
+
await planManagedFile(join(this.project, CONSUMER_SPEC_PATH), specContent, stringValue(previous.spec_sha256), this.force),
|
|
146
|
+
],
|
|
147
|
+
[
|
|
148
|
+
join(this.project, CONSUMER_EXAMPLE_PATH),
|
|
149
|
+
await planManagedFile(join(this.project, CONSUMER_EXAMPLE_PATH), exampleContent, stringValue(previous.example_sha256), this.force),
|
|
150
|
+
],
|
|
151
|
+
[
|
|
152
|
+
join(this.project, "AGENTS.md"),
|
|
153
|
+
await planManagedBlock(join(this.project, "AGENTS.md"), agentsBlock, stringValue(previous.agents_sha256), this.force),
|
|
154
|
+
],
|
|
155
|
+
[
|
|
156
|
+
join(this.project, "CLAUDE.md"),
|
|
157
|
+
await planManagedBlock(join(this.project, "CLAUDE.md"), claudeBlock, stringValue(previous.claude_sha256), this.force),
|
|
158
|
+
],
|
|
159
|
+
];
|
|
160
|
+
for (const name of FRAMEWORK_TEMPLATE_NAMES) {
|
|
161
|
+
const target = join(this.project, CONSUMER_TEMPLATE_DIRECTORY, name);
|
|
162
|
+
const recorded = stringValue(previousTemplates[name]) ??
|
|
163
|
+
(name === "Spec.md" ? stringValue(previous.template_sha256) : undefined);
|
|
164
|
+
plans.push([
|
|
165
|
+
target,
|
|
166
|
+
await planManagedFile(target, templates[name], recorded, this.force),
|
|
167
|
+
]);
|
|
168
|
+
}
|
|
169
|
+
const changed = [];
|
|
170
|
+
for (const [target, content] of plans) {
|
|
171
|
+
if (content === undefined)
|
|
172
|
+
continue;
|
|
173
|
+
await writeTextAtomic(target, content);
|
|
174
|
+
changed.push(target);
|
|
175
|
+
}
|
|
176
|
+
await mkdir(join(this.project, CONSUMER_CUSTOM_TEMPLATE_DIRECTORY), {
|
|
177
|
+
recursive: true,
|
|
178
|
+
});
|
|
179
|
+
const frameworkRecord = {
|
|
180
|
+
source: "base",
|
|
181
|
+
spec_sha256: contentDigest(specContent),
|
|
182
|
+
template_sha256: contentDigest(templates["Spec.md"]),
|
|
183
|
+
templates_sha256: Object.fromEntries(FRAMEWORK_TEMPLATE_NAMES.map((name) => [
|
|
184
|
+
name,
|
|
185
|
+
contentDigest(templates[name]),
|
|
186
|
+
])),
|
|
187
|
+
example_sha256: contentDigest(exampleContent),
|
|
188
|
+
agents_sha256: contentDigest(agentsBlock),
|
|
189
|
+
claude_sha256: contentDigest(claudeBlock),
|
|
190
|
+
};
|
|
191
|
+
if (JSON.stringify(previous) !== JSON.stringify(frameworkRecord)) {
|
|
192
|
+
lock.framework = frameworkRecord;
|
|
193
|
+
await this.writeLock(lock);
|
|
194
|
+
}
|
|
195
|
+
return changed;
|
|
196
|
+
}
|
|
197
|
+
/** Instala especialistas do catálogo oficial. */
|
|
198
|
+
async installSpecialists(names) {
|
|
199
|
+
return this.installFromRepository(MONOREPO_REPOSITORY, names, "specialists", SPECIALISTS_DIRECTORY);
|
|
200
|
+
}
|
|
201
|
+
/** Atualiza todas as skills Specsfy já registradas. */
|
|
202
|
+
async updateAll() {
|
|
203
|
+
const installed = await installedSkillNames(this.project);
|
|
204
|
+
const base = [...FRAMEWORK_SKILLS].filter((name) => installed.has(name)).sort();
|
|
205
|
+
const specialists = [...installed]
|
|
206
|
+
.filter((name) => name.startsWith("specsfy-specialist-"))
|
|
207
|
+
.sort();
|
|
208
|
+
const changed = [];
|
|
209
|
+
if (base.length)
|
|
210
|
+
changed.push(...(await this.installBaseSelection(base)));
|
|
211
|
+
if (specialists.length) {
|
|
212
|
+
changed.push(...(await this.installSpecialists(specialists)));
|
|
213
|
+
}
|
|
214
|
+
return changed;
|
|
215
|
+
}
|
|
216
|
+
/** Clona uma origem temporária e instala as skills solicitadas. */
|
|
217
|
+
async installFromRepository(repository, names, sourceName, directory) {
|
|
218
|
+
return withRepositoryCheckout(repository, directory, (checkout) => this.installFromCheckout(checkout, names, sourceName));
|
|
219
|
+
}
|
|
220
|
+
/** Instala skills locais preservando alterações não autorizadas. */
|
|
221
|
+
async installFromCheckout(checkout, names, sourceName) {
|
|
222
|
+
const destination = join(this.project, ".agents", "skills");
|
|
223
|
+
await mkdir(destination, { recursive: true });
|
|
224
|
+
const lock = await this.readLock();
|
|
225
|
+
const operations = [];
|
|
226
|
+
for (const name of names) {
|
|
227
|
+
const source = join(checkout, name);
|
|
228
|
+
if (!(await isFile(join(source, "SKILL.md")))) {
|
|
229
|
+
throw new Error(`skill inválida ou ausente na origem: ${name}`);
|
|
230
|
+
}
|
|
231
|
+
const target = join(destination, name);
|
|
232
|
+
const digest = await skillDigest(source);
|
|
233
|
+
if (!(await pathExists(target))) {
|
|
234
|
+
operations.push({ action: "install", source, target, digest });
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
const targetDigest = await skillDigest(target);
|
|
238
|
+
if (targetDigest === digest) {
|
|
239
|
+
operations.push({ action: "current", source, target, digest });
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
const recorded = lock.skills[name]?.content_sha256;
|
|
243
|
+
if (!this.force && recorded !== targetDigest) {
|
|
244
|
+
throw new Error(`${target} possui alterações locais; preserve-as ou use --force para substituir`);
|
|
245
|
+
}
|
|
246
|
+
operations.push({ action: "replace", source, target, digest });
|
|
247
|
+
}
|
|
248
|
+
const changedNames = operations
|
|
249
|
+
.filter(({ action }) => action !== "current")
|
|
250
|
+
.map(({ target }) => basename(target));
|
|
251
|
+
if (changedNames.length) {
|
|
252
|
+
await installWithSkillsCli(checkout, changedNames, this.project);
|
|
253
|
+
}
|
|
254
|
+
const installed = [];
|
|
255
|
+
let lockChanged = false;
|
|
256
|
+
for (const operation of operations) {
|
|
257
|
+
const name = basename(operation.target);
|
|
258
|
+
const previous = lock.skills[name] ?? {};
|
|
259
|
+
if (operation.action !== "current") {
|
|
260
|
+
if (!(await pathExists(operation.target)) ||
|
|
261
|
+
(await skillDigest(operation.target)) !== operation.digest) {
|
|
262
|
+
throw new Error(`skills CLI não materializou ${name} corretamente em ${operation.target}`);
|
|
263
|
+
}
|
|
264
|
+
installed.push(operation.target);
|
|
265
|
+
}
|
|
266
|
+
if (previous.source === sourceName &&
|
|
267
|
+
previous.content_sha256 === operation.digest) {
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
const now = new Date().toISOString();
|
|
271
|
+
const record = {
|
|
272
|
+
source: sourceName,
|
|
273
|
+
installed_at: typeof previous.installed_at === "string" ? previous.installed_at : now,
|
|
274
|
+
content_sha256: operation.digest,
|
|
275
|
+
};
|
|
276
|
+
if (Object.keys(previous).length && operation.action !== "current") {
|
|
277
|
+
record.updated_at = now;
|
|
278
|
+
}
|
|
279
|
+
lock.skills[name] = record;
|
|
280
|
+
lockChanged = true;
|
|
281
|
+
}
|
|
282
|
+
if (lockChanged)
|
|
283
|
+
await this.writeLock(lock);
|
|
284
|
+
return installed;
|
|
285
|
+
}
|
|
286
|
+
/** Remove somente nomes pertencentes ao Specsfy e protege customizações. */
|
|
287
|
+
async remove(names) {
|
|
288
|
+
const lock = await this.readLock();
|
|
289
|
+
const official = await installedSkillNames(this.project);
|
|
290
|
+
const framework = new Set(FRAMEWORK_SKILLS);
|
|
291
|
+
const targets = [];
|
|
292
|
+
for (const name of names) {
|
|
293
|
+
if (!framework.has(name) &&
|
|
294
|
+
!(name in RENAMED_BASE_SKILLS) &&
|
|
295
|
+
!name.startsWith("specsfy-aux-") &&
|
|
296
|
+
name !== "specsfy-setup" &&
|
|
297
|
+
!DOCUMENTATION_SKILLS.includes(name) &&
|
|
298
|
+
!name.startsWith("specsfy-specialist-")) {
|
|
299
|
+
throw new Error(`nome de skill Specsfy inválido: ${name}`);
|
|
300
|
+
}
|
|
301
|
+
const target = join(this.project, ".agents", "skills", name);
|
|
302
|
+
if ((await pathExists(target)) && !this.force) {
|
|
303
|
+
const recorded = lock.skills[name]?.content_sha256;
|
|
304
|
+
if (recorded !== (await skillDigest(target))) {
|
|
305
|
+
throw new Error(`${target} possui alterações locais; preserve-as ou use --force para remover`);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
targets.push([name, target]);
|
|
309
|
+
}
|
|
310
|
+
const materialized = (await Promise.all(targets.map(async ([name, target]) => ({
|
|
311
|
+
name,
|
|
312
|
+
target,
|
|
313
|
+
exists: await pathExists(target),
|
|
314
|
+
}))));
|
|
315
|
+
const commandNames = materialized
|
|
316
|
+
.filter(({ name, exists }) => exists || official.has(name))
|
|
317
|
+
.map(({ name }) => name);
|
|
318
|
+
if (commandNames.length)
|
|
319
|
+
await removeWithSkillsCli(commandNames, this.project);
|
|
320
|
+
const removed = [];
|
|
321
|
+
let lockChanged = false;
|
|
322
|
+
for (const { name, target, exists } of materialized) {
|
|
323
|
+
if (exists) {
|
|
324
|
+
await rm(target, { recursive: true });
|
|
325
|
+
removed.push(target);
|
|
326
|
+
}
|
|
327
|
+
if (lock.skills[name]) {
|
|
328
|
+
delete lock.skills[name];
|
|
329
|
+
lockChanged = true;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
if (lockChanged)
|
|
333
|
+
await this.writeLock(lock);
|
|
334
|
+
return removed;
|
|
335
|
+
}
|
|
336
|
+
async validateSkillInstallation(checkout, names) {
|
|
337
|
+
const lock = await this.readLock();
|
|
338
|
+
for (const name of names) {
|
|
339
|
+
const source = join(checkout, name);
|
|
340
|
+
if (!(await isFile(join(source, "SKILL.md")))) {
|
|
341
|
+
throw new Error(`skill inválida ou ausente na origem: ${name}`);
|
|
342
|
+
}
|
|
343
|
+
const target = join(this.project, ".agents", "skills", name);
|
|
344
|
+
if (!(await pathExists(target)))
|
|
345
|
+
continue;
|
|
346
|
+
const sourceDigest = await skillDigest(source);
|
|
347
|
+
const targetDigest = await skillDigest(target);
|
|
348
|
+
if (sourceDigest === targetDigest)
|
|
349
|
+
continue;
|
|
350
|
+
if (!this.force && lock.skills[name]?.content_sha256 !== targetDigest) {
|
|
351
|
+
throw new Error(`${target} possui alterações locais; preserve-as ou use --force para substituir`);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
async legacyBaseTargets() {
|
|
356
|
+
const lock = await this.readLock();
|
|
357
|
+
const targets = [];
|
|
358
|
+
for (const name of Object.keys(RENAMED_BASE_SKILLS)) {
|
|
359
|
+
const target = join(this.project, ".agents", "skills", name);
|
|
360
|
+
if (!(await pathExists(target)))
|
|
361
|
+
continue;
|
|
362
|
+
if (!this.force &&
|
|
363
|
+
lock.skills[name]?.content_sha256 !== (await skillDigest(target))) {
|
|
364
|
+
throw new Error(`${target} foi renomeada e possui alterações locais; preserve-as ` +
|
|
365
|
+
"ou use --force para removê-la após instalar a substituta");
|
|
366
|
+
}
|
|
367
|
+
targets.push([name, target]);
|
|
368
|
+
}
|
|
369
|
+
return targets;
|
|
370
|
+
}
|
|
371
|
+
async removeLegacyBase(targets) {
|
|
372
|
+
if (!targets.length)
|
|
373
|
+
return [];
|
|
374
|
+
const lock = await this.readLock();
|
|
375
|
+
const official = await installedSkillNames(this.project);
|
|
376
|
+
const registered = targets
|
|
377
|
+
.map(([name]) => name)
|
|
378
|
+
.filter((name) => official.has(name));
|
|
379
|
+
if (registered.length)
|
|
380
|
+
await removeWithSkillsCli(registered, this.project);
|
|
381
|
+
const removed = [];
|
|
382
|
+
for (const [name, target] of targets) {
|
|
383
|
+
if (await pathExists(target)) {
|
|
384
|
+
await rm(target, { recursive: true });
|
|
385
|
+
removed.push(target);
|
|
386
|
+
}
|
|
387
|
+
delete lock.skills[name];
|
|
388
|
+
}
|
|
389
|
+
await this.writeLock(lock);
|
|
390
|
+
return removed;
|
|
391
|
+
}
|
|
392
|
+
async readLock() {
|
|
393
|
+
const path = join(this.project, ".specsfy", "skills-lock.json");
|
|
394
|
+
if (!(await isFile(path)))
|
|
395
|
+
return { schema_version: 1, skills: {} };
|
|
396
|
+
const payload = await readJson(path);
|
|
397
|
+
if (!payload || typeof payload !== "object" || Array.isArray(payload)) {
|
|
398
|
+
throw new Error(`lock inválido: ${path}`);
|
|
399
|
+
}
|
|
400
|
+
const lock = payload;
|
|
401
|
+
if (!lock.skills || typeof lock.skills !== "object" || Array.isArray(lock.skills)) {
|
|
402
|
+
lock.skills = {};
|
|
403
|
+
}
|
|
404
|
+
lock.schema_version ??= 1;
|
|
405
|
+
return lock;
|
|
406
|
+
}
|
|
407
|
+
async writeLock(payload) {
|
|
408
|
+
await writeTextAtomic(join(this.project, ".specsfy", "skills-lock.json"), `${JSON.stringify(payload, null, 2)}\n`);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
async function withRepositoryCheckout(repository, directory, action) {
|
|
412
|
+
const temporary = await mkdtemp(join(tmpdir(), "specsfy-install-"));
|
|
413
|
+
const checkout = join(temporary, "checkout");
|
|
414
|
+
try {
|
|
415
|
+
try {
|
|
416
|
+
await execFileAsync("git", [
|
|
417
|
+
"clone",
|
|
418
|
+
"--depth",
|
|
419
|
+
"1",
|
|
420
|
+
repository,
|
|
421
|
+
checkout,
|
|
422
|
+
]);
|
|
423
|
+
}
|
|
424
|
+
catch (error) {
|
|
425
|
+
const detail = error && typeof error === "object" && "stderr" in error
|
|
426
|
+
? String(error.stderr ?? "").trim()
|
|
427
|
+
: "";
|
|
428
|
+
throw new Error(detail || "falha ao baixar catálogo");
|
|
429
|
+
}
|
|
430
|
+
const source = directory ? join(checkout, directory) : checkout;
|
|
431
|
+
if (!(await pathExists(source))) {
|
|
432
|
+
throw new Error(`diretório ausente no monorepo: ${directory}`);
|
|
433
|
+
}
|
|
434
|
+
return await action(source);
|
|
435
|
+
}
|
|
436
|
+
finally {
|
|
437
|
+
await rm(temporary, { recursive: true });
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
async function extractSourceBlock(path) {
|
|
441
|
+
const block = managedBlock(await readFile(path, "utf8"), path);
|
|
442
|
+
if (block === undefined) {
|
|
443
|
+
throw new Error(`bloco ${FRAMEWORK_START} ausente no arquivo estrutural: ${path}`);
|
|
444
|
+
}
|
|
445
|
+
if (!block.includes(SPEC_PATH_TOKEN)) {
|
|
446
|
+
throw new Error(`token ${SPEC_PATH_TOKEN} ausente no bloco de ${path}`);
|
|
447
|
+
}
|
|
448
|
+
return block;
|
|
449
|
+
}
|
|
450
|
+
async function planManagedFile(path, expected, recordedDigest, force) {
|
|
451
|
+
if (!(await pathExists(path)))
|
|
452
|
+
return expected;
|
|
453
|
+
if (!(await isFile(path)))
|
|
454
|
+
throw new Error(`${path} existe e não é um arquivo`);
|
|
455
|
+
const current = await readFile(path, "utf8");
|
|
456
|
+
if (current === expected)
|
|
457
|
+
return undefined;
|
|
458
|
+
if (force || recordedDigest === contentDigest(current))
|
|
459
|
+
return expected;
|
|
460
|
+
throw new Error(`${path} possui alterações locais; preserve-as ou use --force para substituir`);
|
|
461
|
+
}
|
|
462
|
+
async function planManagedBlock(path, expected, recordedDigest, force) {
|
|
463
|
+
if ((await pathExists(path)) && !(await isFile(path))) {
|
|
464
|
+
throw new Error(`${path} existe e não é um arquivo`);
|
|
465
|
+
}
|
|
466
|
+
const content = (await isFile(path)) ? await readFile(path, "utf8") : "";
|
|
467
|
+
const current = managedBlock(content, path);
|
|
468
|
+
if (current === undefined)
|
|
469
|
+
return appendBlock(content, expected);
|
|
470
|
+
if (current === expected)
|
|
471
|
+
return undefined;
|
|
472
|
+
if (!force && recordedDigest !== contentDigest(current)) {
|
|
473
|
+
throw new Error(`${path} possui alterações locais no bloco Specsfy; ` +
|
|
474
|
+
"preserve-as ou use --force para substituir somente o bloco");
|
|
475
|
+
}
|
|
476
|
+
const start = content.indexOf(FRAMEWORK_START);
|
|
477
|
+
const end = content.indexOf(FRAMEWORK_END, start) + FRAMEWORK_END.length;
|
|
478
|
+
return content.slice(0, start) + expected + content.slice(end);
|
|
479
|
+
}
|
|
480
|
+
function managedBlock(content, path) {
|
|
481
|
+
const starts = content.split(FRAMEWORK_START).length - 1;
|
|
482
|
+
const ends = content.split(FRAMEWORK_END).length - 1;
|
|
483
|
+
if (!starts && !ends)
|
|
484
|
+
return undefined;
|
|
485
|
+
if (starts !== 1 || ends !== 1) {
|
|
486
|
+
throw new Error(`bloco Specsfy malformado em ${path}`);
|
|
487
|
+
}
|
|
488
|
+
const start = content.indexOf(FRAMEWORK_START);
|
|
489
|
+
const end = content.indexOf(FRAMEWORK_END, start) + FRAMEWORK_END.length;
|
|
490
|
+
return content.slice(start, end);
|
|
491
|
+
}
|
|
492
|
+
function appendBlock(content, block) {
|
|
493
|
+
if (!content)
|
|
494
|
+
return `${block}\n`;
|
|
495
|
+
const separator = content.endsWith("\n\n") ? "" : content.endsWith("\n") ? "\n" : "\n\n";
|
|
496
|
+
return `${content}${separator}${block}\n`;
|
|
497
|
+
}
|
|
498
|
+
function contentDigest(content) {
|
|
499
|
+
return createHash("sha256").update(content).digest("hex");
|
|
500
|
+
}
|
|
501
|
+
async function skillsCommand() {
|
|
502
|
+
const override = process.env.SPECSFY_SKILLS_CLI;
|
|
503
|
+
if (override) {
|
|
504
|
+
const executable = resolvePath(override);
|
|
505
|
+
try {
|
|
506
|
+
await access(executable, 1);
|
|
507
|
+
}
|
|
508
|
+
catch {
|
|
509
|
+
throw new Error(`SPECSFY_SKILLS_CLI não é executável: ${executable}`);
|
|
510
|
+
}
|
|
511
|
+
return [executable];
|
|
512
|
+
}
|
|
513
|
+
if (await executableExists("skills"))
|
|
514
|
+
return ["skills"];
|
|
515
|
+
if (await executableExists("npx"))
|
|
516
|
+
return ["npx", "--yes", "skills"];
|
|
517
|
+
throw new Error("skills CLI não encontrado; instale https://github.com/vercel-labs/skills " +
|
|
518
|
+
"ou disponibilize npx no PATH");
|
|
519
|
+
}
|
|
520
|
+
async function installWithSkillsCli(source, names, project) {
|
|
521
|
+
const command = await skillsCommand();
|
|
522
|
+
const arguments_ = [...command.slice(1), "add", resolve(source)];
|
|
523
|
+
for (const name of names)
|
|
524
|
+
arguments_.push("--skill", name);
|
|
525
|
+
arguments_.push("--agent", "universal", "--copy", "-y", "--full-depth");
|
|
526
|
+
await runSkillsCommand(command[0], arguments_, project, "instalar", names);
|
|
527
|
+
}
|
|
528
|
+
async function removeWithSkillsCli(names, project) {
|
|
529
|
+
const command = await skillsCommand();
|
|
530
|
+
await runSkillsCommand(command[0], [...command.slice(1), "remove", ...names, "--agent", "universal", "-y"], project, "remover", names);
|
|
531
|
+
}
|
|
532
|
+
async function runSkillsCommand(executable, arguments_, project, action, names) {
|
|
533
|
+
try {
|
|
534
|
+
await execFileAsync(executable, arguments_, {
|
|
535
|
+
cwd: project,
|
|
536
|
+
encoding: "utf8",
|
|
537
|
+
});
|
|
538
|
+
}
|
|
539
|
+
catch (error) {
|
|
540
|
+
const value = error;
|
|
541
|
+
const detail = String(value.stderr ?? value.stdout ?? "").trim();
|
|
542
|
+
throw new Error(`skills CLI falhou ao ${action} ${names.join(", ")}: ` +
|
|
543
|
+
(detail || `exit ${String(value.code ?? 1)}`));
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
async function executableExists(command) {
|
|
547
|
+
const directories = (process.env.PATH ?? "").split(sep);
|
|
548
|
+
const extensions = process.platform === "win32"
|
|
549
|
+
? ["", ...(process.env.PATHEXT ?? ".EXE;.CMD;.BAT").split(";")]
|
|
550
|
+
: [""];
|
|
551
|
+
for (const directory of directories) {
|
|
552
|
+
if (!directory)
|
|
553
|
+
continue;
|
|
554
|
+
for (const extension of extensions) {
|
|
555
|
+
try {
|
|
556
|
+
await access(join(directory, `${command}${extension}`), 1);
|
|
557
|
+
return true;
|
|
558
|
+
}
|
|
559
|
+
catch {
|
|
560
|
+
continue;
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
return false;
|
|
565
|
+
}
|
|
566
|
+
/** Calcula o fingerprint estável de uma skill, ignorando caches gerados. */
|
|
567
|
+
export async function skillDigest(path) {
|
|
568
|
+
const digest = createHash("sha256");
|
|
569
|
+
for (const entry of await walkEntries(path)) {
|
|
570
|
+
const relativePath = relative(path, entry).split(sep).join("/");
|
|
571
|
+
if (isGenerated(relativePath))
|
|
572
|
+
continue;
|
|
573
|
+
digest.update(relativePath);
|
|
574
|
+
digest.update("\0");
|
|
575
|
+
const metadata = await lstat(entry);
|
|
576
|
+
if (metadata.isSymbolicLink()) {
|
|
577
|
+
digest.update("link:");
|
|
578
|
+
digest.update((await readlink(entry)).split(sep).join("/"));
|
|
579
|
+
}
|
|
580
|
+
else if (metadata.isFile()) {
|
|
581
|
+
digest.update((metadata.mode & 0o777).toString(8));
|
|
582
|
+
digest.update(":");
|
|
583
|
+
digest.update(await readFile(entry));
|
|
584
|
+
}
|
|
585
|
+
else {
|
|
586
|
+
digest.update("dir");
|
|
587
|
+
}
|
|
588
|
+
digest.update("\0");
|
|
589
|
+
}
|
|
590
|
+
return digest.digest("hex");
|
|
591
|
+
}
|
|
592
|
+
async function walkEntries(root) {
|
|
593
|
+
const output = [];
|
|
594
|
+
for (const entry of await readdir(root, { withFileTypes: true })) {
|
|
595
|
+
const path = join(root, entry.name);
|
|
596
|
+
output.push(path);
|
|
597
|
+
if (entry.isDirectory())
|
|
598
|
+
output.push(...(await walkEntries(path)));
|
|
599
|
+
}
|
|
600
|
+
return output.sort();
|
|
601
|
+
}
|
|
602
|
+
function isGenerated(path) {
|
|
603
|
+
const parts = path.split("/");
|
|
604
|
+
const name = parts.at(-1) ?? "";
|
|
605
|
+
return (parts.includes("__pycache__") ||
|
|
606
|
+
name === ".DS_Store" ||
|
|
607
|
+
name.endsWith(".pyc") ||
|
|
608
|
+
name.endsWith(".pyo"));
|
|
609
|
+
}
|
|
610
|
+
function stringValue(value) {
|
|
611
|
+
return typeof value === "string" ? value : undefined;
|
|
612
|
+
}
|
|
613
|
+
//# sourceMappingURL=installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../src/installer.ts"],"names":[],"mappings":"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"}
|
package/dist/main.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|