@agentpowers/cli 0.4.1 → 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.
- package/dist/api-client.d.ts +3 -1
- package/dist/api-client.js +84 -1
- package/dist/api-client.js.map +1 -1
- package/dist/cli.js +53 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/profile.d.ts +5 -0
- package/dist/commands/profile.js +95 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/commands/publish.d.ts +11 -0
- package/dist/commands/publish.js +214 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/republish.d.ts +5 -0
- package/dist/commands/republish.js +106 -0
- package/dist/commands/republish.js.map +1 -0
- package/dist/commands/scan.d.ts +7 -0
- package/dist/commands/scan.js +207 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/unpublish.d.ts +5 -0
- package/dist/commands/unpublish.js +74 -0
- package/dist/commands/unpublish.js.map +1 -0
- package/dist/commands/verify.d.ts +2 -0
- package/dist/commands/verify.js +42 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/types.d.ts +1 -1
- package/package.json +1 -1
package/dist/api-client.d.ts
CHANGED
|
@@ -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>;
|
package/dist/api-client.js
CHANGED
|
@@ -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
|
package/dist/api-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAAA,
|
|
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":";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,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,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,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,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,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";
|