@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,163 +0,0 @@
1
- import fs from 'node:fs';
2
- import os from 'node:os';
3
- import path from 'node:path';
4
- import { LOCKFILE_VERSION } from '@tank/shared';
5
- import { logger } from '../lib/logger.js';
6
- import { unlinkSkillFromAgents } from '../lib/linker.js';
7
- import { getSymlinkName, getGlobalSkillsDir, getGlobalAgentSkillsDir } from '../lib/agents.js';
8
- export async function removeCommand(options) {
9
- const { name, directory = process.cwd(), global, homedir } = options;
10
- if (global) {
11
- const resolvedHome = homedir ?? os.homedir();
12
- // 1. Unlink from agents (failures are warnings)
13
- try {
14
- const unlinkResult = unlinkSkillFromAgents({
15
- skillName: name,
16
- linksDir: path.join(resolvedHome, '.tank'),
17
- homedir,
18
- });
19
- if (unlinkResult.unlinked.length > 0) {
20
- logger.info(`Unlinked from ${unlinkResult.unlinked.length} agent(s)`);
21
- }
22
- }
23
- catch {
24
- logger.warn('Agent unlinking skipped (non-fatal)');
25
- }
26
- // 2. Remove agent-skills wrapper dir
27
- const symlinkName = getSymlinkName(name);
28
- const agentSkillDir = path.join(getGlobalAgentSkillsDir(resolvedHome), symlinkName);
29
- if (fs.existsSync(agentSkillDir)) {
30
- fs.rmSync(agentSkillDir, { recursive: true, force: true });
31
- }
32
- // 3. Remove global skills dir
33
- const skillDir = getGlobalSkillDir(resolvedHome, name);
34
- if (fs.existsSync(skillDir)) {
35
- fs.rmSync(skillDir, { recursive: true, force: true });
36
- }
37
- // 4. Update global lockfile
38
- const lockPath = path.join(resolvedHome, '.tank', 'skills.lock');
39
- if (fs.existsSync(lockPath)) {
40
- let lock;
41
- try {
42
- const raw = fs.readFileSync(lockPath, 'utf-8');
43
- lock = JSON.parse(raw);
44
- }
45
- catch {
46
- lock = { lockfileVersion: LOCKFILE_VERSION, skills: {} };
47
- }
48
- for (const key of Object.keys(lock.skills)) {
49
- const lastAt = key.lastIndexOf('@');
50
- if (lastAt <= 0)
51
- continue;
52
- const keyName = key.slice(0, lastAt);
53
- if (keyName === name) {
54
- delete lock.skills[key];
55
- }
56
- }
57
- const sortedSkills = {};
58
- for (const key of Object.keys(lock.skills).sort()) {
59
- sortedSkills[key] = lock.skills[key];
60
- }
61
- lock.skills = sortedSkills;
62
- fs.writeFileSync(lockPath, JSON.stringify(lock, null, 2) + '\n');
63
- }
64
- logger.success(`Removed ${name} (global)`);
65
- return;
66
- }
67
- // 1. Read skills.json
68
- const skillsJsonPath = path.join(directory, 'skills.json');
69
- if (!fs.existsSync(skillsJsonPath)) {
70
- throw new Error(`No skills.json found in ${directory}. Run: tank init`);
71
- }
72
- let skillsJson;
73
- try {
74
- const raw = fs.readFileSync(skillsJsonPath, 'utf-8');
75
- skillsJson = JSON.parse(raw);
76
- }
77
- catch {
78
- throw new Error('Failed to read or parse skills.json');
79
- }
80
- // 2. Check if skill exists in skills map
81
- const skills = (skillsJson.skills ?? {});
82
- if (!(name in skills)) {
83
- throw new Error(`Skill "${name}" is not installed (not found in skills.json)`);
84
- }
85
- // 3. Remove skill from skills.json
86
- delete skills[name];
87
- skillsJson.skills = skills;
88
- // 4. Write updated skills.json
89
- fs.writeFileSync(skillsJsonPath, JSON.stringify(skillsJson, null, 2) + '\n');
90
- // 5. Read skills.lock if present
91
- const lockPath = path.join(directory, 'skills.lock');
92
- if (fs.existsSync(lockPath)) {
93
- let lock;
94
- try {
95
- const raw = fs.readFileSync(lockPath, 'utf-8');
96
- lock = JSON.parse(raw);
97
- }
98
- catch {
99
- lock = { lockfileVersion: LOCKFILE_VERSION, skills: {} };
100
- }
101
- // 6. Remove ALL lockfile entries for this skill name
102
- // Key format: name@version — use lastIndexOf('@') to split scoped names
103
- for (const key of Object.keys(lock.skills)) {
104
- const lastAt = key.lastIndexOf('@');
105
- if (lastAt <= 0)
106
- continue;
107
- const keyName = key.slice(0, lastAt);
108
- if (keyName === name) {
109
- delete lock.skills[key];
110
- }
111
- }
112
- // 7. Write updated skills.lock (sorted keys, trailing newline)
113
- const sortedSkills = {};
114
- for (const key of Object.keys(lock.skills).sort()) {
115
- sortedSkills[key] = lock.skills[key];
116
- }
117
- lock.skills = sortedSkills;
118
- fs.writeFileSync(lockPath, JSON.stringify(lock, null, 2) + '\n');
119
- }
120
- // 7.5. Unlink from agents (failures are warnings)
121
- try {
122
- const unlinkResult = unlinkSkillFromAgents({
123
- skillName: name,
124
- linksDir: path.join(directory, '.tank'),
125
- homedir,
126
- });
127
- if (unlinkResult.unlinked.length > 0) {
128
- logger.info(`Unlinked from ${unlinkResult.unlinked.length} agent(s)`);
129
- }
130
- }
131
- catch {
132
- logger.warn('Agent unlinking skipped (non-fatal)');
133
- }
134
- // 7.6. Remove agent-skills wrapper dir
135
- const symlinkName = getSymlinkName(name);
136
- const agentSkillDir = path.join(directory, '.tank', 'agent-skills', symlinkName);
137
- if (fs.existsSync(agentSkillDir)) {
138
- fs.rmSync(agentSkillDir, { recursive: true, force: true });
139
- }
140
- // 8. Delete .tank/skills/{name}/ directory
141
- const skillDir = getSkillDir(directory, name);
142
- if (fs.existsSync(skillDir)) {
143
- fs.rmSync(skillDir, { recursive: true, force: true });
144
- }
145
- // 9. Print success
146
- logger.success(`Removed ${name}`);
147
- }
148
- function getSkillDir(projectDir, skillName) {
149
- if (skillName.startsWith('@')) {
150
- const [scope, name] = skillName.split('/');
151
- return path.join(projectDir, '.tank', 'skills', scope, name);
152
- }
153
- return path.join(projectDir, '.tank', 'skills', skillName);
154
- }
155
- function getGlobalSkillDir(homedir, skillName) {
156
- const globalDir = getGlobalSkillsDir(homedir);
157
- if (skillName.startsWith('@')) {
158
- const [scope, name] = skillName.split('/');
159
- return path.join(globalDir, scope, name);
160
- }
161
- return path.join(globalDir, skillName);
162
- }
163
- //# sourceMappingURL=remove.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"remove.js","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- export interface ScanOptions {
2
- directory?: string;
3
- configDir?: string;
4
- }
5
- export declare function scanCommand(options?: ScanOptions): Promise<void>;
@@ -1,169 +0,0 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
- import ora from 'ora';
4
- import chalk from 'chalk';
5
- import { getConfig } from '../lib/config.js';
6
- import { pack, packForScan } from '../lib/packer.js';
7
- import { USER_AGENT } from '../version.js';
8
- function verdictColor(verdict) {
9
- switch (verdict) {
10
- case 'pass': return chalk.green;
11
- case 'pass_with_notes': return chalk.yellow;
12
- case 'flagged': return chalk.hex('#FF8C00');
13
- case 'fail': return chalk.red;
14
- default: return chalk.white;
15
- }
16
- }
17
- function severityColor(severity) {
18
- switch (severity) {
19
- case 'critical': return chalk.red;
20
- case 'high': return chalk.hex('#FF8C00');
21
- case 'medium': return chalk.yellow;
22
- case 'low': return chalk.green;
23
- default: return chalk.white;
24
- }
25
- }
26
- function scoreColor(score) {
27
- if (score >= 7)
28
- return chalk.green;
29
- if (score >= 4)
30
- return chalk.yellow;
31
- return chalk.red;
32
- }
33
- function formatSize(bytes) {
34
- if (bytes < 1024)
35
- return `${bytes} B`;
36
- if (bytes < 1024 * 1024)
37
- return `${(bytes / 1024).toFixed(1)} KB`;
38
- return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
39
- }
40
- export async function scanCommand(options = {}) {
41
- const { directory = process.cwd(), configDir } = options;
42
- const absDir = path.resolve(directory);
43
- const config = getConfig(configDir);
44
- if (!config.token) {
45
- throw new Error('Not logged in. Run: tank login');
46
- }
47
- const spinner = ora('Packing skill...').start();
48
- // Try to read skills.json first
49
- const skillsJsonPath = path.join(absDir, 'skills.json');
50
- let manifest;
51
- let packResult;
52
- const skillsJsonExists = fs.existsSync(skillsJsonPath);
53
- if (skillsJsonExists) {
54
- // skills.json exists: use pack() and read the manifest
55
- try {
56
- packResult = await pack(absDir);
57
- }
58
- catch (err) {
59
- spinner.fail('Packing failed');
60
- throw err;
61
- }
62
- try {
63
- manifest = JSON.parse(fs.readFileSync(skillsJsonPath, 'utf-8'));
64
- }
65
- catch (err) {
66
- spinner.fail('Failed to read skills.json');
67
- throw err;
68
- }
69
- }
70
- else {
71
- // skills.json does NOT exist: use packForScan() and synthesize manifest
72
- try {
73
- packResult = await packForScan(absDir);
74
- }
75
- catch (err) {
76
- spinner.fail('Packing failed');
77
- throw err;
78
- }
79
- const dirName = path.basename(absDir);
80
- manifest = { name: dirName, version: '0.0.0', description: 'Local scan' };
81
- }
82
- const name = manifest.name ?? 'unknown';
83
- const version = manifest.version ?? '0.0.0';
84
- spinner.text = `Scanning ${name}@${version}...`;
85
- const formData = new FormData();
86
- const blob = new Blob([new Uint8Array(packResult.tarball)], { type: 'application/gzip' });
87
- formData.append('tarball', blob, `${name}-${version}.tgz`);
88
- formData.append('manifest', JSON.stringify(manifest));
89
- let scanRes;
90
- try {
91
- scanRes = await fetch(`${config.registry}/api/v1/scan`, {
92
- method: 'POST',
93
- headers: {
94
- 'Authorization': `Bearer ${config.token}`,
95
- 'User-Agent': USER_AGENT,
96
- },
97
- body: formData,
98
- });
99
- }
100
- catch (err) {
101
- spinner.fail('Scan failed');
102
- throw new Error(`Network error: ${err instanceof Error ? err.message : String(err)}`);
103
- }
104
- if (!scanRes.ok) {
105
- spinner.fail('Scan failed');
106
- const body = await scanRes.json().catch(() => null);
107
- if (scanRes.status === 401) {
108
- throw new Error('Authentication failed. Your token may be expired or invalid. Run: tank login');
109
- }
110
- throw new Error(body?.error ?? scanRes.statusText);
111
- }
112
- const result = await scanRes.json();
113
- spinner.stop();
114
- const verdictLabel = verdictColor(result.verdict)(result.verdict.toUpperCase());
115
- const auditScore = result.audit_score ?? 0;
116
- const scoreLabel = scoreColor(auditScore)(auditScore.toFixed(1));
117
- console.log('');
118
- console.log(chalk.bold(`Security Scan: ${name}@${version}`));
119
- console.log('');
120
- console.log(`${chalk.dim('Verdict:'.padEnd(14))}${verdictLabel}`);
121
- console.log(`${chalk.dim('Score:'.padEnd(14))}${scoreLabel}/10`);
122
- console.log(`${chalk.dim('Duration:'.padEnd(14))}${(result.duration_ms / 1000).toFixed(1)}s`);
123
- console.log(`${chalk.dim('Files:'.padEnd(14))}${packResult.fileCount} (${formatSize(packResult.totalSize)})`);
124
- if (result.findings.length > 0) {
125
- console.log('');
126
- console.log(chalk.bold(`Findings (${result.findings.length})`));
127
- const bySeverity = {
128
- critical: [],
129
- high: [],
130
- medium: [],
131
- low: [],
132
- };
133
- for (const f of result.findings) {
134
- bySeverity[f.severity].push(f);
135
- }
136
- for (const severity of ['critical', 'high', 'medium', 'low']) {
137
- const findings = bySeverity[severity];
138
- if (findings.length === 0)
139
- continue;
140
- console.log('');
141
- const label = severityColor(severity)(`${severity.toUpperCase()} (${findings.length})`);
142
- console.log(` ${label}`);
143
- for (const f of findings) {
144
- console.log(` - ${chalk.bold(f.type)}: ${f.description}`);
145
- if (f.location) {
146
- console.log(` ${chalk.dim('Location:')} ${f.location}`);
147
- }
148
- }
149
- }
150
- }
151
- else {
152
- console.log('');
153
- console.log(chalk.green('No findings. Your skill looks secure!'));
154
- }
155
- if (result.stage_results?.length > 0) {
156
- console.log('');
157
- console.log(chalk.bold('Scan Stages'));
158
- for (const stage of result.stage_results) {
159
- const icon = stage.status === 'passed' ? chalk.green('✓') : chalk.red('✗');
160
- console.log(` ${icon} ${stage.stage} (${stage.duration_ms}ms)`);
161
- }
162
- }
163
- if (result.scan_id) {
164
- console.log('');
165
- console.log(chalk.dim(`Full report: ${config.registry}/scans/${result.scan_id}`));
166
- }
167
- console.log('');
168
- }
169
- //# sourceMappingURL=scan.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAgC3C,SAAS,YAAY,CAAC,OAAe;IACnC,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,MAAM,CAAC,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC;QAChC,KAAK,iBAAiB,CAAC,CAAC,OAAO,KAAK,CAAC,MAAM,CAAC;QAC5C,KAAK,SAAS,CAAC,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC5C,KAAK,MAAM,CAAC,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC;QAC9B,OAAO,CAAC,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB;IACrC,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,UAAU,CAAC,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC;QAClC,KAAK,MAAM,CAAC,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACzC,KAAK,QAAQ,CAAC,CAAC,OAAO,KAAK,CAAC,MAAM,CAAC;QACnC,KAAK,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC;QAC/B,OAAO,CAAC,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC;IACnC,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC;IACpC,OAAO,KAAK,CAAC,GAAG,CAAC;AACnB,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,KAAK,IAAI,CAAC;IACtC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAClE,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,UAAuB,EAAE;IACzD,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IACzD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEvC,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,kBAAkB,CAAC,CAAC,KAAK,EAAE,CAAC;IAEhD,gCAAgC;IAChC,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACxD,IAAI,QAAiC,CAAC;IACtC,IAAI,UAA4C,CAAC;IAEjD,MAAM,gBAAgB,GAAG,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;IAEvD,IAAI,gBAAgB,EAAE,CAAC;QACrB,uDAAuD;QACvD,IAAI,CAAC;YACH,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC/B,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,IAAI,CAAC;YACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAA4B,CAAC;QAC7F,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YAC3C,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,wEAAwE;QACxE,IAAI,CAAC;YACH,UAAU,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC/B,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACtC,QAAQ,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;IAC5E,CAAC;IAED,MAAM,IAAI,GAAI,QAAQ,CAAC,IAAe,IAAI,SAAS,CAAC;IACpD,MAAM,OAAO,GAAI,QAAQ,CAAC,OAAkB,IAAI,OAAO,CAAC;IAExD,OAAO,CAAC,IAAI,GAAG,YAAY,IAAI,IAAI,OAAO,KAAK,CAAC;IAEhD,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC1F,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,OAAO,MAAM,CAAC,CAAC;IAC3D,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEtD,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,CAAC,QAAQ,cAAc,EAAE;YACtD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,MAAM,CAAC,KAAK,EAAE;gBACzC,YAAY,EAAE,UAAU;aACzB;YACD,IAAI,EAAE,QAAQ;SACf,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxF,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAA8B,CAAC;QAEjF,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC;QAClG,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,EAAkB,CAAC;IAEpD,OAAO,CAAC,IAAI,EAAE,CAAC;IAEf,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAChF,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,YAAY,EAAE,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,KAAK,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC9F,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,SAAS,KAAK,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAE9G,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEhE,MAAM,UAAU,GAAkC;YAChD,QAAQ,EAAE,EAAE;YACZ,IAAI,EAAE,EAAE;YACR,MAAM,EAAE,EAAE;YACV,GAAG,EAAE,EAAE;SACR,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YAChC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC;QAED,KAAK,MAAM,QAAQ,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAU,EAAE,CAAC;YACtE,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;YACtC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAEpC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;YACxF,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;YAE1B,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC7D,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;oBACf,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC/D,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,MAAM,CAAC,aAAa,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QACvC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC3E,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,WAAW,KAAK,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,QAAQ,UAAU,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACpF,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
@@ -1,5 +0,0 @@
1
- export interface SearchOptions {
2
- query: string;
3
- configDir?: string;
4
- }
5
- export declare function searchCommand(options: SearchOptions): Promise<void>;
@@ -1,67 +0,0 @@
1
- import chalk from 'chalk';
2
- import { getConfig } from '../lib/config.js';
3
- import { USER_AGENT } from '../version.js';
4
- const MAX_DESC_LENGTH = 60;
5
- function scoreColor(score) {
6
- if (score >= 7)
7
- return chalk.green;
8
- if (score >= 4)
9
- return chalk.yellow;
10
- return chalk.red;
11
- }
12
- function truncate(text, maxLen) {
13
- if (text.length <= maxLen)
14
- return text;
15
- return text.slice(0, maxLen - 3) + '...';
16
- }
17
- function padRight(text, width) {
18
- if (text.length >= width)
19
- return text;
20
- return text + ' '.repeat(width - text.length);
21
- }
22
- export async function searchCommand(options) {
23
- const { query, configDir } = options;
24
- const config = getConfig(configDir);
25
- const url = `${config.registry}/api/v1/search?q=${encodeURIComponent(query)}&limit=20`;
26
- let res;
27
- try {
28
- const headers = { 'User-Agent': USER_AGENT };
29
- if (config.token) {
30
- headers.Authorization = `Bearer ${config.token}`;
31
- }
32
- res = await fetch(url, {
33
- headers,
34
- });
35
- }
36
- catch (err) {
37
- throw new Error(`Network error searching: ${err instanceof Error ? err.message : String(err)}`);
38
- }
39
- if (!res.ok) {
40
- const body = await res.json().catch(() => null);
41
- throw new Error(body?.error ?? `Search failed: ${res.statusText}`);
42
- }
43
- const data = await res.json();
44
- if (data.results.length === 0) {
45
- console.log(`No skills found for "${query}"`);
46
- return;
47
- }
48
- // Print table header
49
- console.log(padRight('NAME', 30) +
50
- padRight('VERSION', 10) +
51
- padRight('SCORE', 8) +
52
- 'DESCRIPTION');
53
- // Print each result
54
- for (const result of data.results) {
55
- const name = chalk.bold(padRight(result.name, 30));
56
- const version = padRight(result.latestVersion, 10);
57
- const scoreStr = Number.isInteger(result.auditScore)
58
- ? result.auditScore.toFixed(1)
59
- : String(result.auditScore);
60
- const score = scoreColor(result.auditScore)(padRight(scoreStr, 8));
61
- const desc = truncate(result.description ?? '', MAX_DESC_LENGTH);
62
- console.log(`${name}${version}${score}${desc}`);
63
- }
64
- console.log('');
65
- console.log(`${data.results.length} skill${data.results.length === 1 ? '' : 's'} found`);
66
- }
67
- //# sourceMappingURL=search.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- export interface UnlinkOptions {
2
- directory?: string;
3
- homedir?: string;
4
- }
5
- export declare function unlinkCommand(options?: UnlinkOptions): Promise<void>;
@@ -1,42 +0,0 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
- import os from 'node:os';
4
- import { getGlobalAgentSkillsDir, getSymlinkName } from '../lib/agents.js';
5
- import { unlinkSkillFromAgents } from '../lib/linker.js';
6
- import { logger } from '../lib/logger.js';
7
- export async function unlinkCommand(options = {}) {
8
- const workDir = options.directory ?? process.cwd();
9
- const skillsJsonPath = path.join(workDir, 'skills.json');
10
- if (!fs.existsSync(skillsJsonPath)) {
11
- throw new Error('No skills.json found. Run this command from a skill directory.');
12
- }
13
- let skillsJson;
14
- try {
15
- const raw = fs.readFileSync(skillsJsonPath, 'utf-8');
16
- skillsJson = JSON.parse(raw);
17
- }
18
- catch {
19
- throw new Error('Failed to read or parse skills.json');
20
- }
21
- const skillName = skillsJson.name;
22
- if (typeof skillName !== 'string' || skillName.trim().length === 0) {
23
- throw new Error("Missing 'name' in skills.json");
24
- }
25
- const homedir = options.homedir ?? os.homedir();
26
- const result = unlinkSkillFromAgents({
27
- skillName,
28
- linksDir: path.join(homedir, '.tank'),
29
- homedir: options.homedir,
30
- });
31
- const symlinkName = getSymlinkName(skillName);
32
- const wrapperDir = path.join(getGlobalAgentSkillsDir(options.homedir), symlinkName);
33
- if (fs.existsSync(wrapperDir)) {
34
- fs.rmSync(wrapperDir, { recursive: true, force: true });
35
- }
36
- if (result.unlinked.length === 0 && result.notFound.length === 0) {
37
- logger.info(`No links found for ${skillName}`);
38
- return;
39
- }
40
- logger.success(`Unlinked ${skillName} from ${result.unlinked.length} agent(s)`);
41
- }
42
- //# sourceMappingURL=unlink.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"unlink.js","sourceRoot":"","sources":["../../src/commands/unlink.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAO1C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAyB,EAAE;IAC7D,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACnD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAEzD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;IACpF,CAAC;IAED,IAAI,UAAmC,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACrD,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC;IAClC,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;IAChD,MAAM,MAAM,GAAG,qBAAqB,CAAC;QACnC,SAAS;QACT,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC;QACrC,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,CAAC;IACpF,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAC;QAC/C,OAAO;IACT,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,YAAY,SAAS,SAAS,MAAM,CAAC,QAAQ,CAAC,MAAM,WAAW,CAAC,CAAC;AAClF,CAAC"}
@@ -1,8 +0,0 @@
1
- export interface UpdateOptions {
2
- name?: string;
3
- directory?: string;
4
- configDir?: string;
5
- global?: boolean;
6
- homedir?: string;
7
- }
8
- export declare function updateCommand(options: UpdateOptions): Promise<void>;