ys-team 0.2.0 → 0.3.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/docs/specs/{active → completed}/20260407-170500-npm-distribution-modes/control.md +1 -1
- package/docs/specs/{active → completed}/20260407-170500-npm-distribution-modes/evidence/20260407-dual-mode-and-publish-readiness.md +8 -10
- package/examples/baseline/.ys_team/VERSION +1 -1
- package/examples/baseline/.ys_team/memory/policy.md +66 -0
- package/examples/baseline/.ys_team/memory/roles/delivery-guard.md +3 -0
- package/examples/baseline/.ys_team/memory/roles/doc-spec-steward.md +3 -0
- package/examples/baseline/.ys_team/memory/roles/domain-integrator.md +3 -0
- package/examples/baseline/.ys_team/memory/roles/project-architect.md +3 -0
- package/examples/baseline/.ys_team/memory/roles/qa-guard.md +3 -0
- package/examples/baseline/.ys_team/memory/roles/spec-reviewer.md +3 -0
- package/examples/baseline/.ys_team/roles/internal/qa-guard.md +30 -0
- package/examples/baseline/.ys_team/roles/internal/spec-reviewer.md +28 -0
- package/examples/baseline/.ys_team/status.md +22 -3
- package/examples/baseline/.ys_team/team.md +6 -0
- package/examples/baseline/TEAM.md +43 -0
- package/package.json +1 -1
- package/scripts/ys-team.mjs +68 -0
- package/skills/ys-team/SKILL.md +66 -0
- package/skills/ys-team-init/SKILL.md +21 -0
- package/skills/ys-team-rebuild/SKILL.md +20 -0
- package/skills/ys-team-spec-talk/SKILL.md +41 -6
- package/skills/ys-team-spec-work/SKILL.md +29 -0
- package/skills/ys-team-status/SKILL.md +13 -7
- package/skills/ys-team-submit/SKILL.md +20 -0
- /package/docs/specs/{active → completed}/20260407-170500-npm-distribution-modes/work-01-global-and-project-install.md +0 -0
- /package/docs/specs/{active → completed}/20260407-170500-npm-distribution-modes/work-02-doc-and-publish-readiness.md +0 -0
|
@@ -37,22 +37,20 @@
|
|
|
37
37
|
- 结果:PASS
|
|
38
38
|
- 说明:当前环境可识别 npm 用户 `ys7399`
|
|
39
39
|
|
|
40
|
-
### `npm view ys-team version name`
|
|
40
|
+
### `npm view ys-team version name dist-tags.latest`
|
|
41
41
|
|
|
42
42
|
- 结果:PASS
|
|
43
|
-
-
|
|
43
|
+
- 说明:registry 已返回 `ys-team@0.2.0`,`latest` 已指向 `0.2.0`
|
|
44
44
|
|
|
45
45
|
### `npm publish`
|
|
46
46
|
|
|
47
|
-
- 结果:
|
|
48
|
-
-
|
|
47
|
+
- 结果:PASS
|
|
48
|
+
- 说明:已成功发布 `ys-team@0.2.0`
|
|
49
49
|
|
|
50
50
|
## Current Conclusion
|
|
51
51
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
真实发布仍阻塞于:
|
|
52
|
+
双模式安装和 npm 发布链路都已完成闭环。
|
|
55
53
|
|
|
56
|
-
-
|
|
57
|
-
-
|
|
58
|
-
-
|
|
54
|
+
- 全局模式:`npx ys-team install-skills`
|
|
55
|
+
- 项目模式:`npx ys-team init-project --dir /path/to/project`
|
|
56
|
+
- npm registry:`ys-team@0.2.0`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
0.3.0
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# 记忆管理策略
|
|
2
|
+
|
|
3
|
+
## 结构
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
.ys_team/memory/
|
|
7
|
+
├── roles/ ← 角色独立记忆(跨任务经验)
|
|
8
|
+
│ └── <role>.md ← 每个角色一个文件
|
|
9
|
+
└── policy.md ← 本文件
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
工作记忆(workspace.md)不在此目录,而是跟随 spec 生命周期,位于 `docs/specs/<id>/workspace.md`。
|
|
13
|
+
|
|
14
|
+
## 角色独立记忆
|
|
15
|
+
|
|
16
|
+
- 每个角色只读写自己的记忆文件,互不可见
|
|
17
|
+
- 记录跨任务的经验积累,不记录当前任务的临时状态
|
|
18
|
+
- 长度上限由 TEAM.md 的 `memory.role_memory_limit` 配置(默认 2k)
|
|
19
|
+
|
|
20
|
+
### 写入时机
|
|
21
|
+
|
|
22
|
+
每个阶段结束时,角色回顾本次工作,决定是否有值得记住的经验。使用以下判断标准:
|
|
23
|
+
|
|
24
|
+
1. 是否发现了非显而易见的技术陷阱或模式?
|
|
25
|
+
2. 是否有需要在未来同类任务中注意的点?
|
|
26
|
+
3. 是否有关于这个项目/模块的特殊知识?
|
|
27
|
+
|
|
28
|
+
无新认知时不写入。
|
|
29
|
+
|
|
30
|
+
### 压缩策略
|
|
31
|
+
|
|
32
|
+
读取记忆时发现超限,结合本次要写入的新内容一起压缩:
|
|
33
|
+
|
|
34
|
+
- 保留所有仍然相关的经验
|
|
35
|
+
- 合并相似条目
|
|
36
|
+
- 删除已过时或被后续经验覆盖的条目
|
|
37
|
+
- 保留具体的文件路径、错误信息、配置值,不泛化
|
|
38
|
+
- 压缩后不超过配置上限
|
|
39
|
+
|
|
40
|
+
### 记忆格式
|
|
41
|
+
|
|
42
|
+
```markdown
|
|
43
|
+
# <role> 经验记忆
|
|
44
|
+
|
|
45
|
+
## <主题 1>
|
|
46
|
+
- 具体经验条目(含日期标记)
|
|
47
|
+
|
|
48
|
+
## <主题 2>
|
|
49
|
+
- 具体经验条目(含日期标记)
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
按主题分组,每条经验附日期,便于判断时效性。
|
|
53
|
+
|
|
54
|
+
## 工作记忆(workspace.md)
|
|
55
|
+
|
|
56
|
+
- 位于 `docs/specs/<id>/workspace.md`
|
|
57
|
+
- 记录当前任务的实时状态:进度、阻塞、决策、各阶段间传递的上下文
|
|
58
|
+
- 长度上限由 TEAM.md 的 `memory.workspace_limit` 配置(默认 2k)
|
|
59
|
+
- spec 关闭后自动归档(随 spec 目录保留)
|
|
60
|
+
|
|
61
|
+
## 健康检查
|
|
62
|
+
|
|
63
|
+
rebuild 时检查:
|
|
64
|
+
- 角色记忆文件是否超限
|
|
65
|
+
- 是否有角色记忆文件对应的角色已从 TEAM.md 移除(标记为归档,不删除)
|
|
66
|
+
- 是否有新角色缺少记忆文件(自动创建空文件)
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# qa-guard
|
|
2
|
+
Title: 质量保障守门人
|
|
3
|
+
subagent_policy: local_only
|
|
4
|
+
|
|
5
|
+
独立验证落地效果是否符合 spec。读取 spec、代码变更和测试结果,不参与执行过程,确保验证客观性。
|
|
6
|
+
|
|
7
|
+
## 职责
|
|
8
|
+
|
|
9
|
+
- 对比 control.md 的 verification 条目与实际落地结果
|
|
10
|
+
- 执行或检查测试命令,验证功能正确性
|
|
11
|
+
- 检查 write-scope 内的代码变更是否符合 spec 要求
|
|
12
|
+
- 识别遗漏的验收点、未覆盖的边界条件
|
|
13
|
+
- 输出 qa-report.md(result card 格式:PASS / REJECT + issues)
|
|
14
|
+
|
|
15
|
+
## 输入
|
|
16
|
+
|
|
17
|
+
- `docs/specs/<id>/control.md`(spec 定义)
|
|
18
|
+
- `docs/specs/<id>/work.md`(执行记录)
|
|
19
|
+
- `docs/specs/<id>/workspace.md`(工作记忆)
|
|
20
|
+
- 项目代码(write-scope 范围内)
|
|
21
|
+
|
|
22
|
+
## 输出
|
|
23
|
+
|
|
24
|
+
- `docs/specs/<id>/qa-report.md`
|
|
25
|
+
|
|
26
|
+
## 约束
|
|
27
|
+
|
|
28
|
+
- 只读 + 可执行测试命令,不修改业务代码
|
|
29
|
+
- 不参与执行过程的讨论或决策
|
|
30
|
+
- 验证意见必须具体到哪个 verification 条目、实际结果是什么、差异在哪
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# spec-reviewer
|
|
2
|
+
Title: 规格审阅人
|
|
3
|
+
subagent_policy: local_only
|
|
4
|
+
|
|
5
|
+
独立审阅 spec 是否完整覆盖原始需求。只接触需求文件和 spec 文件,不接触讨论历史,确保审阅客观性。
|
|
6
|
+
|
|
7
|
+
## 职责
|
|
8
|
+
|
|
9
|
+
- 对比 requirement.md 和 control.md,检查需求覆盖完整性
|
|
10
|
+
- 检查 spec 的 write-scope 是否合理、verification 是否可执行
|
|
11
|
+
- 识别遗漏的边界条件、异常路径、依赖关系
|
|
12
|
+
- 输出 review.md(result card 格式:PASS / REJECT + issues)
|
|
13
|
+
|
|
14
|
+
## 输入
|
|
15
|
+
|
|
16
|
+
- `docs/specs/<id>/requirement.md`(原始需求)
|
|
17
|
+
- `docs/specs/<id>/control.md`(spec 定义)
|
|
18
|
+
- 项目现实索引(`docs/project/module-index.md`,如存在)
|
|
19
|
+
|
|
20
|
+
## 输出
|
|
21
|
+
|
|
22
|
+
- `docs/specs/<id>/review.md`
|
|
23
|
+
|
|
24
|
+
## 约束
|
|
25
|
+
|
|
26
|
+
- 只读权限,不修改任何文件(review.md 除外)
|
|
27
|
+
- 不接触讨论历史或 workspace.md
|
|
28
|
+
- 审阅意见必须具体到 spec 的哪个部分、缺什么、为什么
|
|
@@ -4,9 +4,28 @@ updated: —
|
|
|
4
4
|
|
|
5
5
|
## 活跃 Spec
|
|
6
6
|
|
|
7
|
-
| Spec | 阶段 | 负责角色 |
|
|
8
|
-
|
|
9
|
-
| — | — | — | — |
|
|
7
|
+
| Spec | 阶段 | 状态 | 负责角色 | 重试次数 | 模式 |
|
|
8
|
+
|------|------|------|---------|---------|------|
|
|
9
|
+
| — | — | — | — | — | — |
|
|
10
|
+
|
|
11
|
+
### 状态值
|
|
12
|
+
|
|
13
|
+
- `idle` — 未开始
|
|
14
|
+
- `spec-talk` — 讨论中
|
|
15
|
+
- `spec-review` — 审阅中
|
|
16
|
+
- `spec-work` — 执行中
|
|
17
|
+
- `qa` — 验证中
|
|
18
|
+
- `close` — 关闭中
|
|
19
|
+
- `done` — 已完成
|
|
20
|
+
- `halt` — 已暂停(重试耗尽,等用户决策)
|
|
21
|
+
|
|
22
|
+
### 状态流转
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
idle → spec-talk → spec-review → spec-work → qa → close → done
|
|
26
|
+
↑ [REJECT] ←┘ ↑ [REJECT] ←┘
|
|
27
|
+
↑ [EXHAUST] → halt ↑ [EXHAUST] → halt
|
|
28
|
+
```
|
|
10
29
|
|
|
11
30
|
## 最新判断
|
|
12
31
|
|
|
@@ -8,6 +8,10 @@
|
|
|
8
8
|
- tools: []
|
|
9
9
|
- `doc-spec-steward`
|
|
10
10
|
- tools: []
|
|
11
|
+
- `spec-reviewer`
|
|
12
|
+
- tools: []
|
|
13
|
+
- `qa-guard`
|
|
14
|
+
- tools: []
|
|
11
15
|
- `delivery-guard`
|
|
12
16
|
- tools: []
|
|
13
17
|
|
|
@@ -16,6 +20,8 @@
|
|
|
16
20
|
- 涉及系统边界、模块职责和主链路设计时,必须包含 `project-architect`。
|
|
17
21
|
- 涉及外部系统、契约、集成面或领域适配时,必须包含 `domain-integrator`。
|
|
18
22
|
- 涉及项目文档、spec、模板或对外说明时,必须包含 `doc-spec-steward`。
|
|
23
|
+
- spec 落地前的独立审阅,必须包含 `spec-reviewer`。
|
|
24
|
+
- 落地效果验证,必须包含 `qa-guard`。
|
|
19
25
|
- 涉及验收、风险、回滚和证据时,必须包含 `delivery-guard`。
|
|
20
26
|
|
|
21
27
|
## Tools Binding
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Team Configuration
|
|
2
|
+
|
|
3
|
+
## mode
|
|
4
|
+
|
|
5
|
+
default: manual
|
|
6
|
+
# manual: 用户手动推进每个阶段(现有模式)
|
|
7
|
+
# semi-auto: 自动流转,执行前和关闭前暂停等确认
|
|
8
|
+
# full-auto: 全自动,只在重试耗尽时暂停
|
|
9
|
+
|
|
10
|
+
## limits
|
|
11
|
+
|
|
12
|
+
spec_review_max_retries: 3
|
|
13
|
+
qa_max_retries: 3
|
|
14
|
+
auto_downgrade_on_exhaust: true
|
|
15
|
+
|
|
16
|
+
## memory
|
|
17
|
+
|
|
18
|
+
role_memory_limit: 2k
|
|
19
|
+
workspace_limit: 2k
|
|
20
|
+
|
|
21
|
+
## roles
|
|
22
|
+
|
|
23
|
+
# 从方法论角色库中选用,init 时根据项目类型推荐默认组合
|
|
24
|
+
# 用户可自由增删改,角色定义在 .ys_team/roles/ 中
|
|
25
|
+
|
|
26
|
+
- project-architect: tools: [Read, Write, Edit, Bash, Glob, Grep]
|
|
27
|
+
- domain-integrator: tools: [Read, Write, Edit, Bash, Glob, Grep]
|
|
28
|
+
- doc-spec-steward: tools: [Read, Write, Edit, Glob, Grep]
|
|
29
|
+
- spec-reviewer: tools: [Read, Glob, Grep]
|
|
30
|
+
- qa-guard: tools: [Read, Glob, Grep, Bash]
|
|
31
|
+
- delivery-guard: tools: [Read, Glob, Grep]
|
|
32
|
+
|
|
33
|
+
## spec_dir
|
|
34
|
+
|
|
35
|
+
docs/specs/
|
|
36
|
+
|
|
37
|
+
## state_machine
|
|
38
|
+
|
|
39
|
+
# Spec 生命周期状态流转(持久化在 status.md 每个 spec 条目中)
|
|
40
|
+
# idle → spec-talk → spec-review → spec-work → qa → close → done
|
|
41
|
+
# spec-review REJECT → spec-talk(重试)
|
|
42
|
+
# qa REJECT → spec-work(重试)
|
|
43
|
+
# 重试耗尽 → halt(降级半自动,等用户决策)
|
package/package.json
CHANGED
package/scripts/ys-team.mjs
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
import fs from "node:fs";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import os from "node:os";
|
|
6
|
+
import https from "node:https";
|
|
6
7
|
import { fileURLToPath } from "node:url";
|
|
7
8
|
|
|
8
9
|
const __filename = fileURLToPath(import.meta.url);
|
|
@@ -26,6 +27,7 @@ function helpText() {
|
|
|
26
27
|
"- ys-team --help",
|
|
27
28
|
"- ys-team install-skills [--dest <dir>] [--force] [--dry-run]",
|
|
28
29
|
"- ys-team init-project [--dir <project-dir>] [--force] [--dry-run]",
|
|
30
|
+
"- ys-team check-update",
|
|
29
31
|
"",
|
|
30
32
|
"Default global install destination:",
|
|
31
33
|
`- ${defaultSkillsDir()}`,
|
|
@@ -253,6 +255,61 @@ function initProject({ dir, force, dryRun }) {
|
|
|
253
255
|
].join("\n");
|
|
254
256
|
}
|
|
255
257
|
|
|
258
|
+
function fetchLatestVersion(packageName) {
|
|
259
|
+
return new Promise((resolve, reject) => {
|
|
260
|
+
const url = `https://registry.npmjs.org/${packageName}/latest`;
|
|
261
|
+
https.get(url, { headers: { Accept: "application/json" } }, (res) => {
|
|
262
|
+
let data = "";
|
|
263
|
+
res.on("data", (chunk) => { data += chunk; });
|
|
264
|
+
res.on("end", () => {
|
|
265
|
+
try {
|
|
266
|
+
const json = JSON.parse(data);
|
|
267
|
+
resolve(json.version);
|
|
268
|
+
} catch {
|
|
269
|
+
reject(new Error("解析 npm registry 响应失败"));
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
}).on("error", reject);
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
function compareVersions(a, b) {
|
|
277
|
+
const pa = a.split(".").map(Number);
|
|
278
|
+
const pb = b.split(".").map(Number);
|
|
279
|
+
for (let i = 0; i < 3; i++) {
|
|
280
|
+
if ((pa[i] ?? 0) > (pb[i] ?? 0)) return 1;
|
|
281
|
+
if ((pa[i] ?? 0) < (pb[i] ?? 0)) return -1;
|
|
282
|
+
}
|
|
283
|
+
return 0;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
async function checkUpdate() {
|
|
287
|
+
const localPkg = JSON.parse(fs.readFileSync(path.join(packageRoot, "package.json"), "utf8"));
|
|
288
|
+
const localVersion = localPkg.version;
|
|
289
|
+
|
|
290
|
+
process.stdout.write("正在检查更新...\n");
|
|
291
|
+
const latestVersion = await fetchLatestVersion(localPkg.name);
|
|
292
|
+
const cmp = compareVersions(latestVersion, localVersion);
|
|
293
|
+
|
|
294
|
+
const lines = [
|
|
295
|
+
"ys-team check-update",
|
|
296
|
+
"",
|
|
297
|
+
`已安装版本: v${localVersion}`,
|
|
298
|
+
`npm 最新版: v${latestVersion}`,
|
|
299
|
+
];
|
|
300
|
+
|
|
301
|
+
if (cmp === 0) {
|
|
302
|
+
lines.push("", "已是最新版本。");
|
|
303
|
+
} else if (cmp > 0) {
|
|
304
|
+
lines.push("", "发现新版本,运行以下命令更新 skills:");
|
|
305
|
+
lines.push(` npx ys-team@${latestVersion} install-skills --force`);
|
|
306
|
+
} else {
|
|
307
|
+
lines.push("", "本地版本比 npm 更新(开发中或未发布)。");
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
return lines.join("\n");
|
|
311
|
+
}
|
|
312
|
+
|
|
256
313
|
function main() {
|
|
257
314
|
try {
|
|
258
315
|
const args = parseArgs(process.argv);
|
|
@@ -272,6 +329,17 @@ function main() {
|
|
|
272
329
|
process.exit(0);
|
|
273
330
|
}
|
|
274
331
|
|
|
332
|
+
if (args.command === "check-update") {
|
|
333
|
+
checkUpdate().then((output) => {
|
|
334
|
+
console.log(output);
|
|
335
|
+
process.exit(0);
|
|
336
|
+
}).catch((err) => {
|
|
337
|
+
console.error(`ys-team error: ${err.message}`);
|
|
338
|
+
process.exit(1);
|
|
339
|
+
});
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
|
|
275
343
|
console.error(`Unsupported command: ${args.command}`);
|
|
276
344
|
console.error("Run `ys-team --help`.");
|
|
277
345
|
process.exit(1);
|
package/skills/ys-team/SKILL.md
CHANGED
|
@@ -64,6 +64,69 @@ Its job is to keep the conversation anchored in:
|
|
|
64
64
|
- 用户明确声明是 trivial(如"修拼写错误"、"改注释")
|
|
65
65
|
- **原则**:举证责任在"跳过路由",而不在"触发路由"。不确定时,触发。
|
|
66
66
|
|
|
67
|
+
## TEAM.md 加载
|
|
68
|
+
|
|
69
|
+
当仓库存在 `TEAM.md` 时,ys-team 入口 skill 必须在路由判断前加载它。
|
|
70
|
+
|
|
71
|
+
`TEAM.md` 是 ys-team 工作流的唯一用户配置面板,包含:
|
|
72
|
+
- `mode`:工作模式(manual / semi-auto / full-auto)
|
|
73
|
+
- `limits`:重试上限、降级策略
|
|
74
|
+
- `memory`:记忆配额
|
|
75
|
+
- `roles`:本项目启用的角色及工具权限
|
|
76
|
+
- `spec_dir`:spec 目录路径
|
|
77
|
+
|
|
78
|
+
如果 `TEAM.md` 不存在,使用默认值(mode: manual,其余同 baseline)。
|
|
79
|
+
|
|
80
|
+
## 编排模式
|
|
81
|
+
|
|
82
|
+
根据 `TEAM.md` 的 `mode` 配置,ys-team 入口 skill 有三种行为模式:
|
|
83
|
+
|
|
84
|
+
### manual(默认)
|
|
85
|
+
|
|
86
|
+
现有行为完全不变。用户手动推进每个阶段,ys-team 只做路由判断。
|
|
87
|
+
新增的 spec-review 和 qa 阶段作为可用选项,用户可手动触发。
|
|
88
|
+
|
|
89
|
+
### semi-auto
|
|
90
|
+
|
|
91
|
+
用户提出需求后,主 session 进入编排循环,自动推进阶段流转:
|
|
92
|
+
|
|
93
|
+
1. **spec-talk**:用 Agent tool 启动 subagent,多角色讨论,产出 spec 和 requirement.md
|
|
94
|
+
2. **spec-review**:用 Agent tool 启动独立 subagent(prompt 只传文件路径,不传讨论历史)
|
|
95
|
+
- PASS → 继续
|
|
96
|
+
- REJECT → 回 spec-talk,将 review.md 作为输入,重试计数 +1
|
|
97
|
+
- 重试耗尽 → halt,输出当前状态,等用户决策
|
|
98
|
+
3. **spec-work**:**暂停,提示用户确认后再启动** subagent 执行
|
|
99
|
+
4. **qa**:用 Agent tool 启动独立 subagent,验证落地效果
|
|
100
|
+
- PASS → 继续
|
|
101
|
+
- REJECT → 回 spec-work,将 qa-report.md 作为输入,重试计数 +1
|
|
102
|
+
- 重试耗尽 → halt
|
|
103
|
+
5. **close**:汇总报告输出,**暂停,等用户确认后执行** git commit + 更新 status.md 为 done
|
|
104
|
+
|
|
105
|
+
### full-auto
|
|
106
|
+
|
|
107
|
+
与 semi-auto 相同,但:
|
|
108
|
+
- 阶段 3(spec-work)不暂停,直接启动
|
|
109
|
+
- 阶段 5(close)不暂停,自动执行 git commit
|
|
110
|
+
- 重试耗尽时仍然暂停(自动降级为半自动)
|
|
111
|
+
|
|
112
|
+
### 编排规则
|
|
113
|
+
|
|
114
|
+
- 每个阶段的 subagent 启动时,从 TEAM.md 读取该角色的工具权限,在 prompt 中声明
|
|
115
|
+
- 每个阶段结束后,更新 status.md 中该 spec 的状态机字段
|
|
116
|
+
- 阶段间通信通过 spec 目录下的文件(requirement.md、control.md、review.md、workspace.md、qa-report.md)
|
|
117
|
+
- subagent prompt 只传文件路径,不传内容,确保上下文隔离
|
|
118
|
+
- 每个 subagent 启动时读取自己的角色记忆(`.ys_team/memory/roles/<role>.md`),结束时回顾并写入新经验
|
|
119
|
+
|
|
120
|
+
### 记忆集成
|
|
121
|
+
|
|
122
|
+
所有模式下(包括 manual),角色在工作时都应:
|
|
123
|
+
1. 启动时读取 `.ys_team/memory/roles/<role>.md`(如存在)
|
|
124
|
+
2. 读取当前 spec 的 `workspace.md`(如存在)
|
|
125
|
+
3. 结束时回顾本次工作,有新经验则写入角色记忆
|
|
126
|
+
4. 更新 workspace.md 的工作状态
|
|
127
|
+
|
|
128
|
+
记忆读写遵循 `.ys_team/memory/policy.md` 的规则。
|
|
129
|
+
|
|
67
130
|
## 排他工作流
|
|
68
131
|
|
|
69
132
|
ys-team 启用后,工作流具有排他性:
|
|
@@ -105,8 +168,11 @@ ys-team 启用后,工作流具有排他性:
|
|
|
105
168
|
|
|
106
169
|
**其他环节**也必须保留可见标志:
|
|
107
170
|
|
|
171
|
+
- `spec-review`:`**[审阅]** ys-team · spec-review`
|
|
108
172
|
- `spec-work`:`**[执行中]** ys-team · spec-work`
|
|
173
|
+
- `qa`:`**[质检]** ys-team · qa`
|
|
109
174
|
- `submit`:`**[验收]** ys-team · submit`
|
|
175
|
+
- `close`:`**[关闭]** ys-team · close`
|
|
110
176
|
- `status`:`**[状态]** ys-team · status`
|
|
111
177
|
|
|
112
178
|
如果当前响应末尾没有任何 `ys-team` 标记,应视为尚未进入 ys-team 工作流,并立刻回到路由判断。
|
|
@@ -43,11 +43,14 @@ Init 的第一步是确认用户主语言,所有角色名、角色卡、team.m
|
|
|
43
43
|
|
|
44
44
|
Generate or adapt:
|
|
45
45
|
|
|
46
|
+
- `TEAM.md`(从 `examples/baseline/TEAM.md` 适配,根据项目类型调整 roles 列表)
|
|
46
47
|
- `.ys_team/README.md`
|
|
47
48
|
- `.ys_team/team.md`
|
|
48
49
|
- `.ys_team/methods.md`
|
|
49
50
|
- `.ys_team/policy.md`
|
|
50
51
|
- `.ys_team/templates/`
|
|
52
|
+
- `.ys_team/memory/policy.md`(从 baseline 复制)
|
|
53
|
+
- `.ys_team/memory/roles/`(根据 TEAM.md 的 roles 列表生成空记忆文件)
|
|
51
54
|
- `docs/specs/`
|
|
52
55
|
- `docs/roadmap/`
|
|
53
56
|
|
|
@@ -138,6 +141,24 @@ internalized: [日期]
|
|
|
138
141
|
如需调整工具配置,可运行 /ys-team-rebuild。
|
|
139
142
|
```
|
|
140
143
|
|
|
144
|
+
## TEAM.md 生成
|
|
145
|
+
|
|
146
|
+
Init 时从 `examples/baseline/TEAM.md` 生成项目的 `TEAM.md`:
|
|
147
|
+
|
|
148
|
+
1. 复制 baseline TEAM.md 到项目根目录
|
|
149
|
+
2. 根据项目类型调整 roles 列表(如纯前端项目去掉 domain-integrator,加 frontend-accessibility-reviewer)
|
|
150
|
+
3. 默认 mode 为 manual
|
|
151
|
+
4. 提示用户可按需调整配置
|
|
152
|
+
|
|
153
|
+
## 记忆系统初始化
|
|
154
|
+
|
|
155
|
+
Init 时初始化记忆目录:
|
|
156
|
+
|
|
157
|
+
1. 从 `examples/baseline/.ys_team/memory/policy.md` 复制记忆策略
|
|
158
|
+
2. 创建 `.ys_team/memory/roles/` 目录
|
|
159
|
+
3. 根据 TEAM.md 的 roles 列表,为每个角色创建空记忆文件(`<role>.md`)
|
|
160
|
+
4. 提示用户记忆系统已就绪
|
|
161
|
+
|
|
141
162
|
## Status 初始化
|
|
142
163
|
|
|
143
164
|
Init 时从 `examples/baseline/.ys_team/status.md` 复制空模板到项目的 `.ys_team/status.md`。
|
|
@@ -75,6 +75,26 @@ Rebuild 时除了更新基础配置,还需评估和更新工具内化:
|
|
|
75
75
|
|
|
76
76
|
下次 rebuild 时会自动处理。
|
|
77
77
|
|
|
78
|
+
## TEAM.md 同步
|
|
79
|
+
|
|
80
|
+
Rebuild 时检查 TEAM.md 状态:
|
|
81
|
+
|
|
82
|
+
1. 如果项目没有 `TEAM.md`(旧版本项目),从 baseline 生成一份,保留项目已有的角色配置
|
|
83
|
+
2. 如果 baseline TEAM.md 有新增配置项(如新版本加了 memory 配置),合并到项目 TEAM.md 中,保留用户已有的自定义值
|
|
84
|
+
3. 如果 TEAM.md 的 roles 列表与 `.ys_team/team.md` 不一致,以 TEAM.md 为准同步 team.md
|
|
85
|
+
|
|
86
|
+
## 记忆健康检查
|
|
87
|
+
|
|
88
|
+
Rebuild 时检查记忆系统状态:
|
|
89
|
+
|
|
90
|
+
1. 如果 `.ys_team/memory/` 不存在(旧版本项目),从 baseline 初始化
|
|
91
|
+
2. 检查角色记忆文件是否与 TEAM.md 的 roles 列表对齐:
|
|
92
|
+
- 新角色缺少记忆文件 → 创建空文件
|
|
93
|
+
- 角色已从 TEAM.md 移除但记忆文件存在 → 保留文件,在文件头部标记 `archived: true`
|
|
94
|
+
3. 检查角色记忆文件是否超限(对比 TEAM.md 的 `memory.role_memory_limit`):
|
|
95
|
+
- 超限的文件 → 提示用户,建议在下次角色工作时自动压缩
|
|
96
|
+
4. 检查 `memory/policy.md` 是否需要更新(对比 baseline 版本)
|
|
97
|
+
|
|
78
98
|
## Doc-Build Integration
|
|
79
99
|
|
|
80
100
|
After baseline update is complete, automatically invoke `ys-team-doc-build` to rebuild the reality index. This ensures `docs/project/module-index.md` reflects current project structure after any rebuild.
|
|
@@ -9,12 +9,15 @@ Use this skill to discuss a non-trivial change using project-local team guidance
|
|
|
9
9
|
|
|
10
10
|
## Read Order
|
|
11
11
|
|
|
12
|
-
1.
|
|
13
|
-
2. `.ys_team/
|
|
14
|
-
3. `.ys_team/
|
|
15
|
-
4. `.ys_team/
|
|
16
|
-
5.
|
|
17
|
-
6.
|
|
12
|
+
1. `TEAM.md`(如存在,获取 mode、limits、memory 配置)
|
|
13
|
+
2. `.ys_team/README.md`
|
|
14
|
+
3. `.ys_team/team.md`
|
|
15
|
+
4. `.ys_team/methods.md` if present
|
|
16
|
+
5. `.ys_team/policy.md`
|
|
17
|
+
6. 参与角色的记忆文件(`.ys_team/memory/roles/<role>.md`)
|
|
18
|
+
7. 当前 spec 的 `workspace.md`(如存在,用于接续之前的讨论上下文)
|
|
19
|
+
8. repository project/docs context
|
|
20
|
+
9. relevant active or queued specs or roadmaps if the task extends existing work
|
|
18
21
|
|
|
19
22
|
## Loading Discipline
|
|
20
23
|
|
|
@@ -122,6 +125,38 @@ These sections should summarize:
|
|
|
122
125
|
3. 如果用户同意,立即发起进化评估讨论(由现有角色参与,讨论是否引入新角色)
|
|
123
126
|
4. 讨论收敛后:PASS → 创建角色卡并加入 team.md / REJECT → 记录原因关闭申请
|
|
124
127
|
|
|
128
|
+
## Requirement 记录
|
|
129
|
+
|
|
130
|
+
当讨论产出 spec 时,必须同时将原始需求写入 `docs/specs/<id>/requirement.md`:
|
|
131
|
+
|
|
132
|
+
- 提取用户最初的需求描述(原文或精简版)
|
|
133
|
+
- 记录需求来源(用户口述、Issue 链接等)
|
|
134
|
+
- 此文件是 spec-review 阶段的核心输入之一
|
|
135
|
+
|
|
136
|
+
## Workspace 写入
|
|
137
|
+
|
|
138
|
+
讨论收敛后,将关键上下文写入 `docs/specs/<id>/workspace.md`:
|
|
139
|
+
|
|
140
|
+
- 讨论中的关键决策和取舍
|
|
141
|
+
- 各角色的核心观点摘要
|
|
142
|
+
- 遗留问题或待确认事项
|
|
143
|
+
- 长度不超过 TEAM.md 的 `memory.workspace_limit` 配置
|
|
144
|
+
|
|
145
|
+
此文件是后续阶段(spec-review、spec-work)的共享工作记忆。
|
|
146
|
+
|
|
147
|
+
## 角色记忆回顾
|
|
148
|
+
|
|
149
|
+
讨论收敛后、写入 status.md 之前,每个参与角色回顾本次讨论:
|
|
150
|
+
|
|
151
|
+
1. 读取自己的记忆文件(`.ys_team/memory/roles/<role>.md`)
|
|
152
|
+
2. 判断本次讨论是否有值得记录的跨任务经验
|
|
153
|
+
3. 如有,检查记忆是否超限:
|
|
154
|
+
- 未超限:直接追加新经验
|
|
155
|
+
- 已超限:结合新经验一起压缩后写回
|
|
156
|
+
4. 如无新经验,不写入
|
|
157
|
+
|
|
158
|
+
记忆读写遵循 `.ys_team/memory/policy.md` 的规则。
|
|
159
|
+
|
|
125
160
|
## Status 写入
|
|
126
161
|
|
|
127
162
|
讨论收敛后(产出 result card 时),必须同步更新 `.ys_team/status.md`:
|
|
@@ -23,6 +23,35 @@ Use it to execute approved work against an existing repository spec.
|
|
|
23
23
|
- keep implementation, docs, and evidence in sync
|
|
24
24
|
- surface blockers instead of silently changing scope
|
|
25
25
|
|
|
26
|
+
## Read Order
|
|
27
|
+
|
|
28
|
+
1. `TEAM.md`(如存在,获取 mode、limits、memory 配置)
|
|
29
|
+
2. 当前 spec 的 `control.md`(执行合约)
|
|
30
|
+
3. 当前 spec 的 `workspace.md`(工作记忆,了解前序阶段的上下文)
|
|
31
|
+
4. 当前 spec 的 `qa-report.md`(如存在,说明是 QA 打回后的重试,需针对性修复)
|
|
32
|
+
5. 执行角色的记忆文件(`.ys_team/memory/roles/<role>.md`)
|
|
33
|
+
6. `.ys_team/policy.md`
|
|
34
|
+
|
|
35
|
+
## Workspace 更新
|
|
36
|
+
|
|
37
|
+
执行过程中持续更新 `docs/specs/<id>/workspace.md`:
|
|
38
|
+
|
|
39
|
+
- 执行开始时:记录执行计划和预期步骤
|
|
40
|
+
- 遇到关键决策时:记录决策和原因
|
|
41
|
+
- 遇到阻塞时:记录阻塞原因和尝试的解决方案
|
|
42
|
+
- 执行完成时:记录完成状态和实际变更摘要
|
|
43
|
+
|
|
44
|
+
长度不超过 TEAM.md 的 `memory.workspace_limit` 配置。
|
|
45
|
+
|
|
46
|
+
## 角色记忆回顾
|
|
47
|
+
|
|
48
|
+
执行完成后,角色回顾本次工作:
|
|
49
|
+
|
|
50
|
+
1. 读取自己的记忆文件
|
|
51
|
+
2. 判断是否有值得记录的跨任务经验(技术陷阱、模块特殊知识等)
|
|
52
|
+
3. 如有,检查记忆是否超限,超限则压缩后写回
|
|
53
|
+
4. 如无新经验,不写入
|
|
54
|
+
|
|
26
55
|
## 进化感知(工具缺口)
|
|
27
56
|
|
|
28
57
|
执行过程中,主动检测是否存在工具缺口:
|
|
@@ -17,14 +17,16 @@ Use it to display the live ys-team state of a repository.
|
|
|
17
17
|
|
|
18
18
|
## Behavior
|
|
19
19
|
|
|
20
|
-
1. 读取
|
|
21
|
-
2.
|
|
22
|
-
3.
|
|
23
|
-
|
|
20
|
+
1. 读取 `TEAM.md`(如存在,获取当前 mode 配置)
|
|
21
|
+
2. 读取 `.ys_team/status.md`
|
|
22
|
+
3. 如果文件不存在或 `updated` 为空(`—`),提示:"团队状态尚未初始化。首次执行 spec-talk 或 spec-work 后,状态会自动更新。"
|
|
23
|
+
4. 如果文件存在且有数据,格式化输出:
|
|
24
|
+
- 当前模式(manual / semi-auto / full-auto)
|
|
25
|
+
- 活跃 Spec 列表(含状态机当前状态和重试次数)
|
|
24
26
|
- 最新判断(最近 5 条)
|
|
25
27
|
- 阻塞项(高亮显示)
|
|
26
28
|
- 待办事项
|
|
27
|
-
|
|
29
|
+
5. 检查 `.ys_team/VERSION` 与 baseline 版本对齐
|
|
28
30
|
|
|
29
31
|
## Version Notice
|
|
30
32
|
|
|
@@ -60,8 +62,12 @@ updated: [ISO 8601 时间戳]
|
|
|
60
62
|
|
|
61
63
|
## 活跃 Spec
|
|
62
64
|
|
|
63
|
-
| Spec | 阶段 | 负责角色 |
|
|
64
|
-
|
|
65
|
+
| Spec | 阶段 | 状态 | 负责角色 | 重试次数 | 模式 |
|
|
66
|
+
|------|------|------|---------|---------|------|
|
|
67
|
+
|
|
68
|
+
### 状态值
|
|
69
|
+
|
|
70
|
+
- idle / spec-talk / spec-review / spec-work / qa / close / done / halt
|
|
65
71
|
|
|
66
72
|
## 最新判断
|
|
67
73
|
|
|
@@ -9,6 +9,8 @@ This is a silent internal skill.
|
|
|
9
9
|
|
|
10
10
|
Use it when a repository needs a heavier delivery gate.
|
|
11
11
|
|
|
12
|
+
**注意**:submit 只负责验收判断,不负责关闭动作。关闭(git commit、状态更新为 done)由编排器的 close 阶段执行。
|
|
13
|
+
|
|
12
14
|
## Purpose
|
|
13
15
|
|
|
14
16
|
- review spec acceptance against actual delivery
|
|
@@ -21,6 +23,24 @@ Use it when a repository needs a heavier delivery gate.
|
|
|
21
23
|
- focus on delivery truth, not optimistic summary
|
|
22
24
|
- call out missing evidence or unsynced docs clearly
|
|
23
25
|
- prefer explicit PASS/BLOCKED/REJECT outcomes
|
|
26
|
+
- **不执行关闭动作**——判断完成后输出结论,由编排器决定下一步
|
|
27
|
+
|
|
28
|
+
## Read Order
|
|
29
|
+
|
|
30
|
+
1. `TEAM.md`(如存在)
|
|
31
|
+
2. 当前 spec 的 `control.md`(验收合约)
|
|
32
|
+
3. 当前 spec 的 `work.md`(执行记录)
|
|
33
|
+
4. 当前 spec 的 `workspace.md`(工作记忆)
|
|
34
|
+
5. delivery-guard 的记忆文件(`.ys_team/memory/roles/delivery-guard.md`)
|
|
35
|
+
6. `.ys_team/policy.md`(submit gate 规则)
|
|
36
|
+
|
|
37
|
+
## 角色记忆回顾
|
|
38
|
+
|
|
39
|
+
验收完成后,delivery-guard 回顾本次验收:
|
|
40
|
+
|
|
41
|
+
1. 读取自己的记忆文件
|
|
42
|
+
2. 判断是否有值得记录的验收经验
|
|
43
|
+
3. 如有,检查记忆是否超限,超限则压缩后写回
|
|
24
44
|
|
|
25
45
|
## Status 写入
|
|
26
46
|
|
|
File without changes
|
|
File without changes
|