@tankpkg/mcp-server 0.4.2 → 0.6.0
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/README.md +41 -33
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/api-client.d.ts +6 -5
- package/dist/lib/api-client.d.ts.map +1 -1
- package/dist/lib/api-client.js +6 -6
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/packer.d.ts +20 -0
- package/dist/lib/packer.d.ts.map +1 -1
- package/dist/lib/packer.js +85 -0
- package/dist/lib/packer.js.map +1 -1
- package/dist/tools/audit-skill.d.ts +3 -0
- package/dist/tools/audit-skill.d.ts.map +1 -0
- package/dist/tools/audit-skill.js +213 -0
- package/dist/tools/audit-skill.js.map +1 -0
- package/dist/tools/doctor.d.ts +3 -0
- package/dist/tools/doctor.d.ts.map +1 -0
- package/dist/tools/doctor.js +158 -0
- package/dist/tools/doctor.js.map +1 -0
- package/dist/tools/init-skill.d.ts +3 -0
- package/dist/tools/init-skill.d.ts.map +1 -0
- package/dist/tools/init-skill.js +72 -0
- package/dist/tools/init-skill.js.map +1 -0
- package/dist/tools/install-skill.d.ts +3 -0
- package/dist/tools/install-skill.d.ts.map +1 -0
- package/dist/tools/install-skill.js +206 -0
- package/dist/tools/install-skill.js.map +1 -0
- package/dist/tools/link-skill.d.ts +3 -0
- package/dist/tools/link-skill.d.ts.map +1 -0
- package/dist/tools/link-skill.js +81 -0
- package/dist/tools/link-skill.js.map +1 -0
- package/dist/tools/logout.d.ts +3 -0
- package/dist/tools/logout.d.ts.map +1 -0
- package/dist/tools/logout.js +19 -0
- package/dist/tools/logout.js.map +1 -0
- package/dist/tools/remove-skill.d.ts +3 -0
- package/dist/tools/remove-skill.d.ts.map +1 -0
- package/dist/tools/remove-skill.js +110 -0
- package/dist/tools/remove-skill.js.map +1 -0
- package/dist/tools/scan-skill.d.ts.map +1 -1
- package/dist/tools/scan-skill.js +70 -18
- package/dist/tools/scan-skill.js.map +1 -1
- package/dist/tools/skill-permissions.d.ts +3 -0
- package/dist/tools/skill-permissions.d.ts.map +1 -0
- package/dist/tools/skill-permissions.js +311 -0
- package/dist/tools/skill-permissions.js.map +1 -0
- package/dist/tools/unlink-skill.d.ts +3 -0
- package/dist/tools/unlink-skill.d.ts.map +1 -0
- package/dist/tools/unlink-skill.js +72 -0
- package/dist/tools/unlink-skill.js.map +1 -0
- package/dist/tools/update-skill.d.ts +3 -0
- package/dist/tools/update-skill.d.ts.map +1 -0
- package/dist/tools/update-skill.js +317 -0
- package/dist/tools/update-skill.js.map +1 -0
- package/dist/tools/verify-skills.d.ts +3 -0
- package/dist/tools/verify-skills.d.ts.map +1 -0
- package/dist/tools/verify-skills.js +121 -0
- package/dist/tools/verify-skills.js.map +1 -0
- package/dist/tools/whoami.d.ts +3 -0
- package/dist/tools/whoami.d.ts.map +1 -0
- package/dist/tools/whoami.js +29 -0
- package/dist/tools/whoami.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,14 +1,39 @@
|
|
|
1
1
|
# @tankpkg/mcp-server
|
|
2
2
|
|
|
3
|
-
MCP (Model Context Protocol) server for Tank
|
|
3
|
+
MCP (Model Context Protocol) server for Tank — manage AI agent skills directly from your editor. Full CLI parity: every `tank` command is available as an MCP tool.
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
- **
|
|
9
|
-
- **
|
|
10
|
-
- **
|
|
11
|
-
|
|
7
|
+
### Authentication
|
|
8
|
+
- **login** — Authenticate with Tank via GitHub OAuth
|
|
9
|
+
- **logout** — Clear stored credentials
|
|
10
|
+
- **whoami** — Show current user info
|
|
11
|
+
|
|
12
|
+
### Project Setup
|
|
13
|
+
- **init-skill** — Create `skills.json` and `SKILL.md` scaffold
|
|
14
|
+
|
|
15
|
+
### Publishing & Discovery
|
|
16
|
+
- **publish-skill** — Publish a skill to the Tank registry (with dry-run support)
|
|
17
|
+
- **search-skills** — Search the Tank registry for skills
|
|
18
|
+
- **skill-info** — Get detailed information about a specific skill
|
|
19
|
+
|
|
20
|
+
### Installation & Management
|
|
21
|
+
- **install-skill** — Install a skill with SHA-512 verification
|
|
22
|
+
- **update-skill** — Update skills within semver range
|
|
23
|
+
- **remove-skill** — Remove a skill and clean up lockfile
|
|
24
|
+
|
|
25
|
+
### Security & Verification
|
|
26
|
+
- **scan-skill** — Scan any directory for security issues (skills.json not required)
|
|
27
|
+
- **verify-skills** — Verify lockfile integrity
|
|
28
|
+
- **audit-skill** — Show security scan results and verdict
|
|
29
|
+
- **skill-permissions** — Display per-skill permission summary
|
|
30
|
+
|
|
31
|
+
### Agent Integration
|
|
32
|
+
- **link-skill** — Symlink a skill into an agent workspace
|
|
33
|
+
- **unlink-skill** — Remove a skill symlink
|
|
34
|
+
|
|
35
|
+
### Diagnostics
|
|
36
|
+
- **doctor** — Check config, auth, registry connectivity, and Node.js version
|
|
12
37
|
|
|
13
38
|
## Installation
|
|
14
39
|
|
|
@@ -81,34 +106,17 @@ Alternatively, set the `TANK_TOKEN` environment variable:
|
|
|
81
106
|
|
|
82
107
|
Once configured, talk to your AI agent naturally:
|
|
83
108
|
|
|
84
|
-
### Scan a skill for security issues
|
|
85
|
-
|
|
86
|
-
```
|
|
87
|
-
"Scan my skill in the ./my-skill folder for security issues"
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
### Publish a skill
|
|
91
|
-
|
|
92
|
-
```
|
|
93
|
-
"Publish my-skill as a public package"
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
### Dry run before publishing
|
|
97
|
-
|
|
98
|
-
```
|
|
99
|
-
"Do a dry run publish of my skill to check if everything looks good"
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
### Search for skills
|
|
103
|
-
|
|
104
|
-
```
|
|
105
|
-
"Search Tank for code review skills"
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
### Get skill info
|
|
109
|
-
|
|
110
109
|
```
|
|
111
|
-
"
|
|
110
|
+
"Initialize a new skill in this directory"
|
|
111
|
+
"Scan my skill for security issues"
|
|
112
|
+
"Publish my skill to Tank"
|
|
113
|
+
"Install @acme/code-review"
|
|
114
|
+
"Update all my skills"
|
|
115
|
+
"Search Tank for testing skills"
|
|
116
|
+
"Show permissions for my installed skills"
|
|
117
|
+
"Run tank doctor to check my setup"
|
|
118
|
+
"Audit @acme/code-review for security issues"
|
|
119
|
+
"Link this skill to my Claude workspace"
|
|
112
120
|
```
|
|
113
121
|
|
|
114
122
|
## Development
|
package/dist/index.js
CHANGED
|
@@ -7,6 +7,18 @@ import { registerSearchSkillsTool } from './tools/search-skills.js';
|
|
|
7
7
|
import { registerSkillInfoTool } from './tools/skill-info.js';
|
|
8
8
|
import { registerScanSkillTool } from './tools/scan-skill.js';
|
|
9
9
|
import { registerPublishSkillTool } from './tools/publish-skill.js';
|
|
10
|
+
import { registerLogoutTool } from './tools/logout.js';
|
|
11
|
+
import { registerWhoamiTool } from './tools/whoami.js';
|
|
12
|
+
import { registerInitSkillTool } from './tools/init-skill.js';
|
|
13
|
+
import { registerRemoveSkillTool } from './tools/remove-skill.js';
|
|
14
|
+
import { registerVerifySkillsTool } from './tools/verify-skills.js';
|
|
15
|
+
import { registerLinkSkillTool } from './tools/link-skill.js';
|
|
16
|
+
import { registerUnlinkSkillTool } from './tools/unlink-skill.js';
|
|
17
|
+
import { registerDoctorTool } from './tools/doctor.js';
|
|
18
|
+
import { registerSkillPermissionsTool } from './tools/skill-permissions.js';
|
|
19
|
+
import { registerInstallSkillTool } from './tools/install-skill.js';
|
|
20
|
+
import { registerUpdateSkillTool } from './tools/update-skill.js';
|
|
21
|
+
import { registerAuditSkillTool } from './tools/audit-skill.js';
|
|
10
22
|
// Create MCP server instance
|
|
11
23
|
const server = new McpServer({
|
|
12
24
|
name: 'tank',
|
|
@@ -18,6 +30,18 @@ registerSearchSkillsTool(server);
|
|
|
18
30
|
registerSkillInfoTool(server);
|
|
19
31
|
registerScanSkillTool(server);
|
|
20
32
|
registerPublishSkillTool(server);
|
|
33
|
+
registerLogoutTool(server);
|
|
34
|
+
registerWhoamiTool(server);
|
|
35
|
+
registerInitSkillTool(server);
|
|
36
|
+
registerRemoveSkillTool(server);
|
|
37
|
+
registerVerifySkillsTool(server);
|
|
38
|
+
registerLinkSkillTool(server);
|
|
39
|
+
registerUnlinkSkillTool(server);
|
|
40
|
+
registerDoctorTool(server);
|
|
41
|
+
registerSkillPermissionsTool(server);
|
|
42
|
+
registerInstallSkillTool(server);
|
|
43
|
+
registerUpdateSkillTool(server);
|
|
44
|
+
registerAuditSkillTool(server);
|
|
21
45
|
// Start stdio transport
|
|
22
46
|
async function main() {
|
|
23
47
|
const transport = new StdioServerTransport();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,eAAe;AACf,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,eAAe;AACf,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAC5E,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,6BAA6B;AAC7B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,qBAAqB;AACrB,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAC1B,wBAAwB,CAAC,MAAM,CAAC,CAAC;AACjC,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC9B,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC9B,wBAAwB,CAAC,MAAM,CAAC,CAAC;AACjC,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAC3B,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAC3B,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC9B,uBAAuB,CAAC,MAAM,CAAC,CAAC;AAChC,wBAAwB,CAAC,MAAM,CAAC,CAAC;AACjC,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC9B,uBAAuB,CAAC,MAAM,CAAC,CAAC;AAChC,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAC3B,4BAA4B,CAAC,MAAM,CAAC,CAAC;AACrC,wBAAwB,CAAC,MAAM,CAAC,CAAC;AACjC,uBAAuB,CAAC,MAAM,CAAC,CAAC;AAChC,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAE/B,wBAAwB;AACxB,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;IAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/lib/api-client.d.ts
CHANGED
|
@@ -30,15 +30,16 @@ export declare class TankApiClient {
|
|
|
30
30
|
status: number;
|
|
31
31
|
ok: false;
|
|
32
32
|
}>;
|
|
33
|
-
/**
|
|
34
|
-
* Verify current auth token is valid.
|
|
35
|
-
*/
|
|
36
33
|
verifyAuth(): Promise<{
|
|
37
|
-
valid:
|
|
38
|
-
user
|
|
34
|
+
valid: true;
|
|
35
|
+
user: {
|
|
39
36
|
name: string | null;
|
|
40
37
|
email: string | null;
|
|
41
38
|
};
|
|
39
|
+
} | {
|
|
40
|
+
valid: false;
|
|
41
|
+
reason: 'no-token' | 'unauthorized' | 'network-error';
|
|
42
|
+
error?: string;
|
|
42
43
|
}>;
|
|
43
44
|
}
|
|
44
45
|
//# sourceMappingURL=api-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAa;gBAEf,OAAO,GAAE,gBAAqB;IAI1C;;OAEG;IACH,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,GAAG,SAAS,CAE9B;IAED;;OAEG;IACH,IAAI,eAAe,IAAI,OAAO,CAE7B;IAED;;OAEG;IACG,KAAK,CAAC,CAAC,EACX,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,CAAC;QAAC,EAAE,EAAE,IAAI,CAAA;KAAE,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,KAAK,CAAA;KAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAa;gBAEf,OAAO,GAAE,gBAAqB;IAI1C;;OAEG;IACH,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,GAAG,SAAS,CAE9B;IAED;;OAEG;IACH,IAAI,eAAe,IAAI,OAAO,CAE7B;IAED;;OAEG;IACG,KAAK,CAAC,CAAC,EACX,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,CAAC;QAAC,EAAE,EAAE,IAAI,CAAA;KAAE,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,KAAK,CAAA;KAAE,CAAC;IAqC1E,UAAU,IAAI,OAAO,CACvB;QAAE,KAAK,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE;YAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;YAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;SAAE,CAAA;KAAE,GACpE;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,UAAU,GAAG,cAAc,GAAG,eAAe,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAC1F;CAmBF"}
|
package/dist/lib/api-client.js
CHANGED
|
@@ -61,18 +61,18 @@ export class TankApiClient {
|
|
|
61
61
|
};
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
|
-
/**
|
|
65
|
-
* Verify current auth token is valid.
|
|
66
|
-
*/
|
|
67
64
|
async verifyAuth() {
|
|
68
65
|
if (!this.config.token) {
|
|
69
|
-
return { valid: false };
|
|
66
|
+
return { valid: false, reason: 'no-token' };
|
|
70
67
|
}
|
|
71
68
|
const result = await this.fetch('/api/v1/auth/whoami');
|
|
72
69
|
if (result.ok) {
|
|
73
|
-
return { valid: true, user: result.data.
|
|
70
|
+
return { valid: true, user: { name: result.data.name, email: result.data.email } };
|
|
71
|
+
}
|
|
72
|
+
if (result.status === 0) {
|
|
73
|
+
return { valid: false, reason: 'network-error', error: result.error };
|
|
74
74
|
}
|
|
75
|
-
return { valid: false };
|
|
75
|
+
return { valid: false, reason: 'unauthorized' };
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
78
|
//# sourceMappingURL=api-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAmB,MAAM,aAAa,CAAC;AAMzD;;GAEG;AACH,MAAM,OAAO,aAAa;IAChB,MAAM,CAAa;IAE3B,YAAY,UAA4B,EAAE;QACxC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAI,eAAe;QACjB,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CACT,IAAY,EACZ,UAAuB,EAAE;QAEzB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QACrC,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,GAAI,OAAO,CAAC,OAAkC;SAC/C,CAAC;QAEF,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC3D,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAChC,GAAG,OAAO;gBACV,OAAO;aACR,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACrD,OAAO;oBACL,KAAK,EAAG,IAA2B,CAAC,KAAK,IAAI,QAAQ,CAAC,UAAU;oBAChE,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,EAAE,EAAE,KAAK;iBACV,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAO,CAAC;YACxC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QAC5B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;gBAC3D,MAAM,EAAE,CAAC;gBACT,EAAE,EAAE,KAAK;aACV,CAAC;QACJ,CAAC;IACH,CAAC;IAED
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/packer.d.ts
CHANGED
|
@@ -11,4 +11,24 @@ export interface PackResult {
|
|
|
11
11
|
* Pack a skill directory into a .tgz tarball with integrity hashing.
|
|
12
12
|
*/
|
|
13
13
|
export declare function pack(directory: string): Promise<PackResult>;
|
|
14
|
+
/**
|
|
15
|
+
* Pack a directory into a .tgz tarball for security scanning.
|
|
16
|
+
*
|
|
17
|
+
* Unlike pack(), this function does NOT require skills.json or SKILL.md.
|
|
18
|
+
* It applies the same security checks (no symlinks, no path traversal, etc.)
|
|
19
|
+
* and returns the same PackResult interface with a synthesised manifest.
|
|
20
|
+
*
|
|
21
|
+
* Validates:
|
|
22
|
+
* - Directory exists
|
|
23
|
+
* - No symlinks or hardlinks
|
|
24
|
+
* - No path traversal (.. components)
|
|
25
|
+
* - No absolute paths
|
|
26
|
+
* - File count <= 1000
|
|
27
|
+
* - Tarball size <= 50MB
|
|
28
|
+
*
|
|
29
|
+
* Does NOT validate:
|
|
30
|
+
* - skills.json existence or validity
|
|
31
|
+
* - SKILL.md existence (but reads it if present)
|
|
32
|
+
*/
|
|
33
|
+
export declare function packForScan(directory: string): Promise<PackResult>;
|
|
14
34
|
//# sourceMappingURL=packer.d.ts.map
|
package/dist/lib/packer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packer.d.ts","sourceRoot":"","sources":["../../src/lib/packer.ts"],"names":[],"mappings":"AA4BA,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;GAEG;AACH,wBAAsB,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAkGjE"}
|
|
1
|
+
{"version":3,"file":"packer.d.ts","sourceRoot":"","sources":["../../src/lib/packer.ts"],"names":[],"mappings":"AA4BA,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;GAEG;AACH,wBAAsB,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAkGjE;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAiFxE"}
|
package/dist/lib/packer.js
CHANGED
|
@@ -105,6 +105,91 @@ export async function pack(directory) {
|
|
|
105
105
|
manifest: validation.data,
|
|
106
106
|
};
|
|
107
107
|
}
|
|
108
|
+
/**
|
|
109
|
+
* Pack a directory into a .tgz tarball for security scanning.
|
|
110
|
+
*
|
|
111
|
+
* Unlike pack(), this function does NOT require skills.json or SKILL.md.
|
|
112
|
+
* It applies the same security checks (no symlinks, no path traversal, etc.)
|
|
113
|
+
* and returns the same PackResult interface with a synthesised manifest.
|
|
114
|
+
*
|
|
115
|
+
* Validates:
|
|
116
|
+
* - Directory exists
|
|
117
|
+
* - No symlinks or hardlinks
|
|
118
|
+
* - No path traversal (.. components)
|
|
119
|
+
* - No absolute paths
|
|
120
|
+
* - File count <= 1000
|
|
121
|
+
* - Tarball size <= 50MB
|
|
122
|
+
*
|
|
123
|
+
* Does NOT validate:
|
|
124
|
+
* - skills.json existence or validity
|
|
125
|
+
* - SKILL.md existence (but reads it if present)
|
|
126
|
+
*/
|
|
127
|
+
export async function packForScan(directory) {
|
|
128
|
+
const absDir = path.resolve(directory);
|
|
129
|
+
// 1. Verify directory exists
|
|
130
|
+
if (!fs.existsSync(absDir)) {
|
|
131
|
+
throw new Error(`Directory does not exist: ${absDir}`);
|
|
132
|
+
}
|
|
133
|
+
const stat = fs.statSync(absDir);
|
|
134
|
+
if (!stat.isDirectory()) {
|
|
135
|
+
throw new Error(`Not a directory: ${absDir}`);
|
|
136
|
+
}
|
|
137
|
+
// 2. Try to read SKILL.md if it exists (optional for scan)
|
|
138
|
+
let readmeContent = '';
|
|
139
|
+
const skillMdPath = path.join(absDir, 'SKILL.md');
|
|
140
|
+
if (fs.existsSync(skillMdPath)) {
|
|
141
|
+
try {
|
|
142
|
+
readmeContent = fs.readFileSync(skillMdPath, 'utf-8');
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
readmeContent = '';
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// 3. Build ignore filter
|
|
149
|
+
const ig = buildIgnoreFilter(absDir);
|
|
150
|
+
// 4. Collect files with validation
|
|
151
|
+
const files = collectFiles(absDir, absDir, ig);
|
|
152
|
+
// 5. Enforce file count limit
|
|
153
|
+
if (files.length > MAX_FILE_COUNT) {
|
|
154
|
+
throw new Error(`Too many files: ${files.length} exceeds maximum of ${MAX_FILE_COUNT}`);
|
|
155
|
+
}
|
|
156
|
+
// 6. Check for empty directory (no files to scan)
|
|
157
|
+
if (files.length === 0) {
|
|
158
|
+
throw new Error('No files to scan: directory is empty or all files are ignored');
|
|
159
|
+
}
|
|
160
|
+
// 7. Calculate total size of source files
|
|
161
|
+
let totalSize = 0;
|
|
162
|
+
for (const file of files) {
|
|
163
|
+
const filePath = path.join(absDir, file);
|
|
164
|
+
const fileStat = fs.statSync(filePath);
|
|
165
|
+
totalSize += fileStat.size;
|
|
166
|
+
}
|
|
167
|
+
// 8. Create tarball
|
|
168
|
+
const tarball = await createTarball(absDir, files);
|
|
169
|
+
// 9. Enforce tarball size limit
|
|
170
|
+
if (tarball.length > MAX_PACKAGE_SIZE) {
|
|
171
|
+
throw new Error(`Tarball too large: ${tarball.length} bytes exceeds maximum of ${MAX_PACKAGE_SIZE} bytes (50MB)`);
|
|
172
|
+
}
|
|
173
|
+
// 10. Compute integrity hash
|
|
174
|
+
const hash = crypto.createHash('sha512').update(tarball).digest('base64');
|
|
175
|
+
const integrity = `sha512-${hash}`;
|
|
176
|
+
// 11. Synthesise a minimal manifest
|
|
177
|
+
const dirName = path.basename(absDir);
|
|
178
|
+
const manifest = {
|
|
179
|
+
name: dirName,
|
|
180
|
+
version: '0.0.0',
|
|
181
|
+
description: 'Local scan',
|
|
182
|
+
};
|
|
183
|
+
return {
|
|
184
|
+
tarball,
|
|
185
|
+
integrity,
|
|
186
|
+
fileCount: files.length,
|
|
187
|
+
totalSize,
|
|
188
|
+
readme: readmeContent,
|
|
189
|
+
files,
|
|
190
|
+
manifest,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
108
193
|
/**
|
|
109
194
|
* Build an ignore filter from .tankignore, .gitignore, or defaults.
|
|
110
195
|
*/
|
package/dist/lib/packer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packer.js","sourceRoot":"","sources":["../../src/lib/packer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"packer.js","sourceRoot":"","sources":["../../src/lib/packer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-skill.d.ts","sourceRoot":"","sources":["../../src/tools/audit-skill.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA8FzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6L9D"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { TankApiClient } from '../lib/api-client.js';
|
|
5
|
+
const SCOPED_NAME_PATTERN = /^@[a-z0-9-]+\/[a-z0-9][a-z0-9-]*$/;
|
|
6
|
+
function parseLockKey(key) {
|
|
7
|
+
const lastAt = key.lastIndexOf('@');
|
|
8
|
+
if (lastAt <= 0)
|
|
9
|
+
return null;
|
|
10
|
+
return { name: key.slice(0, lastAt), version: key.slice(lastAt + 1) };
|
|
11
|
+
}
|
|
12
|
+
function deriveVerdict(score, status) {
|
|
13
|
+
if (status !== 'completed' || score === null)
|
|
14
|
+
return 'PENDING';
|
|
15
|
+
if (score >= 7)
|
|
16
|
+
return 'PASS';
|
|
17
|
+
if (score >= 4)
|
|
18
|
+
return 'FLAGGED';
|
|
19
|
+
return 'FAIL';
|
|
20
|
+
}
|
|
21
|
+
function formatFindings(findings) {
|
|
22
|
+
if (findings.length === 0)
|
|
23
|
+
return '';
|
|
24
|
+
const bySeverity = {
|
|
25
|
+
critical: [],
|
|
26
|
+
high: [],
|
|
27
|
+
medium: [],
|
|
28
|
+
low: [],
|
|
29
|
+
};
|
|
30
|
+
for (const f of findings) {
|
|
31
|
+
if (bySeverity[f.severity]) {
|
|
32
|
+
bySeverity[f.severity].push(f);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const lines = ['', `### Findings (${findings.length})`];
|
|
36
|
+
for (const severity of ['critical', 'high', 'medium', 'low']) {
|
|
37
|
+
const group = bySeverity[severity];
|
|
38
|
+
if (group.length === 0)
|
|
39
|
+
continue;
|
|
40
|
+
lines.push(`\n**${severity.toUpperCase()} (${group.length}):**`);
|
|
41
|
+
for (const f of group) {
|
|
42
|
+
lines.push(`- ${f.type}: ${f.description}${f.location ? ` (${f.location})` : ''}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return lines.join('\n');
|
|
46
|
+
}
|
|
47
|
+
export function registerAuditSkillTool(server) {
|
|
48
|
+
server.tool('audit-skill', 'Show security audit results for a skill from the Tank registry.', {
|
|
49
|
+
name: z.string().describe('Skill name in @org/name format'),
|
|
50
|
+
version: z.string().optional().describe('Specific version to audit (defaults to installed or latest)'),
|
|
51
|
+
}, async ({ name, version }) => {
|
|
52
|
+
if (!SCOPED_NAME_PATTERN.test(name)) {
|
|
53
|
+
return {
|
|
54
|
+
content: [{
|
|
55
|
+
type: 'text',
|
|
56
|
+
text: `Validation error: Skill name "${name}" must use the @org/name format (e.g. @acme/my-skill).`,
|
|
57
|
+
}],
|
|
58
|
+
isError: true,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
const client = new TankApiClient();
|
|
62
|
+
if (!client.isAuthenticated) {
|
|
63
|
+
return {
|
|
64
|
+
content: [{
|
|
65
|
+
type: 'text',
|
|
66
|
+
text: 'Authentication required. Please run the "login" tool first to authenticate with Tank.',
|
|
67
|
+
}],
|
|
68
|
+
isError: true,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
const encodedName = encodeURIComponent(name);
|
|
72
|
+
// If no version specified, try to find installed version from lockfile
|
|
73
|
+
let targetVersion = version;
|
|
74
|
+
if (!targetVersion) {
|
|
75
|
+
const lockPath = path.join(process.cwd(), 'skills.lock');
|
|
76
|
+
if (fs.existsSync(lockPath)) {
|
|
77
|
+
try {
|
|
78
|
+
const raw = fs.readFileSync(lockPath, 'utf-8');
|
|
79
|
+
const lock = JSON.parse(raw);
|
|
80
|
+
for (const key of Object.keys(lock.skills)) {
|
|
81
|
+
const parsed = parseLockKey(key);
|
|
82
|
+
if (parsed && parsed.name === name) {
|
|
83
|
+
targetVersion = parsed.version;
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// Lockfile unreadable — fall through to fetch latest
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// If still no version, fetch skill metadata to get latest
|
|
94
|
+
if (!targetVersion) {
|
|
95
|
+
const metaResult = await client.fetch(`/api/v1/skills/${encodedName}`);
|
|
96
|
+
if (!metaResult.ok) {
|
|
97
|
+
if (metaResult.status === 0) {
|
|
98
|
+
return {
|
|
99
|
+
content: [{
|
|
100
|
+
type: 'text',
|
|
101
|
+
text: 'Unable to connect to the Tank registry. Check your network connection and try again.',
|
|
102
|
+
}],
|
|
103
|
+
isError: true,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
if (metaResult.status === 404) {
|
|
107
|
+
return {
|
|
108
|
+
content: [{
|
|
109
|
+
type: 'text',
|
|
110
|
+
text: `Skill "${name}" not found in the Tank registry.`,
|
|
111
|
+
}],
|
|
112
|
+
isError: true,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
content: [{
|
|
117
|
+
type: 'text',
|
|
118
|
+
text: `Failed to fetch skill metadata: ${metaResult.error}`,
|
|
119
|
+
}],
|
|
120
|
+
isError: true,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
targetVersion = metaResult.data.latestVersion;
|
|
124
|
+
}
|
|
125
|
+
// Fetch version details with audit data
|
|
126
|
+
const versionResult = await client.fetch(`/api/v1/skills/${encodedName}/${targetVersion}`);
|
|
127
|
+
if (!versionResult.ok) {
|
|
128
|
+
if (versionResult.status === 0) {
|
|
129
|
+
return {
|
|
130
|
+
content: [{
|
|
131
|
+
type: 'text',
|
|
132
|
+
text: 'Unable to connect to the Tank registry. Check your network connection and try again.',
|
|
133
|
+
}],
|
|
134
|
+
isError: true,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
if (versionResult.status === 404) {
|
|
138
|
+
return {
|
|
139
|
+
content: [{
|
|
140
|
+
type: 'text',
|
|
141
|
+
text: `Skill "${name}" version "${targetVersion}" not found in the Tank registry.`,
|
|
142
|
+
}],
|
|
143
|
+
isError: true,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
content: [{
|
|
148
|
+
type: 'text',
|
|
149
|
+
text: `Failed to fetch audit data: ${versionResult.error}`,
|
|
150
|
+
}],
|
|
151
|
+
isError: true,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
const details = versionResult.data;
|
|
155
|
+
const verdict = deriveVerdict(details.auditScore, details.auditStatus);
|
|
156
|
+
if (details.auditStatus !== 'completed') {
|
|
157
|
+
return {
|
|
158
|
+
content: [{
|
|
159
|
+
type: 'text',
|
|
160
|
+
text: [
|
|
161
|
+
`## Audit: ${name}@${targetVersion}`,
|
|
162
|
+
'',
|
|
163
|
+
`**Status:** Pending security review`,
|
|
164
|
+
`**Scan Status:** ${details.auditStatus}`,
|
|
165
|
+
'',
|
|
166
|
+
'This skill has not yet been through security scanning. Results will be available once the scan completes.',
|
|
167
|
+
].join('\n'),
|
|
168
|
+
}],
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
// Try to fetch detailed scan results
|
|
172
|
+
let findingsText = '';
|
|
173
|
+
const scanResult = await client.fetch(`/api/v1/skills/${encodedName}/${targetVersion}/scan`);
|
|
174
|
+
if (scanResult.ok && scanResult.data.findings) {
|
|
175
|
+
findingsText = formatFindings(scanResult.data.findings);
|
|
176
|
+
}
|
|
177
|
+
const score = details.auditScore !== null ? details.auditScore.toFixed(1) : 'N/A';
|
|
178
|
+
const lines = [
|
|
179
|
+
`## Audit: ${name}@${targetVersion}`,
|
|
180
|
+
'',
|
|
181
|
+
`**Verdict:** ${verdict}`,
|
|
182
|
+
`**Score:** ${score}/10`,
|
|
183
|
+
`**Scanned:** ${details.publishedAt}`,
|
|
184
|
+
`**Version:** ${targetVersion}`,
|
|
185
|
+
];
|
|
186
|
+
if (details.permissions) {
|
|
187
|
+
lines.push('', '**Permissions:**');
|
|
188
|
+
const p = details.permissions;
|
|
189
|
+
if (p.network?.outbound?.length) {
|
|
190
|
+
lines.push(` - Network: ${p.network.outbound.join(', ')}`);
|
|
191
|
+
}
|
|
192
|
+
if (p.filesystem?.read?.length || p.filesystem?.write?.length) {
|
|
193
|
+
const parts = [];
|
|
194
|
+
if (p.filesystem.read?.length)
|
|
195
|
+
parts.push(`read: ${p.filesystem.read.join(', ')}`);
|
|
196
|
+
if (p.filesystem.write?.length)
|
|
197
|
+
parts.push(`write: ${p.filesystem.write.join(', ')}`);
|
|
198
|
+
lines.push(` - Filesystem: ${parts.join('; ')}`);
|
|
199
|
+
}
|
|
200
|
+
lines.push(` - Subprocess: ${p.subprocess ? 'yes' : 'no'}`);
|
|
201
|
+
}
|
|
202
|
+
if (findingsText) {
|
|
203
|
+
lines.push(findingsText);
|
|
204
|
+
}
|
|
205
|
+
return {
|
|
206
|
+
content: [{
|
|
207
|
+
type: 'text',
|
|
208
|
+
text: lines.join('\n'),
|
|
209
|
+
}],
|
|
210
|
+
};
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=audit-skill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-skill.js","sourceRoot":"","sources":["../../src/tools/audit-skill.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/tools/doctor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA0KzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkB1D"}
|