@numa-tech/numa 1.14.43 → 1.14.44
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 +27 -2
- package/dist/ai-registry/bootstrap.js +17 -1
- package/dist/ai-registry/bootstrap.js.map +1 -1
- package/dist/ai-registry/commands.js +91 -9
- package/dist/ai-registry/commands.js.map +1 -1
- package/dist/ai-registry/skill-dependencies.d.ts +45 -0
- package/dist/ai-registry/skill-dependencies.js +161 -0
- package/dist/ai-registry/skill-dependencies.js.map +1 -0
- package/dist/ai-registry/skill-installer.d.ts +22 -0
- package/dist/ai-registry/skill-installer.js +114 -6
- package/dist/ai-registry/skill-installer.js.map +1 -1
- package/dist/ai-registry/skill-uninstaller.d.ts +35 -0
- package/dist/ai-registry/skill-uninstaller.js +131 -0
- package/dist/ai-registry/skill-uninstaller.js.map +1 -0
- package/dist/ai-registry/sync.js +75 -4
- package/dist/ai-registry/sync.js.map +1 -1
- package/dist/ai-registry/uninstall-command.d.ts +2 -0
- package/dist/ai-registry/uninstall-command.js +48 -0
- package/dist/ai-registry/uninstall-command.js.map +1 -0
- package/dist/ai-registry/update-commands.d.ts +2 -0
- package/dist/ai-registry/update-commands.js +39 -0
- package/dist/ai-registry/update-commands.js.map +1 -0
- package/dist/ai-registry/update-prompt.d.ts +8 -0
- package/dist/ai-registry/update-prompt.js +32 -0
- package/dist/ai-registry/update-prompt.js.map +1 -0
- package/dist/ai-registry/updates.d.ts +132 -0
- package/dist/ai-registry/updates.js +252 -0
- package/dist/ai-registry/updates.js.map +1 -0
- package/dist/cli.js +28 -8
- package/dist/cli.js.map +1 -1
- package/dist/codex-module.d.ts +5 -1
- package/dist/codex-module.js +21 -11
- package/dist/codex-module.js.map +1 -1
- package/dist/command-catalog.js +23 -0
- package/dist/command-catalog.js.map +1 -1
- package/dist/maintenance/commands.d.ts +3 -0
- package/dist/maintenance/commands.js +15 -0
- package/dist/maintenance/commands.js.map +1 -0
- package/dist/maintenance/identity.d.ts +3 -0
- package/dist/maintenance/identity.js +24 -0
- package/dist/maintenance/identity.js.map +1 -0
- package/dist/maintenance/modules.d.ts +8 -0
- package/dist/maintenance/modules.js +45 -0
- package/dist/maintenance/modules.js.map +1 -0
- package/dist/maintenance/scheduler.d.ts +54 -0
- package/dist/maintenance/scheduler.js +100 -0
- package/dist/maintenance/scheduler.js.map +1 -0
- package/dist/maintenance/storage.d.ts +4 -0
- package/dist/maintenance/storage.js +32 -0
- package/dist/maintenance/storage.js.map +1 -0
- package/docs/module-maintenance-and-skills-updates.md +190 -0
- package/examples/platform-profile-skill-bootstrap.json +2 -2
- package/package.json +5 -4
- package/skills/numa-ai-registry/SKILL.md +2 -2
- package/skills/numa-ai-registry/evals/evals.json +2 -2
- package/skills/numa-ai-registry/references/command-contract.md +1 -1
- package/skills/numa-cli/SKILL.md +45 -29
- package/skills/numa-cli/agents/openai.yaml +2 -2
- package/skills/numa-cli/evals/evals.json +72 -0
- package/skills/numa-cli/numa-skill.json +6 -0
- package/skills/numa-cli/references/cli-bootstrap.md +36 -0
- package/skills/{numa-skills/references/command-contract.md → numa-cli/references/skills-command-contract.md} +1 -1
- package/skills/numa-cli/references/skills-updates.md +31 -0
- package/skills/{numa-skills/SKILL.md → numa-cli/references/skills-workflows.md} +6 -9
- package/skills/numa-create-application/SKILL.md +6 -0
- package/skills/numa-create-application/numa-skill.json +11 -0
- package/skills/numa-create-application/references/cli-bootstrap.md +11 -0
- package/skills/numa-jenkins-deployment/SKILL.md +6 -0
- package/skills/numa-jenkins-deployment/numa-skill.json +11 -0
- package/skills/numa-jenkins-deployment/references/cli-bootstrap.md +11 -0
- package/skills/numa-local-flux-deploy/SKILL.md +6 -0
- package/skills/numa-local-flux-deploy/numa-skill.json +11 -0
- package/skills/numa-local-flux-deploy/references/cli-bootstrap.md +11 -0
- package/skills/numa-nacos/SKILL.md +10 -4
- package/skills/numa-nacos/evals/evals.json +2 -2
- package/skills/numa-nacos/numa-skill.json +11 -0
- package/skills/numa-nacos/references/cli-bootstrap.md +11 -0
- package/skills/numa-nacos/references/command-contract.md +1 -1
- package/skills/numa-notion/SKILL.md +54 -0
- package/skills/numa-notion/agents/openai.yaml +4 -0
- package/skills/numa-notion/evals/evals.json +7 -0
- package/skills/numa-notion/numa-skill.json +11 -0
- package/skills/numa-notion/references/agents-automation.md +54 -0
- package/skills/numa-notion/references/cli-bootstrap.md +11 -0
- package/skills/numa-notion/references/cli.md +82 -0
- package/skills/numa-oss-access/SKILL.md +7 -1
- package/skills/numa-oss-access/numa-skill.json +11 -0
- package/skills/numa-oss-access/references/cli-bootstrap.md +11 -0
- package/skills/numa-wecom/SKILL.md +82 -0
- package/skills/numa-wecom/agents/openai.yaml +4 -0
- package/skills/numa-wecom/numa-skill.json +11 -0
- package/skills/numa-wecom/references/cli-bootstrap.md +11 -0
- package/skills/numa-wecom/references/machine-auth.md +36 -0
- package/skills/numa-skills/agents/openai.yaml +0 -4
- package/skills/numa-skills/evals/evals.json +0 -38
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { lstat, readFile, realpath } from "node:fs/promises";
|
|
3
|
+
import { basename, dirname, join, resolve } from "node:path";
|
|
4
|
+
import { createInterface } from "node:readline/promises";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { AiRegistryError } from "./errors.js";
|
|
7
|
+
import { readSkillBundleMetadata, skillDirectoryDigest, skillTargetRoot } from "./skill-installer.js";
|
|
8
|
+
import { readSkillUpdates } from "./updates.js";
|
|
9
|
+
const name = z.string().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/).max(64);
|
|
10
|
+
const version = z.string().regex(/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/);
|
|
11
|
+
export const SkillDependencySchema = z.object({ name, version }).strict();
|
|
12
|
+
export const SkillBundleSchema = z.object({ schemaVersion: z.literal(1), name, version,
|
|
13
|
+
dependencies: z.array(SkillDependencySchema).max(16).default([]) }).strict();
|
|
14
|
+
export async function readSkillBundle(bytes, expected) {
|
|
15
|
+
const raw = await readSkillBundleMetadata(bytes);
|
|
16
|
+
if (raw === undefined)
|
|
17
|
+
return undefined;
|
|
18
|
+
const parsed = SkillBundleSchema.safeParse(raw);
|
|
19
|
+
if (!parsed.success)
|
|
20
|
+
throw new AiRegistryError("Invalid numa-skill.json; use schemaVersion 1 and exact stable versions from the same source.", "skills_dependency_manifest_invalid");
|
|
21
|
+
const bundle = parsed.data;
|
|
22
|
+
if (expected && (bundle.name !== expected.name || bundle.version !== expected.version))
|
|
23
|
+
throw new AiRegistryError("Skill dependency manifest identity does not match its archive selection.", "skills_dependency_identity_mismatch");
|
|
24
|
+
if (new Set(bundle.dependencies.map(d => d.name)).size !== bundle.dependencies.length)
|
|
25
|
+
throw new AiRegistryError("Duplicate Skill dependencies.", "skills_dependency_manifest_invalid");
|
|
26
|
+
return bundle;
|
|
27
|
+
}
|
|
28
|
+
/** Bounded dependency-first closure. Dependencies never choose another namespace or an URL. */
|
|
29
|
+
export async function resolveSkillDependencies(client, namespaceId, root) {
|
|
30
|
+
const result = [], selected = new Map(), active = new Set(), done = new Set();
|
|
31
|
+
let totalBytes = 0;
|
|
32
|
+
async function visit(target, supplied, depth = 0) {
|
|
33
|
+
if (depth > 8 || selected.size >= 32 && !selected.has(target.name))
|
|
34
|
+
throw new AiRegistryError("Skill dependency graph exceeds limits (32 packages / depth 8).", "skills_dependency_limit");
|
|
35
|
+
if (active.has(target.name))
|
|
36
|
+
throw new AiRegistryError(`Cyclic Skill dependency: ${target.name}.`, "skills_dependency_cycle");
|
|
37
|
+
const previous = selected.get(target.name);
|
|
38
|
+
if (previous && previous !== target.version)
|
|
39
|
+
throw new AiRegistryError(`Conflicting versions for ${target.name}: ${previous} / ${target.version}.`, "skills_dependency_version_conflict");
|
|
40
|
+
if (done.has(target.name))
|
|
41
|
+
return;
|
|
42
|
+
selected.set(target.name, target.version);
|
|
43
|
+
active.add(target.name);
|
|
44
|
+
if (!supplied) {
|
|
45
|
+
const detail = await client.getSkill(namespaceId, target.name);
|
|
46
|
+
if (detail.name !== target.name || detail.enable === false || !Array.isArray(detail.versions)
|
|
47
|
+
|| !detail.versions.some(v => v && typeof v === "object" && v.version === target.version && v.status === "online")) {
|
|
48
|
+
throw new AiRegistryError(`Dependency ${target.name}@${target.version} is not published in the selected source.`, "skills_dependency_unpublished");
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const download = supplied?.download ?? await client.downloadSkill(namespaceId, target.name, { version: target.version });
|
|
52
|
+
if (createHash("sha256").update(download.bytes).digest("hex") !== download.sha256 || download.version && download.version !== target.version)
|
|
53
|
+
throw new AiRegistryError("Skill dependency download failed version/checksum verification.", "skills_dependency_integrity_failed");
|
|
54
|
+
totalBytes += download.bytes.length;
|
|
55
|
+
if (totalBytes > 100 * 1024 * 1024)
|
|
56
|
+
throw new AiRegistryError("Skill dependency downloads exceed 100 MiB.", "skills_dependency_limit");
|
|
57
|
+
const bundle = await readSkillBundle(download.bytes, target);
|
|
58
|
+
const dependencies = bundle?.dependencies ?? [];
|
|
59
|
+
for (const dep of dependencies)
|
|
60
|
+
await visit(dep, undefined, depth + 1);
|
|
61
|
+
active.delete(target.name);
|
|
62
|
+
done.add(target.name);
|
|
63
|
+
result.push({ ...target, download, dependencies });
|
|
64
|
+
}
|
|
65
|
+
await visit(root, root);
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
async function canonicalPath(path) {
|
|
69
|
+
const absolute = resolve(path);
|
|
70
|
+
try {
|
|
71
|
+
return await realpath(absolute);
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
if (e.code !== "ENOENT" || dirname(absolute) === absolute)
|
|
75
|
+
throw e;
|
|
76
|
+
return join(await canonicalPath(dirname(absolute)), basename(absolute));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/** Existing dependency reuse requires recorded source/version/hash AND an unchanged installed tree. */
|
|
80
|
+
export async function reusableDependency(node, options, source, directory) {
|
|
81
|
+
const path = join(await canonicalPath(skillTargetRoot(options)), node.name);
|
|
82
|
+
const info = await lstat(path).catch((e) => { if (e.code === "ENOENT")
|
|
83
|
+
return undefined; throw e; });
|
|
84
|
+
if (!info)
|
|
85
|
+
return false;
|
|
86
|
+
const record = (await readSkillUpdates(directory)).installations.find(r => resolve(r.path) === path);
|
|
87
|
+
if (!record || record.version !== node.version || record.namespace !== source.namespace || record.instance !== source.instance
|
|
88
|
+
|| record.namespaceId !== source.namespaceId || record.instanceId !== source.instanceId || record.archiveSha256 !== node.download.sha256
|
|
89
|
+
|| info.isSymbolicLink() || !info.isDirectory() || await skillDirectoryDigest(path) !== record.contentDigest) {
|
|
90
|
+
throw new AiRegistryError(`Existing dependency ${node.name} has an unverified source/version or local changes; inspect it before a separate explicit update.`, "skills_dependency_local_conflict");
|
|
91
|
+
}
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
/** A single-package updater must not introduce or change a dependency graph silently. */
|
|
95
|
+
export async function assertUnchangedDependencies(next, installedPath) {
|
|
96
|
+
const upcoming = await readSkillBundle(next);
|
|
97
|
+
const previous = await readFile(join(installedPath, "numa-skill.json"), "utf8")
|
|
98
|
+
.then(text => SkillBundleSchema.parse(JSON.parse(text)))
|
|
99
|
+
.catch((e) => { if (e.code === "ENOENT")
|
|
100
|
+
return undefined; throw e; });
|
|
101
|
+
const canonical = (deps = []) => JSON.stringify([...deps].sort((a, b) => a.name.localeCompare(b.name)));
|
|
102
|
+
if (canonical(upcoming?.dependencies) !== canonical(previous?.dependencies))
|
|
103
|
+
throw new AiRegistryError("Dependency changes need an explicit install plan and confirmation.", "skills_dependency_confirmation_required");
|
|
104
|
+
}
|
|
105
|
+
export async function assertInstalledDependencies(bytes, installedPath, source, directory) {
|
|
106
|
+
const bundle = await readSkillBundle(bytes);
|
|
107
|
+
const state = await readSkillUpdates(directory);
|
|
108
|
+
for (const dep of bundle?.dependencies ?? []) {
|
|
109
|
+
const path = join(await canonicalPath(dirname(installedPath)), dep.name);
|
|
110
|
+
const r = state.installations.find(item => resolve(item.path) === path);
|
|
111
|
+
if (!r || r.version !== dep.version || r.namespace !== source.namespace || r.instance !== source.instance
|
|
112
|
+
|| r.namespaceId !== source.namespaceId || r.instanceId !== source.instanceId
|
|
113
|
+
|| await skillDirectoryDigest(path) !== r.contentDigest) {
|
|
114
|
+
throw new AiRegistryError(`Dependency ${dep.name}@${dep.version} is missing or changed; run an explicit install plan.`, "skills_dependency_local_conflict");
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
export async function assertConsumersCompatible(name, nextVersion, installedPath, directory) {
|
|
119
|
+
for (const r of (await readSkillUpdates(directory)).installations) {
|
|
120
|
+
if (r.name === name || await canonicalPath(dirname(r.path)) !== await canonicalPath(dirname(installedPath)))
|
|
121
|
+
continue;
|
|
122
|
+
const info = await lstat(r.path).catch((e) => { if (e.code === "ENOENT")
|
|
123
|
+
return undefined; throw e; });
|
|
124
|
+
if (!info)
|
|
125
|
+
continue;
|
|
126
|
+
if (info.isSymbolicLink() || !info.isDirectory())
|
|
127
|
+
throw new AiRegistryError("Consumer installation is not a regular directory.", "skills_dependency_local_conflict");
|
|
128
|
+
const raw = await readFile(join(r.path, "numa-skill.json"), "utf8").catch((e) => {
|
|
129
|
+
if (e.code === "ENOENT")
|
|
130
|
+
return undefined;
|
|
131
|
+
throw e;
|
|
132
|
+
});
|
|
133
|
+
if (!raw)
|
|
134
|
+
continue;
|
|
135
|
+
const bundle = SkillBundleSchema.parse(JSON.parse(raw));
|
|
136
|
+
const dep = bundle.dependencies.find(d => d.name === name);
|
|
137
|
+
if (dep && dep.version !== nextVersion)
|
|
138
|
+
throw new AiRegistryError(`Installed ${r.name} requires ${name}@${dep.version}; updating it independently would break that dependency.`, "skills_dependency_version_conflict");
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
export async function confirmSkillDependencies(plan, options, ask) {
|
|
142
|
+
if (options.confirmed)
|
|
143
|
+
return;
|
|
144
|
+
if (!options.json && ask) {
|
|
145
|
+
if (await ask())
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
else if (!options.json && process.stdin.isTTY && process.stderr.isTTY) {
|
|
149
|
+
process.stderr.write(`${JSON.stringify(plan, null, 2)}\n`);
|
|
150
|
+
const prompt = createInterface({ input: process.stdin, output: process.stderr });
|
|
151
|
+
try {
|
|
152
|
+
if (/^(y|yes)$/i.test((await prompt.question("是否现在安装上述 Skill 及其依赖?[y/N] ")).trim()))
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
finally {
|
|
156
|
+
prompt.close();
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
throw new AiRegistryError("Dependency installation requires confirmation; inspect --plan, then rerun with --with-dependencies only after approval.", "skills_dependency_confirmation_required", undefined, undefined, { plan });
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=skill-dependencies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-dependencies.js","sourceRoot":"","sources":["../../src/ai-registry/skill-dependencies.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,19 @@
|
|
|
1
1
|
export type SkillAgentTarget = "chatgpt" | "codex" | "claude" | "cursor" | "workbuddy" | "openclaw" | "agents" | "custom";
|
|
2
2
|
export type InstallScope = "project" | "user";
|
|
3
3
|
export interface SkillInstallOptions {
|
|
4
|
+
/** Set only by a caller which resolved and verified the dependency closure. */
|
|
5
|
+
dependencyPlanVerified?: boolean;
|
|
4
6
|
agent: SkillAgentTarget;
|
|
5
7
|
scope: InstallScope;
|
|
6
8
|
skillName: string;
|
|
7
9
|
workspace?: string;
|
|
8
10
|
customRoot?: string;
|
|
9
11
|
force?: boolean;
|
|
12
|
+
/** Automatic maintenance may replace only this exact unmodified installation. */
|
|
13
|
+
expectedInstalledDigest?: string;
|
|
14
|
+
expectedInstalledPath?: string;
|
|
15
|
+
/** Keep automatic-update backups outside the live Skills discovery directory. */
|
|
16
|
+
maintenanceBackup?: boolean;
|
|
10
17
|
}
|
|
11
18
|
export interface SkillInstallResult {
|
|
12
19
|
agent: SkillAgentTarget;
|
|
@@ -16,7 +23,22 @@ export interface SkillInstallResult {
|
|
|
16
23
|
backupPath?: string;
|
|
17
24
|
files: number;
|
|
18
25
|
expandedBytes: number;
|
|
26
|
+
/** Digest of the verified staging tree, before it becomes editable by the user. */
|
|
27
|
+
contentDigest?: string;
|
|
28
|
+
}
|
|
29
|
+
interface InspectedArchive {
|
|
30
|
+
root: string;
|
|
31
|
+
entries: number;
|
|
32
|
+
files: number;
|
|
33
|
+
expandedBytes: number;
|
|
19
34
|
}
|
|
20
35
|
export declare function skillTargetRoot(options: Pick<SkillInstallOptions, "agent" | "scope" | "workspace" | "customRoot">): string;
|
|
21
36
|
export declare function installSkillArchive(archive: Buffer, options: SkillInstallOptions): Promise<SkillInstallResult>;
|
|
37
|
+
/** Exact content + executable-bit fingerprint. Refuse links and unexpected files. */
|
|
38
|
+
export declare function skillDirectoryDigest(root: string): Promise<string>;
|
|
39
|
+
export declare function safeSkillName(value: string): string;
|
|
40
|
+
export declare function inspectArchive(buffer: Buffer): Promise<InspectedArchive>;
|
|
41
|
+
/** Read bounded declarative metadata only; never extract or execute an archive. */
|
|
42
|
+
export declare function readSkillBundleMetadata(buffer: Buffer): Promise<unknown | undefined>;
|
|
22
43
|
export declare function validateSkillAdapterPath(base: string, candidate: string, scope: InstallScope): Promise<void>;
|
|
44
|
+
export {};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { randomBytes } from "node:crypto";
|
|
1
|
+
import { randomBytes, createHash } from "node:crypto";
|
|
2
|
+
import { withTokenFileLock } from "@numa-tech/cli-auth";
|
|
2
3
|
import { createWriteStream } from "node:fs";
|
|
3
|
-
import { lstat, mkdir, realpath, rename, rm } from "node:fs/promises";
|
|
4
|
+
import { lstat, mkdir, realpath, readdir, readFile, rename, rm } from "node:fs/promises";
|
|
4
5
|
import { homedir } from "node:os";
|
|
5
6
|
import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
6
7
|
import { pipeline } from "node:stream/promises";
|
|
@@ -32,6 +33,18 @@ export function skillTargetRoot(options) {
|
|
|
32
33
|
return join(base, root);
|
|
33
34
|
}
|
|
34
35
|
export async function installSkillArchive(archive, options) {
|
|
36
|
+
const root = skillTargetRoot(options);
|
|
37
|
+
const skillName = safeSkillName(options.skillName);
|
|
38
|
+
if (options.agent !== "custom")
|
|
39
|
+
await validateSkillAdapterPath(options.scope === "user" ? homedir() : resolve(options.workspace ?? process.cwd()), root, options.scope);
|
|
40
|
+
// Shared by explicit installs, sync, bootstrap and maintenance.
|
|
41
|
+
return withTokenFileLock(join(root, `.numa-install-${skillName}`), () => installSkillArchiveLocked(archive, options), { timeoutMilliseconds: 1_000 });
|
|
42
|
+
}
|
|
43
|
+
async function installSkillArchiveLocked(archive, options) {
|
|
44
|
+
const bundle = await (await import("./skill-dependencies.js")).readSkillBundle(archive);
|
|
45
|
+
if (bundle?.dependencies.length && !options.dependencyPlanVerified) {
|
|
46
|
+
throw new AiRegistryError("This Skill requires a verified dependency plan; use skills install --plan first.", "skills_dependency_confirmation_required");
|
|
47
|
+
}
|
|
35
48
|
if (archive.length < 4 || archive.length > MAX_ARCHIVE_BYTES) {
|
|
36
49
|
throw new AiRegistryError("Skill ZIP is empty or exceeds 50 MiB.", "ai_registry_skill_zip_invalid");
|
|
37
50
|
}
|
|
@@ -48,6 +61,9 @@ export async function installSkillArchive(archive, options) {
|
|
|
48
61
|
if (adapterBase)
|
|
49
62
|
assertInside(await realpath(adapterBase), targetRoot);
|
|
50
63
|
const destination = join(targetRoot, skillName);
|
|
64
|
+
if (options.expectedInstalledPath && destination !== options.expectedInstalledPath) {
|
|
65
|
+
throw new AiRegistryError("Skill target moved; automatic update stopped.", "skills_update_path_changed");
|
|
66
|
+
}
|
|
51
67
|
assertInside(targetRoot, destination);
|
|
52
68
|
const existing = await lstat(destination).catch((error) => {
|
|
53
69
|
if (error.code === "ENOENT")
|
|
@@ -61,13 +77,26 @@ export async function installSkillArchive(archive, options) {
|
|
|
61
77
|
throw new AiRegistryError(`Skill already exists at ${destination}; pass --force to replace it with a recoverable backup.`, "ai_registry_install_exists");
|
|
62
78
|
}
|
|
63
79
|
const stage = join(targetRoot, `.numa-stage-${skillName}-${randomBytes(6).toString("hex")}`);
|
|
80
|
+
let backupRoot = targetRoot;
|
|
81
|
+
if (existing && options.maintenanceBackup) {
|
|
82
|
+
backupRoot = join(dirname(targetRoot), ".numa-skill-backups");
|
|
83
|
+
await mkdir(backupRoot, { recursive: true, mode: 0o700 });
|
|
84
|
+
if ((await lstat(backupRoot)).isSymbolicLink()) {
|
|
85
|
+
throw new AiRegistryError("Backup directory must not be a link.", "skills_update_backup_invalid");
|
|
86
|
+
}
|
|
87
|
+
}
|
|
64
88
|
const backup = existing
|
|
65
|
-
? join(
|
|
89
|
+
? join(backupRoot, `${skillName}.numa-backup-${new Date().toISOString().replace(/[:.]/gu, "-")}-${randomBytes(4).toString("hex")}`)
|
|
66
90
|
: undefined;
|
|
67
91
|
await mkdir(stage, { mode: 0o700 });
|
|
68
92
|
let movedExisting = false;
|
|
93
|
+
let contentDigest;
|
|
69
94
|
try {
|
|
70
95
|
await extractArchive(archive, inspected.root, stage);
|
|
96
|
+
contentDigest = await skillDirectoryDigest(stage);
|
|
97
|
+
if (options.expectedInstalledDigest && await skillDirectoryDigest(destination) !== options.expectedInstalledDigest) {
|
|
98
|
+
throw new AiRegistryError("Local Skill was modified; automatic update stopped.", "skills_update_local_conflict");
|
|
99
|
+
}
|
|
71
100
|
if (backup) {
|
|
72
101
|
await rename(destination, backup);
|
|
73
102
|
movedExisting = true;
|
|
@@ -91,10 +120,41 @@ export async function installSkillArchive(archive, options) {
|
|
|
91
120
|
installedPath: destination,
|
|
92
121
|
...(backup ? { backupPath: backup } : {}),
|
|
93
122
|
files: inspected.files,
|
|
94
|
-
expandedBytes: inspected.expandedBytes
|
|
123
|
+
expandedBytes: inspected.expandedBytes,
|
|
124
|
+
contentDigest
|
|
95
125
|
};
|
|
96
126
|
}
|
|
97
|
-
|
|
127
|
+
/** Exact content + executable-bit fingerprint. Refuse links and unexpected files. */
|
|
128
|
+
export async function skillDirectoryDigest(root) {
|
|
129
|
+
const hash = createHash("sha256");
|
|
130
|
+
let bytes = 0;
|
|
131
|
+
let count = 0;
|
|
132
|
+
async function walk(directory, prefix) {
|
|
133
|
+
const info = await lstat(directory);
|
|
134
|
+
if (info.isSymbolicLink() || !info.isDirectory())
|
|
135
|
+
throw new Error("Skill tree is not a regular directory.");
|
|
136
|
+
for (const name of (await readdir(directory)).sort()) {
|
|
137
|
+
const path = join(directory, name);
|
|
138
|
+
const stat = await lstat(path);
|
|
139
|
+
const key = `${prefix}${name}`;
|
|
140
|
+
if (++count > MAX_ENTRIES || stat.isSymbolicLink())
|
|
141
|
+
throw new Error("Skill tree contains unsupported entries.");
|
|
142
|
+
if (stat.isDirectory()) {
|
|
143
|
+
hash.update(JSON.stringify([key, "directory"]));
|
|
144
|
+
await walk(path, `${key}/`);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
if (!stat.isFile() || (bytes += stat.size) > MAX_EXPANDED_BYTES)
|
|
148
|
+
throw new Error("Skill tree is too large.");
|
|
149
|
+
hash.update(JSON.stringify([key, stat.mode & 0o111, stat.size]));
|
|
150
|
+
hash.update(await readFile(path));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
await walk(root, "");
|
|
155
|
+
return hash.digest("hex");
|
|
156
|
+
}
|
|
157
|
+
export function safeSkillName(value) {
|
|
98
158
|
const name = value.trim();
|
|
99
159
|
if (!/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/u.test(name) || name === "." || name === "..") {
|
|
100
160
|
throw new AiRegistryError("Skill name contains unsupported characters.", "ai_registry_install_target_invalid");
|
|
@@ -104,7 +164,7 @@ function safeSkillName(value) {
|
|
|
104
164
|
}
|
|
105
165
|
return name;
|
|
106
166
|
}
|
|
107
|
-
async function inspectArchive(buffer) {
|
|
167
|
+
export async function inspectArchive(buffer) {
|
|
108
168
|
const entries = await readEntries(buffer);
|
|
109
169
|
if (entries.length === 0 || entries.length > MAX_ENTRIES) {
|
|
110
170
|
throw zipError("Skill ZIP has no entries or exceeds the 512-entry limit.");
|
|
@@ -143,6 +203,54 @@ async function inspectArchive(buffer) {
|
|
|
143
203
|
}
|
|
144
204
|
return { root, entries: entries.length, files, expandedBytes };
|
|
145
205
|
}
|
|
206
|
+
/** Read bounded declarative metadata only; never extract or execute an archive. */
|
|
207
|
+
export async function readSkillBundleMetadata(buffer) {
|
|
208
|
+
if (buffer.length > MAX_ARCHIVE_BYTES)
|
|
209
|
+
throw zipError("Skill ZIP exceeds 50 MiB.");
|
|
210
|
+
const inspected = await inspectArchive(buffer);
|
|
211
|
+
const target = `${inspected.root}numa-skill.json`;
|
|
212
|
+
const zip = await openZip(buffer);
|
|
213
|
+
return new Promise((resolvePromise, rejectPromise) => {
|
|
214
|
+
let settled = false;
|
|
215
|
+
const fail = (error) => { if (!settled) {
|
|
216
|
+
settled = true;
|
|
217
|
+
zip.close();
|
|
218
|
+
rejectPromise(error);
|
|
219
|
+
} };
|
|
220
|
+
zip.once("error", fail);
|
|
221
|
+
zip.once("end", () => { if (!settled) {
|
|
222
|
+
settled = true;
|
|
223
|
+
resolvePromise(undefined);
|
|
224
|
+
} });
|
|
225
|
+
zip.on("entry", (entry) => {
|
|
226
|
+
if (entry.fileName !== target) {
|
|
227
|
+
zip.readEntry();
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
void (async () => {
|
|
231
|
+
if (entry.uncompressedSize > 16_384)
|
|
232
|
+
throw zipError("Skill dependency manifest exceeds 16 KiB.");
|
|
233
|
+
const stream = await openEntryStream(zip, entry);
|
|
234
|
+
const chunks = [];
|
|
235
|
+
let size = 0;
|
|
236
|
+
for await (const chunk of stream) {
|
|
237
|
+
const bytes = Buffer.from(chunk);
|
|
238
|
+
size += bytes.length;
|
|
239
|
+
if (size > 16_384)
|
|
240
|
+
throw zipError("Skill dependency manifest exceeds 16 KiB.");
|
|
241
|
+
chunks.push(bytes);
|
|
242
|
+
}
|
|
243
|
+
const value = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(Buffer.concat(chunks)));
|
|
244
|
+
if (!settled) {
|
|
245
|
+
settled = true;
|
|
246
|
+
zip.close();
|
|
247
|
+
resolvePromise(value);
|
|
248
|
+
}
|
|
249
|
+
})().catch(fail);
|
|
250
|
+
});
|
|
251
|
+
zip.readEntry();
|
|
252
|
+
});
|
|
253
|
+
}
|
|
146
254
|
async function extractArchive(buffer, archiveRoot, stage) {
|
|
147
255
|
const zip = await openZip(buffer);
|
|
148
256
|
await new Promise((resolvePromise, rejectPromise) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-installer.js","sourceRoot":"","sources":["../../src/ai-registry/skill-installer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EACL,KAAK,EACL,KAAK,EACL,QAAQ,EACR,MAAM,EACN,EAAE,EACH,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EACL,OAAO,EACP,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,GAAG,EACJ,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,KAAmC,MAAM,OAAO,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,iBAAiB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAC3C,MAAM,kBAAkB,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AAC7C,MAAM,WAAW,GAAG,GAAG,CAAC;AAwCxB,MAAM,YAAY,GAAwD;IACxE,oEAAoE;IACpE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACjC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC/B,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC;IACjC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC;IACjC,SAAS,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC;IACvC,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC;IACrC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC;CAClC,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,OAAkF;IAChH,IAAI,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YACxB,MAAM,IAAI,eAAe,CAAC,6CAA6C,EAAE,oCAAoC,CAAC,CAAC;QACjH,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAChG,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,KAAK,WAAW,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;QACvE,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/D,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAe,EACf,OAA4B;IAE5B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;QAC7D,MAAM,IAAI,eAAe,CAAC,uCAAuC,EAAE,+BAA+B,CAAC,CAAC;IACtG,CAAC;IACD,MAAM,SAAS,GAAG,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,cAAc,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,KAAK,QAAQ;QAC5C,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,OAAO,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACvF,IAAI,WAAW;QAAE,MAAM,wBAAwB,CAAC,WAAW,EAAE,cAAc,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5F,MAAM,KAAK,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,CAAC;IAClD,IAAI,WAAW;QAAE,YAAY,CAAC,MAAM,QAAQ,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC,CAAC;IACvE,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAChD,YAAY,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,KAA4B,EAAE,EAAE;QAC/E,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAC9C,MAAM,KAAK,CAAC;IACd,CAAC,CAAC,CAAC;IACH,IAAI,QAAQ,EAAE,cAAc,EAAE,EAAE,CAAC;QAC/B,MAAM,IAAI,eAAe,CAAC,mDAAmD,EAAE,oCAAoC,CAAC,CAAC;IACvH,CAAC;IACD,IAAI,QAAQ,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,IAAI,eAAe,CACvB,2BAA2B,WAAW,yDAAyD,EAC/F,4BAA4B,CAC7B,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,eAAe,SAAS,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7F,MAAM,MAAM,GAAG,QAAQ;QACrB,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,SAAS,gBAAgB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC;QACjG,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACpC,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACrD,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YAClC,aAAa,GAAG,IAAI,CAAC;QACvB,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,aAAa,IAAI,MAAM;gBAAE,MAAM,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACtF,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO;QACL,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,SAAS;QACT,aAAa,EAAE,WAAW;QAC1B,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,aAAa,EAAE,SAAS,CAAC,aAAa;KACvC,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC1B,IAAI,CAAC,qCAAqC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QACvF,MAAM,IAAI,eAAe,CAAC,6CAA6C,EAAE,oCAAoC,CAAC,CAAC;IACjH,CAAC;IACD,IAAI,oDAAoD,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpE,MAAM,IAAI,eAAe,CAAC,oCAAoC,EAAE,oCAAoC,CAAC,CAAC;IACxG,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,MAAc;IAC1C,MAAM,OAAO,GAAY,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;IACnD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;QACzD,MAAM,QAAQ,CAAC,0DAA0D,CAAC,CAAC;IAC7E,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACtE,IAAI,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;YAAE,MAAM,QAAQ,CAAC,yDAAyD,CAAC,CAAC;QACvG,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACxB,IAAI,CAAC,KAAK,CAAC,qBAAqB,GAAG,GAAG,CAAC,KAAK,CAAC;YAAE,MAAM,QAAQ,CAAC,gDAAgD,CAAC,CAAC;QAChH,IAAI,SAAS,CAAC,KAAK,CAAC;YAAE,MAAM,QAAQ,CAAC,4CAA4C,CAAC,CAAC;QACnF,aAAa,IAAI,KAAK,CAAC,gBAAgB,CAAC;QACxC,IAAI,aAAa,GAAG,kBAAkB;YAAE,MAAM,QAAQ,CAAC,mCAAmC,CAAC,CAAC;QAC5F,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,KAAK,IAAI,CAAC,CAAC;YACX,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;gBAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,QAAQ,CAAC,8CAA8C,CAAC,CAAC;IAC3F,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC;IACpG,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,MAAM,QAAQ,CAAC,0EAA0E,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;AACjE,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,MAAc,EAAE,WAAmB,EAAE,KAAa;IAC9E,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,IAAI,OAAO,CAAO,CAAC,cAAc,EAAE,aAAa,EAAE,EAAE;QACxD,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,IAAI,GAAG,CAAC,KAAc,EAAQ,EAAE;YACpC,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,GAAG,CAAC,KAAK,EAAE,CAAC;YACZ,aAAa,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC,CAAC;QACF,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACxB,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE;YACnB,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,GAAG,IAAI,CAAC;gBACf,cAAc,EAAE,CAAC;YACnB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE;YAC/B,KAAK,CAAC,KAAK,IAAI,EAAE;gBACf,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC/C,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;gBACjF,IAAI,CAAC,YAAY,EAAE,CAAC;oBAClB,GAAG,CAAC,SAAS,EAAE,CAAC;oBAChB,OAAO;gBACT,CAAC;gBACD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC5E,YAAY,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;gBACjC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC3B,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;oBAC3D,GAAG,CAAC,SAAS,EAAE,CAAC;oBAChB,OAAO;gBACT,CAAC;gBACD,MAAM,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;gBACpE,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACjD,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,sBAAsB,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC;gBAC/D,MAAM,IAAI,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;gBACtD,MAAM,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC9E,GAAG,CAAC,SAAS,EAAE,CAAC;YAClB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,SAAS,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IACjC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,OAAO,CAAU,CAAC,cAAc,EAAE,aAAa,EAAE,EAAE;QAC1F,MAAM,OAAO,GAAY,EAAE,CAAC;QAC5B,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QACjC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE;YAC/B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpB,GAAG,CAAC,SAAS,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/C,GAAG,CAAC,SAAS,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,OAAO,CAAC,MAAc;IAC7B,OAAO,IAAI,OAAO,CAAC,CAAC,cAAc,EAAE,aAAa,EAAE,EAAE;QACnD,KAAK,CAAC,UAAU,CACd,MAAM,EACN,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,EAC3F,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAC7G,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAC,GAAY,EAAE,KAAY;IACjD,OAAO,IAAI,OAAO,CAAC,CAAC,cAAc,EAAE,aAAa,EAAE,EAAE;QACnD,GAAG,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YAC1C,IAAI,KAAK,IAAI,CAAC,MAAM;gBAAE,aAAa,CAAC,QAAQ,CAAC,iCAAiC,CAAC,CAAC,CAAC;;gBAC5E,cAAc,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACzC,IACE,CAAC,IAAI;QACL,IAAI,CAAC,MAAM,GAAG,IAAI;QAClB,UAAU,CAAC,IAAI,CAAC;QAChB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QACpB,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC;QACnC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,CAAC,EAC7D,CAAC;QACD,MAAM,QAAQ,CAAC,oCAAoC,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,SAAS,CAAC,KAAY;IAC7B,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,sBAAsB,KAAK,EAAE,CAAC,GAAG,QAAQ,CAAC;IAC9D,OAAO,IAAI,KAAK,QAAQ,CAAC;AAC3B,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,SAAiB;IACnD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,IAAI,KAAK,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9E,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,IAAI,eAAe,CAAC,gDAAgD,EAAE,oCAAoC,CAAC,CAAC;IACpH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,IAAY,EAAE,SAAiB,EAAE,KAAmB;IACjG,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IACjE,IAAI,CAAC,YAAY,IAAI,YAAY,KAAK,IAAI,IAAI,YAAY,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9G,MAAM,IAAI,eAAe,CAAC,mDAAmD,EAAE,oCAAoC,CAAC,CAAC;IACvH,CAAC;IACD,IAAI,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,KAAK,MAAM,SAAS,IAAI,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAChD,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,KAA4B,EAAE,EAAE;YACvE,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,SAAS,CAAC;YAC9C,MAAM,KAAK,CAAC;QACd,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI;YAAE,MAAM;QACjB,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YAC1B,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;gBACrB,MAAM,IAAI,eAAe,CAAC,+DAA+D,EAAE,oCAAoC,CAAC,CAAC;YACnI,CAAC;YACD,yEAAyE;YACzE,yEAAyE;YACzE,0EAA0E;YAC1E,YAAY,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,OAAe;IAC/B,OAAO,IAAI,eAAe,CAAC,OAAO,EAAE,+BAA+B,CAAC,CAAC;AACvE,CAAC"}
|
|
1
|
+
{"version":3,"file":"skill-installer.js","sourceRoot":"","sources":["../../src/ai-registry/skill-installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type SkillInstallOptions } from "./skill-installer.js";
|
|
2
|
+
export type UninstallOptions = Pick<SkillInstallOptions, "agent" | "scope" | "skillName" | "workspace" | "customRoot">;
|
|
3
|
+
export interface UninstallPlan {
|
|
4
|
+
name: string;
|
|
5
|
+
agent: string;
|
|
6
|
+
scope: string;
|
|
7
|
+
path: string;
|
|
8
|
+
exists: boolean;
|
|
9
|
+
version?: string;
|
|
10
|
+
digest?: string;
|
|
11
|
+
trackingIds: string[];
|
|
12
|
+
dependents: string[];
|
|
13
|
+
references: string[];
|
|
14
|
+
warnings: string[];
|
|
15
|
+
fingerprint: string;
|
|
16
|
+
}
|
|
17
|
+
/** Local-only preview: never resolve a remote profile or change tracking. */
|
|
18
|
+
export declare function planSkillUninstall(options: UninstallOptions, directory?: string): Promise<UninstallPlan>;
|
|
19
|
+
export declare function uninstallSkill(options: UninstallOptions, approved: UninstallPlan, directory?: string): Promise<{
|
|
20
|
+
name: string;
|
|
21
|
+
agent: string;
|
|
22
|
+
scope: string;
|
|
23
|
+
path: string;
|
|
24
|
+
exists: boolean;
|
|
25
|
+
version?: string;
|
|
26
|
+
digest?: string;
|
|
27
|
+
trackingIds: string[];
|
|
28
|
+
dependents: string[];
|
|
29
|
+
references: string[];
|
|
30
|
+
warnings: string[];
|
|
31
|
+
fingerprint: string;
|
|
32
|
+
status: string;
|
|
33
|
+
trackingRemoved: number;
|
|
34
|
+
backupCreated: boolean;
|
|
35
|
+
}>;
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { lstat, readFile, readdir, realpath, rm } from "node:fs/promises";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { dirname, join, parse, resolve } from "node:path";
|
|
5
|
+
import { withTokenFileLock } from "@numa-tech/cli-auth";
|
|
6
|
+
import { stateLock, writeState } from "../maintenance/storage.js";
|
|
7
|
+
import { AiRegistryError } from "./errors.js";
|
|
8
|
+
import { SkillBundleSchema } from "./skill-dependencies.js";
|
|
9
|
+
import { safeSkillName, skillDirectoryDigest, skillTargetRoot, validateSkillAdapterPath } from "./skill-installer.js";
|
|
10
|
+
import { readSkillUpdates, updateStatePath } from "./updates.js";
|
|
11
|
+
import { readRegistryLock, readRegistryManifest } from "./workspace.js";
|
|
12
|
+
const missing = (e) => e.code === "ENOENT";
|
|
13
|
+
async function canonical(path) {
|
|
14
|
+
try {
|
|
15
|
+
return await realpath(path);
|
|
16
|
+
}
|
|
17
|
+
catch (e) {
|
|
18
|
+
if (!missing(e) || dirname(path) === path)
|
|
19
|
+
throw e;
|
|
20
|
+
return join(await canonical(dirname(path)), parse(path).base);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
async function bundle(path) {
|
|
24
|
+
try {
|
|
25
|
+
const stat = await lstat(path);
|
|
26
|
+
if (!stat.isFile() || stat.isSymbolicLink() || stat.size > 16_384)
|
|
27
|
+
throw new Error("Invalid local dependency manifest.");
|
|
28
|
+
return SkillBundleSchema.parse(JSON.parse(await readFile(path, "utf8")));
|
|
29
|
+
}
|
|
30
|
+
catch (e) {
|
|
31
|
+
if (missing(e))
|
|
32
|
+
return undefined;
|
|
33
|
+
throw e;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/** Local-only preview: never resolve a remote profile or change tracking. */
|
|
37
|
+
export async function planSkillUninstall(options, directory) {
|
|
38
|
+
const name = safeSkillName(options.skillName);
|
|
39
|
+
const configuredRoot = skillTargetRoot(options);
|
|
40
|
+
if (options.agent !== "custom")
|
|
41
|
+
await validateSkillAdapterPath(options.scope === "user" ? homedir() : resolve(options.workspace ?? process.cwd()), configuredRoot, options.scope);
|
|
42
|
+
const root = await canonical(configuredRoot);
|
|
43
|
+
if ([parse(root).root, await canonical(homedir()), await canonical(resolve(options.workspace ?? process.cwd()))].includes(root)) {
|
|
44
|
+
throw new AiRegistryError("Refusing a broad directory as a Skills root.", "skills_uninstall_target_invalid");
|
|
45
|
+
}
|
|
46
|
+
const path = join(root, name);
|
|
47
|
+
const stat = await lstat(path).catch(e => { if (missing(e))
|
|
48
|
+
return undefined; throw e; });
|
|
49
|
+
if (stat && (!stat.isDirectory() || stat.isSymbolicLink()))
|
|
50
|
+
throw new AiRegistryError("Skill target must be a regular directory, not a link.", "skills_uninstall_target_invalid");
|
|
51
|
+
let digest;
|
|
52
|
+
if (stat) {
|
|
53
|
+
const entry = await lstat(join(path, "SKILL.md"));
|
|
54
|
+
if (!entry.isFile() || entry.isSymbolicLink())
|
|
55
|
+
throw new AiRegistryError("Target has no regular SKILL.md.", "skills_uninstall_target_invalid");
|
|
56
|
+
digest = await skillDirectoryDigest(path);
|
|
57
|
+
}
|
|
58
|
+
const state = await readSkillUpdates(directory);
|
|
59
|
+
const records = [];
|
|
60
|
+
for (const record of state.installations)
|
|
61
|
+
if (await canonical(resolve(record.path)) === path)
|
|
62
|
+
records.push(record);
|
|
63
|
+
const metadata = stat ? await bundle(join(path, "numa-skill.json")) : undefined;
|
|
64
|
+
if (metadata && metadata.name !== name)
|
|
65
|
+
throw new AiRegistryError("Local Skill name does not match target.", "skills_uninstall_target_invalid");
|
|
66
|
+
const dependents = [];
|
|
67
|
+
const siblings = await readdir(root, { withFileTypes: true }).catch(e => { if (missing(e))
|
|
68
|
+
return []; throw e; });
|
|
69
|
+
for (const sibling of siblings) {
|
|
70
|
+
if (sibling.name === name || sibling.name.startsWith(".") || sibling.name.includes(".numa-backup-"))
|
|
71
|
+
continue;
|
|
72
|
+
// Unknown linked consumers cannot be safely ruled out.
|
|
73
|
+
if (sibling.isSymbolicLink())
|
|
74
|
+
throw new AiRegistryError("Linked sibling Skill prevents safe dependency inspection.", "skills_uninstall_dependency_unknown");
|
|
75
|
+
if (!sibling.isDirectory())
|
|
76
|
+
continue;
|
|
77
|
+
const consumer = await bundle(join(root, sibling.name, "numa-skill.json"));
|
|
78
|
+
if (consumer?.dependencies.some(d => d.name === name))
|
|
79
|
+
dependents.push(sibling.name);
|
|
80
|
+
}
|
|
81
|
+
const references = [];
|
|
82
|
+
const workspaces = new Set([resolve(options.workspace ?? process.cwd()), ...records.flatMap(r => r.workspace ? [r.workspace] : [])]);
|
|
83
|
+
for (const workspace of workspaces) {
|
|
84
|
+
const project = await readRegistryManifest(workspace, false);
|
|
85
|
+
if (!project)
|
|
86
|
+
continue;
|
|
87
|
+
if (project.manifest.skills.some(s => s.name === name))
|
|
88
|
+
references.push(project.files.manifestPath);
|
|
89
|
+
const lock = await readRegistryLock(project.files, false);
|
|
90
|
+
if (lock?.resources.some(s => s.type === "SKILL" && s.name === name))
|
|
91
|
+
references.push(project.files.lockPath);
|
|
92
|
+
}
|
|
93
|
+
const result = { name, agent: options.agent, scope: options.scope, path, exists: Boolean(stat),
|
|
94
|
+
version: metadata?.version ?? records[0]?.version, digest, trackingIds: records.map(r => r.id).sort(),
|
|
95
|
+
dependents: dependents.sort(), references: [...new Set(references)].sort(),
|
|
96
|
+
warnings: ["直接删除,不自动备份;无法通过 CLI 恢复。", "卸载后请刷新 Agent Skills 列表或新开会话。",
|
|
97
|
+
"不会修改项目 manifest/lock 或平台入口配置;这些配置仍有引用时,显式 sync/bootstrap/login 可能重新安装。其他未登记项目的引用不在检查范围内。"] };
|
|
98
|
+
return { ...result, fingerprint: createHash("sha256").update(JSON.stringify(result)).digest("hex") };
|
|
99
|
+
}
|
|
100
|
+
export async function uninstallSkill(options, approved, directory) {
|
|
101
|
+
// Same lock order as automatic maintenance (inventory -> installer).
|
|
102
|
+
return stateLock(updateStatePath(directory), async () => {
|
|
103
|
+
const first = await planSkillUninstall(options, directory);
|
|
104
|
+
if (first.fingerprint !== approved.fingerprint)
|
|
105
|
+
throw new AiRegistryError("Uninstall plan changed; preview and confirm again.", "skills_uninstall_plan_changed");
|
|
106
|
+
if (first.dependents.length)
|
|
107
|
+
throw new AiRegistryError(`Required by: ${first.dependents.join(", ")}. Remove consumers first.`, "skills_uninstall_required_dependency");
|
|
108
|
+
// Missing targets need no filesystem lock or directory creation; stale tracking can still be cleared.
|
|
109
|
+
const apply = async () => {
|
|
110
|
+
const current = await planSkillUninstall(options, directory);
|
|
111
|
+
if (current.fingerprint !== approved.fingerprint)
|
|
112
|
+
throw new AiRegistryError("Uninstall plan changed; preview again.", "skills_uninstall_plan_changed");
|
|
113
|
+
const state = await readSkillUpdates(directory);
|
|
114
|
+
// Persist removal first: if deletion fails, auto-update cannot reinstall or mutate a partial tree.
|
|
115
|
+
state.installations = state.installations.filter(r => !current.trackingIds.includes(r.id));
|
|
116
|
+
if (current.trackingIds.length)
|
|
117
|
+
await writeState(updateStatePath(directory), state);
|
|
118
|
+
if (current.exists) {
|
|
119
|
+
try {
|
|
120
|
+
await rm(current.path, { recursive: true, force: false });
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
throw new AiRegistryError("Tracking removed but file deletion failed or was partial; inspect the target and retry. No backup was made.", "skills_uninstall_delete_failed");
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return { ...current, status: current.exists ? "UNINSTALLED" : "NOT_INSTALLED", trackingRemoved: current.trackingIds.length, backupCreated: false };
|
|
127
|
+
};
|
|
128
|
+
return first.exists ? withTokenFileLock(join(dirname(first.path), `.numa-install-${first.name}`), apply, { timeoutMilliseconds: 1_000 }) : apply();
|
|
129
|
+
}, 2_000);
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=skill-uninstaller.js.map
|