@my-life-buddies/cli 0.27.1-dev.1 → 0.27.1-dev.2
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 +7 -13
- package/dist/bin/core.js +44 -32
- package/dist/bin/core.js.map +3 -3
- package/package.json +3 -3
- package/resources/README.md +2 -2
package/README.md
CHANGED
|
@@ -292,15 +292,9 @@ buddy-cli-sit init --mode create --directory ./study-buddy \
|
|
|
292
292
|
→ 基础技术自测 → 打开真实预览 → 开发者体验并反馈
|
|
293
293
|
```
|
|
294
294
|
|
|
295
|
-
CLI 0.15.0 起,Creator 使用独立 npm 包 `@my-life-buddies/buddy-creator-skill
|
|
295
|
+
CLI 0.15.0 起,Creator 使用独立 npm 包 `@my-life-buddies/buddy-creator-skill`。每次进入或恢复创作都查询公共 npm latest 最新正式版,校验后缓存到 `~/.cache/buddy-cli-sit/creator-skills/buddy-creator-skill/<版本>/`,在 `.buddy/creator/skill-lock.json` 记录本次准确版本与完整性摘要。只有查证缓存对应最新版后才复用;版本记录不会阻止升级,恢复时也需要联网。Skill 负责人独立发包,不再要求重发 CLI。
|
|
296
296
|
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
```bash
|
|
300
|
-
buddy-cli-sit init --mode create --directory ./study-buddy --creator-version 1.6.0
|
|
301
|
-
```
|
|
302
|
-
|
|
303
|
-
CLI 只接受协议兼容的准确稳定版本,保留原始背景、身份与作品。未改动的旧版生成接续说明会备份后迁移;开发者自定义说明不覆盖。新项目下载失败会报错并保留登记身份,可在同目录重试。
|
|
297
|
+
不再提供 `--creator-version` 固定版本入口。CLI 查询 latest 后验证协议及完整性,保留原始背景、身份与作品。未改动的旧版生成接续说明会备份后迁移;开发者自定义说明不覆盖。查询、下载或协议校验失败都会报错,不退回旧缓存;已有资料和登记身份保留,可在同目录重试。
|
|
304
298
|
|
|
305
299
|
维护者本地联调:
|
|
306
300
|
|
|
@@ -309,11 +303,11 @@ BUDDY_CREATOR_SKILL_PATH=/absolute/path/buddy-creator-skill \
|
|
|
309
303
|
buddy-cli-sit init --mode create --directory ./study-buddy
|
|
310
304
|
```
|
|
311
305
|
|
|
312
|
-
|
|
306
|
+
本地来源同样记录在项目中,仅用于显式 Skill 联调,不要求发布。每次联调都需要提供该环境变量;清除后会查询公共 npm latest,不因旧的本地版本记录继续使用本地目录。Python 执行仍需 3.9+,不安装 Python 第三方依赖。阶段与创作规则由 Skill 的 `references/cli-workflow.md` 管理,CLI 只处理身份、目录和有效交付后的开发接续。
|
|
313
307
|
|
|
314
|
-
创作资料保存在 `.buddy/creator/`。CLI 支持 Creator 接入协议 1 和 2
|
|
308
|
+
创作资料保存在 `.buddy/creator/`。CLI 支持 Creator 接入协议 1 和 2;最新版 Creator 统一使用 `workflowVersion=2` 的三册(定位、知识与方法、付费服务);旧四册由 Creator 的 open 保存历史后迁移,复用资料与可用进度,补充缺口并重新确认发生变化的内容,不把旧完成标记直接当作新交付。按该作品工作流完成手册、小挂件清单、当前原型和设计验收,并通过交付校验,Skill 才返回 `directive=creator_complete`、`completion.status=ready` 和有效的 `completion.manualPath`;明确确认不使用小挂件时无需制造原型。完整创建任务中,当前 Coding Agent 退出采访,在同一轮重新读取 `HANDOFF.md`、真实手册、同目录实际 manifest、来源映射及小挂件设计与验收产物,自动开始开发,无需再说“继续”。不按旧四册文件名硬编码交付清单;手册确认或文件存在不能单独触发开发。只有影响实现的关键缺口才补问;仅设计、流程测试和暂停仍遵守原范围。
|
|
315
309
|
|
|
316
|
-
|
|
310
|
+
新版三册还需读取 `completion.capabilityContractPath` 指向的能力契约,按 Skill 的 `references/implementation-handoff.md` 保存 `implementation-report.json`,记录当前契约版本、逐需求实现和真实验证证据,再运行 `handoff-check`。该命令只核对报告结构、版本及覆盖,仍需实际 Runtime 验证;迁移后的项目也须通过当前三册交付校验。「平台能力」中的方案来自 `service.blueprint.data.capabilityPlan`;旧资料迁移时可读取 `proactiveReminders`,方案展示不代表已经启用。
|
|
317
311
|
|
|
318
312
|
手册中的角色、方法、处理路径和持续服务要求,都是开发依据。Coding Agent 按这些要求判断是否需要工具、专业方法、特定处理步骤、记忆与历史整理,技术选择不逐项交给开发者;完成后向开发者简要说明需求来源、实现位置、检查结果和缺口,不要求额外生成 README。已经明确的直接做,不能实现的如实说明;只有元数据或默认配置,不代表手册要求已经完成。
|
|
319
313
|
|
|
@@ -323,7 +317,7 @@ BUDDY_CREATOR_SKILL_PATH=/absolute/path/buddy-creator-skill \
|
|
|
323
317
|
buddy-cli-sit init --mode direct --directory ./study-buddy
|
|
324
318
|
```
|
|
325
319
|
|
|
326
|
-
创作阶段的 `package.json` 只有顶层 `buddyId`;CLI
|
|
320
|
+
创作阶段的 `package.json` 只有顶层 `buddyId`;CLI 用它从平台读取最新资料并重新校验归属,不另建搭子。创作中断后在原目录重试 `--mode create`,检查最新 Creator 后接续原作品;手册完成后执行 `--mode direct`,保留已有业务代码与数据声明,补齐 npm 字段和缺失的工程文件;缺失 `data-access.json` 时生成空 requirements 数组。旧 `--mode interview` 已停止使用。
|
|
327
321
|
|
|
328
322
|
两条主线都遵循同一个登记规则:名称、`tagline`(一句话介绍)、`intro`(完整介绍)先同步到平台,返回的 ID 写入 `package.json.buddyId`。公开资料不在本地留副本。若平台已创建成功、本地写盘失败,可用 `--buddy-id <平台返回的 ID>` 恢复;它不是自定义 ID 的入口。
|
|
329
323
|
|
|
@@ -337,7 +331,7 @@ Creator 例外保留首次创作背景快照,用于接续同一作品;恢复
|
|
|
337
331
|
|
|
338
332
|
你明确要求自动体验或多场景回归时,Coding Agent 再按指定范围执行。`push` 仍需要明确授权。若你只要求初始化、修改某段代码或完成设计,也不会因为这套默认流程就自动启动预览。
|
|
339
333
|
|
|
340
|
-
这些规则通过 CLI 帮助、命令输出和 Creator 的 `HANDOFF.md` 交给 Coding Agent;CLI 不会在 `init`
|
|
334
|
+
这些规则通过 CLI 帮助、命令输出和 Creator 的 `HANDOFF.md` 交给 Coding Agent;CLI 不会在 `init` 内自动执行采访、编写业务代码或批量调用模型。重试创作时查询最新 Creator 并刷新生成的接续说明,保留原作品和开发者修改的文件。已有完整工程且保留 Creator 记录时,也可执行 `init --mode create` 接续创作,业务文件不会重建;没有 Creator 历史的直接开发工程继续按已有需求开发。
|
|
341
335
|
|
|
342
336
|
## 查看和修改搭子资料
|
|
343
337
|
|
package/dist/bin/core.js
CHANGED
|
@@ -240,7 +240,7 @@ function validSkillLock(value, protocolVersions2 = [1]) {
|
|
|
240
240
|
function checkProtocol(definition3, pkg) {
|
|
241
241
|
const protocol = pkg.buddySkill;
|
|
242
242
|
if (pkg.name !== definition3.name || !VERSION.test(pkg.version) || !protocol || !definition3.protocolVersions.includes(protocol.protocolVersion) || Object.entries(definition3.protocol).some(([key, value]) => protocol[key] !== value)) {
|
|
243
|
-
throw new Error(`${definition3.label} Skill \u7684\u63A5\u5165\u534F\u8BAE\u4E0D\u517C\u5BB9\uFF0C\u8BF7\u5347\u7EA7 CLI \u6216\u9009\u62E9\u517C\u5BB9\u7248\u672C\u3002`);
|
|
243
|
+
throw new Error(`${definition3.label} Skill \u7684\u63A5\u5165\u534F\u8BAE\u4E0D\u517C\u5BB9\uFF0C${definition3.alwaysLatest ? "\u8BF7\u5347\u7EA7 CLI \u540E\u91CD\u8BD5\uFF0C\u4E0D\u80FD\u9000\u56DE\u65E7\u7248\u672C" : "\u8BF7\u5347\u7EA7 CLI \u6216\u9009\u62E9\u517C\u5BB9\u7248\u672C"}\u3002`);
|
|
244
244
|
}
|
|
245
245
|
if ([pkg.dependencies, pkg.optionalDependencies].some((dependencies2) => dependencies2 && Object.keys(dependencies2).length)) {
|
|
246
246
|
throw new Error(`${definition3.label} Skill \u5FC5\u987B\u662F\u65E0\u5B89\u88C5\u4F9D\u8D56\u7684\u8D44\u6E90\u5305\u3002`);
|
|
@@ -279,9 +279,10 @@ async function cached(definition3, root, lock) {
|
|
|
279
279
|
}
|
|
280
280
|
async function resolveSkillPackage(definition3, previous, options = {}) {
|
|
281
281
|
if (previous && !validSkillLock(previous, definition3.protocolVersions)) throw new Error(`${definition3.label} \u7248\u672C\u8BB0\u5F55\u635F\u574F\uFF0C\u5DF2\u4FDD\u7559\u9879\u76EE\uFF0C\u8BF7\u68C0\u67E5 skill-lock.json\u3002`);
|
|
282
|
+
if (definition3.alwaysLatest && options.version !== void 0) throw new Error(`${definition3.versionFlag} \u5DF2\u505C\u6B62\u4F7F\u7528\uFF1B${definition3.label} \u6BCF\u6B21\u8FDB\u5165\u6216\u6062\u590D\u90FD\u4F7F\u7528\u516C\u5171 npm latest \u6700\u65B0\u6B63\u5F0F\u7248\u3002`);
|
|
282
283
|
if (options.version !== void 0 && !VERSION.test(options.version)) throw new Error(`${definition3.versionFlag} \u5FC5\u987B\u662F\u51C6\u786E\u7684\u7A33\u5B9A\u7248\u672C\u3002`);
|
|
283
284
|
if (options.localRoot && options.version) throw new Error(`\u672C\u5730 Skill \u8DEF\u5F84\u4E0E ${definition3.versionFlag} \u4E0D\u80FD\u540C\u65F6\u4F7F\u7528\u3002`);
|
|
284
|
-
const local = options.localRoot ?? (!options.version && previous?.source === "local" ? previous.path : void 0);
|
|
285
|
+
const local = options.localRoot ?? (!definition3.alwaysLatest && !options.version && previous?.source === "local" ? previous.path : void 0);
|
|
285
286
|
if (local) {
|
|
286
287
|
if (!isAbsolute(local)) throw new Error(`${definition3.pathEnvironment} \u5FC5\u987B\u662F\u7EDD\u5BF9\u8DEF\u5F84\u3002`);
|
|
287
288
|
const root = await realpath2(local);
|
|
@@ -292,7 +293,7 @@ async function resolveSkillPackage(definition3, previous, options = {}) {
|
|
|
292
293
|
return { root, lock: { source: "local", path: root, version: pkg2.version, protocolVersion } };
|
|
293
294
|
}
|
|
294
295
|
const cache = options.cacheDirectory ?? join2(homedir2(), ".cache", "buddy-cli-sit", definition3.cacheFolder);
|
|
295
|
-
const pinned = !options.version || options.version === previous?.version ? previous : void 0;
|
|
296
|
+
const pinned = !definition3.alwaysLatest && (!options.version || options.version === previous?.version) ? previous : void 0;
|
|
296
297
|
if (pinned?.source === "npm") {
|
|
297
298
|
const root = await cached(definition3, join2(cache, pinned.version), pinned);
|
|
298
299
|
if (root) return { root, lock: pinned };
|
|
@@ -300,11 +301,17 @@ async function resolveSkillPackage(definition3, previous, options = {}) {
|
|
|
300
301
|
options.signal?.throwIfAborted();
|
|
301
302
|
const version = options.version ?? pinned?.version ?? "latest";
|
|
302
303
|
options.report?.(`\u6B63\u5728\u67E5\u8BE2 ${definition3.label} Skill ${version}\u2026`);
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
304
|
+
let response;
|
|
305
|
+
try {
|
|
306
|
+
response = await (options.fetch ?? globalThis.fetch)(`${REGISTRY}${encodeURIComponent(definition3.name)}/${version}`, {
|
|
307
|
+
headers: { Accept: "application/json" },
|
|
308
|
+
redirect: "error",
|
|
309
|
+
signal: options.signal ? AbortSignal.any([options.signal, AbortSignal.timeout(15e3)]) : AbortSignal.timeout(15e3)
|
|
310
|
+
});
|
|
311
|
+
} catch {
|
|
312
|
+
options.signal?.throwIfAborted();
|
|
313
|
+
throw new Error(`\u65E0\u6CD5\u67E5\u8BE2 ${definition3.label} Skill ${version}\uFF0C\u8BF7\u68C0\u67E5 npm \u7F51\u7EDC\u540E\u91CD\u8BD5\uFF1B\u672A\u4F7F\u7528\u65E7\u7248\u672C\uFF0C\u5DF2\u6709\u4F5C\u54C1\u4F1A\u4FDD\u7559\u3002`);
|
|
314
|
+
}
|
|
308
315
|
if (!response.ok) throw new Error(`\u65E0\u6CD5\u83B7\u53D6 ${definition3.label} Skill\uFF08npm HTTP ${response.status}\uFF09\u3002\u8BF7\u68C0\u67E5\u7F51\u7EDC\u540E\u91CD\u8BD5\uFF0C\u5DF2\u6709\u4F5C\u54C1\u4F1A\u4FDD\u7559\u3002`);
|
|
309
316
|
const text2 = await response.text();
|
|
310
317
|
if (text2.length > 512 * 1024) throw new Error(`${definition3.label} npm \u5143\u6570\u636E\u8FC7\u5927\u3002`);
|
|
@@ -312,7 +319,8 @@ async function resolveSkillPackage(definition3, previous, options = {}) {
|
|
|
312
319
|
checkProtocol(definition3, pkg);
|
|
313
320
|
if (version !== "latest" && pkg.version !== version) throw new Error(`npm \u8FD4\u56DE\u4E86\u4E0D\u540C\u7684 ${definition3.label} \u7248\u672C\u3002`);
|
|
314
321
|
const lock = { source: "npm", version: pkg.version, integrity: pkg.dist?.integrity, protocolVersion: pkg.buddySkill.protocolVersion };
|
|
315
|
-
|
|
322
|
+
const expected = pinned ?? (previous?.source === "npm" && previous.version === lock.version ? previous : void 0);
|
|
323
|
+
if (!validSkillLock(lock, definition3.protocolVersions) || expected && (lock.integrity !== expected.integrity || lock.protocolVersion !== expected.protocolVersion)) throw new Error(`${definition3.label} Skill \u4E0B\u8F7D\u6821\u9A8C\u4FE1\u606F\u4E0D\u5339\u914D\u3002`);
|
|
316
324
|
const destination = join2(cache, lock.version);
|
|
317
325
|
const existing = await cached(definition3, destination, lock);
|
|
318
326
|
if (existing) return { root: existing, lock };
|
|
@@ -945,7 +953,7 @@ async function readExistingManifest(agentConfigPath) {
|
|
|
945
953
|
);
|
|
946
954
|
}
|
|
947
955
|
}
|
|
948
|
-
async function planBuddyDraftInitialization(directory) {
|
|
956
|
+
async function planBuddyDraftInitialization(directory, options = {}) {
|
|
949
957
|
const rootDirectory = resolve3(directory);
|
|
950
958
|
const agentConfigPath = join6(rootDirectory, BUDDY_PACKAGE_FILENAME);
|
|
951
959
|
const state2 = await pathState(rootDirectory);
|
|
@@ -957,10 +965,10 @@ async function planBuddyDraftInitialization(directory) {
|
|
|
957
965
|
);
|
|
958
966
|
}
|
|
959
967
|
const existingManifest = state2.kind === "directory" ? await readExistingManifest(agentConfigPath) : void 0;
|
|
960
|
-
if (existingManifest !== void 0 && (await missingBuddyAgentFiles(rootDirectory)).length === 0) {
|
|
968
|
+
if (!options.resumeCreator && existingManifest !== void 0 && (await missingBuddyAgentFiles(rootDirectory)).length === 0) {
|
|
961
969
|
throw new ProjectInitializationError(
|
|
962
970
|
"ALREADY_INITIALIZED",
|
|
963
|
-
|
|
971
|
+
"\u9879\u76EE\u5DF2\u7ECF\u662F\u5B8C\u6574 Agent \u5DE5\u7A0B\uFF0C\u4E14\u6CA1\u6709\u53EF\u6062\u590D\u7684 Creator \u8BB0\u5F55\uFF1B\u8BF7\u6309\u5DF2\u6709\u9700\u6C42\u7EE7\u7EED\u5F00\u53D1\uFF0C\u4E0D\u91CD\u65B0\u521D\u59CB\u5316\u3002",
|
|
964
972
|
agentConfigPath
|
|
965
973
|
);
|
|
966
974
|
}
|
|
@@ -970,7 +978,8 @@ async function planBuddyDraftInitialization(directory) {
|
|
|
970
978
|
agentConfigPath,
|
|
971
979
|
createRootDirectory: state2.kind === "missing",
|
|
972
980
|
...state2.kind === "directory" ? { expectedDirectoryIdentity: state2.identity } : {},
|
|
973
|
-
...existingManifest === void 0 ? {} : { existingManifest }
|
|
981
|
+
...existingManifest === void 0 ? {} : { existingManifest },
|
|
982
|
+
...options.resumeCreator ? { resumeCreator: true } : {}
|
|
974
983
|
};
|
|
975
984
|
}
|
|
976
985
|
async function planBuddyProjectInitialization(options) {
|
|
@@ -1119,7 +1128,7 @@ async function applyBuddyDraftInitialization(plan, draft) {
|
|
|
1119
1128
|
const directoryIdentity = await prepareInitializationDirectory(plan);
|
|
1120
1129
|
if (plan.existingManifest !== void 0) {
|
|
1121
1130
|
const current = await readExistingManifest(plan.agentConfigPath);
|
|
1122
|
-
if (current === void 0 || current.buddyId !== draft.buddyId || (await missingBuddyAgentFiles(plan.rootDirectory)).length === 0) {
|
|
1131
|
+
if (current === void 0 || current.buddyId !== draft.buddyId || !plan.resumeCreator && (await missingBuddyAgentFiles(plan.rootDirectory)).length === 0) {
|
|
1123
1132
|
throw new ProjectInitializationError(
|
|
1124
1133
|
"ALREADY_INITIALIZED",
|
|
1125
1134
|
`\u5DF2\u6709 ${BUDDY_PACKAGE_FILENAME} \u7ED1\u5B9A\u7684 buddyId \u4E0E\u672C\u6B21\u4E91\u7AEF\u642D\u5B50\u4E0D\u4E00\u81F4\u3002`,
|
|
@@ -2512,6 +2521,7 @@ var definition2 = {
|
|
|
2512
2521
|
cacheFolder: "creator-skills/buddy-creator-skill",
|
|
2513
2522
|
pathEnvironment: "BUDDY_CREATOR_SKILL_PATH",
|
|
2514
2523
|
versionFlag: "--creator-version",
|
|
2524
|
+
alwaysLatest: true,
|
|
2515
2525
|
protocolVersions,
|
|
2516
2526
|
protocol: { entrypoint: "scripts/buddy.py", skill: "SKILL.md", workflow: "references/cli-workflow.md", workspaceFormat: "buddy-creator-1" },
|
|
2517
2527
|
requiredFiles: ["SKILL.md", "scripts/buddy.py", "references/cli-workflow.md", "references/host-guide.md"]
|
|
@@ -2793,7 +2803,7 @@ function handoffMarkdown(context, skillRoot, session, workspacePath) {
|
|
|
2793
2803
|
];
|
|
2794
2804
|
return `# Buddy \u521B\u5EFA\u63A5\u7EED\u8BF4\u660E
|
|
2795
2805
|
|
|
2796
|
-
<!-- buddy-cli-sit creator-handoff:
|
|
2806
|
+
<!-- buddy-cli-sit creator-handoff:4 -->
|
|
2797
2807
|
|
|
2798
2808
|
\u5148\u6267\u884C \`buddy-cli-sit guide\` \u5E76\u5B8C\u6574\u9605\u8BFB\u5F53\u524D\u5F00\u53D1\u6307\u5F15\uFF1BCLI \u4F1A\u5148\u81EA\u68C0\u5E76\u5728\u9700\u8981\u65F6\u81EA\u52A8\u66F4\u65B0\uFF0C\u7B49\u5F85\u547D\u4EE4\u5B8C\u6210\uFF0C\u4E0D\u91CD\u590D\u53D1\u8D77\u3002
|
|
2799
2809
|
\u672C\u6587\u4EF6\u53EA\u63D0\u4F9B\u672C\u6B21\u5DE5\u7A0B\u4E0E Skill \u7684\u63A5\u7EED\u4FE1\u606F\uFF1B\u901A\u7528\u5F00\u53D1\u548C\u4EA4\u4ED8\u89C4\u5219\u4EE5 guide \u4E3A\u51C6\u3002
|
|
@@ -2805,7 +2815,8 @@ function handoffMarkdown(context, skillRoot, session, workspacePath) {
|
|
|
2805
2815
|
|
|
2806
2816
|
## \u7531\u5F53\u524D\u4E3B\u5BF9\u8BDD\u6267\u884C\u521B\u4F5C
|
|
2807
2817
|
|
|
2808
|
-
\
|
|
2818
|
+
\u672C\u6587\u4EF6\u8BB0\u5F55\u672C\u6B21\u9009\u7528\u7684 Creator\uFF1B\u6BCF\u6B21\u91CD\u65B0\u8FDB\u5165\u6216\u6062\u590D\u521B\u4F5C\uFF0C\u5148\u5728\u540C\u76EE\u5F55\u6267\u884C \`buddy-cli-sit init --mode create\` \u67E5\u8BE2\u516C\u5171 npm latest\uFF0C\u518D\u8BFB\u53D6\u66F4\u65B0\u540E\u7684 HANDOFF\uFF0C\u4E0D\u76F4\u63A5\u8C03\u7528\u65E7\u7F13\u5B58\u76EE\u5F55\u3002\u672C\u8F6E\u547D\u4EE4\u5DF2\u6210\u529F\u65F6\u4E0D\u91CD\u590D\u6267\u884C\uFF0C\u540C\u4E00\u8F6E\u8BBF\u8C08\u7684\u540E\u7EED\u5DE5\u5177\u8C03\u7528\u4F7F\u7528\u672C\u6B21\u9009\u5B9A\u7248\u672C\u3002
|
|
2819
|
+
\u5B8C\u6574\u8BFB\u53D6 ${JSON.stringify(join15(skillRoot, "SKILL.md"))} \u4E0E ${JSON.stringify(join15(skillRoot, "references/cli-workflow.md"))}\uFF0C\u7531\u6700\u65B0\u7248 Creator \u7684 open \u8BFB\u53D6\u65E7\u8D44\u6599\u5E76\u8FC1\u79FB\u5230 workflowVersion=2 \u7684\u4E09\u518C\uFF1A\u5B9A\u4F4D\u3001\u77E5\u8BC6\u4E0E\u65B9\u6CD5\u3001\u4ED8\u8D39\u670D\u52A1\u3002\u5148\u4FDD\u5B58\u65E7\u6210\u679C\uFF0C\u518D\u6309\u8FC1\u79FB\u7ED3\u679C\u8865\u9F50\u7F3A\u53E3\u6216\u91CD\u65B0\u786E\u8BA4\u53D1\u751F\u53D8\u5316\u7684\u5185\u5BB9\uFF1B\u4E0D\u80FD\u76F4\u63A5\u4FEE\u6539\u72B6\u6001\u7248\u672C\u3001\u4F2A\u9020\u786E\u8BA4\u6216\u6CBF\u7528\u65E7\u4EA4\u4ED8\u7684\u5B8C\u6210\u6807\u8BB0\u3002
|
|
2809
2820
|
\u4F7F\u7528\u5BBF\u4E3B\u5B9E\u9645\u53EF\u7528\u7684 Python 3.9+\uFF0C\u6240\u6709\u8C03\u7528\u52A0 -B\uFF0C\u8FDB\u7A0B\u73AF\u5883\u8BBE\u7F6E PYTHONDONTWRITEBYTECODE=1\u3002\u4FDD\u6301 creation-key \u4E0E workspace \u4E0D\u53D8\uFF0C\u4E0D\u91CD\u7F6E\u4F5C\u54C1\u3002
|
|
2810
2821
|
\u9996\u6B21 open \u7684 argv\uFF1A
|
|
2811
2822
|
|
|
@@ -2817,7 +2828,7 @@ ${JSON.stringify(openArgs, null, 2)}
|
|
|
2817
2828
|
|
|
2818
2829
|
\u4EC5 directive=creator_complete \u4E14 completion.status=ready\u3001manualPath \u5B58\u5728\u4E14\u4EA4\u4ED8\u6709\u6548\u65F6\u8FDB\u5165\u5F00\u53D1\u3002directive=finalize_required \u65F6\u5148\u4FEE\u590D\u4EA4\u4ED8\u3002\u5DF2\u5B8C\u6210\u4F5C\u54C1\u76F4\u63A5\u63A5\u56DE\u5F00\u53D1\uFF1B\u7528\u6237\u660E\u786E\u4EC5\u505A\u8BBE\u8BA1\u6216\u6682\u505C\u65F6\u9075\u5B88\u8BE5\u8303\u56F4\u3002
|
|
2819
2830
|
|
|
2820
|
-
\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\u3001\u540C\u76EE\u5F55\u5B9E\u9645 manifest\u3001sources.json \u4E0E\u6765\u6E90\u6620\u5C04\u53CA\u5C0F\u6302\u4EF6\u4EA7\u7269\uFF0C\u4E0D\u6309\u65E7\u56DB\u518C\u6587\u4EF6\u540D\u786C\u7F16\u7801\u6E05\u5355\
|
|
2831
|
+
\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\u3001\u540C\u76EE\u5F55\u5B9E\u9645 manifest\u3001sources.json \u4E0E\u6765\u6E90\u6620\u5C04\u53CA\u5C0F\u6302\u4EF6\u4EA7\u7269\uFF0C\u4E0D\u6309\u65E7\u56DB\u518C\u6587\u4EF6\u540D\u786C\u7F16\u7801\u6E05\u5355\u3002\u65B0\u7248\u4E09\u518C\u4EA4\u4ED8\u8FD8\u8BFB\u53D6 completion.capabilityContractPath\uFF0C\u5E76\u6309 Skill \u7684 references/implementation-handoff.md \u4FDD\u5B58 implementation-report.json\u3001\u6267\u884C handoff-check\u3002\u8BE5\u68C0\u67E5\u4E0D\u66FF\u4EE3\u771F\u5B9E Runtime \u9A8C\u8BC1\uFF1B\u8FC1\u79FB\u540E\u7684\u4E09\u518C\u3001\u80FD\u529B\u5951\u7EA6\u53CA\u4EA4\u4ED8\u987B\u901A\u8FC7\u5F53\u524D Skill \u7684\u6821\u9A8C\uFF0C\u4E0D\u80FD\u4EE5\u65E7\u56DB\u518C\u4EA4\u4ED8\u4EE3\u66FF\u3002\u7ED3\u5408\u73B0\u6709\u5DE5\u7A0B\uFF0C\u6309\u5F00\u53D1\u6307\u5F15\u7EE7\u7EED\u5B9E\u73B0\u3002
|
|
2821
2832
|
|
|
2822
2833
|
\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
|
|
2823
2834
|
|
|
@@ -2971,9 +2982,9 @@ ${IMPLEMENTATION_GUIDE_SUMMARY}
|
|
|
2971
2982
|
|
|
2972
2983
|
### \u5148\u770B\u9700\u6C42\uFF0C\u4E0D\u91CD\u65B0\u91C7\u8BBF
|
|
2973
2984
|
|
|
2974
|
-
Creator \u8DEF\u7EBF\u6309\u5F53\u524D\u4F5C\u54C1\u7684\u5DE5\u4F5C\u6D41\u5B8C\u6210\u9700\u6C42\u3001\u5C0F\u6302\u4EF6\u6E05\u5355\u3001\u539F\u578B\u53CA\u8BBE\u8BA1\u9A8C\u6536\uFF0C\u4E14\u4EA4\u4ED8\u6821\u9A8C\u8FD4\u56DE \`directive=creator_complete\`\u3001\`completion.status=ready\`\u3001\u4EA4\u4ED8\u7248\u672C\u6709\u6548\u3001\`completion.manualPath\` \u5B58\u5728\u540E\uFF0C\u518D\u8FDB\u5165\u5F00\u53D1\u3002\u4EC5\u624B\u518C\u786E\u8BA4\u6216\u5B58\u5728\u624B\u518C\u6587\u4EF6\u5747\u4E0D\u8DB3\u4EE5\u89E6\u53D1\u5F00\u53D1\uFF1B\`directive=finalize_required\` \u65F6\u5148\u6062\u590D\u6709\u6548\u4EA4\u4ED8\u3002\
|
|
2985
|
+
Creator \u8DEF\u7EBF\u6309\u5F53\u524D\u4F5C\u54C1\u7684\u5DE5\u4F5C\u6D41\u5B8C\u6210\u9700\u6C42\u3001\u5C0F\u6302\u4EF6\u6E05\u5355\u3001\u539F\u578B\u53CA\u8BBE\u8BA1\u9A8C\u6536\uFF0C\u4E14\u4EA4\u4ED8\u6821\u9A8C\u8FD4\u56DE \`directive=creator_complete\`\u3001\`completion.status=ready\`\u3001\u4EA4\u4ED8\u7248\u672C\u6709\u6548\u3001\`completion.manualPath\` \u5B58\u5728\u540E\uFF0C\u518D\u8FDB\u5165\u5F00\u53D1\u3002\u4EC5\u624B\u518C\u786E\u8BA4\u6216\u5B58\u5728\u624B\u518C\u6587\u4EF6\u5747\u4E0D\u8DB3\u4EE5\u89E6\u53D1\u5F00\u53D1\uFF1B\`directive=finalize_required\` \u65F6\u5148\u6062\u590D\u6709\u6548\u4EA4\u4ED8\u3002\u6BCF\u6B21\u8FDB\u5165\u6216\u6062\u590D\u521B\u4F5C\u90FD\u5148\u5728\u5DE5\u7A0B\u76EE\u5F55\u6267\u884C \`buddy-cli-sit init --mode create\`\uFF0C\u67E5\u8BE2\u516C\u5171 npm latest \u5E76\u5237\u65B0 HANDOFF\uFF0C\u4E0D\u76F4\u63A5\u8C03\u7528\u65E7\u9501\u8BB0\u5F55\u6216\u7F13\u5B58\u4E2D\u7684 Skill\u3002\u6700\u65B0\u7248 Creator \u7EDF\u4E00\u4F7F\u7528 workflowVersion=2 \u7684\u4E09\u518C\uFF1A\u5B9A\u4F4D\u3001\u77E5\u8BC6\u4E0E\u65B9\u6CD5\u3001\u4ED8\u8D39\u670D\u52A1\uFF1B\u65E7\u56DB\u518C\u7531 Creator \u7684 open \u4FDD\u5B58\u5386\u53F2\u540E\u8FC1\u79FB\uFF0C\u4FDD\u7559\u8EAB\u4EFD\u3001\u539F\u59CB\u8D44\u6599\u548C\u53EF\u590D\u7528\u8FDB\u5EA6\uFF0C\u8865\u9F50\u7F3A\u53E3\u5E76\u91CD\u65B0\u786E\u8BA4\u53D1\u751F\u53D8\u5316\u7684\u5185\u5BB9\u3002\u4E0D\u8981\u81EA\u884C\u6539\u5DE5\u4F5C\u6D41\u7248\u672C\u6216\u628A\u65E7\u5B8C\u6210\u6807\u8BB0\u5F53\u4F5C\u65B0\u4EA4\u4ED8\u3002
|
|
2975
2986
|
|
|
2976
|
-
\u5728\u5DF2\u6388\u6743\u7684\u5B8C\u6574\u521B\u5EFA\u4EFB\u52A1\u4E2D\uFF0C\u5F53\u524D Coding Agent \u9000\u51FA Skill \u540E\u4E8E\u540C\u4E00\u8F6E\u8BFB\u53D6 \`completion.manualPath\`\u3001\u540C\u76EE\u5F55\u5B9E\u9645 manifest\u3001\`sources.json\` \u4E0E\u6765\u6E90\u6620\u5C04\u53CA\u5C0F\u6302\u4EF6\u5B9E\u9645\u4EA7\u7269\uFF0C\u4E0D\u6309\u65E7\u56DB\u518C\u6587\u4EF6\u540D\u786C\u7F16\u7801\u4EA4\u4ED8\u6E05\u5355\
|
|
2987
|
+
\u5728\u5DF2\u6388\u6743\u7684\u5B8C\u6574\u521B\u5EFA\u4EFB\u52A1\u4E2D\uFF0C\u5F53\u524D Coding Agent \u9000\u51FA Skill \u540E\u4E8E\u540C\u4E00\u8F6E\u8BFB\u53D6 \`completion.manualPath\`\u3001\u540C\u76EE\u5F55\u5B9E\u9645 manifest\u3001\`sources.json\` \u4E0E\u6765\u6E90\u6620\u5C04\u53CA\u5C0F\u6302\u4EF6\u5B9E\u9645\u4EA7\u7269\uFF0C\u4E0D\u6309\u65E7\u56DB\u518C\u6587\u4EF6\u540D\u786C\u7F16\u7801\u4EA4\u4ED8\u6E05\u5355\u3002\u65B0\u7248\u4E09\u518C\u4EA4\u4ED8\u8FD8\u8BFB\u53D6 \`completion.capabilityContractPath\` \u6307\u5411\u7684\u80FD\u529B\u5951\u7EA6\uFF1B\u8FC1\u79FB\u540E\u7684\u9879\u76EE\u4E5F\u6309\u5F53\u524D\u4E09\u518C\u4E0E\u5951\u7EA6\u4EA4\u4ED8\uFF0C\u4E0D\u80FD\u8DF3\u8FC7\u65B0\u4EA4\u4ED8\u6821\u9A8C\u3002\u5B8C\u6574\u7406\u89E3\u5B9A\u4E49\u3001\u77E5\u8BC6\u3001\u65B9\u6CD5\u3001\u670D\u52A1\u3001\u8BBE\u8BA1\u9A8C\u6536\u8BB0\u5F55\u53CA\u5F85\u8865\u5145\u9879\uFF0C\u68C0\u67E5\u73B0\u6709\u5DE5\u7A0B\u5E76\u76F4\u63A5\u5F00\u59CB\u5B9E\u73B0\uFF0C\u4E0D\u518D\u7B49\u5F85\u4E00\u6B21\u5F00\u53D1\u786E\u8BA4\u3002\u624B\u518C\u51B3\u5B9A\u642D\u5B50\u5E94\u8BE5\u600E\u4E48\u505A\uFF0CCoding Agent \u8D1F\u8D23\u9009\u62E9\u5408\u9002\u7684\u5B9E\u73B0\uFF1B\u624B\u518C\u4E0D\u9700\u8981\u5217\u51FA Tool\u3001Skill\u3001Hook \u7B49\u6280\u672F\u540D\u8BCD\u3002
|
|
2977
2988
|
|
|
2978
2989
|
\u76F4\u63A5\u5F00\u53D1\u65F6\uFF0C\u4F7F\u7528\u5F00\u53D1\u8005\u5DF2\u63D0\u4F9B\u5E76\u786E\u8BA4\u7684\u9700\u6C42\uFF0C\u4E0D\u5F3A\u5236\u8865\u505A Creator \u6216\u5236\u9020\u4E00\u4EFD\u201C\u5DF2\u786E\u8BA4\u624B\u518C\u201D\u3002\u6240\u6709\u5DE5\u7A0B\u7EDF\u4E00\u4F7F\u7528\u5B98\u65B9 Runtime\u3002\u5DF2\u6709\u5B98\u65B9\u5DE5\u7A0B\u5148\u68C0\u67E5\u5F53\u524D\u4EE3\u7801\u548C\u914D\u7F6E\uFF0C\u590D\u7528\u6EE1\u8DB3\u8981\u6C42\u7684\u5B9E\u73B0\uFF1B\u5DE5\u7A0B\u5B8C\u6574\u65F6\u4E0D\u91CD\u590D init\uFF0C\u7F3A\u5C11\u6A21\u677F\u6587\u4EF6\u65F6\u7528 init --mode direct \u8865\u9F50\u3002
|
|
2979
2990
|
|
|
@@ -3017,7 +3028,7 @@ DEV \u542F\u52A8\u6216\u8FD0\u884C\u5931\u8D25\u65F6\uFF0C\u5148\u8BFB\u53D6\u98
|
|
|
3017
3028
|
|
|
3018
3029
|
### \u4E3B\u52A8\u63D0\u9192\u4E0E\u6570\u636E\u6743\u9650
|
|
3019
3030
|
|
|
3020
|
-
Creator \u5DE5\u4F5C\u6D41 2 \u7684 Booklet \u63D0\u4F9B\u300C\u5E73\u53F0\u80FD\u529B\u300D\u9875\u7B7E\uFF0C\u65B9\u6848\u552F\u4E00\u6765\u6E90\u662F\u670D\u52A1\u84DD\u56FE \`service.blueprint.data.capabilityPlan\`\u3002\u6309\u6709\u6548\u4EA4\u4ED8\u7684\u80FD\u529B\u5951\u7EA6\u5B9E\u73B0\u4E0E\u9A8C\u8BC1\u4E3B\u52A8\u63D0\u9192\u7684\u89E6\u53D1\u3001\u9891\u7387\u3001\u9759\u9ED8\u548C\u505C\u6B62\u7EA6\u5B9A\uFF0C\u4E0D\u56E0\u9875\u9762\u5C55\u793A\u5DF2\u91C7\u7528\u5C31\u5BA3\u79F0\u5DF2\u542F\u7528\u3002\u65E7\
|
|
3031
|
+
Creator \u5DE5\u4F5C\u6D41 2 \u7684 Booklet \u63D0\u4F9B\u300C\u5E73\u53F0\u80FD\u529B\u300D\u9875\u7B7E\uFF0C\u65B9\u6848\u552F\u4E00\u6765\u6E90\u662F\u670D\u52A1\u84DD\u56FE \`service.blueprint.data.capabilityPlan\`\u3002\u6309\u6709\u6548\u4EA4\u4ED8\u7684\u80FD\u529B\u5951\u7EA6\u5B9E\u73B0\u4E0E\u9A8C\u8BC1\u4E3B\u52A8\u63D0\u9192\u7684\u89E6\u53D1\u3001\u9891\u7387\u3001\u9759\u9ED8\u548C\u505C\u6B62\u7EA6\u5B9A\uFF0C\u4E0D\u56E0\u9875\u9762\u5C55\u793A\u5DF2\u91C7\u7528\u5C31\u5BA3\u79F0\u5DF2\u542F\u7528\u3002\u65E7\u8D44\u6599\u8FC1\u79FB\u65F6\u53EF\u8BFB\u53D6\u4EA4\u4ED8\u76EE\u5F55 \`service-blueprint.json\` \u7684 \`data.proactiveReminders\`\uFF1B\u5B57\u6BB5\u7F3A\u5931\u8868\u793A\u5C1A\u672A\u6574\u7406\uFF0C\u4E0D\u80FD\u64C5\u81EA\u6DFB\u52A0\u9ED8\u8BA4\u63D0\u9192\uFF0C\u4E5F\u4E0D\u81EA\u52A8\u8F6C\u6362\u6210\u65B0\u7248\u5951\u7EA6\u3002
|
|
3021
3032
|
|
|
3022
3033
|
\u5E73\u53F0\u6570\u636E\u6743\u9650\u76F4\u63A5\u8BFB\u53D6\u5F53\u524D\u5DE5\u7A0B\u7684 \`data-access.json.requirements\`\uFF1B\u6309\u5B9E\u9645\u9700\u8981\u7EF4\u62A4 ID \u548C\u7528\u9014\uFF0C\u4FDD\u5B58\u540E\u9875\u9762\u540C\u6B65\u3002\u80FD\u529B\u65B9\u6848\u4E0D\u7B49\u4E8E\u5B9E\u9645\u58F0\u660E\u6216\u7528\u6237\u6388\u6743\uFF1B\u7F3A\u5C11\u58F0\u660E\u6587\u4EF6\u3001\u58F0\u660E\u635F\u574F\u4E0E\u6709\u6548\u7A7A\u6570\u7EC4\u987B\u5206\u522B\u5904\u7406\u3002\u4E0D\u8981\u590D\u5236\u4E00\u4EFD\u5C55\u793A\u7528\u6743\u9650\u6E05\u5355\uFF0C\u4E5F\u4E0D\u8981\u628A\u4E1A\u52A1\u8BB0\u5F55\u6DF7\u4F5C\u5E73\u53F0\u6388\u6743\u3002
|
|
3023
3034
|
|
|
@@ -3110,7 +3121,7 @@ Runtime \u542F\u52A8\u65F6\u8BFB\u53D6\u6839\u76EE\u5F55 \`data-access.json\`\uF
|
|
|
3110
3121
|
|
|
3111
3122
|
### \u6838\u5BF9\u5B9E\u73B0\uFF0C\u518D\u4EA4\u7ED9\u5F00\u53D1\u8005\u4F53\u9A8C
|
|
3112
3123
|
|
|
3113
|
-
Creator workflowVersion=2 \u7684\u80FD\u529B\u5951\u7EA6\u6309\u7A33\u5B9A\u9700\u6C42 ID \u843D\u5B9E\u3002\u8BFB\u53D6\u8BE5 Skill \u7684 \`references/implementation-handoff.md\`\uFF0C\u5728\u5DE5\u7A0B\u4E2D\u4FDD\u5B58 \`implementation-report.json\`\uFF0C\u7ED1\u5B9A\u5F53\u524D \`contractRevision\` \u4E0E \`sourceArtifact\`\uFF0C\u9010\u9879\u8BB0\u5F55\u5B9E\u9645\u5B9E\u73B0\u3001\u9A8C\u8BC1\u8BC1\u636E\u6216\u963B\u585E\u539F\u56E0\u3002\u4F7F\u7528 Skill \u7684 \`scripts/buddy.py handoff-check --contract <\u5B9E\u9645\u5951\u7EA6\u8DEF\u5F84> --report <\u5DE5\u7A0B\u62A5\u544A\u8DEF\u5F84>\` \u6838\u5BF9\uFF1B\u6CBF\u7528\u771F\u5B9E Python 3.9+\u3001\`-B\` \u4E0E \`PYTHONDONTWRITEBYTECODE=1\`\u3002\u8BE5\u547D\u4EE4\u53EA\u68C0\u67E5\u7248\u672C\u3001\u8986\u76D6\u548C\u62A5\u544A\u7ED3\u6784\uFF0C\u4E0D\u6267\u884C\u5DE5\u7A0B\uFF0C\u4E5F\u4E0D\u66FF\u4EE3\u771F\u5B9E Runtime \u9A8C\u8BC1\uFF1B\u7ED3\u6784\u5B8C\u6574\u4ECD\u53EF\u80FD\u6709 \`blockedIds\`\u3002\u5EF6\u671F\u6216\u4E0D\u9700\u8981\u7684\u80FD\u529B\u4E0D\u80FD\u5199\u6210\u672C\u671F\u5DF2\u542F\u7528\uFF0C\u8BBE\u8BA1\u53D8\u5316\u540E\u987B\u91CD\u65B0\u7ED1\u5B9A\u5F53\u524D\u5951\u7EA6\u3002\
|
|
3124
|
+
Creator workflowVersion=2 \u7684\u80FD\u529B\u5951\u7EA6\u6309\u7A33\u5B9A\u9700\u6C42 ID \u843D\u5B9E\u3002\u8BFB\u53D6\u8BE5 Skill \u7684 \`references/implementation-handoff.md\`\uFF0C\u5728\u5DE5\u7A0B\u4E2D\u4FDD\u5B58 \`implementation-report.json\`\uFF0C\u7ED1\u5B9A\u5F53\u524D \`contractRevision\` \u4E0E \`sourceArtifact\`\uFF0C\u9010\u9879\u8BB0\u5F55\u5B9E\u9645\u5B9E\u73B0\u3001\u9A8C\u8BC1\u8BC1\u636E\u6216\u963B\u585E\u539F\u56E0\u3002\u4F7F\u7528 Skill \u7684 \`scripts/buddy.py handoff-check --contract <\u5B9E\u9645\u5951\u7EA6\u8DEF\u5F84> --report <\u5DE5\u7A0B\u62A5\u544A\u8DEF\u5F84>\` \u6838\u5BF9\uFF1B\u6CBF\u7528\u771F\u5B9E Python 3.9+\u3001\`-B\` \u4E0E \`PYTHONDONTWRITEBYTECODE=1\`\u3002\u8BE5\u547D\u4EE4\u53EA\u68C0\u67E5\u7248\u672C\u3001\u8986\u76D6\u548C\u62A5\u544A\u7ED3\u6784\uFF0C\u4E0D\u6267\u884C\u5DE5\u7A0B\uFF0C\u4E5F\u4E0D\u66FF\u4EE3\u771F\u5B9E Runtime \u9A8C\u8BC1\uFF1B\u7ED3\u6784\u5B8C\u6574\u4ECD\u53EF\u80FD\u6709 \`blockedIds\`\u3002\u5EF6\u671F\u6216\u4E0D\u9700\u8981\u7684\u80FD\u529B\u4E0D\u80FD\u5199\u6210\u672C\u671F\u5DF2\u542F\u7528\uFF0C\u8BBE\u8BA1\u53D8\u5316\u540E\u987B\u91CD\u65B0\u7ED1\u5B9A\u5F53\u524D\u5951\u7EA6\u3002\u8FC1\u79FB\u540E\u7684\u9879\u76EE\u4F7F\u7528\u5F53\u524D\u80FD\u529B\u5951\u7EA6\u4E0E\u62A5\u544A\uFF0C\u65E7\u56DB\u518C\u4EA4\u4ED8\u53EA\u4F5C\u5386\u53F2\u53C2\u8003\u3002
|
|
3114
3125
|
|
|
3115
3126
|
\u5B8C\u6210\u5F00\u53D1\u540E\u5411\u5F00\u53D1\u8005\u7B80\u8981\u8BF4\u660E\uFF1A\u9700\u6C42\u6240\u5728\u7AE0\u8282\u6216\u6765\u6E90\u3001\u5BF9\u5E94\u5B9E\u73B0\u548C\u68C0\u67E5\u7ED3\u679C\u3001\u4ECD\u5B58\u5728\u7684\u7F3A\u53E3\uFF1B\u5185\u5BB9\u7B80\u5355\u65F6\u7528\u77ED\u6E05\u5355\u5373\u53EF\u3002\u9664\u4E0A\u8FF0\u5DE5\u4F5C\u6D41 2 \u5B9E\u65BD\u62A5\u544A\u5916\uFF0C\u4E0D\u8981\u6C42\u989D\u5916\u751F\u6210 README\u3001\u786E\u8BA4\u8868\u6216\u72B6\u6001\u6587\u4EF6\u3002\u533A\u5206\u5DF2\u5B9E\u73B0\u3001\u5F85\u5B9E\u73B0\u548C\u7F3A\u5C11\u6761\u4EF6\uFF0C\u4E0D\u628A\u8BA1\u5212\u5199\u6210\u5B8C\u6210\uFF1B\u4E0D\u8981\u590D\u5236\u79C1\u4EBA\u804A\u5929\u3001\u5065\u5EB7\u539F\u59CB\u8BB0\u5F55\u6216\u51ED\u636E\u3002\u6062\u590D\u5F00\u53D1\u65F6\u6309\u624B\u518C\u4E0E\u4EE3\u7801\u6838\u5BF9\uFF0C\u4E0D\u628A\u65E7\u8BF4\u660E\u5F53\u4F5C\u5F53\u524D\u5B9E\u73B0\u7684\u8BC1\u636E\u3002
|
|
3116
3127
|
|
|
@@ -3402,13 +3413,13 @@ var INIT_HELP = `\u7528\u6CD5: buddy-cli-sit init [\u53C2\u6570]
|
|
|
3402
3413
|
--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
|
|
3403
3414
|
--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
|
|
3404
3415
|
--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
|
|
3405
|
-
--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
|
|
3406
3416
|
|
|
3407
3417
|
\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
|
|
3408
3418
|
\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
|
|
3409
3419
|
\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
|
|
3410
3420
|
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
|
|
3411
3421
|
\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
|
|
3422
|
+
Creator \u6BCF\u6B21\u8FDB\u5165\u6216\u6062\u590D\u90FD\u67E5\u8BE2\u516C\u5171 npm latest\uFF1B\u6709 Creator \u8BB0\u5F55\u7684\u5B8C\u6574\u5DE5\u7A0B\u4E5F\u53EF\u6267\u884C create \u63A5\u7EED\u521B\u4F5C\uFF0C\u4E0D\u91CD\u5EFA\u4E1A\u52A1\u6587\u4EF6\u3002
|
|
3412
3423
|
\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
|
|
3413
3424
|
|
|
3414
3425
|
\u793A\u4F8B:
|
|
@@ -3463,9 +3474,9 @@ Coding Agent \u5E94\u76F4\u63A5\u6CBF\u7528\u7528\u6237\u660E\u786E\u63D0\u4F9B\
|
|
|
3463
3474
|
\u5934\u50CF Skill \u7248\u672C\u8BB0\u5F55\u5728 .buddy/meta/skill-lock.json\uFF1B--avatar-skill-version <\u51C6\u786E\u7248\u672C> \u663E\u5F0F\u9009\u62E9\u7248\u672C\uFF0C\u672C\u5730\u8054\u8C03\u8BBE\u7F6E BUDDY_AVATAR_SKILL_PATH \u7EDD\u5BF9\u8DEF\u5F84\u3002
|
|
3464
3475
|
\u666E\u901A\u7EC8\u7AEF\u53EF\u9009\u62E9\u5DF2\u6709\u56FE\u7247\uFF1BCLI \u4E0D\u6267\u884C\u56FE\u7247\u751F\u6210\uFF0C\u4E5F\u4E0D\u8981\u6C42\u5B89\u88C5 Coding Agent\u3002\u4F7F\u7528 --avatar <\u56FE\u7247\u6587\u4EF6> \u6307\u5B9A\u5019\u9009\u5934\u50CF\uFF0C\u7EC8\u7AEF\u9884\u89C8\u5E76\u786E\u8BA4\u540E\u767B\u8BB0\u3002
|
|
3465
3476
|
\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
|
|
3466
|
-
--mode create \u5B8C\u6210\u8D44\u6599\u548C\u5934\u50CF\u767B\u8BB0\u540E\uFF0C\u52A8\u6001\u83B7\u53D6\u72EC\u7ACB Creator Skill \u5E76\u751F\u6210\u63A5\u7EED\u8BF4\u660E\uFF0C\u652F\u6301 Creator \u63A5\u5165\u534F\u8BAE 1 \u548C 2\uFF1B\u9879\u76EE .buddy/creator/ \u4FDD\u5B58\u521B\u4F5C\u8D44\u6599\u4E0E skill-lock.json \u7248\u672C\u8BB0\u5F55\u3002\
|
|
3477
|
+
--mode create \u5B8C\u6210\u8D44\u6599\u548C\u5934\u50CF\u767B\u8BB0\u540E\uFF0C\u52A8\u6001\u83B7\u53D6\u72EC\u7ACB Creator Skill \u5E76\u751F\u6210\u63A5\u7EED\u8BF4\u660E\uFF0C\u652F\u6301 Creator \u63A5\u5165\u534F\u8BAE 1 \u548C 2\uFF1B\u9879\u76EE .buddy/creator/ \u4FDD\u5B58\u521B\u4F5C\u8D44\u6599\u4E0E skill-lock.json \u7248\u672C\u8BB0\u5F55\u3002\u6BCF\u6B21\u8FDB\u5165\u6216\u6062\u590D\u90FD\u67E5\u8BE2\u516C\u5171 npm latest\uFF0C\u786E\u8BA4\u662F\u6700\u65B0\u7248\u540E\u624D\u590D\u7528\u7F13\u5B58\uFF1Bskill-lock.json \u53EA\u8BB0\u5F55\u672C\u6B21\u7248\u672C\uFF0C\u4E0D\u56FA\u5B9A\u65E7\u7248\u672C\u3002\u67E5\u8BE2\u3001\u4E0B\u8F7D\u6216\u534F\u8BAE\u6821\u9A8C\u5931\u8D25\u65F6\u660E\u786E\u62A5\u9519\uFF0C\u4E0D\u9000\u56DE\u65E7\u7248\u3002\u672C\u5730\u8054\u8C03\u53EF\u663E\u5F0F\u8BBE\u7F6E BUDDY_CREATOR_SKILL_PATH \u7EDD\u5BF9\u8DEF\u5F84\uFF0C\u6E05\u9664\u540E\u6062\u590D\u67E5\u8BE2 latest\u3002
|
|
3467
3478
|
\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
|
|
3468
|
-
\u6309\u5F53\u524D\u4F5C\u54C1\u5DE5\u4F5C\u6D41\u5B8C\u6210\u9700\u6C42\u3001\u5C0F\u6302\u4EF6\u6E05\u5355\u3001\u539F\u578B\u548C\u8BBE\u8BA1\u9A8C\u6536\uFF1B\u53EA\u6709\u4EA4\u4ED8\u6821\u9A8C\u8FD4\u56DE creator_complete\u3001completion.status=ready \u4E14\u4EA4\u4ED8\u6709\u6548\u540E\uFF0C\u624D\u7531 Coding Agent \u81EA\u52A8\u8854\u63A5\u5F00\u53D1\u3002\u8BFB\u53D6\u5B9E\u9645 manifest\uFF0C\u4E0D\u786C\u7F16\u7801\u624B\u518C\u6570\u91CF\u6216\u6587\u4EF6\u540D\
|
|
3479
|
+
\u6309\u5F53\u524D\u4F5C\u54C1\u5DE5\u4F5C\u6D41\u5B8C\u6210\u9700\u6C42\u3001\u5C0F\u6302\u4EF6\u6E05\u5355\u3001\u539F\u578B\u548C\u8BBE\u8BA1\u9A8C\u6536\uFF1B\u53EA\u6709\u4EA4\u4ED8\u6821\u9A8C\u8FD4\u56DE creator_complete\u3001completion.status=ready \u4E14\u4EA4\u4ED8\u6709\u6548\u540E\uFF0C\u624D\u7531 Coding Agent \u81EA\u52A8\u8854\u63A5\u5F00\u53D1\u3002\u8BFB\u53D6\u5B9E\u9645 manifest\uFF0C\u4E0D\u786C\u7F16\u7801\u624B\u518C\u6570\u91CF\u6216\u6587\u4EF6\u540D\uFF1B\u65B0\u7248\u4E09\u518C\u8FD8\u6309\u80FD\u529B\u5951\u7EA6\u5B8C\u6210\u5B9E\u65BD\u62A5\u544A\u548C handoff-check\uFF0C\u7ED3\u6784\u6821\u9A8C\u4E0D\u7B49\u4E8E\u771F\u5B9E Runtime \u9A8C\u8BC1\u3002\u65E7\u56DB\u518C\u7531\u6700\u65B0\u7248 Creator \u4FDD\u5B58\u5386\u53F2\u540E\u8FC1\u79FB\u4E3A\u4E09\u518C\uFF0C\u590D\u7528\u8D44\u6599\u548C\u8FDB\u5EA6\uFF0C\u8865\u9F50\u7F3A\u53E3\u5E76\u91CD\u65B0\u786E\u8BA4\u53D8\u5316\u5185\u5BB9\uFF1B\u4E0D\u76F4\u63A5\u6CBF\u7528\u65E7\u4EA4\u4ED8\u7684\u5B8C\u6210\u6807\u8BB0\u3002\u9700\u8981\u521D\u59CB\u5316\u65F6\u6267\u884C init --mode direct \u751F\u6210\u5B98\u65B9 Runtime \u5DE5\u7A0B\u3002\u751F\u6210\u65B0\u5DE5\u5382\u524D\u5217\u51FA\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
|
|
3469
3480
|
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
|
|
3470
3481
|
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
|
|
3471
3482
|
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
|
|
@@ -8408,6 +8419,7 @@ function parseInitArguments(args) {
|
|
|
8408
8419
|
parsed.confirmMeta = true;
|
|
8409
8420
|
continue;
|
|
8410
8421
|
}
|
|
8422
|
+
if (flag2 === "--creator-version") throw new CliUsageError("--creator-version \u5DF2\u505C\u6B62\u4F7F\u7528\uFF1BCreator \u6BCF\u6B21\u8FDB\u5165\u6216\u6062\u590D\u90FD\u4F7F\u7528\u516C\u5171 npm latest \u6700\u65B0\u6B63\u5F0F\u7248\u3002");
|
|
8411
8423
|
const value = valueAfterFlag(args, index, flag2 ?? "\u53C2\u6570");
|
|
8412
8424
|
index += 1;
|
|
8413
8425
|
switch (flag2) {
|
|
@@ -8440,10 +8452,6 @@ function parseInitArguments(args) {
|
|
|
8440
8452
|
if (!/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/u.test(value)) throw new CliUsageError("--avatar-skill-version \u5FC5\u987B\u662F\u51C6\u786E\u7248\u672C\uFF0C\u4F8B\u5982 1.0.0");
|
|
8441
8453
|
parsed.avatarSkillVersion = setOnce2(parsed.avatarSkillVersion, value, flag2);
|
|
8442
8454
|
break;
|
|
8443
|
-
case "--creator-version":
|
|
8444
|
-
if (!/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/u.test(value)) throw new CliUsageError("--creator-version \u5FC5\u987B\u662F\u51C6\u786E\u7248\u672C\uFF0C\u4F8B\u5982 1.6.0");
|
|
8445
|
-
parsed.creatorVersion = setOnce2(parsed.creatorVersion, value, flag2);
|
|
8446
|
-
break;
|
|
8447
8455
|
case "--runtime-version":
|
|
8448
8456
|
throw new CliUsageError("SIT CLI \u4E0D\u652F\u6301 --runtime-version\uFF1B\u7EDF\u4E00\u4F7F\u7528 npm dev \u6700\u65B0 Runtime\u3002");
|
|
8449
8457
|
case "--avatar":
|
|
@@ -8457,7 +8465,6 @@ function parseInitArguments(args) {
|
|
|
8457
8465
|
}
|
|
8458
8466
|
}
|
|
8459
8467
|
if (parsed.model !== void 0 && parsed.mode !== "direct") throw new CliUsageError("--model \u4EC5\u7528\u4E8E --mode direct\uFF1Bcreate \u68B3\u7406\u5B8C\u6210\u540E\u5728\u8FDB\u5165\u5DE5\u7A0B\u5F00\u53D1\u65F6\u786E\u8BA4\u6A21\u578B\u3002");
|
|
8460
|
-
if (parsed.creatorVersion && parsed.mode !== "create") throw new CliUsageError("--creator-version \u4EC5\u7528\u4E8E --mode create");
|
|
8461
8468
|
return parsed;
|
|
8462
8469
|
}
|
|
8463
8470
|
function requirePrompt(io, flag2) {
|
|
@@ -8607,7 +8614,12 @@ async function runRoute(route, args, io, options) {
|
|
|
8607
8614
|
);
|
|
8608
8615
|
const rootDirectory = resolve19(cwd, directoryInput);
|
|
8609
8616
|
await assertInitializableBuddyTarget(rootDirectory);
|
|
8610
|
-
|
|
8617
|
+
const creatorSession = await lstat15(join25(rootDirectory, ".buddy/creator/session.json")).catch((cause) => {
|
|
8618
|
+
if (cause.code === "ENOENT") return void 0;
|
|
8619
|
+
throw cause;
|
|
8620
|
+
});
|
|
8621
|
+
const resumeCreator = !!creatorSession?.isFile() && !creatorSession.isSymbolicLink();
|
|
8622
|
+
let plan = await planBuddyDraftInitialization(rootDirectory, { resumeCreator });
|
|
8611
8623
|
const existingBuddyId = plan.existingManifest?.buddyId;
|
|
8612
8624
|
if (existingBuddyId !== void 0 && args.buddyId !== void 0 && existingBuddyId !== args.buddyId) {
|
|
8613
8625
|
throw new CliUsageError(
|
|
@@ -8620,7 +8632,7 @@ async function runRoute(route, args, io, options) {
|
|
|
8620
8632
|
writeApplicationDraftReady(io, buddyId, options, requestedBuddyId !== void 0);
|
|
8621
8633
|
let draft;
|
|
8622
8634
|
try {
|
|
8623
|
-
plan = await planBuddyDraftInitialization(rootDirectory);
|
|
8635
|
+
plan = await planBuddyDraftInitialization(rootDirectory, { resumeCreator });
|
|
8624
8636
|
draft = await applyBuddyDraftInitialization(plan, { buddyId });
|
|
8625
8637
|
} catch (cause) {
|
|
8626
8638
|
io.writeError(
|
|
@@ -8637,7 +8649,7 @@ async function runRoute(route, args, io, options) {
|
|
|
8637
8649
|
projectRoot: draft.rootDirectory,
|
|
8638
8650
|
manifestPath: draft.agentConfigPath
|
|
8639
8651
|
};
|
|
8640
|
-
const result = options.creator ? await options.creator(context, io) : await prepareCreatorSkill(context, io, { signal: options.cloud?.signal
|
|
8652
|
+
const result = options.creator ? await options.creator(context, io) : await prepareCreatorSkill(context, io, { signal: options.cloud?.signal });
|
|
8641
8653
|
return { ...result, route: "create", draft, buddyId };
|
|
8642
8654
|
}
|
|
8643
8655
|
async function resumeProjectArguments(args, cwd, options, io) {
|