@agentpowers/cli 0.2.1 → 0.4.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/cli.js +51 -6
- package/dist/cli.js.map +1 -1
- package/dist/commands/detail.d.ts +5 -0
- package/dist/commands/detail.js +81 -0
- package/dist/commands/detail.js.map +1 -0
- package/dist/commands/install.d.ts +8 -1
- package/dist/commands/install.js +113 -11
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/logout.d.ts +2 -0
- package/dist/commands/logout.js +23 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/search.d.ts +6 -1
- package/dist/commands/search.js +9 -2
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.js +81 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/uninstall.d.ts +5 -0
- package/dist/commands/uninstall.js +66 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts +4 -2
- package/dist/commands/update.js +120 -19
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/whoami.d.ts +2 -0
- package/dist/commands/whoami.js +36 -0
- package/dist/commands/whoami.js.map +1 -0
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -7,8 +7,13 @@ import { Command } from "commander";
|
|
|
7
7
|
import { searchCommand } from "./commands/search.js";
|
|
8
8
|
import { installCommand } from "./commands/install.js";
|
|
9
9
|
import { loginCommand } from "./commands/login.js";
|
|
10
|
+
import { logoutCommand } from "./commands/logout.js";
|
|
11
|
+
import { whoamiCommand } from "./commands/whoami.js";
|
|
10
12
|
import { setupCommand } from "./commands/setup.js";
|
|
11
13
|
import { updateCommand } from "./commands/update.js";
|
|
14
|
+
import { statusCommand } from "./commands/status.js";
|
|
15
|
+
import { uninstallCommand } from "./commands/uninstall.js";
|
|
16
|
+
import { detailCommand } from "./commands/detail.js";
|
|
12
17
|
function getVersion() {
|
|
13
18
|
try {
|
|
14
19
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
@@ -27,14 +32,35 @@ program
|
|
|
27
32
|
program
|
|
28
33
|
.command("search <query>")
|
|
29
34
|
.description("Search for skills in the marketplace")
|
|
30
|
-
.
|
|
31
|
-
|
|
35
|
+
.option("-c, --category <category>", "Filter by category")
|
|
36
|
+
.option("-t, --type <type>", "Filter by type (skill or agent)")
|
|
37
|
+
.option("-l, --limit <limit>", "Maximum results (default 20)")
|
|
38
|
+
.action(async (query, options) => {
|
|
39
|
+
await searchCommand(query, options);
|
|
32
40
|
});
|
|
33
41
|
program
|
|
34
42
|
.command("install <slug>")
|
|
35
43
|
.description("Install a skill by its slug")
|
|
36
|
-
.
|
|
37
|
-
|
|
44
|
+
.option("--code <code>", "License code for paid skills")
|
|
45
|
+
.option("--source <source>", "External source (e.g. clawhub)")
|
|
46
|
+
.option("--global", "Install to the global config directory")
|
|
47
|
+
.option("--for <tool>", "Target AI tool (claude-code, codex, gemini, kiro)", "claude-code")
|
|
48
|
+
.action(async (slug, options) => {
|
|
49
|
+
await installCommand(slug, options);
|
|
50
|
+
});
|
|
51
|
+
program
|
|
52
|
+
.command("uninstall <slug>")
|
|
53
|
+
.description("Remove an installed skill or agent")
|
|
54
|
+
.option("-f, --force", "Skip confirmation prompt")
|
|
55
|
+
.action(async (slug, options) => {
|
|
56
|
+
await uninstallCommand(slug, options);
|
|
57
|
+
});
|
|
58
|
+
program
|
|
59
|
+
.command("detail <slug>")
|
|
60
|
+
.description("Show full details for a skill")
|
|
61
|
+
.option("-s, --source <source>", "Specify source (agentpowers, clawhub)")
|
|
62
|
+
.action(async (slug, options) => {
|
|
63
|
+
await detailCommand(slug, options);
|
|
38
64
|
});
|
|
39
65
|
program
|
|
40
66
|
.command("login")
|
|
@@ -42,6 +68,18 @@ program
|
|
|
42
68
|
.action(async () => {
|
|
43
69
|
await loginCommand();
|
|
44
70
|
});
|
|
71
|
+
program
|
|
72
|
+
.command("logout")
|
|
73
|
+
.description("Log out and revoke your CLI token")
|
|
74
|
+
.action(async () => {
|
|
75
|
+
await logoutCommand();
|
|
76
|
+
});
|
|
77
|
+
program
|
|
78
|
+
.command("whoami")
|
|
79
|
+
.description("Show the currently authenticated user")
|
|
80
|
+
.action(async () => {
|
|
81
|
+
await whoamiCommand();
|
|
82
|
+
});
|
|
45
83
|
program
|
|
46
84
|
.command("setup")
|
|
47
85
|
.description("Auto-configure AgentPowers MCP server for your AI tools")
|
|
@@ -49,10 +87,17 @@ program
|
|
|
49
87
|
await setupCommand();
|
|
50
88
|
});
|
|
51
89
|
program
|
|
52
|
-
.command("update")
|
|
90
|
+
.command("update [slug]")
|
|
53
91
|
.description("Check for and install updates to installed skills")
|
|
92
|
+
.option("-f, --force", "Skip confirmation for locally edited skills")
|
|
93
|
+
.action(async (slug, options) => {
|
|
94
|
+
await updateCommand(slug, options);
|
|
95
|
+
});
|
|
96
|
+
program
|
|
97
|
+
.command("status")
|
|
98
|
+
.description("List installed skills and agents with metadata")
|
|
54
99
|
.action(async () => {
|
|
55
|
-
await
|
|
100
|
+
await statusCommand();
|
|
56
101
|
});
|
|
57
102
|
program.parse();
|
|
58
103
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,wEAAwE;AAExE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,SAAS,UAAU;IACjB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QACrF,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,aAAa,CAAC;KACnB,WAAW,CAAC,kFAAkF,CAAC;KAC/F,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,sCAAsC,CAAC;KACnD,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/** Detail command — show full skill metadata. */
|
|
2
|
+
import { apiGet, APIError, formatAPIError, NetworkError } from "../api-client.js";
|
|
3
|
+
import { formatPrice, formatSecurityStatus } from "../formatters.js";
|
|
4
|
+
import { validateSlug } from "../installer.js";
|
|
5
|
+
export async function detailCommand(slug, options = {}) {
|
|
6
|
+
if (!validateSlug(slug)) {
|
|
7
|
+
console.error(`Error: Invalid slug "${slug}". Slugs must be lowercase alphanumeric with hyphens only.`);
|
|
8
|
+
process.exitCode = 1;
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
try {
|
|
12
|
+
const params = {};
|
|
13
|
+
if (options.source)
|
|
14
|
+
params.source = options.source;
|
|
15
|
+
const detail = await apiGet(`/v1/detail/${slug}`, params);
|
|
16
|
+
// Header
|
|
17
|
+
console.log("");
|
|
18
|
+
console.log(` ${detail.title}`);
|
|
19
|
+
console.log(` ${"─".repeat(Math.min(detail.title.length, 60))}`);
|
|
20
|
+
console.log("");
|
|
21
|
+
// Metadata
|
|
22
|
+
const author = detail.author_display_name ||
|
|
23
|
+
detail.author_github ||
|
|
24
|
+
"Unknown";
|
|
25
|
+
console.log(` Author: ${author}`);
|
|
26
|
+
console.log(` Version: ${detail.version || "-"}`);
|
|
27
|
+
if (detail.category)
|
|
28
|
+
console.log(` Category: ${detail.category}`);
|
|
29
|
+
console.log(` Type: ${detail.type || "skill"}`);
|
|
30
|
+
console.log(` Source: ${detail.source || "agentpowers"}`);
|
|
31
|
+
console.log(` Security: ${formatSecurityStatus(detail.security_status || "pending")}`);
|
|
32
|
+
console.log(` Price: ${formatPrice(detail.price_cents || 0)}`);
|
|
33
|
+
console.log("");
|
|
34
|
+
// Description
|
|
35
|
+
const desc = detail.long_description || detail.description;
|
|
36
|
+
if (desc) {
|
|
37
|
+
console.log(` ${desc}`);
|
|
38
|
+
console.log("");
|
|
39
|
+
}
|
|
40
|
+
// Stats
|
|
41
|
+
const stats = [];
|
|
42
|
+
if (detail.download_count != null)
|
|
43
|
+
stats.push(`Downloads: ${detail.download_count}`);
|
|
44
|
+
if (detail.source_stars != null)
|
|
45
|
+
stats.push(`Stars: ${detail.source_stars}`);
|
|
46
|
+
if (detail.source_installs != null)
|
|
47
|
+
stats.push(`Installs: ${detail.source_installs}`);
|
|
48
|
+
if (stats.length > 0) {
|
|
49
|
+
console.log(` Stats: ${stats.join(" | ")}`);
|
|
50
|
+
}
|
|
51
|
+
// Rating
|
|
52
|
+
if (detail.rating_average != null && detail.rating_count > 0) {
|
|
53
|
+
console.log(` Rating: ${detail.rating_average.toFixed(1)}/5 (${detail.rating_count} review${detail.rating_count === 1 ? "" : "s"})`);
|
|
54
|
+
}
|
|
55
|
+
// URL
|
|
56
|
+
const url = detail.source_url || `https://agentpowers.ai/skills/${slug}`;
|
|
57
|
+
console.log(` URL: ${url}`);
|
|
58
|
+
console.log("");
|
|
59
|
+
// Install tip
|
|
60
|
+
console.log(` Install: npx @agentpowers/cli install ${slug}`);
|
|
61
|
+
console.log("");
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
if (err instanceof APIError && err.statusCode === 404) {
|
|
65
|
+
console.error(`Error: Skill '${slug}' not found.`);
|
|
66
|
+
process.exitCode = 1;
|
|
67
|
+
}
|
|
68
|
+
else if (err instanceof APIError) {
|
|
69
|
+
console.error(`Error: ${formatAPIError(err)}`);
|
|
70
|
+
process.exitCode = 1;
|
|
71
|
+
}
|
|
72
|
+
else if (err instanceof NetworkError) {
|
|
73
|
+
console.error(`Error: ${err.message}`);
|
|
74
|
+
process.exitCode = 1;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
throw err;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=detail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detail.js","sourceRoot":"","sources":["../../src/commands/detail.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,9 @@
|
|
|
1
1
|
/** Install command — download and install a skill from the marketplace. */
|
|
2
|
-
|
|
2
|
+
interface InstallOptions {
|
|
3
|
+
code?: string;
|
|
4
|
+
source?: string;
|
|
5
|
+
global?: boolean;
|
|
6
|
+
for?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function installCommand(slug: string, options?: InstallOptions): Promise<void>;
|
|
9
|
+
export {};
|
package/dist/commands/install.js
CHANGED
|
@@ -1,27 +1,129 @@
|
|
|
1
1
|
/** Install command — download and install a skill from the marketplace. */
|
|
2
2
|
import { hostname } from "node:os";
|
|
3
3
|
import { loadAuthToken } from "../auth.js";
|
|
4
|
-
import { apiGet, recordInstallation, APIError, formatAPIError, NetworkError, } from "../api-client.js";
|
|
4
|
+
import { apiGet, apiPost, recordInstallation, APIError, formatAPIError, NetworkError, } from "../api-client.js";
|
|
5
5
|
import { downloadAndExtract, validateSlug } from "../installer.js";
|
|
6
|
-
|
|
6
|
+
import { TOOL_CONFIG_DIRS } from "@agentpowers/core";
|
|
7
|
+
/** Coerce a detail type string to PackageType, defaulting to "skill". */
|
|
8
|
+
function toPackageType(raw) {
|
|
9
|
+
if (raw === "agent")
|
|
10
|
+
return "agent";
|
|
11
|
+
return "skill";
|
|
12
|
+
}
|
|
13
|
+
export async function installCommand(slug, options) {
|
|
7
14
|
// Validate slug format
|
|
8
15
|
if (!validateSlug(slug)) {
|
|
9
16
|
console.error(`Error: Invalid slug "${slug}". Slugs must be lowercase alphanumeric with hyphens only.`);
|
|
10
17
|
process.exitCode = 1;
|
|
11
18
|
return;
|
|
12
19
|
}
|
|
20
|
+
const targetTool = options?.for ?? "claude-code";
|
|
21
|
+
// Validate target tool
|
|
22
|
+
if (!(targetTool in TOOL_CONFIG_DIRS)) {
|
|
23
|
+
const supported = Object.keys(TOOL_CONFIG_DIRS).sort().join(", ");
|
|
24
|
+
console.error(`Error: Unknown tool "${targetTool}". Supported tools: ${supported}`);
|
|
25
|
+
process.exitCode = 1;
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
13
28
|
const token = loadAuthToken();
|
|
29
|
+
const source = options?.source;
|
|
14
30
|
try {
|
|
31
|
+
// --code: redeem license code before downloading
|
|
32
|
+
if (options?.code) {
|
|
33
|
+
if (!token) {
|
|
34
|
+
console.error("Error: Authentication required to redeem a license code. Run `npx @agentpowers/cli login` first.");
|
|
35
|
+
process.exitCode = 1;
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
console.log("Redeeming license code...");
|
|
39
|
+
await apiPost("/v1/purchases/redeem", { license_code: options.code }, token);
|
|
40
|
+
console.log("License code redeemed.");
|
|
41
|
+
}
|
|
42
|
+
// --source: install from a specific external source
|
|
43
|
+
if (source) {
|
|
44
|
+
console.log(`Fetching ${slug} from ${source}...`);
|
|
45
|
+
const detail = await apiGet(`/v1/detail/${encodeURIComponent(slug)}`, { source }, token);
|
|
46
|
+
const downloadUrl = detail.source_url;
|
|
47
|
+
if (!downloadUrl) {
|
|
48
|
+
console.error(`Error: No download URL available for "${slug}" from source "${source}".`);
|
|
49
|
+
process.exitCode = 1;
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const result = await downloadAndExtract(downloadUrl, slug, toPackageType(detail.type), source, detail.version ?? null, detail.security_status ?? "pass", targetTool);
|
|
53
|
+
console.log(`Installed ${slug} to ${result.installDir}`);
|
|
54
|
+
console.log(`Content hash: ${result.contentHash}`);
|
|
55
|
+
void recordInstallation(slug, "cli", source, hostname(), token);
|
|
56
|
+
console.log("\nThe skill is now available.");
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
// Default flow: try native AgentPowers first
|
|
15
60
|
console.log(`Downloading ${slug}...`);
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
61
|
+
let downloadData = null;
|
|
62
|
+
let nativeError = null;
|
|
63
|
+
try {
|
|
64
|
+
downloadData = await apiGet(`/v1/skills/${encodeURIComponent(slug)}/download`, undefined, token);
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
if (err instanceof APIError && err.statusCode === 404) {
|
|
68
|
+
nativeError = err;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
throw err;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Found natively — download and install
|
|
75
|
+
if (downloadData) {
|
|
76
|
+
const result = await downloadAndExtract(downloadData.url, slug, "skill", "agentpowers", null, "pass", targetTool);
|
|
77
|
+
console.log(`Installed ${slug} to ${result.installDir}`);
|
|
78
|
+
console.log(`Content hash: ${result.contentHash}`);
|
|
79
|
+
void recordInstallation(slug, "cli", "agentpowers", hostname(), token);
|
|
80
|
+
console.log("\nThe skill is now available.");
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
// Not found natively — try unified detail endpoint for external sources
|
|
84
|
+
if (nativeError) {
|
|
85
|
+
console.log("Not found in AgentPowers, searching other sources...");
|
|
86
|
+
let detail = null;
|
|
87
|
+
try {
|
|
88
|
+
detail = await apiGet(`/v1/detail/${encodeURIComponent(slug)}`, undefined, token);
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
if (err instanceof APIError && err.statusCode === 404) {
|
|
92
|
+
detail = null;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
throw err;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (detail && detail.source && detail.source !== "agentpowers") {
|
|
99
|
+
const detailSource = detail.source;
|
|
100
|
+
const downloadUrl = detail.source_url;
|
|
101
|
+
if (!downloadUrl) {
|
|
102
|
+
console.error(`Error: No download URL available for "${slug}" from source "${detailSource}".`);
|
|
103
|
+
process.exitCode = 1;
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
console.log(`Found on ${detailSource}: ${detail.title ?? slug} (v${detail.version ?? "?"})`);
|
|
107
|
+
const result = await downloadAndExtract(downloadUrl, slug, toPackageType(detail.type), detailSource, detail.version ?? null, detail.security_status ?? "pass", targetTool);
|
|
108
|
+
console.log(`Installed ${slug} to ${result.installDir}`);
|
|
109
|
+
console.log(`Content hash: ${result.contentHash}`);
|
|
110
|
+
void recordInstallation(slug, "cli", detailSource, hostname(), token);
|
|
111
|
+
console.log("\nThe skill is now available.");
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
// If detail returned a native result, try downloading it
|
|
115
|
+
if (detail && (!detail.source || detail.source === "agentpowers")) {
|
|
116
|
+
const nativeDownload = await apiGet(`/v1/skills/${encodeURIComponent(slug)}/download`, undefined, token);
|
|
117
|
+
const result = await downloadAndExtract(nativeDownload.url, slug, toPackageType(detail.type), "agentpowers", null, detail.security_status ?? "pass", targetTool);
|
|
118
|
+
console.log(`Installed ${slug} to ${result.installDir}`);
|
|
119
|
+
console.log(`Content hash: ${result.contentHash}`);
|
|
120
|
+
void recordInstallation(slug, "cli", "agentpowers", hostname(), token);
|
|
121
|
+
console.log("\nThe skill is now available.");
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
console.error(`Error: Skill "${slug}" not found in any source.`);
|
|
125
|
+
process.exitCode = 1;
|
|
126
|
+
}
|
|
25
127
|
}
|
|
26
128
|
catch (err) {
|
|
27
129
|
if (err instanceof APIError) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAE3E,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EACL,MAAM,EACN,kBAAkB,EAClB,QAAQ,EACR,cAAc,EACd,YAAY,GACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Logout command — revoke token and clear local credentials. */
|
|
2
|
+
import { existsSync, unlinkSync } from "node:fs";
|
|
3
|
+
import { loadAuthToken } from "../auth.js";
|
|
4
|
+
import { apiPost } from "../api-client.js";
|
|
5
|
+
import { AUTH_FILE } from "@agentpowers/core";
|
|
6
|
+
export async function logoutCommand() {
|
|
7
|
+
// Best-effort server-side revocation
|
|
8
|
+
const token = loadAuthToken();
|
|
9
|
+
if (token) {
|
|
10
|
+
try {
|
|
11
|
+
await apiPost("/v1/auth/revoke-cli-token", {}, token);
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
// Ignore — server revocation is best-effort
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
// Always delete local credentials
|
|
18
|
+
if (existsSync(AUTH_FILE)) {
|
|
19
|
+
unlinkSync(AUTH_FILE);
|
|
20
|
+
}
|
|
21
|
+
console.log("Logged out.");
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=logout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,iEAAiE;AAEjE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,qCAAqC;IACrC,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;IAC9B,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,2BAA2B,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,4CAA4C;QAC9C,CAAC;IACH,CAAC;IAED,kCAAkC;IAClC,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,UAAU,CAAC,SAAS,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -1,2 +1,7 @@
|
|
|
1
1
|
/** Search command — query the AgentPowers marketplace. */
|
|
2
|
-
export
|
|
2
|
+
export interface SearchOptions {
|
|
3
|
+
category?: string;
|
|
4
|
+
type?: string;
|
|
5
|
+
limit?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function searchCommand(query: string, options?: SearchOptions): Promise<void>;
|
package/dist/commands/search.js
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
/** Search command — query the AgentPowers marketplace. */
|
|
2
2
|
import { apiGet, APIError, formatAPIError, NetworkError } from "../api-client.js";
|
|
3
3
|
import { formatSearchResults } from "../formatters.js";
|
|
4
|
-
export async function searchCommand(query) {
|
|
4
|
+
export async function searchCommand(query, options = {}) {
|
|
5
5
|
try {
|
|
6
|
-
const
|
|
6
|
+
const params = { q: query };
|
|
7
|
+
if (options.category)
|
|
8
|
+
params.category = options.category;
|
|
9
|
+
if (options.type)
|
|
10
|
+
params.type = options.type;
|
|
11
|
+
if (options.limit)
|
|
12
|
+
params.limit = options.limit;
|
|
13
|
+
const data = await apiGet("/v1/search", params);
|
|
7
14
|
const output = formatSearchResults(data);
|
|
8
15
|
console.log(output);
|
|
9
16
|
// Install hint
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAE1D,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAE1D,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AASvD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAa,EACb,UAAyB,EAAE;IAE3B,IAAI,CAAC;QACH,MAAM,MAAM,GAA2B,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;QACpD,IAAI,OAAO,CAAC,QAAQ;YAAE,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACzD,IAAI,OAAO,CAAC,IAAI;YAAE,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC7C,IAAI,OAAO,CAAC,KAAK;YAAE,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAEhD,MAAM,IAAI,GAAG,MAAM,MAAM,CAA0B,YAAY,EAAE,MAAM,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEpB,eAAe;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;QAChC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,2DAA2D,SAAS,EAAE,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YAC5B,OAAO,CAAC,KAAK,CAAC,UAAU,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC/C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;aAAM,IAAI,GAAG,YAAY,YAAY,EAAE,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACvC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/** Status command — list installed skills and agents with metadata. */
|
|
2
|
+
import { existsSync, readdirSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { loadAuthToken } from "../auth.js";
|
|
5
|
+
import { SKILLS_DIR, loadPins } from "@agentpowers/core";
|
|
6
|
+
const AGENTS_DIR = join(SKILLS_DIR, "..", "agents");
|
|
7
|
+
export async function statusCommand() {
|
|
8
|
+
// Auth status
|
|
9
|
+
const token = loadAuthToken();
|
|
10
|
+
if (token) {
|
|
11
|
+
console.log("Logged in (run `npx @agentpowers/cli whoami` to verify)");
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
console.log("Not logged in. Run `npx @agentpowers/cli login` to purchase and publish skills.");
|
|
15
|
+
}
|
|
16
|
+
console.log("");
|
|
17
|
+
// Load pins
|
|
18
|
+
const pins = loadPins();
|
|
19
|
+
// List installed skills
|
|
20
|
+
const skillSlugs = listInstalledSlugs(SKILLS_DIR);
|
|
21
|
+
if (skillSlugs.length > 0) {
|
|
22
|
+
console.log(`Installed Skills (${skillSlugs.length})`);
|
|
23
|
+
console.log(padRight("Slug", 30) +
|
|
24
|
+
padRight("Source", 15) +
|
|
25
|
+
padRight("Security", 12) +
|
|
26
|
+
padRight("Version", 10) +
|
|
27
|
+
"Installed");
|
|
28
|
+
console.log("-".repeat(80));
|
|
29
|
+
for (const slug of skillSlugs) {
|
|
30
|
+
const pin = pins[slug];
|
|
31
|
+
console.log(padRight(slug, 30) +
|
|
32
|
+
padRight(pin?.source ?? "local", 15) +
|
|
33
|
+
padRight(pin?.security_status ?? "-", 12) +
|
|
34
|
+
padRight(pin?.version ?? "-", 10) +
|
|
35
|
+
(pin?.installed_at ? pin.installed_at.slice(0, 10) : "-"));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
console.log("No skills installed.");
|
|
40
|
+
}
|
|
41
|
+
console.log("");
|
|
42
|
+
// List installed agents
|
|
43
|
+
const agentSlugs = listInstalledSlugs(AGENTS_DIR);
|
|
44
|
+
if (agentSlugs.length > 0) {
|
|
45
|
+
console.log(`Installed Agents (${agentSlugs.length})`);
|
|
46
|
+
console.log(padRight("Slug", 30) +
|
|
47
|
+
padRight("Source", 15) +
|
|
48
|
+
padRight("Security", 12) +
|
|
49
|
+
padRight("Version", 10) +
|
|
50
|
+
"Installed");
|
|
51
|
+
console.log("-".repeat(80));
|
|
52
|
+
for (const slug of agentSlugs) {
|
|
53
|
+
const pin = pins[slug];
|
|
54
|
+
console.log(padRight(slug, 30) +
|
|
55
|
+
padRight(pin?.source ?? "local", 15) +
|
|
56
|
+
padRight(pin?.security_status ?? "-", 12) +
|
|
57
|
+
padRight(pin?.version ?? "-", 10) +
|
|
58
|
+
(pin?.installed_at ? pin.installed_at.slice(0, 10) : "-"));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
console.log("No agents installed.");
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function listInstalledSlugs(dir) {
|
|
66
|
+
if (!existsSync(dir))
|
|
67
|
+
return [];
|
|
68
|
+
try {
|
|
69
|
+
return readdirSync(dir, { withFileTypes: true })
|
|
70
|
+
.filter((d) => d.isDirectory() && !d.name.startsWith("."))
|
|
71
|
+
.map((d) => d.name)
|
|
72
|
+
.sort();
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return [];
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function padRight(str, len) {
|
|
79
|
+
return str.length >= len ? str + " " : str + " ".repeat(len - str.length);
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/** Uninstall command — remove an installed skill or agent. */
|
|
2
|
+
import { existsSync, rmSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { createInterface } from "node:readline";
|
|
5
|
+
import { validateSlug } from "../installer.js";
|
|
6
|
+
import { SKILLS_DIR, loadPins, removePin } from "@agentpowers/core";
|
|
7
|
+
const AGENTS_DIR = join(SKILLS_DIR, "..", "agents");
|
|
8
|
+
export async function uninstallCommand(slug, options = {}) {
|
|
9
|
+
if (!validateSlug(slug)) {
|
|
10
|
+
console.error(`Error: Invalid slug "${slug}". Slugs must be lowercase alphanumeric with hyphens only.`);
|
|
11
|
+
process.exitCode = 1;
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const skillDir = join(SKILLS_DIR, slug);
|
|
15
|
+
const agentDir = join(AGENTS_DIR, slug);
|
|
16
|
+
const pins = loadPins();
|
|
17
|
+
const hasSkillDir = existsSync(skillDir);
|
|
18
|
+
const hasAgentDir = existsSync(agentDir);
|
|
19
|
+
const hasPin = slug in pins;
|
|
20
|
+
if (!hasSkillDir && !hasAgentDir && !hasPin) {
|
|
21
|
+
console.error(`'${slug}' not found. Not installed.`);
|
|
22
|
+
process.exitCode = 1;
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
// Describe what will be removed
|
|
26
|
+
const locations = [];
|
|
27
|
+
if (hasSkillDir)
|
|
28
|
+
locations.push("skills");
|
|
29
|
+
if (hasAgentDir)
|
|
30
|
+
locations.push("agents");
|
|
31
|
+
if (hasPin)
|
|
32
|
+
locations.push("pin");
|
|
33
|
+
// Confirm unless --force
|
|
34
|
+
if (!options.force) {
|
|
35
|
+
const confirmed = await confirm(`Remove '${slug}' (${locations.join(", ")})?`);
|
|
36
|
+
if (!confirmed) {
|
|
37
|
+
console.log("Aborted.");
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Remove directories
|
|
42
|
+
if (hasSkillDir) {
|
|
43
|
+
rmSync(skillDir, { recursive: true, force: true });
|
|
44
|
+
}
|
|
45
|
+
if (hasAgentDir) {
|
|
46
|
+
rmSync(agentDir, { recursive: true, force: true });
|
|
47
|
+
}
|
|
48
|
+
// Remove pin
|
|
49
|
+
if (hasPin) {
|
|
50
|
+
removePin(slug);
|
|
51
|
+
}
|
|
52
|
+
console.log(`Uninstalled '${slug}'.`);
|
|
53
|
+
}
|
|
54
|
+
function confirm(question) {
|
|
55
|
+
return new Promise((resolve) => {
|
|
56
|
+
const rl = createInterface({
|
|
57
|
+
input: process.stdin,
|
|
58
|
+
output: process.stdout,
|
|
59
|
+
});
|
|
60
|
+
rl.question(`${question} [y/N] `, (answer) => {
|
|
61
|
+
rl.close();
|
|
62
|
+
resolve(answer.toLowerCase() === "y" || answer.toLowerCase() === "yes");
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=uninstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,4 @@
|
|
|
1
|
-
/** Update command — check for and install updates to
|
|
2
|
-
export declare function updateCommand(
|
|
1
|
+
/** Update command — check for and install updates to installed skills. */
|
|
2
|
+
export declare function updateCommand(slug?: string, options?: {
|
|
3
|
+
force?: boolean;
|
|
4
|
+
}): Promise<void>;
|
package/dist/commands/update.js
CHANGED
|
@@ -1,10 +1,101 @@
|
|
|
1
|
-
/** Update command — check for and install updates to
|
|
1
|
+
/** Update command — check for and install updates to installed skills. */
|
|
2
2
|
import { hostname } from "node:os";
|
|
3
3
|
import { loadAuthToken } from "../auth.js";
|
|
4
4
|
import { apiGet, recordInstallation, APIError, NetworkError, } from "../api-client.js";
|
|
5
|
-
import { downloadAndExtract, getInstallDir } from "../installer.js";
|
|
5
|
+
import { downloadAndExtract, getInstallDir, validateSlug } from "../installer.js";
|
|
6
6
|
import { loadPins, hashDirectory, isDirectory } from "@agentpowers/core";
|
|
7
|
-
|
|
7
|
+
/**
|
|
8
|
+
* Update a single skill by slug.
|
|
9
|
+
*/
|
|
10
|
+
async function updateSingle(slug, force) {
|
|
11
|
+
const pins = loadPins();
|
|
12
|
+
const pin = pins[slug];
|
|
13
|
+
if (!pin) {
|
|
14
|
+
console.error(`'${slug}' is not installed. Run \`npx @agentpowers/cli install ${slug}\` first.`);
|
|
15
|
+
process.exitCode = 1;
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const type = pin.type ?? "skill";
|
|
19
|
+
const installDir = getInstallDir(slug, type);
|
|
20
|
+
const token = loadAuthToken();
|
|
21
|
+
// Check if locally edited
|
|
22
|
+
let isEdited = false;
|
|
23
|
+
if (isDirectory(installDir)) {
|
|
24
|
+
try {
|
|
25
|
+
const currentHash = hashDirectory(installDir);
|
|
26
|
+
isEdited = currentHash !== pin.content_hash;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// If we can't hash, treat as not edited
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// Fetch latest version from API
|
|
33
|
+
let detail;
|
|
34
|
+
try {
|
|
35
|
+
const params = {};
|
|
36
|
+
if (pin.source !== "agentpowers")
|
|
37
|
+
params.source = pin.source;
|
|
38
|
+
detail = await apiGet(`/v1/detail/${encodeURIComponent(slug)}`, params);
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
if (err instanceof APIError && err.statusCode === 404) {
|
|
42
|
+
console.error(`'${slug}' not found on server (may have been unpublished).`);
|
|
43
|
+
}
|
|
44
|
+
else if (err instanceof NetworkError) {
|
|
45
|
+
console.error(`${slug}: ${err.message}`);
|
|
46
|
+
}
|
|
47
|
+
else if (err instanceof Error) {
|
|
48
|
+
console.error(`${slug}: ${err.message}`);
|
|
49
|
+
}
|
|
50
|
+
process.exitCode = 1;
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const latestVersion = detail.version;
|
|
54
|
+
// Compare versions
|
|
55
|
+
if (!latestVersion || latestVersion === pin.version) {
|
|
56
|
+
if (isEdited && !force) {
|
|
57
|
+
console.log(`${slug} is up to date (v${pin.version ?? "unknown"}) but locally edited.`);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
console.log(`${slug} is already up to date (v${pin.version ?? "unknown"}).`);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
// Update available — check for local edits
|
|
64
|
+
if (isEdited && !force) {
|
|
65
|
+
console.log(`${slug}: locally edited — ${pin.version ?? "unknown"} -> ${latestVersion} available but skipped.`);
|
|
66
|
+
console.log("Use --force to update anyway (local changes will be overwritten).");
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
// Download and install
|
|
70
|
+
try {
|
|
71
|
+
const label = isEdited ? "Force updating" : "Updating";
|
|
72
|
+
console.log(` ${label} ${slug}: ${pin.version ?? "unknown"} -> ${latestVersion}...`);
|
|
73
|
+
const downloadData = await apiGet(`/v1/skills/${encodeURIComponent(slug)}/download`, undefined, token);
|
|
74
|
+
await downloadAndExtract(downloadData.url, slug, type, pin.source, latestVersion, detail.security_status ?? "pass");
|
|
75
|
+
console.log(` [ok] ${slug} updated to ${latestVersion}.`);
|
|
76
|
+
// Record installation (fire-and-forget)
|
|
77
|
+
void recordInstallation(slug, "cli", pin.source, hostname(), token);
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
if (err instanceof Error) {
|
|
81
|
+
console.error(` [!] ${slug}: Update failed — ${err.message}`);
|
|
82
|
+
}
|
|
83
|
+
process.exitCode = 1;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
export async function updateCommand(slug, options) {
|
|
87
|
+
const force = options?.force ?? false;
|
|
88
|
+
// Single-slug mode
|
|
89
|
+
if (slug) {
|
|
90
|
+
if (!validateSlug(slug)) {
|
|
91
|
+
console.error(`Error: Invalid slug "${slug}". Slugs must be lowercase alphanumeric with hyphens only.`);
|
|
92
|
+
process.exitCode = 1;
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
await updateSingle(slug, force);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
// Update-all mode
|
|
8
99
|
const pins = loadPins();
|
|
9
100
|
const slugs = Object.keys(pins);
|
|
10
101
|
if (slugs.length === 0) {
|
|
@@ -15,11 +106,12 @@ export async function updateCommand() {
|
|
|
15
106
|
let updated = 0;
|
|
16
107
|
let current = 0;
|
|
17
108
|
let skipped = 0;
|
|
109
|
+
let forced = 0;
|
|
18
110
|
let errored = 0;
|
|
19
|
-
for (const
|
|
20
|
-
const pin = pins[
|
|
111
|
+
for (const pinSlug of slugs) {
|
|
112
|
+
const pin = pins[pinSlug];
|
|
21
113
|
const type = pin.type ?? "skill";
|
|
22
|
-
const installDir = getInstallDir(
|
|
114
|
+
const installDir = getInstallDir(pinSlug, type);
|
|
23
115
|
// Check if locally edited
|
|
24
116
|
let isEdited = false;
|
|
25
117
|
if (isDirectory(installDir)) {
|
|
@@ -37,18 +129,18 @@ export async function updateCommand() {
|
|
|
37
129
|
const params = {};
|
|
38
130
|
if (pin.source !== "agentpowers")
|
|
39
131
|
params.source = pin.source;
|
|
40
|
-
detail = await apiGet(`/v1/detail/${encodeURIComponent(
|
|
132
|
+
detail = await apiGet(`/v1/detail/${encodeURIComponent(pinSlug)}`, params);
|
|
41
133
|
}
|
|
42
134
|
catch (err) {
|
|
43
135
|
errored++;
|
|
44
136
|
if (err instanceof APIError && err.statusCode === 404) {
|
|
45
|
-
console.error(` [!] ${
|
|
137
|
+
console.error(` [!] ${pinSlug}: Not found on server (may have been unpublished).`);
|
|
46
138
|
}
|
|
47
139
|
else if (err instanceof NetworkError) {
|
|
48
|
-
console.error(` [!] ${
|
|
140
|
+
console.error(` [!] ${pinSlug}: ${err.message}`);
|
|
49
141
|
}
|
|
50
142
|
else if (err instanceof Error) {
|
|
51
|
-
console.error(` [!] ${
|
|
143
|
+
console.error(` [!] ${pinSlug}: ${err.message}`);
|
|
52
144
|
}
|
|
53
145
|
continue;
|
|
54
146
|
}
|
|
@@ -59,25 +151,32 @@ export async function updateCommand() {
|
|
|
59
151
|
continue;
|
|
60
152
|
}
|
|
61
153
|
// Update available
|
|
62
|
-
if (isEdited) {
|
|
154
|
+
if (isEdited && !force) {
|
|
63
155
|
skipped++;
|
|
64
|
-
console.log(` [skip] ${
|
|
156
|
+
console.log(` [skip] ${pinSlug}: locally edited — ${pin.version ?? "unknown"} -> ${latestVersion} available but skipped.`);
|
|
65
157
|
continue;
|
|
66
158
|
}
|
|
67
159
|
// Download and install
|
|
68
160
|
try {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
161
|
+
const label = isEdited ? "Force updating" : "Updating";
|
|
162
|
+
console.log(` ${label} ${pinSlug}: ${pin.version ?? "unknown"} -> ${latestVersion}...`);
|
|
163
|
+
const downloadData = await apiGet(`/v1/skills/${encodeURIComponent(pinSlug)}/download`, undefined, token);
|
|
164
|
+
await downloadAndExtract(downloadData.url, pinSlug, type, pin.source, latestVersion, detail.security_status ?? "pass");
|
|
165
|
+
if (isEdited) {
|
|
166
|
+
forced++;
|
|
167
|
+
console.log(` [ok] ${pinSlug} force-updated to ${latestVersion}.`);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
updated++;
|
|
171
|
+
console.log(` [ok] ${pinSlug} updated to ${latestVersion}.`);
|
|
172
|
+
}
|
|
74
173
|
// Record installation (fire-and-forget)
|
|
75
|
-
void recordInstallation(
|
|
174
|
+
void recordInstallation(pinSlug, "cli", pin.source, hostname(), token);
|
|
76
175
|
}
|
|
77
176
|
catch (err) {
|
|
78
177
|
errored++;
|
|
79
178
|
if (err instanceof Error) {
|
|
80
|
-
console.error(` [!] ${
|
|
179
|
+
console.error(` [!] ${pinSlug}: Update failed — ${err.message}`);
|
|
81
180
|
}
|
|
82
181
|
}
|
|
83
182
|
}
|
|
@@ -86,6 +185,8 @@ export async function updateCommand() {
|
|
|
86
185
|
const parts = [];
|
|
87
186
|
if (updated > 0)
|
|
88
187
|
parts.push(`${updated} updated`);
|
|
188
|
+
if (forced > 0)
|
|
189
|
+
parts.push(`${forced} force-updated`);
|
|
89
190
|
if (current > 0)
|
|
90
191
|
parts.push(`${current} already current`);
|
|
91
192
|
if (skipped > 0)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/** Whoami command — show current authenticated user info. */
|
|
2
|
+
import { loadAuthToken } from "../auth.js";
|
|
3
|
+
import { apiGet, APIError, formatAPIError, NetworkError } from "../api-client.js";
|
|
4
|
+
export async function whoamiCommand() {
|
|
5
|
+
const token = loadAuthToken();
|
|
6
|
+
if (!token) {
|
|
7
|
+
console.error("Not logged in. Run `npx @agentpowers/cli login` first.");
|
|
8
|
+
process.exitCode = 1;
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
try {
|
|
12
|
+
const me = await apiGet("/v1/auth/me", undefined, token);
|
|
13
|
+
console.log(`Email: ${me.email}`);
|
|
14
|
+
if (me.name) {
|
|
15
|
+
console.log(`Name: ${me.name}`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
if (err instanceof APIError && err.statusCode === 401) {
|
|
20
|
+
console.error("Not logged in. Run `npx @agentpowers/cli login` first.");
|
|
21
|
+
process.exitCode = 1;
|
|
22
|
+
}
|
|
23
|
+
else if (err instanceof APIError) {
|
|
24
|
+
console.error(`Error: ${formatAPIError(err)}`);
|
|
25
|
+
process.exitCode = 1;
|
|
26
|
+
}
|
|
27
|
+
else if (err instanceof NetworkError) {
|
|
28
|
+
console.error(`Error: ${err.message}`);
|
|
29
|
+
process.exitCode = 1;
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
throw err;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=whoami.js.map
|
|
@@ -0,0 +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;AAOlF,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;IAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;QACxE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,MAAM,CAAa,aAAa,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;QACnC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,QAAQ,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;YACtD,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;YACxE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;aAAM,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,UAAU,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC/C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;aAAM,IAAI,GAAG,YAAY,YAAY,EAAE,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACvC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;AACH,CAAC"}
|