@tankpkg/cli 0.4.2
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/LICENSE +21 -0
- package/dist/bin/tank.d.ts +2 -0
- package/dist/bin/tank.js +279 -0
- package/dist/bin/tank.js.map +1 -0
- package/dist/commands/audit.d.ts +5 -0
- package/dist/commands/audit.js +185 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/doctor.d.ts +5 -0
- package/dist/commands/doctor.js +164 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/info.d.ts +5 -0
- package/dist/commands/info.js +102 -0
- package/dist/commands/info.js.map +1 -0
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.js +92 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install.d.ts +39 -0
- package/dist/commands/install.js +550 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/link.d.ts +5 -0
- package/dist/commands/link.js +79 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/login.d.ts +14 -0
- package/dist/commands/login.js +87 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +9 -0
- package/dist/commands/logout.js +20 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/permissions.d.ts +4 -0
- package/dist/commands/permissions.js +199 -0
- package/dist/commands/permissions.js.map +1 -0
- package/dist/commands/publish.d.ts +25 -0
- package/dist/commands/publish.js +166 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/remove.d.ts +7 -0
- package/dist/commands/remove.js +163 -0
- package/dist/commands/remove.js.map +1 -0
- package/dist/commands/search.d.ts +5 -0
- package/dist/commands/search.js +67 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/unlink.d.ts +5 -0
- package/dist/commands/unlink.js +42 -0
- package/dist/commands/unlink.js.map +1 -0
- package/dist/commands/update.d.ts +8 -0
- package/dist/commands/update.js +337 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/upgrade.d.ts +6 -0
- package/dist/commands/upgrade.js +100 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/commands/verify.d.ts +22 -0
- package/dist/commands/verify.js +63 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/commands/whoami.d.ts +4 -0
- package/dist/commands/whoami.js +57 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/agents.d.ts +19 -0
- package/dist/lib/agents.js +84 -0
- package/dist/lib/agents.js.map +1 -0
- package/dist/lib/api-client.d.ts +14 -0
- package/dist/lib/api-client.js +63 -0
- package/dist/lib/api-client.js.map +1 -0
- package/dist/lib/config.d.ts +29 -0
- package/dist/lib/config.js +66 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/debug-logger.d.ts +9 -0
- package/dist/lib/debug-logger.js +77 -0
- package/dist/lib/debug-logger.js.map +1 -0
- package/dist/lib/frontmatter.d.ts +11 -0
- package/dist/lib/frontmatter.js +89 -0
- package/dist/lib/frontmatter.js.map +1 -0
- package/dist/lib/linker.d.ts +45 -0
- package/dist/lib/linker.js +137 -0
- package/dist/lib/linker.js.map +1 -0
- package/dist/lib/links.d.ts +20 -0
- package/dist/lib/links.js +105 -0
- package/dist/lib/links.js.map +1 -0
- package/dist/lib/lockfile.d.ts +24 -0
- package/dist/lib/lockfile.js +135 -0
- package/dist/lib/lockfile.js.map +1 -0
- package/dist/lib/logger.d.ts +6 -0
- package/dist/lib/logger.js +8 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/packer.d.ts +21 -0
- package/dist/lib/packer.js +210 -0
- package/dist/lib/packer.js.map +1 -0
- package/dist/lib/upgrade-check.d.ts +1 -0
- package/dist/lib/upgrade-check.js +52 -0
- package/dist/lib/upgrade-check.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +4 -0
- package/dist/version.js.map +1 -0
- package/package.json +40 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Tank Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/dist/bin/tank.js
ADDED
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { initCommand } from '../commands/init.js';
|
|
4
|
+
import { loginCommand } from '../commands/login.js';
|
|
5
|
+
import { whoamiCommand } from '../commands/whoami.js';
|
|
6
|
+
import { logoutCommand } from '../commands/logout.js';
|
|
7
|
+
import { publishCommand } from '../commands/publish.js';
|
|
8
|
+
import { installCommand, installAll } from '../commands/install.js';
|
|
9
|
+
import { removeCommand } from '../commands/remove.js';
|
|
10
|
+
import { updateCommand } from '../commands/update.js';
|
|
11
|
+
import { verifyCommand } from '../commands/verify.js';
|
|
12
|
+
import { permissionsCommand } from '../commands/permissions.js';
|
|
13
|
+
import { searchCommand } from '../commands/search.js';
|
|
14
|
+
import { infoCommand } from '../commands/info.js';
|
|
15
|
+
import { auditCommand } from '../commands/audit.js';
|
|
16
|
+
import { linkCommand } from '../commands/link.js';
|
|
17
|
+
import { unlinkCommand } from '../commands/unlink.js';
|
|
18
|
+
import { doctorCommand } from '../commands/doctor.js';
|
|
19
|
+
import { upgradeCommand } from '../commands/upgrade.js';
|
|
20
|
+
import { checkForUpgrade } from '../lib/upgrade-check.js';
|
|
21
|
+
import { flushLogs } from '../lib/debug-logger.js';
|
|
22
|
+
import { VERSION } from '../version.js';
|
|
23
|
+
const program = new Command();
|
|
24
|
+
program
|
|
25
|
+
.name('tank')
|
|
26
|
+
.description('Security-first package manager for AI agent skills')
|
|
27
|
+
.version(VERSION);
|
|
28
|
+
program
|
|
29
|
+
.command('init')
|
|
30
|
+
.description('Create a new skills.json in the current directory')
|
|
31
|
+
.action(initCommand);
|
|
32
|
+
program
|
|
33
|
+
.command('login')
|
|
34
|
+
.description('Authenticate with the Tank registry via browser')
|
|
35
|
+
.action(async () => {
|
|
36
|
+
try {
|
|
37
|
+
await loginCommand();
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
41
|
+
console.error(`Login failed: ${msg}`);
|
|
42
|
+
await flushLogs();
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
await flushLogs();
|
|
46
|
+
});
|
|
47
|
+
program
|
|
48
|
+
.command('whoami')
|
|
49
|
+
.description('Show the currently logged-in user')
|
|
50
|
+
.action(async () => {
|
|
51
|
+
try {
|
|
52
|
+
await whoamiCommand();
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
56
|
+
console.error(`Error: ${msg}`);
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
program
|
|
61
|
+
.command('logout')
|
|
62
|
+
.description('Remove authentication token from config')
|
|
63
|
+
.action(async () => {
|
|
64
|
+
try {
|
|
65
|
+
await logoutCommand();
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
69
|
+
console.error(`Logout failed: ${msg}`);
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
program
|
|
74
|
+
.command('publish')
|
|
75
|
+
.alias('pub')
|
|
76
|
+
.description('Pack and publish a skill to the Tank registry')
|
|
77
|
+
.option('--dry-run', 'Validate and pack without uploading')
|
|
78
|
+
.option('--private', 'Publish skill as private')
|
|
79
|
+
.option('--visibility <mode>', 'Skill visibility (public|private)')
|
|
80
|
+
.action(async (opts) => {
|
|
81
|
+
try {
|
|
82
|
+
await publishCommand({
|
|
83
|
+
dryRun: opts.dryRun,
|
|
84
|
+
private: opts.private,
|
|
85
|
+
visibility: opts.visibility,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
90
|
+
console.error(`Publish failed: ${msg}`);
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
program
|
|
95
|
+
.command('install')
|
|
96
|
+
.alias('i')
|
|
97
|
+
.description('Install a skill from the Tank registry, or all skills from lockfile')
|
|
98
|
+
.argument('[name]', 'Skill name (e.g., @org/skill-name). Omit to install from lockfile.')
|
|
99
|
+
.argument('[version-range]', 'Semver range (default: *)', '*')
|
|
100
|
+
.option('-g, --global', 'Install skill globally (available to all projects)')
|
|
101
|
+
.action(async (name, versionRange, opts) => {
|
|
102
|
+
try {
|
|
103
|
+
if (name) {
|
|
104
|
+
await installCommand({ name, versionRange, global: opts.global });
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
await installAll({ global: opts.global });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
112
|
+
console.error(`Install failed: ${msg}`);
|
|
113
|
+
process.exit(1);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
program
|
|
117
|
+
.command('remove')
|
|
118
|
+
.aliases(['rm', 'r'])
|
|
119
|
+
.description('Remove an installed skill')
|
|
120
|
+
.argument('<name>', 'Skill name (e.g., @org/skill-name)')
|
|
121
|
+
.option('-g, --global', 'Remove a globally installed skill')
|
|
122
|
+
.action(async (name, opts) => {
|
|
123
|
+
try {
|
|
124
|
+
await removeCommand({ name, global: opts.global });
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
128
|
+
console.error(`Remove failed: ${msg}`);
|
|
129
|
+
process.exit(1);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
program
|
|
133
|
+
.command('update')
|
|
134
|
+
.alias('up')
|
|
135
|
+
.description('Update skills to latest versions within their ranges')
|
|
136
|
+
.argument('[name]', 'Skill name to update (omit to update all)')
|
|
137
|
+
.option('-g, --global', 'Update globally installed skills')
|
|
138
|
+
.action(async (name, opts) => {
|
|
139
|
+
try {
|
|
140
|
+
await updateCommand({ name, global: opts.global });
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
144
|
+
console.error(`Update failed: ${msg}`);
|
|
145
|
+
process.exit(1);
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
program
|
|
149
|
+
.command('verify')
|
|
150
|
+
.description('Verify installed skills match the lockfile')
|
|
151
|
+
.action(async () => {
|
|
152
|
+
try {
|
|
153
|
+
await verifyCommand();
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
157
|
+
console.error(`Verify failed: ${msg}`);
|
|
158
|
+
process.exit(1);
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
program
|
|
162
|
+
.command('permissions')
|
|
163
|
+
.alias('perms')
|
|
164
|
+
.description('Display resolved permission summary for installed skills')
|
|
165
|
+
.action(async () => {
|
|
166
|
+
try {
|
|
167
|
+
await permissionsCommand();
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
171
|
+
console.error(`Error: ${msg}`);
|
|
172
|
+
process.exit(1);
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
program
|
|
176
|
+
.command('search')
|
|
177
|
+
.alias('s')
|
|
178
|
+
.description('Search for skills in the Tank registry')
|
|
179
|
+
.argument('<query>', 'Search query')
|
|
180
|
+
.action(async (query) => {
|
|
181
|
+
try {
|
|
182
|
+
await searchCommand({ query });
|
|
183
|
+
}
|
|
184
|
+
catch (err) {
|
|
185
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
186
|
+
console.error(`Search failed: ${msg}`);
|
|
187
|
+
process.exit(1);
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
program
|
|
191
|
+
.command('info')
|
|
192
|
+
.alias('show')
|
|
193
|
+
.description('Show detailed information about a skill')
|
|
194
|
+
.argument('<name>', 'Skill name (e.g., @org/skill-name)')
|
|
195
|
+
.action(async (name) => {
|
|
196
|
+
try {
|
|
197
|
+
await infoCommand({ name });
|
|
198
|
+
}
|
|
199
|
+
catch (err) {
|
|
200
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
201
|
+
console.error(`Info failed: ${msg}`);
|
|
202
|
+
process.exit(1);
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
program
|
|
206
|
+
.command('audit')
|
|
207
|
+
.description('Display security audit results for installed skills')
|
|
208
|
+
.argument('[name]', 'Skill name to audit (omit to audit all)')
|
|
209
|
+
.action(async (name) => {
|
|
210
|
+
try {
|
|
211
|
+
await auditCommand({ name });
|
|
212
|
+
}
|
|
213
|
+
catch (err) {
|
|
214
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
215
|
+
console.error(`Audit failed: ${msg}`);
|
|
216
|
+
process.exit(1);
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
program
|
|
220
|
+
.command('link')
|
|
221
|
+
.alias('ln')
|
|
222
|
+
.description('Link current skill directory to AI agent directories (for development)')
|
|
223
|
+
.action(async () => {
|
|
224
|
+
try {
|
|
225
|
+
await linkCommand();
|
|
226
|
+
}
|
|
227
|
+
catch (err) {
|
|
228
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
229
|
+
console.error(`Link failed: ${msg}`);
|
|
230
|
+
process.exit(1);
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
program
|
|
234
|
+
.command('unlink')
|
|
235
|
+
.description('Remove skill symlinks from AI agent directories')
|
|
236
|
+
.action(async () => {
|
|
237
|
+
try {
|
|
238
|
+
await unlinkCommand();
|
|
239
|
+
}
|
|
240
|
+
catch (err) {
|
|
241
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
242
|
+
console.error(`Unlink failed: ${msg}`);
|
|
243
|
+
process.exit(1);
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
program
|
|
247
|
+
.command('doctor')
|
|
248
|
+
.description('Diagnose agent integration health')
|
|
249
|
+
.action(async () => {
|
|
250
|
+
try {
|
|
251
|
+
await doctorCommand();
|
|
252
|
+
}
|
|
253
|
+
catch (err) {
|
|
254
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
255
|
+
console.error(`Doctor failed: ${msg}`);
|
|
256
|
+
process.exit(1);
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
program
|
|
260
|
+
.command('upgrade')
|
|
261
|
+
.description('Update tank to the latest version')
|
|
262
|
+
.argument('[version]', 'Target version (default: latest)')
|
|
263
|
+
.option('--dry-run', 'Check for updates without installing')
|
|
264
|
+
.option('--force', 'Reinstall even if already on the target version')
|
|
265
|
+
.action(async (version, opts) => {
|
|
266
|
+
try {
|
|
267
|
+
await upgradeCommand({ version, dryRun: opts.dryRun, force: opts.force });
|
|
268
|
+
}
|
|
269
|
+
catch (err) {
|
|
270
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
271
|
+
console.error(`Upgrade failed: ${msg}`);
|
|
272
|
+
await flushLogs();
|
|
273
|
+
process.exit(1);
|
|
274
|
+
}
|
|
275
|
+
await flushLogs();
|
|
276
|
+
});
|
|
277
|
+
checkForUpgrade().catch(() => { });
|
|
278
|
+
program.parse();
|
|
279
|
+
//# sourceMappingURL=tank.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tank.js","sourceRoot":"","sources":["../../src/bin/tank.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { getConfig } from '../lib/config.js';
|
|
3
|
+
import { readLockfile } from '../lib/lockfile.js';
|
|
4
|
+
import { USER_AGENT } from '../version.js';
|
|
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 formatScore(result) {
|
|
13
|
+
if (result.error)
|
|
14
|
+
return chalk.dim('error');
|
|
15
|
+
if (result.score == null || result.status !== 'completed') {
|
|
16
|
+
return chalk.dim('pending');
|
|
17
|
+
}
|
|
18
|
+
return scoreColor(result.score)(result.score.toFixed(1));
|
|
19
|
+
}
|
|
20
|
+
function formatStatus(result) {
|
|
21
|
+
if (result.error)
|
|
22
|
+
return chalk.dim('error');
|
|
23
|
+
if (result.score == null || result.status !== 'completed') {
|
|
24
|
+
return chalk.dim('Analysis pending');
|
|
25
|
+
}
|
|
26
|
+
if (result.score >= 4)
|
|
27
|
+
return chalk.green('pass');
|
|
28
|
+
return chalk.red('issues');
|
|
29
|
+
}
|
|
30
|
+
function padRight(text, width) {
|
|
31
|
+
if (text.length >= width)
|
|
32
|
+
return text;
|
|
33
|
+
return text + ' '.repeat(width - text.length);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Parse a lockfile key like "@org/skill@1.0.0" into { name, version }.
|
|
37
|
+
* Scoped packages start with @, so find the LAST @ to split.
|
|
38
|
+
*/
|
|
39
|
+
function parseLockKey(key) {
|
|
40
|
+
const lastAt = key.lastIndexOf('@');
|
|
41
|
+
if (lastAt <= 0) {
|
|
42
|
+
throw new Error(`Invalid lockfile key: ${key}`);
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
name: key.slice(0, lastAt),
|
|
46
|
+
version: key.slice(lastAt + 1),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
async function fetchVersionDetails(registryUrl, name, version) {
|
|
50
|
+
const encodedName = encodeURIComponent(name);
|
|
51
|
+
const url = `${registryUrl}/api/v1/skills/${encodedName}/${version}`;
|
|
52
|
+
let res;
|
|
53
|
+
try {
|
|
54
|
+
res = await fetch(url, {
|
|
55
|
+
headers: { 'User-Agent': USER_AGENT },
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
throw new Error(`Network error fetching audit data: ${err instanceof Error ? err.message : String(err)}`);
|
|
60
|
+
}
|
|
61
|
+
if (!res.ok) {
|
|
62
|
+
throw new Error(`API error for ${name}@${version}: ${res.status} ${res.statusText}`);
|
|
63
|
+
}
|
|
64
|
+
return await res.json();
|
|
65
|
+
}
|
|
66
|
+
function displayDetailedAudit(result) {
|
|
67
|
+
console.log('');
|
|
68
|
+
console.log(chalk.bold(result.name));
|
|
69
|
+
console.log('');
|
|
70
|
+
console.log(`${chalk.dim('Version:'.padEnd(14))}${result.version}`);
|
|
71
|
+
console.log(`${chalk.dim('Audit Score:'.padEnd(14))}${formatScore(result)}`);
|
|
72
|
+
console.log(`${chalk.dim('Status:'.padEnd(14))}${result.status}`);
|
|
73
|
+
const perms = result.permissions;
|
|
74
|
+
if (perms) {
|
|
75
|
+
console.log('');
|
|
76
|
+
console.log(chalk.bold('Permissions:'));
|
|
77
|
+
const networkDomains = perms.network?.outbound;
|
|
78
|
+
if (networkDomains && networkDomains.length > 0) {
|
|
79
|
+
console.log(` ${chalk.dim('Network:'.padEnd(14))}${networkDomains.join(', ')}`);
|
|
80
|
+
}
|
|
81
|
+
const fsRead = perms.filesystem?.read;
|
|
82
|
+
const fsWrite = perms.filesystem?.write;
|
|
83
|
+
if (fsRead || fsWrite) {
|
|
84
|
+
const parts = [];
|
|
85
|
+
if (fsRead && fsRead.length > 0) {
|
|
86
|
+
parts.push(`${fsRead.join(', ')} (read)`);
|
|
87
|
+
}
|
|
88
|
+
if (fsWrite && fsWrite.length > 0) {
|
|
89
|
+
parts.push(`${fsWrite.join(', ')} (write)`);
|
|
90
|
+
}
|
|
91
|
+
console.log(` ${chalk.dim('Filesystem:'.padEnd(14))}${parts.join(', ')}`);
|
|
92
|
+
}
|
|
93
|
+
console.log(` ${chalk.dim('Subprocess:'.padEnd(14))}${perms.subprocess ? 'yes' : 'no'}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function displayTable(results) {
|
|
97
|
+
// Header
|
|
98
|
+
console.log(padRight('NAME', 30) +
|
|
99
|
+
padRight('VERSION', 12) +
|
|
100
|
+
padRight('SCORE', 10) +
|
|
101
|
+
'STATUS');
|
|
102
|
+
for (const result of results) {
|
|
103
|
+
const name = chalk.bold(padRight(result.name, 30));
|
|
104
|
+
const version = padRight(result.version, 12);
|
|
105
|
+
const score = padRight(formatScore(result), 10);
|
|
106
|
+
const status = formatStatus(result);
|
|
107
|
+
console.log(`${name}${version}${score}${status}`);
|
|
108
|
+
}
|
|
109
|
+
// Summary
|
|
110
|
+
const total = results.length;
|
|
111
|
+
const pass = results.filter((r) => !r.error && r.score != null && r.status === 'completed' && r.score >= 4).length;
|
|
112
|
+
const issues = total - pass;
|
|
113
|
+
console.log('');
|
|
114
|
+
console.log(`${total} skill${total === 1 ? '' : 's'} audited. ` +
|
|
115
|
+
`${pass} pass, ${issues} ${issues === 1 ? 'has' : 'have'} issues.`);
|
|
116
|
+
}
|
|
117
|
+
export async function auditCommand(options) {
|
|
118
|
+
const { name, configDir } = options;
|
|
119
|
+
const config = getConfig(configDir);
|
|
120
|
+
// Read lockfile
|
|
121
|
+
const lock = readLockfile();
|
|
122
|
+
if (!lock) {
|
|
123
|
+
console.log('No lockfile found. Run: tank install');
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const entries = Object.entries(lock.skills);
|
|
127
|
+
if (entries.length === 0) {
|
|
128
|
+
console.log('No skills installed.');
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
// Single skill audit
|
|
132
|
+
if (name) {
|
|
133
|
+
// Find the skill in lockfile
|
|
134
|
+
const matchingEntry = entries.find(([key]) => {
|
|
135
|
+
const parsed = parseLockKey(key);
|
|
136
|
+
return parsed.name === name;
|
|
137
|
+
});
|
|
138
|
+
if (!matchingEntry) {
|
|
139
|
+
console.log(`Skill not installed: ${name}`);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
const [key] = matchingEntry;
|
|
143
|
+
const parsed = parseLockKey(key);
|
|
144
|
+
const details = await fetchVersionDetails(config.registry, parsed.name, parsed.version);
|
|
145
|
+
const result = {
|
|
146
|
+
name: parsed.name,
|
|
147
|
+
version: parsed.version,
|
|
148
|
+
score: details.auditScore,
|
|
149
|
+
status: details.auditStatus,
|
|
150
|
+
permissions: details.permissions,
|
|
151
|
+
};
|
|
152
|
+
displayDetailedAudit(result);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
// Audit all skills
|
|
156
|
+
const results = [];
|
|
157
|
+
for (const [key] of entries) {
|
|
158
|
+
const parsed = parseLockKey(key);
|
|
159
|
+
try {
|
|
160
|
+
const details = await fetchVersionDetails(config.registry, parsed.name, parsed.version);
|
|
161
|
+
results.push({
|
|
162
|
+
name: parsed.name,
|
|
163
|
+
version: parsed.version,
|
|
164
|
+
score: details.auditScore,
|
|
165
|
+
status: details.auditStatus,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
// For network errors, re-throw immediately
|
|
170
|
+
if (err instanceof Error && err.message.startsWith('Network error')) {
|
|
171
|
+
throw err;
|
|
172
|
+
}
|
|
173
|
+
// For API errors (404, etc.), show the skill with error status
|
|
174
|
+
results.push({
|
|
175
|
+
name: parsed.name,
|
|
176
|
+
version: parsed.version,
|
|
177
|
+
score: null,
|
|
178
|
+
status: 'error',
|
|
179
|
+
error: true,
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
displayTable(results);
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"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"}
|