@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 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
- .action(async (query) => {
31
- await searchCommand(query);
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
- .action(async (slug) => {
37
- await installCommand(slug);
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 updateCommand();
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;IAC9B,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;IAC7B,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,YAAY,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,yDAAyD,CAAC;KACtE,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,YAAY,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,mDAAmD,CAAC;KAChE,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,aAAa,EAAE,CAAC;AACxB,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** Detail command — show full skill metadata. */
2
+ export interface DetailOptions {
3
+ source?: string;
4
+ }
5
+ export declare function detailCommand(slug: string, options?: DetailOptions): Promise<void>;
@@ -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
- export declare function installCommand(slug: string): Promise<void>;
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 {};
@@ -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
- export async function installCommand(slug) {
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
- // Get download URL
17
- const downloadData = await apiGet(`/v1/skills/${slug}/download`, undefined, token);
18
- // Download and extract
19
- const result = await downloadAndExtract(downloadData.url, slug, "skill", "agentpowers");
20
- console.log(`Installed ${slug} to ${result.installDir}`);
21
- console.log(`Content hash: ${result.contentHash}`);
22
- // Record installation (fire-and-forget)
23
- void recordInstallation(slug, "cli", "agentpowers", hostname(), token);
24
- console.log("\nThe skill is now available in Claude Code.");
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;AAGnE,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,uBAAuB;IACvB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CACX,wBAAwB,IAAI,4DAA4D,CACzF,CAAC;QACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;IAE9B,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,KAAK,CAAC,CAAC;QAEtC,mBAAmB;QACnB,MAAM,YAAY,GAAG,MAAM,MAAM,CAC/B,cAAc,IAAI,WAAW,EAC7B,SAAS,EACT,KAAK,CACN,CAAC;QAEF,uBAAuB;QACvB,MAAM,MAAM,GAAG,MAAM,kBAAkB,CACrC,YAAY,CAAC,GAAG,EAChB,IAAI,EACJ,OAAO,EACP,aAAa,CACd,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QAEnD,wCAAwC;QACxC,KAAK,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;QAEvE,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC9D,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,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;YAChC,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"}
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ /** Logout command — revoke token and clear local credentials. */
2
+ export declare function logoutCommand(): Promise<void>;
@@ -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 declare function searchCommand(query: string): Promise<void>;
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>;
@@ -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 data = await apiGet("/v1/search", { q: query });
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;AAGvD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAa;IAC/C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAA0B,YAAY,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/E,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"}
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,2 @@
1
+ /** Status command — list installed skills and agents with metadata. */
2
+ export declare function statusCommand(): Promise<void>;
@@ -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,5 @@
1
+ /** Uninstall command — remove an installed skill or agent. */
2
+ export interface UninstallOptions {
3
+ force?: boolean;
4
+ }
5
+ export declare function uninstallCommand(slug: string, options?: UninstallOptions): Promise<void>;
@@ -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":"AAAA,8DAA8D;AAE9D,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEpE,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;AAMpD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAY,EACZ,UAA4B,EAAE;IAE9B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CACX,wBAAwB,IAAI,4DAA4D,CACzF,CAAC;QACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;IAExB,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,IAAI,IAAI,CAAC;IAE5B,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,IAAI,CAAC,MAAM,EAAE,CAAC;QAC5C,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,6BAA6B,CAAC,CAAC;QACrD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,gCAAgC;IAChC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,IAAI,WAAW;QAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,WAAW;QAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,MAAM;QAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAElC,yBAAyB;IACzB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,SAAS,GAAG,MAAM,OAAO,CAC7B,WAAW,IAAI,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAC9C,CAAC;QACF,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACxB,OAAO;QACT,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,aAAa;IACb,IAAI,MAAM,EAAE,CAAC;QACX,SAAS,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,IAAI,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,OAAO,CAAC,QAAgB;IAC/B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,EAAE,GAAG,eAAe,CAAC;YACzB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QACH,EAAE,CAAC,QAAQ,CAAC,GAAG,QAAQ,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE;YAC3C,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,2 +1,4 @@
1
- /** Update command — check for and install updates to all installed skills. */
2
- export declare function updateCommand(): Promise<void>;
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>;
@@ -1,10 +1,101 @@
1
- /** Update command — check for and install updates to all installed skills. */
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
- export async function updateCommand() {
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 slug of slugs) {
20
- const pin = pins[slug];
111
+ for (const pinSlug of slugs) {
112
+ const pin = pins[pinSlug];
21
113
  const type = pin.type ?? "skill";
22
- const installDir = getInstallDir(slug, type);
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(slug)}`, params);
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(` [!] ${slug}: Not found on server (may have been unpublished).`);
137
+ console.error(` [!] ${pinSlug}: Not found on server (may have been unpublished).`);
46
138
  }
47
139
  else if (err instanceof NetworkError) {
48
- console.error(` [!] ${slug}: ${err.message}`);
140
+ console.error(` [!] ${pinSlug}: ${err.message}`);
49
141
  }
50
142
  else if (err instanceof Error) {
51
- console.error(` [!] ${slug}: ${err.message}`);
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] ${slug}: locally edited — ${pin.version ?? "unknown"} -> ${latestVersion} available but skipped.`);
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
- console.log(` Updating ${slug}: ${pin.version ?? "unknown"} -> ${latestVersion}...`);
70
- const downloadData = await apiGet(`/v1/skills/${encodeURIComponent(slug)}/download`, undefined, token);
71
- await downloadAndExtract(downloadData.url, slug, type, pin.source, latestVersion, detail.security_status ?? "pass");
72
- updated++;
73
- console.log(` [ok] ${slug} updated to ${latestVersion}.`);
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(slug, "cli", pin.source, hostname(), token);
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(` [!] ${slug}: Update failed — ${err.message}`);
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":"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"}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ /** Whoami command — show current authenticated user info. */
2
+ export declare function whoamiCommand(): Promise<void>;
@@ -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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentpowers/cli",
3
- "version": "0.2.1",
3
+ "version": "0.4.0",
4
4
  "description": "CLI for the AgentPowers marketplace — search, install, and manage Claude Code skills.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",