@tankpkg/cli 0.7.0 → 0.8.1
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/dist/bin/tank.d.ts +1 -2
- package/dist/bin/tank.js +3423 -294
- package/dist/bin/tank.js.map +1 -1
- package/dist/debug-logger-BjGZcIhg.js +140 -0
- package/dist/debug-logger-BjGZcIhg.js.map +1 -0
- package/dist/index.d.ts +59 -5
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +83 -4
- package/dist/index.js.map +1 -1
- package/dist/package.json +46 -0
- package/package.json +18 -12
- package/LICENSE +0 -21
- package/dist/commands/audit.d.ts +0 -5
- package/dist/commands/audit.js +0 -185
- package/dist/commands/audit.js.map +0 -1
- package/dist/commands/doctor.d.ts +0 -5
- package/dist/commands/doctor.js +0 -164
- package/dist/commands/doctor.js.map +0 -1
- package/dist/commands/info.d.ts +0 -5
- package/dist/commands/info.js +0 -102
- package/dist/commands/info.js.map +0 -1
- package/dist/commands/init.d.ts +0 -11
- package/dist/commands/init.js +0 -140
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/install.d.ts +0 -24
- package/dist/commands/install.js +0 -517
- package/dist/commands/install.js.map +0 -1
- package/dist/commands/link.d.ts +0 -5
- package/dist/commands/link.js +0 -79
- package/dist/commands/link.js.map +0 -1
- package/dist/commands/login.d.ts +0 -14
- package/dist/commands/login.js +0 -87
- package/dist/commands/login.js.map +0 -1
- package/dist/commands/logout.d.ts +0 -9
- package/dist/commands/logout.js +0 -20
- package/dist/commands/logout.js.map +0 -1
- package/dist/commands/permissions.d.ts +0 -4
- package/dist/commands/permissions.js +0 -199
- package/dist/commands/permissions.js.map +0 -1
- package/dist/commands/publish.d.ts +0 -25
- package/dist/commands/publish.js +0 -166
- package/dist/commands/publish.js.map +0 -1
- package/dist/commands/remove.d.ts +0 -7
- package/dist/commands/remove.js +0 -163
- package/dist/commands/remove.js.map +0 -1
- package/dist/commands/scan.d.ts +0 -5
- package/dist/commands/scan.js +0 -169
- package/dist/commands/scan.js.map +0 -1
- package/dist/commands/search.d.ts +0 -5
- package/dist/commands/search.js +0 -67
- package/dist/commands/search.js.map +0 -1
- package/dist/commands/unlink.d.ts +0 -5
- package/dist/commands/unlink.js +0 -42
- package/dist/commands/unlink.js.map +0 -1
- package/dist/commands/update.d.ts +0 -8
- package/dist/commands/update.js +0 -332
- package/dist/commands/update.js.map +0 -1
- package/dist/commands/upgrade.d.ts +0 -6
- package/dist/commands/upgrade.js +0 -111
- package/dist/commands/upgrade.js.map +0 -1
- package/dist/commands/verify.d.ts +0 -22
- package/dist/commands/verify.js +0 -63
- package/dist/commands/verify.js.map +0 -1
- package/dist/commands/whoami.d.ts +0 -4
- package/dist/commands/whoami.js +0 -57
- package/dist/commands/whoami.js.map +0 -1
- package/dist/lib/agents.d.ts +0 -19
- package/dist/lib/agents.js +0 -106
- package/dist/lib/agents.js.map +0 -1
- package/dist/lib/api-client.d.ts +0 -14
- package/dist/lib/api-client.js +0 -63
- package/dist/lib/api-client.js.map +0 -1
- package/dist/lib/config.d.ts +0 -29
- package/dist/lib/config.js +0 -66
- package/dist/lib/config.js.map +0 -1
- package/dist/lib/debug-logger.d.ts +0 -9
- package/dist/lib/debug-logger.js +0 -77
- package/dist/lib/debug-logger.js.map +0 -1
- package/dist/lib/dependency-resolver.d.ts +0 -51
- package/dist/lib/dependency-resolver.js +0 -181
- package/dist/lib/dependency-resolver.js.map +0 -1
- package/dist/lib/frontmatter.d.ts +0 -11
- package/dist/lib/frontmatter.js +0 -89
- package/dist/lib/frontmatter.js.map +0 -1
- package/dist/lib/install-pipeline.d.ts +0 -23
- package/dist/lib/install-pipeline.js +0 -181
- package/dist/lib/install-pipeline.js.map +0 -1
- package/dist/lib/linker.d.ts +0 -45
- package/dist/lib/linker.js +0 -137
- package/dist/lib/linker.js.map +0 -1
- package/dist/lib/links.d.ts +0 -20
- package/dist/lib/links.js +0 -105
- package/dist/lib/links.js.map +0 -1
- package/dist/lib/lockfile.d.ts +0 -24
- package/dist/lib/lockfile.js +0 -135
- package/dist/lib/lockfile.js.map +0 -1
- package/dist/lib/logger.d.ts +0 -6
- package/dist/lib/logger.js +0 -8
- package/dist/lib/logger.js.map +0 -1
- package/dist/lib/packer.d.ts +0 -41
- package/dist/lib/packer.js +0 -284
- package/dist/lib/packer.js.map +0 -1
- package/dist/lib/permission-checker.d.ts +0 -16
- package/dist/lib/permission-checker.js +0 -78
- package/dist/lib/permission-checker.js.map +0 -1
- package/dist/lib/upgrade-check.d.ts +0 -1
- package/dist/lib/upgrade-check.js +0 -59
- package/dist/lib/upgrade-check.js.map +0 -1
- package/dist/version.d.ts +0 -2
- package/dist/version.js +0 -4
- package/dist/version.js.map +0 -1
package/dist/commands/install.js
DELETED
|
@@ -1,517 +0,0 @@
|
|
|
1
|
-
import crypto from 'node:crypto';
|
|
2
|
-
import fs from 'node:fs';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import os from 'node:os';
|
|
5
|
-
import ora from 'ora';
|
|
6
|
-
import { resolve, LOCKFILE_VERSION } from '@tank/shared';
|
|
7
|
-
import { getConfig } from '../lib/config.js';
|
|
8
|
-
import { logger } from '../lib/logger.js';
|
|
9
|
-
import { prepareAgentSkillDir } from '../lib/frontmatter.js';
|
|
10
|
-
import { linkSkillToAgents } from '../lib/linker.js';
|
|
11
|
-
import { detectInstalledAgents, getGlobalSkillsDir, getGlobalAgentSkillsDir } from '../lib/agents.js';
|
|
12
|
-
import { USER_AGENT } from '../version.js';
|
|
13
|
-
import { resolveDependencyTree, buildSkillKey, } from '../lib/dependency-resolver.js';
|
|
14
|
-
import { checkPermissionBudget } from '../lib/permission-checker.js';
|
|
15
|
-
import { downloadAllParallel, extractSafely, getExtractDir, getGlobalExtractDir, getResolvedNodesInOrder, parseLockKey, parseVersionFromLockKey, readExtractedDependencies, verifyExtractedDependencies, writeLockfileWithResolvedGraph, } from '../lib/install-pipeline.js';
|
|
16
|
-
function createRegistryFetcher(registry, headers) {
|
|
17
|
-
const versionsCache = new Map();
|
|
18
|
-
const metadataCache = new Map();
|
|
19
|
-
return {
|
|
20
|
-
async fetchVersions(name) {
|
|
21
|
-
const cached = versionsCache.get(name);
|
|
22
|
-
if (cached) {
|
|
23
|
-
return cached;
|
|
24
|
-
}
|
|
25
|
-
const encoded = encodeURIComponent(name);
|
|
26
|
-
let res;
|
|
27
|
-
try {
|
|
28
|
-
res = await fetch(`${registry}/api/v1/skills/${encoded}/versions`, { headers });
|
|
29
|
-
}
|
|
30
|
-
catch (err) {
|
|
31
|
-
throw new Error(`Network error fetching versions: ${err instanceof Error ? err.message : String(err)}`);
|
|
32
|
-
}
|
|
33
|
-
if (!res.ok) {
|
|
34
|
-
if (res.status === 403)
|
|
35
|
-
throw new Error('Token lacks required scope: skills:read');
|
|
36
|
-
if (res.status === 404)
|
|
37
|
-
throw new Error(`Skill not found or no access: ${name}`);
|
|
38
|
-
const body = await res.json().catch(() => null);
|
|
39
|
-
throw new Error(body?.error ?? res.statusText);
|
|
40
|
-
}
|
|
41
|
-
const data = await res.json();
|
|
42
|
-
versionsCache.set(name, data.versions);
|
|
43
|
-
return data.versions;
|
|
44
|
-
},
|
|
45
|
-
async fetchMetadata(name, version) {
|
|
46
|
-
const cacheKey = buildSkillKey(name, version);
|
|
47
|
-
const cached = metadataCache.get(cacheKey);
|
|
48
|
-
if (cached) {
|
|
49
|
-
return cached;
|
|
50
|
-
}
|
|
51
|
-
const encoded = encodeURIComponent(name);
|
|
52
|
-
let res;
|
|
53
|
-
try {
|
|
54
|
-
res = await fetch(`${registry}/api/v1/skills/${encoded}/${version}`, { headers });
|
|
55
|
-
}
|
|
56
|
-
catch (err) {
|
|
57
|
-
throw new Error(`Network error fetching metadata: ${err instanceof Error ? err.message : String(err)}`);
|
|
58
|
-
}
|
|
59
|
-
if (!res.ok) {
|
|
60
|
-
if (res.status === 403)
|
|
61
|
-
throw new Error('Token lacks required scope: skills:read');
|
|
62
|
-
if (res.status === 404)
|
|
63
|
-
throw new Error(`Skill not found or no access: ${name}@${version}`);
|
|
64
|
-
const body = await res.json().catch(() => null);
|
|
65
|
-
throw new Error(body?.error ?? res.statusText);
|
|
66
|
-
}
|
|
67
|
-
const data = await res.json();
|
|
68
|
-
const normalized = {
|
|
69
|
-
...data,
|
|
70
|
-
dependencies: data.dependencies ?? {},
|
|
71
|
-
};
|
|
72
|
-
metadataCache.set(cacheKey, normalized);
|
|
73
|
-
return normalized;
|
|
74
|
-
},
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
function readSkillsJson(skillsJsonPath) {
|
|
78
|
-
try {
|
|
79
|
-
const raw = fs.readFileSync(skillsJsonPath, 'utf-8');
|
|
80
|
-
return JSON.parse(raw);
|
|
81
|
-
}
|
|
82
|
-
catch {
|
|
83
|
-
throw new Error('Failed to read or parse skills.json');
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
function readOrCreateSkillsJson(skillsJsonPath) {
|
|
87
|
-
if (!fs.existsSync(skillsJsonPath)) {
|
|
88
|
-
const skillsJson = { skills: {} };
|
|
89
|
-
fs.writeFileSync(skillsJsonPath, JSON.stringify(skillsJson, null, 2) + '\n');
|
|
90
|
-
logger.info('Created skills.json');
|
|
91
|
-
return skillsJson;
|
|
92
|
-
}
|
|
93
|
-
return readSkillsJson(skillsJsonPath);
|
|
94
|
-
}
|
|
95
|
-
function readLockOrFresh(lockPath) {
|
|
96
|
-
if (!fs.existsSync(lockPath)) {
|
|
97
|
-
return { lockfileVersion: LOCKFILE_VERSION, skills: {} };
|
|
98
|
-
}
|
|
99
|
-
try {
|
|
100
|
-
const raw = fs.readFileSync(lockPath, 'utf-8');
|
|
101
|
-
return JSON.parse(raw);
|
|
102
|
-
}
|
|
103
|
-
catch {
|
|
104
|
-
return { lockfileVersion: LOCKFILE_VERSION, skills: {} };
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
function buildLockedVersionByName(lock) {
|
|
108
|
-
const lockedVersionByName = new Map();
|
|
109
|
-
for (const key of Object.keys(lock.skills)) {
|
|
110
|
-
lockedVersionByName.set(parseLockKey(key), parseVersionFromLockKey(key));
|
|
111
|
-
}
|
|
112
|
-
return lockedVersionByName;
|
|
113
|
-
}
|
|
114
|
-
function createExtractDirResolver(directory, global, resolvedHome) {
|
|
115
|
-
return (skillName) => (global ? getGlobalExtractDir(resolvedHome, skillName) : getExtractDir(directory, skillName));
|
|
116
|
-
}
|
|
117
|
-
function validateResolvedNodes(resolvedNodes, projectPermissions, auditMinScore) {
|
|
118
|
-
if (!projectPermissions) {
|
|
119
|
-
logger.warn('No permission budget defined in skills.json. Install proceeding without permission checks.');
|
|
120
|
-
}
|
|
121
|
-
for (const node of resolvedNodes) {
|
|
122
|
-
if (projectPermissions) {
|
|
123
|
-
checkPermissionBudget(projectPermissions, node.meta.permissions, node.name);
|
|
124
|
-
}
|
|
125
|
-
if (auditMinScore !== undefined) {
|
|
126
|
-
if (node.meta.auditScore === null || node.meta.auditScore === undefined) {
|
|
127
|
-
logger.warn(`Audit score not yet available for ${node.name}. Install proceeding without audit score check.`);
|
|
128
|
-
}
|
|
129
|
-
else if (node.meta.auditScore < auditMinScore) {
|
|
130
|
-
throw new Error(`Audit score ${node.meta.auditScore} for ${node.name} is below minimum threshold ${auditMinScore} defined in skills.json`);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
async function runLegacyFallback(options) {
|
|
136
|
-
const { rootSkillNames, resolvedNodeByName, extractDirForSkill, directory, configDir, global, homedir } = options;
|
|
137
|
-
for (const skillName of rootSkillNames) {
|
|
138
|
-
const node = resolvedNodeByName.get(skillName);
|
|
139
|
-
if (!node || Object.keys(node.meta.dependencies).length > 0) {
|
|
140
|
-
continue;
|
|
141
|
-
}
|
|
142
|
-
const extractedDeps = readExtractedDependencies(extractDirForSkill(skillName));
|
|
143
|
-
for (const [depName, depRange] of Object.entries(extractedDeps)) {
|
|
144
|
-
if (depName === skillName) {
|
|
145
|
-
continue;
|
|
146
|
-
}
|
|
147
|
-
await installCommand({
|
|
148
|
-
name: depName,
|
|
149
|
-
versionRange: depRange,
|
|
150
|
-
directory,
|
|
151
|
-
configDir,
|
|
152
|
-
global,
|
|
153
|
-
homedir,
|
|
154
|
-
isTransitive: true,
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
function linkInstalledRoots(options) {
|
|
160
|
-
const { rootSkillNames, resolvedNodeByName, extractDirForSkill, directory, global, resolvedHome, homedir } = options;
|
|
161
|
-
const agentSkillsBaseDir = global
|
|
162
|
-
? getGlobalAgentSkillsDir(resolvedHome)
|
|
163
|
-
: path.join(directory, '.tank', 'agent-skills');
|
|
164
|
-
const linksDir = global ? path.join(resolvedHome, '.tank') : path.join(directory, '.tank');
|
|
165
|
-
for (const skillName of rootSkillNames) {
|
|
166
|
-
try {
|
|
167
|
-
const node = resolvedNodeByName.get(skillName);
|
|
168
|
-
if (!node) {
|
|
169
|
-
continue;
|
|
170
|
-
}
|
|
171
|
-
const agentSkillDir = prepareAgentSkillDir({
|
|
172
|
-
skillName,
|
|
173
|
-
extractDir: extractDirForSkill(skillName),
|
|
174
|
-
agentSkillsBaseDir,
|
|
175
|
-
description: node.meta.description,
|
|
176
|
-
});
|
|
177
|
-
const linkResult = linkSkillToAgents({
|
|
178
|
-
skillName,
|
|
179
|
-
sourceDir: agentSkillDir,
|
|
180
|
-
linksDir,
|
|
181
|
-
source: global ? 'global' : 'local',
|
|
182
|
-
homedir,
|
|
183
|
-
});
|
|
184
|
-
if (linkResult.linked.length > 0) {
|
|
185
|
-
logger.info(`Linked to ${linkResult.linked.length} agent(s)`);
|
|
186
|
-
}
|
|
187
|
-
if (linkResult.failed.length > 0) {
|
|
188
|
-
for (const failedLink of linkResult.failed) {
|
|
189
|
-
logger.warn(`Failed to link to ${failedLink.agentId}: ${failedLink.error}`);
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
catch {
|
|
194
|
-
if (rootSkillNames.length === 1) {
|
|
195
|
-
logger.warn('Agent linking skipped (non-fatal)');
|
|
196
|
-
}
|
|
197
|
-
else {
|
|
198
|
-
logger.warn(`Agent linking skipped for ${skillName} (non-fatal)`);
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
const detectedAgents = detectInstalledAgents(homedir);
|
|
203
|
-
if (detectedAgents.length === 0) {
|
|
204
|
-
logger.warn('No agents detected for linking');
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
async function executeInstallPipeline(options) {
|
|
208
|
-
const { directory, configDir, global, homedir, resolvedHome, lock, lockPath, resolvedNodes, nodesToInstall, rootSkillNames, projectPermissions, auditMinScore, spinner, } = options;
|
|
209
|
-
if (!global) {
|
|
210
|
-
validateResolvedNodes(resolvedNodes, projectPermissions, auditMinScore);
|
|
211
|
-
}
|
|
212
|
-
const extractDirForSkill = createExtractDirResolver(directory, global, resolvedHome);
|
|
213
|
-
const resolvedNodeByName = new Map(resolvedNodes.map((node) => [node.name, node]));
|
|
214
|
-
const downloaded = await downloadAllParallel(nodesToInstall, spinner);
|
|
215
|
-
for (const node of nodesToInstall) {
|
|
216
|
-
const payload = downloaded.get(node.name);
|
|
217
|
-
if (!payload) {
|
|
218
|
-
throw new Error(`Missing downloaded tarball for ${node.name}@${node.version}`);
|
|
219
|
-
}
|
|
220
|
-
spinner.text = `Extracting ${node.name}@${node.version}...`;
|
|
221
|
-
const extractDir = extractDirForSkill(node.name);
|
|
222
|
-
fs.mkdirSync(extractDir, { recursive: true });
|
|
223
|
-
await extractSafely(payload.buffer, extractDir);
|
|
224
|
-
verifyExtractedDependencies(extractDir, node);
|
|
225
|
-
}
|
|
226
|
-
lock.lockfileVersion = LOCKFILE_VERSION;
|
|
227
|
-
const updatedLock = writeLockfileWithResolvedGraph(lock, resolvedNodes, downloaded);
|
|
228
|
-
fs.mkdirSync(path.dirname(lockPath), { recursive: true });
|
|
229
|
-
fs.writeFileSync(lockPath, JSON.stringify(updatedLock, null, 2) + '\n');
|
|
230
|
-
await runLegacyFallback({
|
|
231
|
-
rootSkillNames,
|
|
232
|
-
resolvedNodeByName,
|
|
233
|
-
extractDirForSkill,
|
|
234
|
-
directory,
|
|
235
|
-
configDir,
|
|
236
|
-
global,
|
|
237
|
-
homedir,
|
|
238
|
-
});
|
|
239
|
-
linkInstalledRoots({
|
|
240
|
-
rootSkillNames,
|
|
241
|
-
resolvedNodeByName,
|
|
242
|
-
extractDirForSkill,
|
|
243
|
-
directory,
|
|
244
|
-
global,
|
|
245
|
-
resolvedHome,
|
|
246
|
-
homedir,
|
|
247
|
-
});
|
|
248
|
-
return updatedLock;
|
|
249
|
-
}
|
|
250
|
-
export async function installCommand(options) {
|
|
251
|
-
const { name, versionRange = '*', directory = process.cwd(), configDir, global = false, homedir, isTransitive = false, } = options;
|
|
252
|
-
const config = getConfig(configDir);
|
|
253
|
-
const resolvedHome = homedir ?? os.homedir();
|
|
254
|
-
const requestHeaders = { 'User-Agent': USER_AGENT };
|
|
255
|
-
if (config.token) {
|
|
256
|
-
requestHeaders.Authorization = `Bearer ${config.token}`;
|
|
257
|
-
}
|
|
258
|
-
const skillsJsonPath = path.join(directory, 'skills.json');
|
|
259
|
-
const skillsJson = global ? { skills: {} } : readOrCreateSkillsJson(skillsJsonPath);
|
|
260
|
-
const lockPath = global
|
|
261
|
-
? path.join(resolvedHome, '.tank', 'skills.lock')
|
|
262
|
-
: path.join(directory, 'skills.lock');
|
|
263
|
-
const lock = readLockOrFresh(lockPath);
|
|
264
|
-
const spinner = ora('Resolving dependency graph...').start();
|
|
265
|
-
try {
|
|
266
|
-
const fetcher = createRegistryFetcher(config.registry, requestHeaders);
|
|
267
|
-
const requestedVersions = await fetcher.fetchVersions(name);
|
|
268
|
-
const requestedAvailableVersions = requestedVersions.map((versionInfo) => versionInfo.version);
|
|
269
|
-
const requestedResolvedVersion = resolve(versionRange, requestedAvailableVersions);
|
|
270
|
-
if (!requestedResolvedVersion) {
|
|
271
|
-
throw new Error(`No version of ${name} satisfies range "${versionRange}". Available: ${requestedAvailableVersions.join(', ')}`);
|
|
272
|
-
}
|
|
273
|
-
const requestedLockKey = buildSkillKey(name, requestedResolvedVersion);
|
|
274
|
-
if (lock.skills[requestedLockKey]) {
|
|
275
|
-
logger.info(`${name}@${requestedResolvedVersion} is already installed`);
|
|
276
|
-
spinner.succeed(`${name}@${requestedResolvedVersion} is already installed`);
|
|
277
|
-
return;
|
|
278
|
-
}
|
|
279
|
-
const rootDependencies = {};
|
|
280
|
-
if (!global && !isTransitive) {
|
|
281
|
-
const existingSkills = (skillsJson.skills ?? {});
|
|
282
|
-
const lockedVersionByName = buildLockedVersionByName(lock);
|
|
283
|
-
for (const [skillName, range] of Object.entries(existingSkills)) {
|
|
284
|
-
if (typeof range !== 'string') {
|
|
285
|
-
continue;
|
|
286
|
-
}
|
|
287
|
-
rootDependencies[skillName] = lockedVersionByName.get(skillName) ?? range;
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
rootDependencies[name] = versionRange;
|
|
291
|
-
const resolvedGraph = await resolveDependencyTree(rootDependencies, fetcher);
|
|
292
|
-
const resolvedNodes = getResolvedNodesInOrder(resolvedGraph.nodes, resolvedGraph.installOrder);
|
|
293
|
-
const rootNode = resolvedGraph.nodes.get(name);
|
|
294
|
-
if (!rootNode) {
|
|
295
|
-
throw new Error(`Failed to resolve requested skill: ${name}`);
|
|
296
|
-
}
|
|
297
|
-
const nodesToInstall = resolvedNodes.filter((node) => {
|
|
298
|
-
const lockKey = buildSkillKey(node.name, node.version);
|
|
299
|
-
return !lock.skills[lockKey];
|
|
300
|
-
});
|
|
301
|
-
const projectPermissions = global ? undefined : skillsJson.permissions;
|
|
302
|
-
const auditMinScore = global ? undefined : skillsJson.audit?.min_score;
|
|
303
|
-
await executeInstallPipeline({
|
|
304
|
-
directory,
|
|
305
|
-
configDir,
|
|
306
|
-
global,
|
|
307
|
-
homedir,
|
|
308
|
-
resolvedHome,
|
|
309
|
-
lock,
|
|
310
|
-
lockPath,
|
|
311
|
-
resolvedNodes,
|
|
312
|
-
nodesToInstall,
|
|
313
|
-
rootSkillNames: [name],
|
|
314
|
-
projectPermissions,
|
|
315
|
-
auditMinScore,
|
|
316
|
-
spinner,
|
|
317
|
-
});
|
|
318
|
-
if (!global && !isTransitive) {
|
|
319
|
-
const skills = (skillsJson.skills ?? {});
|
|
320
|
-
skills[name] = versionRange === '*' ? `^${rootNode.version}` : versionRange;
|
|
321
|
-
skillsJson.skills = skills;
|
|
322
|
-
fs.writeFileSync(skillsJsonPath, JSON.stringify(skillsJson, null, 2) + '\n');
|
|
323
|
-
}
|
|
324
|
-
spinner.succeed(`Installed ${name}@${rootNode.version}`);
|
|
325
|
-
}
|
|
326
|
-
catch (err) {
|
|
327
|
-
spinner.fail('Install failed');
|
|
328
|
-
throw err;
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
export async function installFromLockfile(options) {
|
|
332
|
-
const { directory = process.cwd(), configDir, global = false, homedir } = options;
|
|
333
|
-
const resolvedHome = homedir ?? os.homedir();
|
|
334
|
-
const config = getConfig(configDir);
|
|
335
|
-
const requestHeaders = { 'User-Agent': USER_AGENT };
|
|
336
|
-
if (config.token) {
|
|
337
|
-
requestHeaders.Authorization = `Bearer ${config.token}`;
|
|
338
|
-
}
|
|
339
|
-
const lockPath = global
|
|
340
|
-
? path.join(resolvedHome, '.tank', 'skills.lock')
|
|
341
|
-
: path.join(directory, 'skills.lock');
|
|
342
|
-
if (!fs.existsSync(lockPath)) {
|
|
343
|
-
throw new Error(`No skills.lock found in ${directory}`);
|
|
344
|
-
}
|
|
345
|
-
let lock;
|
|
346
|
-
try {
|
|
347
|
-
const raw = fs.readFileSync(lockPath, 'utf-8');
|
|
348
|
-
lock = JSON.parse(raw);
|
|
349
|
-
}
|
|
350
|
-
catch {
|
|
351
|
-
throw new Error('Failed to read or parse skills.lock');
|
|
352
|
-
}
|
|
353
|
-
const entries = Object.entries(lock.skills);
|
|
354
|
-
if (entries.length === 0) {
|
|
355
|
-
logger.info('No skills in lockfile');
|
|
356
|
-
return;
|
|
357
|
-
}
|
|
358
|
-
const spinner = ora('Installing from lockfile...').start();
|
|
359
|
-
const skillsDir = global
|
|
360
|
-
? getGlobalSkillsDir(resolvedHome)
|
|
361
|
-
: path.join(directory, '.tank', 'skills');
|
|
362
|
-
try {
|
|
363
|
-
for (const [key, entry] of entries) {
|
|
364
|
-
const skillName = parseLockKey(key);
|
|
365
|
-
const version = parseVersionFromLockKey(key);
|
|
366
|
-
spinner.text = `Installing ${key}...`;
|
|
367
|
-
const encodedName = encodeURIComponent(skillName);
|
|
368
|
-
const metaUrl = `${config.registry}/api/v1/skills/${encodedName}/${version}`;
|
|
369
|
-
let metaRes;
|
|
370
|
-
try {
|
|
371
|
-
metaRes = await fetch(metaUrl, {
|
|
372
|
-
headers: requestHeaders,
|
|
373
|
-
});
|
|
374
|
-
}
|
|
375
|
-
catch (err) {
|
|
376
|
-
throw new Error(`Network error fetching ${key}: ${err instanceof Error ? err.message : String(err)}`);
|
|
377
|
-
}
|
|
378
|
-
if (!metaRes.ok) {
|
|
379
|
-
if (metaRes.status === 404) {
|
|
380
|
-
throw new Error(`Skill or version not found: ${key}`);
|
|
381
|
-
}
|
|
382
|
-
const body = await metaRes.json().catch(() => null);
|
|
383
|
-
throw new Error(`Failed to fetch ${key}: ${body?.error ?? metaRes.statusText}`);
|
|
384
|
-
}
|
|
385
|
-
const metadata = await metaRes.json();
|
|
386
|
-
const downloadUrl = metadata.downloadUrl;
|
|
387
|
-
const downloadRes = await fetch(downloadUrl);
|
|
388
|
-
if (!downloadRes.ok) {
|
|
389
|
-
throw new Error(`Failed to download ${key}: ${downloadRes.status} ${downloadRes.statusText}`);
|
|
390
|
-
}
|
|
391
|
-
const tarballBuffer = Buffer.from(await downloadRes.arrayBuffer());
|
|
392
|
-
const computedIntegrity = buildIntegrity(tarballBuffer);
|
|
393
|
-
if (computedIntegrity !== entry.integrity) {
|
|
394
|
-
throw new Error(`Integrity mismatch for ${key}. Expected: ${entry.integrity}, Got: ${computedIntegrity}`);
|
|
395
|
-
}
|
|
396
|
-
const extractDir = global
|
|
397
|
-
? getGlobalExtractDir(resolvedHome, skillName)
|
|
398
|
-
: getExtractDir(directory, skillName);
|
|
399
|
-
if (fs.existsSync(extractDir)) {
|
|
400
|
-
fs.rmSync(extractDir, { recursive: true, force: true });
|
|
401
|
-
}
|
|
402
|
-
fs.mkdirSync(extractDir, { recursive: true });
|
|
403
|
-
await extractSafely(tarballBuffer, extractDir);
|
|
404
|
-
if (global) {
|
|
405
|
-
try {
|
|
406
|
-
const agentSkillsBaseDir = getGlobalAgentSkillsDir(resolvedHome);
|
|
407
|
-
const agentSkillDir = prepareAgentSkillDir({
|
|
408
|
-
skillName,
|
|
409
|
-
extractDir,
|
|
410
|
-
agentSkillsBaseDir,
|
|
411
|
-
});
|
|
412
|
-
const linkResult = linkSkillToAgents({
|
|
413
|
-
skillName,
|
|
414
|
-
sourceDir: agentSkillDir,
|
|
415
|
-
linksDir: path.join(resolvedHome, '.tank'),
|
|
416
|
-
source: 'global',
|
|
417
|
-
homedir,
|
|
418
|
-
});
|
|
419
|
-
const detectedAgents = detectInstalledAgents(homedir);
|
|
420
|
-
if (detectedAgents.length === 0) {
|
|
421
|
-
logger.warn('No agents detected for linking');
|
|
422
|
-
}
|
|
423
|
-
if (linkResult.linked.length > 0) {
|
|
424
|
-
logger.info(`Linked to ${linkResult.linked.length} agent(s)`);
|
|
425
|
-
}
|
|
426
|
-
if (linkResult.failed.length > 0) {
|
|
427
|
-
for (const failedLink of linkResult.failed) {
|
|
428
|
-
logger.warn(`Failed to link to ${failedLink.agentId}: ${failedLink.error}`);
|
|
429
|
-
}
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
catch {
|
|
433
|
-
logger.warn('Agent linking skipped (non-fatal)');
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
spinner.succeed(`Installed ${entries.length} skill${entries.length === 1 ? '' : 's'} from lockfile`);
|
|
438
|
-
}
|
|
439
|
-
catch (err) {
|
|
440
|
-
spinner.fail('Install from lockfile failed');
|
|
441
|
-
if (fs.existsSync(skillsDir)) {
|
|
442
|
-
fs.rmSync(skillsDir, { recursive: true, force: true });
|
|
443
|
-
}
|
|
444
|
-
throw err;
|
|
445
|
-
}
|
|
446
|
-
}
|
|
447
|
-
export async function installAll(options) {
|
|
448
|
-
const { directory = process.cwd(), configDir, global = false, homedir } = options;
|
|
449
|
-
const resolvedHome = homedir ?? os.homedir();
|
|
450
|
-
const config = getConfig(configDir);
|
|
451
|
-
const requestHeaders = { 'User-Agent': USER_AGENT };
|
|
452
|
-
if (config.token) {
|
|
453
|
-
requestHeaders.Authorization = `Bearer ${config.token}`;
|
|
454
|
-
}
|
|
455
|
-
const lockPath = global
|
|
456
|
-
? path.join(resolvedHome, '.tank', 'skills.lock')
|
|
457
|
-
: path.join(directory, 'skills.lock');
|
|
458
|
-
const skillsJsonPath = path.join(directory, 'skills.json');
|
|
459
|
-
if (fs.existsSync(lockPath)) {
|
|
460
|
-
return installFromLockfile({ directory, configDir, global, homedir });
|
|
461
|
-
}
|
|
462
|
-
if (global) {
|
|
463
|
-
logger.info('No skills.lock found — nothing to install');
|
|
464
|
-
return;
|
|
465
|
-
}
|
|
466
|
-
if (!fs.existsSync(skillsJsonPath)) {
|
|
467
|
-
logger.info('No skills.json found — nothing to install');
|
|
468
|
-
return;
|
|
469
|
-
}
|
|
470
|
-
const skillsJson = readSkillsJson(skillsJsonPath);
|
|
471
|
-
const skills = (skillsJson.skills ?? {});
|
|
472
|
-
const skillEntries = Object.entries(skills);
|
|
473
|
-
if (skillEntries.length === 0) {
|
|
474
|
-
logger.info('No skills defined in skills.json');
|
|
475
|
-
return;
|
|
476
|
-
}
|
|
477
|
-
const spinner = ora('Resolving dependency graph...').start();
|
|
478
|
-
try {
|
|
479
|
-
const rootDependencies = {};
|
|
480
|
-
for (const [skillName, range] of skillEntries) {
|
|
481
|
-
if (typeof range === 'string') {
|
|
482
|
-
rootDependencies[skillName] = range;
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
const fetcher = createRegistryFetcher(config.registry, requestHeaders);
|
|
486
|
-
const resolvedGraph = await resolveDependencyTree(rootDependencies, fetcher);
|
|
487
|
-
const resolvedNodes = getResolvedNodesInOrder(resolvedGraph.nodes, resolvedGraph.installOrder);
|
|
488
|
-
const lock = { lockfileVersion: LOCKFILE_VERSION, skills: {} };
|
|
489
|
-
const projectPermissions = skillsJson.permissions;
|
|
490
|
-
const auditMinScore = skillsJson.audit?.min_score;
|
|
491
|
-
await executeInstallPipeline({
|
|
492
|
-
directory,
|
|
493
|
-
configDir,
|
|
494
|
-
global,
|
|
495
|
-
homedir,
|
|
496
|
-
resolvedHome,
|
|
497
|
-
lock,
|
|
498
|
-
lockPath,
|
|
499
|
-
resolvedNodes,
|
|
500
|
-
nodesToInstall: resolvedNodes,
|
|
501
|
-
rootSkillNames: skillEntries.map(([skillName]) => skillName),
|
|
502
|
-
projectPermissions,
|
|
503
|
-
auditMinScore,
|
|
504
|
-
spinner,
|
|
505
|
-
});
|
|
506
|
-
spinner.succeed(`Installed ${skillEntries.length} root skill${skillEntries.length === 1 ? '' : 's'}`);
|
|
507
|
-
}
|
|
508
|
-
catch (err) {
|
|
509
|
-
spinner.fail('Install failed');
|
|
510
|
-
throw err;
|
|
511
|
-
}
|
|
512
|
-
}
|
|
513
|
-
function buildIntegrity(buffer) {
|
|
514
|
-
const hash = crypto.createHash('sha512').update(buffer).digest('base64');
|
|
515
|
-
return `sha512-${hash}`;
|
|
516
|
-
}
|
|
517
|
-
//# sourceMappingURL=install.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/link.d.ts
DELETED
package/dist/commands/link.js
DELETED
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import os from 'node:os';
|
|
4
|
-
import { detectInstalledAgents, getGlobalAgentSkillsDir } from '../lib/agents.js';
|
|
5
|
-
import { linkSkillToAgents } from '../lib/linker.js';
|
|
6
|
-
import { prepareAgentSkillDir, hasFrontmatter } from '../lib/frontmatter.js';
|
|
7
|
-
import { readGlobalLinks } from '../lib/links.js';
|
|
8
|
-
import { logger } from '../lib/logger.js';
|
|
9
|
-
export async function linkCommand(options = {}) {
|
|
10
|
-
const workDir = options.directory ?? process.cwd();
|
|
11
|
-
const homedir = options.homedir ?? os.homedir();
|
|
12
|
-
const skillsJsonPath = path.join(workDir, 'skills.json');
|
|
13
|
-
if (!fs.existsSync(skillsJsonPath)) {
|
|
14
|
-
throw new Error('No skills.json found. Run this command from a skill directory.');
|
|
15
|
-
}
|
|
16
|
-
let skillsJson;
|
|
17
|
-
try {
|
|
18
|
-
const raw = fs.readFileSync(skillsJsonPath, 'utf-8');
|
|
19
|
-
skillsJson = JSON.parse(raw);
|
|
20
|
-
}
|
|
21
|
-
catch {
|
|
22
|
-
throw new Error('Failed to read or parse skills.json');
|
|
23
|
-
}
|
|
24
|
-
const skillName = skillsJson.name;
|
|
25
|
-
if (typeof skillName !== 'string' || skillName.trim().length === 0) {
|
|
26
|
-
throw new Error("Missing 'name' in skills.json");
|
|
27
|
-
}
|
|
28
|
-
const description = typeof skillsJson.description === 'string'
|
|
29
|
-
? skillsJson.description
|
|
30
|
-
: undefined;
|
|
31
|
-
const agents = detectInstalledAgents(options.homedir);
|
|
32
|
-
if (agents.length === 0) {
|
|
33
|
-
logger.info('No AI agents detected. Skills linked to agents will be available once agents are installed.');
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
const skillMdPath = path.join(workDir, 'SKILL.md');
|
|
37
|
-
let sourceDir = workDir;
|
|
38
|
-
if (fs.existsSync(skillMdPath)) {
|
|
39
|
-
const content = fs.readFileSync(skillMdPath, 'utf-8');
|
|
40
|
-
if (!hasFrontmatter(content)) {
|
|
41
|
-
sourceDir = prepareAgentSkillDir({
|
|
42
|
-
skillName,
|
|
43
|
-
extractDir: workDir,
|
|
44
|
-
agentSkillsBaseDir: getGlobalAgentSkillsDir(homedir),
|
|
45
|
-
description,
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
sourceDir = prepareAgentSkillDir({
|
|
51
|
-
skillName,
|
|
52
|
-
extractDir: workDir,
|
|
53
|
-
agentSkillsBaseDir: getGlobalAgentSkillsDir(homedir),
|
|
54
|
-
description,
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
void readGlobalLinks(homedir);
|
|
58
|
-
const result = linkSkillToAgents({
|
|
59
|
-
skillName,
|
|
60
|
-
sourceDir,
|
|
61
|
-
linksDir: path.join(homedir, '.tank'),
|
|
62
|
-
source: 'dev',
|
|
63
|
-
homedir: options.homedir,
|
|
64
|
-
});
|
|
65
|
-
const agentNames = new Map(agents.map((agent) => [agent.id, agent.name]));
|
|
66
|
-
for (const agentId of result.linked) {
|
|
67
|
-
logger.success(agentNames.get(agentId) ?? agentId);
|
|
68
|
-
}
|
|
69
|
-
for (const agentId of result.skipped) {
|
|
70
|
-
const name = agentNames.get(agentId) ?? agentId;
|
|
71
|
-
logger.warn(`- ${name} (already linked)`);
|
|
72
|
-
}
|
|
73
|
-
for (const failure of result.failed) {
|
|
74
|
-
const name = agentNames.get(failure.agentId) ?? failure.agentId;
|
|
75
|
-
logger.error(`${name}: ${failure.error}`);
|
|
76
|
-
}
|
|
77
|
-
logger.success(`Linked ${skillName} to ${result.linked.length} agent(s)`);
|
|
78
|
-
}
|
|
79
|
-
//# sourceMappingURL=link.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/commands/link.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/login.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export interface LoginOptions {
|
|
2
|
-
configDir?: string;
|
|
3
|
-
timeout?: number;
|
|
4
|
-
pollInterval?: number;
|
|
5
|
-
}
|
|
6
|
-
/**
|
|
7
|
-
* Start the CLI login flow:
|
|
8
|
-
* 1. Generate random state
|
|
9
|
-
* 2. POST /api/v1/cli-auth/start → get authUrl + sessionCode
|
|
10
|
-
* 3. Open browser to authUrl
|
|
11
|
-
* 4. Poll POST /api/v1/cli-auth/exchange until authorized or timeout
|
|
12
|
-
* 5. Write token + user to config
|
|
13
|
-
*/
|
|
14
|
-
export declare function loginCommand(options?: LoginOptions): Promise<void>;
|