@tankpkg/cli 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 (111) hide show
  1. package/dist/bin/tank.d.ts +1 -2
  2. package/dist/bin/tank.js +3423 -294
  3. package/dist/bin/tank.js.map +1 -1
  4. package/dist/debug-logger-BjGZcIhg.js +140 -0
  5. package/dist/debug-logger-BjGZcIhg.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
@@ -0,0 +1,140 @@
1
+ import chalk from "chalk";
2
+ import fs, { appendFileSync } from "node:fs";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import pino from "pino";
6
+ //#region src/lib/config.ts
7
+ const DEFAULT_CONFIG = { registry: "https://tankpkg.dev" };
8
+ /**
9
+ * Get the path to the tank config directory.
10
+ * Override with configDir parameter for testing.
11
+ */
12
+ function getConfigDir(configDir) {
13
+ return configDir ?? path.join(os.homedir(), ".tank");
14
+ }
15
+ /**
16
+ * Get the path to the tank config file.
17
+ * Override with configDir parameter for testing.
18
+ */
19
+ function getConfigPath(configDir) {
20
+ return path.join(getConfigDir(configDir), "config.json");
21
+ }
22
+ /**
23
+ * Read the tank config file. Returns defaults if file doesn't exist.
24
+ * Override configDir for testing (avoids writing to real ~/.tank/).
25
+ */
26
+ function getConfig(configDir) {
27
+ const configPath = getConfigPath(configDir);
28
+ try {
29
+ const raw = fs.readFileSync(configPath, "utf-8");
30
+ const parsed = JSON.parse(raw);
31
+ const merged = {
32
+ ...DEFAULT_CONFIG,
33
+ ...parsed
34
+ };
35
+ const envToken = process.env.TANK_TOKEN?.trim();
36
+ if (envToken) merged.token = envToken;
37
+ return merged;
38
+ } catch {
39
+ const envToken = process.env.TANK_TOKEN?.trim();
40
+ return {
41
+ ...DEFAULT_CONFIG,
42
+ ...envToken ? { token: envToken } : {}
43
+ };
44
+ }
45
+ }
46
+ /**
47
+ * Write config to disk. Merges with existing config.
48
+ * Creates ~/.tank/ directory if it doesn't exist.
49
+ * Sets file permissions to 0600 (owner read/write only) on Unix.
50
+ */
51
+ function setConfig(partial, configDir) {
52
+ const dir = getConfigDir(configDir);
53
+ const configPath = getConfigPath(configDir);
54
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, {
55
+ recursive: true,
56
+ mode: 448
57
+ });
58
+ const merged = {
59
+ ...getConfig(configDir),
60
+ ...partial
61
+ };
62
+ fs.writeFileSync(configPath, `${JSON.stringify(merged, null, 2)}\n`, {
63
+ encoding: "utf-8",
64
+ mode: 384
65
+ });
66
+ }
67
+ //#endregion
68
+ //#region src/lib/logger.ts
69
+ const logger = {
70
+ info: (msg) => console.log(chalk.blue("ℹ"), msg),
71
+ success: (msg) => console.log(chalk.green("✓"), msg),
72
+ warn: (msg) => console.log(chalk.yellow("⚠"), msg),
73
+ error: (msg) => console.error(chalk.red("✗"), msg)
74
+ };
75
+ //#endregion
76
+ //#region src/version.ts
77
+ const VERSION = "0.8.1";
78
+ const USER_AGENT = `tank-cli/${VERSION}`;
79
+ //#endregion
80
+ //#region src/lib/debug-logger.ts
81
+ const lokiUrl = process.env.TANK_LOKI_URL || "http://localhost:3100";
82
+ const debugEnabled = process.env.TANK_DEBUG === "1" || process.env.TANK_DEBUG === "true";
83
+ const logBuffer = [];
84
+ let flushTimer = null;
85
+ async function flushToLoki() {
86
+ if (logBuffer.length === 0) return;
87
+ const logs = logBuffer.splice(0);
88
+ const values = logs.map((line) => {
89
+ try {
90
+ const parsed = JSON.parse(line);
91
+ return [parsed.time ? String(new Date(parsed.time).getTime() * 1e6) : String(Date.now() * 1e6), line];
92
+ } catch {
93
+ return [String(Date.now() * 1e6), line];
94
+ }
95
+ });
96
+ try {
97
+ await fetch(`${lokiUrl}/loki/api/v1/push`, {
98
+ method: "POST",
99
+ headers: { "Content-Type": "application/json" },
100
+ body: JSON.stringify({ streams: [{
101
+ stream: { app: "tank-cli" },
102
+ values
103
+ }] })
104
+ });
105
+ } catch {
106
+ logBuffer.unshift(...logs);
107
+ }
108
+ }
109
+ const debugLog = pino({
110
+ level: "debug",
111
+ timestamp: pino.stdTimeFunctions.isoTime,
112
+ formatters: { level(label) {
113
+ return { level: label };
114
+ } }
115
+ }, { write(line) {
116
+ const trimmed = line.trimEnd();
117
+ logBuffer.push(trimmed);
118
+ if (debugEnabled) try {
119
+ appendFileSync("/tmp/tank-cli-debug.log", `${trimmed}\n`);
120
+ } catch {}
121
+ if (!flushTimer) flushTimer = setInterval(flushToLoki, 2e3);
122
+ if (logBuffer.length >= 50) flushToLoki();
123
+ } });
124
+ const httpLog = debugLog.child({ module: "http" });
125
+ const authFlowLog = debugLog.child({ module: "auth-flow" });
126
+ /**
127
+ * Flush pending logs before process exit.
128
+ * Call this at the end of CLI commands to ensure logs are delivered.
129
+ */
130
+ async function flushLogs() {
131
+ if (flushTimer) {
132
+ clearInterval(flushTimer);
133
+ flushTimer = null;
134
+ }
135
+ await flushToLoki();
136
+ }
137
+ //#endregion
138
+ export { VERSION as a, getConfigDir as c, USER_AGENT as i, getConfigPath as l, flushLogs as n, logger as o, httpLog as r, getConfig as s, authFlowLog as t, setConfig as u };
139
+
140
+ //# sourceMappingURL=debug-logger-BjGZcIhg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-logger-BjGZcIhg.js","names":["pkg.version"],"sources":["../src/lib/config.ts","../src/lib/logger.ts","../package.json","../src/version.ts","../src/lib/debug-logger.ts"],"sourcesContent":["import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nexport interface TankConfig {\n token?: string;\n user?: { name: string; email: string };\n registry: string;\n}\n\nconst DEFAULT_CONFIG: TankConfig = {\n registry: 'https://tankpkg.dev'\n};\n\n/**\n * Get the path to the tank config directory.\n * Override with configDir parameter for testing.\n */\nexport function getConfigDir(configDir?: string): string {\n return configDir ?? path.join(os.homedir(), '.tank');\n}\n\n/**\n * Get the path to the tank config file.\n * Override with configDir parameter for testing.\n */\nexport function getConfigPath(configDir?: string): string {\n return path.join(getConfigDir(configDir), 'config.json');\n}\n\n/**\n * Read the tank config file. Returns defaults if file doesn't exist.\n * Override configDir for testing (avoids writing to real ~/.tank/).\n */\nexport function getConfig(configDir?: string): TankConfig {\n const configPath = getConfigPath(configDir);\n\n try {\n const raw = fs.readFileSync(configPath, 'utf-8');\n const parsed = JSON.parse(raw) as Partial<TankConfig>;\n const merged = { ...DEFAULT_CONFIG, ...parsed };\n const envToken = process.env.TANK_TOKEN?.trim();\n if (envToken) {\n merged.token = envToken;\n }\n return merged;\n } catch {\n const envToken = process.env.TANK_TOKEN?.trim();\n return {\n ...DEFAULT_CONFIG,\n ...(envToken ? { token: envToken } : {})\n };\n }\n}\n\n/**\n * Write config to disk. Merges with existing config.\n * Creates ~/.tank/ directory if it doesn't exist.\n * Sets file permissions to 0600 (owner read/write only) on Unix.\n */\nexport function setConfig(partial: Partial<TankConfig>, configDir?: string): void {\n const dir = getConfigDir(configDir);\n const configPath = getConfigPath(configDir);\n\n // Create directory with 0700 permissions if it doesn't exist\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true, mode: 0o700 });\n }\n\n // Merge with existing config\n const existing = getConfig(configDir);\n const merged = { ...existing, ...partial };\n\n // Write config file\n fs.writeFileSync(configPath, `${JSON.stringify(merged, null, 2)}\\n`, {\n encoding: 'utf-8',\n mode: 0o600\n });\n}\n","import chalk from 'chalk';\n\nexport const logger = {\n info: (msg: string) => console.log(chalk.blue('ℹ'), msg),\n success: (msg: string) => console.log(chalk.green('✓'), msg),\n warn: (msg: string) => console.log(chalk.yellow('⚠'), msg),\n error: (msg: string) => console.error(chalk.red('✗'), msg)\n};\n","","import pkg from '../package.json' with { type: 'json' };\n\nexport const VERSION = pkg.version ?? '0.0.0';\nexport const USER_AGENT = `tank-cli/${VERSION}`;\n","import { appendFileSync } from 'node:fs';\nimport pino from 'pino';\n\nconst lokiUrl = process.env.TANK_LOKI_URL || 'http://localhost:3100';\nconst debugEnabled = process.env.TANK_DEBUG === '1' || process.env.TANK_DEBUG === 'true';\n\n// Buffer logs and push to Loki via HTTP (avoids pino.transport() worker thread serialization issues)\nconst logBuffer: string[] = [];\nlet flushTimer: ReturnType<typeof setInterval> | null = null;\n\nasync function flushToLoki() {\n if (logBuffer.length === 0) return;\n\n const logs = logBuffer.splice(0);\n const values: [string, string][] = logs.map((line) => {\n try {\n const parsed = JSON.parse(line);\n const ts = parsed.time ? String(new Date(parsed.time).getTime() * 1_000_000) : String(Date.now() * 1_000_000);\n return [ts, line];\n } catch {\n return [String(Date.now() * 1_000_000), line];\n }\n });\n\n try {\n await fetch(`${lokiUrl}/loki/api/v1/push`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n streams: [{ stream: { app: 'tank-cli' }, values }]\n })\n });\n } catch {\n logBuffer.unshift(...logs);\n }\n}\n\nconst lokiStream = {\n write(line: string) {\n const trimmed = line.trimEnd();\n logBuffer.push(trimmed);\n\n if (debugEnabled) {\n try {\n appendFileSync('/tmp/tank-cli-debug.log', `${trimmed}\\n`);\n } catch {}\n }\n\n if (!flushTimer) {\n flushTimer = setInterval(flushToLoki, 2000);\n }\n if (logBuffer.length >= 50) {\n void flushToLoki();\n }\n }\n};\n\nexport const debugLog = pino(\n {\n level: 'debug',\n timestamp: pino.stdTimeFunctions.isoTime,\n formatters: {\n level(label: string) {\n return { level: label };\n }\n }\n },\n lokiStream as unknown as pino.DestinationStream\n);\n\nexport const httpLog = debugLog.child({ module: 'http' });\nexport const authFlowLog = debugLog.child({ module: 'auth-flow' });\n\n/**\n * Flush pending logs before process exit.\n * Call this at the end of CLI commands to ensure logs are delivered.\n */\nexport async function flushLogs(): Promise<void> {\n if (flushTimer) {\n clearInterval(flushTimer);\n flushTimer = null;\n }\n await flushToLoki();\n}\n"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,59 @@
1
- export { VERSION } from './version.js';
2
- export { logger } from './lib/logger.js';
3
- export { getConfig, setConfig, getConfigPath, getConfigDir } from './lib/config.js';
4
- export type { TankConfig } from './lib/config.js';
5
- export { ApiClient, createApiClient } from './lib/api-client.js';
1
+ //#region src/lib/config.d.ts
2
+ interface TankConfig {
3
+ token?: string;
4
+ user?: {
5
+ name: string;
6
+ email: string;
7
+ };
8
+ registry: string;
9
+ }
10
+ /**
11
+ * Get the path to the tank config directory.
12
+ * Override with configDir parameter for testing.
13
+ */
14
+ declare function getConfigDir(configDir?: string): string;
15
+ /**
16
+ * Get the path to the tank config file.
17
+ * Override with configDir parameter for testing.
18
+ */
19
+ declare function getConfigPath(configDir?: string): string;
20
+ /**
21
+ * Read the tank config file. Returns defaults if file doesn't exist.
22
+ * Override configDir for testing (avoids writing to real ~/.tank/).
23
+ */
24
+ declare function getConfig(configDir?: string): TankConfig;
25
+ /**
26
+ * Write config to disk. Merges with existing config.
27
+ * Creates ~/.tank/ directory if it doesn't exist.
28
+ * Sets file permissions to 0600 (owner read/write only) on Unix.
29
+ */
30
+ declare function setConfig(partial: Partial<TankConfig>, configDir?: string): void;
31
+ //#endregion
32
+ //#region src/lib/api-client.d.ts
33
+ declare class ApiClient {
34
+ private baseUrl;
35
+ private token?;
36
+ constructor(config: TankConfig);
37
+ private headers;
38
+ get(path: string): Promise<Response>;
39
+ post(path: string, body: unknown): Promise<Response>;
40
+ put(path: string, body: unknown): Promise<Response>;
41
+ }
42
+ /**
43
+ * Factory: reads config and returns an ApiClient instance.
44
+ */
45
+ declare function createApiClient(configDir?: string): ApiClient;
46
+ //#endregion
47
+ //#region src/lib/logger.d.ts
48
+ declare const logger: {
49
+ info: (msg: string) => void;
50
+ success: (msg: string) => void;
51
+ warn: (msg: string) => void;
52
+ error: (msg: string) => void;
53
+ };
54
+ //#endregion
55
+ //#region src/version.d.ts
56
+ declare const VERSION: string;
57
+ //#endregion
58
+ export { ApiClient, type TankConfig, VERSION, createApiClient, getConfig, getConfigDir, getConfigPath, logger, setConfig };
59
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/lib/config.ts","../src/lib/api-client.ts","../src/lib/logger.ts","../src/version.ts"],"mappings":";UAIiB,UAAA;EACf,KAAA;EACA,IAAA;IAAS,IAAA;IAAc,KAAA;EAAA;EACvB,QAAA;AAAA;;;;;iBAWc,YAAA,CAAa,SAAA;;;;;iBAQb,aAAA,CAAc,SAAA;;;;;iBAQd,SAAA,CAAU,SAAA,YAAqB,UAAA;;;;;AA0B/C;iBAAgB,SAAA,CAAU,OAAA,EAAS,OAAA,CAAQ,UAAA,GAAa,SAAA;;;cCxD3C,SAAA;EAAA,QACH,OAAA;EAAA,QACA,KAAA;cAEI,MAAA,EAAQ,UAAA;EAAA,QAKZ,OAAA;EAgBF,GAAA,CAAI,IAAA,WAAe,OAAA,CAAQ,QAAA;EAW3B,IAAA,CAAK,IAAA,UAAc,IAAA,YAAgB,OAAA,CAAQ,QAAA;EAe3C,GAAA,CAAI,IAAA,UAAc,IAAA,YAAgB,OAAA,CAAQ,QAAA;AAAA;;;ADrClD;iBCwDgB,eAAA,CAAgB,SAAA,YAAqB,SAAA;;;cCxExC,MAAA;;;;;;;;cCAA,OAAA"}
package/dist/index.js CHANGED
@@ -1,5 +1,84 @@
1
- export { VERSION } from './version.js';
2
- export { logger } from './lib/logger.js';
3
- export { getConfig, setConfig, getConfigPath, getConfigDir } from './lib/config.js';
4
- export { ApiClient, createApiClient } from './lib/api-client.js';
1
+ import { a as VERSION, c as getConfigDir, i as USER_AGENT, l as getConfigPath, o as logger, r as httpLog, s as getConfig, u as setConfig } from "./debug-logger-BjGZcIhg.js";
2
+ //#region src/lib/api-client.ts
3
+ var ApiClient = class {
4
+ baseUrl;
5
+ token;
6
+ constructor(config) {
7
+ this.baseUrl = config.registry;
8
+ this.token = config.token;
9
+ }
10
+ headers(hasBody) {
11
+ const h = { "User-Agent": USER_AGENT };
12
+ if (this.token) h.Authorization = `Bearer ${this.token}`;
13
+ if (hasBody) h["Content-Type"] = "application/json";
14
+ return h;
15
+ }
16
+ async get(path) {
17
+ const url = `${this.baseUrl}${path}`;
18
+ httpLog.info({
19
+ method: "GET",
20
+ url
21
+ }, "Request");
22
+ const res = await fetch(url, {
23
+ method: "GET",
24
+ headers: this.headers(false)
25
+ });
26
+ httpLog.info({
27
+ method: "GET",
28
+ url,
29
+ status: res.status,
30
+ ok: res.ok
31
+ }, "Response");
32
+ return res;
33
+ }
34
+ async post(path, body) {
35
+ const url = `${this.baseUrl}${path}`;
36
+ httpLog.info({
37
+ method: "POST",
38
+ url,
39
+ bodyKeys: body && typeof body === "object" ? Object.keys(body) : void 0
40
+ }, "Request");
41
+ const res = await fetch(url, {
42
+ method: "POST",
43
+ headers: this.headers(true),
44
+ body: JSON.stringify(body)
45
+ });
46
+ httpLog.info({
47
+ method: "POST",
48
+ url,
49
+ status: res.status,
50
+ ok: res.ok
51
+ }, "Response");
52
+ return res;
53
+ }
54
+ async put(path, body) {
55
+ const url = `${this.baseUrl}${path}`;
56
+ httpLog.info({
57
+ method: "PUT",
58
+ url,
59
+ bodyKeys: body && typeof body === "object" ? Object.keys(body) : void 0
60
+ }, "Request");
61
+ const res = await fetch(url, {
62
+ method: "PUT",
63
+ headers: this.headers(true),
64
+ body: JSON.stringify(body)
65
+ });
66
+ httpLog.info({
67
+ method: "PUT",
68
+ url,
69
+ status: res.status,
70
+ ok: res.ok
71
+ }, "Response");
72
+ return res;
73
+ }
74
+ };
75
+ /**
76
+ * Factory: reads config and returns an ApiClient instance.
77
+ */
78
+ function createApiClient(configDir) {
79
+ return new ApiClient(getConfig(configDir));
80
+ }
81
+ //#endregion
82
+ export { ApiClient, VERSION, createApiClient, getConfig, getConfigDir, getConfigPath, logger, setConfig };
83
+
5
84
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpF,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/lib/api-client.ts"],"sourcesContent":["import { USER_AGENT } from '../version.js';\nimport { getConfig, type TankConfig } from './config.js';\nimport { httpLog } from './debug-logger.js';\n\nexport class ApiClient {\n private baseUrl: string;\n private token?: string;\n\n constructor(config: TankConfig) {\n this.baseUrl = config.registry;\n this.token = config.token;\n }\n\n private headers(hasBody: boolean): Record<string, string> {\n const h: Record<string, string> = {\n 'User-Agent': USER_AGENT\n };\n\n if (this.token) {\n h.Authorization = `Bearer ${this.token}`;\n }\n\n if (hasBody) {\n h['Content-Type'] = 'application/json';\n }\n\n return h;\n }\n\n async get(path: string): Promise<Response> {\n const url = `${this.baseUrl}${path}`;\n httpLog.info({ method: 'GET', url }, 'Request');\n const res = await fetch(url, {\n method: 'GET',\n headers: this.headers(false)\n });\n httpLog.info({ method: 'GET', url, status: res.status, ok: res.ok }, 'Response');\n return res;\n }\n\n async post(path: string, body: unknown): Promise<Response> {\n const url = `${this.baseUrl}${path}`;\n httpLog.info(\n { method: 'POST', url, bodyKeys: body && typeof body === 'object' ? Object.keys(body) : undefined },\n 'Request'\n );\n const res = await fetch(url, {\n method: 'POST',\n headers: this.headers(true),\n body: JSON.stringify(body)\n });\n httpLog.info({ method: 'POST', url, status: res.status, ok: res.ok }, 'Response');\n return res;\n }\n\n async put(path: string, body: unknown): Promise<Response> {\n const url = `${this.baseUrl}${path}`;\n httpLog.info(\n { method: 'PUT', url, bodyKeys: body && typeof body === 'object' ? Object.keys(body) : undefined },\n 'Request'\n );\n const res = await fetch(url, {\n method: 'PUT',\n headers: this.headers(true),\n body: JSON.stringify(body)\n });\n httpLog.info({ method: 'PUT', url, status: res.status, ok: res.ok }, 'Response');\n return res;\n }\n}\n\n/**\n * Factory: reads config and returns an ApiClient instance.\n */\nexport function createApiClient(configDir?: string): ApiClient {\n const config = getConfig(configDir);\n return new ApiClient(config);\n}\n"],"mappings":";;AAIA,IAAa,YAAb,MAAuB;CACrB;CACA;CAEA,YAAY,QAAoB;AAC9B,OAAK,UAAU,OAAO;AACtB,OAAK,QAAQ,OAAO;;CAGtB,QAAgB,SAA0C;EACxD,MAAM,IAA4B,EAChC,cAAc,YACf;AAED,MAAI,KAAK,MACP,GAAE,gBAAgB,UAAU,KAAK;AAGnC,MAAI,QACF,GAAE,kBAAkB;AAGtB,SAAO;;CAGT,MAAM,IAAI,MAAiC;EACzC,MAAM,MAAM,GAAG,KAAK,UAAU;AAC9B,UAAQ,KAAK;GAAE,QAAQ;GAAO;GAAK,EAAE,UAAU;EAC/C,MAAM,MAAM,MAAM,MAAM,KAAK;GAC3B,QAAQ;GACR,SAAS,KAAK,QAAQ,MAAM;GAC7B,CAAC;AACF,UAAQ,KAAK;GAAE,QAAQ;GAAO;GAAK,QAAQ,IAAI;GAAQ,IAAI,IAAI;GAAI,EAAE,WAAW;AAChF,SAAO;;CAGT,MAAM,KAAK,MAAc,MAAkC;EACzD,MAAM,MAAM,GAAG,KAAK,UAAU;AAC9B,UAAQ,KACN;GAAE,QAAQ;GAAQ;GAAK,UAAU,QAAQ,OAAO,SAAS,WAAW,OAAO,KAAK,KAAK,GAAG,KAAA;GAAW,EACnG,UACD;EACD,MAAM,MAAM,MAAM,MAAM,KAAK;GAC3B,QAAQ;GACR,SAAS,KAAK,QAAQ,KAAK;GAC3B,MAAM,KAAK,UAAU,KAAK;GAC3B,CAAC;AACF,UAAQ,KAAK;GAAE,QAAQ;GAAQ;GAAK,QAAQ,IAAI;GAAQ,IAAI,IAAI;GAAI,EAAE,WAAW;AACjF,SAAO;;CAGT,MAAM,IAAI,MAAc,MAAkC;EACxD,MAAM,MAAM,GAAG,KAAK,UAAU;AAC9B,UAAQ,KACN;GAAE,QAAQ;GAAO;GAAK,UAAU,QAAQ,OAAO,SAAS,WAAW,OAAO,KAAK,KAAK,GAAG,KAAA;GAAW,EAClG,UACD;EACD,MAAM,MAAM,MAAM,MAAM,KAAK;GAC3B,QAAQ;GACR,SAAS,KAAK,QAAQ,KAAK;GAC3B,MAAM,KAAK,UAAU,KAAK;GAC3B,CAAC;AACF,UAAQ,KAAK;GAAE,QAAQ;GAAO;GAAK,QAAQ,IAAI;GAAQ,IAAI,IAAI;GAAI,EAAE,WAAW;AAChF,SAAO;;;;;;AAOX,SAAgB,gBAAgB,WAA+B;AAE7D,QAAO,IAAI,UADI,UAAU,UAAU,CACP"}
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@tankpkg/cli",
3
+ "version": "0.8.1",
4
+ "description": "Security-first package manager for AI agent skills",
5
+ "type": "module",
6
+ "bin": {
7
+ "tank": "dist/bin/tank.js"
8
+ },
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "publishConfig": {
13
+ "access": "public"
14
+ },
15
+ "scripts": {
16
+ "build": "tsdown",
17
+ "build:bundle": "esbuild dist/bin/tank.js --bundle --platform=node --format=esm --outfile=build/tank-bundle.mjs --external:fsevents",
18
+ "build:sea": "bash scripts/build-binary.sh",
19
+ "build:binary": "bun run build && bun run build:bundle && bun run build:sea",
20
+ "test": "vitest run",
21
+ "lint": "biome check src/",
22
+ "lint:fix": "biome check --fix src/",
23
+ "format": "biome format --write src/"
24
+ },
25
+ "devDependencies": {
26
+ "@internal/shared": "workspace:*",
27
+ "@types/node": "^25",
28
+ "@types/tar": "^6.1.13",
29
+ "esbuild": "^0.25.9",
30
+ "tsdown": "^0.21.0",
31
+ "vitest": "^4"
32
+ },
33
+ "dependencies": {
34
+ "@inquirer/prompts": "^8.2.0",
35
+ "chalk": "^5.6.2",
36
+ "commander": "^14.0.3",
37
+ "ignore": "^7.0.5",
38
+ "open": "^11.0.0",
39
+ "ora": "^9.3.0",
40
+ "pino": "^10.3.1",
41
+ "pino-loki": "^3.0.0",
42
+ "semver": "^7.7.4",
43
+ "tar": "^7.5.8",
44
+ "zod": "^4.3.6"
45
+ }
46
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tankpkg/cli",
3
- "version": "0.7.0",
3
+ "version": "0.8.1",
4
4
  "description": "Security-first package manager for AI agent skills",
5
5
  "type": "module",
6
6
  "bin": {
@@ -12,11 +12,23 @@
12
12
  "publishConfig": {
13
13
  "access": "public"
14
14
  },
15
+ "scripts": {
16
+ "build": "tsdown",
17
+ "build:bundle": "esbuild dist/bin/tank.js --bundle --platform=node --format=esm --outfile=build/tank-bundle.mjs --external:fsevents",
18
+ "build:sea": "bash scripts/build-binary.sh",
19
+ "build:binary": "bun run build && bun run build:bundle && bun run build:sea",
20
+ "test": "vitest run",
21
+ "lint": "biome check src/",
22
+ "lint:fix": "biome check --fix src/",
23
+ "format": "biome format --write src/"
24
+ },
15
25
  "devDependencies": {
16
- "@types/node": "^22.19.11",
26
+ "@internal/shared": "workspace:*",
27
+ "@types/node": "^25",
17
28
  "@types/tar": "^6.1.13",
18
29
  "esbuild": "^0.25.9",
19
- "vitest": "^3"
30
+ "tsdown": "^0.21.0",
31
+ "vitest": "^4"
20
32
  },
21
33
  "dependencies": {
22
34
  "@inquirer/prompts": "^8.2.0",
@@ -27,14 +39,8 @@
27
39
  "ora": "^9.3.0",
28
40
  "pino": "^10.3.1",
29
41
  "pino-loki": "^3.0.0",
42
+ "semver": "^7.7.4",
30
43
  "tar": "^7.5.8",
31
- "@tank/shared": "0.1.0"
32
- },
33
- "scripts": {
34
- "build": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc",
35
- "build:bundle": "esbuild dist/bin/tank.js --bundle --platform=node --format=esm --outfile=build/tank-bundle.mjs --external:fsevents",
36
- "build:sea": "bash scripts/build-binary.sh",
37
- "build:binary": "pnpm run build && pnpm run build:bundle && pnpm run build:sea",
38
- "test": "vitest run"
44
+ "zod": "^4.3.6"
39
45
  }
40
- }
46
+ }
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Tank Contributors
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
@@ -1,5 +0,0 @@
1
- export interface AuditOptions {
2
- name?: string;
3
- configDir?: string;
4
- }
5
- export declare function auditCommand(options: AuditOptions): Promise<void>;
@@ -1,185 +0,0 @@
1
- import chalk from 'chalk';
2
- import { getConfig } from '../lib/config.js';
3
- import { readLockfile } from '../lib/lockfile.js';
4
- import { USER_AGENT } from '../version.js';
5
- function scoreColor(score) {
6
- if (score >= 7)
7
- return chalk.green;
8
- if (score >= 4)
9
- return chalk.yellow;
10
- return chalk.red;
11
- }
12
- function formatScore(result) {
13
- if (result.error)
14
- return chalk.dim('error');
15
- if (result.score == null || result.status !== 'completed') {
16
- return chalk.dim('pending');
17
- }
18
- return scoreColor(result.score)(result.score.toFixed(1));
19
- }
20
- function formatStatus(result) {
21
- if (result.error)
22
- return chalk.dim('error');
23
- if (result.score == null || result.status !== 'completed') {
24
- return chalk.dim('Analysis pending');
25
- }
26
- if (result.score >= 4)
27
- return chalk.green('pass');
28
- return chalk.red('issues');
29
- }
30
- function padRight(text, width) {
31
- if (text.length >= width)
32
- return text;
33
- return text + ' '.repeat(width - text.length);
34
- }
35
- /**
36
- * Parse a lockfile key like "@org/skill@1.0.0" into { name, version }.
37
- * Scoped packages start with @, so find the LAST @ to split.
38
- */
39
- function parseLockKey(key) {
40
- const lastAt = key.lastIndexOf('@');
41
- if (lastAt <= 0) {
42
- throw new Error(`Invalid lockfile key: ${key}`);
43
- }
44
- return {
45
- name: key.slice(0, lastAt),
46
- version: key.slice(lastAt + 1),
47
- };
48
- }
49
- async function fetchVersionDetails(registryUrl, name, version) {
50
- const encodedName = encodeURIComponent(name);
51
- const url = `${registryUrl}/api/v1/skills/${encodedName}/${version}`;
52
- let res;
53
- try {
54
- res = await fetch(url, {
55
- headers: { 'User-Agent': USER_AGENT },
56
- });
57
- }
58
- catch (err) {
59
- throw new Error(`Network error fetching audit data: ${err instanceof Error ? err.message : String(err)}`);
60
- }
61
- if (!res.ok) {
62
- throw new Error(`API error for ${name}@${version}: ${res.status} ${res.statusText}`);
63
- }
64
- return await res.json();
65
- }
66
- function displayDetailedAudit(result) {
67
- console.log('');
68
- console.log(chalk.bold(result.name));
69
- console.log('');
70
- console.log(`${chalk.dim('Version:'.padEnd(14))}${result.version}`);
71
- console.log(`${chalk.dim('Audit Score:'.padEnd(14))}${formatScore(result)}`);
72
- console.log(`${chalk.dim('Status:'.padEnd(14))}${result.status}`);
73
- const perms = result.permissions;
74
- if (perms) {
75
- console.log('');
76
- console.log(chalk.bold('Permissions:'));
77
- const networkDomains = perms.network?.outbound;
78
- if (networkDomains && networkDomains.length > 0) {
79
- console.log(` ${chalk.dim('Network:'.padEnd(14))}${networkDomains.join(', ')}`);
80
- }
81
- const fsRead = perms.filesystem?.read;
82
- const fsWrite = perms.filesystem?.write;
83
- if (fsRead || fsWrite) {
84
- const parts = [];
85
- if (fsRead && fsRead.length > 0) {
86
- parts.push(`${fsRead.join(', ')} (read)`);
87
- }
88
- if (fsWrite && fsWrite.length > 0) {
89
- parts.push(`${fsWrite.join(', ')} (write)`);
90
- }
91
- console.log(` ${chalk.dim('Filesystem:'.padEnd(14))}${parts.join(', ')}`);
92
- }
93
- console.log(` ${chalk.dim('Subprocess:'.padEnd(14))}${perms.subprocess ? 'yes' : 'no'}`);
94
- }
95
- }
96
- function displayTable(results) {
97
- // Header
98
- console.log(padRight('NAME', 30) +
99
- padRight('VERSION', 12) +
100
- padRight('SCORE', 10) +
101
- 'STATUS');
102
- for (const result of results) {
103
- const name = chalk.bold(padRight(result.name, 30));
104
- const version = padRight(result.version, 12);
105
- const score = padRight(formatScore(result), 10);
106
- const status = formatStatus(result);
107
- console.log(`${name}${version}${score}${status}`);
108
- }
109
- // Summary
110
- const total = results.length;
111
- const pass = results.filter((r) => !r.error && r.score != null && r.status === 'completed' && r.score >= 4).length;
112
- const issues = total - pass;
113
- console.log('');
114
- console.log(`${total} skill${total === 1 ? '' : 's'} audited. ` +
115
- `${pass} pass, ${issues} ${issues === 1 ? 'has' : 'have'} issues.`);
116
- }
117
- export async function auditCommand(options) {
118
- const { name, configDir } = options;
119
- const config = getConfig(configDir);
120
- // Read lockfile
121
- const lock = readLockfile();
122
- if (!lock) {
123
- console.log('No lockfile found. Run: tank install');
124
- return;
125
- }
126
- const entries = Object.entries(lock.skills);
127
- if (entries.length === 0) {
128
- console.log('No skills installed.');
129
- return;
130
- }
131
- // Single skill audit
132
- if (name) {
133
- // Find the skill in lockfile
134
- const matchingEntry = entries.find(([key]) => {
135
- const parsed = parseLockKey(key);
136
- return parsed.name === name;
137
- });
138
- if (!matchingEntry) {
139
- console.log(`Skill not installed: ${name}`);
140
- return;
141
- }
142
- const [key] = matchingEntry;
143
- const parsed = parseLockKey(key);
144
- const details = await fetchVersionDetails(config.registry, parsed.name, parsed.version);
145
- const result = {
146
- name: parsed.name,
147
- version: parsed.version,
148
- score: details.auditScore,
149
- status: details.auditStatus,
150
- permissions: details.permissions,
151
- };
152
- displayDetailedAudit(result);
153
- return;
154
- }
155
- // Audit all skills
156
- const results = [];
157
- for (const [key] of entries) {
158
- const parsed = parseLockKey(key);
159
- try {
160
- const details = await fetchVersionDetails(config.registry, parsed.name, parsed.version);
161
- results.push({
162
- name: parsed.name,
163
- version: parsed.version,
164
- score: details.auditScore,
165
- status: details.auditStatus,
166
- });
167
- }
168
- catch (err) {
169
- // For network errors, re-throw immediately
170
- if (err instanceof Error && err.message.startsWith('Network error')) {
171
- throw err;
172
- }
173
- // For API errors (404, etc.), show the skill with error status
174
- results.push({
175
- name: parsed.name,
176
- version: parsed.version,
177
- score: null,
178
- status: 'error',
179
- error: true,
180
- });
181
- }
182
- }
183
- displayTable(results);
184
- }
185
- //# sourceMappingURL=audit.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- export interface DoctorOptions {
2
- directory?: string;
3
- homedir?: string;
4
- }
5
- export declare function doctorCommand(options?: DoctorOptions): Promise<void>;