@agentscope-ai/platform-cli 1.0.5 → 1.0.7

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/README.md CHANGED
@@ -2,13 +2,6 @@
2
2
 
3
3
  AgentScope Platform 命令行工具。默认对接生产环境:`https://platform.agentscope.io`。
4
4
 
5
- | 环境 | Platform URL | 命令标识 |
6
- | --- | --- | --- |
7
- | **prod**(默认) | https://platform.agentscope.io | (无需标识) |
8
- | **pre**(预发) | https://platform-pre.agentscope.io | 命令末尾加 `pre`,或使用 `--pre` |
9
-
10
- 生产与预发凭证分开存储(`~/.asp/credentials.json` 与 `~/.asp/credentials.pre.json`),互不影响。
11
-
12
5
  ## 安装
13
6
 
14
7
  ```bash
@@ -27,7 +20,6 @@ npm install -g @agentscope-ai/platform-cli
27
20
 
28
21
  ```bash
29
22
  asp --token <token>
30
- asp --pre # 等价于命令末尾的 pre 标识
31
23
  asp --platform-url <url> # 高级:自定义 Platform 地址
32
24
  asp --verbose
33
25
  asp --json
@@ -44,11 +36,7 @@ asp --help
44
36
  | **浏览器授权**(推荐) | `asp auth login` → 选 `1` 或 `--browser` | 打开 `{platform_url}/cli/login`,OAuth PKCE 授权后回调本机 |
45
37
  | **账号密码** | `asp auth login` → 选 `2` 或 `--password` | `POST /auth/login` |
46
38
 
47
- ---
48
-
49
- ## 生产环境(默认)
50
-
51
- 命令不加 `pre`,默认对接 `https://platform.agentscope.io`。
39
+ ## 使用方式
52
40
 
53
41
  ### 鉴权
54
42
 
@@ -107,67 +95,3 @@ asp skill publish --url "https://github.com/org/repo/releases/download/v1.0.0/sk
107
95
  asp skill publish status <skill_id> --watch
108
96
  asp skill publish logs <skill_id>
109
97
  ```
110
-
111
- ---
112
-
113
- ## 预发环境
114
-
115
- 所有命令末尾加 `pre`(或使用 `--pre`),对接 `https://platform-pre.agentscope.io`。
116
-
117
- ### 鉴权
118
-
119
- ```bash
120
- asp auth login pre
121
- asp auth login --browser pre
122
- asp auth login --password pre
123
- asp auth login --password --account user@example.com --pass 'your-password' pre
124
-
125
- asp auth status pre
126
- asp auth refresh pre
127
- asp auth logout pre
128
- asp auth logs pre
129
- ```
130
-
131
- ### Plugin
132
-
133
- ```bash
134
- # 搜索 / 查看
135
- asp plugin search qwen pre
136
- asp plugin info <plugin_id> pre
137
- asp plugin versions <plugin_id> pre
138
-
139
- # 安装(通过 qwenpaw)
140
- asp plugin install <plugin_id> pre
141
-
142
- # 发布:本地 zip
143
- asp plugin publish ./my-plugin.zip pre
144
-
145
- # 发布:URL
146
- asp plugin publish --url "https://github.com/org/repo/releases/download/v1.0.0/plugin.zip" --category tool pre
147
-
148
- # 查询发布进度 / 日志
149
- asp plugin publish status plugin_id --watch pre
150
- asp plugin publish logs plugin_id pre
151
- ```
152
-
153
- ### Skill
154
-
155
- ```bash
156
- # 搜索 / 查看
157
- asp skill search web pre
158
- asp skill info <skill_id> pre
159
- asp skill versions <skill_id> pre
160
-
161
- # 安装(通过 qwenpaw)
162
- asp skill install <skill_id> pre
163
-
164
- # 发布:本地 zip
165
- asp skill publish ./my-skill.zip --category 'document office' pre
166
-
167
- # 发布:URL
168
- asp skill publish --url "https://github.com/org/repo/releases/download/v1.0.0/skill.zip" --category 'document office' pre
169
-
170
- # 查询发布进度 / 日志
171
- asp skill publish status <skill_id> --watch pre
172
- asp skill publish logs <skill_id> pre
173
- ```
package/dist/cli.js CHANGED
@@ -16,7 +16,7 @@ import {
16
16
  } from "./chunk-IHANUO75.js";
17
17
 
18
18
  // src/cli.ts
19
- import { Command } from "commander";
19
+ import { Command, Option } from "commander";
20
20
 
21
21
  // src/utils/errors.ts
22
22
  var AspError = class _AspError extends Error {
@@ -819,7 +819,7 @@ async function runLogs(getConfig2, opts) {
819
819
  }
820
820
  function registerAuthCommands(program2, getConfig2) {
821
821
  const auth = program2.command("auth").description("Authentication commands");
822
- let login = auth.command("login").description("Log in (append `pre` for pre-production, e.g. asp auth login pre)");
822
+ let login = auth.command("login").description("Log in");
823
823
  for (const [flags, desc] of LOGIN_OPTIONS) {
824
824
  login = login.option(flags, desc);
825
825
  }
@@ -1911,12 +1911,12 @@ async function runInstall2(getConfig2, skillId, opts) {
1911
1911
  code: "INVALID_REQUEST"
1912
1912
  });
1913
1913
  }
1914
- const installCmd = `qwenpaw skill install ${intent.download_url}`;
1914
+ const installCmd = `qwenpaw skills install ${intent.download_url}`;
1915
1915
  printInfo(`Run to install:
1916
1916
  ${installCmd}`);
1917
1917
  if (intent.sha512) printInfo(`sha512: ${intent.sha512}`);
1918
1918
  if (intent.expires_at) printInfo(`URL expires at: ${intent.expires_at}`);
1919
- const child = spawn3("qwenpaw", ["skill", "install", intent.download_url], {
1919
+ const child = spawn3("qwenpaw", ["skills", "install", intent.download_url], {
1920
1920
  stdio: "inherit"
1921
1921
  });
1922
1922
  await new Promise((resolve, reject) => {
@@ -2381,7 +2381,7 @@ function preprocessArgv(argv) {
2381
2381
  return { argv: args, pre };
2382
2382
  }
2383
2383
  var { argv: cliArgv, pre: trailingPre } = preprocessArgv(process.argv);
2384
- var program = new Command().name("asp").description("AgentScope Platform CLI").version(CLI_VERSION).option("--platform-url <url>", "Custom Platform base URL (advanced)").option("--pre", "Target pre-production environment (https://platform-pre.agentscope.io)").option("--token <token>", "Access token (overrides stored credentials)").option("-v, --verbose", "Verbose logging").option("--json", "Output JSON").hook("preAction", (thisCommand) => {
2384
+ var program = new Command().name("asp").description("AgentScope Platform CLI").version(CLI_VERSION).option("--platform-url <url>", "Custom Platform base URL (advanced)").addOption(new Option("--pre").hideHelp()).option("--token <token>", "Access token (overrides stored credentials)").option("-v, --verbose", "Verbose logging").option("--json", "Output JSON").hook("preAction", (thisCommand) => {
2385
2385
  const opts = thisCommand.opts();
2386
2386
  globalOpts.platformUrl = opts.platformUrl;
2387
2387
  globalOpts.pre = opts.pre || trailingPre;
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/utils/errors.ts","../src/utils/platform.ts","../src/auth/session.ts","../src/api/client.ts","../src/api/cli-api.ts","../src/auth/browser-login.ts","../src/auth/pkce.ts","../src/utils/output.ts","../src/utils/prompt.ts","../src/commands/auth.ts","../src/commands/plugin.ts","../src/utils/artifact-publish.ts","../src/utils/publish-registry.ts","../src/utils/submission-resolve.ts","../src/utils/submission-poll.ts","../src/utils/marketplace-display.ts","../src/commands/skill.ts","../src/utils/skill-manifest.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { CLI_VERSION } from \"./constants.js\";\nimport { resolveConfig, type GlobalOptions } from \"./config.js\";\nimport { registerAuthCommands } from \"./commands/auth.js\";\nimport { registerPluginCommands } from \"./commands/plugin.js\";\nimport { registerSkillCommands } from \"./commands/skill.js\";\nimport { AspError } from \"./utils/errors.js\";\nimport { printError } from \"./utils/output.js\";\n\nconst globalOpts: GlobalOptions = {};\n\nfunction preprocessArgv(argv: string[]): { argv: string[]; pre: boolean } {\n const args = [...argv];\n let pre = false;\n if (args.length >= 4 && args[args.length - 1] === \"pre\") {\n pre = true;\n args.pop();\n }\n return { argv: args, pre };\n}\n\nconst { argv: cliArgv, pre: trailingPre } = preprocessArgv(process.argv);\n\nconst program = new Command()\n .name(\"asp\")\n .description(\"AgentScope Platform CLI\")\n .version(CLI_VERSION)\n .option(\"--platform-url <url>\", \"Custom Platform base URL (advanced)\")\n .option(\"--pre\", \"Target pre-production environment (https://platform-pre.agentscope.io)\")\n .option(\"--token <token>\", \"Access token (overrides stored credentials)\")\n .option(\"-v, --verbose\", \"Verbose logging\")\n .option(\"--json\", \"Output JSON\")\n .hook(\"preAction\", (thisCommand) => {\n const opts = thisCommand.opts();\n globalOpts.platformUrl = opts.platformUrl;\n globalOpts.pre = opts.pre || trailingPre;\n globalOpts.token = opts.token;\n globalOpts.verbose = opts.verbose;\n globalOpts.json = opts.json;\n });\n\nconst getConfig = () => resolveConfig(globalOpts);\n\nregisterAuthCommands(program, getConfig);\nregisterPluginCommands(program, getConfig);\nregisterSkillCommands(program, getConfig);\n\nasync function main(): Promise<void> {\n try {\n await program.parseAsync(cliArgv);\n } catch (err) {\n if (err instanceof AspError) {\n printError(`${err.message} [${err.code}]`);\n if (err.hint) printError(`Hint: ${err.hint}`);\n if (err.requestId) printError(`Request ID: ${err.requestId}`);\n process.exit(err.exitCode);\n }\n if (err instanceof Error) {\n printError(err.message);\n if (globalOpts.verbose && err.stack) console.error(err.stack);\n process.exit(1);\n }\n throw err;\n }\n}\n\nmain();\n","export interface ApiErrorBody {\n request_id?: string;\n error: {\n code: string;\n message: string;\n hint?: string;\n };\n}\n\nexport class AspError extends Error {\n readonly code: string;\n readonly hint?: string;\n readonly requestId?: string;\n readonly statusCode?: number;\n readonly exitCode: number;\n\n constructor(\n message: string,\n options: {\n code?: string;\n hint?: string;\n requestId?: string;\n statusCode?: number;\n exitCode?: number;\n cause?: unknown;\n } = {},\n ) {\n super(message, { cause: options.cause });\n this.name = \"AspError\";\n this.code = options.code ?? \"UNKNOWN\";\n this.hint = options.hint;\n this.requestId = options.requestId;\n this.statusCode = options.statusCode;\n this.exitCode = options.exitCode ?? 1;\n }\n\n static fromResponse(status: number, body: unknown): AspError {\n const parsed = body as Partial<ApiErrorBody> & {\n error?: ApiErrorBody[\"error\"] & { detail?: string };\n };\n if (parsed?.error) {\n const exitCode = mapErrorCodeToExit(parsed.error.code, status);\n let hint = parsed.error.hint ?? parsed.error.detail;\n if (parsed.error.code === \"ASP.COMM.NOT_FOUND\") {\n hint = hint ?? \"The API endpoint is not available on this Platform environment.\";\n }\n return new AspError(parsed.error.message, {\n code: parsed.error.code,\n hint,\n requestId: parsed.request_id,\n statusCode: status,\n exitCode,\n });\n }\n return new AspError(`HTTP ${status}`, {\n code: \"HTTP_ERROR\",\n statusCode: status,\n exitCode: status >= 500 ? 2 : 1,\n });\n }\n}\n\nfunction mapErrorCodeToExit(code: string, status: number): number {\n if (\n code === \"UNAUTHORIZED\" ||\n code === \"UNAUTHENTICATED\" ||\n code === \"ASP.AUTH.UNAUTHORIZED\" ||\n code === \"ASP.AUTH.SESSION_INVALID\" ||\n code === \"SESSION_INVALID\"\n ) {\n return 3;\n }\n if (code === \"FORBIDDEN\") return 4;\n if (status >= 500) return 2;\n return 1;\n}\n\nexport function maskSecrets(text: string): string {\n return text\n .replace(/Bearer\\s+[A-Za-z0-9._-]+/gi, \"Bearer [REDACTED]\")\n .replace(/\"access_token\"\\s*:\\s*\"[^\"]+\"/gi, '\"access_token\":\"[REDACTED]\"')\n .replace(/\"refresh_token\"\\s*:\\s*\"[^\"]+\"/gi, '\"refresh_token\":\"[REDACTED]\"')\n .replace(/\"token\"\\s*:\\s*\"[^\"]+\"/gi, '\"token\":\"[REDACTED]\"');\n}\n","import { PLATFORM_URL, PRE_PLATFORM_URL } from \"../constants.js\";\nimport type { ResolvedConfig } from \"../config.js\";\nimport { loadCredentials, type StoredCredentials } from \"../auth/credentials.js\";\nimport { AspError } from \"./errors.js\";\n\nexport type PlatformEnv = \"default\" | \"pre\" | \"custom\";\n\nexport function detectPlatformEnv(url: string): PlatformEnv {\n const normalized = url.replace(/\\/$/, \"\");\n if (normalized === PLATFORM_URL) return \"default\";\n if (normalized === PRE_PLATFORM_URL) return \"pre\";\n return \"custom\";\n}\n\nexport function formatPlatformLabel(url: string): string {\n const env = detectPlatformEnv(url);\n if (env === \"default\") return `platform (${PLATFORM_URL})`;\n if (env === \"pre\") return `pre (${PRE_PLATFORM_URL})`;\n return url;\n}\n\nexport function envCommandSuffix(platformUrl: string): string {\n return detectPlatformEnv(platformUrl) === \"pre\" ? \" pre\" : \"\";\n}\n\nexport function loginCommandHint(platformUrl: string): string {\n return `Run \\`asp auth login${envCommandSuffix(platformUrl)}\\`.`;\n}\n\nexport function withPlatformUrl(config: ResolvedConfig, platformUrl: string): ResolvedConfig {\n return { ...config, platformUrl: platformUrl.replace(/\\/$/, \"\") };\n}\n\nexport async function requireCredentials(\n config: ResolvedConfig,\n targetPlatformUrl: string,\n): Promise<{ config: ResolvedConfig; creds: StoredCredentials }> {\n if (config.token) {\n return {\n config: withPlatformUrl(config, targetPlatformUrl),\n creds: {\n access_token: config.token,\n token_type: \"Bearer\",\n platform_url: targetPlatformUrl,\n },\n };\n }\n\n const creds = await loadCredentials(targetPlatformUrl);\n if (!creds?.access_token) {\n throw new AspError(\"Not logged in.\", {\n code: \"UNAUTHORIZED\",\n hint: loginCommandHint(targetPlatformUrl),\n exitCode: 3,\n });\n }\n\n const credsUrl = creds.platform_url.replace(/\\/$/, \"\");\n const targetUrl = targetPlatformUrl.replace(/\\/$/, \"\");\n if (credsUrl !== targetUrl) {\n const loggedIn = formatPlatformLabel(credsUrl);\n const target = formatPlatformLabel(targetUrl);\n throw new AspError(`Credential environment mismatch: logged in to ${loggedIn}, command targets ${target}.`, {\n code: \"ENV_MISMATCH\",\n hint: loginCommandHint(targetUrl),\n exitCode: 1,\n });\n }\n\n return {\n config: withPlatformUrl(config, targetUrl),\n creds,\n };\n}\n","import type { ResolvedConfig } from \"../config.js\";\nimport { CliApiClient, type TokenResponse } from \"../api/cli-api.js\";\nimport {\n credentialsFromTokenResponse,\n saveCredentials,\n type StoredCredentials,\n} from \"./credentials.js\";\nimport { AspError } from \"../utils/errors.js\";\nimport { loginCommandHint } from \"../utils/platform.js\";\n\nexport function isSessionInvalidError(err: unknown): boolean {\n if (!(err instanceof AspError)) return false;\n return err.code === \"ASP.AUTH.SESSION_INVALID\" || err.code === \"SESSION_INVALID\";\n}\n\nexport async function refreshStoredSession(\n config: ResolvedConfig,\n refreshToken: string,\n platformUrl: string,\n): Promise<StoredCredentials> {\n const client = new CliApiClient({\n ...config,\n token: undefined,\n platformUrl: platformUrl.replace(/\\/$/, \"\"),\n });\n const refreshed = await client.refresh(refreshToken);\n const creds = credentialsFromTokenResponse(platformUrl, refreshed);\n await saveCredentials(creds);\n return creds;\n}\n\n/** Login 返回的 access_token 需先 refresh 才能访问 /me */\nexport async function finalizeLogin(\n config: ResolvedConfig,\n loginResponse: TokenResponse,\n): Promise<StoredCredentials> {\n if (!loginResponse.refresh_token) {\n const creds = credentialsFromTokenResponse(config.platformUrl, loginResponse);\n await saveCredentials(creds);\n return creds;\n }\n\n try {\n return await refreshStoredSession(\n config,\n loginResponse.refresh_token,\n config.platformUrl,\n );\n } catch {\n const creds = credentialsFromTokenResponse(config.platformUrl, loginResponse);\n await saveCredentials(creds);\n return creds;\n }\n}\n\nexport async function ensureValidSession(config: ResolvedConfig): Promise<StoredCredentials> {\n const { loadCredentials, isTokenExpired } = await import(\"./credentials.js\");\n const creds = await loadCredentials(config.platformUrl);\n if (!creds) {\n throw new AspError(\"Not logged in.\", {\n code: \"UNAUTHORIZED\",\n hint: loginCommandHint(config.platformUrl),\n exitCode: 3,\n });\n }\n\n if (!isTokenExpired(creds) && creds.access_token) {\n return creds;\n }\n\n if (!creds.refresh_token) {\n throw new AspError(\"Session expired.\", {\n code: \"ASP.AUTH.SESSION_INVALID\",\n hint: loginCommandHint(config.platformUrl),\n exitCode: 3,\n });\n }\n\n return refreshStoredSession(config, creds.refresh_token, creds.platform_url);\n}\n","import { AspError, maskSecrets } from \"../utils/errors.js\";\nimport type { ResolvedConfig } from \"../config.js\";\nimport {\n loadCredentials,\n isTokenExpired,\n type StoredCredentials,\n} from \"../auth/credentials.js\";\nimport { refreshStoredSession, isSessionInvalidError } from \"../auth/session.js\";\n\nexport interface RequestOptions {\n method?: string;\n path: string;\n body?: unknown;\n headers?: Record<string, string>;\n auth?: boolean;\n prefix?: string;\n _retried?: boolean;\n}\n\nexport class HttpClient {\n constructor(private readonly config: ResolvedConfig) {}\n\n async request<T>(opts: RequestOptions): Promise<T> {\n try {\n return await this.doRequest<T>(opts);\n } catch (err) {\n if (\n opts.auth !== false &&\n !opts._retried &&\n isSessionInvalidError(err) &&\n !this.config.token\n ) {\n const creds = await loadCredentials(this.config.platformUrl);\n if (creds?.refresh_token) {\n await refreshStoredSession(configWithPlatform(this.config, creds), creds.refresh_token, creds.platform_url);\n return this.doRequest<T>({ ...opts, _retried: true });\n }\n }\n throw err;\n }\n }\n\n private async doRequest<T>(opts: RequestOptions): Promise<T> {\n const creds = opts.auth !== false && !this.config.token\n ? await loadCredentials(this.config.platformUrl)\n : null;\n const platformUrl = creds?.platform_url ?? this.config.platformUrl;\n const prefix = opts.prefix ?? \"\";\n const url = `${platformUrl}${prefix}${opts.path}`;\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n ...opts.headers,\n };\n\n if (opts.body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n\n if (opts.auth !== false) {\n const token = await this.resolveAccessToken(creds);\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n }\n\n if (this.config.verbose) {\n console.error(`[verbose] ${opts.method ?? \"GET\"} ${url}`);\n if (opts.body) console.error(maskSecrets(JSON.stringify(opts.body)));\n }\n\n const res = await fetch(url, {\n method: opts.method ?? \"GET\",\n headers,\n body: opts.body !== undefined ? JSON.stringify(opts.body) : undefined,\n });\n\n const text = await res.text();\n let data: unknown = {};\n if (text) {\n try {\n data = JSON.parse(text);\n } catch {\n data = { raw: text };\n }\n }\n\n if (this.config.verbose) {\n console.error(`[verbose] ${res.status}`, maskSecrets(text.slice(0, 2000)));\n }\n\n if (!res.ok) {\n throw AspError.fromResponse(res.status, data);\n }\n\n return data as T;\n }\n\n async resolveAccessToken(existing?: StoredCredentials | null): Promise<string | undefined> {\n if (this.config.token) return this.config.token;\n\n const creds = existing ?? (await loadCredentials(this.config.platformUrl));\n if (!creds) return undefined;\n\n if (isTokenExpired(creds) && creds.refresh_token) {\n const refreshed = await refreshStoredSession(\n configWithPlatform(this.config, creds),\n creds.refresh_token,\n creds.platform_url,\n );\n return refreshed.access_token;\n }\n\n return creds.access_token;\n }\n}\n\nfunction configWithPlatform(config: ResolvedConfig, creds: StoredCredentials): ResolvedConfig {\n return { ...config, platformUrl: creds.platform_url || config.platformUrl };\n}\n","import { CLI_API_PREFIX } from \"../constants.js\";\nimport type { ResolvedConfig } from \"../config.js\";\nimport { HttpClient } from \"./client.js\";\n\nexport interface MetaResponse {\n request_id: string;\n service: string;\n api_version: string;\n platform_url: string;\n environment: string;\n min_cli_version: string;\n recommended_cli_version: string;\n features: Record<string, boolean>;\n}\n\nexport interface MeResponse {\n request_id: string;\n user_id?: string;\n account?: string;\n email?: string;\n username?: string;\n is_admin?: boolean;\n user?: {\n id: string;\n display_name?: string;\n email?: string;\n };\n scopes?: string[];\n}\n\nexport interface TokenResponse {\n request_id: string;\n access_token: string;\n refresh_token?: string;\n token_type: string;\n expires_in?: number;\n scope?: string;\n user?: {\n id: string;\n display_name?: string;\n email?: string;\n };\n}\n\n\nexport interface RequestLogItem {\n request_id?: string;\n method: string;\n path: string;\n request_body?: unknown;\n response_status?: number;\n duration_ms?: number;\n created_at: string;\n}\n\nexport interface RequestLogsResponse {\n request_id: string;\n items: RequestLogItem[];\n next_cursor?: string | null;\n}\n\nexport interface PluginListItem {\n plugin_id: string;\n name?: string;\n description?: string;\n summary?: string;\n source?: \"official\" | \"verified\" | \"community\";\n tech_type?: string;\n category?: string;\n author_display_name?: string;\n latest_version?: string;\n downloads?: number;\n public_url?: string;\n updated_at?: string;\n [key: string]: unknown;\n}\n\nexport interface PluginListResponse {\n request_id: string;\n items: PluginListItem[];\n next_cursor?: string | null;\n}\n\nexport interface PluginVersionItem {\n version: string;\n published_at?: string;\n deprecated?: boolean;\n [key: string]: unknown;\n}\n\nexport interface PluginVersionsResponse {\n request_id: string;\n plugin_id: string;\n items: PluginVersionItem[];\n}\n\nexport interface PluginInfoResponse {\n request_id: string;\n plugin_id: string;\n install_command?: string;\n public_url?: string;\n latest_version?: string;\n scan_status?: string;\n min_qwenpaw_version?: string;\n [key: string]: unknown;\n}\n\nexport interface SkillListItem {\n skill_id: string;\n skill_code?: string;\n name?: string;\n description?: string;\n summary?: string;\n category?: string;\n category_label?: string;\n source?: \"official\" | \"verified\" | \"community\";\n author_display_name?: string;\n latest_version?: string;\n downloads?: number;\n public_url?: string;\n updated_at?: string;\n [key: string]: unknown;\n}\n\nexport interface SkillListResponse {\n request_id: string;\n items: SkillListItem[];\n next_cursor?: string | null;\n}\n\nexport interface SkillVersionItem {\n version: string;\n published_at?: string;\n deprecated?: boolean;\n [key: string]: unknown;\n}\n\nexport interface SkillVersionsResponse {\n request_id: string;\n skill_id: string;\n items: SkillVersionItem[];\n}\n\nexport interface SkillInfoResponse {\n request_id: string;\n skill_id: string;\n install_command?: string;\n public_url?: string;\n latest_version?: string;\n scan_status?: string;\n [key: string]: unknown;\n}\n\nexport interface InstallIntentResponse {\n request_id: string;\n download_url: string;\n sha512?: string;\n expires_at?: string;\n signature?: string | null;\n scan_status?: string;\n version?: string;\n}\n\nexport interface CliSubmissionUpload {\n method?: string;\n url: string;\n headers?: Record<string, string>;\n expires_at?: string;\n}\n\nexport interface CliSubmissionScan {\n status?: \"queued\" | \"running\" | \"passed\" | \"failed\";\n summary?: string;\n [key: string]: unknown;\n}\n\nexport interface CliSubmissionPublish {\n status?: string;\n public_url?: string;\n [key: string]: unknown;\n}\n\nexport interface CliSubmissionFailure {\n code?: string;\n message?: string;\n}\n\nexport interface CliSubmissionResponse {\n request_id: string;\n submission_id: string;\n status:\n | \"upload_url_issued\"\n | \"queued_for_scan\"\n | \"scanning\"\n | \"published\"\n | \"scan_failed\"\n | \"upload_failed\"\n | \"expired\";\n terminal: boolean;\n upload?: CliSubmissionUpload | null;\n scan?: CliSubmissionScan | null;\n publish?: CliSubmissionPublish | null;\n failure?: CliSubmissionFailure | null;\n links?: { status?: string; logs?: string };\n next_poll_after_seconds?: number;\n}\n\nexport interface CliSubmissionLogItem {\n level: \"info\" | \"error\" | string;\n message: string;\n timestamp: string;\n}\n\nexport interface CliSubmissionLogsResponse {\n request_id: string;\n submission_id: string;\n items: CliSubmissionLogItem[];\n}\n\nexport class CliApiClient {\n private readonly http: HttpClient;\n\n constructor(config: ResolvedConfig) {\n this.http = new HttpClient(config);\n }\n\n private req<T>(opts: Parameters<HttpClient[\"request\"]>[0]): Promise<T> {\n return this.http.request<T>({ ...opts, prefix: CLI_API_PREFIX });\n }\n\n getMeta(): Promise<MetaResponse> {\n return this.req({ path: \"/meta\", auth: false });\n }\n\n getMe(): Promise<MeResponse> {\n return this.req({ path: \"/me\" });\n }\n\n login(account: string, password: string): Promise<TokenResponse> {\n return this.req({\n method: \"POST\",\n path: \"/auth/login\",\n auth: false,\n body: { account, password },\n });\n }\n\n refresh(refreshToken: string): Promise<TokenResponse> {\n return this.req({\n method: \"POST\",\n path: \"/auth/refresh\",\n auth: false,\n body: { refresh_token: refreshToken },\n });\n }\n\n oauthToken(body: Record<string, string>): Promise<TokenResponse> {\n return this.req({ method: \"POST\", path: \"/oauth/token\", auth: false, body });\n }\n\n oauthRevoke(token: string, tokenTypeHint = \"refresh_token\"): Promise<{ ok: boolean }> {\n return this.req<{ ok: boolean }>({\n method: \"POST\",\n path: \"/oauth/revoke\",\n body: { token, token_type_hint: tokenTypeHint },\n });\n }\n\n async logout(): Promise<{ ok: boolean }> {\n try {\n return await this.req<{ ok: boolean }>({ method: \"POST\", path: \"/auth/logout\" });\n } catch {\n return this.oauthRevoke(\"\", \"access_token\");\n }\n }\n\n getRequestLogs(params?: {\n page_size?: number;\n cursor?: string;\n }): Promise<RequestLogsResponse> {\n const query = new URLSearchParams();\n if (params?.page_size !== undefined) query.set(\"page_size\", String(params.page_size));\n if (params?.cursor) query.set(\"cursor\", params.cursor);\n const suffix = query.toString();\n return this.req({ path: `/request-logs${suffix ? `?${suffix}` : \"\"}` });\n }\n\n searchPlugins(params?: {\n q?: string;\n category?: string;\n source?: \"official\" | \"verified\" | \"community\";\n sort?: \"recommended\" | \"downloads\" | \"updated_at\";\n page_size?: number;\n cursor?: string;\n }): Promise<PluginListResponse> {\n const query = new URLSearchParams();\n if (params?.q) query.set(\"q\", params.q);\n if (params?.category) query.set(\"category\", params.category);\n if (params?.source) query.set(\"source\", params.source);\n if (params?.sort) query.set(\"sort\", params.sort);\n if (params?.page_size !== undefined) query.set(\"page_size\", String(params.page_size));\n if (params?.cursor) query.set(\"cursor\", params.cursor);\n const suffix = query.toString();\n return this.req({ path: `/plugins${suffix ? `?${suffix}` : \"\"}`, auth: false });\n }\n\n getPluginInfo(pluginId: string, version?: string): Promise<PluginInfoResponse> {\n const query = new URLSearchParams();\n if (version) query.set(\"version\", version);\n const suffix = query.toString();\n return this.req({\n path: `/plugins/${encodeURIComponent(pluginId)}${suffix ? `?${suffix}` : \"\"}`,\n auth: false,\n });\n }\n\n getPluginVersions(pluginId: string): Promise<PluginVersionsResponse> {\n return this.req({\n path: `/plugins/${encodeURIComponent(pluginId)}/versions`,\n auth: false,\n });\n }\n\n createInstallIntent(pluginId: string, version?: string): Promise<InstallIntentResponse> {\n return this.req({\n method: \"POST\",\n path: `/plugins/${encodeURIComponent(pluginId)}/install-intent`,\n body: version ? { version } : {},\n });\n }\n\n searchSkills(params?: {\n q?: string;\n category?: string;\n source?: \"official\" | \"verified\" | \"community\";\n tag?: string;\n sort?: \"recommended\" | \"downloads\" | \"updated_at\";\n page_size?: number;\n cursor?: string;\n }): Promise<SkillListResponse> {\n const query = new URLSearchParams();\n if (params?.q) query.set(\"q\", params.q);\n if (params?.category) query.set(\"category\", params.category);\n if (params?.source) query.set(\"source\", params.source);\n if (params?.tag) query.set(\"tag\", params.tag);\n if (params?.sort) query.set(\"sort\", params.sort);\n if (params?.page_size !== undefined) query.set(\"page_size\", String(params.page_size));\n if (params?.cursor) query.set(\"cursor\", params.cursor);\n const suffix = query.toString();\n return this.req({ path: `/skills${suffix ? `?${suffix}` : \"\"}`, auth: false });\n }\n\n getSkillInfo(skillId: string, version?: string): Promise<SkillInfoResponse> {\n const query = new URLSearchParams();\n if (version) query.set(\"version\", version);\n const suffix = query.toString();\n return this.req({\n path: `/skills/${encodeURIComponent(skillId)}${suffix ? `?${suffix}` : \"\"}`,\n auth: false,\n });\n }\n\n getSkillVersions(skillId: string): Promise<SkillVersionsResponse> {\n return this.req({\n path: `/skills/${encodeURIComponent(skillId)}/versions`,\n auth: false,\n });\n }\n\n createSkillInstallIntent(skillId: string, version?: string): Promise<InstallIntentResponse> {\n return this.req({\n method: \"POST\",\n path: `/skills/${encodeURIComponent(skillId)}/install-intent`,\n body: version ? { version } : {},\n });\n }\n\n createArtifactSubmission(body: Record<string, unknown>): Promise<CliSubmissionResponse> {\n return this.req({\n method: \"POST\",\n path: \"/artifact-submissions\",\n body,\n });\n }\n\n completeArtifactSubmission(\n submissionId: string,\n body: { sha512: string; size_bytes: number },\n ): Promise<CliSubmissionResponse> {\n return this.req({\n method: \"POST\",\n path: `/artifact-submissions/${encodeURIComponent(submissionId)}/complete`,\n body,\n });\n }\n\n getArtifactSubmission(submissionId: string): Promise<CliSubmissionResponse> {\n return this.req({\n path: `/artifact-submissions/${encodeURIComponent(submissionId)}`,\n });\n }\n\n getArtifactSubmissionLogs(submissionId: string): Promise<CliSubmissionLogsResponse> {\n return this.req({\n path: `/artifact-submissions/${encodeURIComponent(submissionId)}/logs`,\n });\n }\n}\n","import { createServer, type IncomingMessage, type Server, type ServerResponse } from \"node:http\";\nimport open from \"open\";\nimport { CLIENT_ID, DEFAULT_SCOPE } from \"../constants.js\";\nimport type { ResolvedConfig } from \"../config.js\";\nimport { generatePkce } from \"./pkce.js\";\nimport { finalizeLogin } from \"./session.js\";\nimport { CliApiClient } from \"../api/cli-api.js\";\nimport { formatPlatformLabel } from \"../utils/platform.js\";\nimport { printInfo, printSuccess } from \"../utils/output.js\";\n\nconst LOGIN_TIMEOUT_MS = 300_000;\n\nexport async function browserPkceLogin(config: ResolvedConfig): Promise<void> {\n const pkce = generatePkce();\n const port = await pickPort();\n const redirectUri = `http://127.0.0.1:${port}/callback/${pkce.nonce}`;\n const loginUrl = new URL(`${config.platformUrl}/cli/login`);\n loginUrl.searchParams.set(\"client_id\", CLIENT_ID);\n loginUrl.searchParams.set(\"redirect_uri\", redirectUri);\n loginUrl.searchParams.set(\"response_type\", \"code\");\n loginUrl.searchParams.set(\"code_challenge\", pkce.codeChallenge);\n loginUrl.searchParams.set(\"code_challenge_method\", \"S256\");\n loginUrl.searchParams.set(\"state\", pkce.state);\n loginUrl.searchParams.set(\"scope\", DEFAULT_SCOPE);\n\n const code = await waitForCallback(port, pkce.nonce, pkce.state, loginUrl.toString());\n const client = new CliApiClient(config);\n const token = await client.oauthToken({\n grant_type: \"authorization_code\",\n client_id: CLIENT_ID,\n code,\n code_verifier: pkce.codeVerifier,\n redirect_uri: redirectUri,\n });\n\n await finalizeLogin(config, token);\n const display = token.user?.email ?? token.user?.display_name ?? \"user\";\n printSuccess(`Logged in as ${display} (${formatPlatformLabel(config.platformUrl)})`);\n}\n\nasync function pickPort(): Promise<number> {\n return new Promise((resolve, reject) => {\n const server = createServer();\n server.listen(0, \"127.0.0.1\", () => {\n const addr = server.address();\n if (!addr || typeof addr === \"string\") {\n server.close();\n reject(new Error(\"Failed to bind callback port\"));\n return;\n }\n const port = addr.port;\n server.close(() => resolve(port));\n });\n server.on(\"error\", reject);\n });\n}\n\nfunction waitForCallback(\n port: number,\n nonce: string,\n expectedState: string,\n loginUrl: string,\n): Promise<string> {\n return new Promise((resolve, reject) => {\n let settled = false;\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let server: Server;\n\n const stopServer = () => {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n server.closeAllConnections?.();\n server.close();\n };\n\n const finish = (handler: () => void) => {\n if (settled) return;\n settled = true;\n stopServer();\n handler();\n };\n\n server = createServer(async (req: IncomingMessage, res: ServerResponse) => {\n try {\n const url = new URL(req.url ?? \"/\", `http://127.0.0.1:${port}`);\n if (url.pathname !== `/callback/${nonce}`) {\n res.writeHead(404);\n res.end(\"Not found\");\n return;\n }\n const code = url.searchParams.get(\"code\");\n const state = url.searchParams.get(\"state\");\n if (!code || state !== expectedState) {\n res.writeHead(400);\n res.end(\"Invalid callback\");\n finish(() =>\n reject(new Error(\"Invalid OAuth callback: state mismatch or missing code\")),\n );\n return;\n }\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(\"<html><body><h2>Login successful. You can close this window.</h2></body></html>\");\n finish(() => resolve(code));\n } catch (err) {\n finish(() => reject(err));\n }\n });\n\n server.listen(port, \"127.0.0.1\", () => {\n printInfo(\"Opening browser to authorize AgentScope Platform CLI...\");\n printInfo(`If the browser does not open, visit:\\n ${loginUrl}`);\n printInfo(\"Waiting for authorization...\");\n void open(loginUrl).catch(() => {});\n });\n\n timeoutId = setTimeout(() => {\n finish(() => reject(new Error(\"Login timed out\")));\n }, LOGIN_TIMEOUT_MS);\n });\n}\n","import { randomBytes, createHash } from \"node:crypto\";\n\nexport interface PkcePair {\n codeVerifier: string;\n codeChallenge: string;\n state: string;\n nonce: string;\n}\n\nfunction base64Url(buf: Buffer): string {\n return buf.toString(\"base64url\");\n}\n\nexport function generatePkce(): PkcePair {\n const codeVerifier = base64Url(randomBytes(32));\n const codeChallenge = base64Url(createHash(\"sha256\").update(codeVerifier).digest());\n const state = `state_${base64Url(randomBytes(16))}`;\n const nonce = `nonce_${base64Url(randomBytes(16))}`;\n return { codeVerifier, codeChallenge, state, nonce };\n}\n","import chalk from \"chalk\";\n\nexport function printJson(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n}\n\nexport function printSuccess(message: string): void {\n console.log(chalk.green(\"✓\"), message);\n}\n\nexport function printInfo(message: string): void {\n console.log(chalk.blue(\"ℹ\"), message);\n}\n\nexport function printWarn(message: string): void {\n console.log(chalk.yellow(\"⚠\"), message);\n}\n\nexport function printError(message: string): void {\n console.error(chalk.red(\"✗\"), message);\n}\n\nexport function printTable(headers: string[], rows: string[][]): void {\n const widths = headers.map((h, i) =>\n Math.max(h.length, ...rows.map((r) => (r[i] ?? \"\").length)),\n );\n const headerLine = headers.map((h, i) => h.padEnd(widths[i])).join(\" \");\n console.log(chalk.bold(headerLine));\n for (const row of rows) {\n console.log(row.map((c, i) => (c ?? \"\").padEnd(widths[i])).join(\" \"));\n }\n}\n\nexport function formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nexport function formatDateTime(iso: string): string {\n const date = new Date(iso);\n if (Number.isNaN(date.getTime())) return iso;\n\n const pad = (n: number) => String(n).padStart(2, \"0\");\n return [\n date.getFullYear(),\n pad(date.getMonth() + 1),\n pad(date.getDate()),\n ].join(\"-\") + \" \" + [pad(date.getHours()), pad(date.getMinutes()), pad(date.getSeconds())].join(\":\");\n}\n","import { createInterface } from \"node:readline/promises\";\nimport { stdin as input, stdout as output } from \"node:process\";\n\nexport async function promptLine(message: string): Promise<string> {\n const rl = createInterface({ input, output });\n try {\n const value = (await rl.question(message)).trim();\n if (!value) {\n throw new Error(\"Input is required.\");\n }\n return value;\n } finally {\n rl.close();\n }\n}\n\nexport async function promptPassword(message = \"Password: \"): Promise<string> {\n return new Promise((resolve, reject) => {\n const stdin = process.stdin;\n const wasRaw = stdin.isRaw;\n const wasPaused = stdin.isPaused();\n\n if (!stdin.isTTY) {\n reject(new Error(\"Password prompt requires an interactive terminal.\"));\n return;\n }\n\n output.write(message);\n\n stdin.setRawMode(true);\n stdin.resume();\n stdin.setEncoding(\"utf8\");\n\n let password = \"\";\n\n const cleanup = (): void => {\n stdin.removeListener(\"data\", onData);\n stdin.setRawMode(wasRaw ?? false);\n if (wasPaused) stdin.pause();\n else stdin.resume();\n };\n\n const onData = (char: string): void => {\n switch (char) {\n case \"\\n\":\n case \"\\r\":\n case \"\\u0004\":\n cleanup();\n output.write(\"\\n\");\n if (!password) {\n reject(new Error(\"Password is required.\"));\n return;\n }\n resolve(password);\n break;\n case \"\\u0003\":\n cleanup();\n output.write(\"\\n\");\n reject(new Error(\"Login cancelled.\"));\n break;\n case \"\\u007f\":\n case \"\\b\":\n if (password.length > 0) {\n password = password.slice(0, -1);\n output.write(\"\\b \\b\");\n }\n break;\n default:\n if (char < \" \" && char !== \"\\t\") return;\n password += char;\n output.write(\"*\");\n break;\n }\n };\n\n stdin.on(\"data\", onData);\n });\n}\n\nexport async function promptCredentials(options: {\n account?: string;\n password?: string;\n}): Promise<{ account: string; password: string }> {\n const account = options.account ?? (await promptLine(\"Email: \"));\n const password = options.password ?? (await promptPassword());\n return { account, password };\n}\n\nexport async function promptLoginMethod(): Promise<\"browser\" | \"password\"> {\n printLoginMethodMenu();\n const rl = createInterface({ input, output });\n try {\n const answer = (await rl.question(\"Enter choice [1]: \")).trim();\n if (!answer || answer === \"1\") return \"browser\";\n if (answer === \"2\") return \"password\";\n throw new Error(\"Invalid choice. Enter 1 or 2.\");\n } finally {\n rl.close();\n }\n}\n\nfunction printLoginMethodMenu(): void {\n console.log(\"How would you like to log in?\");\n console.log(\" 1. Browser authorization (recommended)\");\n console.log(\" 2. Email and password\");\n}\n","import type { Command } from \"commander\";\nimport type { ResolvedConfig } from \"../config.js\";\nimport { CliApiClient } from \"../api/cli-api.js\";\nimport { browserPkceLogin } from \"../auth/browser-login.js\";\nimport {\n credentialsFromTokenResponse,\n loadCredentials,\n saveCredentials,\n clearCredentials,\n} from \"../auth/credentials.js\";\nimport { finalizeLogin, refreshStoredSession } from \"../auth/session.js\";\nimport { AspError } from \"../utils/errors.js\";\nimport { printJson, printSuccess, printInfo, formatDateTime, printTable } from \"../utils/output.js\";\nimport { promptCredentials, promptLoginMethod } from \"../utils/prompt.js\";\nimport {\n envCommandSuffix,\n formatPlatformLabel,\n loginCommandHint,\n requireCredentials,\n} from \"../utils/platform.js\";\n\ninterface LoginOptions {\n browser?: boolean;\n password?: boolean;\n token?: string;\n account?: string;\n pass?: string;\n}\n\nconst LOGIN_OPTIONS: Array<[string, string]> = [\n [\"--browser\", \"Login via browser authorization (opens /cli/login, PKCE)\"],\n [\"--password\", \"Login with email and password\"],\n [\"--token <token>\", \"Save and validate an existing access token\"],\n [\"--account <email>\", \"Account email (non-interactive, use with --pass)\"],\n [\"--pass <password>\", \"Account password (non-interactive, use with --account)\"],\n];\n\nfunction wantsPasswordLogin(opts: LoginOptions): boolean {\n return !!(opts.password || opts.account || opts.pass);\n}\n\nasync function ensureBrowserLoginEnabled(config: ResolvedConfig): Promise<void> {\n const meta = await new CliApiClient(config).getMeta().catch(() => null);\n if (meta?.features?.browser_pkce_login === false) {\n const suffix = envCommandSuffix(config.platformUrl);\n throw new AspError(\"Browser authorization login is not enabled on this platform.\", {\n code: \"FEATURE_DISABLED\",\n hint: `Use \\`asp auth login --password${suffix}\\` instead.`,\n });\n }\n}\n\nasync function runPasswordLogin(\n config: ResolvedConfig,\n opts: Pick<LoginOptions, \"account\" | \"pass\">,\n): Promise<void> {\n const { account, password } = await promptCredentials({\n account: opts.account,\n password: opts.pass,\n });\n\n const loginResponse = await new CliApiClient(config).login(account, password);\n await finalizeLogin(config, loginResponse);\n\n const me = await new CliApiClient(config).getMe();\n const display = me.user?.email ?? me.email ?? me.user?.display_name ?? me.account ?? account;\n printSuccess(`Logged in as ${display} (${formatPlatformLabel(config.platformUrl)})`);\n}\n\nasync function runBrowserLogin(config: ResolvedConfig): Promise<void> {\n await ensureBrowserLoginEnabled(config);\n await browserPkceLogin(config);\n}\n\nasync function runLogin(config: ResolvedConfig, opts: LoginOptions): Promise<void> {\n if (opts.token) {\n await saveTokenLogin(config, opts.token);\n return;\n }\n\n if (opts.browser && wantsPasswordLogin(opts)) {\n throw new AspError(\"Cannot use --browser together with --password, --account, or --pass.\", {\n code: \"INVALID_REQUEST\",\n hint: \"Choose one login method.\",\n });\n }\n\n if (opts.browser) {\n await runBrowserLogin(config);\n return;\n }\n\n if (wantsPasswordLogin(opts)) {\n await runPasswordLogin(config, opts);\n return;\n }\n\n if (!process.stdin.isTTY) {\n const suffix = envCommandSuffix(config.platformUrl);\n throw new AspError(\"Non-interactive login requires a login method flag.\", {\n code: \"INVALID_REQUEST\",\n hint:\n `Use \\`asp auth login --browser${suffix}\\` or ` +\n `\\`asp auth login --password --account <email> --pass <password>${suffix}\\`.`,\n });\n }\n\n const method = await promptLoginMethod();\n if (method === \"browser\") {\n await runBrowserLogin(config);\n return;\n }\n\n await runPasswordLogin(config, opts);\n}\n\nasync function saveTokenLogin(config: ResolvedConfig, token: string): Promise<void> {\n const creds = credentialsFromTokenResponse(config.platformUrl, {\n access_token: token,\n token_type: \"Bearer\",\n });\n await saveCredentials(creds);\n const me = await new CliApiClient({ ...config, token }).getMe();\n const display =\n me.user?.email ?? me.email ?? me.user?.display_name ?? me.account ?? me.user_id;\n printSuccess(`Token saved. Logged in as ${display} (${formatPlatformLabel(config.platformUrl)})`);\n}\n\nasync function runStatus(getConfig: () => ResolvedConfig): Promise<void> {\n const base = getConfig();\n const creds = await loadCredentials(base.platformUrl);\n\n if (!base.token && !creds) {\n printInfo(\"Not logged in.\");\n printInfo(loginCommandHint(base.platformUrl));\n return;\n }\n\n const { config: apiConfig } = await requireCredentials(base, base.platformUrl);\n const client = new CliApiClient(apiConfig);\n const me = await client.getMe();\n const latestCreds = (await loadCredentials(base.platformUrl)) ?? creds;\n\n if (base.json) {\n printJson({\n logged_in: true,\n environment: formatPlatformLabel(apiConfig.platformUrl),\n user: me.user ?? {\n id: me.user_id,\n email: me.email,\n display_name: me.username ?? me.account,\n },\n scopes: me.scopes,\n expires_at: latestCreds?.expires_at,\n platform_url: apiConfig.platformUrl,\n });\n return;\n }\n\n const user = me.user ?? {\n id: me.user_id ?? \"\",\n email: me.email,\n display_name: me.username ?? me.account,\n };\n printInfo(`Environment: ${formatPlatformLabel(apiConfig.platformUrl)}`);\n printInfo(`User: ${user.display_name ?? user.email ?? user.id}`);\n if (user.email) printInfo(`Email: ${user.email}`);\n if (me.scopes?.length) printInfo(`Scopes: ${me.scopes.join(\", \")}`);\n if (latestCreds?.expires_at) {\n printInfo(`Token expires: ${formatDateTime(latestCreds.expires_at)}`);\n }\n}\n\nasync function runRefresh(getConfig: () => ResolvedConfig): Promise<void> {\n const base = getConfig();\n const { config, creds } = await requireCredentials(base, base.platformUrl);\n\n if (!creds.refresh_token) {\n throw new AspError(\"No refresh token available.\", {\n code: \"UNAUTHORIZED\",\n hint: loginCommandHint(config.platformUrl),\n exitCode: 3,\n });\n }\n\n await refreshStoredSession(config, creds.refresh_token, config.platformUrl);\n printSuccess(`Token refreshed (${formatPlatformLabel(config.platformUrl)}).`);\n}\n\nasync function runLogout(getConfig: () => ResolvedConfig): Promise<void> {\n const base = getConfig();\n const platformUrl = base.platformUrl;\n const creds = await loadCredentials(platformUrl);\n\n if (!creds) {\n printInfo(`Not logged in to ${formatPlatformLabel(platformUrl)}.`);\n return;\n }\n\n if (creds.refresh_token) {\n const client = new CliApiClient({ ...base, platformUrl: creds.platform_url });\n await client.logout().catch(() => {});\n }\n await clearCredentials(creds.platform_url);\n printSuccess(`Logged out from ${formatPlatformLabel(creds.platform_url)}.`);\n}\n\nasync function runLogs(\n getConfig: () => ResolvedConfig,\n opts: { pageSize?: number; cursor?: string },\n): Promise<void> {\n const base = getConfig();\n const { config } = await requireCredentials(base, base.platformUrl);\n const response = await new CliApiClient(config).getRequestLogs({\n page_size: opts.pageSize,\n cursor: opts.cursor,\n });\n\n if (base.json) {\n printJson(response);\n return;\n }\n\n if (response.items.length === 0) {\n printInfo(\"No request logs.\");\n return;\n }\n\n const rows = response.items.map((item) => [\n item.created_at,\n item.method,\n item.path,\n String(item.response_status ?? \"-\"),\n String(item.duration_ms ?? \"-\"),\n ]);\n printTable([\"time\", \"method\", \"path\", \"status\", \"ms\"], rows);\n if (response.next_cursor) {\n printInfo(`Next cursor: ${response.next_cursor}`);\n }\n}\n\nexport function registerAuthCommands(program: Command, getConfig: () => ResolvedConfig): void {\n const auth = program.command(\"auth\").description(\"Authentication commands\");\n\n let login = auth\n .command(\"login\")\n .description(\"Log in (append `pre` for pre-production, e.g. asp auth login pre)\");\n for (const [flags, desc] of LOGIN_OPTIONS) {\n login = login.option(flags, desc);\n }\n login.action(async (opts: LoginOptions) => {\n await runLogin(getConfig(), opts);\n });\n\n auth.command(\"status\").description(\"Show login status\").action(async () => {\n await runStatus(getConfig);\n });\n\n auth.command(\"refresh\").description(\"Refresh access token\").action(async () => {\n await runRefresh(getConfig);\n });\n\n auth.command(\"logout\").description(\"Log out current account\").action(async () => {\n await runLogout(getConfig);\n });\n\n auth\n .command(\"logs\")\n .description(\"Show CLI request audit logs\")\n .option(\"--page-size <n>\", \"Page size\", (v) => Number.parseInt(v, 10))\n .option(\"--cursor <cursor>\", \"Cursor for next page\")\n .action(async (opts: { pageSize?: number; cursor?: string }) => {\n await runLogs(getConfig, opts);\n });\n}\n","import { basename } from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport { spawn } from \"node:child_process\";\nimport { createInterface } from \"node:readline/promises\";\nimport { stdin as input, stdout as output } from \"node:process\";\nimport type { Command } from \"commander\";\nimport type { ResolvedConfig } from \"../config.js\";\nimport { CliApiClient, type CliSubmissionResponse } from \"../api/cli-api.js\";\nimport { CLI_VERSION } from \"../constants.js\";\nimport { AspError } from \"../utils/errors.js\";\nimport {\n printInfo,\n printJson,\n printSuccess,\n printTable,\n printWarn,\n} from \"../utils/output.js\";\nimport {\n envCommandSuffix,\n formatPlatformLabel,\n requireCredentials,\n} from \"../utils/platform.js\";\nimport {\n appendOptionalArtifactFields,\n looksLikeSubmissionId,\n} from \"../utils/artifact-publish.js\";\nimport { recordPluginPublish } from \"../utils/publish-registry.js\";\nimport { resolvePluginSubmissionId } from \"../utils/submission-resolve.js\";\nimport {\n pollUntilTerminal,\n} from \"../utils/submission-poll.js\";\nimport { formatPluginListTechType } from \"../utils/marketplace-display.js\";\n\ninterface SearchOptions {\n category?: string;\n source?: \"official\" | \"verified\" | \"community\";\n sort?: \"recommended\" | \"downloads\" | \"updated_at\";\n pageSize?: number;\n cursor?: string;\n}\n\ninterface InfoOptions {\n version?: string;\n}\n\ninterface InstallOptions {\n version?: string;\n via?: \"qwenpaw\";\n}\n\ninterface PublishOptions {\n url?: string;\n artifactId?: string;\n version?: string;\n category?: PluginCategory;\n repoUrl?: string;\n publishMode?: \"auto_after_scan\";\n noWait?: boolean;\n}\n\ninterface PublishStatusOptions {\n watch?: boolean;\n}\n\ninterface PublishLogsOptions {}\n\ntype PluginCategory = \"tool\" | \"provider\" | \"command\" | \"hook\" | \"frontend\" | \"general\" | \"app\";\ntype PluginManifest = { id?: string; version?: string; type?: string };\n\nconst PLUGIN_CATEGORY_OPTIONS: Array<{\n value: PluginCategory;\n label: string;\n describe: string;\n}> = [\n {\n value: \"tool\",\n label: \"Agent Tool\",\n describe: \"Functions, APIs, or capabilities that Agents can invoke\",\n },\n {\n value: \"provider\",\n label: \"Model Provider\",\n describe: \"Connect custom LLM providers or model endpoints\",\n },\n {\n value: \"command\",\n label: \"Slash Command\",\n describe: \"Register console commands in the form /xxx\",\n },\n {\n value: \"hook\",\n label: \"Lifecycle Hook\",\n describe: \"Run code at key moments such as startup and shutdown\",\n },\n {\n value: \"frontend\",\n label: \"UI Extension\",\n describe: \"Provide frontend JS bundles loaded dynamically by the UI\",\n },\n {\n value: \"general\",\n label: \"General Plugin\",\n describe: \"Does not fit the categories above, or combines multiple capabilities\",\n },\n {\n value: \"app\",\n label: \"App\",\n describe: \"Extend platform capabilities as a standalone application\",\n },\n];\n\nasync function runCommand(command: string, args: string[]): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n const child = spawn(command, args, { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n let stdout = \"\";\n let stderr = \"\";\n child.stdout.on(\"data\", (chunk) => {\n stdout += String(chunk);\n });\n child.stderr.on(\"data\", (chunk) => {\n stderr += String(chunk);\n });\n child.on(\"error\", reject);\n child.on(\"close\", (code) => {\n if (code === 0) resolve(stdout);\n else reject(new Error(stderr || `Command failed: ${command} ${args.join(\" \")}`));\n });\n });\n}\n\nasync function readPluginManifestFromZip(zipPath: string | undefined): Promise<PluginManifest | undefined> {\n if (!zipPath) return undefined;\n try {\n const stdout = await runCommand(\"unzip\", [\"-p\", zipPath, \"plugin.json\"]);\n return JSON.parse(stdout) as PluginManifest;\n } catch {\n return undefined;\n }\n}\n\nfunction getClient(getConfig: () => ResolvedConfig): CliApiClient {\n return new CliApiClient(getConfig());\n}\n\nasync function runSearch(\n getConfig: () => ResolvedConfig,\n query: string | undefined,\n opts: SearchOptions,\n): Promise<void> {\n const config = getConfig();\n const client = getClient(getConfig);\n const response = await client.searchPlugins({\n q: query,\n category: opts.category,\n source: opts.source,\n sort: opts.sort,\n page_size: opts.pageSize,\n cursor: opts.cursor,\n });\n\n if (config.json) {\n printJson(response);\n return;\n }\n\n if (response.items.length === 0) {\n printInfo(\"No plugins found.\");\n return;\n }\n\n const rows = response.items.map((item) => [\n item.plugin_id,\n String(item.latest_version ?? \"-\"),\n formatPluginListTechType(item),\n String(item.name ?? \"-\"),\n ]);\n printTable([\"plugin_id\", \"version\", \"tech_type\", \"name\"], rows);\n if (response.next_cursor) {\n printInfo(`Next cursor: ${response.next_cursor}`);\n }\n}\n\nasync function runInfo(\n getConfig: () => ResolvedConfig,\n pluginId: string,\n opts: InfoOptions,\n): Promise<void> {\n const config = getConfig();\n const client = getClient(getConfig);\n const response = await client.getPluginInfo(pluginId, opts.version);\n if (config.json) {\n printJson(response);\n return;\n }\n\n printInfo(`Plugin: ${response.plugin_id}`);\n if (response.latest_version) printInfo(`Version: ${response.latest_version}`);\n if (response.scan_status) printInfo(`Scan: ${response.scan_status}`);\n if (response.install_command) printInfo(`Install: ${response.install_command}`);\n if (response.public_url) printInfo(`URL: ${response.public_url}`);\n}\n\nasync function runVersions(getConfig: () => ResolvedConfig, pluginId: string): Promise<void> {\n const config = getConfig();\n const client = getClient(getConfig);\n const response = await client.getPluginVersions(pluginId);\n if (config.json) {\n printJson(response);\n return;\n }\n if (response.items.length === 0) {\n printInfo(\"No published versions.\");\n return;\n }\n const rows = response.items.map((item) => [\n item.version,\n item.published_at ?? \"-\",\n item.deprecated ? \"yes\" : \"no\",\n ]);\n printTable([\"version\", \"published_at\", \"deprecated\"], rows);\n}\n\nasync function runInstall(\n getConfig: () => ResolvedConfig,\n pluginId: string,\n opts: InstallOptions,\n): Promise<void> {\n const base = getConfig();\n const { config } = await requireCredentials(base, base.platformUrl);\n const client = new CliApiClient(config);\n const intent = await client.createInstallIntent(pluginId, opts.version);\n\n if (base.json) {\n printJson(intent);\n return;\n }\n\n if (opts.via !== undefined && opts.via !== \"qwenpaw\") {\n throw new AspError(\"Only --via qwenpaw is supported now.\", {\n code: \"INVALID_REQUEST\",\n });\n }\n\n const installCmd = `qwenpaw plugin install ${intent.download_url}`;\n printInfo(`Run to install:\\n ${installCmd}`);\n if (intent.sha512) printInfo(`sha512: ${intent.sha512}`);\n if (intent.expires_at) printInfo(`URL expires at: ${intent.expires_at}`);\n\n const child = spawn(\"qwenpaw\", [\"plugin\", \"install\", intent.download_url], {\n stdio: \"inherit\",\n });\n await new Promise<void>((resolve, reject) => {\n child.on(\"exit\", (code) => {\n if (code === 0) resolve();\n else reject(new AspError(`qwenpaw exited with code ${code ?? 1}`, { code: \"QWENPAW_FAILED\" }));\n });\n child.on(\"error\", reject);\n });\n}\n\nasync function uploadZipToSignedUrl(upload: {\n url: string;\n method?: string;\n headers?: Record<string, string>;\n}, fileBuffer: Buffer): Promise<void> {\n const response = await fetch(upload.url, {\n method: upload.method ?? \"PUT\",\n headers: upload.headers ?? {},\n body: fileBuffer,\n });\n if (!response.ok) {\n throw new AspError(`Upload failed with HTTP ${response.status}`, {\n code: \"UPLOAD_FAILED\",\n statusCode: response.status,\n });\n }\n}\n\nfunction buildZipBody(\n filePath: string,\n fileBuffer: Buffer,\n sha512: string,\n opts: PublishOptions & { category: PluginCategory },\n): Record<string, unknown> {\n return appendOptionalArtifactFields(\n {\n artifact_type: \"plugin\",\n package_source: \"zip\",\n category: opts.category,\n filename: basename(filePath),\n size_bytes: fileBuffer.byteLength,\n sha512,\n publish_mode: opts.publishMode ?? \"auto_after_scan\",\n client: {\n name: \"agentscope-platform-cli\",\n version: CLI_VERSION,\n },\n },\n {\n artifactId: opts.artifactId,\n version: opts.version,\n repoUrl: opts.repoUrl,\n },\n );\n}\n\nfunction buildUrlBody(opts: PublishOptions & { category: PluginCategory }): Record<string, unknown> {\n return appendOptionalArtifactFields(\n {\n artifact_type: \"plugin\",\n package_source: \"url\",\n source_url: opts.url,\n category: opts.category,\n publish_mode: opts.publishMode ?? \"auto_after_scan\",\n client: {\n name: \"agentscope-platform-cli\",\n version: CLI_VERSION,\n },\n },\n {\n artifactId: opts.artifactId,\n version: opts.version,\n repoUrl: opts.repoUrl,\n },\n );\n}\n\nfunction parseCategory(inputValue: string | undefined): PluginCategory | undefined {\n if (!inputValue) return undefined;\n const normalized = inputValue.trim().toLowerCase();\n if (PLUGIN_CATEGORY_OPTIONS.some((item) => item.value === normalized)) {\n return normalized as PluginCategory;\n }\n return undefined;\n}\n\nfunction tryParseCategoryFromUrl(urlValue: string | undefined): PluginCategory | undefined {\n if (!urlValue) return undefined;\n try {\n const parsed = new URL(urlValue);\n const queryCategory = parseCategory(parsed.searchParams.get(\"category\") ?? undefined);\n if (queryCategory) return queryCategory;\n const segments = parsed.pathname\n .split(\"/\")\n .map((item) => item.trim().toLowerCase())\n .filter(Boolean);\n for (let i = 0; i < segments.length; i += 1) {\n const current = parseCategory(segments[i]);\n if (current) return current;\n }\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction tryParsePluginIdFromUrl(urlValue: string | undefined): string | undefined {\n if (!urlValue) return undefined;\n try {\n const parsed = new URL(urlValue);\n const segments = parsed.pathname\n .split(\"/\")\n .map((item) => item.trim())\n .filter(Boolean);\n const pluginsIdx = segments.findIndex((item) => item.toLowerCase() === \"plugins\");\n if (pluginsIdx >= 0 && segments[pluginsIdx + 2]) {\n return segments[pluginsIdx + 2];\n }\n const last = segments[segments.length - 1];\n if (last?.toLowerCase().endsWith(\".zip\")) {\n return last.replace(/-\\d+\\.\\d+\\.\\d+.*\\.zip$/i, \"\").replace(/\\.zip$/i, \"\");\n }\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nasync function tryParseCategoryFromZip(\n zipPath: string | undefined,\n manifest?: PluginManifest,\n): Promise<PluginCategory | undefined> {\n const parsed = manifest ?? (await readPluginManifestFromZip(zipPath));\n return parseCategory(parsed?.type);\n}\n\nfunction printManifestPreview(manifest: PluginManifest | undefined, jsonOutput: boolean): void {\n if (jsonOutput || !manifest) return;\n if (manifest.id) {\n printInfo(`Package plugin id: ${manifest.id} (parsed on complete if --artifact-id is omitted)`);\n }\n if (manifest.version) {\n printInfo(`Package version: ${manifest.version} (parsed on complete if --version is omitted)`);\n }\n}\n\nfunction validateExplicitManifestOverrides(\n opts: PublishOptions,\n manifest: PluginManifest | undefined,\n): void {\n if (opts.artifactId && manifest?.id && opts.artifactId !== manifest.id) {\n throw new AspError(\n `artifact_id mismatch: --artifact-id=${opts.artifactId}, plugin.json id=${manifest.id}`,\n {\n code: \"ARTIFACT_ID_MISMATCH\",\n hint: \"Remove --artifact-id to let the server parse from package, or fix the value.\",\n },\n );\n }\n if (opts.version && manifest?.version && opts.version !== manifest.version) {\n throw new AspError(\n `version mismatch: --version=${opts.version}, plugin.json version=${manifest.version}`,\n {\n code: \"VERSION_MISMATCH\",\n hint: \"Remove --version to let the server parse from package, or fix the value.\",\n },\n );\n }\n}\n\nasync function resolvePublishCategoryWithAutoDetect(\n opts: PublishOptions,\n zipPath: string | undefined,\n jsonOutput: boolean,\n manifest?: PluginManifest,\n): Promise<PluginCategory> {\n const fromArg = parseCategory(opts.category);\n if (fromArg) return fromArg;\n if (opts.category && !fromArg) {\n throw new AspError(`Invalid --category: ${opts.category}`, {\n code: \"INVALID_REQUEST\",\n hint: `Use one of: ${PLUGIN_CATEGORY_OPTIONS.map((item) => item.value).join(\", \")}`,\n });\n }\n\n const fromZip = await tryParseCategoryFromZip(zipPath, manifest);\n if (fromZip) {\n if (!jsonOutput) printInfo(`Detected category from plugin package: ${fromZip}`);\n return fromZip;\n }\n\n const fromUrl = tryParseCategoryFromUrl(opts.url);\n if (fromUrl) {\n if (!jsonOutput) printInfo(`Detected category from source URL: ${fromUrl}`);\n return fromUrl;\n }\n\n return resolvePublishCategory(opts, jsonOutput);\n}\n\nasync function resolvePublishCategory(\n opts: PublishOptions,\n jsonOutput: boolean,\n): Promise<PluginCategory> {\n const fromArg = parseCategory(opts.category);\n if (fromArg) return fromArg;\n\n if (opts.category && !fromArg) {\n throw new AspError(`Invalid --category: ${opts.category}`, {\n code: \"INVALID_REQUEST\",\n hint: `Use one of: ${PLUGIN_CATEGORY_OPTIONS.map((item) => item.value).join(\", \")}`,\n });\n }\n\n if (jsonOutput || !input.isTTY || !output.isTTY) {\n throw new AspError(\"Plugin publish requires --category.\", {\n code: \"INVALID_REQUEST\",\n hint: `Use --category with one of: ${PLUGIN_CATEGORY_OPTIONS.map((item) => item.value).join(\", \")}`,\n });\n }\n\n printInfo(\"Select plugin category:\");\n for (const [index, item] of PLUGIN_CATEGORY_OPTIONS.entries()) {\n printInfo(`${index + 1}) ${item.value} - ${item.label}`);\n printInfo(` ${item.describe}`);\n }\n\n const rl = createInterface({ input, output });\n try {\n while (true) {\n const answer = (await rl.question(\"Enter category number or value: \")).trim();\n const index = Number.parseInt(answer, 10);\n if (!Number.isNaN(index) && index >= 1 && index <= PLUGIN_CATEGORY_OPTIONS.length) {\n const selected = PLUGIN_CATEGORY_OPTIONS[index - 1].value;\n printInfo(`Selected category: ${selected}`);\n return selected;\n }\n const byValue = parseCategory(answer);\n if (byValue) {\n printInfo(`Selected category: ${byValue}`);\n return byValue;\n }\n printWarn(`Invalid choice. Use 1-${PLUGIN_CATEGORY_OPTIONS.length} or category value.`);\n }\n } finally {\n rl.close();\n }\n}\n\nfunction isMissingCategoryError(err: unknown): boolean {\n if (!(err instanceof AspError)) return false;\n if (err.code !== \"INVALID_REQUEST\") return false;\n const message = `${err.message} ${err.hint ?? \"\"}`.toLowerCase();\n return message.includes(\"category\") || message.includes(\"技术类型\");\n}\n\nasync function showPublishedPluginStatus(\n client: CliApiClient,\n pluginId: string,\n jsonOutput: boolean,\n): Promise<void> {\n try {\n const info = await client.getPluginInfo(pluginId);\n if (jsonOutput) {\n printJson({\n plugin_id: info.plugin_id,\n status: \"published\",\n terminal: true,\n latest_version: info.latest_version,\n scan_status: info.scan_status,\n public_url: info.public_url,\n install_command: info.install_command,\n });\n return;\n }\n\n printInfo(`Plugin: ${info.plugin_id}`);\n printInfo(\"Status: published\");\n printInfo(\"Terminal: yes\");\n if (info.latest_version) printInfo(`Version: ${info.latest_version}`);\n if (info.scan_status) printInfo(`Scan: ${info.scan_status}`);\n if (info.public_url) printInfo(`URL: ${info.public_url}`);\n if (info.install_command) printInfo(`Install: ${info.install_command}`);\n } catch (err) {\n if (err instanceof AspError && err.statusCode === 404) {\n throw new AspError(`No submission or published plugin found: ${pluginId}`, {\n code: \"NOT_FOUND\",\n hint:\n \"If the plugin is still scanning, use submission_id from publish output. \" +\n \"Republish on this machine to cache plugin_id mapping locally.\",\n });\n }\n throw err;\n }\n}\n\nasync function runPublish(\n getConfig: () => ResolvedConfig,\n zipPath: string | undefined,\n opts: PublishOptions,\n): Promise<void> {\n const base = getConfig();\n const { config } = await requireCredentials(base, base.platformUrl);\n const client = new CliApiClient(config);\n const useUrlMode = Boolean(opts.url);\n const manifest = useUrlMode ? undefined : await readPluginManifestFromZip(zipPath);\n printManifestPreview(manifest, base.json);\n validateExplicitManifestOverrides(opts, manifest);\n\n let publishOpts: PublishOptions & { category: PluginCategory };\n try {\n const category = await resolvePublishCategoryWithAutoDetect(\n opts,\n zipPath,\n base.json,\n manifest,\n );\n publishOpts = { ...opts, category };\n } catch (err) {\n if (!isMissingCategoryError(err)) throw err;\n const category = await resolvePublishCategory({ ...opts, category: undefined }, base.json);\n publishOpts = { ...opts, category };\n }\n if (useUrlMode && zipPath) {\n const suffix = envCommandSuffix(config.platformUrl);\n throw new AspError(\"Do not pass zip path when using --url.\", {\n code: \"INVALID_REQUEST\",\n hint:\n `Use either \\`asp plugin publish ./plugin.zip${suffix}\\` or ` +\n `\\`asp plugin publish --url <url>${suffix}\\`.`,\n });\n }\n if (!useUrlMode && !zipPath) {\n const suffix = envCommandSuffix(config.platformUrl);\n throw new AspError(\"Zip path is required unless --url is provided.\", {\n code: \"INVALID_REQUEST\",\n hint: `Use \\`asp plugin publish ./plugin.zip${suffix}\\`.`,\n });\n }\n\n let submission: CliSubmissionResponse;\n const tryCreateSubmission = async (): Promise<CliSubmissionResponse> => {\n if (useUrlMode) {\n return client.createArtifactSubmission(buildUrlBody(publishOpts));\n }\n const fileBuffer = await readFile(zipPath as string);\n const sha512 = createHash(\"sha512\").update(fileBuffer).digest(\"hex\");\n let localSubmission = await client.createArtifactSubmission(\n buildZipBody(zipPath as string, fileBuffer, sha512, publishOpts),\n );\n if (!localSubmission.upload?.url) {\n throw new AspError(\"Missing upload URL for zip submission.\", {\n code: \"UPLOAD_URL_MISSING\",\n });\n }\n await uploadZipToSignedUrl(localSubmission.upload, fileBuffer);\n localSubmission = await client.completeArtifactSubmission(localSubmission.submission_id, {\n sha512,\n size_bytes: fileBuffer.byteLength,\n });\n return localSubmission;\n };\n\n try {\n submission = await tryCreateSubmission();\n } catch (err) {\n if (!isMissingCategoryError(err) || base.json || !input.isTTY || !output.isTTY) {\n throw err;\n }\n printWarn(\"Publish failed due to missing category, please choose one and retrying...\");\n const category = await resolvePublishCategory({ ...opts, category: undefined }, base.json);\n publishOpts = { ...opts, category };\n submission = await tryCreateSubmission();\n }\n\n const urlPluginId = useUrlMode ? tryParsePluginIdFromUrl(publishOpts.url) : undefined;\n await recordPluginPublish({\n submissionId: submission.submission_id,\n platformUrl: config.platformUrl,\n pluginId: publishOpts.artifactId ?? manifest?.id ?? urlPluginId,\n sourceUrl: useUrlMode ? publishOpts.url : undefined,\n });\n\n if (base.json) {\n printJson(submission);\n return;\n }\n\n printSuccess(`Submission created: ${submission.submission_id}`);\n printInfo(`Initial status: ${submission.status}`);\n const trackRef =\n publishOpts.artifactId ?? manifest?.id ?? urlPluginId ?? submission.submission_id;\n\n if (opts.noWait) {\n const envSuffix = envCommandSuffix(config.platformUrl);\n printInfo(`Track progress: asp plugin publish status ${trackRef}${envSuffix}`);\n printInfo(`Show logs: asp plugin publish logs ${trackRef}${envSuffix}`);\n return;\n }\n\n if (!submission.terminal) {\n printSuccess(\"Upload submitted successfully. Scanning continues asynchronously.\");\n const envSuffix = envCommandSuffix(config.platformUrl);\n printInfo(`Track progress: asp plugin publish status ${trackRef} --watch${envSuffix}`);\n printInfo(`Show logs: asp plugin publish logs ${trackRef}${envSuffix}`);\n return;\n }\n\n if (submission.status === \"published\") {\n printSuccess(`Published successfully (${formatPlatformLabel(config.platformUrl)})`);\n if (submission.publish?.public_url) {\n printInfo(`URL: ${submission.publish.public_url}`);\n }\n return;\n }\n\n printWarn(`Submission ended with status: ${submission.status}`);\n if (submission.failure?.message) {\n printWarn(`Failure: ${submission.failure.message}`);\n }\n const envSuffix = envCommandSuffix(config.platformUrl);\n printInfo(`Inspect logs: asp plugin publish logs ${trackRef}${envSuffix}`);\n}\n\nasync function runPublishStatus(\n getConfig: () => ResolvedConfig,\n pluginRef: string,\n opts: PublishStatusOptions,\n): Promise<void> {\n const base = getConfig();\n const { config } = await requireCredentials(base, base.platformUrl);\n const client = new CliApiClient(config);\n\n if (looksLikeSubmissionId(pluginRef)) {\n const state = opts.watch\n ? await pollUntilTerminal(client, pluginRef, true)\n : await client.getArtifactSubmission(pluginRef);\n if (base.json) {\n printJson(state);\n return;\n }\n printInfo(`Submission: ${state.submission_id}`);\n printInfo(`Status: ${state.status}`);\n printInfo(`Terminal: ${state.terminal ? \"yes\" : \"no\"}`);\n if (state.scan?.status) printInfo(`Scan: ${state.scan.status}`);\n if (state.publish?.public_url) printInfo(`URL: ${state.publish.public_url}`);\n if (state.failure?.message) printWarn(`Failure: ${state.failure.message}`);\n return;\n }\n\n const submissionId = await resolvePluginSubmissionId(client, pluginRef, config.platformUrl);\n if (!submissionId) {\n await showPublishedPluginStatus(client, pluginRef, base.json);\n return;\n }\n\n if (!base.json) {\n printInfo(`Resolved plugin id \"${pluginRef}\" -> submission ${submissionId}`);\n }\n\n const current = await client.getArtifactSubmission(submissionId);\n if (current.terminal && current.status === \"published\") {\n await showPublishedPluginStatus(client, pluginRef, base.json);\n return;\n }\n\n const state = opts.watch\n ? await pollUntilTerminal(client, submissionId, true)\n : current;\n\n if (base.json) {\n printJson(state);\n return;\n }\n\n printInfo(`Submission: ${state.submission_id}`);\n printInfo(`Status: ${state.status}`);\n printInfo(`Terminal: ${state.terminal ? \"yes\" : \"no\"}`);\n if (state.scan?.status) printInfo(`Scan: ${state.scan.status}`);\n if (state.publish?.public_url) printInfo(`URL: ${state.publish.public_url}`);\n if (state.failure?.message) printWarn(`Failure: ${state.failure.message}`);\n}\n\nasync function runPublishLogs(\n getConfig: () => ResolvedConfig,\n pluginRef: string,\n _opts: PublishLogsOptions,\n): Promise<void> {\n const base = getConfig();\n const { config } = await requireCredentials(base, base.platformUrl);\n const client = new CliApiClient(config);\n const submissionId = await resolvePluginSubmissionId(client, pluginRef, config.platformUrl);\n if (!submissionId) {\n throw new AspError(`No publish logs found for plugin id: ${pluginRef}`, {\n code: \"NOT_FOUND\",\n hint:\n \"Use submission_id from publish output, or republish on this machine to cache the mapping.\",\n });\n }\n if (submissionId !== pluginRef && !base.json) {\n printInfo(`Resolved plugin id \"${pluginRef}\" -> submission ${submissionId}`);\n }\n const logs = await client.getArtifactSubmissionLogs(submissionId);\n\n if (base.json) {\n printJson(logs);\n return;\n }\n\n if (logs.items.length === 0) {\n printInfo(\"No logs yet.\");\n return;\n }\n const rows = logs.items.map((item) => [item.timestamp, item.level, item.message]);\n printTable([\"timestamp\", \"level\", \"message\"], rows);\n}\n\nexport function registerPluginCommands(program: Command, getConfig: () => ResolvedConfig): void {\n const plugin = program.command(\"plugin\").description(\"Plugin marketplace and publish commands\");\n\n plugin\n .command(\"search [query]\")\n .description(\"Search plugins\")\n .option(\"--category <code>\", \"Tech type/category code\")\n .option(\"--source <source>\", \"official | verified | community\")\n .option(\"--sort <sort>\", \"recommended | downloads | updated_at\")\n .option(\"--page-size <n>\", \"Page size\", (v) => Number.parseInt(v, 10))\n .option(\"--cursor <cursor>\", \"Cursor for next page\")\n .action(async (query: string | undefined, opts: SearchOptions) => {\n await runSearch(getConfig, query, opts);\n });\n\n plugin\n .command(\"info <pluginId>\")\n .description(\"Show plugin details\")\n .option(\"--version <version>\", \"Specify version\")\n .action(async (pluginId: string, opts: InfoOptions) => {\n await runInfo(getConfig, pluginId, opts);\n });\n\n plugin\n .command(\"versions <pluginId>\")\n .description(\"List published versions\")\n .action(async (pluginId: string) => {\n await runVersions(getConfig, pluginId);\n });\n\n plugin\n .command(\"install <pluginId>\")\n .description(\"Install plugin via qwenpaw\")\n .option(\"--version <version>\", \"Specify version\")\n .option(\"--via <tool>\", \"Install tool (qwenpaw)\", \"qwenpaw\")\n .action(async (pluginId: string, opts: InstallOptions) => {\n await runInstall(getConfig, pluginId, opts);\n });\n\n const publish = plugin\n .command(\"publish [zipPath]\")\n .description(\"Publish plugin from local zip or URL\")\n .option(\"--url <url>\", \"Publish from remote zip URL\")\n .option(\"--artifact-id <id>\", \"Optional plugin id override (must match plugin.json in zip mode)\")\n .option(\"--version <version>\", \"Optional version override\")\n .option(\"--category <code>\", \"Plugin category code (tool|provider|command|hook|frontend|general|app)\")\n .option(\"--repo-url <url>\", \"Repository URL\")\n .option(\"--publish-mode <mode>\", \"Publish mode\", \"auto_after_scan\")\n .option(\"--no-wait\", \"Do not wait for terminal status\")\n .action(async (zipPath: string | undefined, opts: PublishOptions) => {\n await runPublish(getConfig, zipPath, opts);\n });\n\n publish\n .command(\"status <pluginId>\")\n .description(\"Show publish status by plugin id or submission id\")\n .option(\"--watch\", \"Poll until terminal status\", false)\n .action(async (pluginId: string, opts: PublishStatusOptions) => {\n await runPublishStatus(getConfig, pluginId, opts);\n });\n\n publish\n .command(\"logs <pluginId>\")\n .description(\"Show publish logs by plugin id or submission id\")\n .action(async (pluginId: string, opts: PublishLogsOptions) => {\n await runPublishLogs(getConfig, pluginId, opts);\n });\n}\n\n","import { AspError } from \"./errors.js\";\n\nexport function appendOptionalArtifactFields(\n body: Record<string, unknown>,\n fields: { artifactId?: string; version?: string; repoUrl?: string },\n): Record<string, unknown> {\n if (fields.artifactId) body.artifact_id = fields.artifactId;\n if (fields.version) body.version = fields.version;\n if (fields.repoUrl) body.repo_url = fields.repoUrl;\n return body;\n}\n\nexport function looksLikeSubmissionId(id: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(id);\n}\n\nexport function assertSubmissionId(id: string, exampleCommand: string): void {\n if (looksLikeSubmissionId(id)) return;\n throw new AspError(`Invalid submission ID: ${id}`, {\n code: \"INVALID_REQUEST\",\n hint: `Use submission_id from publish output, not plugin/skill id. Example: ${exampleCommand}`,\n });\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getAspConfigDir } from \"../config.js\";\n\ninterface PublishRegistryEntry {\n submission_id: string;\n platform_url: string;\n plugin_id?: string;\n skill_id?: string;\n source_url?: string;\n updated_at: string;\n}\n\ninterface PublishRegistry {\n entries: PublishRegistryEntry[];\n}\n\nconst REGISTRY_FILE = \"publish-submissions.json\";\nconst MAX_ENTRIES = 200;\n\nfunction normalizePlatformUrl(url: string): string {\n return url.replace(/\\/$/, \"\");\n}\n\nasync function loadRegistry(): Promise<PublishRegistry> {\n try {\n const path = join(getAspConfigDir(), REGISTRY_FILE);\n const raw = await readFile(path, \"utf8\");\n return JSON.parse(raw) as PublishRegistry;\n } catch {\n return { entries: [] };\n }\n}\n\nasync function saveRegistry(registry: PublishRegistry): Promise<void> {\n const dir = getAspConfigDir();\n await mkdir(dir, { recursive: true });\n const path = join(dir, REGISTRY_FILE);\n await writeFile(path, `${JSON.stringify(registry, null, 2)}\\n`, \"utf8\");\n}\n\nexport async function recordPluginPublish(opts: {\n submissionId: string;\n platformUrl: string;\n pluginId?: string;\n sourceUrl?: string;\n}): Promise<void> {\n const registry = await loadRegistry();\n const platform = normalizePlatformUrl(opts.platformUrl);\n const now = new Date().toISOString();\n\n registry.entries = registry.entries.filter((entry) => {\n if (entry.platform_url !== platform) return true;\n if (entry.submission_id === opts.submissionId) return false;\n if (opts.pluginId && entry.plugin_id === opts.pluginId) return false;\n return true;\n });\n\n registry.entries.unshift({\n submission_id: opts.submissionId,\n platform_url: platform,\n plugin_id: opts.pluginId,\n source_url: opts.sourceUrl,\n updated_at: now,\n });\n\n registry.entries = registry.entries.slice(0, MAX_ENTRIES);\n await saveRegistry(registry);\n}\n\nexport async function lookupPluginSubmissionId(\n ref: string,\n platformUrl: string,\n): Promise<string | undefined> {\n return lookupArtifactSubmissionId(ref, platformUrl, \"plugin\");\n}\n\nexport async function recordSkillPublish(opts: {\n submissionId: string;\n platformUrl: string;\n skillId?: string;\n sourceUrl?: string;\n}): Promise<void> {\n const registry = await loadRegistry();\n const platform = normalizePlatformUrl(opts.platformUrl);\n const now = new Date().toISOString();\n\n registry.entries = registry.entries.filter((entry) => {\n if (entry.platform_url !== platform) return true;\n if (entry.submission_id === opts.submissionId) return false;\n if (opts.skillId && entry.skill_id === opts.skillId) return false;\n return true;\n });\n\n registry.entries.unshift({\n submission_id: opts.submissionId,\n platform_url: platform,\n skill_id: opts.skillId,\n source_url: opts.sourceUrl,\n updated_at: now,\n });\n\n registry.entries = registry.entries.slice(0, MAX_ENTRIES);\n await saveRegistry(registry);\n}\n\nexport async function lookupSkillSubmissionId(\n ref: string,\n platformUrl: string,\n): Promise<string | undefined> {\n return lookupArtifactSubmissionId(ref, platformUrl, \"skill\");\n}\n\nasync function lookupArtifactSubmissionId(\n ref: string,\n platformUrl: string,\n artifactType: \"plugin\" | \"skill\",\n): Promise<string | undefined> {\n const registry = await loadRegistry();\n const platform = normalizePlatformUrl(platformUrl);\n const refLower = ref.toLowerCase();\n\n for (const entry of registry.entries) {\n if (entry.platform_url !== platform) continue;\n if (entry.submission_id === ref) return entry.submission_id;\n const artifactId = artifactType === \"plugin\" ? entry.plugin_id : entry.skill_id;\n if (artifactId === ref) return entry.submission_id;\n if (entry.source_url?.toLowerCase().includes(refLower)) return entry.submission_id;\n }\n\n return undefined;\n}\n","import type { CliApiClient, CliSubmissionResponse } from \"../api/cli-api.js\";\nimport {\n lookupPluginSubmissionId,\n lookupSkillSubmissionId,\n recordPluginPublish,\n recordSkillPublish,\n} from \"./publish-registry.js\";\n\nconst SUBMISSION_ID_PATTERN =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\nconst SUBMISSION_ID_IN_PATH =\n /\\/artifact-submissions\\/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/i;\n\nfunction requestBodyMatchesArtifact(body: unknown, artifactId: string): boolean {\n if (!body || typeof body !== \"object\") return false;\n const record = body as Record<string, unknown>;\n if (record.artifact_id === artifactId) return true;\n\n if (typeof record.source_url !== \"string\") return false;\n const url = record.source_url.toLowerCase();\n const id = artifactId.toLowerCase();\n if (url.includes(id)) return true;\n\n const segments = url.split(/[/\\\\?&#]/).filter(Boolean);\n return segments.some((segment) => segment === id);\n}\n\nfunction submissionMatchesPlugin(\n state: CliSubmissionResponse,\n pluginId: string,\n): boolean {\n const anyState = state as CliSubmissionResponse & { artifact_id?: string };\n if (anyState.artifact_id === pluginId) return true;\n\n const pluginIdLower = pluginId.toLowerCase();\n const publicUrl = state.publish?.public_url?.toLowerCase();\n if (publicUrl?.includes(`/plugins/${pluginIdLower}`)) return true;\n return false;\n}\n\nasync function rememberResolvedSubmission(\n submissionId: string,\n platformUrl: string,\n state: CliSubmissionResponse,\n): Promise<void> {\n const anyState = state as CliSubmissionResponse & { artifact_id?: string };\n if (!anyState.artifact_id) return;\n await recordPluginPublish({\n submissionId,\n platformUrl,\n pluginId: anyState.artifact_id,\n });\n}\n\nexport async function resolvePluginSubmissionId(\n client: CliApiClient,\n pluginId: string,\n platformUrl: string,\n): Promise<string | undefined> {\n if (SUBMISSION_ID_PATTERN.test(pluginId)) return pluginId;\n\n const cached = await lookupPluginSubmissionId(pluginId, platformUrl);\n if (cached) return cached;\n\n const latestSeenAt = new Map<string, string>();\n let cursor: string | undefined;\n\n for (let page = 0; page < 10; page += 1) {\n const response = await client.getRequestLogs({ page_size: 100, cursor });\n for (const item of response.items) {\n const match = item.path.match(SUBMISSION_ID_IN_PATH);\n if (match) {\n const submissionId = match[1];\n const previous = latestSeenAt.get(submissionId);\n if (!previous || item.created_at > previous) {\n latestSeenAt.set(submissionId, item.created_at);\n }\n }\n\n if (\n item.method === \"POST\" &&\n item.path.endsWith(\"/artifact-submissions\") &&\n requestBodyMatchesArtifact(item.request_body, pluginId)\n ) {\n const postMatch = item.path.match(SUBMISSION_ID_IN_PATH);\n if (postMatch) {\n latestSeenAt.set(postMatch[1], item.created_at);\n }\n }\n }\n if (!response.next_cursor) break;\n cursor = response.next_cursor ?? undefined;\n }\n\n const candidates = [...latestSeenAt.entries()]\n .sort((a, b) => b[1].localeCompare(a[1]))\n .map(([submissionId]) => submissionId)\n .slice(0, 50);\n\n const pluginIdLower = pluginId.toLowerCase();\n\n for (const candidate of candidates) {\n try {\n const state = await client.getArtifactSubmission(candidate);\n if (submissionMatchesPlugin(state, pluginId)) {\n await rememberResolvedSubmission(candidate, platformUrl, state);\n return candidate;\n }\n\n const logs = await client.getArtifactSubmissionLogs(candidate);\n const matched = logs.items.some((item) =>\n item.message.toLowerCase().includes(pluginIdLower),\n );\n if (matched) {\n await rememberResolvedSubmission(candidate, platformUrl, state);\n return candidate;\n }\n } catch {\n continue;\n }\n }\n\n return undefined;\n}\n\nfunction submissionMatchesSkill(\n state: CliSubmissionResponse,\n skillId: string,\n): boolean {\n const anyState = state as CliSubmissionResponse & { artifact_id?: string };\n if (anyState.artifact_id === skillId) return true;\n\n const skillIdLower = skillId.toLowerCase();\n const publicUrl = state.publish?.public_url?.toLowerCase();\n if (publicUrl?.includes(`/skills/${skillIdLower}`)) return true;\n return false;\n}\n\nasync function rememberResolvedSkillSubmission(\n submissionId: string,\n platformUrl: string,\n state: CliSubmissionResponse,\n): Promise<void> {\n const anyState = state as CliSubmissionResponse & { artifact_id?: string };\n if (!anyState.artifact_id) return;\n await recordSkillPublish({\n submissionId,\n platformUrl,\n skillId: anyState.artifact_id,\n });\n}\n\nexport async function resolveSkillSubmissionId(\n client: CliApiClient,\n skillId: string,\n platformUrl: string,\n): Promise<string | undefined> {\n if (SUBMISSION_ID_PATTERN.test(skillId)) return skillId;\n\n const cached = await lookupSkillSubmissionId(skillId, platformUrl);\n if (cached) return cached;\n\n const latestSeenAt = new Map<string, string>();\n let cursor: string | undefined;\n\n for (let page = 0; page < 10; page += 1) {\n const response = await client.getRequestLogs({ page_size: 100, cursor });\n for (const item of response.items) {\n const match = item.path.match(SUBMISSION_ID_IN_PATH);\n if (match) {\n const submissionId = match[1];\n const previous = latestSeenAt.get(submissionId);\n if (!previous || item.created_at > previous) {\n latestSeenAt.set(submissionId, item.created_at);\n }\n }\n\n if (\n item.method === \"POST\" &&\n item.path.endsWith(\"/artifact-submissions\") &&\n requestBodyMatchesArtifact(item.request_body, skillId)\n ) {\n const postMatch = item.path.match(SUBMISSION_ID_IN_PATH);\n if (postMatch) {\n latestSeenAt.set(postMatch[1], item.created_at);\n }\n }\n }\n if (!response.next_cursor) break;\n cursor = response.next_cursor ?? undefined;\n }\n\n const candidates = [...latestSeenAt.entries()]\n .sort((a, b) => b[1].localeCompare(a[1]))\n .map(([submissionId]) => submissionId)\n .slice(0, 50);\n\n const skillIdLower = skillId.toLowerCase();\n\n for (const candidate of candidates) {\n try {\n const state = await client.getArtifactSubmission(candidate);\n if (submissionMatchesSkill(state, skillId)) {\n await rememberResolvedSkillSubmission(candidate, platformUrl, state);\n return candidate;\n }\n\n const logs = await client.getArtifactSubmissionLogs(candidate);\n const matched = logs.items.some((item) =>\n item.message.toLowerCase().includes(skillIdLower),\n );\n if (matched) {\n await rememberResolvedSkillSubmission(candidate, platformUrl, state);\n return candidate;\n }\n } catch {\n continue;\n }\n }\n\n return undefined;\n}\n","import type { CliApiClient, CliSubmissionResponse } from \"../api/cli-api.js\";\nimport { printInfo } from \"./output.js\";\n\nexport class SubmissionWaitInterruptedError extends Error {\n readonly submissionId: string;\n\n constructor(submissionId: string) {\n super(\"Submission wait interrupted\");\n this.name = \"SubmissionWaitInterruptedError\";\n this.submissionId = submissionId;\n }\n}\n\nfunction sleep(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n reject(new Error(\"aborted\"));\n return;\n }\n\n const timer = setTimeout(() => {\n signal.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n\n const onAbort = () => {\n clearTimeout(timer);\n reject(new Error(\"aborted\"));\n };\n\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nexport async function pollUntilTerminal(\n client: CliApiClient,\n submissionId: string,\n watch: boolean,\n): Promise<CliSubmissionResponse> {\n let lastStatus = \"\";\n const controller = new AbortController();\n\n const onInterrupt = () => {\n controller.abort();\n };\n\n process.once(\"SIGINT\", onInterrupt);\n try {\n while (!controller.signal.aborted) {\n const current = await client.getArtifactSubmission(submissionId);\n if (watch && current.status !== lastStatus) {\n printInfo(`Submission ${submissionId}: ${current.status}`);\n lastStatus = current.status;\n }\n if (current.terminal) return current;\n\n const sleepSec = Math.max(current.next_poll_after_seconds ?? 15, 1);\n try {\n await sleep(sleepSec * 1000, controller.signal);\n } catch {\n throw new SubmissionWaitInterruptedError(submissionId);\n }\n }\n\n throw new SubmissionWaitInterruptedError(submissionId);\n } finally {\n process.removeListener(\"SIGINT\", onInterrupt);\n }\n}\n","import type { PluginListItem } from \"../api/cli-api.js\";\n\nexport function formatPluginListTechType(item: PluginListItem): string {\n return item.tech_type ?? item.category ?? item.source ?? \"-\";\n}\n","import { basename } from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport { spawn } from \"node:child_process\";\nimport { createInterface } from \"node:readline/promises\";\nimport { stdin as input, stdout as output } from \"node:process\";\nimport type { Command } from \"commander\";\nimport type { ResolvedConfig } from \"../config.js\";\nimport { CliApiClient, type CliSubmissionResponse } from \"../api/cli-api.js\";\nimport { CLI_VERSION } from \"../constants.js\";\nimport { AspError } from \"../utils/errors.js\";\nimport {\n printInfo,\n printJson,\n printSuccess,\n printTable,\n printWarn,\n} from \"../utils/output.js\";\nimport {\n envCommandSuffix,\n formatPlatformLabel,\n requireCredentials,\n} from \"../utils/platform.js\";\nimport { appendOptionalArtifactFields, looksLikeSubmissionId } from \"../utils/artifact-publish.js\";\nimport { recordSkillPublish } from \"../utils/publish-registry.js\";\nimport { resolveSkillSubmissionId } from \"../utils/submission-resolve.js\";\nimport { pollUntilTerminal } from \"../utils/submission-poll.js\";\nimport {\n readSkillManifestFromZip,\n type SkillManifest,\n} from \"../utils/skill-manifest.js\";\n\ninterface SearchOptions {\n category?: string;\n source?: \"official\" | \"verified\" | \"community\";\n tag?: string;\n sort?: \"recommended\" | \"downloads\" | \"updated_at\";\n pageSize?: number;\n cursor?: string;\n}\n\ninterface InfoOptions {\n version?: string;\n}\n\ninterface InstallOptions {\n version?: string;\n via?: \"qwenpaw\";\n}\n\ninterface PublishOptions {\n url?: string;\n artifactId?: string;\n version?: string;\n category?: SkillCategory;\n tags?: string;\n repoUrl?: string;\n publishMode?: \"auto_after_scan\";\n noWait?: boolean;\n}\n\ninterface PublishStatusOptions {\n watch?: boolean;\n}\n\ntype SkillCategory =\n | \"engineering development\"\n | \"data research\"\n | \"document office\"\n | \"design creation\"\n | \"automation integration\"\n | \"product management\"\n | \"marketing growth\"\n | \"security compliance\"\n | \"education knowledge\"\n | \"plugin development\"\n | \"skills management\"\n | \"others\";\n\nconst SKILL_CATEGORY_OPTIONS: Array<{\n value: SkillCategory;\n label: string;\n}> = [\n { value: \"engineering development\", label: \"工程开发\" },\n { value: \"data research\", label: \"数据研究\" },\n { value: \"document office\", label: \"文档办公\" },\n { value: \"design creation\", label: \"设计创作\" },\n { value: \"automation integration\", label: \"自动化集成\" },\n { value: \"product management\", label: \"产品管理\" },\n { value: \"marketing growth\", label: \"营销增长\" },\n { value: \"security compliance\", label: \"安全合规\" },\n { value: \"education knowledge\", label: \"教育知识\" },\n { value: \"plugin development\", label: \"Plugin 开发\" },\n { value: \"skills management\", label: \"Skills 管理\" },\n { value: \"others\", label: \"其它\" },\n];\n\nfunction getClient(getConfig: () => ResolvedConfig): CliApiClient {\n return new CliApiClient(getConfig());\n}\n\nfunction parseTags(tags?: string): string[] | undefined {\n if (!tags) return undefined;\n return tags\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean)\n .slice(0, 3);\n}\n\nasync function runSearch(\n getConfig: () => ResolvedConfig,\n query: string | undefined,\n opts: SearchOptions,\n): Promise<void> {\n const config = getConfig();\n const client = getClient(getConfig);\n const response = await client.searchSkills({\n q: query,\n category: opts.category,\n source: opts.source,\n tag: opts.tag,\n sort: opts.sort,\n page_size: opts.pageSize,\n cursor: opts.cursor,\n });\n\n if (config.json) {\n printJson(response);\n return;\n }\n\n if (response.items.length === 0) {\n printInfo(\"No skills found.\");\n return;\n }\n\n const rows = response.items.map((item) => [\n item.skill_id,\n String(item.latest_version ?? \"-\"),\n String(item.category ?? \"-\"),\n String(item.source ?? \"-\"),\n ]);\n printTable([\"skill_id\", \"version\", \"category\", \"source\"], rows);\n if (response.next_cursor) {\n printInfo(`Next cursor: ${response.next_cursor}`);\n }\n}\n\nasync function runInfo(\n getConfig: () => ResolvedConfig,\n skillId: string,\n opts: InfoOptions,\n): Promise<void> {\n const config = getConfig();\n const client = getClient(getConfig);\n const response = await client.getSkillInfo(skillId, opts.version);\n if (config.json) {\n printJson(response);\n return;\n }\n\n printInfo(`Skill: ${response.skill_id}`);\n if (response.latest_version) printInfo(`Version: ${response.latest_version}`);\n if (response.scan_status) printInfo(`Scan: ${response.scan_status}`);\n if (response.install_command) printInfo(`Install: ${response.install_command}`);\n if (response.public_url) printInfo(`URL: ${response.public_url}`);\n}\n\nasync function runVersions(getConfig: () => ResolvedConfig, skillId: string): Promise<void> {\n const config = getConfig();\n const client = getClient(getConfig);\n const response = await client.getSkillVersions(skillId);\n if (config.json) {\n printJson(response);\n return;\n }\n if (response.items.length === 0) {\n printInfo(\"No published versions.\");\n return;\n }\n const rows = response.items.map((item) => [\n item.version,\n item.published_at ?? \"-\",\n item.deprecated ? \"yes\" : \"no\",\n ]);\n printTable([\"version\", \"published_at\", \"deprecated\"], rows);\n}\n\nasync function runInstall(\n getConfig: () => ResolvedConfig,\n skillId: string,\n opts: InstallOptions,\n): Promise<void> {\n const base = getConfig();\n const { config } = await requireCredentials(base, base.platformUrl);\n const client = new CliApiClient(config);\n const intent = await client.createSkillInstallIntent(skillId, opts.version);\n\n if (base.json) {\n printJson(intent);\n return;\n }\n\n if (opts.via !== undefined && opts.via !== \"qwenpaw\") {\n throw new AspError(\"Only --via qwenpaw is supported now.\", {\n code: \"INVALID_REQUEST\",\n });\n }\n\n const installCmd = `qwenpaw skill install ${intent.download_url}`;\n printInfo(`Run to install:\\n ${installCmd}`);\n if (intent.sha512) printInfo(`sha512: ${intent.sha512}`);\n if (intent.expires_at) printInfo(`URL expires at: ${intent.expires_at}`);\n\n const child = spawn(\"qwenpaw\", [\"skill\", \"install\", intent.download_url], {\n stdio: \"inherit\",\n });\n await new Promise<void>((resolve, reject) => {\n child.on(\"exit\", (code) => {\n if (code === 0) resolve();\n else reject(new AspError(`qwenpaw exited with code ${code ?? 1}`, { code: \"QWENPAW_FAILED\" }));\n });\n child.on(\"error\", reject);\n });\n}\n\nasync function uploadZipToSignedUrl(upload: {\n url: string;\n method?: string;\n headers?: Record<string, string>;\n}, fileBuffer: Buffer): Promise<void> {\n const response = await fetch(upload.url, {\n method: upload.method ?? \"PUT\",\n headers: upload.headers ?? {},\n body: fileBuffer,\n });\n if (!response.ok) {\n throw new AspError(`Upload failed with HTTP ${response.status}`, {\n code: \"UPLOAD_FAILED\",\n statusCode: response.status,\n });\n }\n}\n\nfunction buildZipBody(\n filePath: string,\n fileBuffer: Buffer,\n sha512: string,\n opts: PublishOptions & { category: SkillCategory },\n): Record<string, unknown> {\n const body = appendOptionalArtifactFields(\n {\n artifact_type: \"skill\",\n package_source: \"zip\",\n category: opts.category,\n tags: parseTags(opts.tags),\n filename: basename(filePath),\n size_bytes: fileBuffer.byteLength,\n sha512,\n publish_mode: opts.publishMode ?? \"auto_after_scan\",\n client: {\n name: \"agentscope-platform-cli\",\n version: CLI_VERSION,\n },\n },\n {\n artifactId: opts.artifactId,\n version: opts.version,\n repoUrl: opts.repoUrl,\n },\n );\n return body;\n}\n\nfunction buildUrlBody(opts: PublishOptions & { category: SkillCategory }): Record<string, unknown> {\n return appendOptionalArtifactFields(\n {\n artifact_type: \"skill\",\n package_source: \"url\",\n source_url: opts.url,\n category: opts.category,\n tags: parseTags(opts.tags),\n publish_mode: opts.publishMode ?? \"auto_after_scan\",\n client: {\n name: \"agentscope-platform-cli\",\n version: CLI_VERSION,\n },\n },\n {\n artifactId: opts.artifactId,\n version: opts.version,\n repoUrl: opts.repoUrl,\n },\n );\n}\n\nfunction parseCategory(inputValue: string | undefined): SkillCategory | undefined {\n if (!inputValue) return undefined;\n const normalized = inputValue.trim().toLowerCase();\n if (SKILL_CATEGORY_OPTIONS.some((item) => item.value === normalized)) {\n return normalized as SkillCategory;\n }\n return undefined;\n}\n\nasync function resolvePublishCategory(\n opts: PublishOptions,\n jsonOutput: boolean,\n): Promise<SkillCategory> {\n const fromArg = parseCategory(opts.category);\n if (fromArg) return fromArg;\n\n if (opts.category && !fromArg) {\n throw new AspError(`Invalid --category: ${opts.category}`, {\n code: \"INVALID_REQUEST\",\n hint: `Use one of: ${SKILL_CATEGORY_OPTIONS.map((item) => item.value).join(\", \")}`,\n });\n }\n\n if (jsonOutput || !input.isTTY || !output.isTTY) {\n throw new AspError(\"Skill publish requires --category.\", {\n code: \"INVALID_REQUEST\",\n hint: `Use --category with one of: ${SKILL_CATEGORY_OPTIONS.map((item) => item.value).join(\", \")}`,\n });\n }\n\n printInfo(\"Select skill category:\");\n for (const [index, item] of SKILL_CATEGORY_OPTIONS.entries()) {\n printInfo(`${index + 1}) ${item.value} - ${item.label}`);\n }\n\n const rl = createInterface({ input, output });\n try {\n while (true) {\n const answer = (await rl.question(\"Enter category number or value: \")).trim();\n const index = Number.parseInt(answer, 10);\n if (!Number.isNaN(index) && index >= 1 && index <= SKILL_CATEGORY_OPTIONS.length) {\n const selected = SKILL_CATEGORY_OPTIONS[index - 1].value;\n printInfo(`Selected category: ${selected}`);\n return selected;\n }\n const byValue = parseCategory(answer);\n if (byValue) {\n printInfo(`Selected category: ${byValue}`);\n return byValue;\n }\n printWarn(`Invalid choice. Use 1-${SKILL_CATEGORY_OPTIONS.length} or category value.`);\n }\n } finally {\n rl.close();\n }\n}\n\nasync function resolvePublishVersion(jsonOutput: boolean): Promise<string> {\n if (jsonOutput || !input.isTTY || !output.isTTY) {\n throw new AspError(\"Skill publish requires version.\", {\n code: \"INVALID_REQUEST\",\n hint: \"Add `version: 1.0.0` to SKILL.md frontmatter, or pass --version 1.0.0.\",\n });\n }\n\n const rl = createInterface({ input, output });\n try {\n while (true) {\n const answer = (await rl.question(\"Enter skill version (e.g. 1.0.0): \")).trim();\n if (answer) {\n printInfo(`Using version: ${answer}`);\n return answer;\n }\n printWarn(\"Version is required. Example: 1.0.0\");\n }\n } finally {\n rl.close();\n }\n}\n\nfunction isMissingVersionError(err: unknown): boolean {\n if (!(err instanceof AspError)) return false;\n if (err.code !== \"INVALID_REQUEST\") return false;\n const message = `${err.message} ${err.hint ?? \"\"}`.toLowerCase();\n return message.includes(\"version\") || message.includes(\"skill.md\");\n}\n\nfunction printSkillManifestPreview(manifest: SkillManifest | undefined, jsonOutput: boolean): void {\n if (jsonOutput || !manifest) return;\n if (manifest.name) {\n printInfo(`Package skill id: ${manifest.name}`);\n }\n if (manifest.version) {\n printInfo(`Package version: ${manifest.version}`);\n }\n}\n\nfunction validateExplicitSkillOverrides(\n opts: PublishOptions,\n manifest: SkillManifest | undefined,\n): void {\n if (opts.artifactId && manifest?.name && opts.artifactId !== manifest.name) {\n throw new AspError(\n `artifact_id mismatch: --artifact-id=${opts.artifactId}, SKILL.md name=${manifest.name}`,\n {\n code: \"ARTIFACT_ID_MISMATCH\",\n hint: \"Remove --artifact-id or fix the value to match SKILL.md.\",\n },\n );\n }\n if (opts.version && manifest?.version && opts.version !== manifest.version) {\n throw new AspError(\n `version mismatch: --version=${opts.version}, SKILL.md version=${manifest.version}`,\n {\n code: \"VERSION_MISMATCH\",\n hint: \"Remove --version or fix the value to match SKILL.md.\",\n },\n );\n }\n}\n\nfunction resolveSkillPublishFields(\n opts: PublishOptions & { category: SkillCategory },\n manifest: SkillManifest | undefined,\n): PublishOptions & { category: SkillCategory } {\n return {\n ...opts,\n artifactId: opts.artifactId ?? manifest?.name,\n version: opts.version ?? manifest?.version,\n };\n}\n\nfunction isMissingCategoryError(err: unknown): boolean {\n if (!(err instanceof AspError)) return false;\n if (err.code !== \"INVALID_REQUEST\") return false;\n const message = `${err.message} ${err.hint ?? \"\"}`.toLowerCase();\n return message.includes(\"category\") || message.includes(\"技术类型\") || message.includes(\"大类\");\n}\n\nfunction tryParseSkillIdFromUrl(urlValue: string | undefined): string | undefined {\n if (!urlValue) return undefined;\n try {\n const parsed = new URL(urlValue);\n const segments = parsed.pathname\n .split(\"/\")\n .map((item) => item.trim())\n .filter(Boolean);\n const skillsIdx = segments.findIndex((item) => item.toLowerCase() === \"skills\");\n if (skillsIdx >= 0 && segments[skillsIdx + 1]) {\n return segments[skillsIdx + 1];\n }\n const last = segments[segments.length - 1];\n if (last?.toLowerCase().endsWith(\".zip\")) {\n return last.replace(/-\\d+\\.\\d+\\.\\d+.*\\.zip$/i, \"\").replace(/\\.zip$/i, \"\");\n }\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nasync function showPublishedSkillStatus(\n client: CliApiClient,\n skillId: string,\n jsonOutput: boolean,\n): Promise<void> {\n try {\n const info = await client.getSkillInfo(skillId);\n if (jsonOutput) {\n printJson({\n skill_id: info.skill_id,\n status: \"published\",\n terminal: true,\n latest_version: info.latest_version,\n scan_status: info.scan_status,\n public_url: info.public_url,\n install_command: info.install_command,\n });\n return;\n }\n\n printInfo(`Skill: ${info.skill_id}`);\n printInfo(\"Status: published\");\n printInfo(\"Terminal: yes\");\n if (info.latest_version) printInfo(`Version: ${info.latest_version}`);\n if (info.scan_status) printInfo(`Scan: ${info.scan_status}`);\n if (info.public_url) printInfo(`URL: ${info.public_url}`);\n if (info.install_command) printInfo(`Install: ${info.install_command}`);\n } catch (err) {\n if (err instanceof AspError && err.statusCode === 404) {\n throw new AspError(`No submission or published skill found: ${skillId}`, {\n code: \"NOT_FOUND\",\n hint:\n \"If the skill is still scanning, use submission_id from publish output. \" +\n \"Republish on this machine to cache skill_id mapping locally.\",\n });\n }\n throw err;\n }\n}\n\nasync function runPublish(\n getConfig: () => ResolvedConfig,\n zipPath: string | undefined,\n opts: PublishOptions,\n): Promise<void> {\n const base = getConfig();\n const { config } = await requireCredentials(base, base.platformUrl);\n const client = new CliApiClient(config);\n let publishOpts: PublishOptions & { category: SkillCategory };\n try {\n const category = await resolvePublishCategory(opts, base.json);\n publishOpts = { ...opts, category };\n } catch (err) {\n if (!isMissingCategoryError(err)) throw err;\n const category = await resolvePublishCategory({ ...opts, category: undefined }, base.json);\n publishOpts = { ...opts, category };\n }\n\n const useUrlMode = Boolean(opts.url);\n if (useUrlMode && zipPath) {\n const suffix = envCommandSuffix(config.platformUrl);\n throw new AspError(\"Do not pass zip path when using --url.\", {\n code: \"INVALID_REQUEST\",\n hint:\n `Use either \\`asp skill publish ./skill.zip${suffix}\\` or ` +\n `\\`asp skill publish --url <url>${suffix}\\`.`,\n });\n }\n if (!useUrlMode && !zipPath) {\n const suffix = envCommandSuffix(config.platformUrl);\n throw new AspError(\"Zip path is required unless --url is provided.\", {\n code: \"INVALID_REQUEST\",\n hint: `Use \\`asp skill publish ./skill.zip${suffix}\\`.`,\n });\n }\n\n const manifest = useUrlMode ? undefined : await readSkillManifestFromZip(zipPath);\n printSkillManifestPreview(manifest, base.json);\n validateExplicitSkillOverrides(publishOpts, manifest);\n publishOpts = resolveSkillPublishFields(publishOpts, manifest);\n if (!publishOpts.version) {\n publishOpts.version = await resolvePublishVersion(base.json);\n }\n\n let submission: CliSubmissionResponse;\n const tryCreateSubmission = async (): Promise<CliSubmissionResponse> => {\n if (useUrlMode) {\n return client.createArtifactSubmission(buildUrlBody(publishOpts));\n }\n const fileBuffer = await readFile(zipPath as string);\n const sha512 = createHash(\"sha512\").update(fileBuffer).digest(\"hex\");\n let localSubmission = await client.createArtifactSubmission(\n buildZipBody(zipPath as string, fileBuffer, sha512, publishOpts),\n );\n if (!localSubmission.upload?.url) {\n throw new AspError(\"Missing upload URL for zip submission.\", {\n code: \"UPLOAD_URL_MISSING\",\n });\n }\n await uploadZipToSignedUrl(localSubmission.upload, fileBuffer);\n localSubmission = await client.completeArtifactSubmission(localSubmission.submission_id, {\n sha512,\n size_bytes: fileBuffer.byteLength,\n });\n return localSubmission;\n };\n\n try {\n submission = await tryCreateSubmission();\n } catch (err) {\n if (isMissingVersionError(err)) {\n if (base.json || !input.isTTY || !output.isTTY) {\n throw new AspError(\"SKILL.md in zip is missing version.\", {\n code: \"INVALID_REQUEST\",\n hint:\n \"Add `version: 1.0.0` to SKILL.md frontmatter (between --- markers), \" +\n \"or pass --version 1.0.0.\",\n });\n }\n printWarn(\"Publish failed due to missing version, please enter one and retrying...\");\n publishOpts.version = await resolvePublishVersion(base.json);\n submission = await tryCreateSubmission();\n } else if (!isMissingCategoryError(err) || base.json || !input.isTTY || !output.isTTY) {\n throw err;\n } else {\n printWarn(\"Publish failed due to missing category, please choose one and retrying...\");\n const category = await resolvePublishCategory({ ...opts, category: undefined }, base.json);\n publishOpts = { ...publishOpts, category };\n submission = await tryCreateSubmission();\n }\n }\n\n const urlSkillId = useUrlMode ? tryParseSkillIdFromUrl(publishOpts.url) : undefined;\n await recordSkillPublish({\n submissionId: submission.submission_id,\n platformUrl: config.platformUrl,\n skillId: publishOpts.artifactId ?? urlSkillId,\n sourceUrl: useUrlMode ? publishOpts.url : undefined,\n });\n\n if (base.json) {\n printJson(submission);\n return;\n }\n\n printSuccess(`Submission created: ${submission.submission_id}`);\n printInfo(`Initial status: ${submission.status}`);\n const trackRef =\n publishOpts.artifactId ?? urlSkillId ?? submission.submission_id;\n\n if (opts.noWait) {\n const envSuffix = envCommandSuffix(config.platformUrl);\n printInfo(`Track progress: asp skill publish status ${trackRef}${envSuffix}`);\n printInfo(`Show logs: asp skill publish logs ${trackRef}${envSuffix}`);\n return;\n }\n\n if (!submission.terminal) {\n printSuccess(\"Upload submitted successfully. Scanning continues asynchronously.\");\n const envSuffix = envCommandSuffix(config.platformUrl);\n printInfo(`Track progress: asp skill publish status ${trackRef} --watch${envSuffix}`);\n printInfo(`Show logs: asp skill publish logs ${trackRef}${envSuffix}`);\n return;\n }\n\n if (submission.status === \"published\") {\n printSuccess(`Published successfully (${formatPlatformLabel(config.platformUrl)})`);\n if (submission.publish?.public_url) {\n printInfo(`URL: ${submission.publish.public_url}`);\n }\n return;\n }\n\n printWarn(`Submission ended with status: ${submission.status}`);\n if (submission.failure?.message) {\n printWarn(`Failure: ${submission.failure.message}`);\n }\n const envSuffix = envCommandSuffix(config.platformUrl);\n printInfo(`Inspect logs: asp skill publish logs ${trackRef}${envSuffix}`);\n}\n\nasync function runPublishStatus(\n getConfig: () => ResolvedConfig,\n skillRef: string,\n opts: PublishStatusOptions,\n): Promise<void> {\n const base = getConfig();\n const { config } = await requireCredentials(base, base.platformUrl);\n const client = new CliApiClient(config);\n\n if (looksLikeSubmissionId(skillRef)) {\n const state = opts.watch\n ? await pollUntilTerminal(client, skillRef, true)\n : await client.getArtifactSubmission(skillRef);\n if (base.json) {\n printJson(state);\n return;\n }\n printInfo(`Submission: ${state.submission_id}`);\n printInfo(`Status: ${state.status}`);\n printInfo(`Terminal: ${state.terminal ? \"yes\" : \"no\"}`);\n if (state.scan?.status) printInfo(`Scan: ${state.scan.status}`);\n if (state.publish?.public_url) printInfo(`URL: ${state.publish.public_url}`);\n if (state.failure?.message) printWarn(`Failure: ${state.failure.message}`);\n return;\n }\n\n const submissionId = await resolveSkillSubmissionId(client, skillRef, config.platformUrl);\n if (!submissionId) {\n await showPublishedSkillStatus(client, skillRef, base.json);\n return;\n }\n\n if (!base.json) {\n printInfo(`Resolved skill id \"${skillRef}\" -> submission ${submissionId}`);\n }\n\n const current = await client.getArtifactSubmission(submissionId);\n if (current.terminal && current.status === \"published\") {\n await showPublishedSkillStatus(client, skillRef, base.json);\n return;\n }\n\n const state = opts.watch\n ? await pollUntilTerminal(client, submissionId, true)\n : current;\n\n if (base.json) {\n printJson(state);\n return;\n }\n\n printInfo(`Submission: ${state.submission_id}`);\n printInfo(`Status: ${state.status}`);\n printInfo(`Terminal: ${state.terminal ? \"yes\" : \"no\"}`);\n if (state.scan?.status) printInfo(`Scan: ${state.scan.status}`);\n if (state.publish?.public_url) printInfo(`URL: ${state.publish.public_url}`);\n if (state.failure?.message) printWarn(`Failure: ${state.failure.message}`);\n}\n\nasync function runPublishLogs(\n getConfig: () => ResolvedConfig,\n skillRef: string,\n): Promise<void> {\n const base = getConfig();\n const { config } = await requireCredentials(base, base.platformUrl);\n const client = new CliApiClient(config);\n const submissionId = await resolveSkillSubmissionId(client, skillRef, config.platformUrl);\n if (!submissionId) {\n throw new AspError(`No publish logs found for skill id: ${skillRef}`, {\n code: \"NOT_FOUND\",\n hint:\n \"Use submission_id from publish output, or republish on this machine to cache the mapping.\",\n });\n }\n if (submissionId !== skillRef && !base.json) {\n printInfo(`Resolved skill id \"${skillRef}\" -> submission ${submissionId}`);\n }\n const logs = await client.getArtifactSubmissionLogs(submissionId);\n\n if (base.json) {\n printJson(logs);\n return;\n }\n\n if (logs.items.length === 0) {\n printInfo(\"No logs yet.\");\n return;\n }\n const rows = logs.items.map((item) => [item.timestamp, item.level, item.message]);\n printTable([\"timestamp\", \"level\", \"message\"], rows);\n}\n\nexport function registerSkillCommands(program: Command, getConfig: () => ResolvedConfig): void {\n const skill = program.command(\"skill\").description(\"Skill marketplace and publish commands\");\n\n skill\n .command(\"search [query]\")\n .description(\"Search skills\")\n .option(\"--category <code>\", \"Skill category code\")\n .option(\"--source <source>\", \"official | verified | community\")\n .option(\"--tag <tag>\", \"Tag filter\")\n .option(\"--sort <sort>\", \"recommended | downloads | updated_at\")\n .option(\"--page-size <n>\", \"Page size\", (v) => Number.parseInt(v, 10))\n .option(\"--cursor <cursor>\", \"Cursor for next page\")\n .action(async (query: string | undefined, opts: SearchOptions) => {\n await runSearch(getConfig, query, opts);\n });\n\n skill\n .command(\"info <skillId>\")\n .description(\"Show skill details\")\n .option(\"--version <version>\", \"Specify version\")\n .action(async (skillId: string, opts: InfoOptions) => {\n await runInfo(getConfig, skillId, opts);\n });\n\n skill\n .command(\"versions <skillId>\")\n .description(\"List published versions\")\n .action(async (skillId: string) => {\n await runVersions(getConfig, skillId);\n });\n\n skill\n .command(\"install <skillId>\")\n .description(\"Install skill via qwenpaw\")\n .option(\"--version <version>\", \"Specify version\")\n .option(\"--via <tool>\", \"Install tool (qwenpaw)\", \"qwenpaw\")\n .action(async (skillId: string, opts: InstallOptions) => {\n await runInstall(getConfig, skillId, opts);\n });\n\n const publish = skill\n .command(\"publish [zipPath]\")\n .description(\"Publish skill from local zip or URL\")\n .option(\"--url <url>\", \"Publish from remote zip URL\")\n .option(\"--artifact-id <id>\", \"Optional skill id override (must match SKILL.md in zip mode)\")\n .option(\"--version <version>\", \"Skill version (prompted if SKILL.md has no version)\")\n .option(\n \"--category <code>\",\n \"Skill category code (engineering development|data research|document office|design creation|automation integration|product management|marketing growth|security compliance|education knowledge|plugin development|skills management|others)\",\n )\n .option(\"--tags <csv>\", \"Optional tags, comma-separated, max 3\")\n .option(\"--repo-url <url>\", \"Repository URL\")\n .option(\"--publish-mode <mode>\", \"Publish mode\", \"auto_after_scan\")\n .option(\"--no-wait\", \"Do not wait for terminal status\")\n .action(async (zipPath: string | undefined, opts: PublishOptions) => {\n await runPublish(getConfig, zipPath, opts);\n });\n\n publish\n .command(\"status <skillId>\")\n .description(\"Show publish status by skill id or submission id\")\n .option(\"--watch\", \"Poll until terminal status\", false)\n .action(async (skillId: string, opts: PublishStatusOptions) => {\n await runPublishStatus(getConfig, skillId, opts);\n });\n\n publish\n .command(\"logs <skillId>\")\n .description(\"Show publish logs by skill id or submission id\")\n .action(async (skillId: string) => {\n await runPublishLogs(getConfig, skillId);\n });\n}\n","import { spawn } from \"node:child_process\";\n\nexport interface SkillManifest {\n name?: string;\n version?: string;\n}\n\nasync function runCommand(command: string, args: string[]): Promise<string> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n let stdout = \"\";\n let stderr = \"\";\n child.stdout.on(\"data\", (chunk: Buffer) => {\n stdout += chunk.toString();\n });\n child.stderr.on(\"data\", (chunk: Buffer) => {\n stderr += chunk.toString();\n });\n child.on(\"error\", reject);\n child.on(\"close\", (code) => {\n if (code === 0) resolve(stdout);\n else reject(new Error(stderr || `Command failed: ${command} ${args.join(\" \")}`));\n });\n });\n}\n\nfunction parseSkillFrontmatter(content: string): SkillManifest {\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (!match) return {};\n\n const yaml = match[1];\n const manifest: SkillManifest = {};\n\n const nameMatch = yaml.match(/^name:\\s*[\"']?([^\"'\\n]+)[\"']?\\s*$/m);\n if (nameMatch) manifest.name = nameMatch[1].trim();\n\n const versionMatch = yaml.match(/^version:\\s*[\"']?([^\"'\\n]+)[\"']?\\s*$/m);\n if (versionMatch) {\n manifest.version = versionMatch[1].trim();\n return manifest;\n }\n\n const metadataVersionMatch = yaml.match(/^\\s+version:\\s*[\"']?([^\"'\\n]+)[\"']?\\s*$/m);\n if (metadataVersionMatch) {\n manifest.version = metadataVersionMatch[1].trim();\n }\n\n return manifest;\n}\n\nasync function findSkillMdPathInZip(zipPath: string): Promise<string | undefined> {\n const listing = await runCommand(\"unzip\", [\"-Z1\", zipPath]);\n const paths = listing\n .split(\"\\n\")\n .map((item) => item.trim())\n .filter(Boolean);\n const matches = paths.filter((item) => /(^|\\/)SKILL\\.md$/i.test(item));\n if (matches.length === 0) return undefined;\n return matches.sort((a, b) => a.length - b.length)[0];\n}\n\nexport async function readSkillManifestFromZip(\n zipPath: string | undefined,\n): Promise<SkillManifest | undefined> {\n if (!zipPath) return undefined;\n\n try {\n const skillMdPath = await findSkillMdPathInZip(zipPath);\n if (!skillMdPath) return undefined;\n const stdout = await runCommand(\"unzip\", [\"-p\", zipPath, skillMdPath]);\n return parseSkillFrontmatter(stdout);\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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","names":["getConfig","program","createHash","readFile","createInterface","input","output","getConfig","input","output","createInterface","readFile","createHash","envSuffix","state","program","basename","createHash","readFile","spawn","createInterface","input","output","spawn","runCommand","getClient","getConfig","runSearch","runInfo","runVersions","runInstall","spawn","uploadZipToSignedUrl","buildZipBody","basename","buildUrlBody","parseCategory","resolvePublishCategory","input","output","createInterface","isMissingCategoryError","runPublish","readFile","createHash","envSuffix","runPublishStatus","state","runPublishLogs","program"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/utils/errors.ts","../src/utils/platform.ts","../src/auth/session.ts","../src/api/client.ts","../src/api/cli-api.ts","../src/auth/browser-login.ts","../src/auth/pkce.ts","../src/utils/output.ts","../src/utils/prompt.ts","../src/commands/auth.ts","../src/commands/plugin.ts","../src/utils/artifact-publish.ts","../src/utils/publish-registry.ts","../src/utils/submission-resolve.ts","../src/utils/submission-poll.ts","../src/utils/marketplace-display.ts","../src/commands/skill.ts","../src/utils/skill-manifest.ts"],"sourcesContent":["import { Command, Option } from \"commander\";\nimport { CLI_VERSION } from \"./constants.js\";\nimport { resolveConfig, type GlobalOptions } from \"./config.js\";\nimport { registerAuthCommands } from \"./commands/auth.js\";\nimport { registerPluginCommands } from \"./commands/plugin.js\";\nimport { registerSkillCommands } from \"./commands/skill.js\";\nimport { AspError } from \"./utils/errors.js\";\nimport { printError } from \"./utils/output.js\";\n\nconst globalOpts: GlobalOptions = {};\n\nfunction preprocessArgv(argv: string[]): { argv: string[]; pre: boolean } {\n const args = [...argv];\n let pre = false;\n if (args.length >= 4 && args[args.length - 1] === \"pre\") {\n pre = true;\n args.pop();\n }\n return { argv: args, pre };\n}\n\nconst { argv: cliArgv, pre: trailingPre } = preprocessArgv(process.argv);\n\nconst program = new Command()\n .name(\"asp\")\n .description(\"AgentScope Platform CLI\")\n .version(CLI_VERSION)\n .option(\"--platform-url <url>\", \"Custom Platform base URL (advanced)\")\n .addOption(new Option(\"--pre\").hideHelp())\n .option(\"--token <token>\", \"Access token (overrides stored credentials)\")\n .option(\"-v, --verbose\", \"Verbose logging\")\n .option(\"--json\", \"Output JSON\")\n .hook(\"preAction\", (thisCommand) => {\n const opts = thisCommand.opts();\n globalOpts.platformUrl = opts.platformUrl;\n globalOpts.pre = opts.pre || trailingPre;\n globalOpts.token = opts.token;\n globalOpts.verbose = opts.verbose;\n globalOpts.json = opts.json;\n });\n\nconst getConfig = () => resolveConfig(globalOpts);\n\nregisterAuthCommands(program, getConfig);\nregisterPluginCommands(program, getConfig);\nregisterSkillCommands(program, getConfig);\n\nasync function main(): Promise<void> {\n try {\n await program.parseAsync(cliArgv);\n } catch (err) {\n if (err instanceof AspError) {\n printError(`${err.message} [${err.code}]`);\n if (err.hint) printError(`Hint: ${err.hint}`);\n if (err.requestId) printError(`Request ID: ${err.requestId}`);\n process.exit(err.exitCode);\n }\n if (err instanceof Error) {\n printError(err.message);\n if (globalOpts.verbose && err.stack) console.error(err.stack);\n process.exit(1);\n }\n throw err;\n }\n}\n\nmain();\n","export interface ApiErrorBody {\n request_id?: string;\n error: {\n code: string;\n message: string;\n hint?: string;\n };\n}\n\nexport class AspError extends Error {\n readonly code: string;\n readonly hint?: string;\n readonly requestId?: string;\n readonly statusCode?: number;\n readonly exitCode: number;\n\n constructor(\n message: string,\n options: {\n code?: string;\n hint?: string;\n requestId?: string;\n statusCode?: number;\n exitCode?: number;\n cause?: unknown;\n } = {},\n ) {\n super(message, { cause: options.cause });\n this.name = \"AspError\";\n this.code = options.code ?? \"UNKNOWN\";\n this.hint = options.hint;\n this.requestId = options.requestId;\n this.statusCode = options.statusCode;\n this.exitCode = options.exitCode ?? 1;\n }\n\n static fromResponse(status: number, body: unknown): AspError {\n const parsed = body as Partial<ApiErrorBody> & {\n error?: ApiErrorBody[\"error\"] & { detail?: string };\n };\n if (parsed?.error) {\n const exitCode = mapErrorCodeToExit(parsed.error.code, status);\n let hint = parsed.error.hint ?? parsed.error.detail;\n if (parsed.error.code === \"ASP.COMM.NOT_FOUND\") {\n hint = hint ?? \"The API endpoint is not available on this Platform environment.\";\n }\n return new AspError(parsed.error.message, {\n code: parsed.error.code,\n hint,\n requestId: parsed.request_id,\n statusCode: status,\n exitCode,\n });\n }\n return new AspError(`HTTP ${status}`, {\n code: \"HTTP_ERROR\",\n statusCode: status,\n exitCode: status >= 500 ? 2 : 1,\n });\n }\n}\n\nfunction mapErrorCodeToExit(code: string, status: number): number {\n if (\n code === \"UNAUTHORIZED\" ||\n code === \"UNAUTHENTICATED\" ||\n code === \"ASP.AUTH.UNAUTHORIZED\" ||\n code === \"ASP.AUTH.SESSION_INVALID\" ||\n code === \"SESSION_INVALID\"\n ) {\n return 3;\n }\n if (code === \"FORBIDDEN\") return 4;\n if (status >= 500) return 2;\n return 1;\n}\n\nexport function maskSecrets(text: string): string {\n return text\n .replace(/Bearer\\s+[A-Za-z0-9._-]+/gi, \"Bearer [REDACTED]\")\n .replace(/\"access_token\"\\s*:\\s*\"[^\"]+\"/gi, '\"access_token\":\"[REDACTED]\"')\n .replace(/\"refresh_token\"\\s*:\\s*\"[^\"]+\"/gi, '\"refresh_token\":\"[REDACTED]\"')\n .replace(/\"token\"\\s*:\\s*\"[^\"]+\"/gi, '\"token\":\"[REDACTED]\"');\n}\n","import { PLATFORM_URL, PRE_PLATFORM_URL } from \"../constants.js\";\nimport type { ResolvedConfig } from \"../config.js\";\nimport { loadCredentials, type StoredCredentials } from \"../auth/credentials.js\";\nimport { AspError } from \"./errors.js\";\n\nexport type PlatformEnv = \"default\" | \"pre\" | \"custom\";\n\nexport function detectPlatformEnv(url: string): PlatformEnv {\n const normalized = url.replace(/\\/$/, \"\");\n if (normalized === PLATFORM_URL) return \"default\";\n if (normalized === PRE_PLATFORM_URL) return \"pre\";\n return \"custom\";\n}\n\nexport function formatPlatformLabel(url: string): string {\n const env = detectPlatformEnv(url);\n if (env === \"default\") return `platform (${PLATFORM_URL})`;\n if (env === \"pre\") return `pre (${PRE_PLATFORM_URL})`;\n return url;\n}\n\nexport function envCommandSuffix(platformUrl: string): string {\n return detectPlatformEnv(platformUrl) === \"pre\" ? \" pre\" : \"\";\n}\n\nexport function loginCommandHint(platformUrl: string): string {\n return `Run \\`asp auth login${envCommandSuffix(platformUrl)}\\`.`;\n}\n\nexport function withPlatformUrl(config: ResolvedConfig, platformUrl: string): ResolvedConfig {\n return { ...config, platformUrl: platformUrl.replace(/\\/$/, \"\") };\n}\n\nexport async function requireCredentials(\n config: ResolvedConfig,\n targetPlatformUrl: string,\n): Promise<{ config: ResolvedConfig; creds: StoredCredentials }> {\n if (config.token) {\n return {\n config: withPlatformUrl(config, targetPlatformUrl),\n creds: {\n access_token: config.token,\n token_type: \"Bearer\",\n platform_url: targetPlatformUrl,\n },\n };\n }\n\n const creds = await loadCredentials(targetPlatformUrl);\n if (!creds?.access_token) {\n throw new AspError(\"Not logged in.\", {\n code: \"UNAUTHORIZED\",\n hint: loginCommandHint(targetPlatformUrl),\n exitCode: 3,\n });\n }\n\n const credsUrl = creds.platform_url.replace(/\\/$/, \"\");\n const targetUrl = targetPlatformUrl.replace(/\\/$/, \"\");\n if (credsUrl !== targetUrl) {\n const loggedIn = formatPlatformLabel(credsUrl);\n const target = formatPlatformLabel(targetUrl);\n throw new AspError(`Credential environment mismatch: logged in to ${loggedIn}, command targets ${target}.`, {\n code: \"ENV_MISMATCH\",\n hint: loginCommandHint(targetUrl),\n exitCode: 1,\n });\n }\n\n return {\n config: withPlatformUrl(config, targetUrl),\n creds,\n };\n}\n","import type { ResolvedConfig } from \"../config.js\";\nimport { CliApiClient, type TokenResponse } from \"../api/cli-api.js\";\nimport {\n credentialsFromTokenResponse,\n saveCredentials,\n type StoredCredentials,\n} from \"./credentials.js\";\nimport { AspError } from \"../utils/errors.js\";\nimport { loginCommandHint } from \"../utils/platform.js\";\n\nexport function isSessionInvalidError(err: unknown): boolean {\n if (!(err instanceof AspError)) return false;\n return err.code === \"ASP.AUTH.SESSION_INVALID\" || err.code === \"SESSION_INVALID\";\n}\n\nexport async function refreshStoredSession(\n config: ResolvedConfig,\n refreshToken: string,\n platformUrl: string,\n): Promise<StoredCredentials> {\n const client = new CliApiClient({\n ...config,\n token: undefined,\n platformUrl: platformUrl.replace(/\\/$/, \"\"),\n });\n const refreshed = await client.refresh(refreshToken);\n const creds = credentialsFromTokenResponse(platformUrl, refreshed);\n await saveCredentials(creds);\n return creds;\n}\n\n/** Login 返回的 access_token 需先 refresh 才能访问 /me */\nexport async function finalizeLogin(\n config: ResolvedConfig,\n loginResponse: TokenResponse,\n): Promise<StoredCredentials> {\n if (!loginResponse.refresh_token) {\n const creds = credentialsFromTokenResponse(config.platformUrl, loginResponse);\n await saveCredentials(creds);\n return creds;\n }\n\n try {\n return await refreshStoredSession(\n config,\n loginResponse.refresh_token,\n config.platformUrl,\n );\n } catch {\n const creds = credentialsFromTokenResponse(config.platformUrl, loginResponse);\n await saveCredentials(creds);\n return creds;\n }\n}\n\nexport async function ensureValidSession(config: ResolvedConfig): Promise<StoredCredentials> {\n const { loadCredentials, isTokenExpired } = await import(\"./credentials.js\");\n const creds = await loadCredentials(config.platformUrl);\n if (!creds) {\n throw new AspError(\"Not logged in.\", {\n code: \"UNAUTHORIZED\",\n hint: loginCommandHint(config.platformUrl),\n exitCode: 3,\n });\n }\n\n if (!isTokenExpired(creds) && creds.access_token) {\n return creds;\n }\n\n if (!creds.refresh_token) {\n throw new AspError(\"Session expired.\", {\n code: \"ASP.AUTH.SESSION_INVALID\",\n hint: loginCommandHint(config.platformUrl),\n exitCode: 3,\n });\n }\n\n return refreshStoredSession(config, creds.refresh_token, creds.platform_url);\n}\n","import { AspError, maskSecrets } from \"../utils/errors.js\";\nimport type { ResolvedConfig } from \"../config.js\";\nimport {\n loadCredentials,\n isTokenExpired,\n type StoredCredentials,\n} from \"../auth/credentials.js\";\nimport { refreshStoredSession, isSessionInvalidError } from \"../auth/session.js\";\n\nexport interface RequestOptions {\n method?: string;\n path: string;\n body?: unknown;\n headers?: Record<string, string>;\n auth?: boolean;\n prefix?: string;\n _retried?: boolean;\n}\n\nexport class HttpClient {\n constructor(private readonly config: ResolvedConfig) {}\n\n async request<T>(opts: RequestOptions): Promise<T> {\n try {\n return await this.doRequest<T>(opts);\n } catch (err) {\n if (\n opts.auth !== false &&\n !opts._retried &&\n isSessionInvalidError(err) &&\n !this.config.token\n ) {\n const creds = await loadCredentials(this.config.platformUrl);\n if (creds?.refresh_token) {\n await refreshStoredSession(configWithPlatform(this.config, creds), creds.refresh_token, creds.platform_url);\n return this.doRequest<T>({ ...opts, _retried: true });\n }\n }\n throw err;\n }\n }\n\n private async doRequest<T>(opts: RequestOptions): Promise<T> {\n const creds = opts.auth !== false && !this.config.token\n ? await loadCredentials(this.config.platformUrl)\n : null;\n const platformUrl = creds?.platform_url ?? this.config.platformUrl;\n const prefix = opts.prefix ?? \"\";\n const url = `${platformUrl}${prefix}${opts.path}`;\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n ...opts.headers,\n };\n\n if (opts.body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n\n if (opts.auth !== false) {\n const token = await this.resolveAccessToken(creds);\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n }\n\n if (this.config.verbose) {\n console.error(`[verbose] ${opts.method ?? \"GET\"} ${url}`);\n if (opts.body) console.error(maskSecrets(JSON.stringify(opts.body)));\n }\n\n const res = await fetch(url, {\n method: opts.method ?? \"GET\",\n headers,\n body: opts.body !== undefined ? JSON.stringify(opts.body) : undefined,\n });\n\n const text = await res.text();\n let data: unknown = {};\n if (text) {\n try {\n data = JSON.parse(text);\n } catch {\n data = { raw: text };\n }\n }\n\n if (this.config.verbose) {\n console.error(`[verbose] ${res.status}`, maskSecrets(text.slice(0, 2000)));\n }\n\n if (!res.ok) {\n throw AspError.fromResponse(res.status, data);\n }\n\n return data as T;\n }\n\n async resolveAccessToken(existing?: StoredCredentials | null): Promise<string | undefined> {\n if (this.config.token) return this.config.token;\n\n const creds = existing ?? (await loadCredentials(this.config.platformUrl));\n if (!creds) return undefined;\n\n if (isTokenExpired(creds) && creds.refresh_token) {\n const refreshed = await refreshStoredSession(\n configWithPlatform(this.config, creds),\n creds.refresh_token,\n creds.platform_url,\n );\n return refreshed.access_token;\n }\n\n return creds.access_token;\n }\n}\n\nfunction configWithPlatform(config: ResolvedConfig, creds: StoredCredentials): ResolvedConfig {\n return { ...config, platformUrl: creds.platform_url || config.platformUrl };\n}\n","import { CLI_API_PREFIX } from \"../constants.js\";\nimport type { ResolvedConfig } from \"../config.js\";\nimport { HttpClient } from \"./client.js\";\n\nexport interface MetaResponse {\n request_id: string;\n service: string;\n api_version: string;\n platform_url: string;\n environment: string;\n min_cli_version: string;\n recommended_cli_version: string;\n features: Record<string, boolean>;\n}\n\nexport interface MeResponse {\n request_id: string;\n user_id?: string;\n account?: string;\n email?: string;\n username?: string;\n is_admin?: boolean;\n user?: {\n id: string;\n display_name?: string;\n email?: string;\n };\n scopes?: string[];\n}\n\nexport interface TokenResponse {\n request_id: string;\n access_token: string;\n refresh_token?: string;\n token_type: string;\n expires_in?: number;\n scope?: string;\n user?: {\n id: string;\n display_name?: string;\n email?: string;\n };\n}\n\n\nexport interface RequestLogItem {\n request_id?: string;\n method: string;\n path: string;\n request_body?: unknown;\n response_status?: number;\n duration_ms?: number;\n created_at: string;\n}\n\nexport interface RequestLogsResponse {\n request_id: string;\n items: RequestLogItem[];\n next_cursor?: string | null;\n}\n\nexport interface PluginListItem {\n plugin_id: string;\n name?: string;\n description?: string;\n summary?: string;\n source?: \"official\" | \"verified\" | \"community\";\n tech_type?: string;\n category?: string;\n author_display_name?: string;\n latest_version?: string;\n downloads?: number;\n public_url?: string;\n updated_at?: string;\n [key: string]: unknown;\n}\n\nexport interface PluginListResponse {\n request_id: string;\n items: PluginListItem[];\n next_cursor?: string | null;\n}\n\nexport interface PluginVersionItem {\n version: string;\n published_at?: string;\n deprecated?: boolean;\n [key: string]: unknown;\n}\n\nexport interface PluginVersionsResponse {\n request_id: string;\n plugin_id: string;\n items: PluginVersionItem[];\n}\n\nexport interface PluginInfoResponse {\n request_id: string;\n plugin_id: string;\n install_command?: string;\n public_url?: string;\n latest_version?: string;\n scan_status?: string;\n min_qwenpaw_version?: string;\n [key: string]: unknown;\n}\n\nexport interface SkillListItem {\n skill_id: string;\n skill_code?: string;\n name?: string;\n description?: string;\n summary?: string;\n category?: string;\n category_label?: string;\n source?: \"official\" | \"verified\" | \"community\";\n author_display_name?: string;\n latest_version?: string;\n downloads?: number;\n public_url?: string;\n updated_at?: string;\n [key: string]: unknown;\n}\n\nexport interface SkillListResponse {\n request_id: string;\n items: SkillListItem[];\n next_cursor?: string | null;\n}\n\nexport interface SkillVersionItem {\n version: string;\n published_at?: string;\n deprecated?: boolean;\n [key: string]: unknown;\n}\n\nexport interface SkillVersionsResponse {\n request_id: string;\n skill_id: string;\n items: SkillVersionItem[];\n}\n\nexport interface SkillInfoResponse {\n request_id: string;\n skill_id: string;\n install_command?: string;\n public_url?: string;\n latest_version?: string;\n scan_status?: string;\n [key: string]: unknown;\n}\n\nexport interface InstallIntentResponse {\n request_id: string;\n download_url: string;\n sha512?: string;\n expires_at?: string;\n signature?: string | null;\n scan_status?: string;\n version?: string;\n}\n\nexport interface CliSubmissionUpload {\n method?: string;\n url: string;\n headers?: Record<string, string>;\n expires_at?: string;\n}\n\nexport interface CliSubmissionScan {\n status?: \"queued\" | \"running\" | \"passed\" | \"failed\";\n summary?: string;\n [key: string]: unknown;\n}\n\nexport interface CliSubmissionPublish {\n status?: string;\n public_url?: string;\n [key: string]: unknown;\n}\n\nexport interface CliSubmissionFailure {\n code?: string;\n message?: string;\n}\n\nexport interface CliSubmissionResponse {\n request_id: string;\n submission_id: string;\n status:\n | \"upload_url_issued\"\n | \"queued_for_scan\"\n | \"scanning\"\n | \"published\"\n | \"scan_failed\"\n | \"upload_failed\"\n | \"expired\";\n terminal: boolean;\n upload?: CliSubmissionUpload | null;\n scan?: CliSubmissionScan | null;\n publish?: CliSubmissionPublish | null;\n failure?: CliSubmissionFailure | null;\n links?: { status?: string; logs?: string };\n next_poll_after_seconds?: number;\n}\n\nexport interface CliSubmissionLogItem {\n level: \"info\" | \"error\" | string;\n message: string;\n timestamp: string;\n}\n\nexport interface CliSubmissionLogsResponse {\n request_id: string;\n submission_id: string;\n items: CliSubmissionLogItem[];\n}\n\nexport class CliApiClient {\n private readonly http: HttpClient;\n\n constructor(config: ResolvedConfig) {\n this.http = new HttpClient(config);\n }\n\n private req<T>(opts: Parameters<HttpClient[\"request\"]>[0]): Promise<T> {\n return this.http.request<T>({ ...opts, prefix: CLI_API_PREFIX });\n }\n\n getMeta(): Promise<MetaResponse> {\n return this.req({ path: \"/meta\", auth: false });\n }\n\n getMe(): Promise<MeResponse> {\n return this.req({ path: \"/me\" });\n }\n\n login(account: string, password: string): Promise<TokenResponse> {\n return this.req({\n method: \"POST\",\n path: \"/auth/login\",\n auth: false,\n body: { account, password },\n });\n }\n\n refresh(refreshToken: string): Promise<TokenResponse> {\n return this.req({\n method: \"POST\",\n path: \"/auth/refresh\",\n auth: false,\n body: { refresh_token: refreshToken },\n });\n }\n\n oauthToken(body: Record<string, string>): Promise<TokenResponse> {\n return this.req({ method: \"POST\", path: \"/oauth/token\", auth: false, body });\n }\n\n oauthRevoke(token: string, tokenTypeHint = \"refresh_token\"): Promise<{ ok: boolean }> {\n return this.req<{ ok: boolean }>({\n method: \"POST\",\n path: \"/oauth/revoke\",\n body: { token, token_type_hint: tokenTypeHint },\n });\n }\n\n async logout(): Promise<{ ok: boolean }> {\n try {\n return await this.req<{ ok: boolean }>({ method: \"POST\", path: \"/auth/logout\" });\n } catch {\n return this.oauthRevoke(\"\", \"access_token\");\n }\n }\n\n getRequestLogs(params?: {\n page_size?: number;\n cursor?: string;\n }): Promise<RequestLogsResponse> {\n const query = new URLSearchParams();\n if (params?.page_size !== undefined) query.set(\"page_size\", String(params.page_size));\n if (params?.cursor) query.set(\"cursor\", params.cursor);\n const suffix = query.toString();\n return this.req({ path: `/request-logs${suffix ? `?${suffix}` : \"\"}` });\n }\n\n searchPlugins(params?: {\n q?: string;\n category?: string;\n source?: \"official\" | \"verified\" | \"community\";\n sort?: \"recommended\" | \"downloads\" | \"updated_at\";\n page_size?: number;\n cursor?: string;\n }): Promise<PluginListResponse> {\n const query = new URLSearchParams();\n if (params?.q) query.set(\"q\", params.q);\n if (params?.category) query.set(\"category\", params.category);\n if (params?.source) query.set(\"source\", params.source);\n if (params?.sort) query.set(\"sort\", params.sort);\n if (params?.page_size !== undefined) query.set(\"page_size\", String(params.page_size));\n if (params?.cursor) query.set(\"cursor\", params.cursor);\n const suffix = query.toString();\n return this.req({ path: `/plugins${suffix ? `?${suffix}` : \"\"}`, auth: false });\n }\n\n getPluginInfo(pluginId: string, version?: string): Promise<PluginInfoResponse> {\n const query = new URLSearchParams();\n if (version) query.set(\"version\", version);\n const suffix = query.toString();\n return this.req({\n path: `/plugins/${encodeURIComponent(pluginId)}${suffix ? `?${suffix}` : \"\"}`,\n auth: false,\n });\n }\n\n getPluginVersions(pluginId: string): Promise<PluginVersionsResponse> {\n return this.req({\n path: `/plugins/${encodeURIComponent(pluginId)}/versions`,\n auth: false,\n });\n }\n\n createInstallIntent(pluginId: string, version?: string): Promise<InstallIntentResponse> {\n return this.req({\n method: \"POST\",\n path: `/plugins/${encodeURIComponent(pluginId)}/install-intent`,\n body: version ? { version } : {},\n });\n }\n\n searchSkills(params?: {\n q?: string;\n category?: string;\n source?: \"official\" | \"verified\" | \"community\";\n tag?: string;\n sort?: \"recommended\" | \"downloads\" | \"updated_at\";\n page_size?: number;\n cursor?: string;\n }): Promise<SkillListResponse> {\n const query = new URLSearchParams();\n if (params?.q) query.set(\"q\", params.q);\n if (params?.category) query.set(\"category\", params.category);\n if (params?.source) query.set(\"source\", params.source);\n if (params?.tag) query.set(\"tag\", params.tag);\n if (params?.sort) query.set(\"sort\", params.sort);\n if (params?.page_size !== undefined) query.set(\"page_size\", String(params.page_size));\n if (params?.cursor) query.set(\"cursor\", params.cursor);\n const suffix = query.toString();\n return this.req({ path: `/skills${suffix ? `?${suffix}` : \"\"}`, auth: false });\n }\n\n getSkillInfo(skillId: string, version?: string): Promise<SkillInfoResponse> {\n const query = new URLSearchParams();\n if (version) query.set(\"version\", version);\n const suffix = query.toString();\n return this.req({\n path: `/skills/${encodeURIComponent(skillId)}${suffix ? `?${suffix}` : \"\"}`,\n auth: false,\n });\n }\n\n getSkillVersions(skillId: string): Promise<SkillVersionsResponse> {\n return this.req({\n path: `/skills/${encodeURIComponent(skillId)}/versions`,\n auth: false,\n });\n }\n\n createSkillInstallIntent(skillId: string, version?: string): Promise<InstallIntentResponse> {\n return this.req({\n method: \"POST\",\n path: `/skills/${encodeURIComponent(skillId)}/install-intent`,\n body: version ? { version } : {},\n });\n }\n\n createArtifactSubmission(body: Record<string, unknown>): Promise<CliSubmissionResponse> {\n return this.req({\n method: \"POST\",\n path: \"/artifact-submissions\",\n body,\n });\n }\n\n completeArtifactSubmission(\n submissionId: string,\n body: { sha512: string; size_bytes: number },\n ): Promise<CliSubmissionResponse> {\n return this.req({\n method: \"POST\",\n path: `/artifact-submissions/${encodeURIComponent(submissionId)}/complete`,\n body,\n });\n }\n\n getArtifactSubmission(submissionId: string): Promise<CliSubmissionResponse> {\n return this.req({\n path: `/artifact-submissions/${encodeURIComponent(submissionId)}`,\n });\n }\n\n getArtifactSubmissionLogs(submissionId: string): Promise<CliSubmissionLogsResponse> {\n return this.req({\n path: `/artifact-submissions/${encodeURIComponent(submissionId)}/logs`,\n });\n }\n}\n","import { createServer, type IncomingMessage, type Server, type ServerResponse } from \"node:http\";\nimport open from \"open\";\nimport { CLIENT_ID, DEFAULT_SCOPE } from \"../constants.js\";\nimport type { ResolvedConfig } from \"../config.js\";\nimport { generatePkce } from \"./pkce.js\";\nimport { finalizeLogin } from \"./session.js\";\nimport { CliApiClient } from \"../api/cli-api.js\";\nimport { formatPlatformLabel } from \"../utils/platform.js\";\nimport { printInfo, printSuccess } from \"../utils/output.js\";\n\nconst LOGIN_TIMEOUT_MS = 300_000;\n\nexport async function browserPkceLogin(config: ResolvedConfig): Promise<void> {\n const pkce = generatePkce();\n const port = await pickPort();\n const redirectUri = `http://127.0.0.1:${port}/callback/${pkce.nonce}`;\n const loginUrl = new URL(`${config.platformUrl}/cli/login`);\n loginUrl.searchParams.set(\"client_id\", CLIENT_ID);\n loginUrl.searchParams.set(\"redirect_uri\", redirectUri);\n loginUrl.searchParams.set(\"response_type\", \"code\");\n loginUrl.searchParams.set(\"code_challenge\", pkce.codeChallenge);\n loginUrl.searchParams.set(\"code_challenge_method\", \"S256\");\n loginUrl.searchParams.set(\"state\", pkce.state);\n loginUrl.searchParams.set(\"scope\", DEFAULT_SCOPE);\n\n const code = await waitForCallback(port, pkce.nonce, pkce.state, loginUrl.toString());\n const client = new CliApiClient(config);\n const token = await client.oauthToken({\n grant_type: \"authorization_code\",\n client_id: CLIENT_ID,\n code,\n code_verifier: pkce.codeVerifier,\n redirect_uri: redirectUri,\n });\n\n await finalizeLogin(config, token);\n const display = token.user?.email ?? token.user?.display_name ?? \"user\";\n printSuccess(`Logged in as ${display} (${formatPlatformLabel(config.platformUrl)})`);\n}\n\nasync function pickPort(): Promise<number> {\n return new Promise((resolve, reject) => {\n const server = createServer();\n server.listen(0, \"127.0.0.1\", () => {\n const addr = server.address();\n if (!addr || typeof addr === \"string\") {\n server.close();\n reject(new Error(\"Failed to bind callback port\"));\n return;\n }\n const port = addr.port;\n server.close(() => resolve(port));\n });\n server.on(\"error\", reject);\n });\n}\n\nfunction waitForCallback(\n port: number,\n nonce: string,\n expectedState: string,\n loginUrl: string,\n): Promise<string> {\n return new Promise((resolve, reject) => {\n let settled = false;\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let server: Server;\n\n const stopServer = () => {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n server.closeAllConnections?.();\n server.close();\n };\n\n const finish = (handler: () => void) => {\n if (settled) return;\n settled = true;\n stopServer();\n handler();\n };\n\n server = createServer(async (req: IncomingMessage, res: ServerResponse) => {\n try {\n const url = new URL(req.url ?? \"/\", `http://127.0.0.1:${port}`);\n if (url.pathname !== `/callback/${nonce}`) {\n res.writeHead(404);\n res.end(\"Not found\");\n return;\n }\n const code = url.searchParams.get(\"code\");\n const state = url.searchParams.get(\"state\");\n if (!code || state !== expectedState) {\n res.writeHead(400);\n res.end(\"Invalid callback\");\n finish(() =>\n reject(new Error(\"Invalid OAuth callback: state mismatch or missing code\")),\n );\n return;\n }\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(\"<html><body><h2>Login successful. You can close this window.</h2></body></html>\");\n finish(() => resolve(code));\n } catch (err) {\n finish(() => reject(err));\n }\n });\n\n server.listen(port, \"127.0.0.1\", () => {\n printInfo(\"Opening browser to authorize AgentScope Platform CLI...\");\n printInfo(`If the browser does not open, visit:\\n ${loginUrl}`);\n printInfo(\"Waiting for authorization...\");\n void open(loginUrl).catch(() => {});\n });\n\n timeoutId = setTimeout(() => {\n finish(() => reject(new Error(\"Login timed out\")));\n }, LOGIN_TIMEOUT_MS);\n });\n}\n","import { randomBytes, createHash } from \"node:crypto\";\n\nexport interface PkcePair {\n codeVerifier: string;\n codeChallenge: string;\n state: string;\n nonce: string;\n}\n\nfunction base64Url(buf: Buffer): string {\n return buf.toString(\"base64url\");\n}\n\nexport function generatePkce(): PkcePair {\n const codeVerifier = base64Url(randomBytes(32));\n const codeChallenge = base64Url(createHash(\"sha256\").update(codeVerifier).digest());\n const state = `state_${base64Url(randomBytes(16))}`;\n const nonce = `nonce_${base64Url(randomBytes(16))}`;\n return { codeVerifier, codeChallenge, state, nonce };\n}\n","import chalk from \"chalk\";\n\nexport function printJson(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n}\n\nexport function printSuccess(message: string): void {\n console.log(chalk.green(\"✓\"), message);\n}\n\nexport function printInfo(message: string): void {\n console.log(chalk.blue(\"ℹ\"), message);\n}\n\nexport function printWarn(message: string): void {\n console.log(chalk.yellow(\"⚠\"), message);\n}\n\nexport function printError(message: string): void {\n console.error(chalk.red(\"✗\"), message);\n}\n\nexport function printTable(headers: string[], rows: string[][]): void {\n const widths = headers.map((h, i) =>\n Math.max(h.length, ...rows.map((r) => (r[i] ?? \"\").length)),\n );\n const headerLine = headers.map((h, i) => h.padEnd(widths[i])).join(\" \");\n console.log(chalk.bold(headerLine));\n for (const row of rows) {\n console.log(row.map((c, i) => (c ?? \"\").padEnd(widths[i])).join(\" \"));\n }\n}\n\nexport function formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nexport function formatDateTime(iso: string): string {\n const date = new Date(iso);\n if (Number.isNaN(date.getTime())) return iso;\n\n const pad = (n: number) => String(n).padStart(2, \"0\");\n return [\n date.getFullYear(),\n pad(date.getMonth() + 1),\n pad(date.getDate()),\n ].join(\"-\") + \" \" + [pad(date.getHours()), pad(date.getMinutes()), pad(date.getSeconds())].join(\":\");\n}\n","import { createInterface } from \"node:readline/promises\";\nimport { stdin as input, stdout as output } from \"node:process\";\n\nexport async function promptLine(message: string): Promise<string> {\n const rl = createInterface({ input, output });\n try {\n const value = (await rl.question(message)).trim();\n if (!value) {\n throw new Error(\"Input is required.\");\n }\n return value;\n } finally {\n rl.close();\n }\n}\n\nexport async function promptPassword(message = \"Password: \"): Promise<string> {\n return new Promise((resolve, reject) => {\n const stdin = process.stdin;\n const wasRaw = stdin.isRaw;\n const wasPaused = stdin.isPaused();\n\n if (!stdin.isTTY) {\n reject(new Error(\"Password prompt requires an interactive terminal.\"));\n return;\n }\n\n output.write(message);\n\n stdin.setRawMode(true);\n stdin.resume();\n stdin.setEncoding(\"utf8\");\n\n let password = \"\";\n\n const cleanup = (): void => {\n stdin.removeListener(\"data\", onData);\n stdin.setRawMode(wasRaw ?? false);\n if (wasPaused) stdin.pause();\n else stdin.resume();\n };\n\n const onData = (char: string): void => {\n switch (char) {\n case \"\\n\":\n case \"\\r\":\n case \"\\u0004\":\n cleanup();\n output.write(\"\\n\");\n if (!password) {\n reject(new Error(\"Password is required.\"));\n return;\n }\n resolve(password);\n break;\n case \"\\u0003\":\n cleanup();\n output.write(\"\\n\");\n reject(new Error(\"Login cancelled.\"));\n break;\n case \"\\u007f\":\n case \"\\b\":\n if (password.length > 0) {\n password = password.slice(0, -1);\n output.write(\"\\b \\b\");\n }\n break;\n default:\n if (char < \" \" && char !== \"\\t\") return;\n password += char;\n output.write(\"*\");\n break;\n }\n };\n\n stdin.on(\"data\", onData);\n });\n}\n\nexport async function promptCredentials(options: {\n account?: string;\n password?: string;\n}): Promise<{ account: string; password: string }> {\n const account = options.account ?? (await promptLine(\"Email: \"));\n const password = options.password ?? (await promptPassword());\n return { account, password };\n}\n\nexport async function promptLoginMethod(): Promise<\"browser\" | \"password\"> {\n printLoginMethodMenu();\n const rl = createInterface({ input, output });\n try {\n const answer = (await rl.question(\"Enter choice [1]: \")).trim();\n if (!answer || answer === \"1\") return \"browser\";\n if (answer === \"2\") return \"password\";\n throw new Error(\"Invalid choice. Enter 1 or 2.\");\n } finally {\n rl.close();\n }\n}\n\nfunction printLoginMethodMenu(): void {\n console.log(\"How would you like to log in?\");\n console.log(\" 1. Browser authorization (recommended)\");\n console.log(\" 2. Email and password\");\n}\n","import type { Command } from \"commander\";\nimport type { ResolvedConfig } from \"../config.js\";\nimport { CliApiClient } from \"../api/cli-api.js\";\nimport { browserPkceLogin } from \"../auth/browser-login.js\";\nimport {\n credentialsFromTokenResponse,\n loadCredentials,\n saveCredentials,\n clearCredentials,\n} from \"../auth/credentials.js\";\nimport { finalizeLogin, refreshStoredSession } from \"../auth/session.js\";\nimport { AspError } from \"../utils/errors.js\";\nimport { printJson, printSuccess, printInfo, formatDateTime, printTable } from \"../utils/output.js\";\nimport { promptCredentials, promptLoginMethod } from \"../utils/prompt.js\";\nimport {\n envCommandSuffix,\n formatPlatformLabel,\n loginCommandHint,\n requireCredentials,\n} from \"../utils/platform.js\";\n\ninterface LoginOptions {\n browser?: boolean;\n password?: boolean;\n token?: string;\n account?: string;\n pass?: string;\n}\n\nconst LOGIN_OPTIONS: Array<[string, string]> = [\n [\"--browser\", \"Login via browser authorization (opens /cli/login, PKCE)\"],\n [\"--password\", \"Login with email and password\"],\n [\"--token <token>\", \"Save and validate an existing access token\"],\n [\"--account <email>\", \"Account email (non-interactive, use with --pass)\"],\n [\"--pass <password>\", \"Account password (non-interactive, use with --account)\"],\n];\n\nfunction wantsPasswordLogin(opts: LoginOptions): boolean {\n return !!(opts.password || opts.account || opts.pass);\n}\n\nasync function ensureBrowserLoginEnabled(config: ResolvedConfig): Promise<void> {\n const meta = await new CliApiClient(config).getMeta().catch(() => null);\n if (meta?.features?.browser_pkce_login === false) {\n const suffix = envCommandSuffix(config.platformUrl);\n throw new AspError(\"Browser authorization login is not enabled on this platform.\", {\n code: \"FEATURE_DISABLED\",\n hint: `Use \\`asp auth login --password${suffix}\\` instead.`,\n });\n }\n}\n\nasync function runPasswordLogin(\n config: ResolvedConfig,\n opts: Pick<LoginOptions, \"account\" | \"pass\">,\n): Promise<void> {\n const { account, password } = await promptCredentials({\n account: opts.account,\n password: opts.pass,\n });\n\n const loginResponse = await new CliApiClient(config).login(account, password);\n await finalizeLogin(config, loginResponse);\n\n const me = await new CliApiClient(config).getMe();\n const display = me.user?.email ?? me.email ?? me.user?.display_name ?? me.account ?? account;\n printSuccess(`Logged in as ${display} (${formatPlatformLabel(config.platformUrl)})`);\n}\n\nasync function runBrowserLogin(config: ResolvedConfig): Promise<void> {\n await ensureBrowserLoginEnabled(config);\n await browserPkceLogin(config);\n}\n\nasync function runLogin(config: ResolvedConfig, opts: LoginOptions): Promise<void> {\n if (opts.token) {\n await saveTokenLogin(config, opts.token);\n return;\n }\n\n if (opts.browser && wantsPasswordLogin(opts)) {\n throw new AspError(\"Cannot use --browser together with --password, --account, or --pass.\", {\n code: \"INVALID_REQUEST\",\n hint: \"Choose one login method.\",\n });\n }\n\n if (opts.browser) {\n await runBrowserLogin(config);\n return;\n }\n\n if (wantsPasswordLogin(opts)) {\n await runPasswordLogin(config, opts);\n return;\n }\n\n if (!process.stdin.isTTY) {\n const suffix = envCommandSuffix(config.platformUrl);\n throw new AspError(\"Non-interactive login requires a login method flag.\", {\n code: \"INVALID_REQUEST\",\n hint:\n `Use \\`asp auth login --browser${suffix}\\` or ` +\n `\\`asp auth login --password --account <email> --pass <password>${suffix}\\`.`,\n });\n }\n\n const method = await promptLoginMethod();\n if (method === \"browser\") {\n await runBrowserLogin(config);\n return;\n }\n\n await runPasswordLogin(config, opts);\n}\n\nasync function saveTokenLogin(config: ResolvedConfig, token: string): Promise<void> {\n const creds = credentialsFromTokenResponse(config.platformUrl, {\n access_token: token,\n token_type: \"Bearer\",\n });\n await saveCredentials(creds);\n const me = await new CliApiClient({ ...config, token }).getMe();\n const display =\n me.user?.email ?? me.email ?? me.user?.display_name ?? me.account ?? me.user_id;\n printSuccess(`Token saved. Logged in as ${display} (${formatPlatformLabel(config.platformUrl)})`);\n}\n\nasync function runStatus(getConfig: () => ResolvedConfig): Promise<void> {\n const base = getConfig();\n const creds = await loadCredentials(base.platformUrl);\n\n if (!base.token && !creds) {\n printInfo(\"Not logged in.\");\n printInfo(loginCommandHint(base.platformUrl));\n return;\n }\n\n const { config: apiConfig } = await requireCredentials(base, base.platformUrl);\n const client = new CliApiClient(apiConfig);\n const me = await client.getMe();\n const latestCreds = (await loadCredentials(base.platformUrl)) ?? creds;\n\n if (base.json) {\n printJson({\n logged_in: true,\n environment: formatPlatformLabel(apiConfig.platformUrl),\n user: me.user ?? {\n id: me.user_id,\n email: me.email,\n display_name: me.username ?? me.account,\n },\n scopes: me.scopes,\n expires_at: latestCreds?.expires_at,\n platform_url: apiConfig.platformUrl,\n });\n return;\n }\n\n const user = me.user ?? {\n id: me.user_id ?? \"\",\n email: me.email,\n display_name: me.username ?? me.account,\n };\n printInfo(`Environment: ${formatPlatformLabel(apiConfig.platformUrl)}`);\n printInfo(`User: ${user.display_name ?? user.email ?? user.id}`);\n if (user.email) printInfo(`Email: ${user.email}`);\n if (me.scopes?.length) printInfo(`Scopes: ${me.scopes.join(\", \")}`);\n if (latestCreds?.expires_at) {\n printInfo(`Token expires: ${formatDateTime(latestCreds.expires_at)}`);\n }\n}\n\nasync function runRefresh(getConfig: () => ResolvedConfig): Promise<void> {\n const base = getConfig();\n const { config, creds } = await requireCredentials(base, base.platformUrl);\n\n if (!creds.refresh_token) {\n throw new AspError(\"No refresh token available.\", {\n code: \"UNAUTHORIZED\",\n hint: loginCommandHint(config.platformUrl),\n exitCode: 3,\n });\n }\n\n await refreshStoredSession(config, creds.refresh_token, config.platformUrl);\n printSuccess(`Token refreshed (${formatPlatformLabel(config.platformUrl)}).`);\n}\n\nasync function runLogout(getConfig: () => ResolvedConfig): Promise<void> {\n const base = getConfig();\n const platformUrl = base.platformUrl;\n const creds = await loadCredentials(platformUrl);\n\n if (!creds) {\n printInfo(`Not logged in to ${formatPlatformLabel(platformUrl)}.`);\n return;\n }\n\n if (creds.refresh_token) {\n const client = new CliApiClient({ ...base, platformUrl: creds.platform_url });\n await client.logout().catch(() => {});\n }\n await clearCredentials(creds.platform_url);\n printSuccess(`Logged out from ${formatPlatformLabel(creds.platform_url)}.`);\n}\n\nasync function runLogs(\n getConfig: () => ResolvedConfig,\n opts: { pageSize?: number; cursor?: string },\n): Promise<void> {\n const base = getConfig();\n const { config } = await requireCredentials(base, base.platformUrl);\n const response = await new CliApiClient(config).getRequestLogs({\n page_size: opts.pageSize,\n cursor: opts.cursor,\n });\n\n if (base.json) {\n printJson(response);\n return;\n }\n\n if (response.items.length === 0) {\n printInfo(\"No request logs.\");\n return;\n }\n\n const rows = response.items.map((item) => [\n item.created_at,\n item.method,\n item.path,\n String(item.response_status ?? \"-\"),\n String(item.duration_ms ?? \"-\"),\n ]);\n printTable([\"time\", \"method\", \"path\", \"status\", \"ms\"], rows);\n if (response.next_cursor) {\n printInfo(`Next cursor: ${response.next_cursor}`);\n }\n}\n\nexport function registerAuthCommands(program: Command, getConfig: () => ResolvedConfig): void {\n const auth = program.command(\"auth\").description(\"Authentication commands\");\n\n let login = auth.command(\"login\").description(\"Log in\");\n for (const [flags, desc] of LOGIN_OPTIONS) {\n login = login.option(flags, desc);\n }\n login.action(async (opts: LoginOptions) => {\n await runLogin(getConfig(), opts);\n });\n\n auth.command(\"status\").description(\"Show login status\").action(async () => {\n await runStatus(getConfig);\n });\n\n auth.command(\"refresh\").description(\"Refresh access token\").action(async () => {\n await runRefresh(getConfig);\n });\n\n auth.command(\"logout\").description(\"Log out current account\").action(async () => {\n await runLogout(getConfig);\n });\n\n auth\n .command(\"logs\")\n .description(\"Show CLI request audit logs\")\n .option(\"--page-size <n>\", \"Page size\", (v) => Number.parseInt(v, 10))\n .option(\"--cursor <cursor>\", \"Cursor for next page\")\n .action(async (opts: { pageSize?: number; cursor?: string }) => {\n await runLogs(getConfig, opts);\n });\n}\n","import { basename } from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport { spawn } from \"node:child_process\";\nimport { createInterface } from \"node:readline/promises\";\nimport { stdin as input, stdout as output } from \"node:process\";\nimport type { Command } from \"commander\";\nimport type { ResolvedConfig } from \"../config.js\";\nimport { CliApiClient, type CliSubmissionResponse } from \"../api/cli-api.js\";\nimport { CLI_VERSION } from \"../constants.js\";\nimport { AspError } from \"../utils/errors.js\";\nimport {\n printInfo,\n printJson,\n printSuccess,\n printTable,\n printWarn,\n} from \"../utils/output.js\";\nimport {\n envCommandSuffix,\n formatPlatformLabel,\n requireCredentials,\n} from \"../utils/platform.js\";\nimport {\n appendOptionalArtifactFields,\n looksLikeSubmissionId,\n} from \"../utils/artifact-publish.js\";\nimport { recordPluginPublish } from \"../utils/publish-registry.js\";\nimport { resolvePluginSubmissionId } from \"../utils/submission-resolve.js\";\nimport {\n pollUntilTerminal,\n} from \"../utils/submission-poll.js\";\nimport { formatPluginListTechType } from \"../utils/marketplace-display.js\";\n\ninterface SearchOptions {\n category?: string;\n source?: \"official\" | \"verified\" | \"community\";\n sort?: \"recommended\" | \"downloads\" | \"updated_at\";\n pageSize?: number;\n cursor?: string;\n}\n\ninterface InfoOptions {\n version?: string;\n}\n\ninterface InstallOptions {\n version?: string;\n via?: \"qwenpaw\";\n}\n\ninterface PublishOptions {\n url?: string;\n artifactId?: string;\n version?: string;\n category?: PluginCategory;\n repoUrl?: string;\n publishMode?: \"auto_after_scan\";\n noWait?: boolean;\n}\n\ninterface PublishStatusOptions {\n watch?: boolean;\n}\n\ninterface PublishLogsOptions {}\n\ntype PluginCategory = \"tool\" | \"provider\" | \"command\" | \"hook\" | \"frontend\" | \"general\" | \"app\";\ntype PluginManifest = { id?: string; version?: string; type?: string };\n\nconst PLUGIN_CATEGORY_OPTIONS: Array<{\n value: PluginCategory;\n label: string;\n describe: string;\n}> = [\n {\n value: \"tool\",\n label: \"Agent Tool\",\n describe: \"Functions, APIs, or capabilities that Agents can invoke\",\n },\n {\n value: \"provider\",\n label: \"Model Provider\",\n describe: \"Connect custom LLM providers or model endpoints\",\n },\n {\n value: \"command\",\n label: \"Slash Command\",\n describe: \"Register console commands in the form /xxx\",\n },\n {\n value: \"hook\",\n label: \"Lifecycle Hook\",\n describe: \"Run code at key moments such as startup and shutdown\",\n },\n {\n value: \"frontend\",\n label: \"UI Extension\",\n describe: \"Provide frontend JS bundles loaded dynamically by the UI\",\n },\n {\n value: \"general\",\n label: \"General Plugin\",\n describe: \"Does not fit the categories above, or combines multiple capabilities\",\n },\n {\n value: \"app\",\n label: \"App\",\n describe: \"Extend platform capabilities as a standalone application\",\n },\n];\n\nasync function runCommand(command: string, args: string[]): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n const child = spawn(command, args, { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n let stdout = \"\";\n let stderr = \"\";\n child.stdout.on(\"data\", (chunk) => {\n stdout += String(chunk);\n });\n child.stderr.on(\"data\", (chunk) => {\n stderr += String(chunk);\n });\n child.on(\"error\", reject);\n child.on(\"close\", (code) => {\n if (code === 0) resolve(stdout);\n else reject(new Error(stderr || `Command failed: ${command} ${args.join(\" \")}`));\n });\n });\n}\n\nasync function readPluginManifestFromZip(zipPath: string | undefined): Promise<PluginManifest | undefined> {\n if (!zipPath) return undefined;\n try {\n const stdout = await runCommand(\"unzip\", [\"-p\", zipPath, \"plugin.json\"]);\n return JSON.parse(stdout) as PluginManifest;\n } catch {\n return undefined;\n }\n}\n\nfunction getClient(getConfig: () => ResolvedConfig): CliApiClient {\n return new CliApiClient(getConfig());\n}\n\nasync function runSearch(\n getConfig: () => ResolvedConfig,\n query: string | undefined,\n opts: SearchOptions,\n): Promise<void> {\n const config = getConfig();\n const client = getClient(getConfig);\n const response = await client.searchPlugins({\n q: query,\n category: opts.category,\n source: opts.source,\n sort: opts.sort,\n page_size: opts.pageSize,\n cursor: opts.cursor,\n });\n\n if (config.json) {\n printJson(response);\n return;\n }\n\n if (response.items.length === 0) {\n printInfo(\"No plugins found.\");\n return;\n }\n\n const rows = response.items.map((item) => [\n item.plugin_id,\n String(item.latest_version ?? \"-\"),\n formatPluginListTechType(item),\n String(item.name ?? \"-\"),\n ]);\n printTable([\"plugin_id\", \"version\", \"tech_type\", \"name\"], rows);\n if (response.next_cursor) {\n printInfo(`Next cursor: ${response.next_cursor}`);\n }\n}\n\nasync function runInfo(\n getConfig: () => ResolvedConfig,\n pluginId: string,\n opts: InfoOptions,\n): Promise<void> {\n const config = getConfig();\n const client = getClient(getConfig);\n const response = await client.getPluginInfo(pluginId, opts.version);\n if (config.json) {\n printJson(response);\n return;\n }\n\n printInfo(`Plugin: ${response.plugin_id}`);\n if (response.latest_version) printInfo(`Version: ${response.latest_version}`);\n if (response.scan_status) printInfo(`Scan: ${response.scan_status}`);\n if (response.install_command) printInfo(`Install: ${response.install_command}`);\n if (response.public_url) printInfo(`URL: ${response.public_url}`);\n}\n\nasync function runVersions(getConfig: () => ResolvedConfig, pluginId: string): Promise<void> {\n const config = getConfig();\n const client = getClient(getConfig);\n const response = await client.getPluginVersions(pluginId);\n if (config.json) {\n printJson(response);\n return;\n }\n if (response.items.length === 0) {\n printInfo(\"No published versions.\");\n return;\n }\n const rows = response.items.map((item) => [\n item.version,\n item.published_at ?? \"-\",\n item.deprecated ? \"yes\" : \"no\",\n ]);\n printTable([\"version\", \"published_at\", \"deprecated\"], rows);\n}\n\nasync function runInstall(\n getConfig: () => ResolvedConfig,\n pluginId: string,\n opts: InstallOptions,\n): Promise<void> {\n const base = getConfig();\n const { config } = await requireCredentials(base, base.platformUrl);\n const client = new CliApiClient(config);\n const intent = await client.createInstallIntent(pluginId, opts.version);\n\n if (base.json) {\n printJson(intent);\n return;\n }\n\n if (opts.via !== undefined && opts.via !== \"qwenpaw\") {\n throw new AspError(\"Only --via qwenpaw is supported now.\", {\n code: \"INVALID_REQUEST\",\n });\n }\n\n const installCmd = `qwenpaw plugin install ${intent.download_url}`;\n printInfo(`Run to install:\\n ${installCmd}`);\n if (intent.sha512) printInfo(`sha512: ${intent.sha512}`);\n if (intent.expires_at) printInfo(`URL expires at: ${intent.expires_at}`);\n\n const child = spawn(\"qwenpaw\", [\"plugin\", \"install\", intent.download_url], {\n stdio: \"inherit\",\n });\n await new Promise<void>((resolve, reject) => {\n child.on(\"exit\", (code) => {\n if (code === 0) resolve();\n else reject(new AspError(`qwenpaw exited with code ${code ?? 1}`, { code: \"QWENPAW_FAILED\" }));\n });\n child.on(\"error\", reject);\n });\n}\n\nasync function uploadZipToSignedUrl(upload: {\n url: string;\n method?: string;\n headers?: Record<string, string>;\n}, fileBuffer: Buffer): Promise<void> {\n const response = await fetch(upload.url, {\n method: upload.method ?? \"PUT\",\n headers: upload.headers ?? {},\n body: fileBuffer,\n });\n if (!response.ok) {\n throw new AspError(`Upload failed with HTTP ${response.status}`, {\n code: \"UPLOAD_FAILED\",\n statusCode: response.status,\n });\n }\n}\n\nfunction buildZipBody(\n filePath: string,\n fileBuffer: Buffer,\n sha512: string,\n opts: PublishOptions & { category: PluginCategory },\n): Record<string, unknown> {\n return appendOptionalArtifactFields(\n {\n artifact_type: \"plugin\",\n package_source: \"zip\",\n category: opts.category,\n filename: basename(filePath),\n size_bytes: fileBuffer.byteLength,\n sha512,\n publish_mode: opts.publishMode ?? \"auto_after_scan\",\n client: {\n name: \"agentscope-platform-cli\",\n version: CLI_VERSION,\n },\n },\n {\n artifactId: opts.artifactId,\n version: opts.version,\n repoUrl: opts.repoUrl,\n },\n );\n}\n\nfunction buildUrlBody(opts: PublishOptions & { category: PluginCategory }): Record<string, unknown> {\n return appendOptionalArtifactFields(\n {\n artifact_type: \"plugin\",\n package_source: \"url\",\n source_url: opts.url,\n category: opts.category,\n publish_mode: opts.publishMode ?? \"auto_after_scan\",\n client: {\n name: \"agentscope-platform-cli\",\n version: CLI_VERSION,\n },\n },\n {\n artifactId: opts.artifactId,\n version: opts.version,\n repoUrl: opts.repoUrl,\n },\n );\n}\n\nfunction parseCategory(inputValue: string | undefined): PluginCategory | undefined {\n if (!inputValue) return undefined;\n const normalized = inputValue.trim().toLowerCase();\n if (PLUGIN_CATEGORY_OPTIONS.some((item) => item.value === normalized)) {\n return normalized as PluginCategory;\n }\n return undefined;\n}\n\nfunction tryParseCategoryFromUrl(urlValue: string | undefined): PluginCategory | undefined {\n if (!urlValue) return undefined;\n try {\n const parsed = new URL(urlValue);\n const queryCategory = parseCategory(parsed.searchParams.get(\"category\") ?? undefined);\n if (queryCategory) return queryCategory;\n const segments = parsed.pathname\n .split(\"/\")\n .map((item) => item.trim().toLowerCase())\n .filter(Boolean);\n for (let i = 0; i < segments.length; i += 1) {\n const current = parseCategory(segments[i]);\n if (current) return current;\n }\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction tryParsePluginIdFromUrl(urlValue: string | undefined): string | undefined {\n if (!urlValue) return undefined;\n try {\n const parsed = new URL(urlValue);\n const segments = parsed.pathname\n .split(\"/\")\n .map((item) => item.trim())\n .filter(Boolean);\n const pluginsIdx = segments.findIndex((item) => item.toLowerCase() === \"plugins\");\n if (pluginsIdx >= 0 && segments[pluginsIdx + 2]) {\n return segments[pluginsIdx + 2];\n }\n const last = segments[segments.length - 1];\n if (last?.toLowerCase().endsWith(\".zip\")) {\n return last.replace(/-\\d+\\.\\d+\\.\\d+.*\\.zip$/i, \"\").replace(/\\.zip$/i, \"\");\n }\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nasync function tryParseCategoryFromZip(\n zipPath: string | undefined,\n manifest?: PluginManifest,\n): Promise<PluginCategory | undefined> {\n const parsed = manifest ?? (await readPluginManifestFromZip(zipPath));\n return parseCategory(parsed?.type);\n}\n\nfunction printManifestPreview(manifest: PluginManifest | undefined, jsonOutput: boolean): void {\n if (jsonOutput || !manifest) return;\n if (manifest.id) {\n printInfo(`Package plugin id: ${manifest.id} (parsed on complete if --artifact-id is omitted)`);\n }\n if (manifest.version) {\n printInfo(`Package version: ${manifest.version} (parsed on complete if --version is omitted)`);\n }\n}\n\nfunction validateExplicitManifestOverrides(\n opts: PublishOptions,\n manifest: PluginManifest | undefined,\n): void {\n if (opts.artifactId && manifest?.id && opts.artifactId !== manifest.id) {\n throw new AspError(\n `artifact_id mismatch: --artifact-id=${opts.artifactId}, plugin.json id=${manifest.id}`,\n {\n code: \"ARTIFACT_ID_MISMATCH\",\n hint: \"Remove --artifact-id to let the server parse from package, or fix the value.\",\n },\n );\n }\n if (opts.version && manifest?.version && opts.version !== manifest.version) {\n throw new AspError(\n `version mismatch: --version=${opts.version}, plugin.json version=${manifest.version}`,\n {\n code: \"VERSION_MISMATCH\",\n hint: \"Remove --version to let the server parse from package, or fix the value.\",\n },\n );\n }\n}\n\nasync function resolvePublishCategoryWithAutoDetect(\n opts: PublishOptions,\n zipPath: string | undefined,\n jsonOutput: boolean,\n manifest?: PluginManifest,\n): Promise<PluginCategory> {\n const fromArg = parseCategory(opts.category);\n if (fromArg) return fromArg;\n if (opts.category && !fromArg) {\n throw new AspError(`Invalid --category: ${opts.category}`, {\n code: \"INVALID_REQUEST\",\n hint: `Use one of: ${PLUGIN_CATEGORY_OPTIONS.map((item) => item.value).join(\", \")}`,\n });\n }\n\n const fromZip = await tryParseCategoryFromZip(zipPath, manifest);\n if (fromZip) {\n if (!jsonOutput) printInfo(`Detected category from plugin package: ${fromZip}`);\n return fromZip;\n }\n\n const fromUrl = tryParseCategoryFromUrl(opts.url);\n if (fromUrl) {\n if (!jsonOutput) printInfo(`Detected category from source URL: ${fromUrl}`);\n return fromUrl;\n }\n\n return resolvePublishCategory(opts, jsonOutput);\n}\n\nasync function resolvePublishCategory(\n opts: PublishOptions,\n jsonOutput: boolean,\n): Promise<PluginCategory> {\n const fromArg = parseCategory(opts.category);\n if (fromArg) return fromArg;\n\n if (opts.category && !fromArg) {\n throw new AspError(`Invalid --category: ${opts.category}`, {\n code: \"INVALID_REQUEST\",\n hint: `Use one of: ${PLUGIN_CATEGORY_OPTIONS.map((item) => item.value).join(\", \")}`,\n });\n }\n\n if (jsonOutput || !input.isTTY || !output.isTTY) {\n throw new AspError(\"Plugin publish requires --category.\", {\n code: \"INVALID_REQUEST\",\n hint: `Use --category with one of: ${PLUGIN_CATEGORY_OPTIONS.map((item) => item.value).join(\", \")}`,\n });\n }\n\n printInfo(\"Select plugin category:\");\n for (const [index, item] of PLUGIN_CATEGORY_OPTIONS.entries()) {\n printInfo(`${index + 1}) ${item.value} - ${item.label}`);\n printInfo(` ${item.describe}`);\n }\n\n const rl = createInterface({ input, output });\n try {\n while (true) {\n const answer = (await rl.question(\"Enter category number or value: \")).trim();\n const index = Number.parseInt(answer, 10);\n if (!Number.isNaN(index) && index >= 1 && index <= PLUGIN_CATEGORY_OPTIONS.length) {\n const selected = PLUGIN_CATEGORY_OPTIONS[index - 1].value;\n printInfo(`Selected category: ${selected}`);\n return selected;\n }\n const byValue = parseCategory(answer);\n if (byValue) {\n printInfo(`Selected category: ${byValue}`);\n return byValue;\n }\n printWarn(`Invalid choice. Use 1-${PLUGIN_CATEGORY_OPTIONS.length} or category value.`);\n }\n } finally {\n rl.close();\n }\n}\n\nfunction isMissingCategoryError(err: unknown): boolean {\n if (!(err instanceof AspError)) return false;\n if (err.code !== \"INVALID_REQUEST\") return false;\n const message = `${err.message} ${err.hint ?? \"\"}`.toLowerCase();\n return message.includes(\"category\") || message.includes(\"技术类型\");\n}\n\nasync function showPublishedPluginStatus(\n client: CliApiClient,\n pluginId: string,\n jsonOutput: boolean,\n): Promise<void> {\n try {\n const info = await client.getPluginInfo(pluginId);\n if (jsonOutput) {\n printJson({\n plugin_id: info.plugin_id,\n status: \"published\",\n terminal: true,\n latest_version: info.latest_version,\n scan_status: info.scan_status,\n public_url: info.public_url,\n install_command: info.install_command,\n });\n return;\n }\n\n printInfo(`Plugin: ${info.plugin_id}`);\n printInfo(\"Status: published\");\n printInfo(\"Terminal: yes\");\n if (info.latest_version) printInfo(`Version: ${info.latest_version}`);\n if (info.scan_status) printInfo(`Scan: ${info.scan_status}`);\n if (info.public_url) printInfo(`URL: ${info.public_url}`);\n if (info.install_command) printInfo(`Install: ${info.install_command}`);\n } catch (err) {\n if (err instanceof AspError && err.statusCode === 404) {\n throw new AspError(`No submission or published plugin found: ${pluginId}`, {\n code: \"NOT_FOUND\",\n hint:\n \"If the plugin is still scanning, use submission_id from publish output. \" +\n \"Republish on this machine to cache plugin_id mapping locally.\",\n });\n }\n throw err;\n }\n}\n\nasync function runPublish(\n getConfig: () => ResolvedConfig,\n zipPath: string | undefined,\n opts: PublishOptions,\n): Promise<void> {\n const base = getConfig();\n const { config } = await requireCredentials(base, base.platformUrl);\n const client = new CliApiClient(config);\n const useUrlMode = Boolean(opts.url);\n const manifest = useUrlMode ? undefined : await readPluginManifestFromZip(zipPath);\n printManifestPreview(manifest, base.json);\n validateExplicitManifestOverrides(opts, manifest);\n\n let publishOpts: PublishOptions & { category: PluginCategory };\n try {\n const category = await resolvePublishCategoryWithAutoDetect(\n opts,\n zipPath,\n base.json,\n manifest,\n );\n publishOpts = { ...opts, category };\n } catch (err) {\n if (!isMissingCategoryError(err)) throw err;\n const category = await resolvePublishCategory({ ...opts, category: undefined }, base.json);\n publishOpts = { ...opts, category };\n }\n if (useUrlMode && zipPath) {\n const suffix = envCommandSuffix(config.platformUrl);\n throw new AspError(\"Do not pass zip path when using --url.\", {\n code: \"INVALID_REQUEST\",\n hint:\n `Use either \\`asp plugin publish ./plugin.zip${suffix}\\` or ` +\n `\\`asp plugin publish --url <url>${suffix}\\`.`,\n });\n }\n if (!useUrlMode && !zipPath) {\n const suffix = envCommandSuffix(config.platformUrl);\n throw new AspError(\"Zip path is required unless --url is provided.\", {\n code: \"INVALID_REQUEST\",\n hint: `Use \\`asp plugin publish ./plugin.zip${suffix}\\`.`,\n });\n }\n\n let submission: CliSubmissionResponse;\n const tryCreateSubmission = async (): Promise<CliSubmissionResponse> => {\n if (useUrlMode) {\n return client.createArtifactSubmission(buildUrlBody(publishOpts));\n }\n const fileBuffer = await readFile(zipPath as string);\n const sha512 = createHash(\"sha512\").update(fileBuffer).digest(\"hex\");\n let localSubmission = await client.createArtifactSubmission(\n buildZipBody(zipPath as string, fileBuffer, sha512, publishOpts),\n );\n if (!localSubmission.upload?.url) {\n throw new AspError(\"Missing upload URL for zip submission.\", {\n code: \"UPLOAD_URL_MISSING\",\n });\n }\n await uploadZipToSignedUrl(localSubmission.upload, fileBuffer);\n localSubmission = await client.completeArtifactSubmission(localSubmission.submission_id, {\n sha512,\n size_bytes: fileBuffer.byteLength,\n });\n return localSubmission;\n };\n\n try {\n submission = await tryCreateSubmission();\n } catch (err) {\n if (!isMissingCategoryError(err) || base.json || !input.isTTY || !output.isTTY) {\n throw err;\n }\n printWarn(\"Publish failed due to missing category, please choose one and retrying...\");\n const category = await resolvePublishCategory({ ...opts, category: undefined }, base.json);\n publishOpts = { ...opts, category };\n submission = await tryCreateSubmission();\n }\n\n const urlPluginId = useUrlMode ? tryParsePluginIdFromUrl(publishOpts.url) : undefined;\n await recordPluginPublish({\n submissionId: submission.submission_id,\n platformUrl: config.platformUrl,\n pluginId: publishOpts.artifactId ?? manifest?.id ?? urlPluginId,\n sourceUrl: useUrlMode ? publishOpts.url : undefined,\n });\n\n if (base.json) {\n printJson(submission);\n return;\n }\n\n printSuccess(`Submission created: ${submission.submission_id}`);\n printInfo(`Initial status: ${submission.status}`);\n const trackRef =\n publishOpts.artifactId ?? manifest?.id ?? urlPluginId ?? submission.submission_id;\n\n if (opts.noWait) {\n const envSuffix = envCommandSuffix(config.platformUrl);\n printInfo(`Track progress: asp plugin publish status ${trackRef}${envSuffix}`);\n printInfo(`Show logs: asp plugin publish logs ${trackRef}${envSuffix}`);\n return;\n }\n\n if (!submission.terminal) {\n printSuccess(\"Upload submitted successfully. Scanning continues asynchronously.\");\n const envSuffix = envCommandSuffix(config.platformUrl);\n printInfo(`Track progress: asp plugin publish status ${trackRef} --watch${envSuffix}`);\n printInfo(`Show logs: asp plugin publish logs ${trackRef}${envSuffix}`);\n return;\n }\n\n if (submission.status === \"published\") {\n printSuccess(`Published successfully (${formatPlatformLabel(config.platformUrl)})`);\n if (submission.publish?.public_url) {\n printInfo(`URL: ${submission.publish.public_url}`);\n }\n return;\n }\n\n printWarn(`Submission ended with status: ${submission.status}`);\n if (submission.failure?.message) {\n printWarn(`Failure: ${submission.failure.message}`);\n }\n const envSuffix = envCommandSuffix(config.platformUrl);\n printInfo(`Inspect logs: asp plugin publish logs ${trackRef}${envSuffix}`);\n}\n\nasync function runPublishStatus(\n getConfig: () => ResolvedConfig,\n pluginRef: string,\n opts: PublishStatusOptions,\n): Promise<void> {\n const base = getConfig();\n const { config } = await requireCredentials(base, base.platformUrl);\n const client = new CliApiClient(config);\n\n if (looksLikeSubmissionId(pluginRef)) {\n const state = opts.watch\n ? await pollUntilTerminal(client, pluginRef, true)\n : await client.getArtifactSubmission(pluginRef);\n if (base.json) {\n printJson(state);\n return;\n }\n printInfo(`Submission: ${state.submission_id}`);\n printInfo(`Status: ${state.status}`);\n printInfo(`Terminal: ${state.terminal ? \"yes\" : \"no\"}`);\n if (state.scan?.status) printInfo(`Scan: ${state.scan.status}`);\n if (state.publish?.public_url) printInfo(`URL: ${state.publish.public_url}`);\n if (state.failure?.message) printWarn(`Failure: ${state.failure.message}`);\n return;\n }\n\n const submissionId = await resolvePluginSubmissionId(client, pluginRef, config.platformUrl);\n if (!submissionId) {\n await showPublishedPluginStatus(client, pluginRef, base.json);\n return;\n }\n\n if (!base.json) {\n printInfo(`Resolved plugin id \"${pluginRef}\" -> submission ${submissionId}`);\n }\n\n const current = await client.getArtifactSubmission(submissionId);\n if (current.terminal && current.status === \"published\") {\n await showPublishedPluginStatus(client, pluginRef, base.json);\n return;\n }\n\n const state = opts.watch\n ? await pollUntilTerminal(client, submissionId, true)\n : current;\n\n if (base.json) {\n printJson(state);\n return;\n }\n\n printInfo(`Submission: ${state.submission_id}`);\n printInfo(`Status: ${state.status}`);\n printInfo(`Terminal: ${state.terminal ? \"yes\" : \"no\"}`);\n if (state.scan?.status) printInfo(`Scan: ${state.scan.status}`);\n if (state.publish?.public_url) printInfo(`URL: ${state.publish.public_url}`);\n if (state.failure?.message) printWarn(`Failure: ${state.failure.message}`);\n}\n\nasync function runPublishLogs(\n getConfig: () => ResolvedConfig,\n pluginRef: string,\n _opts: PublishLogsOptions,\n): Promise<void> {\n const base = getConfig();\n const { config } = await requireCredentials(base, base.platformUrl);\n const client = new CliApiClient(config);\n const submissionId = await resolvePluginSubmissionId(client, pluginRef, config.platformUrl);\n if (!submissionId) {\n throw new AspError(`No publish logs found for plugin id: ${pluginRef}`, {\n code: \"NOT_FOUND\",\n hint:\n \"Use submission_id from publish output, or republish on this machine to cache the mapping.\",\n });\n }\n if (submissionId !== pluginRef && !base.json) {\n printInfo(`Resolved plugin id \"${pluginRef}\" -> submission ${submissionId}`);\n }\n const logs = await client.getArtifactSubmissionLogs(submissionId);\n\n if (base.json) {\n printJson(logs);\n return;\n }\n\n if (logs.items.length === 0) {\n printInfo(\"No logs yet.\");\n return;\n }\n const rows = logs.items.map((item) => [item.timestamp, item.level, item.message]);\n printTable([\"timestamp\", \"level\", \"message\"], rows);\n}\n\nexport function registerPluginCommands(program: Command, getConfig: () => ResolvedConfig): void {\n const plugin = program.command(\"plugin\").description(\"Plugin marketplace and publish commands\");\n\n plugin\n .command(\"search [query]\")\n .description(\"Search plugins\")\n .option(\"--category <code>\", \"Tech type/category code\")\n .option(\"--source <source>\", \"official | verified | community\")\n .option(\"--sort <sort>\", \"recommended | downloads | updated_at\")\n .option(\"--page-size <n>\", \"Page size\", (v) => Number.parseInt(v, 10))\n .option(\"--cursor <cursor>\", \"Cursor for next page\")\n .action(async (query: string | undefined, opts: SearchOptions) => {\n await runSearch(getConfig, query, opts);\n });\n\n plugin\n .command(\"info <pluginId>\")\n .description(\"Show plugin details\")\n .option(\"--version <version>\", \"Specify version\")\n .action(async (pluginId: string, opts: InfoOptions) => {\n await runInfo(getConfig, pluginId, opts);\n });\n\n plugin\n .command(\"versions <pluginId>\")\n .description(\"List published versions\")\n .action(async (pluginId: string) => {\n await runVersions(getConfig, pluginId);\n });\n\n plugin\n .command(\"install <pluginId>\")\n .description(\"Install plugin via qwenpaw\")\n .option(\"--version <version>\", \"Specify version\")\n .option(\"--via <tool>\", \"Install tool (qwenpaw)\", \"qwenpaw\")\n .action(async (pluginId: string, opts: InstallOptions) => {\n await runInstall(getConfig, pluginId, opts);\n });\n\n const publish = plugin\n .command(\"publish [zipPath]\")\n .description(\"Publish plugin from local zip or URL\")\n .option(\"--url <url>\", \"Publish from remote zip URL\")\n .option(\"--artifact-id <id>\", \"Optional plugin id override (must match plugin.json in zip mode)\")\n .option(\"--version <version>\", \"Optional version override\")\n .option(\"--category <code>\", \"Plugin category code (tool|provider|command|hook|frontend|general|app)\")\n .option(\"--repo-url <url>\", \"Repository URL\")\n .option(\"--publish-mode <mode>\", \"Publish mode\", \"auto_after_scan\")\n .option(\"--no-wait\", \"Do not wait for terminal status\")\n .action(async (zipPath: string | undefined, opts: PublishOptions) => {\n await runPublish(getConfig, zipPath, opts);\n });\n\n publish\n .command(\"status <pluginId>\")\n .description(\"Show publish status by plugin id or submission id\")\n .option(\"--watch\", \"Poll until terminal status\", false)\n .action(async (pluginId: string, opts: PublishStatusOptions) => {\n await runPublishStatus(getConfig, pluginId, opts);\n });\n\n publish\n .command(\"logs <pluginId>\")\n .description(\"Show publish logs by plugin id or submission id\")\n .action(async (pluginId: string, opts: PublishLogsOptions) => {\n await runPublishLogs(getConfig, pluginId, opts);\n });\n}\n\n","import { AspError } from \"./errors.js\";\n\nexport function appendOptionalArtifactFields(\n body: Record<string, unknown>,\n fields: { artifactId?: string; version?: string; repoUrl?: string },\n): Record<string, unknown> {\n if (fields.artifactId) body.artifact_id = fields.artifactId;\n if (fields.version) body.version = fields.version;\n if (fields.repoUrl) body.repo_url = fields.repoUrl;\n return body;\n}\n\nexport function looksLikeSubmissionId(id: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(id);\n}\n\nexport function assertSubmissionId(id: string, exampleCommand: string): void {\n if (looksLikeSubmissionId(id)) return;\n throw new AspError(`Invalid submission ID: ${id}`, {\n code: \"INVALID_REQUEST\",\n hint: `Use submission_id from publish output, not plugin/skill id. Example: ${exampleCommand}`,\n });\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getAspConfigDir } from \"../config.js\";\n\ninterface PublishRegistryEntry {\n submission_id: string;\n platform_url: string;\n plugin_id?: string;\n skill_id?: string;\n source_url?: string;\n updated_at: string;\n}\n\ninterface PublishRegistry {\n entries: PublishRegistryEntry[];\n}\n\nconst REGISTRY_FILE = \"publish-submissions.json\";\nconst MAX_ENTRIES = 200;\n\nfunction normalizePlatformUrl(url: string): string {\n return url.replace(/\\/$/, \"\");\n}\n\nasync function loadRegistry(): Promise<PublishRegistry> {\n try {\n const path = join(getAspConfigDir(), REGISTRY_FILE);\n const raw = await readFile(path, \"utf8\");\n return JSON.parse(raw) as PublishRegistry;\n } catch {\n return { entries: [] };\n }\n}\n\nasync function saveRegistry(registry: PublishRegistry): Promise<void> {\n const dir = getAspConfigDir();\n await mkdir(dir, { recursive: true });\n const path = join(dir, REGISTRY_FILE);\n await writeFile(path, `${JSON.stringify(registry, null, 2)}\\n`, \"utf8\");\n}\n\nexport async function recordPluginPublish(opts: {\n submissionId: string;\n platformUrl: string;\n pluginId?: string;\n sourceUrl?: string;\n}): Promise<void> {\n const registry = await loadRegistry();\n const platform = normalizePlatformUrl(opts.platformUrl);\n const now = new Date().toISOString();\n\n registry.entries = registry.entries.filter((entry) => {\n if (entry.platform_url !== platform) return true;\n if (entry.submission_id === opts.submissionId) return false;\n if (opts.pluginId && entry.plugin_id === opts.pluginId) return false;\n return true;\n });\n\n registry.entries.unshift({\n submission_id: opts.submissionId,\n platform_url: platform,\n plugin_id: opts.pluginId,\n source_url: opts.sourceUrl,\n updated_at: now,\n });\n\n registry.entries = registry.entries.slice(0, MAX_ENTRIES);\n await saveRegistry(registry);\n}\n\nexport async function lookupPluginSubmissionId(\n ref: string,\n platformUrl: string,\n): Promise<string | undefined> {\n return lookupArtifactSubmissionId(ref, platformUrl, \"plugin\");\n}\n\nexport async function recordSkillPublish(opts: {\n submissionId: string;\n platformUrl: string;\n skillId?: string;\n sourceUrl?: string;\n}): Promise<void> {\n const registry = await loadRegistry();\n const platform = normalizePlatformUrl(opts.platformUrl);\n const now = new Date().toISOString();\n\n registry.entries = registry.entries.filter((entry) => {\n if (entry.platform_url !== platform) return true;\n if (entry.submission_id === opts.submissionId) return false;\n if (opts.skillId && entry.skill_id === opts.skillId) return false;\n return true;\n });\n\n registry.entries.unshift({\n submission_id: opts.submissionId,\n platform_url: platform,\n skill_id: opts.skillId,\n source_url: opts.sourceUrl,\n updated_at: now,\n });\n\n registry.entries = registry.entries.slice(0, MAX_ENTRIES);\n await saveRegistry(registry);\n}\n\nexport async function lookupSkillSubmissionId(\n ref: string,\n platformUrl: string,\n): Promise<string | undefined> {\n return lookupArtifactSubmissionId(ref, platformUrl, \"skill\");\n}\n\nasync function lookupArtifactSubmissionId(\n ref: string,\n platformUrl: string,\n artifactType: \"plugin\" | \"skill\",\n): Promise<string | undefined> {\n const registry = await loadRegistry();\n const platform = normalizePlatformUrl(platformUrl);\n const refLower = ref.toLowerCase();\n\n for (const entry of registry.entries) {\n if (entry.platform_url !== platform) continue;\n if (entry.submission_id === ref) return entry.submission_id;\n const artifactId = artifactType === \"plugin\" ? entry.plugin_id : entry.skill_id;\n if (artifactId === ref) return entry.submission_id;\n if (entry.source_url?.toLowerCase().includes(refLower)) return entry.submission_id;\n }\n\n return undefined;\n}\n","import type { CliApiClient, CliSubmissionResponse } from \"../api/cli-api.js\";\nimport {\n lookupPluginSubmissionId,\n lookupSkillSubmissionId,\n recordPluginPublish,\n recordSkillPublish,\n} from \"./publish-registry.js\";\n\nconst SUBMISSION_ID_PATTERN =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\nconst SUBMISSION_ID_IN_PATH =\n /\\/artifact-submissions\\/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/i;\n\nfunction requestBodyMatchesArtifact(body: unknown, artifactId: string): boolean {\n if (!body || typeof body !== \"object\") return false;\n const record = body as Record<string, unknown>;\n if (record.artifact_id === artifactId) return true;\n\n if (typeof record.source_url !== \"string\") return false;\n const url = record.source_url.toLowerCase();\n const id = artifactId.toLowerCase();\n if (url.includes(id)) return true;\n\n const segments = url.split(/[/\\\\?&#]/).filter(Boolean);\n return segments.some((segment) => segment === id);\n}\n\nfunction submissionMatchesPlugin(\n state: CliSubmissionResponse,\n pluginId: string,\n): boolean {\n const anyState = state as CliSubmissionResponse & { artifact_id?: string };\n if (anyState.artifact_id === pluginId) return true;\n\n const pluginIdLower = pluginId.toLowerCase();\n const publicUrl = state.publish?.public_url?.toLowerCase();\n if (publicUrl?.includes(`/plugins/${pluginIdLower}`)) return true;\n return false;\n}\n\nasync function rememberResolvedSubmission(\n submissionId: string,\n platformUrl: string,\n state: CliSubmissionResponse,\n): Promise<void> {\n const anyState = state as CliSubmissionResponse & { artifact_id?: string };\n if (!anyState.artifact_id) return;\n await recordPluginPublish({\n submissionId,\n platformUrl,\n pluginId: anyState.artifact_id,\n });\n}\n\nexport async function resolvePluginSubmissionId(\n client: CliApiClient,\n pluginId: string,\n platformUrl: string,\n): Promise<string | undefined> {\n if (SUBMISSION_ID_PATTERN.test(pluginId)) return pluginId;\n\n const cached = await lookupPluginSubmissionId(pluginId, platformUrl);\n if (cached) return cached;\n\n const latestSeenAt = new Map<string, string>();\n let cursor: string | undefined;\n\n for (let page = 0; page < 10; page += 1) {\n const response = await client.getRequestLogs({ page_size: 100, cursor });\n for (const item of response.items) {\n const match = item.path.match(SUBMISSION_ID_IN_PATH);\n if (match) {\n const submissionId = match[1];\n const previous = latestSeenAt.get(submissionId);\n if (!previous || item.created_at > previous) {\n latestSeenAt.set(submissionId, item.created_at);\n }\n }\n\n if (\n item.method === \"POST\" &&\n item.path.endsWith(\"/artifact-submissions\") &&\n requestBodyMatchesArtifact(item.request_body, pluginId)\n ) {\n const postMatch = item.path.match(SUBMISSION_ID_IN_PATH);\n if (postMatch) {\n latestSeenAt.set(postMatch[1], item.created_at);\n }\n }\n }\n if (!response.next_cursor) break;\n cursor = response.next_cursor ?? undefined;\n }\n\n const candidates = [...latestSeenAt.entries()]\n .sort((a, b) => b[1].localeCompare(a[1]))\n .map(([submissionId]) => submissionId)\n .slice(0, 50);\n\n const pluginIdLower = pluginId.toLowerCase();\n\n for (const candidate of candidates) {\n try {\n const state = await client.getArtifactSubmission(candidate);\n if (submissionMatchesPlugin(state, pluginId)) {\n await rememberResolvedSubmission(candidate, platformUrl, state);\n return candidate;\n }\n\n const logs = await client.getArtifactSubmissionLogs(candidate);\n const matched = logs.items.some((item) =>\n item.message.toLowerCase().includes(pluginIdLower),\n );\n if (matched) {\n await rememberResolvedSubmission(candidate, platformUrl, state);\n return candidate;\n }\n } catch {\n continue;\n }\n }\n\n return undefined;\n}\n\nfunction submissionMatchesSkill(\n state: CliSubmissionResponse,\n skillId: string,\n): boolean {\n const anyState = state as CliSubmissionResponse & { artifact_id?: string };\n if (anyState.artifact_id === skillId) return true;\n\n const skillIdLower = skillId.toLowerCase();\n const publicUrl = state.publish?.public_url?.toLowerCase();\n if (publicUrl?.includes(`/skills/${skillIdLower}`)) return true;\n return false;\n}\n\nasync function rememberResolvedSkillSubmission(\n submissionId: string,\n platformUrl: string,\n state: CliSubmissionResponse,\n): Promise<void> {\n const anyState = state as CliSubmissionResponse & { artifact_id?: string };\n if (!anyState.artifact_id) return;\n await recordSkillPublish({\n submissionId,\n platformUrl,\n skillId: anyState.artifact_id,\n });\n}\n\nexport async function resolveSkillSubmissionId(\n client: CliApiClient,\n skillId: string,\n platformUrl: string,\n): Promise<string | undefined> {\n if (SUBMISSION_ID_PATTERN.test(skillId)) return skillId;\n\n const cached = await lookupSkillSubmissionId(skillId, platformUrl);\n if (cached) return cached;\n\n const latestSeenAt = new Map<string, string>();\n let cursor: string | undefined;\n\n for (let page = 0; page < 10; page += 1) {\n const response = await client.getRequestLogs({ page_size: 100, cursor });\n for (const item of response.items) {\n const match = item.path.match(SUBMISSION_ID_IN_PATH);\n if (match) {\n const submissionId = match[1];\n const previous = latestSeenAt.get(submissionId);\n if (!previous || item.created_at > previous) {\n latestSeenAt.set(submissionId, item.created_at);\n }\n }\n\n if (\n item.method === \"POST\" &&\n item.path.endsWith(\"/artifact-submissions\") &&\n requestBodyMatchesArtifact(item.request_body, skillId)\n ) {\n const postMatch = item.path.match(SUBMISSION_ID_IN_PATH);\n if (postMatch) {\n latestSeenAt.set(postMatch[1], item.created_at);\n }\n }\n }\n if (!response.next_cursor) break;\n cursor = response.next_cursor ?? undefined;\n }\n\n const candidates = [...latestSeenAt.entries()]\n .sort((a, b) => b[1].localeCompare(a[1]))\n .map(([submissionId]) => submissionId)\n .slice(0, 50);\n\n const skillIdLower = skillId.toLowerCase();\n\n for (const candidate of candidates) {\n try {\n const state = await client.getArtifactSubmission(candidate);\n if (submissionMatchesSkill(state, skillId)) {\n await rememberResolvedSkillSubmission(candidate, platformUrl, state);\n return candidate;\n }\n\n const logs = await client.getArtifactSubmissionLogs(candidate);\n const matched = logs.items.some((item) =>\n item.message.toLowerCase().includes(skillIdLower),\n );\n if (matched) {\n await rememberResolvedSkillSubmission(candidate, platformUrl, state);\n return candidate;\n }\n } catch {\n continue;\n }\n }\n\n return undefined;\n}\n","import type { CliApiClient, CliSubmissionResponse } from \"../api/cli-api.js\";\nimport { printInfo } from \"./output.js\";\n\nexport class SubmissionWaitInterruptedError extends Error {\n readonly submissionId: string;\n\n constructor(submissionId: string) {\n super(\"Submission wait interrupted\");\n this.name = \"SubmissionWaitInterruptedError\";\n this.submissionId = submissionId;\n }\n}\n\nfunction sleep(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n reject(new Error(\"aborted\"));\n return;\n }\n\n const timer = setTimeout(() => {\n signal.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n\n const onAbort = () => {\n clearTimeout(timer);\n reject(new Error(\"aborted\"));\n };\n\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nexport async function pollUntilTerminal(\n client: CliApiClient,\n submissionId: string,\n watch: boolean,\n): Promise<CliSubmissionResponse> {\n let lastStatus = \"\";\n const controller = new AbortController();\n\n const onInterrupt = () => {\n controller.abort();\n };\n\n process.once(\"SIGINT\", onInterrupt);\n try {\n while (!controller.signal.aborted) {\n const current = await client.getArtifactSubmission(submissionId);\n if (watch && current.status !== lastStatus) {\n printInfo(`Submission ${submissionId}: ${current.status}`);\n lastStatus = current.status;\n }\n if (current.terminal) return current;\n\n const sleepSec = Math.max(current.next_poll_after_seconds ?? 15, 1);\n try {\n await sleep(sleepSec * 1000, controller.signal);\n } catch {\n throw new SubmissionWaitInterruptedError(submissionId);\n }\n }\n\n throw new SubmissionWaitInterruptedError(submissionId);\n } finally {\n process.removeListener(\"SIGINT\", onInterrupt);\n }\n}\n","import type { PluginListItem } from \"../api/cli-api.js\";\n\nexport function formatPluginListTechType(item: PluginListItem): string {\n return item.tech_type ?? item.category ?? item.source ?? \"-\";\n}\n","import { basename } from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport { spawn } from \"node:child_process\";\nimport { createInterface } from \"node:readline/promises\";\nimport { stdin as input, stdout as output } from \"node:process\";\nimport type { Command } from \"commander\";\nimport type { ResolvedConfig } from \"../config.js\";\nimport { CliApiClient, type CliSubmissionResponse } from \"../api/cli-api.js\";\nimport { CLI_VERSION } from \"../constants.js\";\nimport { AspError } from \"../utils/errors.js\";\nimport {\n printInfo,\n printJson,\n printSuccess,\n printTable,\n printWarn,\n} from \"../utils/output.js\";\nimport {\n envCommandSuffix,\n formatPlatformLabel,\n requireCredentials,\n} from \"../utils/platform.js\";\nimport { appendOptionalArtifactFields, looksLikeSubmissionId } from \"../utils/artifact-publish.js\";\nimport { recordSkillPublish } from \"../utils/publish-registry.js\";\nimport { resolveSkillSubmissionId } from \"../utils/submission-resolve.js\";\nimport { pollUntilTerminal } from \"../utils/submission-poll.js\";\nimport {\n readSkillManifestFromZip,\n type SkillManifest,\n} from \"../utils/skill-manifest.js\";\n\ninterface SearchOptions {\n category?: string;\n source?: \"official\" | \"verified\" | \"community\";\n tag?: string;\n sort?: \"recommended\" | \"downloads\" | \"updated_at\";\n pageSize?: number;\n cursor?: string;\n}\n\ninterface InfoOptions {\n version?: string;\n}\n\ninterface InstallOptions {\n version?: string;\n via?: \"qwenpaw\";\n}\n\ninterface PublishOptions {\n url?: string;\n artifactId?: string;\n version?: string;\n category?: SkillCategory;\n tags?: string;\n repoUrl?: string;\n publishMode?: \"auto_after_scan\";\n noWait?: boolean;\n}\n\ninterface PublishStatusOptions {\n watch?: boolean;\n}\n\ntype SkillCategory =\n | \"engineering development\"\n | \"data research\"\n | \"document office\"\n | \"design creation\"\n | \"automation integration\"\n | \"product management\"\n | \"marketing growth\"\n | \"security compliance\"\n | \"education knowledge\"\n | \"plugin development\"\n | \"skills management\"\n | \"others\";\n\nconst SKILL_CATEGORY_OPTIONS: Array<{\n value: SkillCategory;\n label: string;\n}> = [\n { value: \"engineering development\", label: \"工程开发\" },\n { value: \"data research\", label: \"数据研究\" },\n { value: \"document office\", label: \"文档办公\" },\n { value: \"design creation\", label: \"设计创作\" },\n { value: \"automation integration\", label: \"自动化集成\" },\n { value: \"product management\", label: \"产品管理\" },\n { value: \"marketing growth\", label: \"营销增长\" },\n { value: \"security compliance\", label: \"安全合规\" },\n { value: \"education knowledge\", label: \"教育知识\" },\n { value: \"plugin development\", label: \"Plugin 开发\" },\n { value: \"skills management\", label: \"Skills 管理\" },\n { value: \"others\", label: \"其它\" },\n];\n\nfunction getClient(getConfig: () => ResolvedConfig): CliApiClient {\n return new CliApiClient(getConfig());\n}\n\nfunction parseTags(tags?: string): string[] | undefined {\n if (!tags) return undefined;\n return tags\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean)\n .slice(0, 3);\n}\n\nasync function runSearch(\n getConfig: () => ResolvedConfig,\n query: string | undefined,\n opts: SearchOptions,\n): Promise<void> {\n const config = getConfig();\n const client = getClient(getConfig);\n const response = await client.searchSkills({\n q: query,\n category: opts.category,\n source: opts.source,\n tag: opts.tag,\n sort: opts.sort,\n page_size: opts.pageSize,\n cursor: opts.cursor,\n });\n\n if (config.json) {\n printJson(response);\n return;\n }\n\n if (response.items.length === 0) {\n printInfo(\"No skills found.\");\n return;\n }\n\n const rows = response.items.map((item) => [\n item.skill_id,\n String(item.latest_version ?? \"-\"),\n String(item.category ?? \"-\"),\n String(item.source ?? \"-\"),\n ]);\n printTable([\"skill_id\", \"version\", \"category\", \"source\"], rows);\n if (response.next_cursor) {\n printInfo(`Next cursor: ${response.next_cursor}`);\n }\n}\n\nasync function runInfo(\n getConfig: () => ResolvedConfig,\n skillId: string,\n opts: InfoOptions,\n): Promise<void> {\n const config = getConfig();\n const client = getClient(getConfig);\n const response = await client.getSkillInfo(skillId, opts.version);\n if (config.json) {\n printJson(response);\n return;\n }\n\n printInfo(`Skill: ${response.skill_id}`);\n if (response.latest_version) printInfo(`Version: ${response.latest_version}`);\n if (response.scan_status) printInfo(`Scan: ${response.scan_status}`);\n if (response.install_command) printInfo(`Install: ${response.install_command}`);\n if (response.public_url) printInfo(`URL: ${response.public_url}`);\n}\n\nasync function runVersions(getConfig: () => ResolvedConfig, skillId: string): Promise<void> {\n const config = getConfig();\n const client = getClient(getConfig);\n const response = await client.getSkillVersions(skillId);\n if (config.json) {\n printJson(response);\n return;\n }\n if (response.items.length === 0) {\n printInfo(\"No published versions.\");\n return;\n }\n const rows = response.items.map((item) => [\n item.version,\n item.published_at ?? \"-\",\n item.deprecated ? \"yes\" : \"no\",\n ]);\n printTable([\"version\", \"published_at\", \"deprecated\"], rows);\n}\n\nasync function runInstall(\n getConfig: () => ResolvedConfig,\n skillId: string,\n opts: InstallOptions,\n): Promise<void> {\n const base = getConfig();\n const { config } = await requireCredentials(base, base.platformUrl);\n const client = new CliApiClient(config);\n const intent = await client.createSkillInstallIntent(skillId, opts.version);\n\n if (base.json) {\n printJson(intent);\n return;\n }\n\n if (opts.via !== undefined && opts.via !== \"qwenpaw\") {\n throw new AspError(\"Only --via qwenpaw is supported now.\", {\n code: \"INVALID_REQUEST\",\n });\n }\n\n const installCmd = `qwenpaw skills install ${intent.download_url}`;\n printInfo(`Run to install:\\n ${installCmd}`);\n if (intent.sha512) printInfo(`sha512: ${intent.sha512}`);\n if (intent.expires_at) printInfo(`URL expires at: ${intent.expires_at}`);\n\n const child = spawn(\"qwenpaw\", [\"skills\", \"install\", intent.download_url], {\n stdio: \"inherit\",\n });\n await new Promise<void>((resolve, reject) => {\n child.on(\"exit\", (code) => {\n if (code === 0) resolve();\n else reject(new AspError(`qwenpaw exited with code ${code ?? 1}`, { code: \"QWENPAW_FAILED\" }));\n });\n child.on(\"error\", reject);\n });\n}\n\nasync function uploadZipToSignedUrl(upload: {\n url: string;\n method?: string;\n headers?: Record<string, string>;\n}, fileBuffer: Buffer): Promise<void> {\n const response = await fetch(upload.url, {\n method: upload.method ?? \"PUT\",\n headers: upload.headers ?? {},\n body: fileBuffer,\n });\n if (!response.ok) {\n throw new AspError(`Upload failed with HTTP ${response.status}`, {\n code: \"UPLOAD_FAILED\",\n statusCode: response.status,\n });\n }\n}\n\nfunction buildZipBody(\n filePath: string,\n fileBuffer: Buffer,\n sha512: string,\n opts: PublishOptions & { category: SkillCategory },\n): Record<string, unknown> {\n const body = appendOptionalArtifactFields(\n {\n artifact_type: \"skill\",\n package_source: \"zip\",\n category: opts.category,\n tags: parseTags(opts.tags),\n filename: basename(filePath),\n size_bytes: fileBuffer.byteLength,\n sha512,\n publish_mode: opts.publishMode ?? \"auto_after_scan\",\n client: {\n name: \"agentscope-platform-cli\",\n version: CLI_VERSION,\n },\n },\n {\n artifactId: opts.artifactId,\n version: opts.version,\n repoUrl: opts.repoUrl,\n },\n );\n return body;\n}\n\nfunction buildUrlBody(opts: PublishOptions & { category: SkillCategory }): Record<string, unknown> {\n return appendOptionalArtifactFields(\n {\n artifact_type: \"skill\",\n package_source: \"url\",\n source_url: opts.url,\n category: opts.category,\n tags: parseTags(opts.tags),\n publish_mode: opts.publishMode ?? \"auto_after_scan\",\n client: {\n name: \"agentscope-platform-cli\",\n version: CLI_VERSION,\n },\n },\n {\n artifactId: opts.artifactId,\n version: opts.version,\n repoUrl: opts.repoUrl,\n },\n );\n}\n\nfunction parseCategory(inputValue: string | undefined): SkillCategory | undefined {\n if (!inputValue) return undefined;\n const normalized = inputValue.trim().toLowerCase();\n if (SKILL_CATEGORY_OPTIONS.some((item) => item.value === normalized)) {\n return normalized as SkillCategory;\n }\n return undefined;\n}\n\nasync function resolvePublishCategory(\n opts: PublishOptions,\n jsonOutput: boolean,\n): Promise<SkillCategory> {\n const fromArg = parseCategory(opts.category);\n if (fromArg) return fromArg;\n\n if (opts.category && !fromArg) {\n throw new AspError(`Invalid --category: ${opts.category}`, {\n code: \"INVALID_REQUEST\",\n hint: `Use one of: ${SKILL_CATEGORY_OPTIONS.map((item) => item.value).join(\", \")}`,\n });\n }\n\n if (jsonOutput || !input.isTTY || !output.isTTY) {\n throw new AspError(\"Skill publish requires --category.\", {\n code: \"INVALID_REQUEST\",\n hint: `Use --category with one of: ${SKILL_CATEGORY_OPTIONS.map((item) => item.value).join(\", \")}`,\n });\n }\n\n printInfo(\"Select skill category:\");\n for (const [index, item] of SKILL_CATEGORY_OPTIONS.entries()) {\n printInfo(`${index + 1}) ${item.value} - ${item.label}`);\n }\n\n const rl = createInterface({ input, output });\n try {\n while (true) {\n const answer = (await rl.question(\"Enter category number or value: \")).trim();\n const index = Number.parseInt(answer, 10);\n if (!Number.isNaN(index) && index >= 1 && index <= SKILL_CATEGORY_OPTIONS.length) {\n const selected = SKILL_CATEGORY_OPTIONS[index - 1].value;\n printInfo(`Selected category: ${selected}`);\n return selected;\n }\n const byValue = parseCategory(answer);\n if (byValue) {\n printInfo(`Selected category: ${byValue}`);\n return byValue;\n }\n printWarn(`Invalid choice. Use 1-${SKILL_CATEGORY_OPTIONS.length} or category value.`);\n }\n } finally {\n rl.close();\n }\n}\n\nasync function resolvePublishVersion(jsonOutput: boolean): Promise<string> {\n if (jsonOutput || !input.isTTY || !output.isTTY) {\n throw new AspError(\"Skill publish requires version.\", {\n code: \"INVALID_REQUEST\",\n hint: \"Add `version: 1.0.0` to SKILL.md frontmatter, or pass --version 1.0.0.\",\n });\n }\n\n const rl = createInterface({ input, output });\n try {\n while (true) {\n const answer = (await rl.question(\"Enter skill version (e.g. 1.0.0): \")).trim();\n if (answer) {\n printInfo(`Using version: ${answer}`);\n return answer;\n }\n printWarn(\"Version is required. Example: 1.0.0\");\n }\n } finally {\n rl.close();\n }\n}\n\nfunction isMissingVersionError(err: unknown): boolean {\n if (!(err instanceof AspError)) return false;\n if (err.code !== \"INVALID_REQUEST\") return false;\n const message = `${err.message} ${err.hint ?? \"\"}`.toLowerCase();\n return message.includes(\"version\") || message.includes(\"skill.md\");\n}\n\nfunction printSkillManifestPreview(manifest: SkillManifest | undefined, jsonOutput: boolean): void {\n if (jsonOutput || !manifest) return;\n if (manifest.name) {\n printInfo(`Package skill id: ${manifest.name}`);\n }\n if (manifest.version) {\n printInfo(`Package version: ${manifest.version}`);\n }\n}\n\nfunction validateExplicitSkillOverrides(\n opts: PublishOptions,\n manifest: SkillManifest | undefined,\n): void {\n if (opts.artifactId && manifest?.name && opts.artifactId !== manifest.name) {\n throw new AspError(\n `artifact_id mismatch: --artifact-id=${opts.artifactId}, SKILL.md name=${manifest.name}`,\n {\n code: \"ARTIFACT_ID_MISMATCH\",\n hint: \"Remove --artifact-id or fix the value to match SKILL.md.\",\n },\n );\n }\n if (opts.version && manifest?.version && opts.version !== manifest.version) {\n throw new AspError(\n `version mismatch: --version=${opts.version}, SKILL.md version=${manifest.version}`,\n {\n code: \"VERSION_MISMATCH\",\n hint: \"Remove --version or fix the value to match SKILL.md.\",\n },\n );\n }\n}\n\nfunction resolveSkillPublishFields(\n opts: PublishOptions & { category: SkillCategory },\n manifest: SkillManifest | undefined,\n): PublishOptions & { category: SkillCategory } {\n return {\n ...opts,\n artifactId: opts.artifactId ?? manifest?.name,\n version: opts.version ?? manifest?.version,\n };\n}\n\nfunction isMissingCategoryError(err: unknown): boolean {\n if (!(err instanceof AspError)) return false;\n if (err.code !== \"INVALID_REQUEST\") return false;\n const message = `${err.message} ${err.hint ?? \"\"}`.toLowerCase();\n return message.includes(\"category\") || message.includes(\"技术类型\") || message.includes(\"大类\");\n}\n\nfunction tryParseSkillIdFromUrl(urlValue: string | undefined): string | undefined {\n if (!urlValue) return undefined;\n try {\n const parsed = new URL(urlValue);\n const segments = parsed.pathname\n .split(\"/\")\n .map((item) => item.trim())\n .filter(Boolean);\n const skillsIdx = segments.findIndex((item) => item.toLowerCase() === \"skills\");\n if (skillsIdx >= 0 && segments[skillsIdx + 1]) {\n return segments[skillsIdx + 1];\n }\n const last = segments[segments.length - 1];\n if (last?.toLowerCase().endsWith(\".zip\")) {\n return last.replace(/-\\d+\\.\\d+\\.\\d+.*\\.zip$/i, \"\").replace(/\\.zip$/i, \"\");\n }\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nasync function showPublishedSkillStatus(\n client: CliApiClient,\n skillId: string,\n jsonOutput: boolean,\n): Promise<void> {\n try {\n const info = await client.getSkillInfo(skillId);\n if (jsonOutput) {\n printJson({\n skill_id: info.skill_id,\n status: \"published\",\n terminal: true,\n latest_version: info.latest_version,\n scan_status: info.scan_status,\n public_url: info.public_url,\n install_command: info.install_command,\n });\n return;\n }\n\n printInfo(`Skill: ${info.skill_id}`);\n printInfo(\"Status: published\");\n printInfo(\"Terminal: yes\");\n if (info.latest_version) printInfo(`Version: ${info.latest_version}`);\n if (info.scan_status) printInfo(`Scan: ${info.scan_status}`);\n if (info.public_url) printInfo(`URL: ${info.public_url}`);\n if (info.install_command) printInfo(`Install: ${info.install_command}`);\n } catch (err) {\n if (err instanceof AspError && err.statusCode === 404) {\n throw new AspError(`No submission or published skill found: ${skillId}`, {\n code: \"NOT_FOUND\",\n hint:\n \"If the skill is still scanning, use submission_id from publish output. \" +\n \"Republish on this machine to cache skill_id mapping locally.\",\n });\n }\n throw err;\n }\n}\n\nasync function runPublish(\n getConfig: () => ResolvedConfig,\n zipPath: string | undefined,\n opts: PublishOptions,\n): Promise<void> {\n const base = getConfig();\n const { config } = await requireCredentials(base, base.platformUrl);\n const client = new CliApiClient(config);\n let publishOpts: PublishOptions & { category: SkillCategory };\n try {\n const category = await resolvePublishCategory(opts, base.json);\n publishOpts = { ...opts, category };\n } catch (err) {\n if (!isMissingCategoryError(err)) throw err;\n const category = await resolvePublishCategory({ ...opts, category: undefined }, base.json);\n publishOpts = { ...opts, category };\n }\n\n const useUrlMode = Boolean(opts.url);\n if (useUrlMode && zipPath) {\n const suffix = envCommandSuffix(config.platformUrl);\n throw new AspError(\"Do not pass zip path when using --url.\", {\n code: \"INVALID_REQUEST\",\n hint:\n `Use either \\`asp skill publish ./skill.zip${suffix}\\` or ` +\n `\\`asp skill publish --url <url>${suffix}\\`.`,\n });\n }\n if (!useUrlMode && !zipPath) {\n const suffix = envCommandSuffix(config.platformUrl);\n throw new AspError(\"Zip path is required unless --url is provided.\", {\n code: \"INVALID_REQUEST\",\n hint: `Use \\`asp skill publish ./skill.zip${suffix}\\`.`,\n });\n }\n\n const manifest = useUrlMode ? undefined : await readSkillManifestFromZip(zipPath);\n printSkillManifestPreview(manifest, base.json);\n validateExplicitSkillOverrides(publishOpts, manifest);\n publishOpts = resolveSkillPublishFields(publishOpts, manifest);\n if (!publishOpts.version) {\n publishOpts.version = await resolvePublishVersion(base.json);\n }\n\n let submission: CliSubmissionResponse;\n const tryCreateSubmission = async (): Promise<CliSubmissionResponse> => {\n if (useUrlMode) {\n return client.createArtifactSubmission(buildUrlBody(publishOpts));\n }\n const fileBuffer = await readFile(zipPath as string);\n const sha512 = createHash(\"sha512\").update(fileBuffer).digest(\"hex\");\n let localSubmission = await client.createArtifactSubmission(\n buildZipBody(zipPath as string, fileBuffer, sha512, publishOpts),\n );\n if (!localSubmission.upload?.url) {\n throw new AspError(\"Missing upload URL for zip submission.\", {\n code: \"UPLOAD_URL_MISSING\",\n });\n }\n await uploadZipToSignedUrl(localSubmission.upload, fileBuffer);\n localSubmission = await client.completeArtifactSubmission(localSubmission.submission_id, {\n sha512,\n size_bytes: fileBuffer.byteLength,\n });\n return localSubmission;\n };\n\n try {\n submission = await tryCreateSubmission();\n } catch (err) {\n if (isMissingVersionError(err)) {\n if (base.json || !input.isTTY || !output.isTTY) {\n throw new AspError(\"SKILL.md in zip is missing version.\", {\n code: \"INVALID_REQUEST\",\n hint:\n \"Add `version: 1.0.0` to SKILL.md frontmatter (between --- markers), \" +\n \"or pass --version 1.0.0.\",\n });\n }\n printWarn(\"Publish failed due to missing version, please enter one and retrying...\");\n publishOpts.version = await resolvePublishVersion(base.json);\n submission = await tryCreateSubmission();\n } else if (!isMissingCategoryError(err) || base.json || !input.isTTY || !output.isTTY) {\n throw err;\n } else {\n printWarn(\"Publish failed due to missing category, please choose one and retrying...\");\n const category = await resolvePublishCategory({ ...opts, category: undefined }, base.json);\n publishOpts = { ...publishOpts, category };\n submission = await tryCreateSubmission();\n }\n }\n\n const urlSkillId = useUrlMode ? tryParseSkillIdFromUrl(publishOpts.url) : undefined;\n await recordSkillPublish({\n submissionId: submission.submission_id,\n platformUrl: config.platformUrl,\n skillId: publishOpts.artifactId ?? urlSkillId,\n sourceUrl: useUrlMode ? publishOpts.url : undefined,\n });\n\n if (base.json) {\n printJson(submission);\n return;\n }\n\n printSuccess(`Submission created: ${submission.submission_id}`);\n printInfo(`Initial status: ${submission.status}`);\n const trackRef =\n publishOpts.artifactId ?? urlSkillId ?? submission.submission_id;\n\n if (opts.noWait) {\n const envSuffix = envCommandSuffix(config.platformUrl);\n printInfo(`Track progress: asp skill publish status ${trackRef}${envSuffix}`);\n printInfo(`Show logs: asp skill publish logs ${trackRef}${envSuffix}`);\n return;\n }\n\n if (!submission.terminal) {\n printSuccess(\"Upload submitted successfully. Scanning continues asynchronously.\");\n const envSuffix = envCommandSuffix(config.platformUrl);\n printInfo(`Track progress: asp skill publish status ${trackRef} --watch${envSuffix}`);\n printInfo(`Show logs: asp skill publish logs ${trackRef}${envSuffix}`);\n return;\n }\n\n if (submission.status === \"published\") {\n printSuccess(`Published successfully (${formatPlatformLabel(config.platformUrl)})`);\n if (submission.publish?.public_url) {\n printInfo(`URL: ${submission.publish.public_url}`);\n }\n return;\n }\n\n printWarn(`Submission ended with status: ${submission.status}`);\n if (submission.failure?.message) {\n printWarn(`Failure: ${submission.failure.message}`);\n }\n const envSuffix = envCommandSuffix(config.platformUrl);\n printInfo(`Inspect logs: asp skill publish logs ${trackRef}${envSuffix}`);\n}\n\nasync function runPublishStatus(\n getConfig: () => ResolvedConfig,\n skillRef: string,\n opts: PublishStatusOptions,\n): Promise<void> {\n const base = getConfig();\n const { config } = await requireCredentials(base, base.platformUrl);\n const client = new CliApiClient(config);\n\n if (looksLikeSubmissionId(skillRef)) {\n const state = opts.watch\n ? await pollUntilTerminal(client, skillRef, true)\n : await client.getArtifactSubmission(skillRef);\n if (base.json) {\n printJson(state);\n return;\n }\n printInfo(`Submission: ${state.submission_id}`);\n printInfo(`Status: ${state.status}`);\n printInfo(`Terminal: ${state.terminal ? \"yes\" : \"no\"}`);\n if (state.scan?.status) printInfo(`Scan: ${state.scan.status}`);\n if (state.publish?.public_url) printInfo(`URL: ${state.publish.public_url}`);\n if (state.failure?.message) printWarn(`Failure: ${state.failure.message}`);\n return;\n }\n\n const submissionId = await resolveSkillSubmissionId(client, skillRef, config.platformUrl);\n if (!submissionId) {\n await showPublishedSkillStatus(client, skillRef, base.json);\n return;\n }\n\n if (!base.json) {\n printInfo(`Resolved skill id \"${skillRef}\" -> submission ${submissionId}`);\n }\n\n const current = await client.getArtifactSubmission(submissionId);\n if (current.terminal && current.status === \"published\") {\n await showPublishedSkillStatus(client, skillRef, base.json);\n return;\n }\n\n const state = opts.watch\n ? await pollUntilTerminal(client, submissionId, true)\n : current;\n\n if (base.json) {\n printJson(state);\n return;\n }\n\n printInfo(`Submission: ${state.submission_id}`);\n printInfo(`Status: ${state.status}`);\n printInfo(`Terminal: ${state.terminal ? \"yes\" : \"no\"}`);\n if (state.scan?.status) printInfo(`Scan: ${state.scan.status}`);\n if (state.publish?.public_url) printInfo(`URL: ${state.publish.public_url}`);\n if (state.failure?.message) printWarn(`Failure: ${state.failure.message}`);\n}\n\nasync function runPublishLogs(\n getConfig: () => ResolvedConfig,\n skillRef: string,\n): Promise<void> {\n const base = getConfig();\n const { config } = await requireCredentials(base, base.platformUrl);\n const client = new CliApiClient(config);\n const submissionId = await resolveSkillSubmissionId(client, skillRef, config.platformUrl);\n if (!submissionId) {\n throw new AspError(`No publish logs found for skill id: ${skillRef}`, {\n code: \"NOT_FOUND\",\n hint:\n \"Use submission_id from publish output, or republish on this machine to cache the mapping.\",\n });\n }\n if (submissionId !== skillRef && !base.json) {\n printInfo(`Resolved skill id \"${skillRef}\" -> submission ${submissionId}`);\n }\n const logs = await client.getArtifactSubmissionLogs(submissionId);\n\n if (base.json) {\n printJson(logs);\n return;\n }\n\n if (logs.items.length === 0) {\n printInfo(\"No logs yet.\");\n return;\n }\n const rows = logs.items.map((item) => [item.timestamp, item.level, item.message]);\n printTable([\"timestamp\", \"level\", \"message\"], rows);\n}\n\nexport function registerSkillCommands(program: Command, getConfig: () => ResolvedConfig): void {\n const skill = program.command(\"skill\").description(\"Skill marketplace and publish commands\");\n\n skill\n .command(\"search [query]\")\n .description(\"Search skills\")\n .option(\"--category <code>\", \"Skill category code\")\n .option(\"--source <source>\", \"official | verified | community\")\n .option(\"--tag <tag>\", \"Tag filter\")\n .option(\"--sort <sort>\", \"recommended | downloads | updated_at\")\n .option(\"--page-size <n>\", \"Page size\", (v) => Number.parseInt(v, 10))\n .option(\"--cursor <cursor>\", \"Cursor for next page\")\n .action(async (query: string | undefined, opts: SearchOptions) => {\n await runSearch(getConfig, query, opts);\n });\n\n skill\n .command(\"info <skillId>\")\n .description(\"Show skill details\")\n .option(\"--version <version>\", \"Specify version\")\n .action(async (skillId: string, opts: InfoOptions) => {\n await runInfo(getConfig, skillId, opts);\n });\n\n skill\n .command(\"versions <skillId>\")\n .description(\"List published versions\")\n .action(async (skillId: string) => {\n await runVersions(getConfig, skillId);\n });\n\n skill\n .command(\"install <skillId>\")\n .description(\"Install skill via qwenpaw\")\n .option(\"--version <version>\", \"Specify version\")\n .option(\"--via <tool>\", \"Install tool (qwenpaw)\", \"qwenpaw\")\n .action(async (skillId: string, opts: InstallOptions) => {\n await runInstall(getConfig, skillId, opts);\n });\n\n const publish = skill\n .command(\"publish [zipPath]\")\n .description(\"Publish skill from local zip or URL\")\n .option(\"--url <url>\", \"Publish from remote zip URL\")\n .option(\"--artifact-id <id>\", \"Optional skill id override (must match SKILL.md in zip mode)\")\n .option(\"--version <version>\", \"Skill version (prompted if SKILL.md has no version)\")\n .option(\n \"--category <code>\",\n \"Skill category code (engineering development|data research|document office|design creation|automation integration|product management|marketing growth|security compliance|education knowledge|plugin development|skills management|others)\",\n )\n .option(\"--tags <csv>\", \"Optional tags, comma-separated, max 3\")\n .option(\"--repo-url <url>\", \"Repository URL\")\n .option(\"--publish-mode <mode>\", \"Publish mode\", \"auto_after_scan\")\n .option(\"--no-wait\", \"Do not wait for terminal status\")\n .action(async (zipPath: string | undefined, opts: PublishOptions) => {\n await runPublish(getConfig, zipPath, opts);\n });\n\n publish\n .command(\"status <skillId>\")\n .description(\"Show publish status by skill id or submission id\")\n .option(\"--watch\", \"Poll until terminal status\", false)\n .action(async (skillId: string, opts: PublishStatusOptions) => {\n await runPublishStatus(getConfig, skillId, opts);\n });\n\n publish\n .command(\"logs <skillId>\")\n .description(\"Show publish logs by skill id or submission id\")\n .action(async (skillId: string) => {\n await runPublishLogs(getConfig, skillId);\n });\n}\n","import { spawn } from \"node:child_process\";\n\nexport interface SkillManifest {\n name?: string;\n version?: string;\n}\n\nasync function runCommand(command: string, args: string[]): Promise<string> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n let stdout = \"\";\n let stderr = \"\";\n child.stdout.on(\"data\", (chunk: Buffer) => {\n stdout += chunk.toString();\n });\n child.stderr.on(\"data\", (chunk: Buffer) => {\n stderr += chunk.toString();\n });\n child.on(\"error\", reject);\n child.on(\"close\", (code) => {\n if (code === 0) resolve(stdout);\n else reject(new Error(stderr || `Command failed: ${command} ${args.join(\" \")}`));\n });\n });\n}\n\nfunction parseSkillFrontmatter(content: string): SkillManifest {\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (!match) return {};\n\n const yaml = match[1];\n const manifest: SkillManifest = {};\n\n const nameMatch = yaml.match(/^name:\\s*[\"']?([^\"'\\n]+)[\"']?\\s*$/m);\n if (nameMatch) manifest.name = nameMatch[1].trim();\n\n const versionMatch = yaml.match(/^version:\\s*[\"']?([^\"'\\n]+)[\"']?\\s*$/m);\n if (versionMatch) {\n manifest.version = versionMatch[1].trim();\n return manifest;\n }\n\n const metadataVersionMatch = yaml.match(/^\\s+version:\\s*[\"']?([^\"'\\n]+)[\"']?\\s*$/m);\n if (metadataVersionMatch) {\n manifest.version = metadataVersionMatch[1].trim();\n }\n\n return manifest;\n}\n\nasync function findSkillMdPathInZip(zipPath: string): Promise<string | undefined> {\n const listing = await runCommand(\"unzip\", [\"-Z1\", zipPath]);\n const paths = listing\n .split(\"\\n\")\n .map((item) => item.trim())\n .filter(Boolean);\n const matches = paths.filter((item) => /(^|\\/)SKILL\\.md$/i.test(item));\n if (matches.length === 0) return undefined;\n return matches.sort((a, b) => a.length - b.length)[0];\n}\n\nexport async function readSkillManifestFromZip(\n zipPath: string | undefined,\n): Promise<SkillManifest | undefined> {\n if (!zipPath) return undefined;\n\n try {\n const skillMdPath = await findSkillMdPathInZip(zipPath);\n if (!skillMdPath) return undefined;\n const stdout = await runCommand(\"unzip\", [\"-p\", zipPath, skillMdPath]);\n return parseSkillFrontmatter(stdout);\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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","names":["getConfig","program","createHash","readFile","createInterface","input","output","getConfig","input","output","createInterface","readFile","createHash","envSuffix","state","program","basename","createHash","readFile","spawn","createInterface","input","output","spawn","runCommand","getClient","getConfig","runSearch","runInfo","runVersions","runInstall","spawn","uploadZipToSignedUrl","buildZipBody","basename","buildUrlBody","parseCategory","resolvePublishCategory","input","output","createInterface","isMissingCategoryError","runPublish","readFile","createHash","envSuffix","runPublishStatus","state","runPublishLogs","program"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentscope-ai/platform-cli",
3
- "version": "1.0.5",
3
+ "version": "1.0.7",
4
4
  "description": "AgentScope Platform CLI (asp) — authentication for AgentScope Platform",
5
5
  "type": "module",
6
6
  "sideEffects": false,