@agentpowers/cli 0.5.1 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/banner.d.ts +2 -0
- package/dist/banner.js +33 -0
- package/dist/banner.js.map +1 -0
- package/dist/cli.js +14 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/detail.js +66 -33
- package/dist/commands/detail.js.map +1 -1
- package/dist/commands/install.js +26 -27
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/login.js +10 -7
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.js +2 -1
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/profile.js +25 -16
- package/dist/commands/profile.js.map +1 -1
- package/dist/commands/prune.d.ts +4 -0
- package/dist/commands/prune.js +60 -0
- package/dist/commands/prune.js.map +1 -0
- package/dist/commands/publish.js +28 -19
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/republish.js +26 -18
- package/dist/commands/republish.js.map +1 -1
- package/dist/commands/scan.js +38 -28
- package/dist/commands/scan.js.map +1 -1
- package/dist/commands/search.js +5 -4
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/setup.js +14 -12
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/status.js +31 -33
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/uninstall.js +8 -4
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/unpublish.js +16 -11
- package/dist/commands/unpublish.js.map +1 -1
- package/dist/commands/update.js +89 -49
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/verify.js +5 -5
- package/dist/commands/verify.js.map +1 -1
- package/dist/commands/whoami.js +11 -6
- package/dist/commands/whoami.js.map +1 -1
- package/dist/formatters.d.ts +26 -1
- package/dist/formatters.js +207 -37
- package/dist/formatters.js.map +1 -1
- package/package.json +2 -1
package/dist/commands/update.js
CHANGED
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
/** Update command — check for and install updates to installed skills. */
|
|
2
2
|
import { hostname } from "node:os";
|
|
3
|
+
import chalk from "chalk";
|
|
3
4
|
import { loadAuthToken } from "../auth.js";
|
|
4
5
|
import { apiGet, recordInstallation, APIError, NetworkError, } from "../api-client.js";
|
|
5
6
|
import { downloadAndExtract, getInstallDir, validateSlug } from "../installer.js";
|
|
7
|
+
import { formatError, writeStatus, clearStatus, renderTable } from "../formatters.js";
|
|
6
8
|
import { loadPins, hashDirectory, isDirectory } from "@agentpowers/core";
|
|
9
|
+
/** Normalize pin.type to "skill" | "agent". Garbage values default to "skill". */
|
|
10
|
+
function normalizePinType(raw) {
|
|
11
|
+
if (raw === "agent")
|
|
12
|
+
return "agent";
|
|
13
|
+
return "skill";
|
|
14
|
+
}
|
|
7
15
|
/**
|
|
8
16
|
* Update a single skill by slug.
|
|
9
17
|
*/
|
|
@@ -11,41 +19,48 @@ async function updateSingle(slug, force) {
|
|
|
11
19
|
const pins = loadPins();
|
|
12
20
|
const pin = pins[slug];
|
|
13
21
|
if (!pin) {
|
|
14
|
-
console.error(`'${slug}' is not installed. Run \`npx @agentpowers/cli install ${slug}\` first.`);
|
|
22
|
+
console.error(formatError(`'${slug}' is not installed. Run \`npx @agentpowers/cli install ${slug}\` first.`));
|
|
15
23
|
process.exitCode = 1;
|
|
16
24
|
return;
|
|
17
25
|
}
|
|
18
|
-
const type = pin.type
|
|
26
|
+
const type = normalizePinType(pin.type);
|
|
19
27
|
const installDir = getInstallDir(slug, type);
|
|
28
|
+
// Ghost pin — directory doesn't exist on disk
|
|
29
|
+
if (!isDirectory(installDir)) {
|
|
30
|
+
console.error(formatError(`'${slug}' has a pin but is not installed on disk. Run \`npx @agentpowers/cli prune\` to clean up, or reinstall it.`));
|
|
31
|
+
process.exitCode = 1;
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
20
34
|
const token = loadAuthToken();
|
|
21
35
|
// Check if locally edited
|
|
22
36
|
let isEdited = false;
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
// If we can't hash, treat as not edited
|
|
30
|
-
}
|
|
37
|
+
try {
|
|
38
|
+
const currentHash = hashDirectory(installDir);
|
|
39
|
+
isEdited = currentHash !== pin.content_hash;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// If we can't hash, treat as not edited
|
|
31
43
|
}
|
|
32
44
|
// Fetch latest version from API
|
|
33
45
|
let detail;
|
|
34
46
|
try {
|
|
47
|
+
writeStatus(`Checking ${slug}...`);
|
|
35
48
|
const params = {};
|
|
36
49
|
if (pin.source !== "agentpowers")
|
|
37
50
|
params.source = pin.source;
|
|
38
51
|
detail = await apiGet(`/v1/detail/${encodeURIComponent(slug)}`, params);
|
|
52
|
+
clearStatus();
|
|
39
53
|
}
|
|
40
54
|
catch (err) {
|
|
55
|
+
clearStatus();
|
|
41
56
|
if (err instanceof APIError && err.statusCode === 404) {
|
|
42
|
-
console.error(`'${slug}' not found on server (may have been unpublished).`);
|
|
57
|
+
console.error(formatError(`'${slug}' not found on server (may have been unpublished).`));
|
|
43
58
|
}
|
|
44
59
|
else if (err instanceof NetworkError) {
|
|
45
|
-
console.error(`${slug}: ${err.message}`);
|
|
60
|
+
console.error(formatError(`${slug}: ${err.message}`));
|
|
46
61
|
}
|
|
47
62
|
else if (err instanceof Error) {
|
|
48
|
-
console.error(`${slug}: ${err.message}`);
|
|
63
|
+
console.error(formatError(`${slug}: ${err.message}`));
|
|
49
64
|
}
|
|
50
65
|
process.exitCode = 1;
|
|
51
66
|
return;
|
|
@@ -54,31 +69,32 @@ async function updateSingle(slug, force) {
|
|
|
54
69
|
// Compare versions
|
|
55
70
|
if (!latestVersion || latestVersion === pin.version) {
|
|
56
71
|
if (isEdited && !force) {
|
|
57
|
-
console.log(`${slug} is up to date (v${pin.version ?? "unknown"}) but locally edited.`);
|
|
72
|
+
console.log(`${chalk.cyan(slug)} is up to date (v${pin.version ?? "unknown"}) but ${chalk.yellow("locally edited")}.`);
|
|
58
73
|
return;
|
|
59
74
|
}
|
|
60
|
-
console.log(`${slug} is already up to date (v${pin.version ?? "unknown"}).`);
|
|
75
|
+
console.log(`${chalk.cyan(slug)} is already up to date (v${pin.version ?? "unknown"}).`);
|
|
61
76
|
return;
|
|
62
77
|
}
|
|
63
78
|
// Update available — check for local edits
|
|
64
79
|
if (isEdited && !force) {
|
|
65
|
-
console.log(`${slug}: locally edited
|
|
66
|
-
console.log("Use --force to update anyway (local changes will be overwritten).");
|
|
80
|
+
console.log(`${chalk.cyan(slug)}: ${chalk.yellow("locally edited")} -- ${pin.version ?? "unknown"} -> ${latestVersion} available but skipped.`);
|
|
81
|
+
console.log(chalk.dim("Use --force to update anyway (local changes will be overwritten)."));
|
|
67
82
|
return;
|
|
68
83
|
}
|
|
69
84
|
// Download and install
|
|
70
85
|
try {
|
|
71
86
|
const label = isEdited ? "Force updating" : "Updating";
|
|
72
|
-
console.log(` ${label} ${slug}: ${pin.version ?? "unknown"} -> ${latestVersion}...`);
|
|
87
|
+
console.log(` ${label} ${chalk.cyan(slug)}: ${pin.version ?? "unknown"} -> ${latestVersion}...`);
|
|
73
88
|
const downloadData = await apiGet(`/v1/skills/${encodeURIComponent(slug)}/download`, undefined, token);
|
|
74
89
|
await downloadAndExtract(downloadData.url, slug, type, pin.source, latestVersion, detail.security_status ?? "pass");
|
|
75
|
-
console.log(` [ok] ${slug} updated to ${latestVersion}.`);
|
|
90
|
+
console.log(` ${chalk.green("[ok]")} ${chalk.cyan(slug)} updated to ${latestVersion}.`);
|
|
76
91
|
// Record installation (fire-and-forget)
|
|
77
92
|
void recordInstallation(slug, "cli", pin.source, hostname(), token);
|
|
78
93
|
}
|
|
79
94
|
catch (err) {
|
|
95
|
+
clearStatus();
|
|
80
96
|
if (err instanceof Error) {
|
|
81
|
-
console.error(` [!] ${slug}: Update failed
|
|
97
|
+
console.error(` ${chalk.red("[!]")} ${chalk.cyan(slug)}: Update failed -- ${err.message}`);
|
|
82
98
|
}
|
|
83
99
|
process.exitCode = 1;
|
|
84
100
|
}
|
|
@@ -88,7 +104,7 @@ export async function updateCommand(slug, options) {
|
|
|
88
104
|
// Single-slug mode
|
|
89
105
|
if (slug) {
|
|
90
106
|
if (!validateSlug(slug)) {
|
|
91
|
-
console.error(`
|
|
107
|
+
console.error(formatError(`Invalid slug "${slug}". Slugs must be lowercase alphanumeric with hyphens only.`));
|
|
92
108
|
process.exitCode = 1;
|
|
93
109
|
return;
|
|
94
110
|
}
|
|
@@ -108,20 +124,32 @@ export async function updateCommand(slug, options) {
|
|
|
108
124
|
let skipped = 0;
|
|
109
125
|
let forced = 0;
|
|
110
126
|
let errored = 0;
|
|
127
|
+
// Detect ghost pins
|
|
128
|
+
const ghostSlugs = [];
|
|
129
|
+
const summaryRows = [];
|
|
130
|
+
writeStatus("Checking for updates...");
|
|
111
131
|
for (const pinSlug of slugs) {
|
|
132
|
+
// Skip pins with invalid slugs (path traversal protection)
|
|
133
|
+
if (!validateSlug(pinSlug)) {
|
|
134
|
+
ghostSlugs.push(pinSlug);
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
112
137
|
const pin = pins[pinSlug];
|
|
113
|
-
const type = pin.type
|
|
138
|
+
const type = normalizePinType(pin.type);
|
|
114
139
|
const installDir = getInstallDir(pinSlug, type);
|
|
140
|
+
// Skip ghost pins — directory doesn't exist on disk
|
|
141
|
+
if (!isDirectory(installDir)) {
|
|
142
|
+
ghostSlugs.push(pinSlug);
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
115
145
|
// Check if locally edited
|
|
116
146
|
let isEdited = false;
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
// If we can't hash, treat as not edited
|
|
124
|
-
}
|
|
147
|
+
try {
|
|
148
|
+
const currentHash = hashDirectory(installDir);
|
|
149
|
+
isEdited = currentHash !== pin.content_hash;
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
// If we can't hash, treat as not edited
|
|
125
153
|
}
|
|
126
154
|
// Fetch latest version from API
|
|
127
155
|
let detail;
|
|
@@ -134,13 +162,10 @@ export async function updateCommand(slug, options) {
|
|
|
134
162
|
catch (err) {
|
|
135
163
|
errored++;
|
|
136
164
|
if (err instanceof APIError && err.statusCode === 404) {
|
|
137
|
-
|
|
138
|
-
}
|
|
139
|
-
else if (err instanceof NetworkError) {
|
|
140
|
-
console.error(` [!] ${pinSlug}: ${err.message}`);
|
|
165
|
+
summaryRows.push([pinSlug, pin.source || "unknown", pin.version ?? "-", "-", chalk.red("Not found")]);
|
|
141
166
|
}
|
|
142
167
|
else if (err instanceof Error) {
|
|
143
|
-
|
|
168
|
+
summaryRows.push([pinSlug, pin.source || "unknown", pin.version ?? "-", "-", chalk.red("Error")]);
|
|
144
169
|
}
|
|
145
170
|
continue;
|
|
146
171
|
}
|
|
@@ -148,51 +173,66 @@ export async function updateCommand(slug, options) {
|
|
|
148
173
|
// Compare versions
|
|
149
174
|
if (!latestVersion || latestVersion === pin.version) {
|
|
150
175
|
current++;
|
|
176
|
+
summaryRows.push([pinSlug, pin.source || "unknown", pin.version ?? "-", latestVersion ?? "-", chalk.dim("Up to date")]);
|
|
151
177
|
continue;
|
|
152
178
|
}
|
|
153
179
|
// Update available
|
|
154
180
|
if (isEdited && !force) {
|
|
155
181
|
skipped++;
|
|
156
|
-
|
|
182
|
+
summaryRows.push([pinSlug, pin.source || "unknown", pin.version ?? "-", latestVersion, chalk.yellow("Edited (skipped)")]);
|
|
157
183
|
continue;
|
|
158
184
|
}
|
|
159
185
|
// Download and install
|
|
160
186
|
try {
|
|
161
|
-
|
|
162
|
-
console.log(` ${label} ${pinSlug}: ${pin.version ?? "unknown"} -> ${latestVersion}...`);
|
|
187
|
+
writeStatus(`Updating ${pinSlug}...`);
|
|
163
188
|
const downloadData = await apiGet(`/v1/skills/${encodeURIComponent(pinSlug)}/download`, undefined, token);
|
|
164
189
|
await downloadAndExtract(downloadData.url, pinSlug, type, pin.source, latestVersion, detail.security_status ?? "pass");
|
|
165
190
|
if (isEdited) {
|
|
166
191
|
forced++;
|
|
167
|
-
|
|
192
|
+
summaryRows.push([pinSlug, pin.source || "unknown", pin.version ?? "-", latestVersion, chalk.green("Force-updated")]);
|
|
168
193
|
}
|
|
169
194
|
else {
|
|
170
195
|
updated++;
|
|
171
|
-
|
|
196
|
+
summaryRows.push([pinSlug, pin.source || "unknown", pin.version ?? "-", latestVersion, chalk.green("Updated")]);
|
|
172
197
|
}
|
|
173
198
|
// Record installation (fire-and-forget)
|
|
174
199
|
void recordInstallation(pinSlug, "cli", pin.source, hostname(), token);
|
|
175
200
|
}
|
|
176
201
|
catch (err) {
|
|
177
202
|
errored++;
|
|
178
|
-
|
|
179
|
-
console.error(` [!] ${pinSlug}: Update failed — ${err.message}`);
|
|
180
|
-
}
|
|
203
|
+
summaryRows.push([pinSlug, pin.source || "unknown", pin.version ?? "-", "-", chalk.red("Failed")]);
|
|
181
204
|
}
|
|
182
205
|
}
|
|
183
|
-
|
|
206
|
+
clearStatus();
|
|
207
|
+
// Summary table
|
|
208
|
+
if (summaryRows.length > 0) {
|
|
209
|
+
const columns = [
|
|
210
|
+
{ header: "Slug", style: (v) => chalk.cyan(v) },
|
|
211
|
+
{ header: "Source", style: (v) => chalk.yellow(v) },
|
|
212
|
+
{ header: "Current" },
|
|
213
|
+
{ header: "Latest" },
|
|
214
|
+
{ header: "Status" },
|
|
215
|
+
];
|
|
216
|
+
console.log(renderTable(columns, summaryRows, "Update Summary"));
|
|
217
|
+
}
|
|
218
|
+
// Text summary
|
|
184
219
|
console.log("");
|
|
185
220
|
const parts = [];
|
|
186
221
|
if (updated > 0)
|
|
187
|
-
parts.push(`${updated} updated`);
|
|
222
|
+
parts.push(chalk.green(`${updated} updated`));
|
|
188
223
|
if (forced > 0)
|
|
189
|
-
parts.push(`${forced} force-updated`);
|
|
224
|
+
parts.push(chalk.green(`${forced} force-updated`));
|
|
190
225
|
if (current > 0)
|
|
191
|
-
parts.push(`${current} already current`);
|
|
226
|
+
parts.push(chalk.dim(`${current} already current`));
|
|
192
227
|
if (skipped > 0)
|
|
193
|
-
parts.push(`${skipped} skipped (locally edited)`);
|
|
228
|
+
parts.push(chalk.yellow(`${skipped} skipped (locally edited)`));
|
|
194
229
|
if (errored > 0)
|
|
195
|
-
parts.push(`${errored} failed`);
|
|
230
|
+
parts.push(chalk.red(`${errored} failed`));
|
|
231
|
+
if (ghostSlugs.length > 0)
|
|
232
|
+
parts.push(chalk.dim(`${ghostSlugs.length} stale (not on disk)`));
|
|
196
233
|
console.log(parts.join(", ") + ".");
|
|
234
|
+
if (ghostSlugs.length > 0) {
|
|
235
|
+
console.log(chalk.dim(`\nRun \`npx @agentpowers/cli prune\` to remove ${ghostSlugs.length} stale pin(s) from the registry.`));
|
|
236
|
+
}
|
|
197
237
|
}
|
|
198
238
|
//# sourceMappingURL=update.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAE1E,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EACL,MAAM,EACN,kBAAkB,EAClB,QAAQ,EACR,YAAY,GACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/verify.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/** Verify command — check installed skills against content hash pins. */
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
+
import chalk from "chalk";
|
|
3
4
|
import { loadPins, hashDirectory, isDirectory, SKILLS_DIR, } from "@agentpowers/core";
|
|
4
5
|
export async function verifyCommand() {
|
|
5
6
|
const pins = loadPins();
|
|
@@ -12,25 +13,24 @@ export async function verifyCommand() {
|
|
|
12
13
|
let hasFailure = false;
|
|
13
14
|
for (const slug of slugs.sort()) {
|
|
14
15
|
const pin = pins[slug];
|
|
15
|
-
const type = pin.type || "skill";
|
|
16
16
|
const source = pin.source || "unknown";
|
|
17
17
|
// Determine install directory
|
|
18
18
|
const installDir = join(SKILLS_DIR, slug);
|
|
19
19
|
if (!pin.content_hash) {
|
|
20
|
-
console.log(` SKIP ${slug} (${source})
|
|
20
|
+
console.log(` ${chalk.yellow("SKIP")} ${chalk.cyan(slug)} (${source}) -- no content hash stored`);
|
|
21
21
|
continue;
|
|
22
22
|
}
|
|
23
23
|
if (!isDirectory(installDir)) {
|
|
24
|
-
console.log(` MISSING ${slug} (${source})
|
|
24
|
+
console.log(` ${chalk.red("MISSING")} ${chalk.cyan(slug)} (${source}) -- not found on disk`);
|
|
25
25
|
hasFailure = true;
|
|
26
26
|
continue;
|
|
27
27
|
}
|
|
28
28
|
const currentHash = hashDirectory(installDir);
|
|
29
29
|
if (currentHash === pin.content_hash) {
|
|
30
|
-
console.log(` OK ${slug} (${source})`);
|
|
30
|
+
console.log(` ${chalk.green("OK")} ${chalk.cyan(slug)} (${source})`);
|
|
31
31
|
}
|
|
32
32
|
else {
|
|
33
|
-
console.log(` FAIL ${slug} (${source})
|
|
33
|
+
console.log(` ${chalk.red("FAIL")} ${chalk.cyan(slug)} (${source}) -- hash mismatch`);
|
|
34
34
|
hasFailure = true;
|
|
35
35
|
}
|
|
36
36
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAAA,yEAAyE;AAEzE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,QAAQ,EACR,aAAa,EACb,WAAW,EACX,UAAU,GACX,MAAM,mBAAmB,CAAC;AAE3B,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;IACxB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEhC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,MAAM,
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAAA,yEAAyE;AAEzE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,QAAQ,EACR,aAAa,EACb,WAAW,EACX,UAAU,GACX,MAAM,mBAAmB,CAAC;AAE3B,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;IACxB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEhC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,SAAS,CAAC;QAEvC,8BAA8B;QAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAE1C,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,MAAM,6BAA6B,CAAC,CAAC;YACtG,SAAS;QACX,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,MAAM,wBAAwB,CAAC,CAAC;YAC9F,UAAU,GAAG,IAAI,CAAC;YAClB,SAAS;QACX,CAAC;QAED,MAAM,WAAW,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,WAAW,KAAK,GAAG,CAAC,YAAY,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,MAAM,GAAG,CAAC,CAAC;QAC7E,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,MAAM,oBAAoB,CAAC,CAAC;YAC1F,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
|
package/dist/commands/whoami.js
CHANGED
|
@@ -1,31 +1,36 @@
|
|
|
1
1
|
/** Whoami command — show current authenticated user info. */
|
|
2
|
+
import chalk from "chalk";
|
|
2
3
|
import { loadAuthToken } from "../auth.js";
|
|
3
4
|
import { apiGet, APIError, formatAPIError, NetworkError } from "../api-client.js";
|
|
5
|
+
import { formatError, writeStatus, clearStatus } from "../formatters.js";
|
|
4
6
|
export async function whoamiCommand() {
|
|
5
7
|
const token = loadAuthToken();
|
|
6
8
|
if (!token) {
|
|
7
|
-
console.error("Not logged in. Run `npx @agentpowers/cli login` first.");
|
|
9
|
+
console.error(formatError("Not logged in. Run `npx @agentpowers/cli login` first."));
|
|
8
10
|
process.exitCode = 1;
|
|
9
11
|
return;
|
|
10
12
|
}
|
|
11
13
|
try {
|
|
14
|
+
writeStatus("Checking...");
|
|
12
15
|
const me = await apiGet("/v1/auth/me", undefined, token);
|
|
13
|
-
|
|
16
|
+
clearStatus();
|
|
17
|
+
console.log(`${chalk.bold("Email:")} ${me.email}`);
|
|
14
18
|
if (me.name) {
|
|
15
|
-
console.log(
|
|
19
|
+
console.log(`${chalk.bold("Name:")} ${me.name}`);
|
|
16
20
|
}
|
|
17
21
|
}
|
|
18
22
|
catch (err) {
|
|
23
|
+
clearStatus();
|
|
19
24
|
if (err instanceof APIError && err.statusCode === 401) {
|
|
20
|
-
console.error("Not logged in. Run `npx @agentpowers/cli login` first.");
|
|
25
|
+
console.error(formatError("Not logged in. Run `npx @agentpowers/cli login` first."));
|
|
21
26
|
process.exitCode = 1;
|
|
22
27
|
}
|
|
23
28
|
else if (err instanceof APIError) {
|
|
24
|
-
console.error(
|
|
29
|
+
console.error(formatError(formatAPIError(err)));
|
|
25
30
|
process.exitCode = 1;
|
|
26
31
|
}
|
|
27
32
|
else if (err instanceof NetworkError) {
|
|
28
|
-
console.error(
|
|
33
|
+
console.error(formatError(err.message));
|
|
29
34
|
process.exitCode = 1;
|
|
30
35
|
}
|
|
31
36
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAOzE,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;IAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,wDAAwD,CAAC,CAAC,CAAC;QACrF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,WAAW,CAAC,aAAa,CAAC,CAAC;QAC3B,MAAM,EAAE,GAAG,MAAM,MAAM,CAAa,aAAa,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QACrE,WAAW,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;QACpD,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,WAAW,EAAE,CAAC;QACd,IAAI,GAAG,YAAY,QAAQ,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;YACtD,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,wDAAwD,CAAC,CAAC,CAAC;YACrF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;aAAM,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAChD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;aAAM,IAAI,GAAG,YAAY,YAAY,EAAE,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YACxC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/dist/formatters.d.ts
CHANGED
|
@@ -1,5 +1,30 @@
|
|
|
1
|
-
/** Terminal output formatters for CLI display. */
|
|
1
|
+
/** Terminal output formatters for CLI display — Rich-style colored output. */
|
|
2
2
|
import type { SectionedSearchResponse } from "./types.js";
|
|
3
|
+
declare const teal: import("chalk").ChalkInstance;
|
|
4
|
+
export { teal };
|
|
3
5
|
export declare function formatPrice(priceCents: number): string;
|
|
6
|
+
/** Format security status with color (for terminal display). */
|
|
4
7
|
export declare function formatSecurityStatus(status: string): string;
|
|
8
|
+
/** Format security status without color (for plain text / tests). */
|
|
9
|
+
export declare function formatSecurityStatusPlain(status: string): string;
|
|
10
|
+
export declare function formatSeverity(severity: string): string;
|
|
11
|
+
export declare function formatInstalled(state: string | null): string;
|
|
12
|
+
export interface TableColumn {
|
|
13
|
+
header: string;
|
|
14
|
+
width?: number;
|
|
15
|
+
align?: "left" | "right";
|
|
16
|
+
style?: (val: string) => string;
|
|
17
|
+
}
|
|
18
|
+
export declare function stripAnsi(str: string): string;
|
|
19
|
+
/** Sanitize a string for safe terminal display (removes newlines, control chars). */
|
|
20
|
+
export declare function sanitizeForTerminal(str: string): string;
|
|
21
|
+
export declare function renderTable(columns: TableColumn[], rows: string[][], title?: string): string;
|
|
22
|
+
export declare function renderPanel(content: string, title?: string, borderColor?: "cyan" | "green" | "yellow" | "red"): string;
|
|
23
|
+
/** Write a status message to stderr (same line, overwritten). */
|
|
24
|
+
export declare function writeStatus(message: string): void;
|
|
25
|
+
export declare function clearStatus(): void;
|
|
26
|
+
export declare function formatError(message: string): string;
|
|
27
|
+
export declare function formatSuccess(message: string): string;
|
|
28
|
+
export declare function formatWarning(message: string): string;
|
|
29
|
+
export declare function formatDim(message: string): string;
|
|
5
30
|
export declare function formatSearchResults(data: SectionedSearchResponse): string;
|