@tankpkg/cli 0.7.0 → 0.9.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.
Files changed (111) hide show
  1. package/dist/bin/tank.d.ts +1 -2
  2. package/dist/bin/tank.js +3517 -294
  3. package/dist/bin/tank.js.map +1 -1
  4. package/dist/debug-logger-BJzuguP3.js +140 -0
  5. package/dist/debug-logger-BJzuguP3.js.map +1 -0
  6. package/dist/index.d.ts +59 -5
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +83 -4
  9. package/dist/index.js.map +1 -1
  10. package/dist/package.json +46 -0
  11. package/package.json +18 -12
  12. package/LICENSE +0 -21
  13. package/dist/commands/audit.d.ts +0 -5
  14. package/dist/commands/audit.js +0 -185
  15. package/dist/commands/audit.js.map +0 -1
  16. package/dist/commands/doctor.d.ts +0 -5
  17. package/dist/commands/doctor.js +0 -164
  18. package/dist/commands/doctor.js.map +0 -1
  19. package/dist/commands/info.d.ts +0 -5
  20. package/dist/commands/info.js +0 -102
  21. package/dist/commands/info.js.map +0 -1
  22. package/dist/commands/init.d.ts +0 -11
  23. package/dist/commands/init.js +0 -140
  24. package/dist/commands/init.js.map +0 -1
  25. package/dist/commands/install.d.ts +0 -24
  26. package/dist/commands/install.js +0 -517
  27. package/dist/commands/install.js.map +0 -1
  28. package/dist/commands/link.d.ts +0 -5
  29. package/dist/commands/link.js +0 -79
  30. package/dist/commands/link.js.map +0 -1
  31. package/dist/commands/login.d.ts +0 -14
  32. package/dist/commands/login.js +0 -87
  33. package/dist/commands/login.js.map +0 -1
  34. package/dist/commands/logout.d.ts +0 -9
  35. package/dist/commands/logout.js +0 -20
  36. package/dist/commands/logout.js.map +0 -1
  37. package/dist/commands/permissions.d.ts +0 -4
  38. package/dist/commands/permissions.js +0 -199
  39. package/dist/commands/permissions.js.map +0 -1
  40. package/dist/commands/publish.d.ts +0 -25
  41. package/dist/commands/publish.js +0 -166
  42. package/dist/commands/publish.js.map +0 -1
  43. package/dist/commands/remove.d.ts +0 -7
  44. package/dist/commands/remove.js +0 -163
  45. package/dist/commands/remove.js.map +0 -1
  46. package/dist/commands/scan.d.ts +0 -5
  47. package/dist/commands/scan.js +0 -169
  48. package/dist/commands/scan.js.map +0 -1
  49. package/dist/commands/search.d.ts +0 -5
  50. package/dist/commands/search.js +0 -67
  51. package/dist/commands/search.js.map +0 -1
  52. package/dist/commands/unlink.d.ts +0 -5
  53. package/dist/commands/unlink.js +0 -42
  54. package/dist/commands/unlink.js.map +0 -1
  55. package/dist/commands/update.d.ts +0 -8
  56. package/dist/commands/update.js +0 -332
  57. package/dist/commands/update.js.map +0 -1
  58. package/dist/commands/upgrade.d.ts +0 -6
  59. package/dist/commands/upgrade.js +0 -111
  60. package/dist/commands/upgrade.js.map +0 -1
  61. package/dist/commands/verify.d.ts +0 -22
  62. package/dist/commands/verify.js +0 -63
  63. package/dist/commands/verify.js.map +0 -1
  64. package/dist/commands/whoami.d.ts +0 -4
  65. package/dist/commands/whoami.js +0 -57
  66. package/dist/commands/whoami.js.map +0 -1
  67. package/dist/lib/agents.d.ts +0 -19
  68. package/dist/lib/agents.js +0 -106
  69. package/dist/lib/agents.js.map +0 -1
  70. package/dist/lib/api-client.d.ts +0 -14
  71. package/dist/lib/api-client.js +0 -63
  72. package/dist/lib/api-client.js.map +0 -1
  73. package/dist/lib/config.d.ts +0 -29
  74. package/dist/lib/config.js +0 -66
  75. package/dist/lib/config.js.map +0 -1
  76. package/dist/lib/debug-logger.d.ts +0 -9
  77. package/dist/lib/debug-logger.js +0 -77
  78. package/dist/lib/debug-logger.js.map +0 -1
  79. package/dist/lib/dependency-resolver.d.ts +0 -51
  80. package/dist/lib/dependency-resolver.js +0 -181
  81. package/dist/lib/dependency-resolver.js.map +0 -1
  82. package/dist/lib/frontmatter.d.ts +0 -11
  83. package/dist/lib/frontmatter.js +0 -89
  84. package/dist/lib/frontmatter.js.map +0 -1
  85. package/dist/lib/install-pipeline.d.ts +0 -23
  86. package/dist/lib/install-pipeline.js +0 -181
  87. package/dist/lib/install-pipeline.js.map +0 -1
  88. package/dist/lib/linker.d.ts +0 -45
  89. package/dist/lib/linker.js +0 -137
  90. package/dist/lib/linker.js.map +0 -1
  91. package/dist/lib/links.d.ts +0 -20
  92. package/dist/lib/links.js +0 -105
  93. package/dist/lib/links.js.map +0 -1
  94. package/dist/lib/lockfile.d.ts +0 -24
  95. package/dist/lib/lockfile.js +0 -135
  96. package/dist/lib/lockfile.js.map +0 -1
  97. package/dist/lib/logger.d.ts +0 -6
  98. package/dist/lib/logger.js +0 -8
  99. package/dist/lib/logger.js.map +0 -1
  100. package/dist/lib/packer.d.ts +0 -41
  101. package/dist/lib/packer.js +0 -284
  102. package/dist/lib/packer.js.map +0 -1
  103. package/dist/lib/permission-checker.d.ts +0 -16
  104. package/dist/lib/permission-checker.js +0 -78
  105. package/dist/lib/permission-checker.js.map +0 -1
  106. package/dist/lib/upgrade-check.d.ts +0 -1
  107. package/dist/lib/upgrade-check.js +0 -59
  108. package/dist/lib/upgrade-check.js.map +0 -1
  109. package/dist/version.d.ts +0 -2
  110. package/dist/version.js +0 -4
  111. package/dist/version.js.map +0 -1
@@ -1,106 +0,0 @@
1
- import path from 'node:path';
2
- import fs from 'node:fs';
3
- import os from 'node:os';
4
- const resolveHomedir = (homedir) => homedir ?? os.homedir();
5
- const isWindows = process.platform === 'win32';
6
- export const SUPPORTED_AGENTS = [
7
- {
8
- id: 'claude',
9
- name: 'Claude Code',
10
- configDirs: (homedir) => [path.join(homedir, '.claude')],
11
- },
12
- {
13
- id: 'opencode',
14
- name: 'OpenCode',
15
- configDirs: (homedir) => {
16
- const dirs = [path.join(homedir, '.config', 'opencode')];
17
- if (isWindows) {
18
- const appData = process.env.APPDATA;
19
- if (appData)
20
- dirs.push(path.join(appData, 'opencode'));
21
- }
22
- return dirs;
23
- },
24
- },
25
- {
26
- id: 'cursor',
27
- name: 'Cursor',
28
- configDirs: (homedir) => {
29
- const dirs = [path.join(homedir, '.cursor')];
30
- if (isWindows) {
31
- const appData = process.env.APPDATA;
32
- if (appData)
33
- dirs.push(path.join(appData, 'Cursor'));
34
- }
35
- return dirs;
36
- },
37
- },
38
- {
39
- id: 'codex',
40
- name: 'Codex',
41
- configDirs: (homedir) => [path.join(homedir, '.codex')],
42
- },
43
- {
44
- id: 'openclaw',
45
- name: 'OpenClaw',
46
- configDirs: (homedir) => [path.join(homedir, '.openclaw')],
47
- },
48
- {
49
- id: 'universal',
50
- name: 'Universal',
51
- configDirs: (homedir) => [path.join(homedir, '.agents')],
52
- },
53
- ];
54
- /**
55
- * Returns the first existing config directory for an agent,
56
- * or the first (default) directory if none exist.
57
- */
58
- function resolveConfigDir(agent, homedir) {
59
- const dirs = agent.configDirs(homedir);
60
- return dirs.find((d) => fs.existsSync(d)) ?? dirs[0];
61
- }
62
- function isAgentInstalled(agent, homedir) {
63
- return agent.configDirs(homedir).some((d) => fs.existsSync(d));
64
- }
65
- export function getSupportedAgents(homedir) {
66
- const resolved = resolveHomedir(homedir);
67
- return SUPPORTED_AGENTS.map((agent) => ({
68
- id: agent.id,
69
- name: agent.name,
70
- skillsDir: path.join(resolveConfigDir(agent, resolved), 'skills'),
71
- }));
72
- }
73
- export function detectInstalledAgents(homedir) {
74
- const resolved = resolveHomedir(homedir);
75
- return SUPPORTED_AGENTS.filter((agent) => isAgentInstalled(agent, resolved)).map((agent) => ({
76
- id: agent.id,
77
- name: agent.name,
78
- skillsDir: path.join(resolveConfigDir(agent, resolved), 'skills'),
79
- }));
80
- }
81
- export function getAgentSkillDir(agentId, homedir) {
82
- const resolved = resolveHomedir(homedir);
83
- const agent = SUPPORTED_AGENTS.find((entry) => entry.id === agentId);
84
- if (!agent) {
85
- return null;
86
- }
87
- return path.join(resolveConfigDir(agent, resolved), 'skills');
88
- }
89
- export function getSymlinkName(skillName) {
90
- const match = skillName.match(/^@([^/]+)\/(.+)$/);
91
- if (!match) {
92
- return skillName;
93
- }
94
- const [, scope, name] = match;
95
- if (scope.length === 0 || name.length === 0) {
96
- return skillName;
97
- }
98
- return `${scope}--${name}`;
99
- }
100
- export function getGlobalSkillsDir(homedir) {
101
- return path.join(resolveHomedir(homedir), '.tank', 'skills');
102
- }
103
- export function getGlobalAgentSkillsDir(homedir) {
104
- return path.join(resolveHomedir(homedir), '.tank', 'agent-skills');
105
- }
106
- //# sourceMappingURL=agents.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/lib/agents.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- import { type TankConfig } from './config.js';
2
- export declare class ApiClient {
3
- private baseUrl;
4
- private token?;
5
- constructor(config: TankConfig);
6
- private headers;
7
- get(path: string): Promise<Response>;
8
- post(path: string, body: unknown): Promise<Response>;
9
- put(path: string, body: unknown): Promise<Response>;
10
- }
11
- /**
12
- * Factory: reads config and returns an ApiClient instance.
13
- */
14
- export declare function createApiClient(configDir?: string): ApiClient;
@@ -1,63 +0,0 @@
1
- import { getConfig } from './config.js';
2
- import { httpLog } from './debug-logger.js';
3
- import { USER_AGENT } from '../version.js';
4
- export class ApiClient {
5
- baseUrl;
6
- token;
7
- constructor(config) {
8
- this.baseUrl = config.registry;
9
- this.token = config.token;
10
- }
11
- headers(hasBody) {
12
- const h = {
13
- 'User-Agent': USER_AGENT,
14
- };
15
- if (this.token) {
16
- h['Authorization'] = `Bearer ${this.token}`;
17
- }
18
- if (hasBody) {
19
- h['Content-Type'] = 'application/json';
20
- }
21
- return h;
22
- }
23
- async get(path) {
24
- const url = `${this.baseUrl}${path}`;
25
- httpLog.info({ method: 'GET', url }, 'Request');
26
- const res = await fetch(url, {
27
- method: 'GET',
28
- headers: this.headers(false),
29
- });
30
- httpLog.info({ method: 'GET', url, status: res.status, ok: res.ok }, 'Response');
31
- return res;
32
- }
33
- async post(path, body) {
34
- const url = `${this.baseUrl}${path}`;
35
- httpLog.info({ method: 'POST', url, bodyKeys: body && typeof body === 'object' ? Object.keys(body) : undefined }, 'Request');
36
- const res = await fetch(url, {
37
- method: 'POST',
38
- headers: this.headers(true),
39
- body: JSON.stringify(body),
40
- });
41
- httpLog.info({ method: 'POST', url, status: res.status, ok: res.ok }, 'Response');
42
- return res;
43
- }
44
- async put(path, body) {
45
- const url = `${this.baseUrl}${path}`;
46
- httpLog.info({ method: 'PUT', url, bodyKeys: body && typeof body === 'object' ? Object.keys(body) : undefined }, 'Request');
47
- const res = await fetch(url, {
48
- method: 'PUT',
49
- headers: this.headers(true),
50
- body: JSON.stringify(body),
51
- });
52
- httpLog.info({ method: 'PUT', url, status: res.status, ok: res.ok }, 'Response');
53
- return res;
54
- }
55
- }
56
- /**
57
- * Factory: reads config and returns an ApiClient instance.
58
- */
59
- export function createApiClient(configDir) {
60
- const config = getConfig(configDir);
61
- return new ApiClient(config);
62
- }
63
- //# 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,29 +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
- * Override with configDir parameter for testing.
12
- */
13
- export declare function getConfigDir(configDir?: string): string;
14
- /**
15
- * Get the path to the tank config file.
16
- * Override with configDir parameter for testing.
17
- */
18
- export declare function getConfigPath(configDir?: string): string;
19
- /**
20
- * Read the tank config file. Returns defaults if file doesn't exist.
21
- * Override configDir for testing (avoids writing to real ~/.tank/).
22
- */
23
- export declare function getConfig(configDir?: string): TankConfig;
24
- /**
25
- * Write config to disk. Merges with existing config.
26
- * Creates ~/.tank/ directory if it doesn't exist.
27
- * Sets file permissions to 0600 (owner read/write only) on Unix.
28
- */
29
- export declare function setConfig(partial: Partial<TankConfig>, configDir?: string): void;
@@ -1,66 +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
- * Override with configDir parameter for testing.
10
- */
11
- export function getConfigDir(configDir) {
12
- return configDir ?? path.join(os.homedir(), '.tank');
13
- }
14
- /**
15
- * Get the path to the tank config file.
16
- * Override with configDir parameter for testing.
17
- */
18
- export function getConfigPath(configDir) {
19
- return path.join(getConfigDir(configDir), 'config.json');
20
- }
21
- /**
22
- * Read the tank config file. Returns defaults if file doesn't exist.
23
- * Override configDir for testing (avoids writing to real ~/.tank/).
24
- */
25
- export function getConfig(configDir) {
26
- const configPath = getConfigPath(configDir);
27
- try {
28
- const raw = fs.readFileSync(configPath, 'utf-8');
29
- const parsed = JSON.parse(raw);
30
- const merged = { ...DEFAULT_CONFIG, ...parsed };
31
- const envToken = process.env.TANK_TOKEN?.trim();
32
- if (envToken) {
33
- merged.token = envToken;
34
- }
35
- return merged;
36
- }
37
- catch {
38
- const envToken = process.env.TANK_TOKEN?.trim();
39
- return {
40
- ...DEFAULT_CONFIG,
41
- ...(envToken ? { token: envToken } : {}),
42
- };
43
- }
44
- }
45
- /**
46
- * Write config to disk. Merges with existing config.
47
- * Creates ~/.tank/ directory if it doesn't exist.
48
- * Sets file permissions to 0600 (owner read/write only) on Unix.
49
- */
50
- export function setConfig(partial, configDir) {
51
- const dir = getConfigDir(configDir);
52
- const configPath = getConfigPath(configDir);
53
- // Create directory with 0700 permissions if it doesn't exist
54
- if (!fs.existsSync(dir)) {
55
- fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
56
- }
57
- // Merge with existing config
58
- const existing = getConfig(configDir);
59
- const merged = { ...existing, ...partial };
60
- // Write config file
61
- fs.writeFileSync(configPath, JSON.stringify(merged, null, 2) + '\n', {
62
- encoding: 'utf-8',
63
- mode: 0o600,
64
- });
65
- }
66
- //# 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;;;GAGG;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;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,SAAkB;IAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,aAAa,CAAC,CAAC;AAC3D,CAAC;AAED;;;GAGG;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,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;;;;GAIG;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,6DAA6D;IAC7D,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,6BAA6B;IAC7B,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC;IAE3C,oBAAoB;IACpB,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,9 +0,0 @@
1
- import pino from 'pino';
2
- export declare const debugLog: pino.Logger<never, boolean>;
3
- export declare const httpLog: pino.Logger<never, boolean>;
4
- export declare const authFlowLog: pino.Logger<never, boolean>;
5
- /**
6
- * Flush pending logs before process exit.
7
- * Call this at the end of CLI commands to ensure logs are delivered.
8
- */
9
- export declare function flushLogs(): Promise<void>;
@@ -1,77 +0,0 @@
1
- import pino from 'pino';
2
- import { appendFileSync } from 'node:fs';
3
- const lokiUrl = process.env.TANK_LOKI_URL || 'http://localhost:3100';
4
- const debugEnabled = process.env.TANK_DEBUG === '1' || process.env.TANK_DEBUG === 'true';
5
- // Buffer logs and push to Loki via HTTP (avoids pino.transport() worker thread serialization issues)
6
- const logBuffer = [];
7
- let flushTimer = null;
8
- async function flushToLoki() {
9
- if (logBuffer.length === 0)
10
- return;
11
- const logs = logBuffer.splice(0);
12
- const values = logs.map((line) => {
13
- try {
14
- const parsed = JSON.parse(line);
15
- const ts = parsed.time
16
- ? String(new Date(parsed.time).getTime() * 1_000_000)
17
- : String(Date.now() * 1_000_000);
18
- return [ts, line];
19
- }
20
- catch {
21
- return [String(Date.now() * 1_000_000), line];
22
- }
23
- });
24
- try {
25
- await fetch(`${lokiUrl}/loki/api/v1/push`, {
26
- method: 'POST',
27
- headers: { 'Content-Type': 'application/json' },
28
- body: JSON.stringify({
29
- streams: [{ stream: { app: 'tank-cli' }, values }],
30
- }),
31
- });
32
- }
33
- catch {
34
- logBuffer.unshift(...logs);
35
- }
36
- }
37
- const lokiStream = {
38
- write(line) {
39
- const trimmed = line.trimEnd();
40
- logBuffer.push(trimmed);
41
- if (debugEnabled) {
42
- try {
43
- appendFileSync('/tmp/tank-cli-debug.log', trimmed + '\n');
44
- }
45
- catch { }
46
- }
47
- if (!flushTimer) {
48
- flushTimer = setInterval(flushToLoki, 2000);
49
- }
50
- if (logBuffer.length >= 50) {
51
- void flushToLoki();
52
- }
53
- },
54
- };
55
- export const debugLog = pino({
56
- level: 'debug',
57
- timestamp: pino.stdTimeFunctions.isoTime,
58
- formatters: {
59
- level(label) {
60
- return { level: label };
61
- },
62
- },
63
- }, lokiStream);
64
- export const httpLog = debugLog.child({ module: 'http' });
65
- export const authFlowLog = debugLog.child({ module: 'auth-flow' });
66
- /**
67
- * Flush pending logs before process exit.
68
- * Call this at the end of CLI commands to ensure logs are delivered.
69
- */
70
- export async function flushLogs() {
71
- if (flushTimer) {
72
- clearInterval(flushTimer);
73
- flushTimer = null;
74
- }
75
- await flushToLoki();
76
- }
77
- //# sourceMappingURL=debug-logger.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"debug-logger.js","sourceRoot":"","sources":["../../src/lib/debug-logger.ts"],"names":[],"mappings":"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"}
@@ -1,51 +0,0 @@
1
- export type SkillName = string;
2
- export type SemverRange = string;
3
- export type SemverVersion = string;
4
- export type SkillKey = string;
5
- export interface RequirementSource {
6
- kind: 'root' | 'skill';
7
- from?: string;
8
- }
9
- export interface Requirement {
10
- name: SkillName;
11
- range: SemverRange;
12
- source: RequirementSource;
13
- }
14
- export interface RegistryVersionInfo {
15
- version: string;
16
- integrity: string;
17
- auditScore: number | null;
18
- auditStatus: string;
19
- publishedAt: string;
20
- }
21
- export interface RegistrySkillMeta {
22
- name: string;
23
- version: string;
24
- description?: string;
25
- integrity: string;
26
- permissions: Record<string, unknown>;
27
- auditScore: number | null;
28
- downloadUrl: string;
29
- dependencies: Record<string, string>;
30
- }
31
- export interface RegistryFetcher {
32
- fetchVersions(name: string): Promise<RegistryVersionInfo[]>;
33
- fetchMetadata(name: string, version: string): Promise<RegistrySkillMeta>;
34
- }
35
- export interface ResolvedNode {
36
- name: SkillName;
37
- version: SemverVersion;
38
- meta: RegistrySkillMeta;
39
- dependencies: Record<SkillName, SemverVersion>;
40
- }
41
- export interface ResolvedGraph {
42
- nodes: Map<SkillName, ResolvedNode>;
43
- installOrder: string[];
44
- }
45
- export interface ConflictError {
46
- skillName: SkillName;
47
- requirements: Requirement[];
48
- availableVersions: string[];
49
- }
50
- export declare function buildSkillKey(name: SkillName, version: SemverVersion): string;
51
- export declare function resolveDependencyTree(rootDependencies: Record<SkillName, SemverRange>, fetcher: RegistryFetcher): Promise<ResolvedGraph>;
@@ -1,181 +0,0 @@
1
- import { resolve } from '@tank/shared';
2
- // ── Helpers ─────────────────────────────────────────────────────────────────
3
- export function buildSkillKey(name, version) {
4
- return `${name}@${version}`;
5
- }
6
- function formatConflictMessage(conflict) {
7
- const lines = [`Version conflict for ${conflict.skillName}:`];
8
- for (const req of conflict.requirements) {
9
- const origin = req.source.kind === 'root'
10
- ? 'root'
11
- : req.source.from ?? 'unknown';
12
- lines.push(` - ${req.range} (required by ${origin})`);
13
- }
14
- lines.push(`Available versions: ${conflict.availableVersions.join(', ')}`);
15
- lines.push('No single version satisfies all constraints.');
16
- return lines.join('\n');
17
- }
18
- // ── Resolution Algorithm ────────────────────────────────────────────────────
19
- export async function resolveDependencyTree(rootDependencies, fetcher) {
20
- const constraintsByName = new Map();
21
- const selectedByName = new Map();
22
- const metadataCache = new Map();
23
- const versionsCache = new Map();
24
- // Maps SkillKey → dep names it contributed, so stale requirements
25
- // can be removed when a selected version changes during fixpoint iteration.
26
- const contributedDeps = new Map();
27
- const queue = new Set();
28
- const inProgress = new Set();
29
- const sortedRootNames = Object.keys(rootDependencies).sort();
30
- for (const name of sortedRootNames) {
31
- const range = rootDependencies[name];
32
- constraintsByName.set(name, [
33
- { name, range, source: { kind: 'root' } },
34
- ]);
35
- queue.add(name);
36
- }
37
- const MAX_ITERATIONS = 10_000;
38
- let iterations = 0;
39
- while (queue.size > 0) {
40
- if (++iterations > MAX_ITERATIONS) {
41
- throw new Error(`Dependency resolution exceeded ${MAX_ITERATIONS} iterations. This likely indicates a degenerate dependency graph.`);
42
- }
43
- const sorted = [...queue].sort();
44
- const name = sorted[0];
45
- queue.delete(name);
46
- // Cycle guard: if this name is mid-expansion up the stack, defer —
47
- // its constraints will be resolved when expansion completes.
48
- if (inProgress.has(name)) {
49
- continue;
50
- }
51
- const constraints = constraintsByName.get(name);
52
- if (!constraints || constraints.length === 0) {
53
- continue;
54
- }
55
- let versionInfos = versionsCache.get(name);
56
- if (!versionInfos) {
57
- versionInfos = await fetcher.fetchVersions(name);
58
- versionsCache.set(name, versionInfos);
59
- }
60
- const availableVersions = versionInfos
61
- .map((v) => v.version)
62
- .sort();
63
- const selectedVersion = findSatisfyingVersion(availableVersions, constraints);
64
- if (selectedVersion === null) {
65
- const conflict = {
66
- skillName: name,
67
- requirements: constraints,
68
- availableVersions,
69
- };
70
- throw new Error(formatConflictMessage(conflict));
71
- }
72
- const previousVersion = selectedByName.get(name);
73
- if (previousVersion === selectedVersion) {
74
- continue;
75
- }
76
- inProgress.add(name);
77
- if (previousVersion !== undefined) {
78
- const prevKey = buildSkillKey(name, previousVersion);
79
- const prevDeps = contributedDeps.get(prevKey) ?? [];
80
- for (const depName of prevDeps) {
81
- const depConstraints = constraintsByName.get(depName);
82
- if (depConstraints) {
83
- const filtered = depConstraints.filter((r) => r.source.from !== prevKey);
84
- if (filtered.length > 0) {
85
- constraintsByName.set(depName, filtered);
86
- }
87
- else {
88
- constraintsByName.delete(depName);
89
- }
90
- queue.add(depName);
91
- }
92
- }
93
- contributedDeps.delete(prevKey);
94
- }
95
- selectedByName.set(name, selectedVersion);
96
- const skillKey = buildSkillKey(name, selectedVersion);
97
- let meta = metadataCache.get(skillKey);
98
- if (!meta) {
99
- meta = await fetcher.fetchMetadata(name, selectedVersion);
100
- metadataCache.set(skillKey, meta);
101
- }
102
- const depNames = [];
103
- const sortedDepEntries = Object.entries(meta.dependencies).sort(([a], [b]) => a.localeCompare(b));
104
- for (const [depName, depRange] of sortedDepEntries) {
105
- depNames.push(depName);
106
- const requirement = {
107
- name: depName,
108
- range: depRange,
109
- source: { kind: 'skill', from: skillKey },
110
- };
111
- const existing = constraintsByName.get(depName) ?? [];
112
- existing.push(requirement);
113
- constraintsByName.set(depName, existing);
114
- queue.add(depName);
115
- }
116
- contributedDeps.set(skillKey, depNames);
117
- inProgress.delete(name);
118
- }
119
- for (const [name] of selectedByName) {
120
- const constraints = constraintsByName.get(name);
121
- if (!constraints || constraints.length === 0) {
122
- selectedByName.delete(name);
123
- }
124
- }
125
- return buildGraph(selectedByName, metadataCache);
126
- }
127
- // ── Version Selection ───────────────────────────────────────────────────────
128
- function findSatisfyingVersion(availableVersions, constraints) {
129
- const ranges = [...new Set(constraints.map((c) => c.range))];
130
- const satisfyingSets = ranges.map((range) => {
131
- const matching = new Set();
132
- for (const v of availableVersions) {
133
- if (resolve(range, [v]) !== null) {
134
- matching.add(v);
135
- }
136
- }
137
- return matching;
138
- });
139
- if (satisfyingSets.length === 0) {
140
- return null;
141
- }
142
- let intersection = satisfyingSets[0];
143
- for (let i = 1; i < satisfyingSets.length; i++) {
144
- intersection = new Set([...intersection].filter((v) => satisfyingSets[i].has(v)));
145
- }
146
- if (intersection.size === 0) {
147
- return null;
148
- }
149
- const candidates = [...intersection];
150
- return resolve('*', candidates);
151
- }
152
- // ── Graph Construction ──────────────────────────────────────────────────────
153
- function buildGraph(selectedByName, metadataCache) {
154
- const nodes = new Map();
155
- const installOrder = [];
156
- const sortedEntries = [...selectedByName.entries()].sort(([a], [b]) => a.localeCompare(b));
157
- for (const [name, version] of sortedEntries) {
158
- const skillKey = buildSkillKey(name, version);
159
- const meta = metadataCache.get(skillKey);
160
- if (!meta) {
161
- throw new Error(`Internal error: missing metadata for ${skillKey}`);
162
- }
163
- const resolvedDeps = {};
164
- const sortedDepNames = Object.keys(meta.dependencies).sort();
165
- for (const depName of sortedDepNames) {
166
- const depVersion = selectedByName.get(depName);
167
- if (depVersion !== undefined) {
168
- resolvedDeps[depName] = depVersion;
169
- }
170
- }
171
- nodes.set(name, {
172
- name,
173
- version,
174
- meta,
175
- dependencies: resolvedDeps,
176
- });
177
- installOrder.push(skillKey);
178
- }
179
- return { nodes, installOrder };
180
- }
181
- //# sourceMappingURL=dependency-resolver.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dependency-resolver.js","sourceRoot":"","sources":["../../src/lib/dependency-resolver.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- export interface PrepareOptions {
2
- skillName: string;
3
- extractDir: string;
4
- agentSkillsBaseDir: string;
5
- description?: string;
6
- }
7
- export declare function hasFrontmatter(content: string): boolean;
8
- export declare function stripScope(skillName: string): string;
9
- export declare function extractDescriptionFromMarkdown(content: string): string;
10
- export declare function generateFrontmatter(name: string, description: string): string;
11
- export declare function prepareAgentSkillDir(options: PrepareOptions): string;