@my-life-buddies/cli 0.23.0-dev.5 → 0.24.0-dev.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
@@ -28,7 +28,11 @@ function runtimeUsesEnvironmentIdentity(pkg) {
28
28
  var RUNTIME_REGISTRY = "https://registry.npmjs.org/";
29
29
  var execute = promisify(execFile);
30
30
  async function latestRuntimeVersion(options = {}) {
31
- return resolveRuntimeVersion("latest", options);
31
+ const metadata = await runtimeMetadata("/dev", options);
32
+ if (metadata?.name !== BUDDY_RUNTIME_PACKAGE || !isExactRuntimeVersion(metadata.version)) {
33
+ throw new Error("npm dev \u672A\u8FD4\u56DE\u6B64 Runtime \u7684\u51C6\u786E\u7248\u672C");
34
+ }
35
+ return metadata.version;
32
36
  }
33
37
  async function runtimeMetadata(suffix, options) {
34
38
  options.signal?.throwIfAborted();
@@ -42,33 +46,6 @@ async function runtimeMetadata(suffix, options) {
42
46
  if (!response.ok) throw new Error(`npm \u8FD4\u56DE HTTP ${response.status}`);
43
47
  return response.json();
44
48
  }
45
- async function resolveRuntimeVersion(selector, options = {}) {
46
- if (!isExactRuntimeVersion(selector) && selector !== "latest" && selector !== "dev") {
47
- throw new Error("Runtime \u7248\u672C\u5FC5\u987B\u662F\u51C6\u786E\u7248\u672C\u3001latest \u6216 dev\uFF0C\u4E0D\u80FD\u4F7F\u7528\u8303\u56F4\u3001\u8DEF\u5F84\u6216 URL");
48
- }
49
- const metadata = await runtimeMetadata(`/${encodeURIComponent(selector)}`, options);
50
- if (metadata?.name !== BUDDY_RUNTIME_PACKAGE || !isExactRuntimeVersion(metadata.version) || selector === "latest" && metadata.version.includes("-") || isExactRuntimeVersion(selector) && metadata.version !== selector) {
51
- throw new Error(`npm ${selector} \u672A\u8FD4\u56DE\u6B64 Runtime \u7684\u51C6\u786E${selector === "latest" ? "\u7A33\u5B9A" : ""}\u7248\u672C`);
52
- }
53
- return metadata.version;
54
- }
55
- async function runtimeReleaseChoices(options = {}) {
56
- const metadata = await runtimeMetadata("", options);
57
- const latest = metadata?.["dist-tags"]?.latest;
58
- const dev = metadata?.["dist-tags"]?.dev;
59
- if (metadata?.name !== BUDDY_RUNTIME_PACKAGE || !isExactRuntimeVersion(latest) || latest.includes("-") || !metadata.versions || !(latest in metadata.versions)) throw new Error("npm \u672A\u8FD4\u56DE\u6709\u6548\u7684 Runtime \u7248\u672C\u5217\u8868");
60
- const versions = Object.keys(metadata.versions).filter(isExactRuntimeVersion).sort((a, b) => b.localeCompare(a, "en", { numeric: true }));
61
- return { latest, ...isExactRuntimeVersion(dev) && dev in metadata.versions ? { dev } : {}, versions };
62
- }
63
- async function runtimeSelectionPrompt(options = {}) {
64
- const releases = await runtimeReleaseChoices(options);
65
- return [
66
- "\u8BF7\u5148\u8BE2\u95EE\u5F00\u53D1\u8005\u9009\u62E9 Runtime \u7248\u672C\uFF0C\u518D\u4F20 --runtime-version <\u51C6\u786E\u7248\u672C|latest|dev>\uFF1B\u4E0D\u8981\u66FF\u5F00\u53D1\u8005\u9ED8\u8BA4\u9009\u62E9\u3002",
67
- `\u6700\u65B0\u7A33\u5B9A\u7248\uFF08\u63A8\u8350\uFF09\uFF1A${releases.latest}\uFF08latest\uFF09`,
68
- ...releases.dev ? [`\u6700\u65B0\u6D4B\u8BD5\u7248\uFF1A${releases.dev}\uFF08dev\uFF09`] : [],
69
- `\u5176\u4ED6\u5DF2\u53D1\u5E03\u7248\u672C\uFF1A${releases.versions.join("\u3001")}`
70
- ].join("\n");
71
- }
72
49
  async function cachedRuntimeRoot(version, options = {}) {
73
50
  if (!isExactRuntimeVersion(version)) throw new Error("Runtime \u7F13\u5B58\u9700\u8981\u51C6\u786E\u7248\u672C");
74
51
  const cache = options.cacheDirectory ?? join(homedir(), ".cache", "buddy-cli-sit", "runtimes");
@@ -118,7 +95,7 @@ async function cachedRuntimeRoot(version, options = {}) {
118
95
  "--fetch-timeout=20000"
119
96
  ], { cwd: temporaryRoot, signal: options.signal, timeout: 18e4 });
120
97
  const installed2 = JSON.parse(await readFile(join(temporaryRoot, "node_modules", BUDDY_RUNTIME_PACKAGE, "package.json"), "utf8"));
121
- if (installed2.version !== version) throw new Error(`\u7F13\u5B58\u7684 Runtime \u7248\u672C\u4E0E\u9009\u5B9A\u7684 ${version} \u4E0D\u4E00\u81F4`);
98
+ if (installed2.version !== version) throw new Error(`\u7F13\u5B58\u7684 Runtime \u7248\u672C\u4E0E\u8981\u6C42\u7684 ${version} \u4E0D\u4E00\u81F4`);
122
99
  options.signal?.throwIfAborted();
123
100
  try {
124
101
  await rename(temporaryRoot, destination);
@@ -132,8 +109,8 @@ async function cachedRuntimeRoot(version, options = {}) {
132
109
  }
133
110
 
134
111
  // packages/cli-core/src/init/model-selection.ts
135
- import { lstat as lstat7, readFile as readFile9 } from "node:fs/promises";
136
- import { join as join8 } from "node:path";
112
+ import { lstat as lstat7 } from "node:fs/promises";
113
+ import { join as join10 } from "node:path";
137
114
 
138
115
  // packages/cli-core/src/config/runtime-catalog.ts
139
116
  import { readFile as readFile2, realpath } from "node:fs/promises";
@@ -601,7 +578,7 @@ ${skillRoot ? `\u5B8C\u6574\u8BFB\u53D6 ${JSON.stringify(join4(skillRoot, "SKILL
601
578
  ## \u786E\u8BA4\u540E\u7EE7\u7EED
602
579
 
603
580
  \u5411\u5F00\u53D1\u8005\u5C55\u793A\u5B9E\u9645\u56FE\u7247\u548C\u4E0A\u9762\u7684\u5B8C\u6574\u8D44\u6599\uFF0C\u53D6\u5F97\u5F00\u53D1\u8005\u5BF9\u8FD9\u4EFD\u8D44\u6599\u548C\u8FD9\u5F20\u5934\u50CF\u7684\u660E\u786E\u786E\u8BA4\u3002\u53C2\u6570\u9F50\u5168\u6216\u751F\u6210\u5B8C\u6210\u4E0D\u80FD\u4EE3\u66FF\u786E\u8BA4\uFF1B\u6709\u4FEE\u6539\u5219\u91CD\u65B0\u5C55\u793A\u5E76\u786E\u8BA4\u3002\u672A\u786E\u8BA4\u4E0D\u4F20 --confirm-meta\uFF0C\u4E0D\u8C03\u7528 Meta \u5199\u63A5\u53E3\u3002
604
- \u786E\u8BA4\u540E\u8C03\u7528 buddy-cli-sit\uFF0C\u4F7F\u7528\u72EC\u7ACB argv\u3002direct \u6A21\u5F0F\u8FD8\u9700\u8FFD\u52A0 --runtime-version \u4E0E\u6B64\u524D\u786E\u8BA4\u7684\u51C6\u786E\u7248\u672C\uFF1B\u672A\u786E\u8BA4\u8FC7\u7248\u672C\u65F6\u5148\u6309 buddy-cli-sit guide \u8BE2\u95EE\uFF0C\u4E0D\u81EA\u884C\u9009\u62E9\uFF0C\u4E5F\u4E0D\u91CD\u65B0\u8BE2\u95EE\u5DF2\u786E\u8BA4\u7684\u9009\u62E9\uFF1A
581
+ \u786E\u8BA4\u540E\u8C03\u7528 buddy-cli-sit\uFF0C\u4F7F\u7528\u72EC\u7ACB argv\u3002direct \u6A21\u5F0F\u81EA\u52A8\u9501\u5B9A npm dev \u6700\u65B0 Runtime\uFF0C\u65E0\u9700\u9009\u62E9 Runtime \u7248\u672C\uFF1B\u65B0\u4E1A\u52A1\u5DE5\u5382\u4ECD\u987B\u6309 guide \u5148\u786E\u8BA4\u6A21\u578B\uFF0C\u518D\u8FFD\u52A0 --model \u4E0E\u5DF2\u786E\u8BA4\u7684\u6A21\u578B ID\uFF1A
605
582
 
606
583
  \`\`\`json
607
584
  ${JSON.stringify(argv, null, 2)}
@@ -1284,8 +1261,8 @@ async function latestRuntimeTemplate(template, options) {
1284
1261
  let temporaryRoot;
1285
1262
  try {
1286
1263
  options.signal?.throwIfAborted();
1287
- options.report(options.runtimeVersion ? `\u6B63\u5728\u786E\u8BA4 Runtime ${options.runtimeVersion}\u2026` : "\u6B63\u5728\u67E5\u8BE2\u516C\u5171 npm \u7684\u6700\u65B0 Runtime\u2026");
1288
- const version = options.runtimeVersion ? await resolveRuntimeVersion(options.runtimeVersion, options) : await latestRuntimeVersion(options);
1264
+ options.report("\u6B63\u5728\u67E5\u8BE2\u516C\u5171 npm dev \u7684\u6700\u65B0 Runtime\u2026");
1265
+ const version = await latestRuntimeVersion(options);
1289
1266
  let result = template;
1290
1267
  if (version !== bundledVersion) {
1291
1268
  temporaryRoot = await mkdtemp3(join7(tmpdir(), "buddy-runtime-template-"));
@@ -1324,12 +1301,12 @@ async function latestRuntimeTemplate(template, options) {
1324
1301
  throw new Error("\u751F\u6210\u7684 Runtime \u7248\u672C\u4E0E\u4F9D\u8D56\u9501\u6587\u4EF6\u4E0D\u4E00\u81F4");
1325
1302
  }
1326
1303
  options.signal?.throwIfAborted();
1327
- options.report(`\u5DF2\u4ECE\u516C\u5171 npm ${options.runtimeVersion ?? "latest"} \u9501\u5B9A Runtime ${version}\uFF08package.json \u4E0E package-lock.json\uFF09\u3002`);
1304
+ options.report(`\u5DF2\u4ECE\u516C\u5171 npm dev \u9501\u5B9A Runtime ${version}\uFF08package.json \u4E0E package-lock.json\uFF09\u3002`);
1328
1305
  return result;
1329
1306
  } catch (cause) {
1330
- if (options.signal?.aborted) throw new Error("Runtime \u7248\u672C\u9009\u62E9\u5DF2\u53D6\u6D88");
1307
+ if (options.signal?.aborted) throw new Error("Runtime \u7248\u672C\u67E5\u8BE2\u5DF2\u53D6\u6D88");
1331
1308
  const reason = cause instanceof Error && !cause.message.includes("Command failed") ? cause.message : "npm \u672A\u5B8C\u6210\u9501\u6587\u4EF6\u751F\u6210";
1332
- throw new Error(`\u672A\u80FD\u9501\u5B9A${options.runtimeVersion ? "\u9009\u5B9A" : "\u6700\u65B0"} Runtime\uFF1A${reason}\u3002\u5DF2\u505C\u6B62\u751F\u6210\u5DE5\u7A0B\u4F9D\u8D56\uFF0C\u8BF7\u4FEE\u590D\u540E\u91CD\u8BD5\uFF1B\u4E0D\u4F1A\u56DE\u9000\u5230\u5185\u7F6E\u65E7\u7248\u672C\u3002`, { cause });
1309
+ throw new Error(`\u672A\u80FD\u9501\u5B9A\u6700\u65B0 dev Runtime\uFF1A${reason}\u3002\u5DF2\u505C\u6B62\u751F\u6210\u5DE5\u7A0B\u4F9D\u8D56\uFF0C\u8BF7\u4FEE\u590D\u540E\u91CD\u8BD5\uFF1B\u4E0D\u4F1A\u56DE\u9000\u5230\u5185\u7F6E\u65E7\u7248\u672C\u3002`, { cause });
1333
1310
  } finally {
1334
1311
  if (temporaryRoot) await rm3(temporaryRoot, { recursive: true, force: true });
1335
1312
  }
@@ -1524,87 +1501,52 @@ async function scaffoldPlatformAgent(projectRoot, name, options = {}) {
1524
1501
  }
1525
1502
  }
1526
1503
 
1527
- // packages/cli-core/src/init/model-selection.ts
1528
- var ModelSelectionError = class extends Error {
1529
- };
1530
- async function selectInitModel(root, requested, io, options = {}) {
1531
- try {
1532
- try {
1533
- const factory = await lstat7(join8(root, BUDDY_PLATFORM_FACTORY_ENTRY));
1534
- if (!factory.isFile()) throw new ModelSelectionError(`${BUDDY_PLATFORM_FACTORY_ENTRY} \u5FC5\u987B\u662F\u666E\u901A\u6587\u4EF6`);
1535
- if (requested !== void 0) throw new ModelSelectionError(`\u5DF2\u6709 ${BUDDY_PLATFORM_FACTORY_ENTRY}\uFF0Cinit \u4FDD\u7559\u539F\u6A21\u578B\uFF1B\u5982\u9700\u5207\u6362\uFF0C\u8BF7\u5148\u786E\u8BA4\u5E76\u4FEE\u6539\u4E1A\u52A1\u5DE5\u5382\u7684 initialState.model\uFF0C\u4E0D\u8981\u4F20 --model\u3002`);
1536
- return void 0;
1537
- } catch (cause) {
1538
- if (cause.code !== "ENOENT") throw cause;
1539
- }
1540
- let pkg;
1541
- try {
1542
- pkg = JSON.parse(await readFile9(join8(root, "package.json"), "utf8"));
1543
- } catch (cause) {
1544
- if (cause.code !== "ENOENT") throw cause;
1545
- }
1546
- const existing = runtimeDependencyVersion(pkg);
1547
- if (pkg?.dependencies?.[BUDDY_RUNTIME_PACKAGE] !== void 0 && !existing) {
1548
- throw new ModelSelectionError("\u5DF2\u6709\u5DE5\u7A0B\u5FC5\u987B\u5148\u56FA\u5B9A Runtime \u7684\u51C6\u786E\u7248\u672C\uFF0C\u624D\u80FD\u9009\u62E9\u6A21\u578B\u3002");
1549
- }
1550
- const version = existing ?? options.runtimeVersion;
1551
- if (!version) throw new ModelSelectionError("\u8BF7\u5148\u9009\u62E9 Runtime \u7248\u672C\uFF0C\u518D\u786E\u8BA4\u6A21\u578B\u3002");
1552
- const selected = await resolveRuntimeVersion(version, options);
1553
- const catalogRoot = await (options.runtimeRoot?.(selected) ?? cachedRuntimeRoot(selected, options));
1554
- const catalog = await readRuntimeModelCatalog(catalogRoot);
1555
- let model = requested;
1556
- if (model === void 0) {
1557
- if (!io.canPrompt) {
1558
- throw new ModelSelectionError(`\u8BF7\u5148\u8BE2\u95EE\u5F00\u53D1\u8005\u9009\u62E9\u6A21\u578B\uFF0C\u518D\u7528 --model <\u6A21\u578B ID> \u7EE7\u7EED\uFF1B\u4E0D\u80FD\u7531 Coding Agent \u81EA\u52A8\u4EE3\u9009\u3002Runtime ${catalog.runtimeVersion} \u53EF\u9009\uFF1A${catalog.models.join("\u3001")}\u3002`);
1559
- }
1560
- model = await io.select(`\u8FD9\u4E2A\u642D\u5B50\u4F7F\u7528\u54EA\u4E2A\u6A21\u578B\uFF1F\uFF08Runtime ${catalog.runtimeVersion}\uFF09`, catalog.models.map((value) => ({ value, label: value })));
1561
- }
1562
- if (!catalog.models.includes(model)) {
1563
- throw new ModelSelectionError(`Runtime ${catalog.runtimeVersion} \u4E0D\u652F\u6301\u6A21\u578B ${model}\uFF1B\u53EF\u9009\uFF1A${catalog.models.join("\u3001")}\u3002`);
1564
- }
1565
- return { model, runtimeVersion: catalog.runtimeVersion };
1566
- } catch (cause) {
1567
- if (cause instanceof ModelSelectionError || cause instanceof Error && cause.name === "PromptCancelledError") throw cause;
1568
- throw new ModelSelectionError(`\u65E0\u6CD5\u786E\u8BA4\u6A21\u578B\uFF1A${cause instanceof Error ? cause.message : String(cause)}\u3002\u8BF7\u4FEE\u590D\u540E\u91CD\u8BD5\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u9009\u62E9\u9ED8\u8BA4\u6A21\u578B\u3002`);
1569
- }
1570
- }
1571
- function checkModelTemplate(template, selection) {
1572
- if (selection && runtimeDependencyVersion(JSON.parse(template.packageJson)) !== selection.runtimeVersion) {
1573
- throw new ModelSelectionError("Runtime \u7248\u672C\u5728\u9009\u62E9\u6A21\u578B\u540E\u53D1\u751F\u53D8\u5316\uFF0C\u8BF7\u91CD\u65B0\u8FD0\u884C init \u786E\u8BA4\u8BE5\u7248\u672C\u7684\u6A21\u578B\u3002");
1574
- }
1575
- return template;
1576
- }
1504
+ // packages/cli-core/src/init/runtime-version.ts
1505
+ import { readFile as readFile11 } from "node:fs/promises";
1506
+ import { join as join9 } from "node:path";
1507
+
1508
+ // packages/cli-core/src/config/runtime-policy.ts
1509
+ import { readFile as readFile10, realpath as realpath3 } from "node:fs/promises";
1510
+ import { createRequire as createRequire2 } from "node:module";
1511
+ import { resolve as resolve5 } from "node:path";
1577
1512
 
1578
1513
  // packages/cli-core/src/config/runtime-update.ts
1579
- import { readFile as readFile10 } from "node:fs/promises";
1580
- import { join as join9 } from "node:path";
1514
+ import { readFile as readFile9 } from "node:fs/promises";
1515
+ import { join as join8 } from "node:path";
1581
1516
  async function projectRuntimeVersion(root) {
1582
1517
  try {
1583
- return runtimeDependencyVersion(JSON.parse(await readFile10(join9(root, "package.json"), "utf8")));
1518
+ return runtimeDependencyVersion(JSON.parse(await readFile9(join8(root, "package.json"), "utf8")));
1584
1519
  } catch (cause) {
1585
1520
  if (cause.code === "ENOENT") return void 0;
1586
1521
  throw cause;
1587
1522
  }
1588
1523
  }
1589
- async function runtimeVersionStatus(project, latest, selected = false) {
1590
- const current = project ? await projectRuntimeVersion(project) : void 0;
1591
- if (selected) return {
1592
- projectRuntimeVersion: current ?? null,
1593
- latestRuntimeVersion: null,
1594
- selectedRuntimeVersion: latest,
1595
- versionStatus: !project ? "no_project" : current === latest ? "selected" : "unconfigured",
1596
- adaptationRequired: !!project && current !== latest
1524
+ function compareVersions(left, right) {
1525
+ const parts = (value) => {
1526
+ const [core, ...suffix] = value.split("-");
1527
+ return { core: core.split(".").map(BigInt), pre: suffix.length ? suffix.join("-").split(".") : [] };
1597
1528
  };
1529
+ const a = parts(left), b = parts(right);
1530
+ for (let i = 0; i < 3; i++) if (a.core[i] !== b.core[i]) return a.core[i] < b.core[i] ? -1 : 1;
1531
+ if (!a.pre.length || !b.pre.length) return a.pre.length === b.pre.length ? 0 : a.pre.length ? -1 : 1;
1532
+ for (let i = 0; i < Math.max(a.pre.length, b.pre.length); i++) {
1533
+ const x = a.pre[i], y = b.pre[i];
1534
+ if (x === y) continue;
1535
+ if (x === void 0 || y === void 0) return x === void 0 ? -1 : 1;
1536
+ const nx = /^\d+$/.test(x), ny = /^\d+$/.test(y);
1537
+ if (nx && ny) return BigInt(x) < BigInt(y) ? -1 : 1;
1538
+ if (nx !== ny) return nx ? -1 : 1;
1539
+ return x < y ? -1 : 1;
1540
+ }
1541
+ return 0;
1542
+ }
1543
+ async function runtimeVersionStatus(project, latest) {
1544
+ const current = project ? await projectRuntimeVersion(project) : void 0;
1598
1545
  let versionStatus;
1599
1546
  if (!project) versionStatus = "no_project";
1600
1547
  else if (!current) versionStatus = "unconfigured";
1601
1548
  else if (current === latest) versionStatus = "current";
1602
- else {
1603
- const installed2 = current.split("-")[0].split(".").map(Number);
1604
- const published = latest.split(".").map(Number);
1605
- const different = installed2.findIndex((part, index) => part !== published[index]);
1606
- versionStatus = different < 0 || installed2[different] < published[different] ? "update_available" : "project_ahead";
1607
- }
1549
+ else versionStatus = compareVersions(current, latest) < 0 ? "update_available" : "project_ahead";
1608
1550
  return {
1609
1551
  projectRuntimeVersion: current ?? null,
1610
1552
  latestRuntimeVersion: latest,
@@ -1614,11 +1556,7 @@ async function runtimeVersionStatus(project, latest, selected = false) {
1614
1556
  }
1615
1557
  function reportRuntimeVersion(status, report) {
1616
1558
  if (status.versionStatus === "no_project") return;
1617
- if (status.selectedRuntimeVersion !== void 0) {
1618
- report(status.versionStatus === "selected" ? `Runtime \u7248\u672C\uFF1A\u5DE5\u7A0B ${status.projectRuntimeVersion}\uFF0C\u6CBF\u7528\u5DE5\u7A0B\u9009\u5B9A\u7248\u672C\uFF1B\u4E0D\u4F1A\u81EA\u52A8\u5207\u6362\u5230 latest \u6216\u65B0\u7684\u6D4B\u8BD5\u7248\u3002` : `Runtime \u76EE\u5F55\u4F7F\u7528\u9009\u5B9A\u7248\u672C ${status.selectedRuntimeVersion}\uFF1B\u5DE5\u7A0B\u5C1A\u672A\u56FA\u5B9A\u51C6\u786E\u7248\u672C\uFF0C\u751F\u6210\u6216\u5B89\u88C5\u4F9D\u8D56\u540E\u518D\u542F\u52A8 DEV\u3002`);
1619
- return;
1620
- }
1621
- report(`Runtime \u7248\u672C\uFF1A\u5DE5\u7A0B ${status.projectRuntimeVersion ?? "\u672A\u9501\u5B9A\u51C6\u786E\u7248\u672C"}\uFF0Cnpm \u6700\u65B0 ${status.latestRuntimeVersion}\u3002`);
1559
+ report(`Runtime \u7248\u672C\uFF1A\u5DE5\u7A0B ${status.projectRuntimeVersion ?? "\u672A\u9501\u5B9A\u51C6\u786E\u7248\u672C"}\uFF0Cnpm dev \u6700\u65B0 ${status.latestRuntimeVersion}\u3002`);
1622
1560
  if (status.adaptationRequired) {
1623
1561
  report("\u8BF7\u7531\u4F60\u6216\u5F00\u53D1 Agent \u66F4\u65B0\u4F9D\u8D56\u5E76\u9002\u914D\uFF1A\u68C0\u67E5\u65B0\u7248 Runtime \u7684\u542F\u52A8\u53C2\u6570\u3001\u6A21\u578B\u3001datasets\u3001\u5DE5\u5177\u53CA Hook\uFF0C\u5B8C\u6210\u9002\u914D\u540E\u9A8C\u8BC1 DEV\u3002CLI \u672A\u4FEE\u6539\u5DE5\u7A0B\u4F9D\u8D56\u6216\u914D\u7F6E\uFF1BDEV \u542F\u52A8\u3001\u81EA\u52A8\u91CD\u8F7D\u548C push \u5FC5\u987B\u901A\u8FC7\u6700\u65B0 Runtime \u68C0\u67E5\u3002");
1624
1562
  report(`\u5728\u5DE5\u7A0B\u6839\u76EE\u5F55\u6267\u884C\uFF1Anpm install --save-exact ${BUDDY_RUNTIME_PACKAGE}@${status.latestRuntimeVersion} --registry=${RUNTIME_REGISTRY} --@my-life-buddies:registry=${RUNTIME_REGISTRY}`);
@@ -1627,61 +1565,134 @@ function reportRuntimeVersion(status, report) {
1627
1565
  async function checkRuntimeUpdate(root, report, options = {}) {
1628
1566
  options.signal?.throwIfAborted();
1629
1567
  try {
1630
- const current = await projectRuntimeVersion(root);
1631
- if (!current) {
1632
- report("\u5DE5\u7A0B\u5C1A\u672A\u56FA\u5B9A Runtime \u51C6\u786E\u7248\u672C\uFF1B\u751F\u6210 Runtime \u5DE5\u7A0B\u524D\u8BF7\u5148\u9009\u62E9\u7248\u672C\u3002\u5DF2\u6709\u5DE5\u7A0B\u8BF7\u4FEE\u6B63\u4F9D\u8D56\u58F0\u660E\u5E76\u5B89\u88C5\u3002");
1633
- return;
1634
- }
1635
- const selected = await resolveRuntimeVersion(current, options);
1636
- reportRuntimeVersion(await runtimeVersionStatus(root, selected, true), report);
1568
+ const latest = await latestRuntimeVersion(options);
1569
+ reportRuntimeVersion(await runtimeVersionStatus(root, latest), report);
1637
1570
  options.signal?.throwIfAborted();
1638
1571
  return;
1639
1572
  } catch (cause) {
1640
1573
  options.signal?.throwIfAborted();
1641
- report(`\u65E0\u6CD5\u68C0\u67E5 Runtime \u66F4\u65B0\uFF1A${cause instanceof Error ? cause.message : String(cause)}\u3002\u672C\u6B21\u672A\u786E\u8BA4\u9009\u5B9A\u7248\u672C\u662F\u5426\u53EF\u7528\uFF1B\u53EF\u7EE7\u7EED\u67E5\u770B\u6216\u4FEE\u6539\u5DE5\u7A0B\uFF0CDEV \u542F\u52A8\u548C push \u4F1A\u53E6\u884C\u4E25\u683C\u68C0\u67E5\u3002`);
1574
+ report(`\u65E0\u6CD5\u68C0\u67E5 Runtime \u66F4\u65B0\uFF1A${cause instanceof Error ? cause.message : String(cause)}\u3002\u672C\u6B21\u672A\u786E\u8BA4 npm dev \u6700\u65B0\u7248\u672C\uFF1B\u53EF\u7EE7\u7EED\u67E5\u770B\u6216\u4FEE\u6539\u5DE5\u7A0B\uFF0CDEV \u542F\u52A8\u548C push \u4F1A\u53E6\u884C\u4E25\u683C\u68C0\u67E5\u3002`);
1642
1575
  }
1643
1576
  }
1644
1577
 
1645
- // packages/cli-core/src/init/runtime-selection.ts
1646
- import { readFile as readFile11 } from "node:fs/promises";
1647
- import { join as join10 } from "node:path";
1648
- var RuntimeSelectionError = class extends Error {
1578
+ // packages/cli-core/src/config/runtime-policy.ts
1579
+ var RuntimeRequirementError = class extends Error {
1580
+ constructor(code2, message, options) {
1581
+ super(message, options);
1582
+ this.code = code2;
1583
+ this.name = "RuntimeRequirementError";
1584
+ }
1585
+ code;
1649
1586
  };
1650
- async function selectInitRuntime(root, requested, io, options = {}) {
1587
+ function assertRequiredRuntime(actual, expected) {
1588
+ if (actual === expected) return;
1589
+ throw new RuntimeRequirementError(
1590
+ "RUNTIME_VERSION_MISMATCH",
1591
+ `\u5DF2\u963B\u6B62\u8FD0\u884C\u6216\u4E0A\u4F20\uFF1A\u5DE5\u7A0B Runtime ${actual ?? "\u672A\u9501\u5B9A\u51C6\u786E\u7248\u672C"}\uFF0Cnpm dev \u6700\u65B0\u7248\u672C ${expected}\u3002\u5FC5\u987B\u4F7F\u7528\u5B8C\u5168\u4E00\u81F4\u7684\u7248\u672C\u3002
1592
+ \u8BF7\u7531\u4F60\u6216\u5F00\u53D1 Agent \u66F4\u65B0\u4F9D\u8D56\u548C\u9501\u6587\u4EF6\uFF0C\u9002\u914D\u542F\u52A8\u53C2\u6570\u3001\u6A21\u578B\u3001datasets\u3001\u5DE5\u5177\u53CA Hook \u540E\u91CD\u8BD5\u3002
1593
+ npm install --save-exact ${BUDDY_RUNTIME_PACKAGE}@${expected} --registry=${RUNTIME_REGISTRY} --@my-life-buddies:registry=${RUNTIME_REGISTRY}`
1594
+ );
1595
+ }
1596
+ function assertNpmRuntimeLock(contents, expected) {
1597
+ const lock = JSON.parse(contents);
1598
+ const installed2 = lock.lockfileVersion === 1 ? lock.dependencies?.[BUDDY_RUNTIME_PACKAGE] : lock.packages?.[`node_modules/${BUDDY_RUNTIME_PACKAGE}`];
1599
+ if (installed2?.version !== expected || lock.lockfileVersion !== 1 && runtimeDependencyVersion(lock.packages?.[""]) !== expected) {
1600
+ throw new RuntimeRequirementError("RUNTIME_DEPENDENCY_INVALID", `package-lock.json \u7684 Runtime \u4E0E\u8981\u6C42\u7684 ${expected} \u4E0D\u4E00\u81F4\u3002\u8BF7\u66F4\u65B0\u9501\u6587\u4EF6\u5E76\u91CD\u65B0\u5B89\u88C5\u4F9D\u8D56\u540E\u91CD\u8BD5\u3002`);
1601
+ }
1602
+ }
1603
+ async function requireProjectRuntime(root, options = {}) {
1604
+ const declared = await projectRuntimeVersion(root);
1605
+ if (!declared) throw new RuntimeRequirementError("RUNTIME_DEPENDENCY_INVALID", "\u5DE5\u7A0B\u5FC5\u987B\u5728 package.json \u58F0\u660E npm dev \u6700\u65B0 Runtime \u7684\u51C6\u786E\u7248\u672C\uFF0C\u5E76\u5B89\u88C5\u4F9D\u8D56\u548C\u9501\u6587\u4EF6\uFF1B\u4E0D\u80FD\u4F7F\u7528 dev\u3001latest \u6216\u7248\u672C\u8303\u56F4\u4F5C\u4E3A\u5DE5\u7A0B\u4F9D\u8D56\u3002");
1606
+ let expected;
1607
+ try {
1608
+ expected = await latestRuntimeVersion(options);
1609
+ } catch (cause) {
1610
+ options.signal?.throwIfAborted();
1611
+ throw new RuntimeRequirementError("RUNTIME_CHECK_FAILED", `\u65E0\u6CD5\u786E\u8BA4 npm dev \u6700\u65B0 Runtime\uFF0C\u5DF2\u963B\u6B62\u8FD0\u884C\u6216\u4E0A\u4F20\uFF1A${cause instanceof Error ? cause.message : String(cause)}\u3002\u8BF7\u6062\u590D\u8FDE\u63A5\u540E\u91CD\u8BD5\u3002`, { cause });
1612
+ }
1613
+ try {
1614
+ assertRequiredRuntime(await projectRuntimeVersion(root), expected);
1615
+ const installedPath = await realpath3(resolve5(root, "node_modules", BUDDY_RUNTIME_PACKAGE, "package.json"));
1616
+ const fromProject = createRequire2(resolve5(root, "package.json")).resolve(`${BUDDY_RUNTIME_PACKAGE}/package.json`);
1617
+ if (await realpath3(fromProject) !== installedPath) throw new Error("Runtime \u5FC5\u987B\u5B89\u88C5\u5728\u5F53\u524D\u5DE5\u7A0B\u4E2D");
1618
+ const installed2 = JSON.parse(await readFile10(installedPath, "utf8"));
1619
+ if (installed2.version !== expected) throw new Error(`Runtime \u5B9E\u9645\u5B89\u88C5 ${installed2.version}\uFF0C\u8981\u6C42 ${expected}`);
1620
+ let lock;
1621
+ try {
1622
+ lock = await readFile10(resolve5(root, "package-lock.json"), "utf8");
1623
+ } catch (cause) {
1624
+ if (cause.code !== "ENOENT") throw cause;
1625
+ }
1626
+ if (lock !== void 0) assertNpmRuntimeLock(lock, expected);
1627
+ options.signal?.throwIfAborted();
1628
+ return expected;
1629
+ } catch (cause) {
1630
+ options.signal?.throwIfAborted();
1631
+ if (cause instanceof RuntimeRequirementError) throw cause;
1632
+ throw new RuntimeRequirementError("RUNTIME_DEPENDENCY_INVALID", `Runtime \u4F9D\u8D56\u6821\u9A8C\u5931\u8D25\uFF1A${cause instanceof Error ? cause.message : String(cause)}\u3002\u8BF7\u66F4\u65B0\u4F9D\u8D56\u53CA\u9501\u6587\u4EF6\u5E76\u5B89\u88C5\uFF1Bnpm \u5DE5\u7A0B\u53EF\u8FD0\u884C npm ci\u3002`, { cause });
1633
+ }
1634
+ }
1635
+
1636
+ // packages/cli-core/src/init/runtime-version.ts
1637
+ async function resolveInitRuntime(root, options = {}) {
1638
+ let latest;
1639
+ try {
1640
+ latest = await latestRuntimeVersion(options);
1641
+ } catch (cause) {
1642
+ options.signal?.throwIfAborted();
1643
+ throw new RuntimeRequirementError("RUNTIME_CHECK_FAILED", `\u65E0\u6CD5\u786E\u8BA4 npm dev \u6700\u65B0 Runtime\uFF1A${cause instanceof Error ? cause.message : String(cause)}\u3002\u8BF7\u4FEE\u590D\u540E\u91CD\u8BD5\uFF0C\u4E0D\u4F1A\u56DE\u9000\u5230\u65E7\u7248\u672C\u3002`, { cause });
1644
+ }
1651
1645
  let pkg;
1652
1646
  try {
1653
- pkg = JSON.parse(await readFile11(join10(root, "package.json"), "utf8"));
1647
+ pkg = JSON.parse(await readFile11(join9(root, "package.json"), "utf8"));
1654
1648
  } catch (cause) {
1655
1649
  if (cause.code !== "ENOENT") throw cause;
1656
1650
  }
1657
- const existing = runtimeDependencyVersion(pkg);
1658
1651
  if (pkg?.dependencies?.[BUDDY_RUNTIME_PACKAGE] !== void 0) {
1659
- if (!existing) throw new RuntimeSelectionError("\u5DF2\u6709\u5DE5\u7A0B\u7684 Runtime \u672A\u56FA\u5B9A\u51C6\u786E\u7248\u672C\uFF0C\u8BF7\u5148\u7528 npm install --save-exact \u5B89\u88C5\u9009\u5B9A\u7248\u672C\u5E76\u66F4\u65B0\u9501\u6587\u4EF6\u3002");
1660
- if (requested !== void 0 && requested !== existing) throw new RuntimeSelectionError(`\u5DE5\u7A0B\u5DF2\u56FA\u5B9A Runtime ${existing}\uFF1Binit \u4E0D\u5207\u6362\u5DF2\u6709\u4F9D\u8D56\u3002\u5207\u6362\u7248\u672C\u8BF7\u5148\u5411\u5F00\u53D1\u8005\u786E\u8BA4\uFF0C\u518D\u7528 npm install --save-exact \u5B89\u88C5\u51C6\u786E\u7248\u672C\u5E76\u5B8C\u6210\u9002\u914D\u3002`);
1661
- return existing;
1652
+ assertRequiredRuntime(runtimeDependencyVersion(pkg), latest);
1662
1653
  }
1654
+ return latest;
1655
+ }
1656
+
1657
+ // packages/cli-core/src/init/model-selection.ts
1658
+ var ModelSelectionError = class extends Error {
1659
+ };
1660
+ async function selectInitModel(root, requested, io, options = {}) {
1663
1661
  try {
1664
- let selector = requested;
1665
- if (!selector) {
1666
- if (!io.canPrompt) throw new RuntimeSelectionError(await runtimeSelectionPrompt(options));
1667
- const releases = await runtimeReleaseChoices(options);
1668
- selector = await io.select("\u8FD9\u4E2A\u642D\u5B50\u4F7F\u7528\u54EA\u4E2A Runtime \u7248\u672C\uFF1F", [
1669
- { value: releases.latest, label: `\u6700\u65B0\u7A33\u5B9A\u7248 ${releases.latest}\uFF08\u63A8\u8350\uFF09` },
1670
- ...releases.dev ? [{ value: releases.dev, label: `\u6700\u65B0\u6D4B\u8BD5\u7248 ${releases.dev}` }] : [],
1671
- { value: "other", label: "\u6307\u5B9A\u5176\u4ED6\u5DF2\u53D1\u5E03\u7248\u672C" }
1672
- ]);
1673
- if (selector === "other") {
1674
- io.write(`\u53EF\u7528\u7248\u672C\uFF1A${releases.versions.join("\u3001")}`);
1675
- selector = (await io.input("\u8F93\u5165 Runtime \u7684\u51C6\u786E\u7248\u672C")).trim();
1662
+ try {
1663
+ const factory = await lstat7(join10(root, BUDDY_PLATFORM_FACTORY_ENTRY));
1664
+ if (!factory.isFile()) throw new ModelSelectionError(`${BUDDY_PLATFORM_FACTORY_ENTRY} \u5FC5\u987B\u662F\u666E\u901A\u6587\u4EF6`);
1665
+ if (requested !== void 0) throw new ModelSelectionError(`\u5DF2\u6709 ${BUDDY_PLATFORM_FACTORY_ENTRY}\uFF0Cinit \u4FDD\u7559\u539F\u6A21\u578B\uFF1B\u5982\u9700\u5207\u6362\uFF0C\u8BF7\u5148\u786E\u8BA4\u5E76\u4FEE\u6539\u4E1A\u52A1\u5DE5\u5382\u7684 initialState.model\uFF0C\u4E0D\u8981\u4F20 --model\u3002`);
1666
+ return void 0;
1667
+ } catch (cause) {
1668
+ if (cause.code !== "ENOENT") throw cause;
1669
+ }
1670
+ const selected = options.expectedRuntimeVersion ?? await resolveInitRuntime(root, options);
1671
+ const catalogRoot = await (options.runtimeRoot?.(selected) ?? cachedRuntimeRoot(selected, options));
1672
+ const catalog = await readRuntimeModelCatalog(catalogRoot);
1673
+ if (catalog.runtimeVersion !== selected) throw new ModelSelectionError("\u6A21\u578B\u76EE\u5F55\u4E0E npm dev \u7684\u6700\u65B0 Runtime \u4E0D\u4E00\u81F4");
1674
+ let model = requested;
1675
+ if (model === void 0) {
1676
+ if (!io.canPrompt) {
1677
+ throw new ModelSelectionError(`\u8BF7\u5148\u8BE2\u95EE\u5F00\u53D1\u8005\u9009\u62E9\u6A21\u578B\uFF0C\u518D\u7528 --model <\u6A21\u578B ID> \u7EE7\u7EED\uFF1B\u4E0D\u80FD\u7531 Coding Agent \u81EA\u52A8\u4EE3\u9009\u3002Runtime ${catalog.runtimeVersion} \u53EF\u9009\uFF1A${catalog.models.join("\u3001")}\u3002`);
1676
1678
  }
1679
+ model = await io.select(`\u8FD9\u4E2A\u642D\u5B50\u4F7F\u7528\u54EA\u4E2A\u6A21\u578B\uFF1F\uFF08Runtime ${catalog.runtimeVersion}\uFF09`, catalog.models.map((value) => ({ value, label: value })));
1680
+ }
1681
+ if (!catalog.models.includes(model)) {
1682
+ throw new ModelSelectionError(`Runtime ${catalog.runtimeVersion} \u4E0D\u652F\u6301\u6A21\u578B ${model}\uFF1B\u53EF\u9009\uFF1A${catalog.models.join("\u3001")}\u3002`);
1677
1683
  }
1678
- return await resolveRuntimeVersion(selector, options);
1684
+ return { model, runtimeVersion: catalog.runtimeVersion };
1679
1685
  } catch (cause) {
1680
- options.signal?.throwIfAborted();
1681
- if (cause instanceof RuntimeSelectionError || cause instanceof Error && cause.name === "PromptCancelledError") throw cause;
1682
- throw new RuntimeSelectionError(`\u65E0\u6CD5\u9009\u62E9 Runtime\uFF1A${cause instanceof Error ? cause.message : String(cause)}\u3002\u8BF7\u4FEE\u590D\u540E\u91CD\u8BD5\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u9009\u62E9\u5176\u4ED6\u7248\u672C\u3002`);
1686
+ if (cause instanceof ModelSelectionError || cause instanceof Error && cause.name === "PromptCancelledError") throw cause;
1687
+ throw new ModelSelectionError(`\u65E0\u6CD5\u786E\u8BA4\u6A21\u578B\uFF1A${cause instanceof Error ? cause.message : String(cause)}\u3002\u8BF7\u4FEE\u590D\u540E\u91CD\u8BD5\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u9009\u62E9\u9ED8\u8BA4\u6A21\u578B\u3002`);
1683
1688
  }
1684
1689
  }
1690
+ function checkModelTemplate(template, selection) {
1691
+ if (selection && runtimeDependencyVersion(JSON.parse(template.packageJson)) !== selection.runtimeVersion) {
1692
+ throw new ModelSelectionError("Runtime \u7248\u672C\u5728\u9009\u62E9\u6A21\u578B\u540E\u53D1\u751F\u53D8\u5316\uFF0C\u8BF7\u91CD\u65B0\u8FD0\u884C init \u786E\u8BA4\u8BE5\u7248\u672C\u7684\u6A21\u578B\u3002");
1693
+ }
1694
+ return template;
1695
+ }
1685
1696
 
1686
1697
  // packages/cli-core/src/platform-url.ts
1687
1698
  var DEFAULT_MLB_TEST_URL = "https://buddies.sit.dots.chat";
@@ -1897,11 +1908,11 @@ async function writeProjectEnvironment(projectRoot, values) {
1897
1908
  }
1898
1909
 
1899
1910
  // packages/cli-core/src/commands/models.ts
1900
- import { resolve as resolve6 } from "node:path";
1911
+ import { resolve as resolve7 } from "node:path";
1901
1912
 
1902
1913
  // packages/cli-core/src/project-context.ts
1903
- import { lstat as lstat8, realpath as realpath3, readFile as readFile12 } from "node:fs/promises";
1904
- import { dirname, join as join12, resolve as resolve5 } from "node:path";
1914
+ import { lstat as lstat8, realpath as realpath4, readFile as readFile12 } from "node:fs/promises";
1915
+ import { dirname, join as join12, resolve as resolve6 } from "node:path";
1905
1916
  var BuddyProjectContextError = class extends Error {
1906
1917
  constructor(code2, message, targetPath, options) {
1907
1918
  super(message, options);
@@ -1913,7 +1924,7 @@ var BuddyProjectContextError = class extends Error {
1913
1924
  targetPath;
1914
1925
  };
1915
1926
  async function existingDirectory(target) {
1916
- const requested = resolve5(target);
1927
+ const requested = resolve6(target);
1917
1928
  let entry2;
1918
1929
  try {
1919
1930
  entry2 = await lstat8(requested);
@@ -1935,7 +1946,7 @@ async function existingDirectory(target) {
1935
1946
  requested
1936
1947
  );
1937
1948
  }
1938
- return realpath3(requested);
1949
+ return realpath4(requested);
1939
1950
  }
1940
1951
  async function projectFileState(directory, filename) {
1941
1952
  const configPath = join12(directory, filename);
@@ -1975,7 +1986,7 @@ async function findBuddyProjectRoot(startDirectory) {
1975
1986
  return searchUp(await existingDirectory(startDirectory));
1976
1987
  }
1977
1988
  async function requireBuddyProjectRoot(startDirectory) {
1978
- const requested = resolve5(startDirectory);
1989
+ const requested = resolve6(startDirectory);
1979
1990
  const root = await findBuddyProjectRoot(requested);
1980
1991
  if (root !== void 0) return root;
1981
1992
  throw new BuddyProjectContextError(
@@ -2008,7 +2019,7 @@ async function requireBuddyAgentProjectRoot(startDirectory) {
2008
2019
  }
2009
2020
  }
2010
2021
  async function nearestExistingDirectory(target) {
2011
- let candidate = resolve5(target);
2022
+ let candidate = resolve6(target);
2012
2023
  while (true) {
2013
2024
  try {
2014
2025
  const entry2 = await lstat8(candidate);
@@ -2019,7 +2030,7 @@ async function nearestExistingDirectory(target) {
2019
2030
  candidate
2020
2031
  );
2021
2032
  }
2022
- return realpath3(candidate);
2033
+ return realpath4(candidate);
2023
2034
  } catch (cause) {
2024
2035
  if (cause.code !== "ENOENT") throw cause;
2025
2036
  const parent = dirname(candidate);
@@ -2029,7 +2040,7 @@ async function nearestExistingDirectory(target) {
2029
2040
  }
2030
2041
  }
2031
2042
  async function assertOutsideBuddyProject(target) {
2032
- const requested = resolve5(target);
2043
+ const requested = resolve6(target);
2033
2044
  const container = await nearestExistingDirectory(requested);
2034
2045
  const projectRoot = await searchUp(container);
2035
2046
  if (projectRoot === void 0) return;
@@ -2043,13 +2054,13 @@ async function assertOutsideBuddyProject(target) {
2043
2054
  );
2044
2055
  }
2045
2056
  async function assertInitializableBuddyTarget(target) {
2046
- const requested = resolve5(target);
2057
+ const requested = resolve6(target);
2047
2058
  const container = await nearestExistingDirectory(requested);
2048
2059
  const projectRoot = await searchUp(container);
2049
2060
  if (projectRoot === void 0) return;
2050
2061
  let requestedRoot = requested;
2051
2062
  try {
2052
- requestedRoot = await realpath3(requested);
2063
+ requestedRoot = await realpath4(requested);
2053
2064
  } catch (cause) {
2054
2065
  if (cause.code !== "ENOENT") throw cause;
2055
2066
  }
@@ -2079,43 +2090,38 @@ async function assertInitializableBuddyTarget(target) {
2079
2090
  // packages/cli-core/src/commands/runtime-source.ts
2080
2091
  async function runtimeCatalogSource(directory, options = {}) {
2081
2092
  const project = await findBuddyProjectRoot(directory);
2082
- const declared = project ? await projectRuntimeVersion(project) : void 0;
2083
- if (declared && options.runtimeVersion !== void 0 && options.runtimeVersion !== declared) {
2084
- throw new Error(`\u5DE5\u7A0B\u56FA\u5B9A Runtime ${declared}\uFF0C\u76EE\u5F55\u5FC5\u987B\u4E0E\u8BE5\u7248\u672C\u4E00\u81F4\uFF1B\u5148\u786E\u8BA4\u5E76\u66F4\u65B0\u5DE5\u7A0B\u4F9D\u8D56\u540E\u518D\u67E5\u8BE2\u3002`);
2085
- }
2086
- const requested = declared ?? options.runtimeVersion;
2087
- if (!requested) throw new Error(await runtimeSelectionPrompt(options));
2088
- const selected = await resolveRuntimeVersion(requested, options);
2089
- const root = await (options.runtimeRoot?.(selected) ?? cachedRuntimeRoot(selected, options));
2090
- const version = await runtimeVersionStatus(project, selected, true);
2093
+ const latest = await latestRuntimeVersion(options);
2094
+ const root = await (options.runtimeRoot?.(latest) ?? cachedRuntimeRoot(latest, options));
2095
+ if (await projectRuntimeVersion(root) !== latest) throw new Error("Runtime \u76EE\u5F55\u4E0E npm dev \u7684\u6700\u65B0\u7248\u672C\u4E0D\u4E00\u81F4");
2096
+ const version = await runtimeVersionStatus(project, latest);
2091
2097
  if (options.report) reportRuntimeVersion(version, options.report);
2092
2098
  return { root, source: "npm", version };
2093
2099
  }
2094
2100
 
2095
2101
  // packages/cli-core/src/commands/models.ts
2102
+ var MODELS_COMMAND_HELP = `\u7528\u6CD5: buddy-cli-sit models [--directory <\u9879\u76EE\u76EE\u5F55>] [--json]
2103
+ \u59CB\u7EC8\u8054\u7F51\u8BFB\u53D6 npm dev \u6700\u65B0 Runtime \u7684\u6A21\u578B\u76EE\u5F55\uFF1B\u4E0D\u652F\u6301\u9009\u62E9 Runtime \u7248\u672C\uFF0C\u4E0D\u4FEE\u6539\u5DE5\u7A0B\u4F9D\u8D56\u3002`;
2096
2104
  async function runModelsCommand(args, io, cwd, options = {}) {
2097
2105
  try {
2098
- const help = `\u7528\u6CD5: buddy-cli-sit models [--directory <\u9879\u76EE\u76EE\u5F55>] [--runtime-version <\u51C6\u786E\u7248\u672C|latest|dev>] [--json]
2099
- \u8BFB\u53D6\u5DE5\u7A0B\u56FA\u5B9A Runtime \u7684\u80FD\u529B\u76EE\u5F55\uFF1B\u5DE5\u7A0B\u5C1A\u672A\u751F\u6210\u65F6\uFF0C\u5148\u8BE2\u95EE\u5F00\u53D1\u8005\uFF0C\u518D\u7528 --runtime-version \u9009\u62E9\u7248\u672C\u3002\u4E0D\u4F1A\u81EA\u52A8\u5207\u6362\u5DE5\u7A0B\u4F9D\u8D56\u3002`;
2106
+ const help = MODELS_COMMAND_HELP;
2100
2107
  if (args.length === 1 && (args[0] === "--help" || args[0] === "-h")) {
2101
2108
  io.write(help);
2102
2109
  return { exitCode: 0 };
2103
2110
  }
2104
2111
  let directory;
2105
2112
  let json2 = false;
2106
- let runtimeVersion;
2107
2113
  for (let i = 0; i < args.length; i++) {
2108
2114
  if (args[i] === "--json" && !json2) json2 = true;
2109
2115
  else if (args[i] === "--directory" && directory === void 0 && args[i + 1]?.trim() && !args[i + 1].startsWith("--")) directory = args[++i];
2110
- else if (args[i] === "--runtime-version" && runtimeVersion === void 0 && args[i + 1]?.trim() && !args[i + 1].startsWith("--")) runtimeVersion = args[++i];
2116
+ else if (args[i] === "--runtime-version") throw new Error("SIT CLI \u4E0D\u652F\u6301 --runtime-version\uFF1B\u7EDF\u4E00\u4F7F\u7528 npm dev \u6700\u65B0 Runtime\u3002");
2111
2117
  else throw new Error(`models \u53C2\u6570\u65E0\u6548\uFF1A${args[i]}
2112
2118
  ${help}`);
2113
2119
  }
2114
- const { root, source, version } = await runtimeCatalogSource(resolve6(cwd, directory ?? "."), { report: (message) => io.writeError(message), ...options, runtimeVersion });
2120
+ const { root, source, version } = await runtimeCatalogSource(resolve7(cwd, directory ?? "."), { report: (message) => io.writeError(message), ...options });
2115
2121
  const catalog = await readRuntimeModelCatalog(root);
2116
2122
  if (json2) io.write(JSON.stringify({ source, ...catalog, ...version }, null, 2));
2117
2123
  else {
2118
- io.write(`npm \u9009\u5B9A Runtime ${catalog.runtimeVersion} \u63D0\u4F9B ${catalog.models.length} \u4E2A\u6A21\u578B\uFF1A`);
2124
+ io.write(`npm dev \u6700\u65B0 Runtime ${catalog.runtimeVersion} \u63D0\u4F9B ${catalog.models.length} \u4E2A\u6A21\u578B\uFF1A`);
2119
2125
  for (const id of catalog.models) io.write(`- ${id}`);
2120
2126
  io.write("\u5C06\u6240\u9009 ID \u5199\u5165 src/buddy-options.mjs \u7684 initialState.model\uFF1B\u81EA\u5B9A\u4E49\u4F1A\u8BDD\u5DE5\u5382\u4E5F\u53EF\u6309\u4F1A\u8BDD\u8BBE\u7F6E initialState.model\u3002");
2121
2127
  }
@@ -2130,30 +2136,30 @@ ${help}`);
2130
2136
  import { lstat as lstat15 } from "node:fs/promises";
2131
2137
 
2132
2138
  // packages/cli-core/src/commands/datasets.ts
2133
- import { resolve as resolve7 } from "node:path";
2139
+ import { resolve as resolve8 } from "node:path";
2140
+ var DATASETS_COMMAND_HELP = `\u7528\u6CD5: buddy-cli-sit datasets [--directory <\u9879\u76EE\u76EE\u5F55>] [--json]
2141
+ \u59CB\u7EC8\u8054\u7F51\u8BFB\u53D6 npm dev \u6700\u65B0 Runtime \u7684\u6570\u636E\u96C6\u76EE\u5F55\uFF1B\u4E0D\u652F\u6301\u9009\u62E9 Runtime \u7248\u672C\uFF0C\u4E0D\u4FEE\u6539\u5DE5\u7A0B\u4F9D\u8D56\u3002`;
2134
2142
  async function runDatasetsCommand(args, io, cwd, options = {}) {
2135
2143
  try {
2136
- const help = `\u7528\u6CD5: buddy-cli-sit datasets [--directory <\u9879\u76EE\u76EE\u5F55>] [--runtime-version <\u51C6\u786E\u7248\u672C|latest|dev>] [--json]
2137
- \u8BFB\u53D6\u5DE5\u7A0B\u56FA\u5B9A Runtime \u7684\u80FD\u529B\u76EE\u5F55\uFF1B\u5DE5\u7A0B\u5C1A\u672A\u751F\u6210\u65F6\uFF0C\u5148\u8BE2\u95EE\u5F00\u53D1\u8005\uFF0C\u518D\u7528 --runtime-version \u9009\u62E9\u7248\u672C\u3002\u4E0D\u4F1A\u81EA\u52A8\u5207\u6362\u5DE5\u7A0B\u4F9D\u8D56\u3002`;
2144
+ const help = DATASETS_COMMAND_HELP;
2138
2145
  if (args.length === 1 && (args[0] === "--help" || args[0] === "-h")) {
2139
2146
  io.write(help);
2140
2147
  return { exitCode: 0 };
2141
2148
  }
2142
2149
  let directory;
2143
2150
  let json2 = false;
2144
- let runtimeVersion;
2145
2151
  for (let i = 0; i < args.length; i++) {
2146
2152
  if (args[i] === "--json" && !json2) json2 = true;
2147
2153
  else if (args[i] === "--directory" && directory === void 0 && args[i + 1]?.trim() && !args[i + 1].startsWith("--")) directory = args[++i];
2148
- else if (args[i] === "--runtime-version" && runtimeVersion === void 0 && args[i + 1]?.trim() && !args[i + 1].startsWith("--")) runtimeVersion = args[++i];
2154
+ else if (args[i] === "--runtime-version") throw new Error("SIT CLI \u4E0D\u652F\u6301 --runtime-version\uFF1B\u7EDF\u4E00\u4F7F\u7528 npm dev \u6700\u65B0 Runtime\u3002");
2149
2155
  else throw new Error(`datasets \u53C2\u6570\u65E0\u6548\uFF1A${args[i]}
2150
2156
  ${help}`);
2151
2157
  }
2152
- const { root, source, version } = await runtimeCatalogSource(resolve7(cwd, directory ?? "."), { report: (message) => io.writeError(message), ...options, runtimeVersion });
2158
+ const { root, source, version } = await runtimeCatalogSource(resolve8(cwd, directory ?? "."), { report: (message) => io.writeError(message), ...options });
2153
2159
  const catalog = await readRuntimeDataCatalog(root);
2154
2160
  if (json2) io.write(JSON.stringify({ source, ...catalog, ...version }, null, 2));
2155
2161
  else {
2156
- io.write(`npm \u9009\u5B9A Runtime ${catalog.runtimeVersion} \u63D0\u4F9B ${catalog.datasets.length} \u9879\u6570\u636E\u80FD\u529B\uFF1A`);
2162
+ io.write(`npm dev \u6700\u65B0 Runtime ${catalog.runtimeVersion} \u63D0\u4F9B ${catalog.datasets.length} \u9879\u6570\u636E\u80FD\u529B\uFF1A`);
2157
2163
  for (const item of catalog.datasets) io.write(`- ${item.id} \u2014 ${item.title}\uFF08${item.source}\uFF0CSchema ${item.schemaVersion}\uFF09`);
2158
2164
  io.write("\u5C06\u6240\u9009 id \u548C purpose \u5199\u5165 data-access.json.requirements\uFF1B\u7528\u6237\u6388\u6743\u7531\u5E73\u53F0\u5904\u7406\u3002");
2159
2165
  }
@@ -2167,7 +2173,7 @@ ${help}`);
2167
2173
  // packages/cli-core/src/commands/knowledge.ts
2168
2174
  import { createHash as createHash2, randomUUID as randomUUID6 } from "node:crypto";
2169
2175
  import { lstat as lstat9, mkdir as mkdir7, readFile as readFile13, rename as rename8, unlink as unlink6, writeFile as writeFile6 } from "node:fs/promises";
2170
- import { dirname as dirname2, join as join13, resolve as resolve8 } from "node:path";
2176
+ import { dirname as dirname2, join as join13, resolve as resolve9 } from "node:path";
2171
2177
  var MANIFEST = "knowledge-manifest.json";
2172
2178
  var INDEX = "resources/knowledge/index.md";
2173
2179
  var INDEX_START = "<!-- buddy-knowledge:start -->";
@@ -2465,7 +2471,7 @@ async function runKnowledgeCommand(args, io, cwd) {
2465
2471
  ${KNOWLEDGE_HELP}`);
2466
2472
  }
2467
2473
  if (!plan) throw new Error(KNOWLEDGE_HELP);
2468
- const root = await requireBuddyProjectRoot(resolve8(cwd, directory ?? "."));
2474
+ const root = await requireBuddyProjectRoot(resolve9(cwd, directory ?? "."));
2469
2475
  const result = await syncKnowledge(root, plan);
2470
2476
  if (asJson) io.write(json(result));
2471
2477
  else if (result.status === "conflict") io.write(`\u5DF2\u4FDD\u7559\u624B\u5DE5\u4FEE\u6539\uFF1A${result.conflicts.join("\u3001")}\u3002\u5F85\u5408\u5E76\u7248\u672C\uFF1A${result.candidateDirectory}\u3002\u672A\u66F4\u65B0\u8FD0\u884C\u77E5\u8BC6\u3002`);
@@ -2600,7 +2606,7 @@ Tool \u548C Hook \u662F Runtime \u7684\u6269\u5C55\u70B9\uFF1BService \u53EA\u66
2600
2606
 
2601
2607
  \u5E73\u53F0\u80FD\u529B\u8981\u4EE5\u5B9E\u9645\u63A5\u5165\u4E3A\u51C6\u3002\u5F53\u524D Runtime \u63D0\u4F9B\u4F1A\u8BDD\u6D88\u606F\u3001Memory\u3001\u6388\u6743\u6570\u636E\u3001\u5C0F\u6302\u4EF6\u548C\u672C\u5730 Markdown \u8D44\u6599\u80FD\u529B\uFF1B\u6CA1\u6709\u63A5\u901A\u7684 Files\u3001Knowledge \u4E0D\u80FD\u56E0\u624B\u518C\u63D0\u5230\u5C31\u5BA3\u79F0\u53EF\u7528\u3002\u666E\u901A Tool \u4E5F\u4E0D\u4EE3\u8868\u5DF2\u7ECF\u63D0\u4F9B\u5B9A\u65F6\u3001\u957F\u671F\u4EFB\u52A1\u3001\u540E\u53F0\u8C03\u5EA6\u6216\u4E3B\u52A8\u89E6\u8FBE\u3002\u624B\u518C\u63CF\u8FF0\u7684\u4ED8\u8D39\u3001\u53D1\u5E03\u7B49\u670D\u52A1\u8BBE\u8BA1\u4E5F\u4E0D\u6784\u6210\u6267\u884C\u6536\u8D39\u6216\u53D1\u5E03\u52A8\u4F5C\u7684\u6388\u6743\u3002
2602
2608
 
2603
- \u9700\u8981\u7528\u6237\u6570\u636E\u65F6\uFF0C\u5148\u5728\u5DE5\u7A0B\u76EE\u5F55\u6267\u884C \`buddy-cli-sit datasets\`\uFF08\u811A\u672C\u53EF\u7528 \`--json\`\uFF09\uFF0C\u4ECE npm \u6700\u65B0 Runtime \u5BFC\u51FA\u8BFB\u53D6\u5168\u90E8\u6570\u636E\u96C6\uFF1B\u4E0D\u8981\u6C42\u767B\u5F55\uFF0C\u4E0D\u4ECE Server \u62C9\u76EE\u5F55\u3002CLI \u6BCF\u6B21\u67E5\u8BE2 latest\uFF0C\u540C\u7248\u672C\u590D\u7528\u7F13\u5B58\uFF0C\u4E0D\u590D\u5236\u679A\u4E3E\u3002\u76EE\u5F55\u547D\u4EE4\u4F1A\u63D0\u793A\u5DE5\u7A0B\u7248\u672C\u5DEE\u5F02\uFF1B\u4F7F\u7528\u65B0\u7248\u80FD\u529B\u524D\uFF0C\u7531\u4F60\u6216\u5F00\u53D1 Agent \u6309\u63D0\u793A\u5347\u7EA7\u4F9D\u8D56\uFF0C\u68C0\u67E5\u542F\u52A8\u53C2\u6570\u3001\u6A21\u578B\u3001datasets\u3001\u5DE5\u5177\u53CA Hook \u7684\u9002\u914D\u5E76\u9A8C\u8BC1 DEV\u3002CLI \u4E0D\u81EA\u52A8\u4FEE\u6539\u5DE5\u7A0B\u4F9D\u8D56\u6216\u914D\u7F6E\u3002\u628A\u5B9E\u9645\u9700\u8981\u7684 \`id\` \u548C\u7528\u9014 \`purpose\` \u5199\u5165 \`data-access.json.requirements\`\uFF0C\u6700\u591A 32 \u9879\uFF0C\u540C\u4E00 ID \u53EA\u5199\u4E00\u6B21\uFF0CID \u548C\u7528\u9014\u53BB\u9664\u9996\u5C3E\u7A7A\u767D\uFF0C\u7528\u9014\u4E3A 1\uFF5E200 \u5B57\uFF1B\u65E0\u9700\u6C42\u65F6\u4FDD\u7559\u7A7A\u6570\u7EC4\u3002DEV \u548C\u58F0\u660E\u975E\u7A7A\u65F6\u7684 push \u9884\u68C0\u7528\u8FD9\u4EFD\u5DE5\u7A0B\u4F9D\u8D56\u6821\u9A8C ID\uFF1B\u9700\u8981\u5148\u5B89\u88C5\u4E0E package.json \u51C6\u786E\u7248\u672C\u4E00\u81F4\u7684 Runtime\u3002\u6E05\u5355\u58F0\u660E\u6570\u91CF\u4E0D\u7B49\u4E8E\u5355\u6B21\u67E5\u8BE2\u4E0A\u9650\uFF0C\u5F53\u524D\u4E00\u6B21\u67E5\u8BE2\u6700\u591A 8 \u9879\u3002
2609
+ \u9700\u8981\u7528\u6237\u6570\u636E\u65F6\uFF0C\u5148\u5728\u5DE5\u7A0B\u76EE\u5F55\u6267\u884C \`buddy-cli-sit datasets\`\uFF08\u811A\u672C\u53EF\u7528 \`--json\`\uFF09\uFF0C\u4ECE npm dev \u6700\u65B0 Runtime \u5BFC\u51FA\u8BFB\u53D6\u5168\u90E8\u6570\u636E\u96C6\uFF1B\u4E0D\u8981\u6C42\u767B\u5F55\uFF0C\u4E0D\u4ECE Server \u62C9\u76EE\u5F55\u3002CLI \u6BCF\u6B21\u67E5\u8BE2 dev\uFF0C\u540C\u7248\u672C\u590D\u7528\u7F13\u5B58\uFF0C\u4E0D\u590D\u5236\u679A\u4E3E\u3002\u76EE\u5F55\u547D\u4EE4\u4F1A\u63D0\u793A\u5DE5\u7A0B\u7248\u672C\u5DEE\u5F02\uFF1B\u4F7F\u7528\u65B0\u7248\u80FD\u529B\u524D\uFF0C\u7531\u4F60\u6216\u5F00\u53D1 Agent \u6309\u63D0\u793A\u5347\u7EA7\u4F9D\u8D56\uFF0C\u68C0\u67E5\u542F\u52A8\u53C2\u6570\u3001\u6A21\u578B\u3001datasets\u3001\u5DE5\u5177\u53CA Hook \u7684\u9002\u914D\u5E76\u9A8C\u8BC1 DEV\u3002CLI \u4E0D\u81EA\u52A8\u4FEE\u6539\u5DE5\u7A0B\u4F9D\u8D56\u6216\u914D\u7F6E\u3002\u628A\u5B9E\u9645\u9700\u8981\u7684 \`id\` \u548C\u7528\u9014 \`purpose\` \u5199\u5165 \`data-access.json.requirements\`\uFF0C\u6700\u591A 32 \u9879\uFF0C\u540C\u4E00 ID \u53EA\u5199\u4E00\u6B21\uFF0CID \u548C\u7528\u9014\u53BB\u9664\u9996\u5C3E\u7A7A\u767D\uFF0C\u7528\u9014\u4E3A 1\uFF5E200 \u5B57\uFF1B\u65E0\u9700\u6C42\u65F6\u4FDD\u7559\u7A7A\u6570\u7EC4\u3002DEV \u548C\u58F0\u660E\u975E\u7A7A\u65F6\u7684 push \u9884\u68C0\u7528\u8FD9\u4EFD\u5DE5\u7A0B\u4F9D\u8D56\u6821\u9A8C ID\uFF1B\u9700\u8981\u5148\u5B89\u88C5\u4E0E package.json \u51C6\u786E\u7248\u672C\u4E00\u81F4\u7684 Runtime\u3002\u6E05\u5355\u58F0\u660E\u6570\u91CF\u4E0D\u7B49\u4E8E\u5355\u6B21\u67E5\u8BE2\u4E0A\u9650\uFF0C\u5F53\u524D\u4E00\u6B21\u67E5\u8BE2\u6700\u591A 8 \u9879\u3002
2604
2610
 
2605
2611
  Runtime \u542F\u52A8\u65F6\u8BFB\u53D6\u6839\u76EE\u5F55 \`data-access.json\`\uFF0C\u901A\u8FC7 \`PUT /internal/v1/data-access/requirements\` \u767B\u8BB0\uFF0C\u6210\u529F\u540E\u518D\u8FDE\u63A5\u4E8B\u4EF6\u6D41\uFF1B\u767B\u8BB0\u5931\u8D25\u963B\u6B62\u542F\u52A8\u3002\u6587\u4EF6\u7F3A\u5931\u6216\u7A7A\u6570\u7EC4\u90FD\u4F1A\u4E0A\u4F20\u7A7A\u58F0\u660E\u5E76\u6E05\u9664\u65E7\u58F0\u660E\u3002DEV \u4FDD\u5B58\u8BE5\u6587\u4EF6\u540E\u81EA\u52A8\u91CD\u542F\u5E76\u91CD\u65B0\u767B\u8BB0\u3002\u58F0\u660E\u4E0D\u8868\u793A\u7528\u6237\u5DF2\u6388\u6743\uFF1B\u4F4D\u7F6E\u548C\u65E5\u5386\u4E0D\u653E\u5165\u6B64\u6587\u4EF6\u3002
2606
2612
 
@@ -2800,7 +2806,7 @@ ${JSON.stringify(openArgs, null, 2)}
2800
2806
 
2801
2807
  \u91CD\u65B0\u6267\u884C \`buddy-cli-sit guide\` \u83B7\u53D6\u5F53\u524D\u89C4\u5219\uFF0C\u8BFB\u53D6 completion.manualPath \u6307\u5411\u7684\u771F\u5B9E\u624B\u518C\u4E0E\u73B0\u6709\u5DE5\u7A0B\uFF0C\u518D\u6309\u5F00\u53D1\u6307\u5F15\u7EE7\u7EED\u5B9E\u73B0\u3002
2802
2808
 
2803
- \u4F7F\u7528\u5B98\u65B9 Runtime \u521D\u59CB\u5316\u5DE5\u7A0B\u524D\uFF0C\u6309 guide \u8BE2\u95EE\u5F00\u53D1\u8005\u9009\u62E9\u7248\u672C\u3002\u5728\u4E0B\u5217\u57FA\u7840 argv \u540E\u8FFD\u52A0 --runtime-version \u4E0E\u5DF2\u786E\u8BA4\u7684\u51C6\u786E\u7248\u672C\uFF1B\u5DF2\u6709\u5B8C\u6574\u5DE5\u7A0B\u6CBF\u7528\u4F9D\u8D56\u3002\u8C03\u7528 buddy-cli-sit\uFF0C\u57FA\u7840 argv \u4E3A\uFF1A
2809
+ \u4F7F\u7528\u5B98\u65B9 Runtime \u521D\u59CB\u5316\u5DE5\u7A0B\u65F6\uFF0CSIT CLI \u81EA\u52A8\u9501\u5B9A npm dev \u6700\u65B0\u7248\u672C\uFF0C\u4E0D\u8BE2\u95EE Runtime \u7248\u672C\u3002\u65B0\u4E1A\u52A1\u5DE5\u5382\u6309 guide \u5148\u786E\u8BA4\u6A21\u578B\uFF0C\u518D\u5728\u4E0B\u5217\u57FA\u7840 argv \u540E\u8FFD\u52A0 --model\uFF1B\u5DF2\u6709\u5B8C\u6574\u5DE5\u7A0B\u5148\u68C0\u67E5\u6700\u65B0 dev Runtime \u7684\u9002\u914D\uFF0C\u4E0D\u91CD\u590D\u521D\u59CB\u5316\u3002\u8C03\u7528 buddy-cli-sit\uFF0C\u57FA\u7840 argv \u4E3A\uFF1A
2804
2810
 
2805
2811
  \`\`\`json
2806
2812
  ${JSON.stringify(["init", "--mode", "direct", "--directory", context.projectRoot], null, 2)}
@@ -2996,7 +3002,7 @@ Creator 1.7+ \u7684 Booklet \u63D0\u4F9B\u300C\u4E3B\u52A8\u6027\u4E0E\u6570\u63
2996
3002
  | \u5FC5\u987B\u9075\u5FAA\u7684\u5904\u7406\u987A\u5E8F\u6216\u9644\u52A0\u5904\u7406 | \u5148\u770B Runtime \u9ED8\u8BA4\u56DE\u5408\u662F\u5426\u6EE1\u8DB3\uFF1B\u5FC5\u987B\u7531\u7A0B\u5E8F\u4FDD\u8BC1\u7684\u987A\u5E8F\u53EF\u7528 Tool\uFF0C\u6216\u5728 \`src/buddy-options.mjs\` \u4F7F\u7528 \`beforeToolCall\`\u3001\`afterToolCall\`\u3001\`shouldStopAfterTurn\` \u7B49\u56DE\u5408\u94A9\u5B50\u3002 |
2997
3003
  | \u4EE5\u540E\u8FD8\u9700\u8981\u8BB0\u4F4F\u7684\u4FE1\u606F | \u901A\u8FC7 \`conversation.memory\` \u843D\u5B9E\u4FDD\u5B58\u3001\u8BFB\u53D6\u3001\u66F4\u65B0\u548C\u9057\u5FD8\uFF0C\u5E76\u6309\u9700\u8981\u5C01\u88C5\u4E3A\u6A21\u578B Tool\u3002\u65B0 Runtime \u4E0D\u4F1A\u81EA\u52A8\u67E5\u8BE2\u6216\u63D0\u70BC\u8BB0\u5FC6\uFF1B\u662F\u5426\u4FDD\u5B58\u3001\u4FDD\u5B58\u4EC0\u4E48\u5FC5\u987B\u7531\u4E1A\u52A1\u4EE3\u7801\u548C\u5DF2\u786E\u8BA4\u7684\u6570\u636E\u8FB9\u754C\u51B3\u5B9A\u3002 |
2998
3004
  | \u56DE\u7B54\u65F6\u9700\u8981\u53C2\u8003\u7684\u5386\u53F2\u3001\u8BA1\u5212\u548C\u72B6\u6001 | Runtime \u4F1A\u4ECE MLB \u91CD\u5EFA\u4F1A\u8BDD\u5386\u53F2\uFF1B\u957F\u671F\u8BA1\u5212\u548C\u7ED3\u6784\u5316\u72B6\u6001\u4E0D\u80FD\u53EA\u4F9D\u8D56\u5B83\u4E00\u76F4\u7559\u5728\u6700\u8FD1\u804A\u5929\u91CC\u3002\u6309\u9700\u6C42\u4F7F\u7528 Memory\u3001\u6388\u6743\u6570\u636E\u6216\u4E1A\u52A1 Tool\uFF0C\u4E0D\u8981\u627F\u8BFA\u9ED8\u8BA4\u914D\u7F6E\u5DF2\u7ECF\u8986\u76D6\u3002 |
2999
- | \u6A21\u578B\u548C\u5E73\u53F0\u8D44\u6E90 | \u5DF2\u786E\u5B9A\u7684\u6A21\u578B\u76F4\u63A5\u6CBF\u7528\uFF1B\u672A\u6307\u5B9A\u65F6\u67E5\u8BE2 \`buddy-cli-sit models\`\uFF0C\u5217\u51FA\u6240\u9009 Runtime \u652F\u6301\u7684\u6A21\u578B\uFF0C\u8BF7\u5F00\u53D1\u8005\u660E\u786E\u9009\u62E9\u540E\u518D\u7EE7\u7EED\uFF0C\u4E0D\u80FD\u81EA\u884C\u9ED8\u8BA4\uFF1B\u53EF\u4EE5\u7ED9\u51FA\u6709\u4F9D\u636E\u7684\u5EFA\u8BAE\uFF0C\u4E0D\u7F16\u9020\u4EF7\u683C\u6216\u80FD\u529B\u3002\u65B0\u4E1A\u52A1\u5DE5\u5382\u7528 \`init --mode direct --model <\u5DF2\u786E\u8BA4\u6A21\u578B ID>\` \u5199\u5165\u9009\u62E9\uFF1B\u5DF2\u6709\u5DE5\u5382\u4E0D\u4F20\u8BE5\u53C2\u6570\uFF0C\u4E0D\u8986\u76D6\u539F\u6A21\u578B\u3002\u6A21\u578B\u76F4\u63A5\u5199\u5165\u4E1A\u52A1\u5DE5\u5382\u8FD4\u56DE\u7684 \`initialState.model\`\uFF1B\u81EA\u5B9A\u4E49\u5DE5\u5382\u4E5F\u53EF\u6309\u4F1A\u8BDD\u9009\u62E9\u53D7\u652F\u6301\u6A21\u578B\uFF1B\u4F1A\u4EA7\u751F\u65B0\u7684\u8D39\u7528\u3001\u6570\u636E\u4F7F\u7528\u6216\u6743\u9650\u8FB9\u754C\u65F6\u5148\u786E\u8BA4\u3002 |
3005
+ | \u6A21\u578B\u548C\u5E73\u53F0\u8D44\u6E90 | \u5DF2\u786E\u5B9A\u7684\u6A21\u578B\u76F4\u63A5\u6CBF\u7528\uFF1B\u672A\u6307\u5B9A\u65F6\u67E5\u8BE2 \`buddy-cli-sit models\`\uFF0C\u5217\u51FA\u6700\u65B0 dev Runtime \u652F\u6301\u7684\u6A21\u578B\uFF0C\u8BF7\u5F00\u53D1\u8005\u660E\u786E\u9009\u62E9\u540E\u518D\u7EE7\u7EED\uFF0C\u4E0D\u80FD\u81EA\u884C\u9ED8\u8BA4\uFF1B\u53EF\u4EE5\u7ED9\u51FA\u6709\u4F9D\u636E\u7684\u5EFA\u8BAE\uFF0C\u4E0D\u7F16\u9020\u4EF7\u683C\u6216\u80FD\u529B\u3002\u65B0\u4E1A\u52A1\u5DE5\u5382\u7528 \`init --mode direct --model <\u5DF2\u786E\u8BA4\u6A21\u578B ID>\` \u5199\u5165\u9009\u62E9\uFF1B\u5DF2\u6709\u5DE5\u5382\u4E0D\u4F20\u8BE5\u53C2\u6570\uFF0C\u4E0D\u8986\u76D6\u539F\u6A21\u578B\u3002\u6A21\u578B\u76F4\u63A5\u5199\u5165\u4E1A\u52A1\u5DE5\u5382\u8FD4\u56DE\u7684 \`initialState.model\`\uFF1B\u81EA\u5B9A\u4E49\u5DE5\u5382\u4E5F\u53EF\u6309\u4F1A\u8BDD\u9009\u62E9\u53D7\u652F\u6301\u6A21\u578B\uFF1B\u4F1A\u4EA7\u751F\u65B0\u7684\u8D39\u7528\u3001\u6570\u636E\u4F7F\u7528\u6216\u6743\u9650\u8FB9\u754C\u65F6\u5148\u786E\u8BA4\u3002 |
3000
3006
 
3001
3007
  \`src/buddy-options.mjs\` \u662F\u6BCF\u573A\u4F1A\u8BDD\u7684\u4E1A\u52A1\u88C5\u914D\u5165\u53E3\uFF0C\u5BFC\u51FA \`createBuddyOptions(conversation)\`\uFF0C\u8FD4\u56DE \`initialState\`\u3001\u5728 \`initialState.tools\` \u6CE8\u518C\u7684\u4E1A\u52A1\u53CA\u5E73\u53F0\u5DE5\u5177\u548C\u53EF\u9009\u56DE\u5408\u94A9\u5B50\u3002\`start.mjs\` \u4ECE \`./src/buddy-options.mjs\` \u5BFC\u5165\u5DE5\u5382\u5E76\u4F20\u7ED9 \`BuddyServer.start(createBuddyOptions)\`\uFF1B\u6A21\u578B\u76F4\u63A5\u5199\u5728\u5DE5\u5382\u8FD4\u56DE\u7684 \`initialState.model\`\uFF0C\u65B0\u5DE5\u7A0B\u6A21\u677F\u5199\u5165\u5F00\u53D1\u8005\u786E\u8BA4\u7684\u6A21\u578B\uFF1B\u7528 \`new URL("../agent.md", import.meta.url)\` \u8BFB\u53D6\u6839\u76EE\u5F55 Prompt\u3002\u9ED8\u8BA4\u6A21\u677F\u53EA\u662F\u8D77\u70B9\uFF0C\u53EA\u6539\u8BF4\u660E\u4E0D\u7B49\u4E8E\u6539\u53D8\u4E86\u4FDD\u5B58\u3001\u67E5\u8BE2\u6216\u5904\u7406\u903B\u8F91\u3002 Runtime \u4ECE\u5DE5\u7A0B \`package.json.buddyId\` \u8BFB\u53D6\u8EAB\u4EFD\uFF0C\u4ECE\u73AF\u5883\u53D8\u91CF \`BUDDY_TOKEN\` \u8BFB\u53D6\u4EE4\u724C\uFF1B\u4E0D\u8981\u6C42 \`BUDDY_ID\`\uFF1B\u9996\u6B21\u542F\u52A8 DEV \u65F6 CLI \u51C6\u5907\u5DE5\u7A0B \`.env\`\uFF0CNode \u7528 \`--env-file-if-exists=.env\` \u52A0\u8F7D\u3002CLI \u590D\u7528\u672C\u5730 Token \u524D\u5411 Server \u6838\u5BF9\u5176\u662F\u5426\u5C5E\u4E8E\u5F53\u524D\u642D\u5B50\uFF1B\u4E0D\u5339\u914D\u65F6\u5148\u786E\u8BA4\u5DE5\u7A0B\uFF0C\u518D\u7528 \`--refresh-token\` \u91CD\u65B0\u9886\u53D6\u3002\u4E0D\u8981\u5C06 token \u5199\u5165\u4E1A\u52A1\u4EE3\u7801\u3002
3002
3008
 
@@ -3031,7 +3037,7 @@ Tool \u548C Hook \u662F Runtime \u7684\u6269\u5C55\u70B9\uFF1BService \u53EA\u66
3031
3037
 
3032
3038
  \u5E73\u53F0\u80FD\u529B\u8981\u4EE5\u5B9E\u9645\u63A5\u5165\u4E3A\u51C6\u3002\u5F53\u524D Runtime \u63D0\u4F9B\u4F1A\u8BDD\u6D88\u606F\u3001Memory\u3001\u6388\u6743\u6570\u636E\u3001\u5C0F\u6302\u4EF6\u548C\u672C\u5730 Markdown \u8D44\u6599\u80FD\u529B\uFF1B\u6CA1\u6709\u63A5\u901A\u7684 Files\u3001Knowledge \u4E0D\u80FD\u56E0\u624B\u518C\u63D0\u5230\u5C31\u5BA3\u79F0\u53EF\u7528\u3002\u666E\u901A Tool \u4E5F\u4E0D\u4EE3\u8868\u5DF2\u7ECF\u63D0\u4F9B\u5B9A\u65F6\u3001\u957F\u671F\u4EFB\u52A1\u3001\u540E\u53F0\u8C03\u5EA6\u6216\u4E3B\u52A8\u89E6\u8FBE\u3002\u624B\u518C\u63CF\u8FF0\u7684\u4ED8\u8D39\u3001\u53D1\u5E03\u7B49\u670D\u52A1\u8BBE\u8BA1\u4E5F\u4E0D\u6784\u6210\u6267\u884C\u6536\u8D39\u6216\u53D1\u5E03\u52A8\u4F5C\u7684\u6388\u6743\u3002
3033
3039
 
3034
- \u9700\u8981\u7528\u6237\u6570\u636E\u65F6\uFF0C\u5148\u5728\u5DE5\u7A0B\u76EE\u5F55\u6267\u884C \`buddy-cli-sit datasets\`\uFF08\u811A\u672C\u53EF\u7528 \`--json\`\uFF09\uFF0C\u4ECE\u5DE5\u7A0B\u9009\u5B9A Runtime \u5BFC\u51FA\u8BFB\u53D6\u5168\u90E8\u6570\u636E\u96C6\uFF1B\u4E0D\u8981\u6C42\u767B\u5F55\uFF0C\u4E0D\u4ECE Server \u62C9\u76EE\u5F55\u3002\u5DE5\u7A0B\u5916\u7528 --runtime-version \u9009\u62E9\u7248\u672C\uFF1B\u5DE5\u7A0B\u5185\u76EE\u5F55\u4E0E\u51C6\u786E\u4F9D\u8D56\u4E00\u81F4\uFF0C\u540C\u7248\u672C\u590D\u7528\u7F13\u5B58\uFF0C\u4E0D\u590D\u5236\u679A\u4E3E\u3002\u9700\u8981\u5347\u7EA7\u65F6\u5148\u53D6\u5F97\u5F00\u53D1\u8005\u786E\u8BA4\uFF0C\u518D\u66F4\u65B0\u4F9D\u8D56\u3001\u9002\u914D\u5E76\u9A8C\u8BC1 DEV\u3002CLI \u4E0D\u81EA\u52A8\u4FEE\u6539\u5DE5\u7A0B\u4F9D\u8D56\u6216\u914D\u7F6E\u3002\u628A\u5B9E\u9645\u9700\u8981\u7684 \`id\` \u548C\u7528\u9014 \`purpose\` \u5199\u5165 \`data-access.json.requirements\`\uFF0C\u6700\u591A 32 \u9879\uFF0C\u540C\u4E00 ID \u53EA\u5199\u4E00\u6B21\uFF0CID \u548C\u7528\u9014\u53BB\u9664\u9996\u5C3E\u7A7A\u767D\uFF0C\u7528\u9014\u4E3A 1\uFF5E200 \u5B57\uFF1B\u65E0\u9700\u6C42\u65F6\u4FDD\u7559\u7A7A\u6570\u7EC4\u3002DEV \u548C\u58F0\u660E\u975E\u7A7A\u65F6\u7684 push \u9884\u68C0\u7528\u8FD9\u4EFD\u5DE5\u7A0B\u4F9D\u8D56\u6821\u9A8C ID\uFF1B\u9700\u8981\u5148\u5B89\u88C5\u4E0E package.json \u51C6\u786E\u7248\u672C\u4E00\u81F4\u7684 Runtime\u3002\u6E05\u5355\u58F0\u660E\u6570\u91CF\u4E0D\u7B49\u4E8E\u5355\u6B21\u67E5\u8BE2\u4E0A\u9650\uFF0C\u5F53\u524D\u4E00\u6B21\u67E5\u8BE2\u6700\u591A 8 \u9879\u3002
3040
+ \u9700\u8981\u7528\u6237\u6570\u636E\u65F6\uFF0C\u5148\u5728\u5DE5\u7A0B\u76EE\u5F55\u6267\u884C \`buddy-cli-sit datasets\`\uFF08\u811A\u672C\u53EF\u7528 \`--json\`\uFF09\uFF0C\u4ECE npm dev \u6700\u65B0 Runtime \u5BFC\u51FA\u8BFB\u53D6\u5168\u90E8\u6570\u636E\u96C6\uFF1B\u4E0D\u8981\u6C42\u767B\u5F55\uFF0C\u4E0D\u4ECE Server \u62C9\u76EE\u5F55\u3002\u65E0\u8BBA\u662F\u5426\u5728\u5DE5\u7A0B\u5185\u90FD\u67E5\u8BE2 dev\uFF0C\u540C\u7248\u672C\u590D\u7528\u7F13\u5B58\uFF0C\u4E0D\u590D\u5236\u679A\u4E3E\u3002\u5DE5\u7A0B\u7248\u672C\u4E0D\u5339\u914D\u65F6\uFF0C\u66F4\u65B0\u4F9D\u8D56\u3001\u9002\u914D\u5E76\u9A8C\u8BC1 DEV\u3002CLI \u4E0D\u81EA\u52A8\u4FEE\u6539\u5DE5\u7A0B\u4F9D\u8D56\u6216\u914D\u7F6E\u3002\u628A\u5B9E\u9645\u9700\u8981\u7684 \`id\` \u548C\u7528\u9014 \`purpose\` \u5199\u5165 \`data-access.json.requirements\`\uFF0C\u6700\u591A 32 \u9879\uFF0C\u540C\u4E00 ID \u53EA\u5199\u4E00\u6B21\uFF0CID \u548C\u7528\u9014\u53BB\u9664\u9996\u5C3E\u7A7A\u767D\uFF0C\u7528\u9014\u4E3A 1\uFF5E200 \u5B57\uFF1B\u65E0\u9700\u6C42\u65F6\u4FDD\u7559\u7A7A\u6570\u7EC4\u3002DEV \u548C\u58F0\u660E\u975E\u7A7A\u65F6\u7684 push \u9884\u68C0\u7528\u8FD9\u4EFD\u5DE5\u7A0B\u4F9D\u8D56\u6821\u9A8C ID\uFF1B\u9700\u8981\u5148\u5B89\u88C5\u4E0E package.json \u51C6\u786E\u7248\u672C\u4E00\u81F4\u7684 Runtime\u3002\u6E05\u5355\u58F0\u660E\u6570\u91CF\u4E0D\u7B49\u4E8E\u5355\u6B21\u67E5\u8BE2\u4E0A\u9650\uFF0C\u5F53\u524D\u4E00\u6B21\u67E5\u8BE2\u6700\u591A 8 \u9879\u3002
3035
3041
 
3036
3042
  Runtime \u542F\u52A8\u65F6\u8BFB\u53D6\u6839\u76EE\u5F55 \`data-access.json\`\uFF0C\u901A\u8FC7 \`PUT /internal/v1/data-access/requirements\` \u767B\u8BB0\uFF0C\u6210\u529F\u540E\u518D\u8FDE\u63A5\u4E8B\u4EF6\u6D41\uFF1B\u767B\u8BB0\u5931\u8D25\u963B\u6B62\u542F\u52A8\u3002\u6587\u4EF6\u7F3A\u5931\u6216\u7A7A\u6570\u7EC4\u90FD\u4F1A\u4E0A\u4F20\u7A7A\u58F0\u660E\u5E76\u6E05\u9664\u65E7\u58F0\u660E\u3002DEV \u4FDD\u5B58\u8BE5\u6587\u4EF6\u540E\u81EA\u52A8\u91CD\u542F\u5E76\u91CD\u65B0\u767B\u8BB0\u3002\u58F0\u660E\u4E0D\u8868\u793A\u7528\u6237\u5DF2\u6388\u6743\uFF1B\u6240\u6709\u9700\u8981\u7684\u6570\u636E\u90FD\u8981\u58F0\u660E\uFF0C\u5305\u62EC\u4F4D\u7F6E \`device.location\` \u548C\u65E5\u5386 \`device.calendar\`\u3002
3037
3043
 
@@ -3039,7 +3045,7 @@ Runtime \u542F\u52A8\u65F6\u8BFB\u53D6\u6839\u76EE\u5F55 \`data-access.json\`\uF
3039
3045
 
3040
3046
  \u4F4D\u7F6E\u6216\u65E5\u5386\u7684\u6388\u6743\u8BF7\u6C42\u6BCF\u6B21\u53EA\u80FD\u5305\u542B\u4E00\u4E2A Dataset\uFF0C\u4E0D\u80FD\u628A\u4E8C\u8005\u653E\u5728\u4E00\u8D77\uFF0C\u4E5F\u4E0D\u80FD\u4E0E\u5065\u5EB7\u6570\u636E\u6DF7\u5408\u7533\u8BF7\u3002\u7FA4\u804A query \u7684 memberId \u4F7F\u7528\u6D88\u606F\u524D\u7F00\u91CC\u7684\u7A33\u5B9A\u6210\u5458\u53F7 m_\u2026\uFF0C\u4E0D\u5E26 #\uFF0C\u4E0D\u80FD\u6309\u6635\u79F0\u731C\u6D4B\u3002SIT \u65B0\u7248 Runtime \u5728\u7FA4\u804A\u4E2D query \u548C request \u90FD\u4F20\u540C\u4E00\u7A33\u5B9A memberId\uFF0C\u53EA\u7531\u76EE\u6807\u6210\u5458\u5904\u7406\u6388\u6743\u5361\uFF1B\u65E7\u7A33\u5B9A Runtime \u5982\u5C1A\u4E0D\u652F\u6301\u6B64\u53C2\u6570\uFF0C\u5148\u786E\u8BA4\u5347\u7EA7\u6216\u5F15\u5BFC\u79C1\u804A\uFF0C\u4E0D\u76F4\u8C03\u5E73\u53F0\u7ED5\u8FC7\u3002\u7FA4\u804A\u4E0E\u7CFB\u7EDF\u6388\u6743\u5728\u540C\u73AF\u5883\u771F\u673A\u9A8C\u8BC1\uFF0C\u79C1\u804A\u6A21\u62DF\u5668\u4E0D\u80FD\u4EE3\u66FF\u8FD9\u9879\u9A8C\u6536\u3002\u79C1\u804A\u4E0D\u4F20 memberId\u3002
3041
3047
 
3042
- \u65B0\u5EFA\u5DE5\u7A0B\u5148\u8BE2\u95EE Runtime \u7248\u672C\uFF0C\u52A8\u6001\u67E5\u8BE2\u516C\u5171 npm latest\u3001dev \u6216\u51C6\u786E\u7248\u672C\u5E76\u9501\u5B9A\u5B9E\u9645\u89E3\u6790\u7ED3\u679C\u3002\u67E5\u8BE2\u6216\u9501\u6587\u4EF6\u751F\u6210\u5931\u8D25\u65F6\u505C\u6B62\uFF0C\u4E0D\u56DE\u9000\u65E7\u7248\u672C\u3002\u5DF2\u6709\u5DE5\u7A0B\u6CBF\u7528\u6240\u9009\u7248\u672C\uFF1BDEV\u3001\u81EA\u52A8\u91CD\u8F7D\u548C push \u68C0\u67E5\u51C6\u786E\u4F9D\u8D56\u3001\u5B89\u88C5\u548C\u9501\u6587\u4EF6\u4E00\u81F4\uFF0C\u4E0D\u81EA\u52A8\u8FFD\u968F\u6807\u7B7E\u3002
3048
+ \u65B0\u5EFA\u5DE5\u7A0B\u7EDF\u4E00\u67E5\u8BE2\u516C\u5171 npm dev \u6700\u65B0 Runtime\uFF0C\u5E76\u9501\u5B9A\u5B9E\u9645\u89E3\u6790\u51FA\u7684\u51C6\u786E\u7248\u672C\uFF0C\u4E0D\u63D0\u4F9B\u7248\u672C\u9009\u62E9\u3002\u67E5\u8BE2\u6216\u9501\u6587\u4EF6\u751F\u6210\u5931\u8D25\u65F6\u505C\u6B62\uFF0C\u4E0D\u56DE\u9000\u65E7\u7248\u672C\u3002DEV\u3001\u81EA\u52A8\u91CD\u8F7D\u548C push \u6BCF\u6B21\u91CD\u65B0\u67E5\u8BE2 dev\uFF0C\u68C0\u67E5\u5DE5\u7A0B\u51C6\u786E\u4F9D\u8D56\u3001\u5B9E\u9645\u5B89\u88C5\u548C\u9501\u6587\u4EF6\u4E0E\u6700\u65B0\u7248\u672C\u4E00\u81F4\uFF1B\u4E0D\u5339\u914D\u65F6\u7531\u5F00\u53D1\u8005\u6216 Coding Agent \u66F4\u65B0\u4F9D\u8D56\u5E76\u5B8C\u6210\u9002\u914D\uFF0CCLI \u4E0D\u81EA\u52A8\u6539\u5199\u4E1A\u52A1\u5DE5\u7A0B\u3002
3043
3049
 
3044
3050
 
3045
3051
  \u5C0F\u6302\u4EF6\u7684\u6A21\u578B\u5DE5\u5177\u4E3A \`widget_create\`\u3001\`widget_read\`\uFF08\u6574\u4E2A\u5C0F\u6302\u4EF6\uFF09\u3001\`widget_read_module\`\uFF08\u4E00\u4E2A\u6A21\u5757\uFF09\u3001\`widget_rename\`\u3001\`widget_write_record\`\u3001\`widget_delete_record\` \u548C \`widget_send\`\uFF0C\u6309\u4E1A\u52A1\u9700\u8981\u6CE8\u518C\u5230 \`initialState.tools\`\u3002\u4FEE\u6539\u8BB0\u5F55\u7528 \`conversation.widget.writeRecord(id, input)\`\uFF1B\u5220\u4E00\u6761\u8BB0\u5F55\u7528 \`conversation.widget.deleteRecord(id, module, recordId)\`\uFF1B\u5F53\u524D\u4E0D\u63D0\u4F9B\u6574\u4E2A Widget \u5220\u9664\u3002\u5177\u4F53\u80FD\u529B\u4E0E\u5DE5\u7A0B\u9501\u5B9A\u7684 Runtime \u7248\u672C\u4E00\u81F4\uFF0C\u4E0D\u6CE8\u518C\u4E0D\u5B58\u5728\u7684\u5DE5\u5177\u3002
@@ -3316,8 +3322,8 @@ var CLI_HELP = `\u642D\u642D Developer Platform CLI
3316
3322
 
3317
3323
  \u547D\u4EE4:
3318
3324
  init \u521B\u5EFA\u642D\u5B50\u6216\u7EE7\u7EED\u5DF2\u6709\u5DE5\u7A0B
3319
- models \u67E5\u770B\u9009\u5B9A Runtime \u7684\u6A21\u578B\u76EE\u5F55
3320
- datasets \u67E5\u770B\u9009\u5B9A Runtime \u7684\u6570\u636E\u96C6\u76EE\u5F55
3325
+ models \u67E5\u770B\u6700\u65B0 dev Runtime \u7684\u6A21\u578B\u76EE\u5F55
3326
+ datasets \u67E5\u770B\u6700\u65B0 dev Runtime \u7684\u6570\u636E\u96C6\u76EE\u5F55
3321
3327
  knowledge \u5C06\u521B\u4F5C\u8D44\u6599\u540C\u6B65\u4E3A\u672C\u5730\u8FD0\u884C\u77E5\u8BC6
3322
3328
  dev \u5728\u7EC8\u7AEF\u542F\u52A8\u5F00\u53D1\u7248\u642D\u5B50\uFF1Bdev stop \u505C\u6B62\u672C\u673A DEV
3323
3329
  preview \u8FDE\u63A5\u5DE5\u7A0B\u5E76\u6253\u5F00\u540E\u53F0\u5F00\u53D1\u8C03\u8BD5
@@ -3354,17 +3360,17 @@ var INIT_HELP = `\u7528\u6CD5: buddy-cli-sit init [\u53C2\u6570]
3354
3360
  --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
3355
3361
  --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
3356
3362
  --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
3357
- --runtime-version <\u7248\u672C> direct \u6A21\u5F0F\u9009\u62E9\u51C6\u786E\u7248\u672C\u3001latest \u6216 dev\uFF1B\u65B0\u5DE5\u7A0B\u5FC5\u987B\u5148\u8BE2\u95EE\u5F00\u53D1\u8005
3358
3363
  --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
3359
3364
 
3360
3365
  \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
3361
3366
  \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
3362
- 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
3367
+ \u65B0\u5DE5\u7A0B\u4ECE npm dev \u52A8\u6001\u89E3\u6790\u5E76\u9501\u5B9A\u6700\u65B0 Runtime\uFF1B\u5DF2\u6709\u5DE5\u7A0B\u9700\u5148\u5B8C\u6210\u6700\u65B0 dev Runtime \u9002\u914D\u3002
3368
+ direct \u751F\u6210\u65B0\u4E1A\u52A1\u5DE5\u5382\u524D\uFF0C\u6309\u6700\u65B0 dev 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
3363
3369
  \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
3364
3370
  \u5DF2\u767B\u8BB0\u642D\u5B50\u7684\u540D\u79F0\u3001\u4ECB\u7ECD\u6216\u5934\u50CF\u7528 buddy-cli-sit meta update \u4FEE\u6539\uFF1Binit \u4E0D\u8986\u76D6\u4E91\u7AEF\u8D44\u6599\u3002
3365
3371
 
3366
3372
  \u793A\u4F8B:
3367
- buddy-cli-sit init --mode direct --runtime-version <\u5DF2\u786E\u8BA4\u7684\u7248\u672C> --directory ./my-buddy --name "\u505A\u996D\u642D\u5B50" --tagline "\u5E2E\u4F60\u5B89\u6392\u665A\u996D" --intro "\u6839\u636E\u73B0\u6709\u98DF\u6750\u63A8\u8350\u83DC\u8C31"
3373
+ buddy-cli-sit init --mode direct --directory ./my-buddy --name "\u505A\u996D\u642D\u5B50" --tagline "\u5E2E\u4F60\u5B89\u6392\u665A\u996D" --intro "\u6839\u636E\u73B0\u6709\u98DF\u6750\u63A8\u8350\u83DC\u8C31"
3368
3374
  buddy-cli-sit init --mode create --directory ./my-buddy
3369
3375
 
3370
3376
  Coding Agent \u7684\u786E\u8BA4\u4E0E\u63A5\u7EED\u89C4\u5219\u89C1 buddy-cli-sit guide\u3002`;
@@ -3417,10 +3423,10 @@ Coding Agent \u5E94\u76F4\u63A5\u6CBF\u7528\u7528\u6237\u660E\u786E\u63D0\u4F9B\
3417
3423
  \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
3418
3424
  --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\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\uFF1B\u672C\u5730\u8054\u8C03\u53EF\u8BBE\u7F6E BUDDY_CREATOR_SKILL_PATH \u7EDD\u5BF9\u8DEF\u5F84\u3002
3419
3425
  \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
3420
- \u56DB\u518C\u786E\u8BA4\u540E\u7EE7\u7EED\u5C0F\u6302\u4EF6\u6E05\u5355\u3001\u539F\u578B\u548C\u8BBE\u8BA1\u9A8C\u6536\uFF1B\u5168\u90E8\u786E\u8BA4\u5E76\u901A\u8FC7\u4EA4\u4ED8\u6821\u9A8C\u540E\uFF0C\u7531 Coding Agent \u81EA\u52A8\u8854\u63A5\u5F00\u53D1\uFF0C\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
3426
+ \u56DB\u518C\u786E\u8BA4\u540E\u7EE7\u7EED\u5C0F\u6302\u4EF6\u6E05\u5355\u3001\u539F\u578B\u548C\u8BBE\u8BA1\u9A8C\u6536\uFF1B\u5168\u90E8\u786E\u8BA4\u5E76\u901A\u8FC7\u4EA4\u4ED8\u6821\u9A8C\u540E\uFF0C\u7531 Coding Agent \u81EA\u52A8\u8854\u63A5\u5F00\u53D1\uFF0C\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\u6700\u65B0 dev 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
3421
3427
  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
3422
3428
  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
3423
- \u8FDB\u5165 direct \u521B\u5EFA Runtime \u5DE5\u7A0B\u524D\uFF0CCoding Agent \u5FC5\u987B\u5148\u8BE2\u95EE\u5F00\u53D1\u8005\u4F7F\u7528\u54EA\u4E2A Runtime \u7248\u672C\u3002CLI \u4ECE npm \u52A8\u6001\u8FD4\u56DE\u7A33\u5B9A\u7248\u3001dev \u7248\u4E0E\u5DF2\u53D1\u5E03\u7248\u672C\u5217\u8868\uFF0C\u7528\u6237\u786E\u8BA4\u540E\u4F20 --runtime-version\uFF1B\u4E0D\u80FD\u81EA\u884C\u9ED8\u8BA4 dev \u6216 latest\u3002\u5DF2\u6709\u5DE5\u7A0B\u6CBF\u7528\u51C6\u786E\u4F9D\u8D56\uFF0C\u5207\u6362\u524D\u5148\u786E\u8BA4\u5E76\u9002\u914D\u3002
3429
+ SIT CLI \u7EDF\u4E00\u4F7F\u7528\u516C\u5171 npm dev \u6807\u7B7E\u6307\u5411\u7684\u6700\u65B0 Runtime\uFF0C\u4E0D\u63D0\u4F9B Runtime \u7248\u672C\u9009\u62E9\uFF0C\u4E5F\u4E0D\u518D\u8BE2\u95EE\u5F00\u53D1\u8005\u9009\u62E9 Runtime\u3002\u65B0\u5DE5\u7A0B\u81EA\u52A8\u9501\u5B9A\u67E5\u8BE2\u5F97\u5230\u7684\u51C6\u786E\u7248\u672C\u548C\u9501\u6587\u4EF6\uFF1B\u5DF2\u6709\u5DE5\u7A0B\u9700\u8981\u66F4\u65B0\u4F9D\u8D56\u3001\u9002\u914D\u4E1A\u52A1\u5E76\u9A8C\u8BC1\u540E\u518D\u542F\u52A8\u6216\u4E0A\u4F20\u3002\u6A21\u578B\u4ECD\u987B\u7531\u5F00\u53D1\u8005\u660E\u786E\u786E\u8BA4\u3002
3424
3430
  \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
3425
3431
 
3426
3432
  ${implementationGuide()}
@@ -3438,7 +3444,7 @@ function cliHelp(_options = {}) {
3438
3444
  // packages/cli-core/src/dev/local-stop.ts
3439
3445
  import { execFile as execFile5 } from "node:child_process";
3440
3446
  import { promisify as promisify5 } from "node:util";
3441
- import { readFile as readFile15, readdir as readdir4, realpath as realpath5, rmdir as rmdir3, unlink as unlink8 } from "node:fs/promises";
3447
+ import { readFile as readFile15, readdir as readdir4, realpath as realpath6, rmdir as rmdir3, unlink as unlink8 } from "node:fs/promises";
3442
3448
  import { join as join17 } from "node:path";
3443
3449
  import { setTimeout as delay } from "node:timers/promises";
3444
3450
 
@@ -3648,7 +3654,7 @@ async function processIdentity(pid) {
3648
3654
 
3649
3655
  // packages/cli-core/src/dev/instance-lock.ts
3650
3656
  import { createServer as createServer2 } from "node:http";
3651
- import { realpath as realpath4 } from "node:fs/promises";
3657
+ import { realpath as realpath5 } from "node:fs/promises";
3652
3658
  import { createHash as createHash5, randomBytes as randomBytes2 } from "node:crypto";
3653
3659
  import { homedir as homedir3 } from "node:os";
3654
3660
  import { join as join16 } from "node:path";
@@ -3695,7 +3701,7 @@ async function acquireDevInstanceLock(options) {
3695
3701
  key: path.split("/").at(-1),
3696
3702
  busyError: alreadyRunningError,
3697
3703
  ownerData: {
3698
- ...options.projectRoot ? { projectRoot: await realpath4(options.projectRoot) } : {},
3704
+ ...options.projectRoot ? { projectRoot: await realpath5(options.projectRoot) } : {},
3699
3705
  ...address && typeof address !== "string" ? { control: { port: address.port, token } } : {}
3700
3706
  },
3701
3707
  runtimeData: async (pid) => ({ runtimeIdentity: await processIdentity(pid) })
@@ -3742,8 +3748,8 @@ async function stopLocalDev(options) {
3742
3748
  const source = await readFile15(ownerPath, "utf8");
3743
3749
  const owner = JSON.parse(source);
3744
3750
  if (!validPid2(owner.pid) || owner.runtimePid !== void 0 && !validPid2(owner.runtimePid)) throw failure("DEV \u9501\u4E2D\u7684 PID \u65E0\u6548\u3002");
3745
- const root = await realpath5(options.projectRoot);
3746
- if (owner.projectRoot && await realpath5(owner.projectRoot) !== root) throw failure(`\u6B64\u642D\u5B50\u7684 DEV \u5C5E\u4E8E\u53E6\u4E00\u4E2A\u5DE5\u7A0B\u76EE\u5F55\uFF1A${owner.projectRoot}\u3002\u8BF7\u5728\u8BE5\u76EE\u5F55\u6267\u884C dev stop\u3002`);
3751
+ const root = await realpath6(options.projectRoot);
3752
+ if (owner.projectRoot && await realpath6(owner.projectRoot) !== root) throw failure(`\u6B64\u642D\u5B50\u7684 DEV \u5C5E\u4E8E\u53E6\u4E00\u4E2A\u5DE5\u7A0B\u76EE\u5F55\uFF1A${owner.projectRoot}\u3002\u8BF7\u5728\u8BE5\u76EE\u5F55\u6267\u884C dev stop\u3002`);
3747
3753
  if (alive2(owner.pid)) {
3748
3754
  const control = owner.control;
3749
3755
  if (!control || !Number.isInteger(control.port) || control.port < 1 || control.port > 65535 || !/^[a-f0-9]{64}$/u.test(control.token)) {
@@ -3765,7 +3771,7 @@ async function stopLocalDev(options) {
3765
3771
  if (Number(uid) !== process.getuid?.() || Number(group) !== pid) throw failure(`PID ${pid} \u4E0D\u662F\u5F53\u524D\u7528\u6237\u7684\u72EC\u7ACB Runtime \u8FDB\u7A0B\u7EC4\uFF0C\u672A\u7EC8\u6B62\u8BE5\u8FDB\u7A0B\u3002`);
3766
3772
  if (!owner.runtimeIdentity) {
3767
3773
  const cwd = (await exec("/usr/sbin/lsof", ["-a", "-p", String(pid), "-d", "cwd", "-Fn"])).stdout.split("\n").find((line) => line.startsWith("n"))?.slice(1);
3768
- if (!cwd || await realpath5(cwd) !== root || !identity.endsWith(` ${join17(root, "start.mjs")}`) || !/\bnode\s/u.test(identity)) throw failure(`\u65E0\u6CD5\u786E\u8BA4\u65E7 Runtime\uFF08PID ${pid}\uFF09\u5C5E\u4E8E\u5F53\u524D\u5DE5\u7A0B\uFF0C\u672A\u7EC8\u6B62\u8BE5\u8FDB\u7A0B\u3002`);
3774
+ if (!cwd || await realpath6(cwd) !== root || !identity.endsWith(` ${join17(root, "start.mjs")}`) || !/\bnode\s/u.test(identity)) throw failure(`\u65E0\u6CD5\u786E\u8BA4\u65E7 Runtime\uFF08PID ${pid}\uFF09\u5C5E\u4E8E\u5F53\u524D\u5DE5\u7A0B\uFF0C\u672A\u7EC8\u6B62\u8BE5\u8FDB\u7A0B\u3002`);
3769
3775
  }
3770
3776
  if (await readFile15(ownerPath, "utf8") !== source || await processIdentity(pid) !== identity || alive2(owner.pid)) throw failure("DEV \u8FDB\u7A0B\u72B6\u6001\u5DF2\u6539\u53D8\uFF0C\u8BF7\u91CD\u65B0\u6267\u884C dev stop\u3002");
3771
3777
  try {
@@ -4115,7 +4121,7 @@ var RuntimeReadiness = class {
4115
4121
 
4116
4122
  // packages/cli-core/src/dev/orchestrator.ts
4117
4123
  import { createHash as createHash7 } from "node:crypto";
4118
- import { readFile as readFile19 } from "node:fs/promises";
4124
+ import { readFile as readFile18 } from "node:fs/promises";
4119
4125
  import { join as join20, resolve as resolve12 } from "node:path";
4120
4126
  import { stripVTControlCharacters as stripVTControlCharacters2 } from "node:util";
4121
4127
 
@@ -4123,7 +4129,7 @@ import { stripVTControlCharacters as stripVTControlCharacters2 } from "node:util
4123
4129
  import { watch } from "node:fs";
4124
4130
  import { createHash as createHash6 } from "node:crypto";
4125
4131
  import { readFile as readFile16, readdir as readdir5 } from "node:fs/promises";
4126
- import { join as join18, resolve as resolve9 } from "node:path";
4132
+ import { join as join18, resolve as resolve10 } from "node:path";
4127
4133
  import { setTimeout as sleep } from "node:timers/promises";
4128
4134
  var digest2 = (contents) => createHash6("sha256").update(contents).digest("hex");
4129
4135
  async function snapshot(root, prefix = "", result = /* @__PURE__ */ new Map()) {
@@ -4175,7 +4181,7 @@ var ReloadingDevSession = class {
4175
4181
  if (options.reloadDebounceMs !== void 0 && (!Number.isSafeInteger(options.reloadDebounceMs) || options.reloadDebounceMs < 1)) throw new TypeError("reloadDebounceMs must be a positive integer");
4176
4182
  this.#options = options;
4177
4183
  this.#startProcess = startProcess;
4178
- this.projectRoot = resolve9(options.projectRoot);
4184
+ this.projectRoot = resolve10(options.projectRoot);
4179
4185
  this.devAgentId = options.devAgentId;
4180
4186
  this.completion = new Promise((resolveCompletion) => {
4181
4187
  this.#resolve = resolveCompletion;
@@ -4404,74 +4410,13 @@ function startReloadingDev(options, startProcess) {
4404
4410
  return new ReloadingDevSession(options, startProcess).start();
4405
4411
  }
4406
4412
 
4407
- // packages/cli-core/src/config/runtime-policy.ts
4408
- import { readFile as readFile17, realpath as realpath6 } from "node:fs/promises";
4409
- import { createRequire as createRequire2 } from "node:module";
4410
- import { resolve as resolve10 } from "node:path";
4411
- var RuntimeRequirementError = class extends Error {
4412
- constructor(code2, message, options) {
4413
- super(message, options);
4414
- this.code = code2;
4415
- this.name = "RuntimeRequirementError";
4416
- }
4417
- code;
4418
- };
4419
- function assertRequiredRuntime(actual, expected) {
4420
- if (actual === expected) return;
4421
- throw new RuntimeRequirementError(
4422
- "RUNTIME_VERSION_MISMATCH",
4423
- `\u5DF2\u963B\u6B62\u8FD0\u884C\u6216\u4E0A\u4F20\uFF1A\u5DE5\u7A0B Runtime ${actual ?? "\u672A\u9501\u5B9A\u51C6\u786E\u7248\u672C"}\uFF0C\u672C\u6B21\u8981\u6C42\u7248\u672C ${expected}\u3002\u5FC5\u987B\u4F7F\u7528\u5B8C\u5168\u4E00\u81F4\u7684\u7248\u672C\u3002
4424
- \u8BF7\u7531\u4F60\u6216\u5F00\u53D1 Agent \u66F4\u65B0\u4F9D\u8D56\u548C\u9501\u6587\u4EF6\uFF0C\u9002\u914D\u542F\u52A8\u53C2\u6570\u3001\u6A21\u578B\u3001datasets\u3001\u5DE5\u5177\u53CA Hook \u540E\u91CD\u8BD5\u3002
4425
- npm install --save-exact ${BUDDY_RUNTIME_PACKAGE}@${expected} --registry=${RUNTIME_REGISTRY} --@my-life-buddies:registry=${RUNTIME_REGISTRY}`
4426
- );
4427
- }
4428
- function assertNpmRuntimeLock(contents, expected) {
4429
- const lock = JSON.parse(contents);
4430
- const installed2 = lock.lockfileVersion === 1 ? lock.dependencies?.[BUDDY_RUNTIME_PACKAGE] : lock.packages?.[`node_modules/${BUDDY_RUNTIME_PACKAGE}`];
4431
- if (installed2?.version !== expected || lock.lockfileVersion !== 1 && runtimeDependencyVersion(lock.packages?.[""]) !== expected) {
4432
- throw new RuntimeRequirementError("RUNTIME_DEPENDENCY_INVALID", `package-lock.json \u7684 Runtime \u4E0E\u8981\u6C42\u7684 ${expected} \u4E0D\u4E00\u81F4\u3002\u8BF7\u66F4\u65B0\u9501\u6587\u4EF6\u5E76\u91CD\u65B0\u5B89\u88C5\u4F9D\u8D56\u540E\u91CD\u8BD5\u3002`);
4433
- }
4434
- }
4435
- async function requireProjectRuntime(root, options = {}) {
4436
- const declared = await projectRuntimeVersion(root);
4437
- if (!declared) throw new RuntimeRequirementError("RUNTIME_DEPENDENCY_INVALID", "\u5DE5\u7A0B\u5FC5\u987B\u5728 package.json \u58F0\u660E Runtime \u7684\u51C6\u786E\u7248\u672C\uFF1B\u8BF7\u5148\u9009\u62E9\u7248\u672C\u5E76\u5B89\u88C5\u4F9D\u8D56\u548C\u9501\u6587\u4EF6\uFF0C\u4E0D\u80FD\u4F7F\u7528 dev\u3001latest \u6216\u7248\u672C\u8303\u56F4\u4F5C\u4E3A\u5DE5\u7A0B\u4F9D\u8D56\u3002");
4438
- let expected;
4439
- try {
4440
- expected = await resolveRuntimeVersion(declared, options);
4441
- } catch (cause) {
4442
- options.signal?.throwIfAborted();
4443
- throw new RuntimeRequirementError("RUNTIME_CHECK_FAILED", `\u65E0\u6CD5\u786E\u8BA4 npm \u5DE5\u7A0B\u9009\u5B9A\u7684 Runtime ${declared}\uFF0C\u5DF2\u963B\u6B62\u8FD0\u884C\u6216\u4E0A\u4F20\uFF1A${cause instanceof Error ? cause.message : String(cause)}\u3002\u8BF7\u6062\u590D\u8FDE\u63A5\u540E\u91CD\u8BD5\u3002`, { cause });
4444
- }
4445
- try {
4446
- assertRequiredRuntime(await projectRuntimeVersion(root), expected);
4447
- const installedPath = await realpath6(resolve10(root, "node_modules", BUDDY_RUNTIME_PACKAGE, "package.json"));
4448
- const fromProject = createRequire2(resolve10(root, "package.json")).resolve(`${BUDDY_RUNTIME_PACKAGE}/package.json`);
4449
- if (await realpath6(fromProject) !== installedPath) throw new Error("Runtime \u5FC5\u987B\u5B89\u88C5\u5728\u5F53\u524D\u5DE5\u7A0B\u4E2D");
4450
- const installed2 = JSON.parse(await readFile17(installedPath, "utf8"));
4451
- if (installed2.version !== expected) throw new Error(`Runtime \u5B9E\u9645\u5B89\u88C5 ${installed2.version}\uFF0C\u8981\u6C42 ${expected}`);
4452
- let lock;
4453
- try {
4454
- lock = await readFile17(resolve10(root, "package-lock.json"), "utf8");
4455
- } catch (cause) {
4456
- if (cause.code !== "ENOENT") throw cause;
4457
- }
4458
- if (lock !== void 0) assertNpmRuntimeLock(lock, expected);
4459
- options.signal?.throwIfAborted();
4460
- return expected;
4461
- } catch (cause) {
4462
- options.signal?.throwIfAborted();
4463
- if (cause instanceof RuntimeRequirementError) throw cause;
4464
- throw new RuntimeRequirementError("RUNTIME_DEPENDENCY_INVALID", `Runtime \u4F9D\u8D56\u6821\u9A8C\u5931\u8D25\uFF1A${cause instanceof Error ? cause.message : String(cause)}\u3002\u8BF7\u66F4\u65B0\u4F9D\u8D56\u53CA\u9501\u6587\u4EF6\u5E76\u5B89\u88C5\uFF1Bnpm \u5DE5\u7A0B\u53EF\u8FD0\u884C npm ci\u3002`, { cause });
4465
- }
4466
- }
4467
-
4468
4413
  // packages/cli-core/src/dev/launch.ts
4469
4414
  import { lstatSync, readFileSync as readFileSync2 } from "node:fs";
4470
4415
  import { createRequire as createRequire3 } from "node:module";
4471
4416
  import { dirname as dirname4, resolve as resolve11 } from "node:path";
4472
4417
 
4473
4418
  // packages/cli-core/src/config/data-access.ts
4474
- import { lstat as lstat11, readFile as readFile18 } from "node:fs/promises";
4419
+ import { lstat as lstat11, readFile as readFile17 } from "node:fs/promises";
4475
4420
  import { join as join19 } from "node:path";
4476
4421
  var DATA_ACCESS_FILENAME = "data-access.json";
4477
4422
  function parseDataAccessRequirements(source) {
@@ -4503,7 +4448,7 @@ async function readDataAccessRequirements(projectRoot) {
4503
4448
  const path = join19(projectRoot, DATA_ACCESS_FILENAME);
4504
4449
  try {
4505
4450
  if (!(await lstat11(path)).isFile()) throw new Error(`${DATA_ACCESS_FILENAME} \u5FC5\u987B\u662F\u666E\u901A\u6587\u4EF6`);
4506
- return parseDataAccessRequirements(await readFile18(path, "utf8"));
4451
+ return parseDataAccessRequirements(await readFile17(path, "utf8"));
4507
4452
  } catch (cause) {
4508
4453
  if (cause.code === "ENOENT") return [];
4509
4454
  throw cause;
@@ -4855,7 +4800,7 @@ async function startBuddyDevProcess(options, hooks) {
4855
4800
  let config;
4856
4801
  let configSource;
4857
4802
  try {
4858
- configSource = await readFile19(join20(projectRoot, BUDDY_PACKAGE_FILENAME), "utf8");
4803
+ configSource = await readFile18(join20(projectRoot, BUDDY_PACKAGE_FILENAME), "utf8");
4859
4804
  config = combineBuddyProject(parseBuddyAgentConfig(configSource));
4860
4805
  } catch (cause) {
4861
4806
  throw new BuddyDevError({
@@ -5185,7 +5130,7 @@ var DEV_COMMAND_HELP = `\u7528\u6CD5:
5185
5130
  \u672A\u914D\u7F6E\u5730\u5740\u65F6\u8FDE\u63A5 MLB \u6D4B\u8BD5\u73AF\u5883 ${DEFAULT_MLB_TEST_URL}\uFF08HTTPS\uFF09\u3002
5186
5131
  SIT \u7248\u56FA\u5B9A\u8FDE\u63A5 SIT\uFF1B\u5730\u5740\u53C2\u6570\u53EA\u6821\u9A8C\u56FA\u5B9A\u76EE\u6807\uFF0C\u4E0D\u80FD\u5207\u6362\u5E73\u53F0\u3002Runtime \u7F51\u5173\u7531 CLI \u6CE8\u5165\u3002
5187
5132
  \u542F\u52A8\u524D\u81EA\u68C0 .env \u7F51\u5173\uFF1B\u53D1\u73B0\u5176\u4ED6\u73AF\u5883\u5730\u5740\u65F6\u505C\u6B62\uFF1B\u8BF7\u4F7F\u7528\u5BF9\u5E94 CLI\uFF0C\u8FC1\u79FB\u65F6\u65B0\u5EFA\u8EAB\u4EFD\u4E14\u4E0D\u590D\u5236\u51ED\u636E\u3002
5188
- CLI \u7EDF\u4E00\u542F\u52A8\u5E76\u7BA1\u7406\u5DE5\u7A0B\u4E2D\u7684\u5B98\u65B9 Runtime\uFF1B\u6BCF\u6B21\u542F\u52A8\u6216\u91CD\u8F7D\u68C0\u67E5\u5DE5\u7A0B\u9009\u5B9A Runtime \u7684\u51C6\u786E\u7248\u672C\u3001\u5B89\u88C5\u548C\u9501\u6587\u4EF6\u3002
5133
+ CLI \u7EDF\u4E00\u542F\u52A8\u5E76\u7BA1\u7406\u5DE5\u7A0B\u4E2D\u7684\u5B98\u65B9 Runtime\uFF1B\u6BCF\u6B21\u542F\u52A8\u6216\u91CD\u8F7D\u68C0\u67E5\u5DE5\u7A0B Runtime \u7684\u51C6\u786E\u7248\u672C\u3001\u5B89\u88C5\u548C\u9501\u6587\u4EF6\u4E0E npm dev \u6700\u65B0\u7248\u672C\u4E00\u81F4\u3002
5189
5134
  DEV \u4F1A\u901A\u8FC7\u6D4F\u89C8\u5668\u767B\u5F55\u83B7\u53D6\u5F00\u53D1\u8005\u4F1A\u8BDD\uFF0C\u5C06\u5F53\u524D\u642D\u5B50\u7684\u5F00\u53D1 Token \u5199\u5165\u5DE5\u7A0B .env\uFF0C\u590D\u7528\u524D\u5411 Server \u6838\u5BF9\u6240\u5C5E\u642D\u5B50\uFF1B\u767B\u5F55\u51ED\u636E\u4ECD\u4F7F\u7528\u7CFB\u7EDF\u51ED\u636E\u5B58\u50A8\u3002
5190
5135
  \u8EAB\u4EFD\u53EA\u8BFB\u53D6 package.json.buddyId\uFF0C.env \u4E0D\u9700\u8981 BUDDY_ID\u3002
5191
5136
  --refresh-token \u91CD\u65B0\u9886\u53D6\u5DF2\u6709\u5F00\u53D1 Token\uFF0C\u7528\u4E8E\u540C\u4E00\u73AF\u5883\u670D\u52A1\u7AEF\u91CD\u7F6E\u540E\u7684\u672C\u673A\u66F4\u65B0\uFF1B\u4E0D\u80FD\u5207\u6362\u5E73\u53F0\uFF0C\u4E0D\u4F1A\u751F\u6210\u65B0\u5BC6\u94A5\u3002`;
@@ -7804,7 +7749,7 @@ async function createPushPreflight(options) {
7804
7749
 
7805
7750
  // packages/cli-core/src/push/bundle.ts
7806
7751
  import { createHash as createHash11 } from "node:crypto";
7807
- import { lstat as lstat14, readFile as readFile20, realpath as realpath9 } from "node:fs/promises";
7752
+ import { lstat as lstat14, readFile as readFile19, realpath as realpath9 } from "node:fs/promises";
7808
7753
  import { join as join23, relative as relative3, sep as sep3, win32 as win324 } from "node:path";
7809
7754
  import { Writable } from "node:stream";
7810
7755
  import { pipeline } from "node:stream/promises";
@@ -7835,7 +7780,7 @@ async function capture(root, file) {
7835
7780
  }
7836
7781
  const canonical = await realpath9(absolute);
7837
7782
  if (!inside(root, canonical)) changed(file.path, `\u63D0\u4EA4\u6587\u4EF6\u8D8A\u8FC7\u9879\u76EE\u6839\u76EE\u5F55\uFF1A${file.path}`);
7838
- const contents = await readFile20(absolute);
7783
+ const contents = await readFile19(absolute);
7839
7784
  if (contents.byteLength !== file.bytes || digest3(contents) !== file.digest) {
7840
7785
  changed(file.path, `\u63D0\u4EA4\u524D\u6587\u4EF6\u5185\u5BB9\u53D1\u751F\u53D8\u5316\uFF1A${file.path}`);
7841
7786
  }
@@ -8052,8 +7997,7 @@ function parseInitArguments(args) {
8052
7997
  parsed.creatorVersion = setOnce2(parsed.creatorVersion, value, flag2);
8053
7998
  break;
8054
7999
  case "--runtime-version":
8055
- parsed.runtimeVersion = setOnce2(parsed.runtimeVersion, value, flag2);
8056
- break;
8000
+ throw new CliUsageError("SIT CLI \u4E0D\u652F\u6301 --runtime-version\uFF1B\u7EDF\u4E00\u4F7F\u7528 npm dev \u6700\u65B0 Runtime\u3002");
8057
8001
  case "--avatar":
8058
8002
  parsed.avatar = setOnce2(parsed.avatar, value, flag2);
8059
8003
  break;
@@ -8143,13 +8087,13 @@ async function initializeProjectRoute(route, args, io, options, application) {
8143
8087
  const initializationTarget = { directory: rootDirectory, kind: "new" };
8144
8088
  let initializationPlan = options.initializeProject ? void 0 : await planBuddyProjectInitialization(initializationTarget);
8145
8089
  const existingBuddyId = initializationPlan?.existingManifest?.buddyId;
8146
- const runtimeVersion = args.resolvedRuntimeVersion ?? await selectInitRuntime(rootDirectory, args.runtimeVersion, io, options.runtimeCatalog);
8090
+ const runtimeVersion = args.resolvedRuntimeVersion ?? await resolveInitRuntime(rootDirectory, options.runtimeCatalog);
8147
8091
  if (existingBuddyId !== void 0 && args.buddyId !== void 0 && existingBuddyId !== args.buddyId) {
8148
8092
  throw new CliUsageError(
8149
8093
  `\u5DF2\u6709 package.json \u7ED1\u5B9A\u7684\u662F ${existingBuddyId}\uFF0C\u4E0E --buddy-id ${args.buddyId} \u4E0D\u4E00\u81F4`
8150
8094
  );
8151
8095
  }
8152
- const modelSelection = await (options.selectInitModel ?? selectInitModel)(rootDirectory, args.model, io, { ...options.runtimeCatalog, runtimeVersion });
8096
+ const modelSelection = await (options.selectInitModel ?? selectInitModel)(rootDirectory, args.model, io, { ...options.runtimeCatalog, expectedRuntimeVersion: runtimeVersion });
8153
8097
  const requestedBuddyId = existingBuddyId ?? args.buddyId;
8154
8098
  const buddyId = await resolveApplicationDraft(name, tagline, intro, requestedBuddyId, options, rootDirectory, { ...args, mode: "direct" }, io);
8155
8099
  if (buddyId === void 0) return { exitCode: 2, route };
@@ -8169,7 +8113,7 @@ async function initializeProjectRoute(route, args, io, options, application) {
8169
8113
  try {
8170
8114
  platformTemplate = options.scaffoldPlatformAgent ? await options.scaffoldPlatformAgent(project.rootDirectory, name, runtimeVersion) : await scaffoldPlatformAgent(project.rootDirectory, name, {
8171
8115
  model: modelSelection?.model,
8172
- resolveDependencies: async (template) => checkModelTemplate(await latestRuntimeTemplate(template, { ...options.runtimeCatalog, runtimeVersion, report: options.runtimeCatalog?.report ?? ((message) => io.writeError(message)) }), modelSelection)
8116
+ resolveDependencies: async (template) => checkModelTemplate(await latestRuntimeTemplate(template, { ...options.runtimeCatalog, report: options.runtimeCatalog?.report ?? ((message) => io.writeError(message)) }), modelSelection)
8173
8117
  });
8174
8118
  } catch (cause) {
8175
8119
  const detail = cause instanceof Error ? cause.message : String(cause);
@@ -8358,9 +8302,6 @@ async function runBuddyCli(args, io, options = {}) {
8358
8302
  return { exitCode: 0 };
8359
8303
  }
8360
8304
  let route = routeFromMode(parsed.mode);
8361
- if (parsed.runtimeVersion !== void 0) {
8362
- if (parsed.mode !== "direct") throw new CliUsageError("--runtime-version \u7528\u4E8E --mode direct \u751F\u6210 Runtime \u5DE5\u7A0B\uFF1Bcreate \u68B3\u7406\u5B8C\u6210\u540E\u5728\u8FDB\u5165 direct \u65F6\u9009\u62E9\u7248\u672C\u3002");
8363
- }
8364
8305
  if (route === void 0 && !io.canPrompt) requireModeForNonInteractive();
8365
8306
  const cwd = resolve18(options.cwd ?? process.cwd());
8366
8307
  await assertInitializableBuddyTarget(cwd);
@@ -8372,7 +8313,7 @@ async function runBuddyCli(args, io, options = {}) {
8372
8313
  if (route === "direct-create" && (!io.canPrompt || parsed.directory !== void 0)) {
8373
8314
  const target = resolve18(cwd, parsed.directory ?? (parsed.name ? defaultProjectDirectory(parsed.name) : "."));
8374
8315
  if (!options.initializeProject) await planBuddyProjectInitialization({ directory: target, kind: "new" });
8375
- parsed.resolvedRuntimeVersion = await selectInitRuntime(target, parsed.runtimeVersion, io, options.runtimeCatalog);
8316
+ parsed.resolvedRuntimeVersion = await resolveInitRuntime(target, options.runtimeCatalog);
8376
8317
  }
8377
8318
  await authenticate(options);
8378
8319
  await resumeProjectArguments(parsed, cwd, options, io);
@@ -8389,7 +8330,7 @@ async function runBuddyCli(args, io, options = {}) {
8389
8330
  io.writeError("\u5DF2\u53D6\u6D88\uFF1B\u5DF2\u4FDD\u5B58\u7684\u672C\u5730\u8349\u7A3F\u548C\u5DF2\u6709\u642D\u5B50\u8D44\u6599\u4F1A\u4FDD\u7559\uFF0C\u672A\u786E\u8BA4\u7684\u8D44\u6599\u4E0D\u4F1A\u767B\u8BB0\u3002");
8390
8331
  return { exitCode: 130 };
8391
8332
  }
8392
- if (cause instanceof BuddyDevError || cause instanceof ModelSelectionError || cause instanceof MetaPreparationError || cause instanceof RuntimeSelectionError || cause instanceof CliUsageError || cause instanceof BuddyConfigValidationError || cause instanceof ProjectInitializationError || cause instanceof BuddyProjectContextError || cause instanceof CloudLifecycleError) {
8333
+ if (cause instanceof BuddyDevError || cause instanceof ModelSelectionError || cause instanceof MetaPreparationError || cause instanceof RuntimeRequirementError || cause instanceof CliUsageError || cause instanceof BuddyConfigValidationError || cause instanceof ProjectInitializationError || cause instanceof BuddyProjectContextError || cause instanceof CloudLifecycleError) {
8393
8334
  return failure2(cause.message, io, cause instanceof CliUsageError);
8394
8335
  }
8395
8336
  throw cause;