@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/README.md +10 -10
- package/dist/bin/buddy.js +1 -1
- package/dist/bin/buddy.js.map +1 -1
- package/dist/bin/core.js +217 -276
- package/dist/bin/core.js.map +4 -4
- package/package.json +3 -3
- package/resources/agent-template/package-lock.json +5 -4
- package/resources/agent-template/package.json +1 -1
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
|
-
|
|
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\
|
|
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
|
|
136
|
-
import { join as
|
|
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\
|
|
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(
|
|
1288
|
-
const version =
|
|
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
|
|
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\
|
|
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
|
|
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/
|
|
1528
|
-
|
|
1529
|
-
};
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
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
|
|
1580
|
-
import { join as
|
|
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
|
|
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
|
-
|
|
1590
|
-
const
|
|
1591
|
-
|
|
1592
|
-
|
|
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
|
-
|
|
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
|
|
1631
|
-
|
|
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\
|
|
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/
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
1665
|
-
|
|
1666
|
-
if (!
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
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
|
|
1684
|
+
return { model, runtimeVersion: catalog.runtimeVersion };
|
|
1679
1685
|
} catch (cause) {
|
|
1680
|
-
|
|
1681
|
-
|
|
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
|
|
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
|
|
1904
|
-
import { dirname, join as join12, resolve as
|
|
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 =
|
|
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
|
|
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 =
|
|
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 =
|
|
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
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
2083
|
-
|
|
2084
|
-
|
|
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 =
|
|
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"
|
|
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(
|
|
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 \
|
|
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
|
|
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 =
|
|
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"
|
|
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(
|
|
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 \
|
|
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
|
|
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(
|
|
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
|
|
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\
|
|
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\
|
|
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\
|
|
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\
|
|
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\
|
|
3320
|
-
datasets \u67E5\u770B\
|
|
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
|
-
|
|
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 --
|
|
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\
|
|
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
|
-
\
|
|
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
|
|
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
|
|
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
|
|
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
|
|
3746
|
-
if (owner.projectRoot && await
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
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;
|