@my-life-buddies/cli 0.26.2 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bin/core.js CHANGED
@@ -95,19 +95,36 @@ import { lstat, mkdir, mkdtemp, readFile as readFile2, rename, rm, writeFile } f
95
95
  import { homedir } from "node:os";
96
96
  import { join } from "node:path";
97
97
  import { promisify } from "node:util";
98
- var RUNTIME_REGISTRY = "https://registry.npmjs.org/";
99
- var execute = promisify(execFile);
100
- async function latestRuntimeVersion(options = {}) {
98
+
99
+ // packages/cli-core/src/npm-registry.ts
100
+ var REGISTRY = "https://registry.npmjs.org/";
101
+ async function npmPackageManifest(name, selector, options = {}) {
101
102
  options.signal?.throwIfAborted();
102
- const timeout = AbortSignal.timeout(1e4);
103
+ const timeout = AbortSignal.timeout(options.timeoutMs ?? 1e4);
103
104
  const signal = options.signal ? AbortSignal.any([options.signal, timeout]) : timeout;
104
- const response = await (options.fetch ?? globalThis.fetch)(`${RUNTIME_REGISTRY}${encodeURIComponent(BUDDY_RUNTIME_PACKAGE)}/latest`, {
105
+ const response = await (options.fetch ?? globalThis.fetch)(`${REGISTRY}${encodeURIComponent(name)}`, {
105
106
  signal,
106
107
  headers: { Accept: "application/json" },
107
108
  redirect: "error"
108
109
  });
109
- if (!response.ok) throw new Error(`npm \u8FD4\u56DE HTTP ${response.status}`);
110
- const metadata = await response.json();
110
+ if (!response.ok) throw new Error(`npm HTTP ${response.status}`);
111
+ const text2 = await response.text();
112
+ if (text2.length > 8 * 1024 * 1024) throw new Error("npm \u5143\u6570\u636E\u8FC7\u5927");
113
+ const metadata = JSON.parse(text2);
114
+ if (metadata?.name !== name) throw new Error("npm \u8FD4\u56DE\u7684\u5305\u540D\u4E0D\u5339\u914D");
115
+ const version = Object.hasOwn(metadata["dist-tags"] ?? {}, selector) ? metadata["dist-tags"][selector] : selector;
116
+ const manifest = typeof version === "string" && Object.hasOwn(metadata.versions ?? {}, version) ? metadata.versions[version] : void 0;
117
+ if (!manifest || manifest.name !== name || manifest.version !== version) {
118
+ throw new Error(`npm ${selector} \u672A\u8FD4\u56DE\u6B64\u5305\u7684\u51C6\u786E\u7248\u672C`);
119
+ }
120
+ return manifest;
121
+ }
122
+
123
+ // packages/cli-core/src/config/runtime-package.ts
124
+ var RUNTIME_REGISTRY = "https://registry.npmjs.org/";
125
+ var execute = promisify(execFile);
126
+ async function latestRuntimeVersion(options = {}) {
127
+ const metadata = await npmPackageManifest(BUDDY_RUNTIME_PACKAGE, "latest", options);
111
128
  if (metadata?.name !== BUDDY_RUNTIME_PACKAGE || !isExactRuntimeVersion(metadata.version) || metadata.version.includes("-")) {
112
129
  throw new Error("npm latest \u672A\u8FD4\u56DE\u6B64 Runtime \u7684\u51C6\u786E\u7A33\u5B9A\u7248\u672C");
113
130
  }
@@ -231,7 +248,7 @@ import { lstat as lstat2, mkdir as mkdir2, mkdtemp as mkdtemp2, readFile as read
231
248
  import { homedir as homedir2 } from "node:os";
232
249
  import { isAbsolute, join as join2 } from "node:path";
233
250
  import { promisify as promisify2 } from "node:util";
234
- var REGISTRY = "https://registry.npmjs.org/";
251
+ var REGISTRY2 = "https://registry.npmjs.org/";
235
252
  var execute2 = promisify2(execFile2);
236
253
  var VERSION = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/u;
237
254
  function validSkillLock(value, protocolVersions2 = [1]) {
@@ -303,21 +320,14 @@ async function resolveSkillPackage(definition3, previous, options = {}) {
303
320
  options.signal?.throwIfAborted();
304
321
  const version = options.version ?? pinned?.version ?? "latest";
305
322
  options.report?.(`\u6B63\u5728\u67E5\u8BE2 ${definition3.label} Skill ${version}\u2026`);
306
- let response;
323
+ let pkg;
307
324
  try {
308
- response = await (options.fetch ?? globalThis.fetch)(`${REGISTRY}${encodeURIComponent(definition3.name)}/${version}`, {
309
- headers: { Accept: "application/json" },
310
- redirect: "error",
311
- signal: options.signal ? AbortSignal.any([options.signal, AbortSignal.timeout(15e3)]) : AbortSignal.timeout(15e3)
312
- });
313
- } catch {
325
+ pkg = await npmPackageManifest(definition3.name, version, { ...options, timeoutMs: 15e3 });
326
+ } catch (cause) {
314
327
  options.signal?.throwIfAborted();
315
- throw new Error(`\u65E0\u6CD5\u67E5\u8BE2 ${definition3.label} Skill ${version}\uFF0C\u8BF7\u68C0\u67E5 npm \u7F51\u7EDC\u540E\u91CD\u8BD5\uFF1B\u672A\u4F7F\u7528\u65E7\u7248\u672C\uFF0C\u5DF2\u6709\u4F5C\u54C1\u4F1A\u4FDD\u7559\u3002`);
328
+ throw new Error(`\u65E0\u6CD5\u67E5\u8BE2 ${definition3.label} Skill ${version}\uFF08${cause instanceof Error ? cause.message : "npm \u8BF7\u6C42\u5931\u8D25"}\uFF09\uFF0C\u8BF7\u68C0\u67E5 npm \u7F51\u7EDC\u540E\u91CD\u8BD5\uFF1B\u672A\u4F7F\u7528\u65E7\u7248\u672C\uFF0C\u5DF2\u6709\u4F5C\u54C1\u4F1A\u4FDD\u7559\u3002`);
316
329
  }
317
- if (!response.ok) throw new Error(`\u65E0\u6CD5\u83B7\u53D6 ${definition3.label} Skill\uFF08npm HTTP ${response.status}\uFF09\u3002\u8BF7\u68C0\u67E5\u7F51\u7EDC\u540E\u91CD\u8BD5\uFF0C\u5DF2\u6709\u4F5C\u54C1\u4F1A\u4FDD\u7559\u3002`);
318
- const text2 = await response.text();
319
- if (text2.length > 512 * 1024) throw new Error(`${definition3.label} npm \u5143\u6570\u636E\u8FC7\u5927\u3002`);
320
- const pkg = JSON.parse(text2);
330
+ if (JSON.stringify(pkg).length > 512 * 1024) throw new Error(`${definition3.label} npm \u5143\u6570\u636E\u8FC7\u5927\u3002`);
321
331
  checkProtocol(definition3, pkg);
322
332
  if (version !== "latest" && pkg.version !== version) throw new Error(`npm \u8FD4\u56DE\u4E86\u4E0D\u540C\u7684 ${definition3.label} \u7248\u672C\u3002`);
323
333
  const lock = { source: "npm", version: pkg.version, integrity: pkg.dist?.integrity, protocolVersion: pkg.buddySkill.protocolVersion };
@@ -331,7 +341,7 @@ async function resolveSkillPackage(definition3, previous, options = {}) {
331
341
  try {
332
342
  await writeFile2(join2(temporary, "package.json"), JSON.stringify({ name: "buddy-skill-cache", private: true, dependencies: { [definition3.name]: lock.version } }));
333
343
  const config = join2(temporary, ".npmrc");
334
- await writeFile2(config, `registry=${REGISTRY}
344
+ await writeFile2(config, `registry=${REGISTRY2}
335
345
  `);
336
346
  options.report?.(`\u6B63\u5728\u4E0B\u8F7D ${definition3.label} Skill ${lock.version}\u2026`);
337
347
  const run = options.runNpm ?? ((args, settings) => execute2("npm", args, { ...settings, encoding: "utf8", maxBuffer: 2 * 1024 * 1024 }));
@@ -343,8 +353,8 @@ async function resolveSkillPackage(definition3, previous, options = {}) {
343
353
  "--omit=dev",
344
354
  "--no-audit",
345
355
  "--no-fund",
346
- `--registry=${REGISTRY}`,
347
- ...definition3.name.startsWith("@") ? [`--${definition3.name.split("/")[0]}:registry=${REGISTRY}`] : [],
356
+ `--registry=${REGISTRY2}`,
357
+ ...definition3.name.startsWith("@") ? [`--${definition3.name.split("/")[0]}:registry=${REGISTRY2}`] : [],
348
358
  `--userconfig=${config}`,
349
359
  "--fetch-retries=0",
350
360
  "--fetch-timeout=20000"
@@ -2535,7 +2545,7 @@ ${DEVELOPMENT_HANDOFF_SUMMARY}
2535
2545
 
2536
2546
  \u5F00\u53D1\u8005\u660E\u786E\u8981\u6C42\u81EA\u52A8\u4F53\u9A8C\u6216\u591A\u573A\u666F\u56DE\u5F52\u65F6\uFF0C\u6309\u6307\u5B9A\u8303\u56F4\u6267\u884C\uFF0C\u62A5\u544A\u7ED3\u679C\uFF0C\u4E0D\u628A\u6D4B\u8BD5\u6388\u6743\u6269\u5927\u4E3A\u6539\u9700\u6C42\u6216\u63D0\u5BA1\u6388\u6743\u3002push\u3001\u53D1\u5E03\u548C\u6536\u8D39\u64CD\u4F5C\u4E0D\u5C5E\u4E8E\u9ED8\u8BA4\u4EA4\u63A5\uFF0C\u9700\u8981\u53E6\u884C\u660E\u786E\u6388\u6743\u3002
2537
2547
 
2538
- \u9700\u8981\u91CD\u65B0\u6253\u5F00\u65F6\uFF0C\u4F7F\u7528 \`buddy-cli preview\`\uFF0C\u6216\u4ECE\u540E\u53F0\u300C\u83B7\u53D6\u8FDE\u63A5\u6307\u4EE4\u300D\u53D6\u5F97\u5E26\u642D\u5B50 ID \u548C\u73AF\u5883\u7684\u5B8C\u6574\u547D\u4EE4\uFF0C\u5728\u6B63\u786E\u5DE5\u7A0B\u76EE\u5F55\u6267\u884C\u3002\u540E\u53F0\u590D\u5236\u7684\u547D\u4EE4\u5E26 \`--no-open\`\uFF0C\u6267\u884C\u540E\u8FD4\u56DE\u539F\u8C03\u8BD5\u9875\uFF0C\u4E0D\u91CD\u590D\u6253\u5F00\u7F51\u9875\uFF1B\u9875\u9762\u5DF2\u5173\u95ED\u65F6\u6253\u5F00\u7EC8\u7AEF\u6253\u5370\u7684\u5730\u5740\u3002\u540E\u53F0\u663E\u793A\u300C\u672A\u8FDE\u63A5\u672C\u5730\u5DE5\u7A0B\u300D\u300C\u5DF2\u8FDE\u63A5\u4F46 DEV \u672A\u542F\u52A8\u300D\u300CDEV \u8FD0\u884C\u4E2D\u300D\u3002\u5237\u65B0\u4E0D\u4F1A\u542F\u52A8 DEV\uFF1BCLI \u9000\u51FA\u4F1A\u505C\u6B62 DEV\u3002\u53EA\u6709\u540E\u53F0\u4E0D\u53EF\u7528\u65F6\u4F7F\u7528 \`buddy-cli preview --local\` \u5907\u7528\u5165\u53E3\uFF0C\u5E76\u660E\u786E\u8BF4\u660E\u5907\u7528\u539F\u56E0\u3002
2548
+ \u9700\u8981\u91CD\u65B0\u6253\u5F00\u65F6\uFF0C\u4F7F\u7528 \`buddy-cli preview\`\uFF0C\u6216\u4ECE\u540E\u53F0\u300C\u83B7\u53D6\u8FDE\u63A5\u6307\u4EE4\u300D\u53D6\u5F97\u5E26\u642D\u5B50 ID \u548C\u73AF\u5883\u7684\u5B8C\u6574\u547D\u4EE4\uFF0C\u5728\u6B63\u786E\u5DE5\u7A0B\u76EE\u5F55\u6267\u884C\u3002\u540E\u53F0\u590D\u5236\u7684\u547D\u4EE4\u5E26 \`--no-open\`\uFF0C\u6267\u884C\u540E\u8FD4\u56DE\u539F\u8C03\u8BD5\u9875\uFF0C\u4E0D\u91CD\u590D\u6253\u5F00\u7F51\u9875\uFF1B\u9875\u9762\u5DF2\u5173\u95ED\u65F6\u6253\u5F00\u7EC8\u7AEF\u6253\u5370\u7684\u5730\u5740\u3002\u540E\u53F0\u663E\u793A\u300C\u672A\u8FDE\u63A5\u672C\u5730\u5DE5\u7A0B\u300D\u300C\u5DF2\u8FDE\u63A5\u4F46 DEV \u672A\u542F\u52A8\u300D\u300CDEV \u8FD0\u884C\u4E2D\u300D\u3002\u5237\u65B0\u4E0D\u4F1A\u542F\u52A8 DEV\uFF1BCLI \u9000\u51FA\u4F1A\u505C\u6B62 DEV\u3002\u8C03\u8BD5\u9875\u9762\u7EDF\u4E00\u7531\u540E\u53F0\u63D0\u4F9B\uFF0C\u4E0D\u518D\u652F\u6301\u72EC\u7ACB\u672C\u5730\u7F51\u9875\uFF1B\u540E\u53F0\u4E0D\u53EF\u7528\u65F6\u4FDD\u7559\u5DE5\u7A0B\u4E0E\u73B0\u6709\u8FDE\u63A5\u4FE1\u606F\uFF0C\u4F7F\u7528\u7EC8\u7AEF DEV \u548C\u65E5\u5FD7\u6392\u67E5\u3002
2539
2549
 
2540
2550
  \u7528\u6237\u660E\u786E\u53EA\u505A\u8BBE\u8BA1\u3001\u521D\u59CB\u5316\u3001\u4EE3\u7801\u4FEE\u6539\u6216\u8981\u6C42\u6682\u505C\u65F6\uFF0C\u4EE5\u8BE5\u8303\u56F4\u4E3A\u51C6\uFF0C\u4E0D\u5F3A\u5236\u542F\u52A8\u9884\u89C8\u3002`;
2541
2551
 
@@ -3371,7 +3381,6 @@ var CLI_HELP = `\u642D\u642D Developer Platform CLI
3371
3381
  preview \u8FDE\u63A5\u5DE5\u7A0B\u5E76\u6253\u5F00\u540E\u53F0\u5F00\u53D1\u8C03\u8BD5
3372
3382
  push \u4E0A\u4F20\u7A0B\u5E8F\u5305\uFF0C\u53EF\u7528 --product \u540C\u6B65\u63D0\u4EA4\u5546\u54C1\u5BA1\u6838
3373
3383
  products \u4E3A\u5DF2\u6709\u7248\u672C\u8865\u63D0\u5546\u54C1\uFF0C\u6216\u6062\u590D\u539F\u63D0\u5BA1\u8BF7\u6C42
3374
- release \u4ECE\u660E\u786E\u56DE\u6267\u53D1\u5E03\uFF0C\u67E5\u8BE2\u3001\u6062\u590D\u3001\u91CD\u8BD5\u6216\u53D6\u6D88\u53D1\u5E03
3375
3384
  status \u67E5\u770B\u4E91\u7AEF\u7248\u672C\u3001\u8FD0\u884C\u3001\u5BA1\u6838\u548C\u6784\u5EFA\u72B6\u6001
3376
3385
  meta \u67E5\u770B\u4E91\u7AEF\u8D44\u6599\uFF1Bmeta update \u4FEE\u6539\u8D44\u6599\u6216\u66FF\u6362\u5934\u50CF
3377
3386
  avatar \u65E7\u5934\u50CF\u547D\u4EE4\u517C\u5BB9\u5165\u53E3\uFF0C\u63A8\u8350 meta update --avatar
@@ -5380,21 +5389,12 @@ function parsePackagePush(value) {
5380
5389
  if (operationId(p.pushId) !== metadata.pushId) invalid2("\u4E0A\u4F20\u56DE\u6267 ID \u4E0E\u5143\u6570\u636E\u4E0D\u5339\u914D");
5381
5390
  return { pushId: metadata.pushId, uploadVersion: p.uploadVersion, status: p.status, metadata, reviewIds: selectedReviewIds(p.reviewIds), failure: p.failure ?? null };
5382
5391
  }
5383
- function parseProductRelease(value) {
5384
- const r = record(value);
5385
- if (r.mode !== "with_buddy" && r.mode !== "products_only") invalid2("\u53D1\u5E03\u6A21\u5F0F\u65E0\u6548");
5386
- if (!["accepted", "activating", "active", "failed", "cancelled"].includes(String(r.status))) invalid2("\u53D1\u5E03\u64CD\u4F5C\u72B6\u6001\u65E0\u6548");
5387
- if (typeof r.buddyVersion !== "string" || !r.buddyVersion.trim() || /[\u0000-\u001f\u007f]/u.test(r.buddyVersion)) invalid2("\u53D1\u5E03\u7248\u672C\u65E0\u6548");
5388
- return { releaseId: operationId(r.releaseId), mode: r.mode, buddyVersion: r.buddyVersion, reviewIds: selectedReviewIds(r.reviewIds), status: r.status, ...r.failure === void 0 ? {} : { failure: r.failure } };
5389
- }
5390
5392
  var CloudOperationError = class extends CloudLifecycleError {
5391
- constructor(code2, message, details, push, release) {
5393
+ constructor(code2, message, details, push) {
5392
5394
  super(code2, message, details);
5393
5395
  this.push = push;
5394
- this.release = release;
5395
5396
  }
5396
5397
  push;
5397
- release;
5398
5398
  };
5399
5399
  function sameReviewIds(a, b) {
5400
5400
  return [...a].sort().join("\0") === [...b].sort().join("\0");
@@ -5432,7 +5432,7 @@ var OperationStore = class {
5432
5432
  }
5433
5433
  async save(record3) {
5434
5434
  const prior = await this.read(record3.id, record3.kind);
5435
- const input = (r) => r.kind === "push" ? r.metadata : r.kind === "release" ? r.request : { version: r.version, reviews: r.reviews };
5435
+ const input = (r) => r.kind === "push" ? r.metadata : { version: r.version, reviews: r.reviews };
5436
5436
  if (JSON.stringify(input(prior)) !== JSON.stringify(input(record3))) throw new CloudLifecycleError("INVALID_REQUEST", "\u6062\u590D\u8BB0\u5F55\u7684\u539F\u59CB\u8BF7\u6C42\u4E0D\u80FD\u66F4\u6539");
5437
5437
  const temporary = this.path(`${record3.id}_${randomUUID8()}`);
5438
5438
  await writeFile8(temporary, JSON.stringify({ identity: this.identity, operation: record3 }), { flag: "wx", mode: 384 });
@@ -5448,11 +5448,6 @@ var OperationStore = class {
5448
5448
  if (r.metadata.pushId !== id) throw new Error("push mismatch");
5449
5449
  if (r.receipt) parsePackagePush(r.receipt);
5450
5450
  }
5451
- if (r.kind === "release") {
5452
- parseProductRelease({ ...r.request, status: "accepted" });
5453
- if (r.request.releaseId !== id) throw new Error("release mismatch");
5454
- if (r.receipt) parseProductRelease(r.receipt);
5455
- }
5456
5451
  if (r.kind === "submission") {
5457
5452
  if (typeof r.version !== "string" || !r.version.trim() || typeof r.confirmed !== "boolean" || r.reviews.length === 0) throw new Error("submission invalid");
5458
5453
  parsePushMetadata({ pushId: id, commit: "validate", sourceSha256: "0".repeat(64), productReviews: r.reviews });
@@ -5477,7 +5472,7 @@ var OperationStore = class {
5477
5472
  var PRODUCT_HELP = {
5478
5473
  push: `\u7528\u6CD5: buddy-cli push --commit <\u6539\u52A8\u8BF4\u660E> [--product <\u5546\u54C1 ID> ...] [--directory <\u76EE\u5F55>]
5479
5474
  buddy-cli push --resume <pushId> | --status <pushId> [--directory <\u76EE\u5F55>]
5480
- \u4E0A\u4F20\u4EE3\u7801\u5E76\u63D0\u4EA4\u660E\u786E\u9009\u4E2D\u7684\u5546\u54C1\uFF1B\u4E0D\u6307\u5B9A --product \u53EA\u4E0A\u4F20\u4EE3\u7801\u3002\u4E0D\u4F1A\u81EA\u52A8\u53D1\u5E03\u3002
5475
+ \u4E0A\u4F20\u4EE3\u7801\u5E76\u63D0\u4EA4\u660E\u786E\u9009\u4E2D\u7684\u5546\u54C1\uFF1B\u4E0D\u6307\u5B9A --product \u53EA\u4E0A\u4F20\u4EE3\u7801\u3002\u53D1\u5E03\u5728\u5F00\u53D1\u8005\u540E\u53F0\u64CD\u4F5C\u3002
5481
5476
  \u5546\u54C1 ID \u793A\u4F8B\uFF1Aprd_12345678\uFF1B\u5DF2\u6709 ps_ \u5546\u54C1 ID \u7EE7\u7EED\u517C\u5BB9\u3002
5482
5477
  \u9996\u6B21\u4E0A\u4F20\u5FC5\u987B\u5B89\u88C5 npm latest \u6700\u65B0\u7A33\u5B9A Runtime \u7684\u51C6\u786E\u7248\u672C\uFF1B\u91CD\u8BD5\u56FA\u5B9A\u4F7F\u7528\u539F\u59CB\u5305\u3001\u8349\u7A3F\u7248\u672C\u548C\u5BA1\u6838 ID\u3002
5483
5478
  \u7F51\u7EDC\u7ED3\u679C\u672A\u77E5\u65F6\u8BF7\u4F7F\u7528\u8F93\u51FA\u7684 --resume\uFF1B--status \u53EA\u67E5\u8BE2\u3002\u4E0D\u8981\u91CD\u65B0\u4E0A\u4F20\u3002`,
@@ -5485,13 +5480,7 @@ var PRODUCT_HELP = {
5485
5480
  buddy-cli products submit --resume <submissionId> [--directory <\u76EE\u5F55>]
5486
5481
  \u7528\u4E8E\u5DF2\u4E0A\u4F20\u7248\u672C\u8865\u63D0\u5546\u54C1\uFF1B\u6B63\u5E38 push --product \u5DF2\u81EA\u52A8\u63D0\u5BA1\uFF0C\u65E0\u9700\u91CD\u590D\u6267\u884C\u3002
5487
5482
  \u5546\u54C1 ID \u793A\u4F8B\uFF1Aprd_12345678\uFF1B\u5DF2\u6709 ps_ \u5546\u54C1 ID \u7EE7\u7EED\u517C\u5BB9\u3002
5488
- \u6062\u590D\u4F7F\u7528\u9996\u6B21\u6301\u4E45\u4FDD\u5B58\u7684\u5546\u54C1\u96C6\u5408\u3001\u5BA1\u6838 ID \u548C\u8349\u7A3F\u7248\u672C\u3002`,
5489
- release: `\u7528\u6CD5: buddy-cli release (--from-push <pushId> | --from-submission <submissionId>) [--products-only] [--directory <\u76EE\u5F55>]
5490
- buddy-cli release --version <\u7248\u672C> --code-only [--directory <\u76EE\u5F55>]
5491
- buddy-cli release (--resume | --status | --retry | --cancel) <releaseId> [--directory <\u76EE\u5F55>]
5492
- \u53D1\u5E03\u53EA\u91C7\u7528\u6307\u5B9A\u6210\u529F\u56DE\u6267\u4E2D\u7684\u5BA1\u6838\u96C6\u5408\uFF1B\u5546\u54C1\u5931\u8D25\u4E0D\u4F1A\u81EA\u52A8\u964D\u7EA7\u4E3A\u7EAF\u4EE3\u7801\u53D1\u5E03\u3002
5493
- \u9ED8\u8BA4\u968F\u642D\u5B50\u7248\u672C\u4E00\u8D77\u53D1\u5E03\uFF1B--products-only \u53EA\u6FC0\u6D3B\u5546\u54C1\u5E76\u6838\u5BF9\u5F53\u524D\u7EBF\u4E0A\u7248\u672C\u3002
5494
- \u4EC5 active \u8868\u793A\u5DF2\u751F\u6548\uFF1Baccepted/activating \u8BF7\u7528 --status \u67E5\u8BE2\u3002`
5483
+ \u6062\u590D\u4F7F\u7528\u9996\u6B21\u6301\u4E45\u4FDD\u5B58\u7684\u5546\u54C1\u96C6\u5408\u3001\u5BA1\u6838 ID \u548C\u8349\u7A3F\u7248\u672C\u3002\u5BA1\u6838\u901A\u8FC7\u540E\u5728\u5F00\u53D1\u8005\u540E\u53F0\u53D1\u5E03\u3002`
5495
5484
  };
5496
5485
  function parse2(command, args) {
5497
5486
  if (command === "products") {
@@ -5500,15 +5489,11 @@ function parse2(command, args) {
5500
5489
  }
5501
5490
  const values = /* @__PURE__ */ new Map();
5502
5491
  const products = [];
5503
- const allowed = command === "push" ? ["--commit", "--resume", "--status", "--product"] : command === "products" ? ["--version", "--resume", "--product"] : ["--from-push", "--from-submission", "--version", "--code-only", "--products-only", "--resume", "--status", "--retry", "--cancel"];
5492
+ const allowed = command === "push" ? ["--commit", "--resume", "--status", "--product"] : ["--version", "--resume", "--product"];
5504
5493
  for (let i = 0; i < args.length; i++) {
5505
5494
  const flag2 = args[i];
5506
5495
  if (flag2 !== "--directory" && !allowed.includes(flag2)) throw new CloudCommandUsageError(`\u672A\u77E5\u53C2\u6570 ${flag2}`);
5507
5496
  if (flag2 !== "--product" && values.has(flag2)) throw new CloudCommandUsageError(`${flag2} \u4E0D\u80FD\u91CD\u590D`);
5508
- if (["--code-only", "--products-only"].includes(flag2)) {
5509
- values.set(flag2, "true");
5510
- continue;
5511
- }
5512
5497
  const value = args[++i];
5513
5498
  if (!value?.trim() || value.startsWith("--") || /[\u0000-\u001f\u007f]/u.test(value)) throw new CloudCommandUsageError(`${flag2} \u7F3A\u5C11\u6709\u6548\u503C`);
5514
5499
  if (flag2 === "--product") {
@@ -5517,12 +5502,12 @@ function parse2(command, args) {
5517
5502
  } else values.set(flag2, value.trim());
5518
5503
  }
5519
5504
  if (products.length > 10) throw new CloudCommandUsageError("\u4E00\u6B21\u6700\u591A\u9009\u62E9 10 \u4E2A\u5546\u54C1");
5520
- const recovery = ["--resume", "--status", "--retry", "--cancel"].filter((f) => values.has(f));
5505
+ const recovery = ["--resume", "--status"].filter((f) => values.has(f));
5521
5506
  if (recovery.length && (recovery.length !== 1 || products.length || [...values.keys()].some((f) => f !== "--directory" && !recovery.includes(f)))) throw new CloudCommandUsageError("\u6062\u590D\u6216\u67E5\u8BE2\u547D\u4EE4\u4E0D\u80FD\u540C\u65F6\u66F4\u6539\u539F\u59CB\u8BF7\u6C42");
5522
5507
  return { values, products };
5523
5508
  }
5524
5509
  function required(value) {
5525
- if (!value) throw new CloudCommandUsageError("\u5E73\u53F0 Adapter \u5C1A\u672A\u652F\u6301\u5546\u54C1\u4E0A\u4F20\u548C\u53D1\u5E03\u534F\u8BAE\uFF0C\u8BF7\u5347\u7EA7 Adapter");
5510
+ if (!value) throw new CloudCommandUsageError("\u5E73\u53F0 Adapter \u5C1A\u672A\u652F\u6301\u5546\u54C1\u4E0A\u4F20\u548C\u63D0\u5BA1\u534F\u8BAE\uFF0C\u8BF7\u5347\u7EA7 Adapter");
5526
5511
  return value;
5527
5512
  }
5528
5513
  function responseError(message) {
@@ -5558,10 +5543,10 @@ function showPush(io, push) {
5558
5543
  if (failureMessage(push.failure)) io.writeError(`\u539F\u56E0\uFF1A${failureMessage(push.failure)}`);
5559
5544
  if (push.reviewIds.length) io.write(`\u5546\u54C1\u5BA1\u6838\u7F16\u53F7\uFF1A${push.reviewIds.join(", ")}`);
5560
5545
  if (push.status === "completed") {
5561
- io.write(`\u672C\u6B21 push \u4E0D\u4F1A\u53D1\u5E03\u642D\u5B50\uFF1B\u786E\u8BA4\u4EE3\u7801\u53CA\u6240\u9009\u5546\u54C1\u5BA1\u6838\u7ED3\u679C\u540E\u4F7F\u7528 buddy-cli release --from-push ${push.pushId}\u3002`);
5546
+ io.write("\u672C\u6B21 push \u4E0D\u4F1A\u53D1\u5E03\u642D\u5B50\uFF1B\u6784\u5EFA\u6210\u529F\u540E\uFF0C\u8BF7\u5230\u5F00\u53D1\u8005\u540E\u53F0\u201C\u7248\u672C\u4E0E\u53D1\u5E03\u201D\u786E\u8BA4\u4EE3\u7801\u53CA\u6240\u9009\u5546\u54C1\u5BA1\u6838\u7ED3\u679C\u540E\u53D1\u5E03\u3002");
5562
5547
  return 0;
5563
5548
  }
5564
- if (push.status === "product_reviews_failed") io.writeError(`\u4EE3\u7801\u5305\u5DF2\u4FDD\u5B58\uFF0C\u5546\u54C1\u672A\u5B8C\u6574\u63D0\u5BA1\u3002\u4FEE\u6B63\u5546\u54C1\u540E\u4F7F\u7528 products submit --version ${push.uploadVersion} --product <\u5546\u54C1 ID> \u8865\u63D0\uFF1B\u7EAF\u4EE3\u7801\u53D1\u5E03\u987B\u660E\u786E --code-only\u3002`);
5549
+ if (push.status === "product_reviews_failed") io.writeError(`\u4EE3\u7801\u5305\u5DF2\u4FDD\u5B58\uFF0C\u5546\u54C1\u672A\u5B8C\u6574\u63D0\u5BA1\u3002\u4FEE\u6B63\u5546\u54C1\u540E\u4F7F\u7528 buddy-cli products submit --version ${push.uploadVersion} --product <\u5546\u54C1 ID> \u8865\u63D0\uFF1B\u53D1\u5E03\u8BF7\u5230\u5F00\u53D1\u8005\u540E\u53F0\u201C\u7248\u672C\u4E0E\u53D1\u5E03\u201D\u64CD\u4F5C\u3002`);
5565
5550
  else io.writeError(`\u4E0A\u4F20\u672A\u5B8C\u6210\uFF0C\u4F7F\u7528 buddy-cli push --resume ${push.pushId} \u6062\u590D\u539F\u8BF7\u6C42\u3002`);
5566
5551
  return 1;
5567
5552
  }
@@ -5601,23 +5586,6 @@ async function executePush(record3, sourceBundle, store, client, id, io, options
5601
5586
  throw cause;
5602
5587
  }
5603
5588
  }
5604
- function matchRelease(request, release) {
5605
- if (request.releaseId !== release.releaseId || request.mode !== release.mode || request.buddyVersion !== release.buddyVersion || !sameReviewIds(request.reviewIds, release.reviewIds)) responseError("\u53D1\u5E03\u56DE\u6267\u4E0E\u56FA\u5B9A\u8BF7\u6C42\u4E0D\u4E00\u81F4");
5606
- }
5607
- function showRelease(io, release) {
5608
- io.write(`\u53D1\u5E03\u7F16\u53F7\uFF1A${release.releaseId}`);
5609
- io.write(`\u53D1\u5E03\u72B6\u6001\uFF1A${release.status}`);
5610
- io.write(`\u76EE\u6807\u7248\u672C\uFF1A${release.buddyVersion}`);
5611
- if (failureMessage(release.failure)) io.writeError(`\u539F\u56E0\uFF1A${failureMessage(release.failure)}`);
5612
- if (release.status === "active") {
5613
- io.write("\u53D1\u5E03\u5DF2\u751F\u6548\u3002");
5614
- return 0;
5615
- }
5616
- if (release.status === "failed") io.writeError(`\u53D1\u5E03\u672A\u751F\u6548\u3002\u4FEE\u6B63\u539F\u56E0\u540E buddy-cli release --retry ${release.releaseId}\uFF1B\u653E\u5F03\u5219 --cancel ${release.releaseId}\u3002`);
5617
- else if (release.status === "cancelled") io.write("\u8BE5\u53D1\u5E03\u5DF2\u53D6\u6D88\u3002");
5618
- else io.write(`\u53D1\u5E03\u4ECD\u5728\u5904\u7406\uFF0C\u8BF7\u8FD0\u884C buddy-cli release --status ${release.releaseId} \u786E\u8BA4\u662F\u5426\u751F\u6548\u3002`);
5619
- return 1;
5620
- }
5621
5589
  async function runProductLifecycle(command, args, io, options) {
5622
5590
  if (args.length === 1 && ["--help", "-h"].includes(args[0]) || command === "products" && args.length === 2 && args[0] === "submit" && args[1] === "--help") {
5623
5591
  io.write(PRODUCT_HELP[command]);
@@ -5625,7 +5593,7 @@ async function runProductLifecycle(command, args, io, options) {
5625
5593
  }
5626
5594
  const p = parse2(command, args);
5627
5595
  const v = p.values;
5628
- if (options.mode === "local-mock") throw new CloudCommandUsageError("\u672C\u5730\u6A21\u62DF\u6A21\u5F0F\u4E0D\u4F1A\u4F2A\u9020\u6B63\u5F0F push \u6216\u53D1\u5E03\uFF0C\u8BF7\u8FDE\u63A5\u771F\u5B9E MLB Server");
5596
+ if (options.mode === "local-mock") throw new CloudCommandUsageError("\u672C\u5730\u6A21\u62DF\u6A21\u5F0F\u4E0D\u4F1A\u4F2A\u9020\u6B63\u5F0F push \u6216\u5546\u54C1\u63D0\u5BA1\uFF0C\u8BF7\u8FDE\u63A5\u771F\u5B9E MLB Server");
5629
5597
  const freshPush = command === "push" && !v.has("--resume") && !v.has("--status");
5630
5598
  const root = await (options.resolveProjectRoot ?? (freshPush ? requireBuddyAgentProjectRoot : requireBuddyProjectRoot))(resolve15(options.cwd ?? process.cwd(), v.get("--directory") ?? "."));
5631
5599
  const platform = resolvePlatformUrl({ env: options.runtimeUpdate?.env });
@@ -5666,83 +5634,25 @@ async function runProductLifecycle(command, args, io, options) {
5666
5634
  io.write(`\u6062\u590D\u7F16\u53F7\uFF1A${pushId}`);
5667
5635
  return executePush(record4, bundle, store, client, id, io, options);
5668
5636
  }
5669
- if (command === "products") {
5670
- let record4;
5671
- if (v.has("--resume")) record4 = await store.read(v.get("--resume"), "submission");
5672
- else {
5673
- const version = v.get("--version");
5674
- if (!version || !p.products.length) throw new CloudCommandUsageError(PRODUCT_HELP.products);
5675
- const chosen = await selection(client, id, p.products, io);
5676
- record4 = { kind: "submission", id: `sub_${randomUUID9()}`, version, reviews: chosen.reviews, confirmed: false };
5677
- await store.create(record4);
5678
- }
5679
- io.write(`\u5546\u54C1\u63D0\u4EA4\u7F16\u53F7\uFF1A${record4.id}`);
5680
- try {
5681
- const receipt = await required(client.submitPackageProducts).call(client, { id, version: record4.version, reviews: record4.reviews });
5682
- if (!sameReviewIds(receipt.reviewIds, record4.reviews.map((r) => r.reviewId))) responseError("\u5E73\u53F0\u672A\u786E\u8BA4\u5B8C\u6574\u5546\u54C1\u5BA1\u6838\u96C6\u5408");
5683
- await store.save({ ...record4, confirmed: true });
5684
- io.write(`\u5546\u54C1\u5DF2\u63D0\u4EA4\u5BA1\u6838\uFF1A${receipt.reviewIds.join(", ")}`);
5685
- io.write(`\u5BA1\u6838\u901A\u8FC7\u540E\uFF1Abuddy-cli release --from-submission ${record4.id}`);
5686
- return { exitCode: 0, buddyId: id, version: record4.version };
5687
- } catch (cause) {
5688
- io.writeError(`\u4FDD\u7559\u539F\u8BF7\u6C42\u91CD\u8BD5\uFF1Abuddy-cli products submit --resume ${record4.id}`);
5689
- throw cause;
5690
- }
5691
- }
5692
- const action = ["--resume", "--status", "--retry", "--cancel"].find((f) => v.has(f));
5693
5637
  let record3;
5694
- if (action) {
5695
- const releaseId = v.get(action);
5696
- if (action === "--status") {
5697
- const release = await required(client.getProductRelease).call(client, { id, releaseId });
5698
- if (release.releaseId !== releaseId) responseError("\u53D1\u5E03\u7F16\u53F7\u4E0D\u5339\u914D");
5699
- return { exitCode: showRelease(io, release), buddyId: id, version: release.buddyVersion };
5700
- }
5701
- record3 = await store.read(releaseId, "release");
5702
- } else {
5703
- const sources = ["--from-push", "--from-submission", "--version"].filter((f) => v.has(f));
5704
- if (sources.length !== 1 || v.has("--code-only") !== v.has("--version") || v.has("--code-only") && v.has("--products-only")) throw new CloudCommandUsageError(PRODUCT_HELP.release);
5705
- let version;
5706
- let reviewIds;
5707
- if (v.has("--from-push")) {
5708
- const pushRecord = await store.read(v.get("--from-push"), "push");
5709
- const receipt = await required(client.getPackagePush).call(client, { id, pushId: pushRecord.id });
5710
- confirmPush(pushRecord, receipt);
5711
- await store.save({ ...pushRecord, receipt });
5712
- if (receipt.status !== "completed" || !receipt.uploadVersion) throw new CloudCommandUsageError("\u6307\u5B9A\u4E0A\u4F20\u5C1A\u672A\u5B8C\u6574\u63D0\u5BA1\uFF0C\u4E0D\u80FD\u81EA\u52A8\u7701\u7565\u5931\u8D25\u5546\u54C1\uFF1B\u8BF7\u8865\u63D0\u6216\u660E\u786E --version <\u7248\u672C> --code-only");
5713
- version = receipt.uploadVersion;
5714
- reviewIds = receipt.reviewIds;
5715
- } else if (v.has("--from-submission")) {
5716
- const submission = await store.read(v.get("--from-submission"), "submission");
5717
- if (!submission.confirmed) throw new CloudCommandUsageError(`\u8865\u63D0\u7ED3\u679C\u5C1A\u672A\u786E\u8BA4\uFF0C\u8BF7\u5148 products submit --resume ${submission.id}`);
5718
- version = submission.version;
5719
- reviewIds = submission.reviews.map((r) => r.reviewId);
5720
- } else {
5721
- version = v.get("--version");
5722
- reviewIds = [];
5723
- }
5724
- if (v.has("--products-only")) {
5725
- if (!reviewIds.length) throw new CloudCommandUsageError("--products-only \u9700\u8981\u660E\u786E\u7684\u5546\u54C1\u5BA1\u6838\u96C6\u5408");
5726
- const buddy2 = await client.getBuddy({ id });
5727
- if (buddy2.id !== id || !buddy2.released || buddy2.version !== version) throw new CloudCommandUsageError("\u4EC5\u5546\u54C1\u53D1\u5E03\u8981\u6C42\u56DE\u6267\u7248\u672C\u4E0E\u5F53\u524D\u5DF2\u53D1\u5E03\u642D\u5B50\u7248\u672C\u4E00\u81F4");
5728
- }
5729
- const releaseId = `rel_${randomUUID9()}`;
5730
- record3 = { kind: "release", id: releaseId, request: { releaseId, mode: v.has("--products-only") ? "products_only" : "with_buddy", buddyVersion: version, reviewIds } };
5638
+ if (v.has("--resume")) record3 = await store.read(v.get("--resume"), "submission");
5639
+ else {
5640
+ const version = v.get("--version");
5641
+ if (!version || !p.products.length) throw new CloudCommandUsageError(PRODUCT_HELP.products);
5642
+ const chosen = await selection(client, id, p.products, io);
5643
+ record3 = { kind: "submission", id: `sub_${randomUUID9()}`, version, reviews: chosen.reviews, confirmed: false };
5731
5644
  await store.create(record3);
5732
5645
  }
5733
- io.write(`\u6062\u590D\u7F16\u53F7\uFF1A${record3.id}`);
5646
+ io.write(`\u5546\u54C1\u63D0\u4EA4\u7F16\u53F7\uFF1A${record3.id}`);
5734
5647
  try {
5735
- const receipt = action === "--retry" ? await required(client.retryProductRelease).call(client, { id, releaseId: record3.id }) : action === "--cancel" ? await required(client.cancelProductRelease).call(client, { id, releaseId: record3.id }) : await required(client.createProductRelease).call(client, { id, release: record3.request });
5736
- matchRelease(record3.request, receipt);
5737
- await store.save({ ...record3, receipt });
5738
- return { exitCode: showRelease(io, receipt), buddyId: id, version: receipt.buddyVersion };
5648
+ const receipt = await required(client.submitPackageProducts).call(client, { id, version: record3.version, reviews: record3.reviews });
5649
+ if (!sameReviewIds(receipt.reviewIds, record3.reviews.map((r) => r.reviewId))) responseError("\u5E73\u53F0\u672A\u786E\u8BA4\u5B8C\u6574\u5546\u54C1\u5BA1\u6838\u96C6\u5408");
5650
+ await store.save({ ...record3, confirmed: true });
5651
+ io.write(`\u5546\u54C1\u5DF2\u63D0\u4EA4\u5BA1\u6838\uFF1A${receipt.reviewIds.join(", ")}`);
5652
+ io.write("\u5BA1\u6838\u901A\u8FC7\u540E\uFF0C\u8BF7\u5230\u5F00\u53D1\u8005\u540E\u53F0\u786E\u8BA4\u5E76\u53D1\u5E03\u3002");
5653
+ return { exitCode: 0, buddyId: id, version: record3.version };
5739
5654
  } catch (cause) {
5740
- if (cause instanceof CloudOperationError && cause.release) {
5741
- matchRelease(record3.request, cause.release);
5742
- await store.save({ ...record3, receipt: cause.release });
5743
- showRelease(io, cause.release);
5744
- }
5745
- io.writeError(`\u53D1\u5E03\u7ED3\u679C\u9700\u786E\u8BA4\uFF1Abuddy-cli release --status ${record3.id}\uFF1B\u539F\u8BF7\u6C42\u6062\u590D\uFF1Abuddy-cli release --resume ${record3.id}`);
5655
+ io.writeError(`\u4FDD\u7559\u539F\u8BF7\u6C42\u91CD\u8BD5\uFF1Abuddy-cli products submit --resume ${record3.id}`);
5746
5656
  throw cause;
5747
5657
  }
5748
5658
  }
@@ -6120,7 +6030,7 @@ function serverError(response, body) {
6120
6030
  return new CloudOperationError(code2, message, {
6121
6031
  httpStatus: response.status,
6122
6032
  retryable: response.status === 408 || response.status === 429 || response.status >= 500
6123
- }, source?.push === void 0 ? void 0 : parsePackagePush(source.push), source?.release === void 0 ? void 0 : parseProductRelease(source.release));
6033
+ }, source?.push === void 0 ? void 0 : parsePackagePush(source.push));
6124
6034
  }
6125
6035
  var HttpDeveloperPlatformClient = class {
6126
6036
  #baseUrl;
@@ -6287,24 +6197,6 @@ var HttpDeveloperPlatformClient = class {
6287
6197
  const source = object3(await this.#request(`/cli/buddies/${encodeURIComponent(request.id)}/packages/${encodeURIComponent(request.version)}/product-reviews`, "POST", { json: { reviews: request.reviews } }), "response");
6288
6198
  return { reviewIds: selectedReviewIds(source.reviewIds) };
6289
6199
  }
6290
- async createProductRelease(request) {
6291
- const source = object3(await this.#request(`/cli/buddies/${encodeURIComponent(request.id)}/product-releases`, "POST", { json: request.release }), "response");
6292
- return parseProductRelease(source.release);
6293
- }
6294
- async getProductRelease(request) {
6295
- const source = object3(await this.#request(`/cli/buddies/${encodeURIComponent(request.id)}/product-releases/${encodeURIComponent(request.releaseId)}`, "GET"), "response");
6296
- const release = parseProductRelease(source.release);
6297
- if (release.releaseId !== request.releaseId) throw invalid3("\u53D1\u5E03\u56DE\u6267 ID \u4E0D\u5339\u914D");
6298
- return release;
6299
- }
6300
- async retryProductRelease(request) {
6301
- const source = object3(await this.#request(`/cli/buddies/${encodeURIComponent(request.id)}/product-releases/${encodeURIComponent(request.releaseId)}/retry`, "POST"), "response");
6302
- return parseProductRelease(source.release);
6303
- }
6304
- async cancelProductRelease(request) {
6305
- const source = object3(await this.#request(`/cli/buddies/${encodeURIComponent(request.id)}/product-releases/${encodeURIComponent(request.releaseId)}/cancel`, "POST"), "response");
6306
- return parseProductRelease(source.release);
6307
- }
6308
6200
  async getPackageBuild(request) {
6309
6201
  return parseBuild(await this.#request(`/cli/buddies/${encodeURIComponent(request.id)}/packages/${encodeURIComponent(request.version)}/build`, "GET"));
6310
6202
  }
@@ -6435,7 +6327,6 @@ var HELP = Object.freeze({
6435
6327
  logout: "\u7528\u6CD5: buddy-cli logout",
6436
6328
  push: PRODUCT_HELP.push,
6437
6329
  products: PRODUCT_HELP.products,
6438
- release: PRODUCT_HELP.release,
6439
6330
  status: "\u7528\u6CD5: buddy-cli status [--directory <\u9879\u76EE\u76EE\u5F55>]",
6440
6331
  meta: `\u7528\u6CD5: buddy-cli meta [--directory <\u9879\u76EE\u76EE\u5F55> | --buddy-id <\u642D\u5B50 ID>]
6441
6332
  buddy-cli meta update [--name <\u540D\u79F0>] [--tagline <\u4E00\u53E5\u8BDD\u4ECB\u7ECD>] [--intro <\u5B8C\u6574\u4ECB\u7ECD>] [--avatar <\u56FE\u7247\u6587\u4EF6>] [--directory <\u9879\u76EE\u76EE\u5F55> | --buddy-id <\u642D\u5B50 ID>]
@@ -6619,7 +6510,7 @@ async function runMeta(parsed, io, options, legacyAvatar = false) {
6619
6510
  }
6620
6511
  async function runCloudCommand(command, args, io, options = {}) {
6621
6512
  try {
6622
- if (command === "push" || command === "products" || command === "release") return await runProductLifecycle(command, args, io, options);
6513
+ if (command === "push" || command === "products") return await runProductLifecycle(command, args, io, options);
6623
6514
  const parsed = parse3(args, command);
6624
6515
  if (parsed.help) {
6625
6516
  io.write(HELP[command]);
@@ -6664,7 +6555,7 @@ async function runCloudCommand(command, args, io, options = {}) {
6664
6555
  exitCode: cause instanceof CloudCommandUsageError || cause instanceof BuddyProjectContextError ? 2 : 1
6665
6556
  };
6666
6557
  }
6667
- if (["push", "products", "release"].includes(command)) {
6558
+ if (["push", "products"].includes(command)) {
6668
6559
  io.writeError(`buddy-cli: ${cause instanceof Error ? cause.message : "\u64CD\u4F5C\u672A\u5B8C\u6210\uFF0C\u8BF7\u6309\u8F93\u51FA\u7F16\u53F7\u67E5\u8BE2\u6216\u6062\u590D"}`);
6669
6560
  return { exitCode: 1 };
6670
6561
  }
@@ -8788,7 +8679,7 @@ async function runBuddyCli(args, io, options = {}) {
8788
8679
  ...options.dev
8789
8680
  });
8790
8681
  }
8791
- if (command === "login" || command === "logout" || command === "push" || command === "products" || command === "release" || command === "status" || command === "meta" || command === "avatar") {
8682
+ if (command === "login" || command === "logout" || command === "push" || command === "products" || command === "status" || command === "meta" || command === "avatar") {
8792
8683
  return await runCloudCommand(command, rest, io, {
8793
8684
  cwd: options.cwd,
8794
8685
  runtimeUpdate: options.runtimeCatalog,
@@ -8969,6 +8860,7 @@ export {
8969
8860
  isWindowsReservedPathSegment,
8970
8861
  latestRuntimeTemplate,
8971
8862
  normalizePlatformUrl,
8863
+ npmPackageManifest,
8972
8864
  openExternalUrl,
8973
8865
  parseBuddyAgentConfig,
8974
8866
  parseBuddyProjectManifest,