@tankpkg/mcp-server 0.7.0 → 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 (87) hide show
  1. package/README.md +11 -4
  2. package/dist/index.d.ts +1 -3
  3. package/dist/index.js +2215 -29
  4. package/dist/index.js.map +1 -1
  5. package/package.json +20 -14
  6. package/LICENSE +0 -21
  7. package/dist/index.d.ts.map +0 -1
  8. package/dist/lib/api-client.d.ts +0 -45
  9. package/dist/lib/api-client.d.ts.map +0 -1
  10. package/dist/lib/api-client.js +0 -78
  11. package/dist/lib/api-client.js.map +0 -1
  12. package/dist/lib/config.d.ts +0 -25
  13. package/dist/lib/config.d.ts.map +0 -1
  14. package/dist/lib/config.js +0 -59
  15. package/dist/lib/config.js.map +0 -1
  16. package/dist/lib/packer.d.ts +0 -34
  17. package/dist/lib/packer.d.ts.map +0 -1
  18. package/dist/lib/packer.js +0 -276
  19. package/dist/lib/packer.js.map +0 -1
  20. package/dist/tools/audit-skill.d.ts +0 -3
  21. package/dist/tools/audit-skill.d.ts.map +0 -1
  22. package/dist/tools/audit-skill.js +0 -213
  23. package/dist/tools/audit-skill.js.map +0 -1
  24. package/dist/tools/doctor.d.ts +0 -3
  25. package/dist/tools/doctor.d.ts.map +0 -1
  26. package/dist/tools/doctor.js +0 -158
  27. package/dist/tools/doctor.js.map +0 -1
  28. package/dist/tools/init-skill.d.ts +0 -3
  29. package/dist/tools/init-skill.d.ts.map +0 -1
  30. package/dist/tools/init-skill.js +0 -72
  31. package/dist/tools/init-skill.js.map +0 -1
  32. package/dist/tools/install-skill.d.ts +0 -3
  33. package/dist/tools/install-skill.d.ts.map +0 -1
  34. package/dist/tools/install-skill.js +0 -206
  35. package/dist/tools/install-skill.js.map +0 -1
  36. package/dist/tools/link-skill.d.ts +0 -3
  37. package/dist/tools/link-skill.d.ts.map +0 -1
  38. package/dist/tools/link-skill.js +0 -81
  39. package/dist/tools/link-skill.js.map +0 -1
  40. package/dist/tools/login.d.ts +0 -3
  41. package/dist/tools/login.d.ts.map +0 -1
  42. package/dist/tools/login.js +0 -104
  43. package/dist/tools/login.js.map +0 -1
  44. package/dist/tools/logout.d.ts +0 -3
  45. package/dist/tools/logout.d.ts.map +0 -1
  46. package/dist/tools/logout.js +0 -19
  47. package/dist/tools/logout.js.map +0 -1
  48. package/dist/tools/publish-skill.d.ts +0 -3
  49. package/dist/tools/publish-skill.d.ts.map +0 -1
  50. package/dist/tools/publish-skill.js +0 -166
  51. package/dist/tools/publish-skill.js.map +0 -1
  52. package/dist/tools/remove-skill.d.ts +0 -3
  53. package/dist/tools/remove-skill.d.ts.map +0 -1
  54. package/dist/tools/remove-skill.js +0 -110
  55. package/dist/tools/remove-skill.js.map +0 -1
  56. package/dist/tools/scan-skill.d.ts +0 -3
  57. package/dist/tools/scan-skill.d.ts.map +0 -1
  58. package/dist/tools/scan-skill.js +0 -200
  59. package/dist/tools/scan-skill.js.map +0 -1
  60. package/dist/tools/search-skills.d.ts +0 -3
  61. package/dist/tools/search-skills.d.ts.map +0 -1
  62. package/dist/tools/search-skills.js +0 -54
  63. package/dist/tools/search-skills.js.map +0 -1
  64. package/dist/tools/skill-info.d.ts +0 -3
  65. package/dist/tools/skill-info.d.ts.map +0 -1
  66. package/dist/tools/skill-info.js +0 -88
  67. package/dist/tools/skill-info.js.map +0 -1
  68. package/dist/tools/skill-permissions.d.ts +0 -3
  69. package/dist/tools/skill-permissions.d.ts.map +0 -1
  70. package/dist/tools/skill-permissions.js +0 -311
  71. package/dist/tools/skill-permissions.js.map +0 -1
  72. package/dist/tools/unlink-skill.d.ts +0 -3
  73. package/dist/tools/unlink-skill.d.ts.map +0 -1
  74. package/dist/tools/unlink-skill.js +0 -72
  75. package/dist/tools/unlink-skill.js.map +0 -1
  76. package/dist/tools/update-skill.d.ts +0 -3
  77. package/dist/tools/update-skill.d.ts.map +0 -1
  78. package/dist/tools/update-skill.js +0 -317
  79. package/dist/tools/update-skill.js.map +0 -1
  80. package/dist/tools/verify-skills.d.ts +0 -3
  81. package/dist/tools/verify-skills.d.ts.map +0 -1
  82. package/dist/tools/verify-skills.js +0 -121
  83. package/dist/tools/verify-skills.js.map +0 -1
  84. package/dist/tools/whoami.d.ts +0 -3
  85. package/dist/tools/whoami.d.ts.map +0 -1
  86. package/dist/tools/whoami.js +0 -29
  87. package/dist/tools/whoami.js.map +0 -1
@@ -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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"}
@@ -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
@@ -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"}
@@ -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
@@ -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"}
@@ -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
@@ -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"}
@@ -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
@@ -1 +0,0 @@
1
- {"version":3,"file":"packer.js","sourceRoot":"","sources":["../../src/lib/packer.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- export declare function registerAuditSkillTool(server: McpServer): void;
3
- //# sourceMappingURL=audit-skill.d.ts.map
@@ -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"}