@agentpowers/cli 0.4.0 → 0.5.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.
@@ -1,2 +1,4 @@
1
- /** API client — re-exported from @agentpowers/core. */
1
+ /** API client — re-exported from @agentpowers/core with local extensions. */
2
2
  export { APIError, NetworkError, formatAPIError, apiGet, apiPost, recordInstallation, } from "@agentpowers/core";
3
+ export declare function apiPatch<T = unknown>(path: string, body?: unknown, auth?: string | null): Promise<T>;
4
+ export declare function apiUpload<T = unknown>(path: string, fileData: any, filename: string, extraFields?: Record<string, string>, auth?: string | null): Promise<T>;
@@ -1,3 +1,86 @@
1
- /** API client — re-exported from @agentpowers/core. */
1
+ /** API client — re-exported from @agentpowers/core with local extensions. */
2
2
  export { APIError, NetworkError, formatAPIError, apiGet, apiPost, recordInstallation, } from "@agentpowers/core";
3
+ import { API_BASE_URL, TIMEOUT_MS } from "@agentpowers/core";
4
+ import { APIError } from "@agentpowers/core";
5
+ function parseErrorBody(body) {
6
+ try {
7
+ const json = JSON.parse(body);
8
+ if (typeof json.detail === "string")
9
+ return { message: json.detail };
10
+ if (json.detail && typeof json.detail === "object") {
11
+ const detail = json.detail;
12
+ return {
13
+ message: typeof detail.detail === "string" ? detail.detail : body,
14
+ code: typeof detail.code === "string" ? detail.code : undefined,
15
+ };
16
+ }
17
+ }
18
+ catch { /* not JSON */ }
19
+ return { message: body };
20
+ }
21
+ async function safeFetch(url, init) {
22
+ try {
23
+ return await fetch(url, { ...init, signal: AbortSignal.timeout(TIMEOUT_MS) });
24
+ }
25
+ catch (err) {
26
+ if (err instanceof DOMException && err.name === "TimeoutError") {
27
+ throw new Error("Request timed out. The API may be temporarily unavailable.");
28
+ }
29
+ if (err instanceof TypeError) {
30
+ throw new Error("Could not connect to AgentPowers API. Check your network connection.");
31
+ }
32
+ throw err;
33
+ }
34
+ }
35
+ export async function apiPatch(path, body, auth) {
36
+ if (!path.startsWith("/"))
37
+ throw new Error(`Invalid API path: "${path}"`);
38
+ const url = new URL(path, API_BASE_URL);
39
+ const headers = {
40
+ Accept: "application/json",
41
+ "Content-Type": "application/json",
42
+ };
43
+ if (auth)
44
+ headers["Authorization"] = `Bearer ${auth}`;
45
+ const response = await safeFetch(url.toString(), {
46
+ method: "PATCH",
47
+ headers,
48
+ body: body !== undefined ? JSON.stringify(body) : undefined,
49
+ });
50
+ if (!response.ok) {
51
+ const text = await response.text();
52
+ const { message, code } = parseErrorBody(text);
53
+ throw new APIError(message, response.status, code);
54
+ }
55
+ return (await response.json());
56
+ }
57
+ export async function apiUpload(path,
58
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
59
+ fileData, filename, extraFields, auth) {
60
+ if (!path.startsWith("/"))
61
+ throw new Error(`Invalid API path: "${path}"`);
62
+ const url = new URL(path, API_BASE_URL);
63
+ const formData = new FormData();
64
+ const blob = fileData instanceof Blob ? fileData : new Blob([fileData]);
65
+ formData.append("package", blob, filename);
66
+ if (extraFields) {
67
+ for (const [key, value] of Object.entries(extraFields)) {
68
+ formData.append(key, value);
69
+ }
70
+ }
71
+ const headers = {};
72
+ if (auth)
73
+ headers["Authorization"] = `Bearer ${auth}`;
74
+ const response = await safeFetch(url.toString(), {
75
+ method: "POST",
76
+ headers,
77
+ body: formData,
78
+ });
79
+ if (!response.ok) {
80
+ const text = await response.text();
81
+ const { message, code } = parseErrorBody(text);
82
+ throw new APIError(message, response.status, code);
83
+ }
84
+ return (await response.json());
85
+ }
3
86
  //# sourceMappingURL=api-client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,MAAM,EACN,OAAO,EACP,kBAAkB,GACnB,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -14,6 +14,12 @@ import { updateCommand } from "./commands/update.js";
14
14
  import { statusCommand } from "./commands/status.js";
15
15
  import { uninstallCommand } from "./commands/uninstall.js";
16
16
  import { detailCommand } from "./commands/detail.js";
17
+ import { profileCommand } from "./commands/profile.js";
18
+ import { verifyCommand } from "./commands/verify.js";
19
+ import { scanCommand } from "./commands/scan.js";
20
+ import { publishCommand } from "./commands/publish.js";
21
+ import { unpublishCommand } from "./commands/unpublish.js";
22
+ import { republishCommand } from "./commands/republish.js";
17
23
  function getVersion() {
18
24
  try {
19
25
  const __dirname = dirname(fileURLToPath(import.meta.url));
@@ -99,5 +105,52 @@ program
99
105
  .action(async () => {
100
106
  await statusCommand();
101
107
  });
108
+ program
109
+ .command("profile")
110
+ .description("View or update your seller profile")
111
+ .option("--set", "Interactively edit profile fields")
112
+ .action(async (options) => {
113
+ await profileCommand(options);
114
+ });
115
+ program
116
+ .command("verify")
117
+ .description("Check installed skills against content hash pins")
118
+ .action(async () => {
119
+ await verifyCommand();
120
+ });
121
+ program
122
+ .command("scan <slug>")
123
+ .description("Download and scan an external skill for security issues")
124
+ .option("-s, --source <source>", "Source to download from (auto-detected if omitted)")
125
+ .option("-t, --type <type>", "Type: skill or agent", "skill")
126
+ .action(async (slug, options) => {
127
+ await scanCommand(slug, options);
128
+ });
129
+ program
130
+ .command("publish")
131
+ .description("Publish a skill or agent to the marketplace")
132
+ .option("--price <price>", "Price in USD (0 for free)")
133
+ .option("--dir <dir>", "Directory containing the skill", ".")
134
+ .option("--category <category>", "Marketplace category", "development")
135
+ .option("--bump <bump>", "Version bump: patch, minor, major", "patch")
136
+ .option("--version <version>", "Explicit version string")
137
+ .option("--changelog <changelog>", "Changelog message")
138
+ .action(async (options) => {
139
+ await publishCommand(options);
140
+ });
141
+ program
142
+ .command("unpublish <slug>")
143
+ .description("Remove a skill from marketplace discovery")
144
+ .option("-f, --force", "Skip confirmation prompt")
145
+ .action(async (slug, options) => {
146
+ await unpublishCommand(slug, options);
147
+ });
148
+ program
149
+ .command("republish <slug>")
150
+ .description("Restore an archived skill to marketplace discovery")
151
+ .option("-f, --force", "Skip confirmation prompt")
152
+ .action(async (slug, options) => {
153
+ await republishCommand(slug, options);
154
+ });
102
155
  program.parse();
103
156
  //# 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":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -12,11 +12,12 @@ export async function detailCommand(slug, options = {}) {
12
12
  const params = {};
13
13
  if (options.source)
14
14
  params.source = options.source;
15
- const detail = await apiGet(`/v1/detail/${slug}`, params);
15
+ const detail = await apiGet(`/v1/detail/${encodeURIComponent(slug)}`, params);
16
16
  // Header
17
+ const title = detail.title || slug;
17
18
  console.log("");
18
- console.log(` ${detail.title}`);
19
- console.log(` ${"─".repeat(Math.min(detail.title.length, 60))}`);
19
+ console.log(` ${title}`);
20
+ console.log(` ${"─".repeat(Math.min(title.length, 60))}`);
20
21
  console.log("");
21
22
  // Metadata
22
23
  const author = detail.author_display_name ||
@@ -1 +1 @@
1
- {"version":3,"file":"detail.js","sourceRoot":"","sources":["../../src/commands/detail.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"detail.js","sourceRoot":"","sources":["../../src/commands/detail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** Profile command — view or edit user profile. */
2
+ export interface ProfileOptions {
3
+ set?: boolean;
4
+ }
5
+ export declare function profileCommand(options?: ProfileOptions): Promise<void>;
@@ -0,0 +1,95 @@
1
+ /** Profile command — view or edit user profile. */
2
+ import { createInterface } from "node:readline/promises";
3
+ import { stdin, stdout } from "node:process";
4
+ import { apiGet, apiPatch, APIError, formatAPIError, NetworkError } from "../api-client.js";
5
+ import { loadAuthToken } from "../auth.js";
6
+ export async function profileCommand(options = {}) {
7
+ const token = loadAuthToken();
8
+ if (!token) {
9
+ console.error("Error: Not logged in. Run `npx @agentpowers/cli login` first.");
10
+ process.exitCode = 1;
11
+ return;
12
+ }
13
+ try {
14
+ if (options.set) {
15
+ await editProfile(token);
16
+ }
17
+ else {
18
+ await viewProfile(token);
19
+ }
20
+ }
21
+ catch (err) {
22
+ if (err instanceof APIError && err.statusCode === 401) {
23
+ console.error("Error: Not logged in. Run `npx @agentpowers/cli login` first.");
24
+ process.exitCode = 1;
25
+ }
26
+ else if (err instanceof APIError) {
27
+ console.error(`Error: ${formatAPIError(err)}`);
28
+ process.exitCode = 1;
29
+ }
30
+ else if (err instanceof NetworkError) {
31
+ console.error(`Error: ${err.message}`);
32
+ process.exitCode = 1;
33
+ }
34
+ else {
35
+ throw err;
36
+ }
37
+ }
38
+ }
39
+ async function viewProfile(token) {
40
+ const profile = await apiGet("/v1/users/profile", {}, token);
41
+ console.log("");
42
+ console.log(" Your Profile");
43
+ console.log(" ────────────");
44
+ console.log("");
45
+ console.log(` Display Name: ${profile.display_name || "(not set)"}`);
46
+ console.log(` Email: ${profile.email || "(not set)"}`);
47
+ console.log(` Bio: ${profile.bio || "(not set)"}`);
48
+ console.log(` Created: ${profile.created_at || "-"}`);
49
+ console.log("");
50
+ if (!profile.display_name) {
51
+ console.log(" Tip: Set your display name with: npx @agentpowers/cli profile --set");
52
+ console.log("");
53
+ }
54
+ }
55
+ async function editProfile(token) {
56
+ // Fetch current profile to show defaults
57
+ const current = await apiGet("/v1/users/profile", {}, token);
58
+ const rl = createInterface({ input: stdin, output: stdout });
59
+ try {
60
+ const defaultName = current.display_name || "";
61
+ const defaultBio = current.bio || "";
62
+ const displayName = await rl.question(` Display name${defaultName ? ` [${defaultName}]` : ""}: `);
63
+ const bio = await rl.question(` Bio${defaultBio ? ` [${defaultBio}]` : ""}: `);
64
+ const body = {};
65
+ if (displayName.trim()) {
66
+ body.display_name = displayName.trim();
67
+ }
68
+ else if (defaultName) {
69
+ body.display_name = defaultName;
70
+ }
71
+ if (bio.trim()) {
72
+ body.bio = bio.trim();
73
+ }
74
+ else if (defaultBio) {
75
+ body.bio = defaultBio;
76
+ }
77
+ if (Object.keys(body).length === 0) {
78
+ console.log("");
79
+ console.log(" No changes made.");
80
+ return;
81
+ }
82
+ const updated = await apiPatch("/v1/users/profile", body, token);
83
+ console.log("");
84
+ console.log(" Profile updated!");
85
+ console.log("");
86
+ console.log(` Display Name: ${updated.display_name || "(not set)"}`);
87
+ console.log(` Email: ${updated.email || "(not set)"}`);
88
+ console.log(` Bio: ${updated.bio || "(not set)"}`);
89
+ console.log("");
90
+ }
91
+ finally {
92
+ rl.close();
93
+ }
94
+ }
95
+ //# sourceMappingURL=profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/commands/profile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /** Publish command — package and upload a skill to the AgentPowers marketplace. */
2
+ interface PublishOptions {
3
+ price?: string;
4
+ dir?: string;
5
+ category?: string;
6
+ bump?: string;
7
+ version?: string;
8
+ changelog?: string;
9
+ }
10
+ export declare function publishCommand(options: PublishOptions): Promise<void>;
11
+ export {};
@@ -0,0 +1,214 @@
1
+ /** Publish command — package and upload a skill to the AgentPowers marketplace. */
2
+ import { readFileSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { execSync } from "node:child_process";
5
+ import { loadAuthToken } from "../auth.js";
6
+ import { apiPost, apiPatch, apiUpload, APIError, formatAPIError, NetworkError, } from "../api-client.js";
7
+ /** Parse YAML-like frontmatter from SKILL.md content. */
8
+ function parseFrontmatter(content) {
9
+ const match = content.match(/^---\n([\s\S]*?)\n---/);
10
+ if (!match) {
11
+ throw new Error("SKILL.md is missing frontmatter. Add a YAML block between --- markers.");
12
+ }
13
+ const fields = {};
14
+ for (const line of match[1].split("\n")) {
15
+ const kv = line.match(/^(\w[\w-]*):\s*(.+)$/);
16
+ if (kv) {
17
+ fields[kv[1].toLowerCase()] = kv[2].trim();
18
+ }
19
+ }
20
+ if (!fields.name) {
21
+ throw new Error("SKILL.md frontmatter is missing the 'name' field.");
22
+ }
23
+ return {
24
+ name: fields.name,
25
+ description: fields.description || "",
26
+ type: fields.type || "skill",
27
+ };
28
+ }
29
+ /** Create a slug from a skill name: lowercase, spaces/underscores to hyphens. */
30
+ function slugify(name) {
31
+ return name
32
+ .toLowerCase()
33
+ .replace(/[^a-z0-9-]+/g, "-")
34
+ .replace(/^-+|-+$/g, "");
35
+ }
36
+ /** Create a ZIP buffer of the directory using the system zip command. */
37
+ function createZipBuffer(dir) {
38
+ try {
39
+ return execSync("zip -r - .", {
40
+ cwd: dir,
41
+ maxBuffer: 50 * 1024 * 1024,
42
+ stdio: ["pipe", "pipe", "pipe"],
43
+ });
44
+ }
45
+ catch {
46
+ // Fallback to tar if zip is not available
47
+ try {
48
+ return execSync("tar czf - .", {
49
+ cwd: dir,
50
+ maxBuffer: 50 * 1024 * 1024,
51
+ stdio: ["pipe", "pipe", "pipe"],
52
+ });
53
+ }
54
+ catch {
55
+ throw new Error("Neither 'zip' nor 'tar' is available. Install one of them to publish.");
56
+ }
57
+ }
58
+ }
59
+ export async function publishCommand(options) {
60
+ // Validate mutually exclusive options
61
+ if (options.version &&
62
+ options.bump &&
63
+ options.bump !== "patch") {
64
+ console.error("Error: --version and --bump are mutually exclusive. Use one or the other.");
65
+ process.exitCode = 1;
66
+ return;
67
+ }
68
+ // Validate price
69
+ if (options.price !== undefined) {
70
+ const priceNum = parseFloat(options.price);
71
+ if (isNaN(priceNum) || priceNum < 0) {
72
+ console.error("Error: Price must be a non-negative number (e.g. '9.99' or '0').");
73
+ process.exitCode = 1;
74
+ return;
75
+ }
76
+ }
77
+ // Auth check
78
+ const token = loadAuthToken();
79
+ if (!token) {
80
+ console.error("Error: Authentication required. Run `npx @agentpowers/cli login` first.");
81
+ process.exitCode = 1;
82
+ return;
83
+ }
84
+ const dir = options.dir || ".";
85
+ // Read and parse SKILL.md
86
+ let skillContent;
87
+ try {
88
+ skillContent = readFileSync(join(dir, "SKILL.md"), "utf-8");
89
+ }
90
+ catch {
91
+ console.error(`Error: No SKILL.md found in "${dir}". Create one with name/description frontmatter.`);
92
+ process.exitCode = 1;
93
+ return;
94
+ }
95
+ let frontmatter;
96
+ try {
97
+ frontmatter = parseFrontmatter(skillContent);
98
+ }
99
+ catch (err) {
100
+ console.error(`Error: ${err.message}`);
101
+ process.exitCode = 1;
102
+ return;
103
+ }
104
+ const slug = slugify(frontmatter.name);
105
+ const category = options.category || "development";
106
+ const priceCents = options.price
107
+ ? Math.round(parseFloat(options.price) * 100)
108
+ : 0;
109
+ const bump = options.bump || "patch";
110
+ console.log(`Publishing "${frontmatter.name}" (${slug})...`);
111
+ try {
112
+ // Step 1: Create or update the skill listing
113
+ let isUpdate = false;
114
+ try {
115
+ const payload = {
116
+ name: frontmatter.name,
117
+ slug,
118
+ description: frontmatter.description,
119
+ type: frontmatter.type,
120
+ category,
121
+ price_cents: priceCents,
122
+ };
123
+ await apiPost("/v1/skills", payload, token);
124
+ console.log("Created new skill listing.");
125
+ }
126
+ catch (err) {
127
+ if (err instanceof APIError && err.statusCode === 409) {
128
+ // Already exists — switch to update flow
129
+ isUpdate = true;
130
+ }
131
+ else if (err instanceof APIError &&
132
+ err.statusCode === 400 &&
133
+ err.code === "DISPLAY_NAME_REQUIRED") {
134
+ // Need to set display name first
135
+ console.log("Setting up your author profile...");
136
+ const displayName = frontmatter.name.split("-")[0] || "Author";
137
+ await apiPatch("/v1/users/profile", { display_name: displayName }, token);
138
+ // Retry skill creation
139
+ const payload = {
140
+ name: frontmatter.name,
141
+ slug,
142
+ description: frontmatter.description,
143
+ type: frontmatter.type,
144
+ category,
145
+ price_cents: priceCents,
146
+ };
147
+ await apiPost("/v1/skills", payload, token);
148
+ console.log("Created new skill listing.");
149
+ }
150
+ else {
151
+ throw err;
152
+ }
153
+ }
154
+ // Step 2: If updating, PATCH the skill metadata and bump version
155
+ if (isUpdate) {
156
+ console.log("Skill already exists. Updating...");
157
+ const patchPayload = {
158
+ description: frontmatter.description,
159
+ category,
160
+ price_cents: priceCents,
161
+ };
162
+ await apiPatch(`/v1/skills/${encodeURIComponent(slug)}`, patchPayload, token);
163
+ // Post a new version
164
+ const versionPayload = {};
165
+ if (options.changelog)
166
+ versionPayload.changelog = options.changelog;
167
+ if (options.version) {
168
+ versionPayload.version = options.version;
169
+ }
170
+ else {
171
+ versionPayload.bump = bump;
172
+ }
173
+ await apiPost(`/v1/skills/${encodeURIComponent(slug)}/versions`, versionPayload, token);
174
+ console.log("Updated skill metadata and bumped version.");
175
+ }
176
+ // Step 3: Package and upload
177
+ console.log("Packaging...");
178
+ const zipBuffer = createZipBuffer(dir);
179
+ console.log(`Package size: ${(zipBuffer.length / 1024).toFixed(1)} KB`);
180
+ console.log("Uploading...");
181
+ await apiUpload(`/v1/skills/${encodeURIComponent(slug)}/upload`, zipBuffer, "package.zip", undefined, token);
182
+ console.log("");
183
+ console.log(`Published ${frontmatter.name} (${slug}) successfully.`);
184
+ console.log(`View: https://agentpowers.ai/skills/${encodeURIComponent(slug)}`);
185
+ console.log(`Install: npx @agentpowers/cli install ${slug}`);
186
+ console.log("");
187
+ }
188
+ catch (err) {
189
+ if (err instanceof APIError) {
190
+ if (err.statusCode === 401) {
191
+ console.error("Error: Authentication expired. Run `npx @agentpowers/cli login` to refresh.");
192
+ }
193
+ else if (err.statusCode === 403) {
194
+ console.error("Error: You are not the author of this skill. Only the original author can update it.");
195
+ }
196
+ else {
197
+ console.error(`Error: ${formatAPIError(err)}`);
198
+ }
199
+ process.exitCode = 1;
200
+ }
201
+ else if (err instanceof NetworkError) {
202
+ console.error(`Error: ${err.message}`);
203
+ process.exitCode = 1;
204
+ }
205
+ else if (err instanceof Error) {
206
+ console.error(`Error: ${err.message}`);
207
+ process.exitCode = 1;
208
+ }
209
+ else {
210
+ throw err;
211
+ }
212
+ }
213
+ }
214
+ //# sourceMappingURL=publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** Republish command — restore an archived skill to the marketplace. */
2
+ export interface RepublishOptions {
3
+ force?: boolean;
4
+ }
5
+ export declare function republishCommand(slug: string, options?: RepublishOptions): Promise<void>;
@@ -0,0 +1,106 @@
1
+ /** Republish command — restore an archived skill to the marketplace. */
2
+ import { createInterface } from "node:readline";
3
+ import { loadAuthToken } from "../auth.js";
4
+ import { apiGet, apiPost, APIError, formatAPIError, NetworkError, } from "../api-client.js";
5
+ import { validateSlug } from "../installer.js";
6
+ export async function republishCommand(slug, options = {}) {
7
+ if (!validateSlug(slug)) {
8
+ console.error(`Error: Invalid slug "${slug}". Slugs must be lowercase alphanumeric with hyphens only.`);
9
+ process.exitCode = 1;
10
+ return;
11
+ }
12
+ const token = loadAuthToken();
13
+ if (!token) {
14
+ console.error("Not logged in. Run `npx @agentpowers/cli login` first.");
15
+ process.exitCode = 1;
16
+ return;
17
+ }
18
+ // Pre-flight: fetch skill detail to show info before confirming
19
+ let detail;
20
+ try {
21
+ detail = await apiGet(`/v1/detail/${encodeURIComponent(slug)}`);
22
+ }
23
+ catch (err) {
24
+ if (err instanceof APIError && err.statusCode === 404) {
25
+ console.error(`Skill '${slug}' not found.`);
26
+ process.exitCode = 1;
27
+ return;
28
+ }
29
+ else if (err instanceof APIError) {
30
+ console.error(`Error: ${formatAPIError(err)}`);
31
+ process.exitCode = 1;
32
+ return;
33
+ }
34
+ else if (err instanceof NetworkError) {
35
+ console.error(`Error: ${err.message}`);
36
+ process.exitCode = 1;
37
+ return;
38
+ }
39
+ throw err;
40
+ }
41
+ // Display skill info
42
+ const title = detail.title || slug;
43
+ const status = detail.archived_at ? "archived" : "published";
44
+ const version = detail.version || "-";
45
+ console.log("");
46
+ console.log(` Skill: ${title}`);
47
+ console.log(` Status: ${status}`);
48
+ console.log(` Version: ${version}`);
49
+ console.log("");
50
+ // Confirm unless --force
51
+ if (!options.force) {
52
+ const confirmed = await confirm(`Are you sure you want to republish '${slug}'? (y/N)`);
53
+ if (!confirmed) {
54
+ console.log("Aborted.");
55
+ return;
56
+ }
57
+ }
58
+ try {
59
+ await apiPost(`/v1/skills/${encodeURIComponent(slug)}/republish`, {}, token);
60
+ console.log(`Successfully republished '${slug}'. It is now live on the marketplace.`);
61
+ }
62
+ catch (err) {
63
+ if (err instanceof APIError) {
64
+ switch (err.statusCode) {
65
+ case 401:
66
+ console.error("Not logged in. Run `npx @agentpowers/cli login` first.");
67
+ break;
68
+ case 403:
69
+ console.error(`You are not the owner/author of '${slug}'.`);
70
+ break;
71
+ case 404:
72
+ console.error(`Skill '${slug}' not found.`);
73
+ break;
74
+ case 409:
75
+ console.error(`Skill '${slug}' is not archived. It is already published.`);
76
+ break;
77
+ case 429:
78
+ console.error("Too many requests. Please try again in a few moments.");
79
+ break;
80
+ default:
81
+ console.error(`Error: ${formatAPIError(err)}`);
82
+ }
83
+ process.exitCode = 1;
84
+ }
85
+ else if (err instanceof NetworkError) {
86
+ console.error(`Error: ${err.message}`);
87
+ process.exitCode = 1;
88
+ }
89
+ else {
90
+ throw err;
91
+ }
92
+ }
93
+ }
94
+ function confirm(question) {
95
+ return new Promise((resolve) => {
96
+ const rl = createInterface({
97
+ input: process.stdin,
98
+ output: process.stdout,
99
+ });
100
+ rl.question(`${question} `, (answer) => {
101
+ rl.close();
102
+ resolve(answer.toLowerCase() === "y" || answer.toLowerCase() === "yes");
103
+ });
104
+ });
105
+ }
106
+ //# sourceMappingURL=republish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"republish.js","sourceRoot":"","sources":["../../src/commands/republish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /** Scan command — download an external skill and run the security scanning pipeline. */
2
+ interface ScanOptions {
3
+ source?: string;
4
+ type?: string;
5
+ }
6
+ export declare function scanCommand(slug: string, options?: ScanOptions): Promise<void>;
7
+ export {};
@@ -0,0 +1,207 @@
1
+ /** Scan command — download an external skill and run the security scanning pipeline. */
2
+ import { mkdtempSync, rmSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { tmpdir } from "node:os";
5
+ import { execSync } from "node:child_process";
6
+ import { loadAuthToken } from "../auth.js";
7
+ import { apiGet, apiUpload, APIError, formatAPIError, NetworkError, } from "../api-client.js";
8
+ import { formatSecurityStatus } from "../formatters.js";
9
+ /** Resolve the source for a slug via the search API. */
10
+ async function resolveSource(slug, token) {
11
+ const data = await apiGet("/v1/search", {
12
+ q: slug,
13
+ limit: "50",
14
+ }, token);
15
+ // Check native AgentPowers results
16
+ const native = data.agentpowers;
17
+ if (native.items.some((item) => item.slug === slug)) {
18
+ return { source: "agentpowers", isNative: true };
19
+ }
20
+ // Check external sources
21
+ const externalSources = Object.keys(data).filter((k) => k !== "agentpowers");
22
+ for (const sourceName of externalSources) {
23
+ const section = data[sourceName];
24
+ const found = section.items.find((item) => item.slug === slug);
25
+ if (found) {
26
+ return { source: found.source || sourceName, isNative: false };
27
+ }
28
+ }
29
+ throw new Error(`Skill "${slug}" not found in any source. Provide --source explicitly.`);
30
+ }
31
+ /** Create a ZIP buffer of the directory contents. */
32
+ function createZipBuffer(dir) {
33
+ try {
34
+ return execSync("zip -r - .", {
35
+ cwd: dir,
36
+ maxBuffer: 50 * 1024 * 1024,
37
+ stdio: ["pipe", "pipe", "pipe"],
38
+ });
39
+ }
40
+ catch {
41
+ try {
42
+ return execSync("tar czf - .", {
43
+ cwd: dir,
44
+ maxBuffer: 50 * 1024 * 1024,
45
+ stdio: ["pipe", "pipe", "pipe"],
46
+ });
47
+ }
48
+ catch {
49
+ throw new Error("Neither 'zip' nor 'tar' is available. Install one of them to scan.");
50
+ }
51
+ }
52
+ }
53
+ /** Format and display scan results. */
54
+ function displayResults(result) {
55
+ const status = (result.status || "UNKNOWN").toUpperCase();
56
+ console.log("");
57
+ console.log(` Security Scan: ${formatSecurityStatus(status)}`);
58
+ console.log(` ${"─".repeat(40)}`);
59
+ console.log("");
60
+ // Per-layer breakdown
61
+ if (result.layers && result.layers.length > 0) {
62
+ console.log(" Layers:");
63
+ for (const layer of result.layers) {
64
+ const layerStatus = formatSecurityStatus((layer.status || "unknown").toUpperCase());
65
+ console.log(` ${layer.name}: ${layerStatus}`);
66
+ if (layer.findings && layer.findings.length > 0) {
67
+ for (const finding of layer.findings) {
68
+ const severity = (finding.severity || "info").toUpperCase();
69
+ const location = finding.file
70
+ ? ` (${finding.file}${finding.line ? `:${finding.line}` : ""})`
71
+ : "";
72
+ console.log(` [${severity}] ${finding.message}${location}`);
73
+ }
74
+ }
75
+ }
76
+ console.log("");
77
+ }
78
+ // Top-level findings
79
+ const findings = result.findings || [];
80
+ if (findings.length > 0) {
81
+ console.log(" Findings:");
82
+ for (const finding of findings) {
83
+ const severity = (finding.severity || "info").toUpperCase();
84
+ const location = finding.file
85
+ ? ` (${finding.file}${finding.line ? `:${finding.line}` : ""})`
86
+ : "";
87
+ console.log(` [${severity}] ${finding.message}${location}`);
88
+ }
89
+ console.log("");
90
+ }
91
+ // Summary / guidance
92
+ if (result.summary) {
93
+ console.log(` ${result.summary}`);
94
+ console.log("");
95
+ }
96
+ // Actionable guidance
97
+ if (status === "PASS") {
98
+ console.log(" This skill passed all security checks.");
99
+ }
100
+ else if (status === "WARN") {
101
+ console.log(" This skill has warnings. Review the findings above before installing.");
102
+ }
103
+ else if (status === "BLOCK") {
104
+ console.log(" This skill was blocked by the security scanner. Do NOT install it.");
105
+ }
106
+ console.log("");
107
+ }
108
+ export async function scanCommand(slug, options = {}) {
109
+ if (!slug || slug.trim().length === 0) {
110
+ console.error("Error: A skill slug is required.");
111
+ process.exitCode = 1;
112
+ return;
113
+ }
114
+ const token = loadAuthToken();
115
+ const skillType = options.type || "skill";
116
+ let source = options.source || "";
117
+ let tmpDir = null;
118
+ try {
119
+ // Step 1: Resolve source if not provided
120
+ if (!source) {
121
+ console.log(`Searching for "${slug}"...`);
122
+ const resolved = await resolveSource(slug, token);
123
+ if (resolved.isNative) {
124
+ console.log(`"${slug}" is a native AgentPowers skill. Use \`npx @agentpowers/cli detail ${slug}\` to see its security status.`);
125
+ return;
126
+ }
127
+ source = resolved.source;
128
+ console.log(`Found on ${source}.`);
129
+ }
130
+ // Step 2: Download to temp directory
131
+ tmpDir = mkdtempSync(join(tmpdir(), "ap-scan-"));
132
+ console.log(`Downloading "${slug}" from ${source}...`);
133
+ try {
134
+ execSync(`npx ${source} install ${slug} --no-input --dir ${tmpDir}`, {
135
+ cwd: tmpDir,
136
+ timeout: 60_000,
137
+ stdio: ["pipe", "pipe", "pipe"],
138
+ });
139
+ }
140
+ catch (downloadErr) {
141
+ // If npx install fails, try git clone as fallback for GitHub sources
142
+ if (source.includes("github") || source.includes("/")) {
143
+ try {
144
+ execSync(`git clone --depth 1 https://github.com/${slug}.git ${tmpDir}/repo`, {
145
+ timeout: 60_000,
146
+ stdio: ["pipe", "pipe", "pipe"],
147
+ });
148
+ }
149
+ catch {
150
+ throw new Error(`Failed to download "${slug}" from "${source}". Ensure the source and slug are correct.`);
151
+ }
152
+ }
153
+ else {
154
+ throw new Error(`Failed to download "${slug}" from "${source}". Ensure the source and slug are correct.`);
155
+ }
156
+ }
157
+ // Step 3: Package into ZIP
158
+ console.log("Packaging for scan...");
159
+ const zipBuffer = createZipBuffer(tmpDir);
160
+ console.log(`Package size: ${(zipBuffer.length / 1024).toFixed(1)} KB`);
161
+ // Step 4: Upload to security scan endpoint
162
+ console.log("Scanning...");
163
+ const result = await apiUpload("/v1/security/scan-package", zipBuffer, "package.zip", {
164
+ content_hash: "",
165
+ source,
166
+ source_slug: slug,
167
+ source_version: "",
168
+ skill_type: skillType,
169
+ }, token);
170
+ // Step 5: Display results
171
+ displayResults(result);
172
+ }
173
+ catch (err) {
174
+ if (err instanceof APIError) {
175
+ if (err.statusCode === 401) {
176
+ console.error("Error: Authentication required for scanning. Run `npx @agentpowers/cli login` first.");
177
+ }
178
+ else {
179
+ console.error(`Error: ${formatAPIError(err)}`);
180
+ }
181
+ process.exitCode = 1;
182
+ }
183
+ else if (err instanceof NetworkError) {
184
+ console.error(`Error: ${err.message}`);
185
+ process.exitCode = 1;
186
+ }
187
+ else if (err instanceof Error) {
188
+ console.error(`Error: ${err.message}`);
189
+ process.exitCode = 1;
190
+ }
191
+ else {
192
+ throw err;
193
+ }
194
+ }
195
+ finally {
196
+ // Cleanup temp directory
197
+ if (tmpDir) {
198
+ try {
199
+ rmSync(tmpDir, { recursive: true, force: true });
200
+ }
201
+ catch {
202
+ // Best-effort cleanup
203
+ }
204
+ }
205
+ }
206
+ }
207
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** Unpublish command — soft-archive a skill from the marketplace. */
2
+ export interface UnpublishOptions {
3
+ force?: boolean;
4
+ }
5
+ export declare function unpublishCommand(slug: string, options?: UnpublishOptions): Promise<void>;
@@ -0,0 +1,74 @@
1
+ /** Unpublish command — soft-archive a skill from the marketplace. */
2
+ import { createInterface } from "node:readline";
3
+ import { loadAuthToken } from "../auth.js";
4
+ import { apiPost, APIError, formatAPIError, NetworkError } from "../api-client.js";
5
+ import { validateSlug } from "../installer.js";
6
+ export async function unpublishCommand(slug, options = {}) {
7
+ if (!validateSlug(slug)) {
8
+ console.error(`Error: Invalid slug "${slug}". Slugs must be lowercase alphanumeric with hyphens only.`);
9
+ process.exitCode = 1;
10
+ return;
11
+ }
12
+ // Confirm unless --force
13
+ if (!options.force) {
14
+ const confirmed = await confirm(`Are you sure you want to unpublish '${slug}'? Existing purchasers will keep access. (y/N)`);
15
+ if (!confirmed) {
16
+ console.log("Aborted.");
17
+ return;
18
+ }
19
+ }
20
+ const token = loadAuthToken();
21
+ if (!token) {
22
+ console.error("Not logged in. Run `npx @agentpowers/cli login` first.");
23
+ process.exitCode = 1;
24
+ return;
25
+ }
26
+ try {
27
+ await apiPost(`/v1/skills/${encodeURIComponent(slug)}/unpublish`, {}, token);
28
+ console.log(`Successfully unpublished '${slug}'. It is now archived.`);
29
+ }
30
+ catch (err) {
31
+ if (err instanceof APIError) {
32
+ switch (err.statusCode) {
33
+ case 401:
34
+ console.error("Not logged in. Run `npx @agentpowers/cli login` first.");
35
+ break;
36
+ case 403:
37
+ console.error(`You are not the owner/author of '${slug}'.`);
38
+ break;
39
+ case 404:
40
+ console.error(`Skill '${slug}' not found.`);
41
+ break;
42
+ case 409:
43
+ console.error(`Skill '${slug}' is already unpublished.`);
44
+ break;
45
+ case 429:
46
+ console.error("Too many requests. Please try again in a few moments.");
47
+ break;
48
+ default:
49
+ console.error(`Error: ${formatAPIError(err)}`);
50
+ }
51
+ process.exitCode = 1;
52
+ }
53
+ else if (err instanceof NetworkError) {
54
+ console.error(`Error: ${err.message}`);
55
+ process.exitCode = 1;
56
+ }
57
+ else {
58
+ throw err;
59
+ }
60
+ }
61
+ }
62
+ function confirm(question) {
63
+ return new Promise((resolve) => {
64
+ const rl = createInterface({
65
+ input: process.stdin,
66
+ output: process.stdout,
67
+ });
68
+ rl.question(`${question} `, (answer) => {
69
+ rl.close();
70
+ resolve(answer.toLowerCase() === "y" || answer.toLowerCase() === "yes");
71
+ });
72
+ });
73
+ }
74
+ //# sourceMappingURL=unpublish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unpublish.js","sourceRoot":"","sources":["../../src/commands/unpublish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ /** Verify command — check installed skills against content hash pins. */
2
+ export declare function verifyCommand(): Promise<void>;
@@ -0,0 +1,42 @@
1
+ /** Verify command — check installed skills against content hash pins. */
2
+ import { join } from "node:path";
3
+ import { loadPins, hashDirectory, isDirectory, SKILLS_DIR, } from "@agentpowers/core";
4
+ export async function verifyCommand() {
5
+ const pins = loadPins();
6
+ const slugs = Object.keys(pins);
7
+ if (slugs.length === 0) {
8
+ console.log("No installed skills to verify.");
9
+ return;
10
+ }
11
+ console.log("");
12
+ let hasFailure = false;
13
+ for (const slug of slugs.sort()) {
14
+ const pin = pins[slug];
15
+ const type = pin.type || "skill";
16
+ const source = pin.source || "unknown";
17
+ // Determine install directory
18
+ const installDir = join(SKILLS_DIR, slug);
19
+ if (!pin.content_hash) {
20
+ console.log(` SKIP ${slug} (${source}) — no content hash stored`);
21
+ continue;
22
+ }
23
+ if (!isDirectory(installDir)) {
24
+ console.log(` MISSING ${slug} (${source}) — not found on disk`);
25
+ hasFailure = true;
26
+ continue;
27
+ }
28
+ const currentHash = hashDirectory(installDir);
29
+ if (currentHash === pin.content_hash) {
30
+ console.log(` OK ${slug} (${source})`);
31
+ }
32
+ else {
33
+ console.log(` FAIL ${slug} (${source}) — hash mismatch`);
34
+ hasFailure = true;
35
+ }
36
+ }
37
+ console.log("");
38
+ if (hasFailure) {
39
+ process.exitCode = 1;
40
+ }
41
+ }
42
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +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,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC;QACjC,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,aAAa,IAAI,KAAK,MAAM,4BAA4B,CAAC,CAAC;YACtE,SAAS;QACX,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,KAAK,MAAM,uBAAuB,CAAC,CAAC;YACjE,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,aAAa,IAAI,KAAK,MAAM,GAAG,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,KAAK,MAAM,mBAAmB,CAAC,CAAC;YAC7D,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/types.d.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  /** Types — re-exported from @agentpowers/core. */
2
- export type { NativeSearchItem, ExternalSearchItem, SearchSection, SectionedSearchResponse, UnifiedDetail, DownloadResponse, AuthData, PurchaseStatus, PinEntry, PinsFile, InstalledSkillInfo, PackageType, } from "@agentpowers/core";
2
+ export type { NativeSearchItem, ExternalSearchItem, SearchSection, SectionedSearchResponse, UnifiedDetail, DownloadResponse, AuthData, PurchaseStatus, PinEntry, PinsFile, InstalledSkillInfo, PackageType, UserProfile, } from "@agentpowers/core";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentpowers/cli",
3
- "version": "0.4.0",
3
+ "version": "0.5.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",