@tankpkg/mcp-server 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/README.md +11 -4
- package/dist/index.d.ts +1 -3
- package/dist/index.js +2215 -29
- package/dist/index.js.map +1 -1
- package/package.json +20 -14
- package/LICENSE +0 -21
- package/dist/index.d.ts.map +0 -1
- package/dist/lib/api-client.d.ts +0 -45
- package/dist/lib/api-client.d.ts.map +0 -1
- package/dist/lib/api-client.js +0 -78
- package/dist/lib/api-client.js.map +0 -1
- package/dist/lib/config.d.ts +0 -25
- package/dist/lib/config.d.ts.map +0 -1
- package/dist/lib/config.js +0 -59
- package/dist/lib/config.js.map +0 -1
- package/dist/lib/packer.d.ts +0 -34
- package/dist/lib/packer.d.ts.map +0 -1
- package/dist/lib/packer.js +0 -276
- package/dist/lib/packer.js.map +0 -1
- package/dist/tools/audit-skill.d.ts +0 -3
- package/dist/tools/audit-skill.d.ts.map +0 -1
- package/dist/tools/audit-skill.js +0 -213
- package/dist/tools/audit-skill.js.map +0 -1
- package/dist/tools/doctor.d.ts +0 -3
- package/dist/tools/doctor.d.ts.map +0 -1
- package/dist/tools/doctor.js +0 -158
- package/dist/tools/doctor.js.map +0 -1
- package/dist/tools/init-skill.d.ts +0 -3
- package/dist/tools/init-skill.d.ts.map +0 -1
- package/dist/tools/init-skill.js +0 -72
- package/dist/tools/init-skill.js.map +0 -1
- package/dist/tools/install-skill.d.ts +0 -3
- package/dist/tools/install-skill.d.ts.map +0 -1
- package/dist/tools/install-skill.js +0 -206
- package/dist/tools/install-skill.js.map +0 -1
- package/dist/tools/link-skill.d.ts +0 -3
- package/dist/tools/link-skill.d.ts.map +0 -1
- package/dist/tools/link-skill.js +0 -81
- package/dist/tools/link-skill.js.map +0 -1
- package/dist/tools/login.d.ts +0 -3
- package/dist/tools/login.d.ts.map +0 -1
- package/dist/tools/login.js +0 -104
- package/dist/tools/login.js.map +0 -1
- package/dist/tools/logout.d.ts +0 -3
- package/dist/tools/logout.d.ts.map +0 -1
- package/dist/tools/logout.js +0 -19
- package/dist/tools/logout.js.map +0 -1
- package/dist/tools/publish-skill.d.ts +0 -3
- package/dist/tools/publish-skill.d.ts.map +0 -1
- package/dist/tools/publish-skill.js +0 -166
- package/dist/tools/publish-skill.js.map +0 -1
- package/dist/tools/remove-skill.d.ts +0 -3
- package/dist/tools/remove-skill.d.ts.map +0 -1
- package/dist/tools/remove-skill.js +0 -110
- package/dist/tools/remove-skill.js.map +0 -1
- package/dist/tools/scan-skill.d.ts +0 -3
- package/dist/tools/scan-skill.d.ts.map +0 -1
- package/dist/tools/scan-skill.js +0 -200
- package/dist/tools/scan-skill.js.map +0 -1
- package/dist/tools/search-skills.d.ts +0 -3
- package/dist/tools/search-skills.d.ts.map +0 -1
- package/dist/tools/search-skills.js +0 -54
- package/dist/tools/search-skills.js.map +0 -1
- package/dist/tools/skill-info.d.ts +0 -3
- package/dist/tools/skill-info.d.ts.map +0 -1
- package/dist/tools/skill-info.js +0 -88
- package/dist/tools/skill-info.js.map +0 -1
- package/dist/tools/skill-permissions.d.ts +0 -3
- package/dist/tools/skill-permissions.d.ts.map +0 -1
- package/dist/tools/skill-permissions.js +0 -311
- package/dist/tools/skill-permissions.js.map +0 -1
- package/dist/tools/unlink-skill.d.ts +0 -3
- package/dist/tools/unlink-skill.d.ts.map +0 -1
- package/dist/tools/unlink-skill.js +0 -72
- package/dist/tools/unlink-skill.js.map +0 -1
- package/dist/tools/update-skill.d.ts +0 -3
- package/dist/tools/update-skill.d.ts.map +0 -1
- package/dist/tools/update-skill.js +0 -317
- package/dist/tools/update-skill.js.map +0 -1
- package/dist/tools/verify-skills.d.ts +0 -3
- package/dist/tools/verify-skills.d.ts.map +0 -1
- package/dist/tools/verify-skills.js +0 -121
- package/dist/tools/verify-skills.js.map +0 -1
- package/dist/tools/whoami.d.ts +0 -3
- package/dist/tools/whoami.d.ts.map +0 -1
- package/dist/tools/whoami.js +0 -29
- package/dist/tools/whoami.js.map +0 -1
package/dist/lib/api-client.js
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { getConfig } from './config.js';
|
|
2
|
-
/**
|
|
3
|
-
* Tank API client for MCP server.
|
|
4
|
-
*/
|
|
5
|
-
export class TankApiClient {
|
|
6
|
-
config;
|
|
7
|
-
constructor(options = {}) {
|
|
8
|
-
this.config = getConfig(options.configDir);
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* Get the base URL for the Tank API.
|
|
12
|
-
*/
|
|
13
|
-
get baseUrl() {
|
|
14
|
-
return this.config.registry;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Get the auth token (if available).
|
|
18
|
-
*/
|
|
19
|
-
get token() {
|
|
20
|
-
return this.config.token;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Check if authenticated.
|
|
24
|
-
*/
|
|
25
|
-
get isAuthenticated() {
|
|
26
|
-
return !!this.config.token;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Make an authenticated API request.
|
|
30
|
-
*/
|
|
31
|
-
async fetch(path, options = {}) {
|
|
32
|
-
const url = `${this.baseUrl}${path}`;
|
|
33
|
-
const headers = {
|
|
34
|
-
'Content-Type': 'application/json',
|
|
35
|
-
...options.headers,
|
|
36
|
-
};
|
|
37
|
-
if (this.config.token) {
|
|
38
|
-
headers['Authorization'] = `Bearer ${this.config.token}`;
|
|
39
|
-
}
|
|
40
|
-
try {
|
|
41
|
-
const response = await fetch(url, {
|
|
42
|
-
...options,
|
|
43
|
-
headers,
|
|
44
|
-
});
|
|
45
|
-
if (!response.ok) {
|
|
46
|
-
const body = await response.json().catch(() => ({}));
|
|
47
|
-
return {
|
|
48
|
-
error: body.error ?? response.statusText,
|
|
49
|
-
status: response.status,
|
|
50
|
-
ok: false,
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
const data = await response.json();
|
|
54
|
-
return { data, ok: true };
|
|
55
|
-
}
|
|
56
|
-
catch (err) {
|
|
57
|
-
return {
|
|
58
|
-
error: err instanceof Error ? err.message : 'Network error',
|
|
59
|
-
status: 0,
|
|
60
|
-
ok: false,
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
async verifyAuth() {
|
|
65
|
-
if (!this.config.token) {
|
|
66
|
-
return { valid: false, reason: 'no-token' };
|
|
67
|
-
}
|
|
68
|
-
const result = await this.fetch('/api/v1/auth/whoami');
|
|
69
|
-
if (result.ok) {
|
|
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
|
-
}
|
|
75
|
-
return { valid: false, reason: 'unauthorized' };
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
//# sourceMappingURL=api-client.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/config.d.ts
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
export interface TankConfig {
|
|
2
|
-
token?: string;
|
|
3
|
-
user?: {
|
|
4
|
-
name: string;
|
|
5
|
-
email: string;
|
|
6
|
-
};
|
|
7
|
-
registry: string;
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Get the path to the tank config directory.
|
|
11
|
-
*/
|
|
12
|
-
export declare function getConfigDir(configDir?: string): string;
|
|
13
|
-
/**
|
|
14
|
-
* Get the path to the tank config file.
|
|
15
|
-
*/
|
|
16
|
-
export declare function getConfigPath(configDir?: string): string;
|
|
17
|
-
/**
|
|
18
|
-
* Read the tank config file. Returns defaults if file doesn't exist.
|
|
19
|
-
*/
|
|
20
|
-
export declare function getConfig(configDir?: string): TankConfig;
|
|
21
|
-
/**
|
|
22
|
-
* Write config to disk. Merges with existing config.
|
|
23
|
-
*/
|
|
24
|
-
export declare function setConfig(partial: Partial<TankConfig>, configDir?: string): void;
|
|
25
|
-
//# sourceMappingURL=config.d.ts.map
|
package/dist/lib/config.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAMD;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,UAAU,CAoBxD;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,EAC5B,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI,CAeN"}
|
package/dist/lib/config.js
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import os from 'node:os';
|
|
4
|
-
const DEFAULT_CONFIG = {
|
|
5
|
-
registry: 'https://tankpkg.dev',
|
|
6
|
-
};
|
|
7
|
-
/**
|
|
8
|
-
* Get the path to the tank config directory.
|
|
9
|
-
*/
|
|
10
|
-
export function getConfigDir(configDir) {
|
|
11
|
-
return configDir ?? path.join(os.homedir(), '.tank');
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Get the path to the tank config file.
|
|
15
|
-
*/
|
|
16
|
-
export function getConfigPath(configDir) {
|
|
17
|
-
return path.join(getConfigDir(configDir), 'config.json');
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Read the tank config file. Returns defaults if file doesn't exist.
|
|
21
|
-
*/
|
|
22
|
-
export function getConfig(configDir) {
|
|
23
|
-
const configPath = getConfigPath(configDir);
|
|
24
|
-
try {
|
|
25
|
-
const raw = fs.readFileSync(configPath, 'utf-8');
|
|
26
|
-
const parsed = JSON.parse(raw);
|
|
27
|
-
const merged = { ...DEFAULT_CONFIG, ...parsed };
|
|
28
|
-
// TANK_TOKEN env var takes priority
|
|
29
|
-
const envToken = process.env.TANK_TOKEN?.trim();
|
|
30
|
-
if (envToken) {
|
|
31
|
-
merged.token = envToken;
|
|
32
|
-
}
|
|
33
|
-
return merged;
|
|
34
|
-
}
|
|
35
|
-
catch {
|
|
36
|
-
const envToken = process.env.TANK_TOKEN?.trim();
|
|
37
|
-
return {
|
|
38
|
-
...DEFAULT_CONFIG,
|
|
39
|
-
...(envToken ? { token: envToken } : {}),
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Write config to disk. Merges with existing config.
|
|
45
|
-
*/
|
|
46
|
-
export function setConfig(partial, configDir) {
|
|
47
|
-
const dir = getConfigDir(configDir);
|
|
48
|
-
const configPath = getConfigPath(configDir);
|
|
49
|
-
if (!fs.existsSync(dir)) {
|
|
50
|
-
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
51
|
-
}
|
|
52
|
-
const existing = getConfig(configDir);
|
|
53
|
-
const merged = { ...existing, ...partial };
|
|
54
|
-
fs.writeFileSync(configPath, JSON.stringify(merged, null, 2) + '\n', {
|
|
55
|
-
encoding: 'utf-8',
|
|
56
|
-
mode: 0o600,
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
//# sourceMappingURL=config.js.map
|
package/dist/lib/config.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAQzB,MAAM,cAAc,GAAe;IACjC,QAAQ,EAAE,qBAAqB;CAChC,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,SAAkB;IAC7C,OAAO,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,SAAkB;IAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,aAAa,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,SAAkB;IAC1C,MAAM,UAAU,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IAE5C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAwB,CAAC;QACtD,MAAM,MAAM,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;QAChD,oCAAoC;QACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;QAChD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC;QAC1B,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;QAChD,OAAO;YACL,GAAG,cAAc;YACjB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzC,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CACvB,OAA4B,EAC5B,SAAkB;IAElB,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACpC,MAAM,UAAU,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IAE5C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC;IAE3C,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;QACnE,QAAQ,EAAE,OAAO;QACjB,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;AACL,CAAC"}
|
package/dist/lib/packer.d.ts
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
export interface PackResult {
|
|
2
|
-
tarball: Buffer;
|
|
3
|
-
integrity: string;
|
|
4
|
-
fileCount: number;
|
|
5
|
-
totalSize: number;
|
|
6
|
-
readme: string;
|
|
7
|
-
files: string[];
|
|
8
|
-
manifest: Record<string, unknown>;
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* Pack a skill directory into a .tgz tarball with integrity hashing.
|
|
12
|
-
*/
|
|
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>;
|
|
34
|
-
//# sourceMappingURL=packer.d.ts.map
|
package/dist/lib/packer.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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
DELETED
|
@@ -1,276 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import crypto from 'node:crypto';
|
|
4
|
-
import { create } from 'tar';
|
|
5
|
-
import ignore from 'ignore';
|
|
6
|
-
import { skillsJsonSchema } from '@tank/shared';
|
|
7
|
-
// Limits
|
|
8
|
-
const MAX_PACKAGE_SIZE = 50 * 1024 * 1024; // 50MB
|
|
9
|
-
const MAX_FILE_COUNT = 1000;
|
|
10
|
-
// Default ignore patterns
|
|
11
|
-
const DEFAULT_IGNORES = [
|
|
12
|
-
'node_modules',
|
|
13
|
-
'.git',
|
|
14
|
-
'.env*',
|
|
15
|
-
'*.log',
|
|
16
|
-
'.tank',
|
|
17
|
-
'.DS_Store',
|
|
18
|
-
];
|
|
19
|
-
// Always ignored regardless of ignore file contents
|
|
20
|
-
const ALWAYS_IGNORED = ['node_modules', '.git'];
|
|
21
|
-
// Ignore file names (not packed into tarball)
|
|
22
|
-
const IGNORE_FILES = ['.tankignore', '.gitignore'];
|
|
23
|
-
/**
|
|
24
|
-
* Pack a skill directory into a .tgz tarball with integrity hashing.
|
|
25
|
-
*/
|
|
26
|
-
export async function pack(directory) {
|
|
27
|
-
const absDir = path.resolve(directory);
|
|
28
|
-
// 1. Verify directory exists
|
|
29
|
-
if (!fs.existsSync(absDir)) {
|
|
30
|
-
throw new Error(`Directory does not exist: ${absDir}`);
|
|
31
|
-
}
|
|
32
|
-
const stat = fs.statSync(absDir);
|
|
33
|
-
if (!stat.isDirectory()) {
|
|
34
|
-
throw new Error(`Not a directory: ${absDir}`);
|
|
35
|
-
}
|
|
36
|
-
// 2. Verify skills.json exists and is valid
|
|
37
|
-
const skillsJsonPath = path.join(absDir, 'skills.json');
|
|
38
|
-
if (!fs.existsSync(skillsJsonPath)) {
|
|
39
|
-
throw new Error('Missing required file: skills.json');
|
|
40
|
-
}
|
|
41
|
-
let skillsJsonContent;
|
|
42
|
-
try {
|
|
43
|
-
skillsJsonContent = fs.readFileSync(skillsJsonPath, 'utf-8');
|
|
44
|
-
}
|
|
45
|
-
catch {
|
|
46
|
-
throw new Error('Failed to read skills.json');
|
|
47
|
-
}
|
|
48
|
-
let parsed;
|
|
49
|
-
try {
|
|
50
|
-
parsed = JSON.parse(skillsJsonContent);
|
|
51
|
-
}
|
|
52
|
-
catch {
|
|
53
|
-
throw new Error('Invalid skills.json: not valid JSON');
|
|
54
|
-
}
|
|
55
|
-
const validation = skillsJsonSchema.safeParse(parsed);
|
|
56
|
-
if (!validation.success) {
|
|
57
|
-
const issues = validation.error.issues
|
|
58
|
-
.map((i) => ` - ${i.path.join('.')}: ${i.message}`)
|
|
59
|
-
.join('\n');
|
|
60
|
-
throw new Error(`Invalid skills.json:\n${issues}`);
|
|
61
|
-
}
|
|
62
|
-
// 3. Verify SKILL.md exists and read its content
|
|
63
|
-
const skillMdPath = path.join(absDir, 'SKILL.md');
|
|
64
|
-
if (!fs.existsSync(skillMdPath)) {
|
|
65
|
-
throw new Error('Missing required file: SKILL.md');
|
|
66
|
-
}
|
|
67
|
-
let readmeContent;
|
|
68
|
-
try {
|
|
69
|
-
readmeContent = fs.readFileSync(skillMdPath, 'utf-8');
|
|
70
|
-
}
|
|
71
|
-
catch {
|
|
72
|
-
throw new Error('Failed to read SKILL.md');
|
|
73
|
-
}
|
|
74
|
-
// 4. Build ignore filter
|
|
75
|
-
const ig = buildIgnoreFilter(absDir);
|
|
76
|
-
// 5. Collect files with validation
|
|
77
|
-
const files = collectFiles(absDir, absDir, ig);
|
|
78
|
-
// 6. Enforce file count limit
|
|
79
|
-
if (files.length > MAX_FILE_COUNT) {
|
|
80
|
-
throw new Error(`Too many files: ${files.length} exceeds maximum of ${MAX_FILE_COUNT}`);
|
|
81
|
-
}
|
|
82
|
-
// 7. Calculate total size of source files
|
|
83
|
-
let totalSize = 0;
|
|
84
|
-
for (const file of files) {
|
|
85
|
-
const filePath = path.join(absDir, file);
|
|
86
|
-
const fileStat = fs.statSync(filePath);
|
|
87
|
-
totalSize += fileStat.size;
|
|
88
|
-
}
|
|
89
|
-
// 8. Create tarball
|
|
90
|
-
const tarball = await createTarball(absDir, files);
|
|
91
|
-
// 9. Enforce tarball size limit
|
|
92
|
-
if (tarball.length > MAX_PACKAGE_SIZE) {
|
|
93
|
-
throw new Error(`Tarball too large: ${tarball.length} bytes exceeds maximum of ${MAX_PACKAGE_SIZE} bytes (50MB)`);
|
|
94
|
-
}
|
|
95
|
-
// 10. Compute integrity hash
|
|
96
|
-
const hash = crypto.createHash('sha512').update(tarball).digest('base64');
|
|
97
|
-
const integrity = `sha512-${hash}`;
|
|
98
|
-
return {
|
|
99
|
-
tarball,
|
|
100
|
-
integrity,
|
|
101
|
-
fileCount: files.length,
|
|
102
|
-
totalSize,
|
|
103
|
-
readme: readmeContent,
|
|
104
|
-
files,
|
|
105
|
-
manifest: validation.data,
|
|
106
|
-
};
|
|
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
|
-
}
|
|
193
|
-
/**
|
|
194
|
-
* Build an ignore filter from .tankignore, .gitignore, or defaults.
|
|
195
|
-
*/
|
|
196
|
-
function buildIgnoreFilter(dir) {
|
|
197
|
-
const ig = ignore();
|
|
198
|
-
ig.add(ALWAYS_IGNORED);
|
|
199
|
-
const tankIgnorePath = path.join(dir, '.tankignore');
|
|
200
|
-
const gitIgnorePath = path.join(dir, '.gitignore');
|
|
201
|
-
if (fs.existsSync(tankIgnorePath)) {
|
|
202
|
-
const content = fs.readFileSync(tankIgnorePath, 'utf-8');
|
|
203
|
-
ig.add(content);
|
|
204
|
-
ig.add(IGNORE_FILES);
|
|
205
|
-
}
|
|
206
|
-
else if (fs.existsSync(gitIgnorePath)) {
|
|
207
|
-
const content = fs.readFileSync(gitIgnorePath, 'utf-8');
|
|
208
|
-
ig.add(content);
|
|
209
|
-
ig.add(IGNORE_FILES);
|
|
210
|
-
}
|
|
211
|
-
else {
|
|
212
|
-
ig.add(DEFAULT_IGNORES);
|
|
213
|
-
}
|
|
214
|
-
return ig;
|
|
215
|
-
}
|
|
216
|
-
/**
|
|
217
|
-
* Recursively collect files from a directory.
|
|
218
|
-
*/
|
|
219
|
-
function collectFiles(baseDir, currentDir, ig) {
|
|
220
|
-
const files = [];
|
|
221
|
-
const entries = fs.readdirSync(currentDir, { withFileTypes: true });
|
|
222
|
-
for (const entry of entries) {
|
|
223
|
-
const fullPath = path.join(currentDir, entry.name);
|
|
224
|
-
const relativePath = path.relative(baseDir, fullPath);
|
|
225
|
-
// Security: check for path traversal
|
|
226
|
-
if (relativePath.split(path.sep).includes('..')) {
|
|
227
|
-
throw new Error(`Path traversal detected: "${relativePath}" contains ".." component`);
|
|
228
|
-
}
|
|
229
|
-
// Security: check for absolute paths
|
|
230
|
-
if (path.isAbsolute(relativePath)) {
|
|
231
|
-
throw new Error(`Absolute path detected: "${relativePath}"`);
|
|
232
|
-
}
|
|
233
|
-
// Security: check for symlinks
|
|
234
|
-
const lstatResult = fs.lstatSync(fullPath);
|
|
235
|
-
if (lstatResult.isSymbolicLink()) {
|
|
236
|
-
throw new Error(`Symlink detected: "${relativePath}" — symlinks are not allowed`);
|
|
237
|
-
}
|
|
238
|
-
const pathForIgnore = lstatResult.isDirectory()
|
|
239
|
-
? relativePath + '/'
|
|
240
|
-
: relativePath;
|
|
241
|
-
if (ig.ignores(pathForIgnore)) {
|
|
242
|
-
continue;
|
|
243
|
-
}
|
|
244
|
-
if (lstatResult.isDirectory()) {
|
|
245
|
-
const subFiles = collectFiles(baseDir, fullPath, ig);
|
|
246
|
-
files.push(...subFiles);
|
|
247
|
-
}
|
|
248
|
-
else if (lstatResult.isFile()) {
|
|
249
|
-
files.push(relativePath);
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
return files;
|
|
253
|
-
}
|
|
254
|
-
/**
|
|
255
|
-
* Create a gzipped tarball from the given files.
|
|
256
|
-
*/
|
|
257
|
-
async function createTarball(cwd, files) {
|
|
258
|
-
return new Promise((resolve, reject) => {
|
|
259
|
-
const chunks = [];
|
|
260
|
-
const stream = create({
|
|
261
|
-
gzip: true,
|
|
262
|
-
cwd,
|
|
263
|
-
portable: true,
|
|
264
|
-
}, files);
|
|
265
|
-
stream.on('data', (chunk) => {
|
|
266
|
-
chunks.push(chunk);
|
|
267
|
-
});
|
|
268
|
-
stream.on('end', () => {
|
|
269
|
-
resolve(Buffer.concat(chunks));
|
|
270
|
-
});
|
|
271
|
-
stream.on('error', (err) => {
|
|
272
|
-
reject(err);
|
|
273
|
-
});
|
|
274
|
-
});
|
|
275
|
-
}
|
|
276
|
-
//# sourceMappingURL=packer.js.map
|
package/dist/lib/packer.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"packer.js","sourceRoot":"","sources":["../../src/lib/packer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|