@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.
- 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 -107
- 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 -84
- 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/update.js
DELETED
|
@@ -1,332 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import os from 'node:os';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import { resolve } from '@tank/shared';
|
|
5
|
-
import { getConfig } from '../lib/config.js';
|
|
6
|
-
import { logger } from '../lib/logger.js';
|
|
7
|
-
import { getGlobalSkillsDir } from '../lib/agents.js';
|
|
8
|
-
import { installCommand } from './install.js';
|
|
9
|
-
import { USER_AGENT } from '../version.js';
|
|
10
|
-
const VERSION_CHECK_CONCURRENCY = 8;
|
|
11
|
-
export async function updateCommand(options) {
|
|
12
|
-
const { name, directory = process.cwd(), configDir, global = false, homedir, } = options;
|
|
13
|
-
if (global) {
|
|
14
|
-
if (name) {
|
|
15
|
-
await updateSingleGlobal(name, configDir, homedir);
|
|
16
|
-
}
|
|
17
|
-
else {
|
|
18
|
-
await updateAllGlobal(configDir, homedir);
|
|
19
|
-
}
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
// 1. Read skills.json
|
|
23
|
-
const skillsJsonPath = path.join(directory, 'skills.json');
|
|
24
|
-
if (!fs.existsSync(skillsJsonPath)) {
|
|
25
|
-
throw new Error(`No skills.json found in ${directory}. Run: tank init`);
|
|
26
|
-
}
|
|
27
|
-
let skillsJson;
|
|
28
|
-
try {
|
|
29
|
-
const raw = fs.readFileSync(skillsJsonPath, 'utf-8');
|
|
30
|
-
skillsJson = JSON.parse(raw);
|
|
31
|
-
}
|
|
32
|
-
catch {
|
|
33
|
-
throw new Error('Failed to read or parse skills.json');
|
|
34
|
-
}
|
|
35
|
-
const skills = (skillsJson.skills ?? {});
|
|
36
|
-
if (name) {
|
|
37
|
-
// Update single skill
|
|
38
|
-
await updateSingle(name, skills, directory, configDir, global, homedir);
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
// Update all skills
|
|
42
|
-
await updateAll(skills, directory, configDir, global, homedir);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
function parseLockKey(key) {
|
|
46
|
-
const lastAt = key.lastIndexOf('@');
|
|
47
|
-
if (lastAt <= 0)
|
|
48
|
-
return null;
|
|
49
|
-
return { name: key.slice(0, lastAt), version: key.slice(lastAt + 1) };
|
|
50
|
-
}
|
|
51
|
-
function readLockfile(lockPath) {
|
|
52
|
-
if (!fs.existsSync(lockPath)) {
|
|
53
|
-
return null;
|
|
54
|
-
}
|
|
55
|
-
try {
|
|
56
|
-
const raw = fs.readFileSync(lockPath, 'utf-8');
|
|
57
|
-
return JSON.parse(raw);
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
return null;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
function readLockfileStrict(lockPath) {
|
|
64
|
-
if (!fs.existsSync(lockPath)) {
|
|
65
|
-
throw new Error(`Global skills.lock not found at ${lockPath}`);
|
|
66
|
-
}
|
|
67
|
-
try {
|
|
68
|
-
const raw = fs.readFileSync(lockPath, 'utf-8');
|
|
69
|
-
return JSON.parse(raw);
|
|
70
|
-
}
|
|
71
|
-
catch {
|
|
72
|
-
throw new Error('Failed to read or parse global skills.lock');
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
function getGlobalLockPath(homedir) {
|
|
76
|
-
const globalSkillsDir = getGlobalSkillsDir(homedir ?? os.homedir());
|
|
77
|
-
return path.join(path.dirname(globalSkillsDir), 'skills.lock');
|
|
78
|
-
}
|
|
79
|
-
async function fetchAvailableVersions(name, registry, headers) {
|
|
80
|
-
const encodedName = encodeURIComponent(name);
|
|
81
|
-
const versionsUrl = `${registry}/api/v1/skills/${encodedName}/versions`;
|
|
82
|
-
let versionsRes;
|
|
83
|
-
try {
|
|
84
|
-
versionsRes = await fetch(versionsUrl, { headers });
|
|
85
|
-
}
|
|
86
|
-
catch (err) {
|
|
87
|
-
throw new Error(`Network error fetching versions for ${name}: ${err instanceof Error ? err.message : String(err)}`);
|
|
88
|
-
}
|
|
89
|
-
if (!versionsRes.ok) {
|
|
90
|
-
if (versionsRes.status === 404) {
|
|
91
|
-
throw new Error(`Skill not found in registry: ${name}`);
|
|
92
|
-
}
|
|
93
|
-
const body = await versionsRes.json().catch(() => null);
|
|
94
|
-
throw new Error(body?.error ?? versionsRes.statusText);
|
|
95
|
-
}
|
|
96
|
-
const versionsData = await versionsRes.json();
|
|
97
|
-
return versionsData.versions.map((v) => v.version);
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Deduplicate lockfile entries by skill name.
|
|
101
|
-
* When multiple versions of the same skill exist in the lockfile (e.g. from
|
|
102
|
-
* transitive dependencies), keeps only the highest version per skill name.
|
|
103
|
-
*/
|
|
104
|
-
function deduplicateByName(entries) {
|
|
105
|
-
const versionsByName = new Map();
|
|
106
|
-
for (const key of entries) {
|
|
107
|
-
const parsed = parseLockKey(key);
|
|
108
|
-
if (!parsed)
|
|
109
|
-
continue;
|
|
110
|
-
const versions = versionsByName.get(parsed.name) ?? [];
|
|
111
|
-
versions.push(parsed.version);
|
|
112
|
-
versionsByName.set(parsed.name, versions);
|
|
113
|
-
}
|
|
114
|
-
const latestByName = new Map();
|
|
115
|
-
for (const [name, versions] of versionsByName) {
|
|
116
|
-
const latest = resolve('*', versions);
|
|
117
|
-
if (latest)
|
|
118
|
-
latestByName.set(name, latest);
|
|
119
|
-
}
|
|
120
|
-
return latestByName;
|
|
121
|
-
}
|
|
122
|
-
async function fetchVersionsBatch(skillNames, registry, headers) {
|
|
123
|
-
const results = new Map();
|
|
124
|
-
for (let i = 0; i < skillNames.length; i += VERSION_CHECK_CONCURRENCY) {
|
|
125
|
-
const batch = skillNames.slice(i, i + VERSION_CHECK_CONCURRENCY);
|
|
126
|
-
const settled = await Promise.allSettled(batch.map(async (name) => {
|
|
127
|
-
const versions = await fetchAvailableVersions(name, registry, headers);
|
|
128
|
-
return { name, versions };
|
|
129
|
-
}));
|
|
130
|
-
for (const result of settled) {
|
|
131
|
-
if (result.status === 'fulfilled') {
|
|
132
|
-
results.set(result.value.name, result.value.versions);
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
throw result.reason;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
return results;
|
|
140
|
-
}
|
|
141
|
-
async function updateSingle(name, skills, directory, configDir, global = false, homedir) {
|
|
142
|
-
const versionRange = skills[name];
|
|
143
|
-
if (!versionRange) {
|
|
144
|
-
throw new Error(`Skill "${name}" is not installed (not found in skills.json)`);
|
|
145
|
-
}
|
|
146
|
-
const config = getConfig(configDir);
|
|
147
|
-
const requestHeaders = { 'User-Agent': USER_AGENT };
|
|
148
|
-
if (config.token) {
|
|
149
|
-
requestHeaders.Authorization = `Bearer ${config.token}`;
|
|
150
|
-
}
|
|
151
|
-
const availableVersions = await fetchAvailableVersions(name, config.registry, requestHeaders);
|
|
152
|
-
const resolved = resolve(versionRange, availableVersions);
|
|
153
|
-
if (!resolved) {
|
|
154
|
-
throw new Error(`No version of ${name} satisfies range "${versionRange}". Available: ${availableVersions.join(', ')}`);
|
|
155
|
-
}
|
|
156
|
-
const lockPath = global
|
|
157
|
-
? getGlobalLockPath(homedir)
|
|
158
|
-
: path.join(directory, 'skills.lock');
|
|
159
|
-
let currentVersion = null;
|
|
160
|
-
const lock = readLockfile(lockPath);
|
|
161
|
-
if (lock) {
|
|
162
|
-
for (const key of Object.keys(lock.skills)) {
|
|
163
|
-
const parsed = parseLockKey(key);
|
|
164
|
-
if (!parsed)
|
|
165
|
-
continue;
|
|
166
|
-
if (parsed.name === name) {
|
|
167
|
-
currentVersion = parsed.version;
|
|
168
|
-
break;
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
if (resolved === currentVersion) {
|
|
173
|
-
logger.info(`Already at latest: ${name}@${resolved}`);
|
|
174
|
-
return;
|
|
175
|
-
}
|
|
176
|
-
await installCommand({
|
|
177
|
-
name,
|
|
178
|
-
versionRange,
|
|
179
|
-
directory,
|
|
180
|
-
configDir,
|
|
181
|
-
global,
|
|
182
|
-
homedir,
|
|
183
|
-
});
|
|
184
|
-
logger.success(`Updated ${name} to ${resolved}`);
|
|
185
|
-
}
|
|
186
|
-
async function updateAll(skills, directory, configDir, global = false, homedir) {
|
|
187
|
-
const skillEntries = Object.entries(skills);
|
|
188
|
-
if (skillEntries.length === 0) {
|
|
189
|
-
logger.info('No skills defined in skills.json');
|
|
190
|
-
return;
|
|
191
|
-
}
|
|
192
|
-
const config = getConfig(configDir);
|
|
193
|
-
const requestHeaders = { 'User-Agent': USER_AGENT };
|
|
194
|
-
if (config.token) {
|
|
195
|
-
requestHeaders.Authorization = `Bearer ${config.token}`;
|
|
196
|
-
}
|
|
197
|
-
const lockPath = global
|
|
198
|
-
? getGlobalLockPath(homedir)
|
|
199
|
-
: path.join(directory, 'skills.lock');
|
|
200
|
-
const lock = readLockfile(lockPath);
|
|
201
|
-
const currentVersionByName = new Map();
|
|
202
|
-
if (lock) {
|
|
203
|
-
for (const key of Object.keys(lock.skills)) {
|
|
204
|
-
const parsed = parseLockKey(key);
|
|
205
|
-
if (!parsed)
|
|
206
|
-
continue;
|
|
207
|
-
const existing = currentVersionByName.get(parsed.name);
|
|
208
|
-
if (!existing) {
|
|
209
|
-
currentVersionByName.set(parsed.name, parsed.version);
|
|
210
|
-
}
|
|
211
|
-
else {
|
|
212
|
-
const higher = resolve('*', [existing, parsed.version]);
|
|
213
|
-
if (higher)
|
|
214
|
-
currentVersionByName.set(parsed.name, higher);
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
const skillNames = skillEntries.map(([name]) => name);
|
|
219
|
-
const allVersions = await fetchVersionsBatch(skillNames, config.registry, requestHeaders);
|
|
220
|
-
const toUpdate = [];
|
|
221
|
-
for (const [name, versionRange] of skillEntries) {
|
|
222
|
-
const availableVersions = allVersions.get(name);
|
|
223
|
-
if (!availableVersions)
|
|
224
|
-
continue;
|
|
225
|
-
const resolved = resolve(versionRange, availableVersions);
|
|
226
|
-
if (!resolved)
|
|
227
|
-
continue;
|
|
228
|
-
const currentVersion = currentVersionByName.get(name) ?? null;
|
|
229
|
-
if (resolved === currentVersion)
|
|
230
|
-
continue;
|
|
231
|
-
toUpdate.push({ name, versionRange });
|
|
232
|
-
}
|
|
233
|
-
if (toUpdate.length === 0) {
|
|
234
|
-
logger.info('All skills up to date');
|
|
235
|
-
return;
|
|
236
|
-
}
|
|
237
|
-
for (const { name, versionRange } of toUpdate) {
|
|
238
|
-
await installCommand({
|
|
239
|
-
name,
|
|
240
|
-
versionRange,
|
|
241
|
-
directory,
|
|
242
|
-
configDir,
|
|
243
|
-
global,
|
|
244
|
-
homedir,
|
|
245
|
-
});
|
|
246
|
-
}
|
|
247
|
-
logger.success(`Updated ${toUpdate.length} skill${toUpdate.length === 1 ? '' : 's'}`);
|
|
248
|
-
}
|
|
249
|
-
async function updateSingleGlobal(name, configDir, homedir) {
|
|
250
|
-
const lockPath = getGlobalLockPath(homedir);
|
|
251
|
-
const lock = readLockfileStrict(lockPath);
|
|
252
|
-
let currentVersion = null;
|
|
253
|
-
for (const key of Object.keys(lock.skills)) {
|
|
254
|
-
const parsed = parseLockKey(key);
|
|
255
|
-
if (!parsed)
|
|
256
|
-
continue;
|
|
257
|
-
if (parsed.name === name) {
|
|
258
|
-
currentVersion = parsed.version;
|
|
259
|
-
break;
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
if (!currentVersion) {
|
|
263
|
-
throw new Error(`Skill "${name}" is not installed globally (not found in skills.lock)`);
|
|
264
|
-
}
|
|
265
|
-
const config = getConfig(configDir);
|
|
266
|
-
const requestHeaders = { 'User-Agent': USER_AGENT };
|
|
267
|
-
if (config.token) {
|
|
268
|
-
requestHeaders.Authorization = `Bearer ${config.token}`;
|
|
269
|
-
}
|
|
270
|
-
const availableVersions = await fetchAvailableVersions(name, config.registry, requestHeaders);
|
|
271
|
-
const versionRange = `>=${currentVersion}`;
|
|
272
|
-
const resolved = resolve(versionRange, availableVersions);
|
|
273
|
-
if (!resolved) {
|
|
274
|
-
throw new Error(`No version of ${name} satisfies range "${versionRange}". Available: ${availableVersions.join(', ')}`);
|
|
275
|
-
}
|
|
276
|
-
if (resolved === currentVersion) {
|
|
277
|
-
logger.info(`Already at latest: ${name}@${resolved}`);
|
|
278
|
-
return;
|
|
279
|
-
}
|
|
280
|
-
await installCommand({
|
|
281
|
-
name,
|
|
282
|
-
versionRange,
|
|
283
|
-
global: true,
|
|
284
|
-
homedir,
|
|
285
|
-
configDir,
|
|
286
|
-
});
|
|
287
|
-
logger.success(`Updated ${name} to ${resolved}`);
|
|
288
|
-
}
|
|
289
|
-
async function updateAllGlobal(configDir, homedir) {
|
|
290
|
-
const lockPath = getGlobalLockPath(homedir);
|
|
291
|
-
const lock = readLockfileStrict(lockPath);
|
|
292
|
-
const entries = Object.keys(lock.skills);
|
|
293
|
-
if (entries.length === 0) {
|
|
294
|
-
logger.info('No skills defined in global skills.lock');
|
|
295
|
-
return;
|
|
296
|
-
}
|
|
297
|
-
const config = getConfig(configDir);
|
|
298
|
-
const requestHeaders = { 'User-Agent': USER_AGENT };
|
|
299
|
-
if (config.token) {
|
|
300
|
-
requestHeaders.Authorization = `Bearer ${config.token}`;
|
|
301
|
-
}
|
|
302
|
-
const latestByName = deduplicateByName(entries);
|
|
303
|
-
const skillNames = Array.from(latestByName.keys());
|
|
304
|
-
const allVersions = await fetchVersionsBatch(skillNames, config.registry, requestHeaders);
|
|
305
|
-
const toUpdate = [];
|
|
306
|
-
for (const [name, currentVersion] of latestByName) {
|
|
307
|
-
const availableVersions = allVersions.get(name);
|
|
308
|
-
if (!availableVersions)
|
|
309
|
-
continue;
|
|
310
|
-
const resolved = resolve('*', availableVersions);
|
|
311
|
-
if (!resolved)
|
|
312
|
-
continue;
|
|
313
|
-
if (resolved === currentVersion)
|
|
314
|
-
continue;
|
|
315
|
-
toUpdate.push(name);
|
|
316
|
-
}
|
|
317
|
-
if (toUpdate.length === 0) {
|
|
318
|
-
logger.info('All skills up to date');
|
|
319
|
-
return;
|
|
320
|
-
}
|
|
321
|
-
for (const name of toUpdate) {
|
|
322
|
-
await installCommand({
|
|
323
|
-
name,
|
|
324
|
-
versionRange: '*',
|
|
325
|
-
global: true,
|
|
326
|
-
homedir,
|
|
327
|
-
configDir,
|
|
328
|
-
});
|
|
329
|
-
}
|
|
330
|
-
logger.success(`Updated ${toUpdate.length} skill${toUpdate.length === 1 ? '' : 's'}`);
|
|
331
|
-
}
|
|
332
|
-
//# sourceMappingURL=update.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/upgrade.js
DELETED
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import os from 'node:os';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import crypto from 'node:crypto';
|
|
5
|
-
import chalk from 'chalk';
|
|
6
|
-
import { resolve } from '@tank/shared';
|
|
7
|
-
import { VERSION, USER_AGENT } from '../version.js';
|
|
8
|
-
function isNewerVersion(candidateVersion, currentVersion) {
|
|
9
|
-
if (candidateVersion === currentVersion) {
|
|
10
|
-
return false;
|
|
11
|
-
}
|
|
12
|
-
return resolve('*', [candidateVersion, currentVersion]) === candidateVersion;
|
|
13
|
-
}
|
|
14
|
-
function resolveCurrentBinary() {
|
|
15
|
-
try {
|
|
16
|
-
return fs.realpathSync(process.argv[1]);
|
|
17
|
-
}
|
|
18
|
-
catch {
|
|
19
|
-
return process.execPath;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
export async function upgradeCommand(opts) {
|
|
23
|
-
const currentBinaryPath = resolveCurrentBinary();
|
|
24
|
-
if (currentBinaryPath.includes('/Cellar/') || currentBinaryPath.includes('/homebrew/')) {
|
|
25
|
-
console.log(chalk.yellow('Tank was installed via Homebrew. Run `brew upgrade tank` instead.'));
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
let targetVersion;
|
|
29
|
-
if (opts?.version) {
|
|
30
|
-
targetVersion = opts.version;
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
const res = await fetch('https://api.github.com/repos/tankpkg/tank/releases/latest', {
|
|
34
|
-
headers: { 'User-Agent': USER_AGENT },
|
|
35
|
-
});
|
|
36
|
-
if (!res.ok) {
|
|
37
|
-
throw new Error(`Failed to fetch latest release: ${res.status} ${res.statusText}`);
|
|
38
|
-
}
|
|
39
|
-
const data = (await res.json());
|
|
40
|
-
targetVersion = data.tag_name.replace(/^v/, '');
|
|
41
|
-
}
|
|
42
|
-
if (!isNewerVersion(targetVersion, VERSION) && !opts?.force) {
|
|
43
|
-
console.log(chalk.green(`✓ Already on latest version: ${VERSION}`));
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
const platform = process.platform === 'darwin' ? 'darwin' : 'linux';
|
|
47
|
-
const arch = process.arch === 'arm64' ? 'arm64' : 'x64';
|
|
48
|
-
const binaryName = `tank-${platform}-${arch}`;
|
|
49
|
-
if (opts?.dryRun) {
|
|
50
|
-
console.log(`Would upgrade tank ${VERSION} → ${targetVersion}`);
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
console.log(chalk.cyan(`Upgrading tank ${VERSION} → ${targetVersion}...`));
|
|
54
|
-
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'tank-upgrade-'));
|
|
55
|
-
try {
|
|
56
|
-
const binaryUrl = `https://github.com/tankpkg/tank/releases/download/v${targetVersion}/${binaryName}`;
|
|
57
|
-
const tmpBin = path.join(tmpDir, binaryName);
|
|
58
|
-
const binRes = await fetch(binaryUrl, {
|
|
59
|
-
headers: { 'User-Agent': USER_AGENT },
|
|
60
|
-
});
|
|
61
|
-
if (!binRes.ok) {
|
|
62
|
-
throw new Error(`Failed to download binary: ${binRes.status} ${binRes.statusText}`);
|
|
63
|
-
}
|
|
64
|
-
if (!binRes.body) {
|
|
65
|
-
throw new Error('Empty response body when downloading binary');
|
|
66
|
-
}
|
|
67
|
-
const binBuffer = Buffer.from(await binRes.arrayBuffer());
|
|
68
|
-
fs.writeFileSync(tmpBin, binBuffer);
|
|
69
|
-
const sumsUrl = `https://github.com/tankpkg/tank/releases/download/v${targetVersion}/SHA256SUMS`;
|
|
70
|
-
const sumsRes = await fetch(sumsUrl, {
|
|
71
|
-
headers: { 'User-Agent': USER_AGENT },
|
|
72
|
-
});
|
|
73
|
-
if (!sumsRes.ok) {
|
|
74
|
-
throw new Error(`Failed to download SHA256SUMS: ${sumsRes.status} ${sumsRes.statusText}`);
|
|
75
|
-
}
|
|
76
|
-
const sumsText = await sumsRes.text();
|
|
77
|
-
let expectedHash;
|
|
78
|
-
for (const line of sumsText.split('\n')) {
|
|
79
|
-
const trimmed = line.trim();
|
|
80
|
-
if (!trimmed)
|
|
81
|
-
continue;
|
|
82
|
-
const parts = trimmed.split(/\s+/);
|
|
83
|
-
if (parts.length >= 2 && parts[1] === binaryName) {
|
|
84
|
-
expectedHash = parts[0];
|
|
85
|
-
break;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
if (!expectedHash) {
|
|
89
|
-
throw new Error(`No checksum found for ${binaryName} in SHA256SUMS`);
|
|
90
|
-
}
|
|
91
|
-
const fileBuffer = fs.readFileSync(tmpBin);
|
|
92
|
-
const actualHash = crypto.createHash('sha256').update(fileBuffer).digest('hex');
|
|
93
|
-
if (actualHash !== expectedHash) {
|
|
94
|
-
console.log(chalk.red('Checksum mismatch. Aborting for security.'));
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
fs.chmodSync(tmpBin, 0o755);
|
|
98
|
-
fs.copyFileSync(tmpBin, currentBinaryPath);
|
|
99
|
-
fs.chmodSync(currentBinaryPath, 0o755);
|
|
100
|
-
console.log(chalk.green(`✓ Upgraded tank ${VERSION} → ${targetVersion}`));
|
|
101
|
-
console.log(chalk.gray(`Release notes: https://github.com/tankpkg/tank/releases/tag/v${targetVersion}`));
|
|
102
|
-
}
|
|
103
|
-
finally {
|
|
104
|
-
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
//# sourceMappingURL=upgrade.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAQpD,SAAS,cAAc,CAAC,gBAAwB,EAAE,cAAsB;IACtE,IAAI,gBAAgB,KAAK,cAAc,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC,KAAK,gBAAgB,CAAC;AAC/E,CAAC;AAED,SAAS,oBAAoB;IAC3B,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC,QAAQ,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAqB;IACxD,MAAM,iBAAiB,GAAG,oBAAoB,EAAE,CAAC;IACjD,IAAI,iBAAiB,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,iBAAiB,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACvF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mEAAmE,CAAC,CAAC,CAAC;QAC/F,OAAO;IACT,CAAC;IAED,IAAI,aAAqB,CAAC;IAE1B,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;QAClB,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC;IAC/B,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,2DAA2D,EAAE;YACnF,OAAO,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE;SACtC,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,mCAAmC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QACrF,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAyB,CAAC;QACxD,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gCAAgC,OAAO,EAAE,CAAC,CAAC,CAAC;QACpE,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;IACpE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IACxD,MAAM,UAAU,GAAG,QAAQ,QAAQ,IAAI,IAAI,EAAE,CAAC;IAE9C,IAAI,IAAI,EAAE,MAAM,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,MAAM,aAAa,EAAE,CAAC,CAAC;QAChE,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,OAAO,MAAM,aAAa,KAAK,CAAC,CAAC,CAAC;IAE3E,MAAM,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IAEvE,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,sDAAsD,aAAa,IAAI,UAAU,EAAE,CAAC;QACtG,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAE7C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;YACpC,OAAO,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE;SACtC,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QACtF,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QAC1D,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAEpC,MAAM,OAAO,GAAG,sDAAsD,aAAa,aAAa,CAAC;QACjG,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE;YACnC,OAAO,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE;SACtC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,kCAAkC,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QAC5F,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QAEtC,IAAI,YAAgC,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACxC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO;gBAAE,SAAS;YACvB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACnC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC;gBACjD,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACxB,MAAM;YACR,CAAC;QACH,CAAC;QACD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,yBAAyB,UAAU,gBAAgB,CAAC,CAAC;QACvE,CAAC;QAED,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEhF,IAAI,UAAU,KAAK,YAAY,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC,CAAC;YACpE,OAAO;QACT,CAAC;QAED,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAE5B,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;QAC3C,EAAE,CAAC,SAAS,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;QAEvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,mBAAmB,OAAO,MAAM,aAAa,EAAE,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gEAAgE,aAAa,EAAE,CAAC,CAAC,CAAC;IAC3G,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
export interface VerifyOptions {
|
|
2
|
-
directory?: string;
|
|
3
|
-
}
|
|
4
|
-
export interface VerifyResult {
|
|
5
|
-
valid: boolean;
|
|
6
|
-
mismatches: Array<{
|
|
7
|
-
key: string;
|
|
8
|
-
expected: string;
|
|
9
|
-
actual: string | null;
|
|
10
|
-
}>;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Verify that installed skills match the lockfile.
|
|
14
|
-
*
|
|
15
|
-
* For each entry in skills.lock:
|
|
16
|
-
* 1. Parse the skill name from the lock key
|
|
17
|
-
* 2. Check that the skill directory exists in .tank/skills/
|
|
18
|
-
* 3. Check that the directory is not empty
|
|
19
|
-
*
|
|
20
|
-
* Throws on failure (exit code 1). Prints success message on pass.
|
|
21
|
-
*/
|
|
22
|
-
export declare function verifyCommand(options?: VerifyOptions): Promise<void>;
|
package/dist/commands/verify.js
DELETED
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { readLockfile } from '../lib/lockfile.js';
|
|
4
|
-
import { logger } from '../lib/logger.js';
|
|
5
|
-
/**
|
|
6
|
-
* Verify that installed skills match the lockfile.
|
|
7
|
-
*
|
|
8
|
-
* For each entry in skills.lock:
|
|
9
|
-
* 1. Parse the skill name from the lock key
|
|
10
|
-
* 2. Check that the skill directory exists in .tank/skills/
|
|
11
|
-
* 3. Check that the directory is not empty
|
|
12
|
-
*
|
|
13
|
-
* Throws on failure (exit code 1). Prints success message on pass.
|
|
14
|
-
*/
|
|
15
|
-
export async function verifyCommand(options) {
|
|
16
|
-
const directory = options?.directory ?? process.cwd();
|
|
17
|
-
const lock = readLockfile(directory);
|
|
18
|
-
if (!lock) {
|
|
19
|
-
throw new Error(`No skills.lock found in ${directory}. Run: tank install`);
|
|
20
|
-
}
|
|
21
|
-
const entries = Object.entries(lock.skills);
|
|
22
|
-
if (entries.length === 0) {
|
|
23
|
-
logger.success('No skills to verify (lockfile is empty)');
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
26
|
-
const issues = [];
|
|
27
|
-
for (const [key] of entries) {
|
|
28
|
-
const skillName = parseLockKey(key);
|
|
29
|
-
const skillDir = getExtractDir(directory, skillName);
|
|
30
|
-
if (!fs.existsSync(skillDir)) {
|
|
31
|
-
issues.push(`${key}: directory missing at ${skillDir}`);
|
|
32
|
-
continue;
|
|
33
|
-
}
|
|
34
|
-
// Check directory is not empty
|
|
35
|
-
const contents = fs.readdirSync(skillDir);
|
|
36
|
-
if (contents.length === 0) {
|
|
37
|
-
issues.push(`${key}: directory exists but is empty`);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
if (issues.length > 0) {
|
|
41
|
-
for (const issue of issues) {
|
|
42
|
-
logger.error(issue);
|
|
43
|
-
}
|
|
44
|
-
throw new Error(`Verification failed: ${issues.length} issue${issues.length === 1 ? '' : 's'} found`);
|
|
45
|
-
}
|
|
46
|
-
const count = entries.length;
|
|
47
|
-
logger.success(`All ${count} skill${count === 1 ? '' : 's'} verified`);
|
|
48
|
-
}
|
|
49
|
-
function parseLockKey(key) {
|
|
50
|
-
const lastAt = key.lastIndexOf('@');
|
|
51
|
-
if (lastAt <= 0) {
|
|
52
|
-
throw new Error(`Invalid lockfile key: ${key}`);
|
|
53
|
-
}
|
|
54
|
-
return key.slice(0, lastAt);
|
|
55
|
-
}
|
|
56
|
-
function getExtractDir(projectDir, skillName) {
|
|
57
|
-
if (skillName.startsWith('@')) {
|
|
58
|
-
const [scope, name] = skillName.split('/');
|
|
59
|
-
return path.join(projectDir, '.tank', 'skills', scope, name);
|
|
60
|
-
}
|
|
61
|
-
return path.join(projectDir, '.tank', 'skills', skillName);
|
|
62
|
-
}
|
|
63
|
-
//# sourceMappingURL=verify.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/whoami.js
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { getConfig } from '../lib/config.js';
|
|
2
|
-
import { logger } from '../lib/logger.js';
|
|
3
|
-
import { USER_AGENT } from '../version.js';
|
|
4
|
-
export async function whoamiCommand(options = {}) {
|
|
5
|
-
const { configDir } = options;
|
|
6
|
-
const config = getConfig(configDir);
|
|
7
|
-
if (!config.token) {
|
|
8
|
-
logger.warn('Not logged in. Run: tank login');
|
|
9
|
-
return;
|
|
10
|
-
}
|
|
11
|
-
try {
|
|
12
|
-
const res = await fetch(`${config.registry}/api/v1/auth/whoami`, {
|
|
13
|
-
method: 'GET',
|
|
14
|
-
headers: {
|
|
15
|
-
'Authorization': `Bearer ${config.token}`,
|
|
16
|
-
'User-Agent': USER_AGENT,
|
|
17
|
-
},
|
|
18
|
-
});
|
|
19
|
-
if (res.status === 401) {
|
|
20
|
-
logger.error('Token is invalid or expired. Run: tank login');
|
|
21
|
-
return;
|
|
22
|
-
}
|
|
23
|
-
if (!res.ok) {
|
|
24
|
-
if (config.user) {
|
|
25
|
-
printUserInfo(config.user);
|
|
26
|
-
logger.warn('Could not verify token with server. Run: tank login');
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
29
|
-
logger.error('Could not verify token. Server returned an error. Run: tank login');
|
|
30
|
-
}
|
|
31
|
-
process.exitCode = 1;
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
if (config.user) {
|
|
35
|
-
printUserInfo(config.user);
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
logger.info('Logged in (token verified).');
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
catch {
|
|
42
|
-
if (config.user) {
|
|
43
|
-
logger.info(`Logged in as: ${config.user.name ?? 'unknown'} (offline)`);
|
|
44
|
-
logger.info(`Email: ${config.user.email ?? 'unknown'}`);
|
|
45
|
-
logger.warn('Could not reach server to verify token. Run: tank login');
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
logger.error('Could not verify token. Check your network connection.');
|
|
49
|
-
}
|
|
50
|
-
process.exitCode = 1;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
function printUserInfo(user) {
|
|
54
|
-
logger.info(`Logged in as: ${user.name ?? 'unknown'}`);
|
|
55
|
-
logger.info(`Email: ${user.email ?? 'unknown'}`);
|
|
56
|
-
}
|
|
57
|
-
//# sourceMappingURL=whoami.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAM3C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAyB,EAAE;IAC7D,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAC9B,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IAEpC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,CAAC,QAAQ,qBAAqB,EAAE;YAC/D,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,MAAM,CAAC,KAAK,EAAE;gBAC3C,YAAY,EAAE,UAAU;aACvB;SACF,CAAC,CAAC;QAEH,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChB,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC3B,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;YACrE,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,mEAAmE,CAAC,CAAC;YACpF,CAAC;YACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,SAAS,YAAY,CAAC,CAAC;YACxE,MAAM,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,SAAS,EAAE,CAAC,CAAC;YACxD,MAAM,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;QACzE,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,IAAqC;IAC1D,MAAM,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC,CAAC;IACvD,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,KAAK,IAAI,SAAS,EAAE,CAAC,CAAC;AACnD,CAAC"}
|
package/dist/lib/agents.d.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
export interface AgentInfo {
|
|
2
|
-
id: string;
|
|
3
|
-
name: string;
|
|
4
|
-
skillsDir: string;
|
|
5
|
-
}
|
|
6
|
-
interface AgentDefinition {
|
|
7
|
-
id: string;
|
|
8
|
-
name: string;
|
|
9
|
-
skillsDir: (homedir: string) => string;
|
|
10
|
-
configDir: (homedir: string) => string;
|
|
11
|
-
}
|
|
12
|
-
export declare const SUPPORTED_AGENTS: AgentDefinition[];
|
|
13
|
-
export declare function getSupportedAgents(homedir?: string): AgentInfo[];
|
|
14
|
-
export declare function detectInstalledAgents(homedir?: string): AgentInfo[];
|
|
15
|
-
export declare function getAgentSkillDir(agentId: string, homedir?: string): string | null;
|
|
16
|
-
export declare function getSymlinkName(skillName: string): string;
|
|
17
|
-
export declare function getGlobalSkillsDir(homedir?: string): string;
|
|
18
|
-
export declare function getGlobalAgentSkillsDir(homedir?: string): string;
|
|
19
|
-
export {};
|