@tankpkg/cli 0.6.3 → 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.
Files changed (111) hide show
  1. package/dist/bin/tank.d.ts +1 -2
  2. package/dist/bin/tank.js +3423 -294
  3. package/dist/bin/tank.js.map +1 -1
  4. package/dist/debug-logger-BjGZcIhg.js +140 -0
  5. package/dist/debug-logger-BjGZcIhg.js.map +1 -0
  6. package/dist/index.d.ts +59 -5
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +83 -4
  9. package/dist/index.js.map +1 -1
  10. package/dist/package.json +46 -0
  11. package/package.json +18 -12
  12. package/LICENSE +0 -21
  13. package/dist/commands/audit.d.ts +0 -5
  14. package/dist/commands/audit.js +0 -185
  15. package/dist/commands/audit.js.map +0 -1
  16. package/dist/commands/doctor.d.ts +0 -5
  17. package/dist/commands/doctor.js +0 -164
  18. package/dist/commands/doctor.js.map +0 -1
  19. package/dist/commands/info.d.ts +0 -5
  20. package/dist/commands/info.js +0 -102
  21. package/dist/commands/info.js.map +0 -1
  22. package/dist/commands/init.d.ts +0 -11
  23. package/dist/commands/init.js +0 -140
  24. package/dist/commands/init.js.map +0 -1
  25. package/dist/commands/install.d.ts +0 -24
  26. package/dist/commands/install.js +0 -517
  27. package/dist/commands/install.js.map +0 -1
  28. package/dist/commands/link.d.ts +0 -5
  29. package/dist/commands/link.js +0 -79
  30. package/dist/commands/link.js.map +0 -1
  31. package/dist/commands/login.d.ts +0 -14
  32. package/dist/commands/login.js +0 -87
  33. package/dist/commands/login.js.map +0 -1
  34. package/dist/commands/logout.d.ts +0 -9
  35. package/dist/commands/logout.js +0 -20
  36. package/dist/commands/logout.js.map +0 -1
  37. package/dist/commands/permissions.d.ts +0 -4
  38. package/dist/commands/permissions.js +0 -199
  39. package/dist/commands/permissions.js.map +0 -1
  40. package/dist/commands/publish.d.ts +0 -25
  41. package/dist/commands/publish.js +0 -166
  42. package/dist/commands/publish.js.map +0 -1
  43. package/dist/commands/remove.d.ts +0 -7
  44. package/dist/commands/remove.js +0 -163
  45. package/dist/commands/remove.js.map +0 -1
  46. package/dist/commands/scan.d.ts +0 -5
  47. package/dist/commands/scan.js +0 -169
  48. package/dist/commands/scan.js.map +0 -1
  49. package/dist/commands/search.d.ts +0 -5
  50. package/dist/commands/search.js +0 -67
  51. package/dist/commands/search.js.map +0 -1
  52. package/dist/commands/unlink.d.ts +0 -5
  53. package/dist/commands/unlink.js +0 -42
  54. package/dist/commands/unlink.js.map +0 -1
  55. package/dist/commands/update.d.ts +0 -8
  56. package/dist/commands/update.js +0 -332
  57. package/dist/commands/update.js.map +0 -1
  58. package/dist/commands/upgrade.d.ts +0 -6
  59. package/dist/commands/upgrade.js +0 -107
  60. package/dist/commands/upgrade.js.map +0 -1
  61. package/dist/commands/verify.d.ts +0 -22
  62. package/dist/commands/verify.js +0 -63
  63. package/dist/commands/verify.js.map +0 -1
  64. package/dist/commands/whoami.d.ts +0 -4
  65. package/dist/commands/whoami.js +0 -57
  66. package/dist/commands/whoami.js.map +0 -1
  67. package/dist/lib/agents.d.ts +0 -19
  68. package/dist/lib/agents.js +0 -84
  69. package/dist/lib/agents.js.map +0 -1
  70. package/dist/lib/api-client.d.ts +0 -14
  71. package/dist/lib/api-client.js +0 -63
  72. package/dist/lib/api-client.js.map +0 -1
  73. package/dist/lib/config.d.ts +0 -29
  74. package/dist/lib/config.js +0 -66
  75. package/dist/lib/config.js.map +0 -1
  76. package/dist/lib/debug-logger.d.ts +0 -9
  77. package/dist/lib/debug-logger.js +0 -77
  78. package/dist/lib/debug-logger.js.map +0 -1
  79. package/dist/lib/dependency-resolver.d.ts +0 -51
  80. package/dist/lib/dependency-resolver.js +0 -181
  81. package/dist/lib/dependency-resolver.js.map +0 -1
  82. package/dist/lib/frontmatter.d.ts +0 -11
  83. package/dist/lib/frontmatter.js +0 -89
  84. package/dist/lib/frontmatter.js.map +0 -1
  85. package/dist/lib/install-pipeline.d.ts +0 -23
  86. package/dist/lib/install-pipeline.js +0 -181
  87. package/dist/lib/install-pipeline.js.map +0 -1
  88. package/dist/lib/linker.d.ts +0 -45
  89. package/dist/lib/linker.js +0 -137
  90. package/dist/lib/linker.js.map +0 -1
  91. package/dist/lib/links.d.ts +0 -20
  92. package/dist/lib/links.js +0 -105
  93. package/dist/lib/links.js.map +0 -1
  94. package/dist/lib/lockfile.d.ts +0 -24
  95. package/dist/lib/lockfile.js +0 -135
  96. package/dist/lib/lockfile.js.map +0 -1
  97. package/dist/lib/logger.d.ts +0 -6
  98. package/dist/lib/logger.js +0 -8
  99. package/dist/lib/logger.js.map +0 -1
  100. package/dist/lib/packer.d.ts +0 -41
  101. package/dist/lib/packer.js +0 -284
  102. package/dist/lib/packer.js.map +0 -1
  103. package/dist/lib/permission-checker.d.ts +0 -16
  104. package/dist/lib/permission-checker.js +0 -78
  105. package/dist/lib/permission-checker.js.map +0 -1
  106. package/dist/lib/upgrade-check.d.ts +0 -1
  107. package/dist/lib/upgrade-check.js +0 -59
  108. package/dist/lib/upgrade-check.js.map +0 -1
  109. package/dist/version.d.ts +0 -2
  110. package/dist/version.js +0 -4
  111. package/dist/version.js.map +0 -1
@@ -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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"}
@@ -1,5 +0,0 @@
1
- export interface LinkOptions {
2
- directory?: string;
3
- homedir?: string;
4
- }
5
- export declare function linkCommand(options?: LinkOptions): Promise<void>;
@@ -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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"}
@@ -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>;