@my-life-buddies/cli 0.26.1 → 0.26.3

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
@@ -242,7 +242,7 @@ function validSkillLock(value, protocolVersions2 = [1]) {
242
242
  function checkProtocol(definition3, pkg) {
243
243
  const protocol = pkg.buddySkill;
244
244
  if (pkg.name !== definition3.name || !VERSION.test(pkg.version) || !protocol || !definition3.protocolVersions.includes(protocol.protocolVersion) || Object.entries(definition3.protocol).some(([key, value]) => protocol[key] !== value)) {
245
- throw new Error(`${definition3.label} Skill \u7684\u63A5\u5165\u534F\u8BAE\u4E0D\u517C\u5BB9\uFF0C\u8BF7\u5347\u7EA7 CLI \u6216\u9009\u62E9\u517C\u5BB9\u7248\u672C\u3002`);
245
+ throw new Error(`${definition3.label} Skill \u7684\u63A5\u5165\u534F\u8BAE\u4E0D\u517C\u5BB9\uFF0C${definition3.alwaysLatest ? "\u8BF7\u5347\u7EA7 CLI \u540E\u91CD\u8BD5\uFF0C\u4E0D\u80FD\u9000\u56DE\u65E7\u7248\u672C" : "\u8BF7\u5347\u7EA7 CLI \u6216\u9009\u62E9\u517C\u5BB9\u7248\u672C"}\u3002`);
246
246
  }
247
247
  if ([pkg.dependencies, pkg.optionalDependencies].some((dependencies2) => dependencies2 && Object.keys(dependencies2).length)) {
248
248
  throw new Error(`${definition3.label} Skill \u5FC5\u987B\u662F\u65E0\u5B89\u88C5\u4F9D\u8D56\u7684\u8D44\u6E90\u5305\u3002`);
@@ -281,9 +281,10 @@ async function cached(definition3, root, lock) {
281
281
  }
282
282
  async function resolveSkillPackage(definition3, previous, options = {}) {
283
283
  if (previous && !validSkillLock(previous, definition3.protocolVersions)) throw new Error(`${definition3.label} \u7248\u672C\u8BB0\u5F55\u635F\u574F\uFF0C\u5DF2\u4FDD\u7559\u9879\u76EE\uFF0C\u8BF7\u68C0\u67E5 skill-lock.json\u3002`);
284
+ if (definition3.alwaysLatest && options.version !== void 0) throw new Error(`${definition3.versionFlag} \u5DF2\u505C\u6B62\u4F7F\u7528\uFF1B${definition3.label} \u6BCF\u6B21\u8FDB\u5165\u6216\u6062\u590D\u90FD\u4F7F\u7528\u516C\u5171 npm latest \u6700\u65B0\u6B63\u5F0F\u7248\u3002`);
284
285
  if (options.version !== void 0 && !VERSION.test(options.version)) throw new Error(`${definition3.versionFlag} \u5FC5\u987B\u662F\u51C6\u786E\u7684\u7A33\u5B9A\u7248\u672C\u3002`);
285
286
  if (options.localRoot && options.version) throw new Error(`\u672C\u5730 Skill \u8DEF\u5F84\u4E0E ${definition3.versionFlag} \u4E0D\u80FD\u540C\u65F6\u4F7F\u7528\u3002`);
286
- const local = options.localRoot ?? (!options.version && previous?.source === "local" ? previous.path : void 0);
287
+ const local = options.localRoot ?? (!definition3.alwaysLatest && !options.version && previous?.source === "local" ? previous.path : void 0);
287
288
  if (local) {
288
289
  if (!isAbsolute(local)) throw new Error(`${definition3.pathEnvironment} \u5FC5\u987B\u662F\u7EDD\u5BF9\u8DEF\u5F84\u3002`);
289
290
  const root = await realpath2(local);
@@ -294,7 +295,7 @@ async function resolveSkillPackage(definition3, previous, options = {}) {
294
295
  return { root, lock: { source: "local", path: root, version: pkg2.version, protocolVersion } };
295
296
  }
296
297
  const cache = options.cacheDirectory ?? join2(homedir2(), ".cache", "buddy-cli", definition3.cacheFolder);
297
- const pinned = !options.version || options.version === previous?.version ? previous : void 0;
298
+ const pinned = !definition3.alwaysLatest && (!options.version || options.version === previous?.version) ? previous : void 0;
298
299
  if (pinned?.source === "npm") {
299
300
  const root = await cached(definition3, join2(cache, pinned.version), pinned);
300
301
  if (root) return { root, lock: pinned };
@@ -302,11 +303,17 @@ async function resolveSkillPackage(definition3, previous, options = {}) {
302
303
  options.signal?.throwIfAborted();
303
304
  const version = options.version ?? pinned?.version ?? "latest";
304
305
  options.report?.(`\u6B63\u5728\u67E5\u8BE2 ${definition3.label} Skill ${version}\u2026`);
305
- const response = await (options.fetch ?? globalThis.fetch)(`${REGISTRY}${encodeURIComponent(definition3.name)}/${version}`, {
306
- headers: { Accept: "application/json" },
307
- redirect: "error",
308
- signal: options.signal ? AbortSignal.any([options.signal, AbortSignal.timeout(15e3)]) : AbortSignal.timeout(15e3)
309
- });
306
+ let response;
307
+ 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 {
314
+ 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`);
316
+ }
310
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`);
311
318
  const text2 = await response.text();
312
319
  if (text2.length > 512 * 1024) throw new Error(`${definition3.label} npm \u5143\u6570\u636E\u8FC7\u5927\u3002`);
@@ -314,7 +321,8 @@ async function resolveSkillPackage(definition3, previous, options = {}) {
314
321
  checkProtocol(definition3, pkg);
315
322
  if (version !== "latest" && pkg.version !== version) throw new Error(`npm \u8FD4\u56DE\u4E86\u4E0D\u540C\u7684 ${definition3.label} \u7248\u672C\u3002`);
316
323
  const lock = { source: "npm", version: pkg.version, integrity: pkg.dist?.integrity, protocolVersion: pkg.buddySkill.protocolVersion };
317
- if (!validSkillLock(lock, definition3.protocolVersions) || pinned && (lock.integrity !== pinned.integrity || lock.protocolVersion !== pinned.protocolVersion)) throw new Error(`${definition3.label} Skill \u4E0B\u8F7D\u6821\u9A8C\u4FE1\u606F\u4E0D\u5339\u914D\u3002`);
324
+ const expected = pinned ?? (previous?.source === "npm" && previous.version === lock.version ? previous : void 0);
325
+ if (!validSkillLock(lock, definition3.protocolVersions) || expected && (lock.integrity !== expected.integrity || lock.protocolVersion !== expected.protocolVersion)) throw new Error(`${definition3.label} Skill \u4E0B\u8F7D\u6821\u9A8C\u4FE1\u606F\u4E0D\u5339\u914D\u3002`);
318
326
  const destination = join2(cache, lock.version);
319
327
  const existing = await cached(definition3, destination, lock);
320
328
  if (existing) return { root: existing, lock };
@@ -947,7 +955,7 @@ async function readExistingManifest(agentConfigPath) {
947
955
  );
948
956
  }
949
957
  }
950
- async function planBuddyDraftInitialization(directory) {
958
+ async function planBuddyDraftInitialization(directory, options = {}) {
951
959
  const rootDirectory = resolve3(directory);
952
960
  const agentConfigPath = join6(rootDirectory, BUDDY_PACKAGE_FILENAME);
953
961
  const state2 = await pathState(rootDirectory);
@@ -959,10 +967,10 @@ async function planBuddyDraftInitialization(directory) {
959
967
  );
960
968
  }
961
969
  const existingManifest = state2.kind === "directory" ? await readExistingManifest(agentConfigPath) : void 0;
962
- if (existingManifest !== void 0 && (await missingBuddyAgentFiles(rootDirectory)).length === 0) {
970
+ if (!options.resumeCreator && existingManifest !== void 0 && (await missingBuddyAgentFiles(rootDirectory)).length === 0) {
963
971
  throw new ProjectInitializationError(
964
972
  "ALREADY_INITIALIZED",
965
- `\u9879\u76EE\u5DF2\u7ECF\u662F\u5B8C\u6574 Agent \u5DE5\u7A0B\uFF0C\u4E0D\u9700\u8981\u91CD\u65B0\u8FDB\u5165\u521B\u4F5C\u521D\u59CB\u5316\u3002`,
973
+ "\u9879\u76EE\u5DF2\u7ECF\u662F\u5B8C\u6574 Agent \u5DE5\u7A0B\uFF0C\u4E14\u6CA1\u6709\u53EF\u6062\u590D\u7684 Creator \u8BB0\u5F55\uFF1B\u8BF7\u6309\u5DF2\u6709\u9700\u6C42\u7EE7\u7EED\u5F00\u53D1\uFF0C\u4E0D\u91CD\u65B0\u521D\u59CB\u5316\u3002",
966
974
  agentConfigPath
967
975
  );
968
976
  }
@@ -972,7 +980,8 @@ async function planBuddyDraftInitialization(directory) {
972
980
  agentConfigPath,
973
981
  createRootDirectory: state2.kind === "missing",
974
982
  ...state2.kind === "directory" ? { expectedDirectoryIdentity: state2.identity } : {},
975
- ...existingManifest === void 0 ? {} : { existingManifest }
983
+ ...existingManifest === void 0 ? {} : { existingManifest },
984
+ ...options.resumeCreator ? { resumeCreator: true } : {}
976
985
  };
977
986
  }
978
987
  async function planBuddyProjectInitialization(options) {
@@ -1121,7 +1130,7 @@ async function applyBuddyDraftInitialization(plan, draft) {
1121
1130
  const directoryIdentity = await prepareInitializationDirectory(plan);
1122
1131
  if (plan.existingManifest !== void 0) {
1123
1132
  const current = await readExistingManifest(plan.agentConfigPath);
1124
- if (current === void 0 || current.buddyId !== draft.buddyId || (await missingBuddyAgentFiles(plan.rootDirectory)).length === 0) {
1133
+ if (current === void 0 || current.buddyId !== draft.buddyId || !plan.resumeCreator && (await missingBuddyAgentFiles(plan.rootDirectory)).length === 0) {
1125
1134
  throw new ProjectInitializationError(
1126
1135
  "ALREADY_INITIALIZED",
1127
1136
  `\u5DF2\u6709 ${BUDDY_PACKAGE_FILENAME} \u7ED1\u5B9A\u7684 buddyId \u4E0E\u672C\u6B21\u4E91\u7AEF\u642D\u5B50\u4E0D\u4E00\u81F4\u3002`,
@@ -2501,6 +2510,7 @@ var definition2 = {
2501
2510
  cacheFolder: "creator-skills/buddy-creator-skill",
2502
2511
  pathEnvironment: "BUDDY_CREATOR_SKILL_PATH",
2503
2512
  versionFlag: "--creator-version",
2513
+ alwaysLatest: true,
2504
2514
  protocolVersions,
2505
2515
  protocol: { entrypoint: "scripts/buddy.py", skill: "SKILL.md", workflow: "references/cli-workflow.md", workspaceFormat: "buddy-creator-1" },
2506
2516
  requiredFiles: ["SKILL.md", "scripts/buddy.py", "references/cli-workflow.md", "references/host-guide.md"]
@@ -2782,7 +2792,7 @@ function handoffMarkdown(context, skillRoot, session, workspacePath) {
2782
2792
  ];
2783
2793
  return `# Buddy \u521B\u5EFA\u63A5\u7EED\u8BF4\u660E
2784
2794
 
2785
- <!-- buddy-cli creator-handoff:3 -->
2795
+ <!-- buddy-cli creator-handoff:4 -->
2786
2796
 
2787
2797
  \u5148\u6267\u884C \`buddy-cli guide\` \u5E76\u5B8C\u6574\u9605\u8BFB\u5F53\u524D\u5F00\u53D1\u6307\u5F15\uFF1BCLI \u4F1A\u5148\u81EA\u68C0\u5E76\u5728\u9700\u8981\u65F6\u81EA\u52A8\u66F4\u65B0\uFF0C\u7B49\u5F85\u547D\u4EE4\u5B8C\u6210\uFF0C\u4E0D\u91CD\u590D\u53D1\u8D77\u3002
2788
2798
  \u672C\u6587\u4EF6\u53EA\u63D0\u4F9B\u672C\u6B21\u5DE5\u7A0B\u4E0E Skill \u7684\u63A5\u7EED\u4FE1\u606F\uFF1B\u901A\u7528\u5F00\u53D1\u548C\u4EA4\u4ED8\u89C4\u5219\u4EE5 guide \u4E3A\u51C6\u3002
@@ -2794,7 +2804,8 @@ function handoffMarkdown(context, skillRoot, session, workspacePath) {
2794
2804
 
2795
2805
  ## \u7531\u5F53\u524D\u4E3B\u5BF9\u8BDD\u6267\u884C\u521B\u4F5C
2796
2806
 
2797
- \u5B8C\u6574\u8BFB\u53D6 ${JSON.stringify(join14(skillRoot, "SKILL.md"))} \u4E0E ${JSON.stringify(join14(skillRoot, "references/cli-workflow.md"))}\uFF0C\u6309\u5F53\u524D\u4F5C\u54C1\u5DE5\u4F5C\u6D41\u4E0E Skill \u5B9A\u4E49\u7684\u9636\u6BB5\u63A5\u7EED\u3002\u5DF2\u6709\u4F5C\u54C1\u6CBF\u7528\u539F\u9636\u6BB5\uFF0C\u4E0D\u56E0 CLI \u6216 Skill \u5347\u7EA7\u8FC1\u79FB\u4F5C\u54C1\u3002
2807
+ \u672C\u6587\u4EF6\u8BB0\u5F55\u672C\u6B21\u9009\u7528\u7684 Creator\uFF1B\u6BCF\u6B21\u91CD\u65B0\u8FDB\u5165\u6216\u6062\u590D\u521B\u4F5C\uFF0C\u5148\u5728\u540C\u76EE\u5F55\u6267\u884C \`buddy-cli init --mode create\` \u67E5\u8BE2\u516C\u5171 npm latest\uFF0C\u518D\u8BFB\u53D6\u66F4\u65B0\u540E\u7684 HANDOFF\uFF0C\u4E0D\u76F4\u63A5\u8C03\u7528\u65E7\u7F13\u5B58\u76EE\u5F55\u3002\u672C\u8F6E\u547D\u4EE4\u5DF2\u6210\u529F\u65F6\u4E0D\u91CD\u590D\u6267\u884C\uFF0C\u540C\u4E00\u8F6E\u8BBF\u8C08\u7684\u540E\u7EED\u5DE5\u5177\u8C03\u7528\u4F7F\u7528\u672C\u6B21\u9009\u5B9A\u7248\u672C\u3002
2808
+ \u5B8C\u6574\u8BFB\u53D6 ${JSON.stringify(join14(skillRoot, "SKILL.md"))} \u4E0E ${JSON.stringify(join14(skillRoot, "references/cli-workflow.md"))}\uFF0C\u7531\u6700\u65B0\u7248 Creator \u7684 open \u8BFB\u53D6\u65E7\u8D44\u6599\u5E76\u8FC1\u79FB\u5230 workflowVersion=2 \u7684\u4E09\u518C\uFF1A\u5B9A\u4F4D\u3001\u77E5\u8BC6\u4E0E\u65B9\u6CD5\u3001\u4ED8\u8D39\u670D\u52A1\u3002\u5148\u4FDD\u5B58\u65E7\u6210\u679C\uFF0C\u518D\u6309\u8FC1\u79FB\u7ED3\u679C\u8865\u9F50\u7F3A\u53E3\u6216\u91CD\u65B0\u786E\u8BA4\u53D1\u751F\u53D8\u5316\u7684\u5185\u5BB9\uFF1B\u4E0D\u80FD\u76F4\u63A5\u4FEE\u6539\u72B6\u6001\u7248\u672C\u3001\u4F2A\u9020\u786E\u8BA4\u6216\u6CBF\u7528\u65E7\u4EA4\u4ED8\u7684\u5B8C\u6210\u6807\u8BB0\u3002
2798
2809
  \u4F7F\u7528\u5BBF\u4E3B\u5B9E\u9645\u53EF\u7528\u7684 Python 3.9+\uFF0C\u6240\u6709\u8C03\u7528\u52A0 -B\uFF0C\u8FDB\u7A0B\u73AF\u5883\u8BBE\u7F6E PYTHONDONTWRITEBYTECODE=1\u3002\u4FDD\u6301 creation-key \u4E0E workspace \u4E0D\u53D8\uFF0C\u4E0D\u91CD\u7F6E\u4F5C\u54C1\u3002
2799
2810
  \u9996\u6B21 open \u7684 argv\uFF1A
2800
2811
 
@@ -2806,7 +2817,7 @@ ${JSON.stringify(openArgs, null, 2)}
2806
2817
 
2807
2818
  \u4EC5 directive=creator_complete \u4E14 completion.status=ready\u3001manualPath \u5B58\u5728\u4E14\u4EA4\u4ED8\u6709\u6548\u65F6\u8FDB\u5165\u5F00\u53D1\u3002directive=finalize_required \u65F6\u5148\u4FEE\u590D\u4EA4\u4ED8\u3002\u5DF2\u5B8C\u6210\u4F5C\u54C1\u76F4\u63A5\u63A5\u56DE\u5F00\u53D1\uFF1B\u7528\u6237\u660E\u786E\u4EC5\u505A\u8BBE\u8BA1\u6216\u6682\u505C\u65F6\u9075\u5B88\u8BE5\u8303\u56F4\u3002
2808
2819
 
2809
- \u91CD\u65B0\u6267\u884C \`buddy-cli guide\` \u83B7\u53D6\u5F53\u524D\u89C4\u5219\uFF0C\u8BFB\u53D6 completion.manualPath \u6307\u5411\u7684\u771F\u5B9E\u624B\u518C\u3001\u540C\u76EE\u5F55\u5B9E\u9645 manifest\u3001sources.json \u4E0E\u6765\u6E90\u6620\u5C04\u53CA\u5C0F\u6302\u4EF6\u4EA7\u7269\uFF0C\u4E0D\u6309\u65E7\u56DB\u518C\u6587\u4EF6\u540D\u786C\u7F16\u7801\u6E05\u5355\u3002workflowVersion=2 \u7684\u4EA4\u4ED8\u8FD8\u8BFB\u53D6 completion.capabilityContractPath\uFF0C\u5E76\u6309 Skill \u7684 references/implementation-handoff.md \u4FDD\u5B58 implementation-report.json\u3001\u6267\u884C handoff-check\u3002\u8BE5\u68C0\u67E5\u4E0D\u66FF\u4EE3\u771F\u5B9E Runtime \u9A8C\u8BC1\uFF1B\u65E7\u5DE5\u4F5C\u6D41\u4EA4\u4ED8\u4E0D\u5F3A\u5236\u8865\u65B0\u7248\u5951\u7EA6\u6216\u62A5\u544A\uFF0C\u5373\u4F7F\u4F7F\u7528\u534F\u8BAE 2 \u7684 Skill \u63A5\u7EED\u4E5F\u4FDD\u7559\u539F\u89C4\u5219\u3002\u7ED3\u5408\u73B0\u6709\u5DE5\u7A0B\uFF0C\u6309\u5F00\u53D1\u6307\u5F15\u7EE7\u7EED\u5B9E\u73B0\u3002
2820
+ \u91CD\u65B0\u6267\u884C \`buddy-cli guide\` \u83B7\u53D6\u5F53\u524D\u89C4\u5219\uFF0C\u8BFB\u53D6 completion.manualPath \u6307\u5411\u7684\u771F\u5B9E\u624B\u518C\u3001\u540C\u76EE\u5F55\u5B9E\u9645 manifest\u3001sources.json \u4E0E\u6765\u6E90\u6620\u5C04\u53CA\u5C0F\u6302\u4EF6\u4EA7\u7269\uFF0C\u4E0D\u6309\u65E7\u56DB\u518C\u6587\u4EF6\u540D\u786C\u7F16\u7801\u6E05\u5355\u3002\u65B0\u7248\u4E09\u518C\u4EA4\u4ED8\u8FD8\u8BFB\u53D6 completion.capabilityContractPath\uFF0C\u5E76\u6309 Skill \u7684 references/implementation-handoff.md \u4FDD\u5B58 implementation-report.json\u3001\u6267\u884C handoff-check\u3002\u8BE5\u68C0\u67E5\u4E0D\u66FF\u4EE3\u771F\u5B9E Runtime \u9A8C\u8BC1\uFF1B\u8FC1\u79FB\u540E\u7684\u4E09\u518C\u3001\u80FD\u529B\u5951\u7EA6\u53CA\u4EA4\u4ED8\u987B\u901A\u8FC7\u5F53\u524D Skill \u7684\u6821\u9A8C\uFF0C\u4E0D\u80FD\u4EE5\u65E7\u56DB\u518C\u4EA4\u4ED8\u4EE3\u66FF\u3002\u7ED3\u5408\u73B0\u6709\u5DE5\u7A0B\uFF0C\u6309\u5F00\u53D1\u6307\u5F15\u7EE7\u7EED\u5B9E\u73B0\u3002
2810
2821
 
2811
2822
  \u4F7F\u7528\u5B98\u65B9 Runtime \u521D\u59CB\u5316\u5DE5\u7A0B\uFF0C\u8C03\u7528 buddy-cli\uFF0Cargv \u4E3A\uFF1A
2812
2823
 
@@ -2960,9 +2971,9 @@ ${IMPLEMENTATION_GUIDE_SUMMARY}
2960
2971
 
2961
2972
  ### \u5148\u770B\u9700\u6C42\uFF0C\u4E0D\u91CD\u65B0\u91C7\u8BBF
2962
2973
 
2963
- Creator \u8DEF\u7EBF\u6309\u5F53\u524D\u4F5C\u54C1\u7684\u5DE5\u4F5C\u6D41\u5B8C\u6210\u9700\u6C42\u3001\u5C0F\u6302\u4EF6\u6E05\u5355\u3001\u539F\u578B\u53CA\u8BBE\u8BA1\u9A8C\u6536\uFF0C\u4E14\u4EA4\u4ED8\u6821\u9A8C\u8FD4\u56DE \`directive=creator_complete\`\u3001\`completion.status=ready\`\u3001\u4EA4\u4ED8\u7248\u672C\u6709\u6548\u3001\`completion.manualPath\` \u5B58\u5728\u540E\uFF0C\u518D\u8FDB\u5165\u5F00\u53D1\u3002\u4EC5\u624B\u518C\u786E\u8BA4\u6216\u5B58\u5728\u624B\u518C\u6587\u4EF6\u5747\u4E0D\u8DB3\u4EE5\u89E6\u53D1\u5F00\u53D1\uFF1B\`directive=finalize_required\` \u65F6\u5148\u6062\u590D\u6709\u6548\u4EA4\u4ED8\u3002\u65B0\u4F5C\u54C1 workflowVersion=2 \u4F7F\u7528\u4E09\u518C\uFF1B\u7F3A\u5C11\u5DE5\u4F5C\u6D41\u7248\u672C\u6216\u7248\u672C\u4E3A 1 \u7684\u65E7\u4F5C\u54C1\u6309\u539F\u56DB\u518C\u7EE7\u7EED\uFF0C\u4E0D\u8FC1\u79FB\u4F5C\u54C1\uFF0C\u4E5F\u4E0D\u5F3A\u5236\u8865\u4EA4\u65B0\u7248\u5951\u7EA6\u3002
2974
+ Creator \u8DEF\u7EBF\u6309\u5F53\u524D\u4F5C\u54C1\u7684\u5DE5\u4F5C\u6D41\u5B8C\u6210\u9700\u6C42\u3001\u5C0F\u6302\u4EF6\u6E05\u5355\u3001\u539F\u578B\u53CA\u8BBE\u8BA1\u9A8C\u6536\uFF0C\u4E14\u4EA4\u4ED8\u6821\u9A8C\u8FD4\u56DE \`directive=creator_complete\`\u3001\`completion.status=ready\`\u3001\u4EA4\u4ED8\u7248\u672C\u6709\u6548\u3001\`completion.manualPath\` \u5B58\u5728\u540E\uFF0C\u518D\u8FDB\u5165\u5F00\u53D1\u3002\u4EC5\u624B\u518C\u786E\u8BA4\u6216\u5B58\u5728\u624B\u518C\u6587\u4EF6\u5747\u4E0D\u8DB3\u4EE5\u89E6\u53D1\u5F00\u53D1\uFF1B\`directive=finalize_required\` \u65F6\u5148\u6062\u590D\u6709\u6548\u4EA4\u4ED8\u3002\u6BCF\u6B21\u8FDB\u5165\u6216\u6062\u590D\u521B\u4F5C\u90FD\u5148\u5728\u5DE5\u7A0B\u76EE\u5F55\u6267\u884C \`buddy-cli init --mode create\`\uFF0C\u67E5\u8BE2\u516C\u5171 npm latest \u5E76\u5237\u65B0 HANDOFF\uFF0C\u4E0D\u76F4\u63A5\u8C03\u7528\u65E7\u9501\u8BB0\u5F55\u6216\u7F13\u5B58\u4E2D\u7684 Skill\u3002\u6700\u65B0\u7248 Creator \u7EDF\u4E00\u4F7F\u7528 workflowVersion=2 \u7684\u4E09\u518C\uFF1A\u5B9A\u4F4D\u3001\u77E5\u8BC6\u4E0E\u65B9\u6CD5\u3001\u4ED8\u8D39\u670D\u52A1\uFF1B\u65E7\u56DB\u518C\u7531 Creator \u7684 open \u4FDD\u5B58\u5386\u53F2\u540E\u8FC1\u79FB\uFF0C\u4FDD\u7559\u8EAB\u4EFD\u3001\u539F\u59CB\u8D44\u6599\u548C\u53EF\u590D\u7528\u8FDB\u5EA6\uFF0C\u8865\u9F50\u7F3A\u53E3\u5E76\u91CD\u65B0\u786E\u8BA4\u53D1\u751F\u53D8\u5316\u7684\u5185\u5BB9\u3002\u4E0D\u8981\u81EA\u884C\u6539\u5DE5\u4F5C\u6D41\u7248\u672C\u6216\u628A\u65E7\u5B8C\u6210\u6807\u8BB0\u5F53\u4F5C\u65B0\u4EA4\u4ED8\u3002
2964
2975
 
2965
- \u5728\u5DF2\u6388\u6743\u7684\u5B8C\u6574\u521B\u5EFA\u4EFB\u52A1\u4E2D\uFF0C\u5F53\u524D Coding Agent \u9000\u51FA Skill \u540E\u4E8E\u540C\u4E00\u8F6E\u8BFB\u53D6 \`completion.manualPath\`\u3001\u540C\u76EE\u5F55\u5B9E\u9645 manifest\u3001\`sources.json\` \u4E0E\u6765\u6E90\u6620\u5C04\u53CA\u5C0F\u6302\u4EF6\u5B9E\u9645\u4EA7\u7269\uFF0C\u4E0D\u6309\u65E7\u56DB\u518C\u6587\u4EF6\u540D\u786C\u7F16\u7801\u4EA4\u4ED8\u6E05\u5355\u3002workflowVersion=2 \u7684\u4EA4\u4ED8\u8FD8\u8BFB\u53D6 \`completion.capabilityContractPath\` \u6307\u5411\u7684\u80FD\u529B\u5951\u7EA6\uFF1B\u65E7\u5DE5\u4F5C\u6D41\u4EA4\u4ED8\u7F3A\u5C11\u65B0\u7248\u5951\u7EA6\u4E0D\u4EE3\u8868\u635F\u574F\uFF0C\u5373\u4F7F\u4F7F\u7528\u534F\u8BAE 2 \u7684 Skill \u63A5\u7EED\u4E5F\u4E0D\u5F3A\u52A0\u65B0\u8981\u6C42\u3002\u5B8C\u6574\u7406\u89E3\u5B9A\u4E49\u3001\u77E5\u8BC6\u3001\u65B9\u6CD5\u3001\u670D\u52A1\u3001\u8BBE\u8BA1\u9A8C\u6536\u8BB0\u5F55\u53CA\u5F85\u8865\u5145\u9879\uFF0C\u68C0\u67E5\u73B0\u6709\u5DE5\u7A0B\u5E76\u76F4\u63A5\u5F00\u59CB\u5B9E\u73B0\uFF0C\u4E0D\u518D\u7B49\u5F85\u4E00\u6B21\u5F00\u53D1\u786E\u8BA4\u3002\u624B\u518C\u51B3\u5B9A\u642D\u5B50\u5E94\u8BE5\u600E\u4E48\u505A\uFF0CCoding Agent \u8D1F\u8D23\u9009\u62E9\u5408\u9002\u7684\u5B9E\u73B0\uFF1B\u624B\u518C\u4E0D\u9700\u8981\u5217\u51FA Tool\u3001Skill\u3001Hook \u7B49\u6280\u672F\u540D\u8BCD\u3002
2976
+ \u5728\u5DF2\u6388\u6743\u7684\u5B8C\u6574\u521B\u5EFA\u4EFB\u52A1\u4E2D\uFF0C\u5F53\u524D Coding Agent \u9000\u51FA Skill \u540E\u4E8E\u540C\u4E00\u8F6E\u8BFB\u53D6 \`completion.manualPath\`\u3001\u540C\u76EE\u5F55\u5B9E\u9645 manifest\u3001\`sources.json\` \u4E0E\u6765\u6E90\u6620\u5C04\u53CA\u5C0F\u6302\u4EF6\u5B9E\u9645\u4EA7\u7269\uFF0C\u4E0D\u6309\u65E7\u56DB\u518C\u6587\u4EF6\u540D\u786C\u7F16\u7801\u4EA4\u4ED8\u6E05\u5355\u3002\u65B0\u7248\u4E09\u518C\u4EA4\u4ED8\u8FD8\u8BFB\u53D6 \`completion.capabilityContractPath\` \u6307\u5411\u7684\u80FD\u529B\u5951\u7EA6\uFF1B\u8FC1\u79FB\u540E\u7684\u9879\u76EE\u4E5F\u6309\u5F53\u524D\u4E09\u518C\u4E0E\u5951\u7EA6\u4EA4\u4ED8\uFF0C\u4E0D\u80FD\u8DF3\u8FC7\u65B0\u4EA4\u4ED8\u6821\u9A8C\u3002\u5B8C\u6574\u7406\u89E3\u5B9A\u4E49\u3001\u77E5\u8BC6\u3001\u65B9\u6CD5\u3001\u670D\u52A1\u3001\u8BBE\u8BA1\u9A8C\u6536\u8BB0\u5F55\u53CA\u5F85\u8865\u5145\u9879\uFF0C\u68C0\u67E5\u73B0\u6709\u5DE5\u7A0B\u5E76\u76F4\u63A5\u5F00\u59CB\u5B9E\u73B0\uFF0C\u4E0D\u518D\u7B49\u5F85\u4E00\u6B21\u5F00\u53D1\u786E\u8BA4\u3002\u624B\u518C\u51B3\u5B9A\u642D\u5B50\u5E94\u8BE5\u600E\u4E48\u505A\uFF0CCoding Agent \u8D1F\u8D23\u9009\u62E9\u5408\u9002\u7684\u5B9E\u73B0\uFF1B\u624B\u518C\u4E0D\u9700\u8981\u5217\u51FA Tool\u3001Skill\u3001Hook \u7B49\u6280\u672F\u540D\u8BCD\u3002
2966
2977
 
2967
2978
  \u76F4\u63A5\u5F00\u53D1\u65F6\uFF0C\u4F7F\u7528\u5F00\u53D1\u8005\u5DF2\u63D0\u4F9B\u5E76\u786E\u8BA4\u7684\u9700\u6C42\uFF0C\u4E0D\u5F3A\u5236\u8865\u505A Creator \u6216\u5236\u9020\u4E00\u4EFD\u201C\u5DF2\u786E\u8BA4\u624B\u518C\u201D\u3002\u6240\u6709\u5DE5\u7A0B\u7EDF\u4E00\u4F7F\u7528\u5B98\u65B9 Runtime\u3002\u5DF2\u6709\u5B98\u65B9\u5DE5\u7A0B\u5148\u68C0\u67E5\u5F53\u524D\u4EE3\u7801\u548C\u914D\u7F6E\uFF0C\u590D\u7528\u6EE1\u8DB3\u8981\u6C42\u7684\u5B9E\u73B0\uFF1B\u5DE5\u7A0B\u5B8C\u6574\u65F6\u4E0D\u91CD\u590D init\uFF0C\u7F3A\u5C11\u6A21\u677F\u6587\u4EF6\u65F6\u7528 init --mode direct \u8865\u9F50\u3002
2968
2979
 
@@ -3006,7 +3017,7 @@ DEV \u542F\u52A8\u6216\u8FD0\u884C\u5931\u8D25\u65F6\uFF0C\u5148\u8BFB\u53D6\u98
3006
3017
 
3007
3018
  ### \u4E3B\u52A8\u63D0\u9192\u4E0E\u6570\u636E\u6743\u9650
3008
3019
 
3009
- Creator \u5DE5\u4F5C\u6D41 2 \u7684 Booklet \u63D0\u4F9B\u300C\u5E73\u53F0\u80FD\u529B\u300D\u9875\u7B7E\uFF0C\u65B9\u6848\u552F\u4E00\u6765\u6E90\u662F\u670D\u52A1\u84DD\u56FE \`service.blueprint.data.capabilityPlan\`\u3002\u6309\u6709\u6548\u4EA4\u4ED8\u7684\u80FD\u529B\u5951\u7EA6\u5B9E\u73B0\u4E0E\u9A8C\u8BC1\u4E3B\u52A8\u63D0\u9192\u7684\u89E6\u53D1\u3001\u9891\u7387\u3001\u9759\u9ED8\u548C\u505C\u6B62\u7EA6\u5B9A\uFF0C\u4E0D\u56E0\u9875\u9762\u5C55\u793A\u5DF2\u91C7\u7528\u5C31\u5BA3\u79F0\u5DF2\u542F\u7528\u3002\u65E7\u5DE5\u4F5C\u6D41\u7EE7\u7EED\u8BFB\u53D6\u4EA4\u4ED8\u76EE\u5F55 \`service-blueprint.json\` \u7684 \`data.proactiveReminders\`\uFF1B\u5B57\u6BB5\u7F3A\u5931\u8868\u793A\u5C1A\u672A\u6574\u7406\uFF0C\u4E0D\u80FD\u64C5\u81EA\u6DFB\u52A0\u9ED8\u8BA4\u63D0\u9192\uFF0C\u4E5F\u4E0D\u81EA\u52A8\u8F6C\u6362\u6210\u65B0\u7248\u5951\u7EA6\u3002
3020
+ Creator \u5DE5\u4F5C\u6D41 2 \u7684 Booklet \u63D0\u4F9B\u300C\u5E73\u53F0\u80FD\u529B\u300D\u9875\u7B7E\uFF0C\u65B9\u6848\u552F\u4E00\u6765\u6E90\u662F\u670D\u52A1\u84DD\u56FE \`service.blueprint.data.capabilityPlan\`\u3002\u6309\u6709\u6548\u4EA4\u4ED8\u7684\u80FD\u529B\u5951\u7EA6\u5B9E\u73B0\u4E0E\u9A8C\u8BC1\u4E3B\u52A8\u63D0\u9192\u7684\u89E6\u53D1\u3001\u9891\u7387\u3001\u9759\u9ED8\u548C\u505C\u6B62\u7EA6\u5B9A\uFF0C\u4E0D\u56E0\u9875\u9762\u5C55\u793A\u5DF2\u91C7\u7528\u5C31\u5BA3\u79F0\u5DF2\u542F\u7528\u3002\u65E7\u8D44\u6599\u8FC1\u79FB\u65F6\u53EF\u8BFB\u53D6\u4EA4\u4ED8\u76EE\u5F55 \`service-blueprint.json\` \u7684 \`data.proactiveReminders\`\uFF1B\u5B57\u6BB5\u7F3A\u5931\u8868\u793A\u5C1A\u672A\u6574\u7406\uFF0C\u4E0D\u80FD\u64C5\u81EA\u6DFB\u52A0\u9ED8\u8BA4\u63D0\u9192\uFF0C\u4E5F\u4E0D\u81EA\u52A8\u8F6C\u6362\u6210\u65B0\u7248\u5951\u7EA6\u3002
3010
3021
 
3011
3022
  \u5E73\u53F0\u6570\u636E\u6743\u9650\u76F4\u63A5\u8BFB\u53D6\u5F53\u524D\u5DE5\u7A0B\u7684 \`data-access.json.requirements\`\uFF1B\u6309\u5B9E\u9645\u9700\u8981\u7EF4\u62A4 ID \u548C\u7528\u9014\uFF0C\u4FDD\u5B58\u540E\u9875\u9762\u540C\u6B65\u3002\u80FD\u529B\u65B9\u6848\u4E0D\u7B49\u4E8E\u5B9E\u9645\u58F0\u660E\u6216\u7528\u6237\u6388\u6743\uFF1B\u7F3A\u5C11\u58F0\u660E\u6587\u4EF6\u3001\u58F0\u660E\u635F\u574F\u4E0E\u6709\u6548\u7A7A\u6570\u7EC4\u987B\u5206\u522B\u5904\u7406\u3002\u4E0D\u8981\u590D\u5236\u4E00\u4EFD\u5C55\u793A\u7528\u6743\u9650\u6E05\u5355\uFF0C\u4E5F\u4E0D\u8981\u628A\u4E1A\u52A1\u8BB0\u5F55\u6DF7\u4F5C\u5E73\u53F0\u6388\u6743\u3002
3012
3023
 
@@ -3101,7 +3112,7 @@ DEV \u5FC5\u987B\u7B49\u5230 Runtime \u521D\u59CB\u5316\u5B8C\u6210\u4E14\u5E73\
3101
3112
 
3102
3113
  ### \u6838\u5BF9\u5B9E\u73B0\uFF0C\u518D\u4EA4\u7ED9\u5F00\u53D1\u8005\u4F53\u9A8C
3103
3114
 
3104
- Creator workflowVersion=2 \u7684\u80FD\u529B\u5951\u7EA6\u6309\u7A33\u5B9A\u9700\u6C42 ID \u843D\u5B9E\u3002\u8BFB\u53D6\u8BE5 Skill \u7684 \`references/implementation-handoff.md\`\uFF0C\u5728\u5DE5\u7A0B\u4E2D\u4FDD\u5B58 \`implementation-report.json\`\uFF0C\u7ED1\u5B9A\u5F53\u524D \`contractRevision\` \u4E0E \`sourceArtifact\`\uFF0C\u9010\u9879\u8BB0\u5F55\u5B9E\u9645\u5B9E\u73B0\u3001\u9A8C\u8BC1\u8BC1\u636E\u6216\u963B\u585E\u539F\u56E0\u3002\u4F7F\u7528 Skill \u7684 \`scripts/buddy.py handoff-check --contract <\u5B9E\u9645\u5951\u7EA6\u8DEF\u5F84> --report <\u5DE5\u7A0B\u62A5\u544A\u8DEF\u5F84>\` \u6838\u5BF9\uFF1B\u6CBF\u7528\u771F\u5B9E Python 3.9+\u3001\`-B\` \u4E0E \`PYTHONDONTWRITEBYTECODE=1\`\u3002\u8BE5\u547D\u4EE4\u53EA\u68C0\u67E5\u7248\u672C\u3001\u8986\u76D6\u548C\u62A5\u544A\u7ED3\u6784\uFF0C\u4E0D\u6267\u884C\u5DE5\u7A0B\uFF0C\u4E5F\u4E0D\u66FF\u4EE3\u771F\u5B9E Runtime \u9A8C\u8BC1\uFF1B\u7ED3\u6784\u5B8C\u6574\u4ECD\u53EF\u80FD\u6709 \`blockedIds\`\u3002\u5EF6\u671F\u6216\u4E0D\u9700\u8981\u7684\u80FD\u529B\u4E0D\u80FD\u5199\u6210\u672C\u671F\u5DF2\u542F\u7528\uFF0C\u8BBE\u8BA1\u53D8\u5316\u540E\u987B\u91CD\u65B0\u7ED1\u5B9A\u5F53\u524D\u5951\u7EA6\u3002\u65E7\u5DE5\u4F5C\u6D41\u9879\u76EE\u4E0D\u56E0 CLI \u6216 Skill \u5347\u7EA7\u800C\u65B0\u589E\u8FD9\u4EFD\u62A5\u544A\u8981\u6C42\u3002
3115
+ Creator workflowVersion=2 \u7684\u80FD\u529B\u5951\u7EA6\u6309\u7A33\u5B9A\u9700\u6C42 ID \u843D\u5B9E\u3002\u8BFB\u53D6\u8BE5 Skill \u7684 \`references/implementation-handoff.md\`\uFF0C\u5728\u5DE5\u7A0B\u4E2D\u4FDD\u5B58 \`implementation-report.json\`\uFF0C\u7ED1\u5B9A\u5F53\u524D \`contractRevision\` \u4E0E \`sourceArtifact\`\uFF0C\u9010\u9879\u8BB0\u5F55\u5B9E\u9645\u5B9E\u73B0\u3001\u9A8C\u8BC1\u8BC1\u636E\u6216\u963B\u585E\u539F\u56E0\u3002\u4F7F\u7528 Skill \u7684 \`scripts/buddy.py handoff-check --contract <\u5B9E\u9645\u5951\u7EA6\u8DEF\u5F84> --report <\u5DE5\u7A0B\u62A5\u544A\u8DEF\u5F84>\` \u6838\u5BF9\uFF1B\u6CBF\u7528\u771F\u5B9E Python 3.9+\u3001\`-B\` \u4E0E \`PYTHONDONTWRITEBYTECODE=1\`\u3002\u8BE5\u547D\u4EE4\u53EA\u68C0\u67E5\u7248\u672C\u3001\u8986\u76D6\u548C\u62A5\u544A\u7ED3\u6784\uFF0C\u4E0D\u6267\u884C\u5DE5\u7A0B\uFF0C\u4E5F\u4E0D\u66FF\u4EE3\u771F\u5B9E Runtime \u9A8C\u8BC1\uFF1B\u7ED3\u6784\u5B8C\u6574\u4ECD\u53EF\u80FD\u6709 \`blockedIds\`\u3002\u5EF6\u671F\u6216\u4E0D\u9700\u8981\u7684\u80FD\u529B\u4E0D\u80FD\u5199\u6210\u672C\u671F\u5DF2\u542F\u7528\uFF0C\u8BBE\u8BA1\u53D8\u5316\u540E\u987B\u91CD\u65B0\u7ED1\u5B9A\u5F53\u524D\u5951\u7EA6\u3002\u8FC1\u79FB\u540E\u7684\u9879\u76EE\u4F7F\u7528\u5F53\u524D\u80FD\u529B\u5951\u7EA6\u4E0E\u62A5\u544A\uFF0C\u65E7\u56DB\u518C\u4EA4\u4ED8\u53EA\u4F5C\u5386\u53F2\u53C2\u8003\u3002
3105
3116
 
3106
3117
  \u5B8C\u6210\u5F00\u53D1\u540E\u5411\u5F00\u53D1\u8005\u7B80\u8981\u8BF4\u660E\uFF1A\u9700\u6C42\u6240\u5728\u7AE0\u8282\u6216\u6765\u6E90\u3001\u5BF9\u5E94\u5B9E\u73B0\u548C\u68C0\u67E5\u7ED3\u679C\u3001\u4ECD\u5B58\u5728\u7684\u7F3A\u53E3\uFF1B\u5185\u5BB9\u7B80\u5355\u65F6\u7528\u77ED\u6E05\u5355\u5373\u53EF\u3002\u9664\u4E0A\u8FF0\u5DE5\u4F5C\u6D41 2 \u5B9E\u65BD\u62A5\u544A\u5916\uFF0C\u4E0D\u8981\u6C42\u989D\u5916\u751F\u6210 README\u3001\u786E\u8BA4\u8868\u6216\u72B6\u6001\u6587\u4EF6\u3002\u533A\u5206\u5DF2\u5B9E\u73B0\u3001\u5F85\u5B9E\u73B0\u548C\u7F3A\u5C11\u6761\u4EF6\uFF0C\u4E0D\u628A\u8BA1\u5212\u5199\u6210\u5B8C\u6210\uFF1B\u4E0D\u8981\u590D\u5236\u79C1\u4EBA\u804A\u5929\u3001\u5065\u5EB7\u539F\u59CB\u8BB0\u5F55\u6216\u51ED\u636E\u3002\u6062\u590D\u5F00\u53D1\u65F6\u6309\u624B\u518C\u4E0E\u4EE3\u7801\u6838\u5BF9\uFF0C\u4E0D\u628A\u65E7\u8BF4\u660E\u5F53\u4F5C\u5F53\u524D\u5B9E\u73B0\u7684\u8BC1\u636E\u3002
3107
3118
 
@@ -3360,7 +3371,6 @@ var CLI_HELP = `\u642D\u642D Developer Platform CLI
3360
3371
  preview \u8FDE\u63A5\u5DE5\u7A0B\u5E76\u6253\u5F00\u540E\u53F0\u5F00\u53D1\u8C03\u8BD5
3361
3372
  push \u4E0A\u4F20\u7A0B\u5E8F\u5305\uFF0C\u53EF\u7528 --product \u540C\u6B65\u63D0\u4EA4\u5546\u54C1\u5BA1\u6838
3362
3373
  products \u4E3A\u5DF2\u6709\u7248\u672C\u8865\u63D0\u5546\u54C1\uFF0C\u6216\u6062\u590D\u539F\u63D0\u5BA1\u8BF7\u6C42
3363
- release \u4ECE\u660E\u786E\u56DE\u6267\u53D1\u5E03\uFF0C\u67E5\u8BE2\u3001\u6062\u590D\u3001\u91CD\u8BD5\u6216\u53D6\u6D88\u53D1\u5E03
3364
3374
  status \u67E5\u770B\u4E91\u7AEF\u7248\u672C\u3001\u8FD0\u884C\u3001\u5BA1\u6838\u548C\u6784\u5EFA\u72B6\u6001
3365
3375
  meta \u67E5\u770B\u4E91\u7AEF\u8D44\u6599\uFF1Bmeta update \u4FEE\u6539\u8D44\u6599\u6216\u66FF\u6362\u5934\u50CF
3366
3376
  avatar \u65E7\u5934\u50CF\u547D\u4EE4\u517C\u5BB9\u5165\u53E3\uFF0C\u63A8\u8350 meta update --avatar
@@ -3393,12 +3403,12 @@ var INIT_HELP = `\u7528\u6CD5: buddy-cli init [\u53C2\u6570]
3393
3403
  --confirm-meta \u58F0\u660E\u7528\u6237\u5DF2\u786E\u8BA4\u672C\u6B21\u8D44\u6599\u548C\u5B9E\u9645\u5934\u50CF\uFF1B\u672A\u786E\u8BA4\u4E0D\u5F97\u4F20\u5165
3394
3404
  --buddy-id <\u642D\u5B50 ID> \u6062\u590D\u5F53\u524D\u8D26\u53F7\u5DF2\u6709\u642D\u5B50\uFF0C\u4E0D\u80FD\u81EA\u884C\u6307\u5B9A\u65B0\u8EAB\u4EFD
3395
3405
  --avatar-skill-version <\u7248\u672C> \u5934\u50CF\u51C6\u5907\u65F6\u6307\u5B9A\u51C6\u786E Skill \u7248\u672C\uFF1B\u5DF2\u6709\u56FE\u7247\u53EF\u76F4\u63A5\u786E\u8BA4\u4E0A\u4F20
3396
- --creator-version <\u7248\u672C> create \u6A21\u5F0F\u6307\u5B9A\u51C6\u786E Skill \u7248\u672C\uFF1B\u5DF2\u6709\u9879\u76EE\u9ED8\u8BA4\u590D\u7528\u56FA\u5B9A\u7248\u672C
3397
3406
 
3398
3407
  \u65B0\u5EFA\u9700\u51C6\u5907\u540D\u79F0\u3001\u4ECB\u7ECD\u548C\u5934\u50CF\uFF0C\u786E\u8BA4\u540E\u624D\u5199\u5165\u5E73\u53F0\uFF1B\u672A\u5B8C\u6210\u65F6\u4FDD\u5B58 .buddy/meta/ \u8349\u7A3F\uFF0C\u8FD4\u56DE\u9000\u51FA\u7801 2\u3002
3399
3408
  \u4EA4\u4E92\u65F6\u8BE2\u95EE\u7F3A\u5C11\u7684\u8D44\u6599\uFF1B\u975E\u4EA4\u4E92\u8C03\u7528\u9700\u663E\u5F0F\u63D0\u4F9B\u6A21\u5F0F\u548C\u65B0\u5EFA\u8D44\u6599\uFF0C\u53EF\u4ECE\u539F\u76EE\u5F55\u6062\u590D\u8349\u7A3F\u6216\u4E91\u7AEF\u8D44\u6599\u3002
3400
3409
  direct \u751F\u6210\u65B0\u4E1A\u52A1\u5DE5\u5382\u524D\uFF0C\u6309\u5DE5\u7A0B Runtime \u5217\u51FA\u53EF\u7528\u6A21\u578B\u5E76\u7531\u5F00\u53D1\u8005\u786E\u8BA4\uFF1B\u5DF2\u6709\u4E1A\u52A1\u5DE5\u5382\u4FDD\u7559\u539F\u6A21\u578B\uFF0C\u4E0D\u4F20 --model\u3002
3401
3410
  \u540C\u76EE\u5F55\u6062\u590D\u4FDD\u7559\u5DF2\u6709\u4E1A\u52A1\u6587\u4EF6\u3002create \u540E\u6309 .buddy/creator/HANDOFF.md \u7EE7\u7EED\uFF0Cdirect \u540E\u5B89\u88C5\u4F9D\u8D56\u5E76\u5B9E\u73B0\u4E1A\u52A1\u3002
3411
+ Creator \u6BCF\u6B21\u8FDB\u5165\u6216\u6062\u590D\u90FD\u67E5\u8BE2\u516C\u5171 npm latest\uFF1B\u6709 Creator \u8BB0\u5F55\u7684\u5B8C\u6574\u5DE5\u7A0B\u4E5F\u53EF\u6267\u884C create \u63A5\u7EED\u521B\u4F5C\uFF0C\u4E0D\u91CD\u5EFA\u4E1A\u52A1\u6587\u4EF6\u3002
3402
3412
  \u5DF2\u767B\u8BB0\u642D\u5B50\u7684\u540D\u79F0\u3001\u4ECB\u7ECD\u6216\u5934\u50CF\u7528 buddy-cli meta update \u4FEE\u6539\uFF1Binit \u4E0D\u8986\u76D6\u4E91\u7AEF\u8D44\u6599\u3002
3403
3413
 
3404
3414
  \u793A\u4F8B:
@@ -3451,9 +3461,9 @@ Coding Agent \u5E94\u76F4\u63A5\u6CBF\u7528\u7528\u6237\u660E\u786E\u63D0\u4F9B\
3451
3461
  \u5934\u50CF Skill \u7248\u672C\u8BB0\u5F55\u5728 .buddy/meta/skill-lock.json\uFF1B--avatar-skill-version <\u51C6\u786E\u7248\u672C> \u663E\u5F0F\u9009\u62E9\u7248\u672C\uFF0C\u672C\u5730\u8054\u8C03\u8BBE\u7F6E BUDDY_AVATAR_SKILL_PATH \u7EDD\u5BF9\u8DEF\u5F84\u3002
3452
3462
  \u666E\u901A\u7EC8\u7AEF\u53EF\u9009\u62E9\u5DF2\u6709\u56FE\u7247\uFF1BCLI \u4E0D\u6267\u884C\u56FE\u7247\u751F\u6210\uFF0C\u4E5F\u4E0D\u8981\u6C42\u5B89\u88C5 Coding Agent\u3002\u4F7F\u7528 --avatar <\u56FE\u7247\u6587\u4EF6> \u6307\u5B9A\u5019\u9009\u5934\u50CF\uFF0C\u7EC8\u7AEF\u9884\u89C8\u5E76\u786E\u8BA4\u540E\u767B\u8BB0\u3002
3453
3463
  \u975E\u4EA4\u4E92\u8C03\u7528\u987B\u5728\u5F00\u53D1\u8005\u660E\u786E\u786E\u8BA4\u5B9E\u9645\u5934\u50CF\u548C\u8D44\u6599\u540E\u4F20 --avatar <\u5DF2\u786E\u8BA4\u56FE\u7247> --confirm-meta\u3002\u672A\u786E\u8BA4\u4E0D\u5F97\u4F20\u8BE5\u6807\u5FD7\uFF1B\u7F3A\u5C11\u56FE\u7247\u6216\u786E\u8BA4\u65F6\u9000\u51FA\u7801\u4E3A 2\uFF0C\u8349\u7A3F\u4FDD\u7559\uFF0C\u53EF\u4EE5\u5728\u539F\u76EE\u5F55\u7EE7\u7EED\u3002
3454
- --mode create \u5B8C\u6210\u8D44\u6599\u548C\u5934\u50CF\u767B\u8BB0\u540E\uFF0C\u52A8\u6001\u83B7\u53D6\u72EC\u7ACB Creator Skill \u5E76\u751F\u6210\u63A5\u7EED\u8BF4\u660E\uFF0C\u652F\u6301 Creator \u63A5\u5165\u534F\u8BAE 1 \u548C 2\uFF1B\u9879\u76EE .buddy/creator/ \u4FDD\u5B58\u521B\u4F5C\u8D44\u6599\u4E0E skill-lock.json \u7248\u672C\u8BB0\u5F55\u3002\u4F7F\u7528 --creator-version <\u51C6\u786E\u7248\u672C> \u663E\u5F0F\u5347\u7EA7\uFF0C\u5DF2\u6709\u9879\u76EE\u9ED8\u8BA4\u590D\u7528\u56FA\u5B9A\u7248\u672C\u4E0E\u539F\u4F5C\u54C1\u5DE5\u4F5C\u6D41\uFF1B\u672C\u5730\u8054\u8C03\u53EF\u8BBE\u7F6E BUDDY_CREATOR_SKILL_PATH \u7EDD\u5BF9\u8DEF\u5F84\u3002
3464
+ --mode create \u5B8C\u6210\u8D44\u6599\u548C\u5934\u50CF\u767B\u8BB0\u540E\uFF0C\u52A8\u6001\u83B7\u53D6\u72EC\u7ACB Creator Skill \u5E76\u751F\u6210\u63A5\u7EED\u8BF4\u660E\uFF0C\u652F\u6301 Creator \u63A5\u5165\u534F\u8BAE 1 \u548C 2\uFF1B\u9879\u76EE .buddy/creator/ \u4FDD\u5B58\u521B\u4F5C\u8D44\u6599\u4E0E skill-lock.json \u7248\u672C\u8BB0\u5F55\u3002\u6BCF\u6B21\u8FDB\u5165\u6216\u6062\u590D\u90FD\u67E5\u8BE2\u516C\u5171 npm latest\uFF0C\u786E\u8BA4\u662F\u6700\u65B0\u7248\u540E\u624D\u590D\u7528\u7F13\u5B58\uFF1Bskill-lock.json \u53EA\u8BB0\u5F55\u672C\u6B21\u7248\u672C\uFF0C\u4E0D\u56FA\u5B9A\u65E7\u7248\u672C\u3002\u67E5\u8BE2\u3001\u4E0B\u8F7D\u6216\u534F\u8BAE\u6821\u9A8C\u5931\u8D25\u65F6\u660E\u786E\u62A5\u9519\uFF0C\u4E0D\u9000\u56DE\u65E7\u7248\u3002\u672C\u5730\u8054\u8C03\u53EF\u663E\u5F0F\u8BBE\u7F6E BUDDY_CREATOR_SKILL_PATH \u7EDD\u5BF9\u8DEF\u5F84\uFF0C\u6E05\u9664\u540E\u6062\u590D\u67E5\u8BE2 latest\u3002
3455
3465
  \u7531\u5F53\u524D Coding Agent \u8BFB\u53D6 .buddy/creator/HANDOFF.md \u5E76\u6267\u884C\u5176\u4E2D\u6307\u5411\u7684 Skill\uFF1B\u9700\u8981 Python 3.9+\uFF0C\u4E0D\u542F\u52A8\u65E7\u91C7\u8BBF Web \u6216\u72EC\u7ACB\u6A21\u578B\u3002
3456
- \u6309\u5F53\u524D\u4F5C\u54C1\u5DE5\u4F5C\u6D41\u5B8C\u6210\u9700\u6C42\u3001\u5C0F\u6302\u4EF6\u6E05\u5355\u3001\u539F\u578B\u548C\u8BBE\u8BA1\u9A8C\u6536\uFF1B\u53EA\u6709\u4EA4\u4ED8\u6821\u9A8C\u8FD4\u56DE creator_complete\u3001completion.status=ready \u4E14\u4EA4\u4ED8\u6709\u6548\u540E\uFF0C\u624D\u7531 Coding Agent \u81EA\u52A8\u8854\u63A5\u5F00\u53D1\u3002\u8BFB\u53D6\u5B9E\u9645 manifest\uFF0C\u4E0D\u786C\u7F16\u7801\u624B\u518C\u6570\u91CF\u6216\u6587\u4EF6\u540D\uFF1BworkflowVersion=2 \u8FD8\u6309\u80FD\u529B\u5951\u7EA6\u5B8C\u6210\u5B9E\u65BD\u62A5\u544A\u548C handoff-check\uFF0C\u7ED3\u6784\u6821\u9A8C\u4E0D\u7B49\u4E8E\u771F\u5B9E Runtime \u9A8C\u8BC1\u3002\u65E7\u4F5C\u54C1\u4E0D\u5F3A\u5236\u8FC1\u79FB\u6216\u8865\u4EA4\u65B0\u7248\u5951\u7EA6\u3002\u9700\u8981\u521D\u59CB\u5316\u65F6\u6267\u884C init --mode direct \u751F\u6210\u5B98\u65B9 Runtime \u5DE5\u7A0B\u3002\u751F\u6210\u65B0\u5DE5\u5382\u524D\u5217\u51FA\u6240\u9009 Runtime \u652F\u6301\u7684\u6A21\u578B\uFF0C\u5148\u8BF7\u5F00\u53D1\u8005\u660E\u786E\u9009\u62E9\uFF0C\u518D\u4F20 --model\uFF1B\u5DF2\u6709\u660E\u786E\u9009\u62E9\u4E0D\u91CD\u590D\u8BE2\u95EE\uFF0C\u4E0D\u80FD\u7531 Coding Agent \u81EA\u884C\u9ED8\u8BA4\u3002\u5DF2\u6709\u4E1A\u52A1\u5DE5\u5382\u6CBF\u7528\u539F\u6A21\u578B\uFF0C\u4E0D\u4F20 --model\u3002\u540C\u76EE\u5F55\u6062\u590D\u65F6\u4ECE package.json \u8BFB\u53D6 buddyId\uFF0C\u5E76\u4F7F\u7528\u5E73\u53F0\u6700\u65B0 Meta\u3002
3466
+ \u6309\u5F53\u524D\u4F5C\u54C1\u5DE5\u4F5C\u6D41\u5B8C\u6210\u9700\u6C42\u3001\u5C0F\u6302\u4EF6\u6E05\u5355\u3001\u539F\u578B\u548C\u8BBE\u8BA1\u9A8C\u6536\uFF1B\u53EA\u6709\u4EA4\u4ED8\u6821\u9A8C\u8FD4\u56DE creator_complete\u3001completion.status=ready \u4E14\u4EA4\u4ED8\u6709\u6548\u540E\uFF0C\u624D\u7531 Coding Agent \u81EA\u52A8\u8854\u63A5\u5F00\u53D1\u3002\u8BFB\u53D6\u5B9E\u9645 manifest\uFF0C\u4E0D\u786C\u7F16\u7801\u624B\u518C\u6570\u91CF\u6216\u6587\u4EF6\u540D\uFF1B\u65B0\u7248\u4E09\u518C\u8FD8\u6309\u80FD\u529B\u5951\u7EA6\u5B8C\u6210\u5B9E\u65BD\u62A5\u544A\u548C handoff-check\uFF0C\u7ED3\u6784\u6821\u9A8C\u4E0D\u7B49\u4E8E\u771F\u5B9E Runtime \u9A8C\u8BC1\u3002\u65E7\u56DB\u518C\u7531\u6700\u65B0\u7248 Creator \u4FDD\u5B58\u5386\u53F2\u540E\u8FC1\u79FB\u4E3A\u4E09\u518C\uFF0C\u590D\u7528\u8D44\u6599\u548C\u8FDB\u5EA6\uFF0C\u8865\u9F50\u7F3A\u53E3\u5E76\u91CD\u65B0\u786E\u8BA4\u53D8\u5316\u5185\u5BB9\uFF1B\u4E0D\u76F4\u63A5\u6CBF\u7528\u65E7\u4EA4\u4ED8\u7684\u5B8C\u6210\u6807\u8BB0\u3002\u9700\u8981\u521D\u59CB\u5316\u65F6\u6267\u884C init --mode direct \u751F\u6210\u5B98\u65B9 Runtime \u5DE5\u7A0B\u3002\u751F\u6210\u65B0\u5DE5\u5382\u524D\u5217\u51FA\u6240\u9009 Runtime \u652F\u6301\u7684\u6A21\u578B\uFF0C\u5148\u8BF7\u5F00\u53D1\u8005\u660E\u786E\u9009\u62E9\uFF0C\u518D\u4F20 --model\uFF1B\u5DF2\u6709\u660E\u786E\u9009\u62E9\u4E0D\u91CD\u590D\u8BE2\u95EE\uFF0C\u4E0D\u80FD\u7531 Coding Agent \u81EA\u884C\u9ED8\u8BA4\u3002\u5DF2\u6709\u4E1A\u52A1\u5DE5\u5382\u6CBF\u7528\u539F\u6A21\u578B\uFF0C\u4E0D\u4F20 --model\u3002\u540C\u76EE\u5F55\u6062\u590D\u65F6\u4ECE package.json \u8BFB\u53D6 buddyId\uFF0C\u5E76\u4F7F\u7528\u5E73\u53F0\u6700\u65B0 Meta\u3002
3457
3467
  Coding Agent \u5E94\u4F20\u5165\u6309\u4E0A\u8FF0\u89C4\u5219\u786E\u5B9A\u7684\u8D44\u6599\uFF0C\u811A\u672C\u4F7F\u7528\u5F00\u53D1\u8005\u63D0\u4F9B\u7684\u53C2\u6570\uFF0C\u907F\u514D\u7B49\u5F85\u7EC8\u7AEF\u8F93\u5165\u3002CLI \u6821\u9A8C\u53C2\u6570\uFF0C\u4E0D\u5224\u65AD\u5BF9\u8BDD\u4E2D\u662F\u5426\u5DF2\u7ECF\u786E\u8BA4\uFF1B\u53C2\u6570\u9F50\u5168\u4E0D\u7B49\u4E8E\u7528\u6237\u786E\u8BA4\u3002
3458
3468
  Coding Agent \u6839\u636E\u5DF2\u786E\u8BA4\u624B\u518C\u6216\u9700\u6C42\u63A8\u8FDB\u5B9E\u73B0\uFF1B\u53EA\u4E3A\u5173\u952E\u7F3A\u53E3\u8BE2\u95EE\uFF0C\u4E0D\u56FA\u5B9A\u8FFD\u52A0\u7B56\u7565\u786E\u8BA4\u3002
3459
3469
  \u6240\u6709\u642D\u5B50\u7EDF\u4E00\u4F7F\u7528\u5B98\u65B9 Runtime\uFF1B\u9700\u6C42\u660E\u786E\u65F6\u4F7F\u7528 --mode direct\uFF0C\u9700\u8981\u68B3\u7406\u9700\u6C42\u65F6\u4F7F\u7528 --mode create\u3002
@@ -5369,21 +5379,12 @@ function parsePackagePush(value) {
5369
5379
  if (operationId(p.pushId) !== metadata.pushId) invalid2("\u4E0A\u4F20\u56DE\u6267 ID \u4E0E\u5143\u6570\u636E\u4E0D\u5339\u914D");
5370
5380
  return { pushId: metadata.pushId, uploadVersion: p.uploadVersion, status: p.status, metadata, reviewIds: selectedReviewIds(p.reviewIds), failure: p.failure ?? null };
5371
5381
  }
5372
- function parseProductRelease(value) {
5373
- const r = record(value);
5374
- if (r.mode !== "with_buddy" && r.mode !== "products_only") invalid2("\u53D1\u5E03\u6A21\u5F0F\u65E0\u6548");
5375
- if (!["accepted", "activating", "active", "failed", "cancelled"].includes(String(r.status))) invalid2("\u53D1\u5E03\u64CD\u4F5C\u72B6\u6001\u65E0\u6548");
5376
- if (typeof r.buddyVersion !== "string" || !r.buddyVersion.trim() || /[\u0000-\u001f\u007f]/u.test(r.buddyVersion)) invalid2("\u53D1\u5E03\u7248\u672C\u65E0\u6548");
5377
- 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 } };
5378
- }
5379
5382
  var CloudOperationError = class extends CloudLifecycleError {
5380
- constructor(code2, message, details, push, release) {
5383
+ constructor(code2, message, details, push) {
5381
5384
  super(code2, message, details);
5382
5385
  this.push = push;
5383
- this.release = release;
5384
5386
  }
5385
5387
  push;
5386
- release;
5387
5388
  };
5388
5389
  function sameReviewIds(a, b) {
5389
5390
  return [...a].sort().join("\0") === [...b].sort().join("\0");
@@ -5421,7 +5422,7 @@ var OperationStore = class {
5421
5422
  }
5422
5423
  async save(record3) {
5423
5424
  const prior = await this.read(record3.id, record3.kind);
5424
- const input = (r) => r.kind === "push" ? r.metadata : r.kind === "release" ? r.request : { version: r.version, reviews: r.reviews };
5425
+ const input = (r) => r.kind === "push" ? r.metadata : { version: r.version, reviews: r.reviews };
5425
5426
  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");
5426
5427
  const temporary = this.path(`${record3.id}_${randomUUID8()}`);
5427
5428
  await writeFile8(temporary, JSON.stringify({ identity: this.identity, operation: record3 }), { flag: "wx", mode: 384 });
@@ -5437,11 +5438,6 @@ var OperationStore = class {
5437
5438
  if (r.metadata.pushId !== id) throw new Error("push mismatch");
5438
5439
  if (r.receipt) parsePackagePush(r.receipt);
5439
5440
  }
5440
- if (r.kind === "release") {
5441
- parseProductRelease({ ...r.request, status: "accepted" });
5442
- if (r.request.releaseId !== id) throw new Error("release mismatch");
5443
- if (r.receipt) parseProductRelease(r.receipt);
5444
- }
5445
5441
  if (r.kind === "submission") {
5446
5442
  if (typeof r.version !== "string" || !r.version.trim() || typeof r.confirmed !== "boolean" || r.reviews.length === 0) throw new Error("submission invalid");
5447
5443
  parsePushMetadata({ pushId: id, commit: "validate", sourceSha256: "0".repeat(64), productReviews: r.reviews });
@@ -5466,7 +5462,7 @@ var OperationStore = class {
5466
5462
  var PRODUCT_HELP = {
5467
5463
  push: `\u7528\u6CD5: buddy-cli push --commit <\u6539\u52A8\u8BF4\u660E> [--product <\u5546\u54C1 ID> ...] [--directory <\u76EE\u5F55>]
5468
5464
  buddy-cli push --resume <pushId> | --status <pushId> [--directory <\u76EE\u5F55>]
5469
- \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
5465
+ \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
5470
5466
  \u5546\u54C1 ID \u793A\u4F8B\uFF1Aprd_12345678\uFF1B\u5DF2\u6709 ps_ \u5546\u54C1 ID \u7EE7\u7EED\u517C\u5BB9\u3002
5471
5467
  \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
5472
5468
  \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`,
@@ -5474,13 +5470,7 @@ var PRODUCT_HELP = {
5474
5470
  buddy-cli products submit --resume <submissionId> [--directory <\u76EE\u5F55>]
5475
5471
  \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
5476
5472
  \u5546\u54C1 ID \u793A\u4F8B\uFF1Aprd_12345678\uFF1B\u5DF2\u6709 ps_ \u5546\u54C1 ID \u7EE7\u7EED\u517C\u5BB9\u3002
5477
- \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`,
5478
- release: `\u7528\u6CD5: buddy-cli release (--from-push <pushId> | --from-submission <submissionId>) [--products-only] [--directory <\u76EE\u5F55>]
5479
- buddy-cli release --version <\u7248\u672C> --code-only [--directory <\u76EE\u5F55>]
5480
- buddy-cli release (--resume | --status | --retry | --cancel) <releaseId> [--directory <\u76EE\u5F55>]
5481
- \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
5482
- \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
5483
- \u4EC5 active \u8868\u793A\u5DF2\u751F\u6548\uFF1Baccepted/activating \u8BF7\u7528 --status \u67E5\u8BE2\u3002`
5473
+ \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`
5484
5474
  };
5485
5475
  function parse2(command, args) {
5486
5476
  if (command === "products") {
@@ -5489,15 +5479,11 @@ function parse2(command, args) {
5489
5479
  }
5490
5480
  const values = /* @__PURE__ */ new Map();
5491
5481
  const products = [];
5492
- 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"];
5482
+ const allowed = command === "push" ? ["--commit", "--resume", "--status", "--product"] : ["--version", "--resume", "--product"];
5493
5483
  for (let i = 0; i < args.length; i++) {
5494
5484
  const flag2 = args[i];
5495
5485
  if (flag2 !== "--directory" && !allowed.includes(flag2)) throw new CloudCommandUsageError(`\u672A\u77E5\u53C2\u6570 ${flag2}`);
5496
5486
  if (flag2 !== "--product" && values.has(flag2)) throw new CloudCommandUsageError(`${flag2} \u4E0D\u80FD\u91CD\u590D`);
5497
- if (["--code-only", "--products-only"].includes(flag2)) {
5498
- values.set(flag2, "true");
5499
- continue;
5500
- }
5501
5487
  const value = args[++i];
5502
5488
  if (!value?.trim() || value.startsWith("--") || /[\u0000-\u001f\u007f]/u.test(value)) throw new CloudCommandUsageError(`${flag2} \u7F3A\u5C11\u6709\u6548\u503C`);
5503
5489
  if (flag2 === "--product") {
@@ -5506,12 +5492,12 @@ function parse2(command, args) {
5506
5492
  } else values.set(flag2, value.trim());
5507
5493
  }
5508
5494
  if (products.length > 10) throw new CloudCommandUsageError("\u4E00\u6B21\u6700\u591A\u9009\u62E9 10 \u4E2A\u5546\u54C1");
5509
- const recovery = ["--resume", "--status", "--retry", "--cancel"].filter((f) => values.has(f));
5495
+ const recovery = ["--resume", "--status"].filter((f) => values.has(f));
5510
5496
  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");
5511
5497
  return { values, products };
5512
5498
  }
5513
5499
  function required(value) {
5514
- 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");
5500
+ 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");
5515
5501
  return value;
5516
5502
  }
5517
5503
  function responseError(message) {
@@ -5547,10 +5533,10 @@ function showPush(io, push) {
5547
5533
  if (failureMessage(push.failure)) io.writeError(`\u539F\u56E0\uFF1A${failureMessage(push.failure)}`);
5548
5534
  if (push.reviewIds.length) io.write(`\u5546\u54C1\u5BA1\u6838\u7F16\u53F7\uFF1A${push.reviewIds.join(", ")}`);
5549
5535
  if (push.status === "completed") {
5550
- 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`);
5536
+ 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");
5551
5537
  return 0;
5552
5538
  }
5553
- 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`);
5539
+ 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`);
5554
5540
  else io.writeError(`\u4E0A\u4F20\u672A\u5B8C\u6210\uFF0C\u4F7F\u7528 buddy-cli push --resume ${push.pushId} \u6062\u590D\u539F\u8BF7\u6C42\u3002`);
5555
5541
  return 1;
5556
5542
  }
@@ -5590,23 +5576,6 @@ async function executePush(record3, sourceBundle, store, client, id, io, options
5590
5576
  throw cause;
5591
5577
  }
5592
5578
  }
5593
- function matchRelease(request, release) {
5594
- 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");
5595
- }
5596
- function showRelease(io, release) {
5597
- io.write(`\u53D1\u5E03\u7F16\u53F7\uFF1A${release.releaseId}`);
5598
- io.write(`\u53D1\u5E03\u72B6\u6001\uFF1A${release.status}`);
5599
- io.write(`\u76EE\u6807\u7248\u672C\uFF1A${release.buddyVersion}`);
5600
- if (failureMessage(release.failure)) io.writeError(`\u539F\u56E0\uFF1A${failureMessage(release.failure)}`);
5601
- if (release.status === "active") {
5602
- io.write("\u53D1\u5E03\u5DF2\u751F\u6548\u3002");
5603
- return 0;
5604
- }
5605
- 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`);
5606
- else if (release.status === "cancelled") io.write("\u8BE5\u53D1\u5E03\u5DF2\u53D6\u6D88\u3002");
5607
- 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`);
5608
- return 1;
5609
- }
5610
5579
  async function runProductLifecycle(command, args, io, options) {
5611
5580
  if (args.length === 1 && ["--help", "-h"].includes(args[0]) || command === "products" && args.length === 2 && args[0] === "submit" && args[1] === "--help") {
5612
5581
  io.write(PRODUCT_HELP[command]);
@@ -5614,7 +5583,7 @@ async function runProductLifecycle(command, args, io, options) {
5614
5583
  }
5615
5584
  const p = parse2(command, args);
5616
5585
  const v = p.values;
5617
- 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");
5586
+ 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");
5618
5587
  const freshPush = command === "push" && !v.has("--resume") && !v.has("--status");
5619
5588
  const root = await (options.resolveProjectRoot ?? (freshPush ? requireBuddyAgentProjectRoot : requireBuddyProjectRoot))(resolve15(options.cwd ?? process.cwd(), v.get("--directory") ?? "."));
5620
5589
  const platform = resolvePlatformUrl({ env: options.runtimeUpdate?.env });
@@ -5655,83 +5624,25 @@ async function runProductLifecycle(command, args, io, options) {
5655
5624
  io.write(`\u6062\u590D\u7F16\u53F7\uFF1A${pushId}`);
5656
5625
  return executePush(record4, bundle, store, client, id, io, options);
5657
5626
  }
5658
- if (command === "products") {
5659
- let record4;
5660
- if (v.has("--resume")) record4 = await store.read(v.get("--resume"), "submission");
5661
- else {
5662
- const version = v.get("--version");
5663
- if (!version || !p.products.length) throw new CloudCommandUsageError(PRODUCT_HELP.products);
5664
- const chosen = await selection(client, id, p.products, io);
5665
- record4 = { kind: "submission", id: `sub_${randomUUID9()}`, version, reviews: chosen.reviews, confirmed: false };
5666
- await store.create(record4);
5667
- }
5668
- io.write(`\u5546\u54C1\u63D0\u4EA4\u7F16\u53F7\uFF1A${record4.id}`);
5669
- try {
5670
- const receipt = await required(client.submitPackageProducts).call(client, { id, version: record4.version, reviews: record4.reviews });
5671
- if (!sameReviewIds(receipt.reviewIds, record4.reviews.map((r) => r.reviewId))) responseError("\u5E73\u53F0\u672A\u786E\u8BA4\u5B8C\u6574\u5546\u54C1\u5BA1\u6838\u96C6\u5408");
5672
- await store.save({ ...record4, confirmed: true });
5673
- io.write(`\u5546\u54C1\u5DF2\u63D0\u4EA4\u5BA1\u6838\uFF1A${receipt.reviewIds.join(", ")}`);
5674
- io.write(`\u5BA1\u6838\u901A\u8FC7\u540E\uFF1Abuddy-cli release --from-submission ${record4.id}`);
5675
- return { exitCode: 0, buddyId: id, version: record4.version };
5676
- } catch (cause) {
5677
- io.writeError(`\u4FDD\u7559\u539F\u8BF7\u6C42\u91CD\u8BD5\uFF1Abuddy-cli products submit --resume ${record4.id}`);
5678
- throw cause;
5679
- }
5680
- }
5681
- const action = ["--resume", "--status", "--retry", "--cancel"].find((f) => v.has(f));
5682
5627
  let record3;
5683
- if (action) {
5684
- const releaseId = v.get(action);
5685
- if (action === "--status") {
5686
- const release = await required(client.getProductRelease).call(client, { id, releaseId });
5687
- if (release.releaseId !== releaseId) responseError("\u53D1\u5E03\u7F16\u53F7\u4E0D\u5339\u914D");
5688
- return { exitCode: showRelease(io, release), buddyId: id, version: release.buddyVersion };
5689
- }
5690
- record3 = await store.read(releaseId, "release");
5691
- } else {
5692
- const sources = ["--from-push", "--from-submission", "--version"].filter((f) => v.has(f));
5693
- 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);
5694
- let version;
5695
- let reviewIds;
5696
- if (v.has("--from-push")) {
5697
- const pushRecord = await store.read(v.get("--from-push"), "push");
5698
- const receipt = await required(client.getPackagePush).call(client, { id, pushId: pushRecord.id });
5699
- confirmPush(pushRecord, receipt);
5700
- await store.save({ ...pushRecord, receipt });
5701
- 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");
5702
- version = receipt.uploadVersion;
5703
- reviewIds = receipt.reviewIds;
5704
- } else if (v.has("--from-submission")) {
5705
- const submission = await store.read(v.get("--from-submission"), "submission");
5706
- if (!submission.confirmed) throw new CloudCommandUsageError(`\u8865\u63D0\u7ED3\u679C\u5C1A\u672A\u786E\u8BA4\uFF0C\u8BF7\u5148 products submit --resume ${submission.id}`);
5707
- version = submission.version;
5708
- reviewIds = submission.reviews.map((r) => r.reviewId);
5709
- } else {
5710
- version = v.get("--version");
5711
- reviewIds = [];
5712
- }
5713
- if (v.has("--products-only")) {
5714
- if (!reviewIds.length) throw new CloudCommandUsageError("--products-only \u9700\u8981\u660E\u786E\u7684\u5546\u54C1\u5BA1\u6838\u96C6\u5408");
5715
- const buddy2 = await client.getBuddy({ id });
5716
- 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");
5717
- }
5718
- const releaseId = `rel_${randomUUID9()}`;
5719
- record3 = { kind: "release", id: releaseId, request: { releaseId, mode: v.has("--products-only") ? "products_only" : "with_buddy", buddyVersion: version, reviewIds } };
5628
+ if (v.has("--resume")) record3 = await store.read(v.get("--resume"), "submission");
5629
+ else {
5630
+ const version = v.get("--version");
5631
+ if (!version || !p.products.length) throw new CloudCommandUsageError(PRODUCT_HELP.products);
5632
+ const chosen = await selection(client, id, p.products, io);
5633
+ record3 = { kind: "submission", id: `sub_${randomUUID9()}`, version, reviews: chosen.reviews, confirmed: false };
5720
5634
  await store.create(record3);
5721
5635
  }
5722
- io.write(`\u6062\u590D\u7F16\u53F7\uFF1A${record3.id}`);
5636
+ io.write(`\u5546\u54C1\u63D0\u4EA4\u7F16\u53F7\uFF1A${record3.id}`);
5723
5637
  try {
5724
- 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 });
5725
- matchRelease(record3.request, receipt);
5726
- await store.save({ ...record3, receipt });
5727
- return { exitCode: showRelease(io, receipt), buddyId: id, version: receipt.buddyVersion };
5638
+ const receipt = await required(client.submitPackageProducts).call(client, { id, version: record3.version, reviews: record3.reviews });
5639
+ if (!sameReviewIds(receipt.reviewIds, record3.reviews.map((r) => r.reviewId))) responseError("\u5E73\u53F0\u672A\u786E\u8BA4\u5B8C\u6574\u5546\u54C1\u5BA1\u6838\u96C6\u5408");
5640
+ await store.save({ ...record3, confirmed: true });
5641
+ io.write(`\u5546\u54C1\u5DF2\u63D0\u4EA4\u5BA1\u6838\uFF1A${receipt.reviewIds.join(", ")}`);
5642
+ io.write("\u5BA1\u6838\u901A\u8FC7\u540E\uFF0C\u8BF7\u5230\u5F00\u53D1\u8005\u540E\u53F0\u786E\u8BA4\u5E76\u53D1\u5E03\u3002");
5643
+ return { exitCode: 0, buddyId: id, version: record3.version };
5728
5644
  } catch (cause) {
5729
- if (cause instanceof CloudOperationError && cause.release) {
5730
- matchRelease(record3.request, cause.release);
5731
- await store.save({ ...record3, receipt: cause.release });
5732
- showRelease(io, cause.release);
5733
- }
5734
- 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}`);
5645
+ io.writeError(`\u4FDD\u7559\u539F\u8BF7\u6C42\u91CD\u8BD5\uFF1Abuddy-cli products submit --resume ${record3.id}`);
5735
5646
  throw cause;
5736
5647
  }
5737
5648
  }
@@ -6109,7 +6020,7 @@ function serverError(response, body) {
6109
6020
  return new CloudOperationError(code2, message, {
6110
6021
  httpStatus: response.status,
6111
6022
  retryable: response.status === 408 || response.status === 429 || response.status >= 500
6112
- }, source?.push === void 0 ? void 0 : parsePackagePush(source.push), source?.release === void 0 ? void 0 : parseProductRelease(source.release));
6023
+ }, source?.push === void 0 ? void 0 : parsePackagePush(source.push));
6113
6024
  }
6114
6025
  var HttpDeveloperPlatformClient = class {
6115
6026
  #baseUrl;
@@ -6276,24 +6187,6 @@ var HttpDeveloperPlatformClient = class {
6276
6187
  const source = object3(await this.#request(`/cli/buddies/${encodeURIComponent(request.id)}/packages/${encodeURIComponent(request.version)}/product-reviews`, "POST", { json: { reviews: request.reviews } }), "response");
6277
6188
  return { reviewIds: selectedReviewIds(source.reviewIds) };
6278
6189
  }
6279
- async createProductRelease(request) {
6280
- const source = object3(await this.#request(`/cli/buddies/${encodeURIComponent(request.id)}/product-releases`, "POST", { json: request.release }), "response");
6281
- return parseProductRelease(source.release);
6282
- }
6283
- async getProductRelease(request) {
6284
- const source = object3(await this.#request(`/cli/buddies/${encodeURIComponent(request.id)}/product-releases/${encodeURIComponent(request.releaseId)}`, "GET"), "response");
6285
- const release = parseProductRelease(source.release);
6286
- if (release.releaseId !== request.releaseId) throw invalid3("\u53D1\u5E03\u56DE\u6267 ID \u4E0D\u5339\u914D");
6287
- return release;
6288
- }
6289
- async retryProductRelease(request) {
6290
- const source = object3(await this.#request(`/cli/buddies/${encodeURIComponent(request.id)}/product-releases/${encodeURIComponent(request.releaseId)}/retry`, "POST"), "response");
6291
- return parseProductRelease(source.release);
6292
- }
6293
- async cancelProductRelease(request) {
6294
- const source = object3(await this.#request(`/cli/buddies/${encodeURIComponent(request.id)}/product-releases/${encodeURIComponent(request.releaseId)}/cancel`, "POST"), "response");
6295
- return parseProductRelease(source.release);
6296
- }
6297
6190
  async getPackageBuild(request) {
6298
6191
  return parseBuild(await this.#request(`/cli/buddies/${encodeURIComponent(request.id)}/packages/${encodeURIComponent(request.version)}/build`, "GET"));
6299
6192
  }
@@ -6424,7 +6317,6 @@ var HELP = Object.freeze({
6424
6317
  logout: "\u7528\u6CD5: buddy-cli logout",
6425
6318
  push: PRODUCT_HELP.push,
6426
6319
  products: PRODUCT_HELP.products,
6427
- release: PRODUCT_HELP.release,
6428
6320
  status: "\u7528\u6CD5: buddy-cli status [--directory <\u9879\u76EE\u76EE\u5F55>]",
6429
6321
  meta: `\u7528\u6CD5: buddy-cli meta [--directory <\u9879\u76EE\u76EE\u5F55> | --buddy-id <\u642D\u5B50 ID>]
6430
6322
  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>]
@@ -6608,7 +6500,7 @@ async function runMeta(parsed, io, options, legacyAvatar = false) {
6608
6500
  }
6609
6501
  async function runCloudCommand(command, args, io, options = {}) {
6610
6502
  try {
6611
- if (command === "push" || command === "products" || command === "release") return await runProductLifecycle(command, args, io, options);
6503
+ if (command === "push" || command === "products") return await runProductLifecycle(command, args, io, options);
6612
6504
  const parsed = parse3(args, command);
6613
6505
  if (parsed.help) {
6614
6506
  io.write(HELP[command]);
@@ -6653,7 +6545,7 @@ async function runCloudCommand(command, args, io, options = {}) {
6653
6545
  exitCode: cause instanceof CloudCommandUsageError || cause instanceof BuddyProjectContextError ? 2 : 1
6654
6546
  };
6655
6547
  }
6656
- if (["push", "products", "release"].includes(command)) {
6548
+ if (["push", "products"].includes(command)) {
6657
6549
  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"}`);
6658
6550
  return { exitCode: 1 };
6659
6551
  }
@@ -8451,6 +8343,7 @@ function parseInitArguments(args) {
8451
8343
  parsed.confirmMeta = true;
8452
8344
  continue;
8453
8345
  }
8346
+ if (flag2 === "--creator-version") throw new CliUsageError("--creator-version \u5DF2\u505C\u6B62\u4F7F\u7528\uFF1BCreator \u6BCF\u6B21\u8FDB\u5165\u6216\u6062\u590D\u90FD\u4F7F\u7528\u516C\u5171 npm latest \u6700\u65B0\u6B63\u5F0F\u7248\u3002");
8454
8347
  const value = valueAfterFlag(args, index, flag2 ?? "\u53C2\u6570");
8455
8348
  index += 1;
8456
8349
  switch (flag2) {
@@ -8483,10 +8376,6 @@ function parseInitArguments(args) {
8483
8376
  if (!/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/u.test(value)) throw new CliUsageError("--avatar-skill-version \u5FC5\u987B\u662F\u51C6\u786E\u7248\u672C\uFF0C\u4F8B\u5982 1.0.0");
8484
8377
  parsed.avatarSkillVersion = setOnce2(parsed.avatarSkillVersion, value, flag2);
8485
8378
  break;
8486
- case "--creator-version":
8487
- if (!/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/u.test(value)) throw new CliUsageError("--creator-version \u5FC5\u987B\u662F\u51C6\u786E\u7248\u672C\uFF0C\u4F8B\u5982 1.6.0");
8488
- parsed.creatorVersion = setOnce2(parsed.creatorVersion, value, flag2);
8489
- break;
8490
8379
  case "--avatar":
8491
8380
  parsed.avatar = setOnce2(parsed.avatar, value, flag2);
8492
8381
  break;
@@ -8498,7 +8387,6 @@ function parseInitArguments(args) {
8498
8387
  }
8499
8388
  }
8500
8389
  if (parsed.model !== void 0 && parsed.mode !== "direct") throw new CliUsageError("--model \u4EC5\u7528\u4E8E --mode direct\uFF1Bcreate \u68B3\u7406\u5B8C\u6210\u540E\u5728\u8FDB\u5165\u5DE5\u7A0B\u5F00\u53D1\u65F6\u786E\u8BA4\u6A21\u578B\u3002");
8501
- if (parsed.creatorVersion && parsed.mode !== "create") throw new CliUsageError("--creator-version \u4EC5\u7528\u4E8E --mode create");
8502
8390
  return parsed;
8503
8391
  }
8504
8392
  function requirePrompt(io, flag2) {
@@ -8647,7 +8535,12 @@ async function runRoute(route, args, io, options) {
8647
8535
  );
8648
8536
  const rootDirectory = resolve19(cwd, directoryInput);
8649
8537
  await assertInitializableBuddyTarget(rootDirectory);
8650
- let plan = await planBuddyDraftInitialization(rootDirectory);
8538
+ const creatorSession = await lstat15(join24(rootDirectory, ".buddy/creator/session.json")).catch((cause) => {
8539
+ if (cause.code === "ENOENT") return void 0;
8540
+ throw cause;
8541
+ });
8542
+ const resumeCreator = !!creatorSession?.isFile() && !creatorSession.isSymbolicLink();
8543
+ let plan = await planBuddyDraftInitialization(rootDirectory, { resumeCreator });
8651
8544
  const existingBuddyId = plan.existingManifest?.buddyId;
8652
8545
  if (existingBuddyId !== void 0 && args.buddyId !== void 0 && existingBuddyId !== args.buddyId) {
8653
8546
  throw new CliUsageError(
@@ -8660,7 +8553,7 @@ async function runRoute(route, args, io, options) {
8660
8553
  writeApplicationDraftReady(io, buddyId, options, requestedBuddyId !== void 0);
8661
8554
  let draft;
8662
8555
  try {
8663
- plan = await planBuddyDraftInitialization(rootDirectory);
8556
+ plan = await planBuddyDraftInitialization(rootDirectory, { resumeCreator });
8664
8557
  draft = await applyBuddyDraftInitialization(plan, { buddyId });
8665
8558
  } catch (cause) {
8666
8559
  io.writeError(
@@ -8677,7 +8570,7 @@ async function runRoute(route, args, io, options) {
8677
8570
  projectRoot: draft.rootDirectory,
8678
8571
  manifestPath: draft.agentConfigPath
8679
8572
  };
8680
- const result = options.creator ? await options.creator(context, io) : await prepareCreatorSkill(context, io, { signal: options.cloud?.signal, version: args.creatorVersion });
8573
+ const result = options.creator ? await options.creator(context, io) : await prepareCreatorSkill(context, io, { signal: options.cloud?.signal });
8681
8574
  return { ...result, route: "create", draft, buddyId };
8682
8575
  }
8683
8576
  async function resumeProjectArguments(args, cwd, options, io) {
@@ -8776,7 +8669,7 @@ async function runBuddyCli(args, io, options = {}) {
8776
8669
  ...options.dev
8777
8670
  });
8778
8671
  }
8779
- if (command === "login" || command === "logout" || command === "push" || command === "products" || command === "release" || command === "status" || command === "meta" || command === "avatar") {
8672
+ if (command === "login" || command === "logout" || command === "push" || command === "products" || command === "status" || command === "meta" || command === "avatar") {
8780
8673
  return await runCloudCommand(command, rest, io, {
8781
8674
  cwd: options.cwd,
8782
8675
  runtimeUpdate: options.runtimeCatalog,