team-skills 1.1.0 → 1.1.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.
@@ -1,183 +1,65 @@
1
1
  ---
2
- description: 将当前仓库的 skills commands 安装到指定目录(默认 ~/.agents/skills),含 _team-rules/ 共享规则
2
+ description: 安装 team-skills Skills、斜杠命令和 Hooks 到全局目录
3
3
  argument-hint: [target-dir]
4
4
  ---
5
5
 
6
- # /team-setup — Skills 安装命令
6
+ # /team-setup — Skills 全局安装
7
7
 
8
8
  ## 功能
9
9
 
10
- 将本仓库的所有内容软链接到目标目录,使 Claude Code 和 Cursor 都能发现并使用,且后续通过 `/team-pull` 即可同步更新。
10
+ team-skills 的所有组件以 symlink 方式安装到全局目录,使 Claude Code 和 Cursor 都能发现并使用。
11
11
 
12
- 安装内容:
12
+ ## 安装内容
13
13
 
14
- - `skills/*` `{target-dir}/`(Agent Skills,含 using-team-skills meta-skill)
15
- - `skills/_team-rules/*` → `{target-dir}/_team-rules/`(共享规则文件,被所有 Skill 引用)
16
- - `.claude/commands/*` `{target-dir}/{name}/SKILL.md`(Commands 也作为 Skill 安装,Cursor 可发现)
17
- - `.claude/commands/*` `~/.claude/commands/`(兼容 Claude Code 斜杠命令)
18
- - `hooks/hooks.json` Cursor/Claude Code hooks 目录(可选,用于 session-start 注入)
14
+ | 组件 | 目标位置 | 说明 |
15
+ |------|----------|------|
16
+ | Agent Skills | `~/.agents/skills/{name}` | Cursor 自动发现 |
17
+ | Skill 斜杠命令 | `~/.claude/commands/{name}.md` | Claude Code `/team-{name}` |
18
+ | 共享规则 | `~/.agents/skills/_team-rules/` | 被所有 Skill 引用 |
19
+ | CLI 辅助命令 | 两端均安装 | team-setup/uninstall/pull/push |
20
+ | Hooks(可选) | `~/.cursor/hooks/` | session-start 自动加载 |
19
21
 
20
- ## 参数
21
-
22
- - `$1`(可选):目标目录,默认为 `~/.agents/skills`
23
-
24
- ## 执行步骤
25
-
26
- ### 1. 确定目标目录
27
-
28
- ```bash
29
- set -euo pipefail
30
- TARGET="${1:-$HOME/.agents/skills}"
31
- REPO_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || echo "$(cd "$(dirname "$0")/../.." && pwd)")"
32
- mkdir -p "$TARGET"
33
- echo "目标目录: $TARGET"
34
- echo "仓库根目录: $REPO_ROOT"
35
- ```
36
-
37
- ### 2. 安装 Agent Skills
38
-
39
- 对本仓库 `skills/` 下的每个子目录(排除 `_team-rules` 和 `CLAUDE.md`),在目标目录下创建同名软链接。
22
+ ## 使用方式
40
23
 
41
24
  ```bash
42
- for dir in "$REPO_ROOT/skills"/*/; do
43
- name="$(basename "$dir")"
44
- # 跳过 _team-rules(单独处理)
45
- [ "$name" = "_team-rules" ] && continue
46
- ln -sfn "$dir" "$TARGET/$name"
47
- echo " ✅ Skill: $name → $TARGET/$name"
48
- done
49
- ```
25
+ # 基本安装
26
+ team-skills setup
50
27
 
51
- ### 3. 安装共享规则(_team-rules)
28
+ # 含可选的 team-score 评分 Skill
29
+ team-skills setup --with-score
52
30
 
53
- ```bash
54
- mkdir -p "$TARGET/_team-rules"
55
- for f in "$REPO_ROOT/skills/_team-rules"/*; do
56
- [ -f "$f" ] || continue
57
- ln -sf "$f" "$TARGET/_team-rules/$(basename "$f")"
58
- echo " ✅ Rule: $(basename "$f")"
59
- done
60
- ```
31
+ # 覆盖已有安装
32
+ team-skills setup --force
61
33
 
62
- ### 4. 安装 Commands(作为 Skill,供 Cursor 发现)
34
+ # 跳过 Hooks
35
+ team-skills setup --no-hooks
63
36
 
64
- 对本仓库 `.claude/commands/` 下的每个 `.md` 文件,在目标目录下创建 `{name}/SKILL.md` 软链接。
37
+ # 预览不执行
38
+ team-skills setup --dry-run
65
39
 
66
- ```bash
67
- for cmd in "$REPO_ROOT/.claude/commands"/*.md; do
68
- [ -f "$cmd" ] || continue
69
- name="$(basename "$cmd" .md)"
70
- # 跳过已作为 Skill 安装的同名目录,避免写入跟随 symlink
71
- if [ -L "$TARGET/$name" ]; then
72
- echo " ⚠️ Command Skill $name 跳过:已存在同名 Skill 目录"
73
- continue
74
- fi
75
- mkdir -p "$TARGET/$name"
76
- ln -sf "$cmd" "$TARGET/$name/SKILL.md"
77
- echo " ✅ Command Skill: $name → $TARGET/$name/SKILL.md"
78
- done
40
+ # 指定目标目录(默认 ~/.agents/skills)
41
+ team-skills setup /path/to/target
79
42
  ```
80
43
 
81
- ### 5. 安装 Commands(兼容 Claude Code 斜杠命令)
44
+ ## 选项
82
45
 
83
- ```bash
84
- mkdir -p "$HOME/.claude/commands"
85
- for cmd in "$REPO_ROOT/.claude/commands"/*.md; do
86
- [ -f "$cmd" ] || continue
87
- name="$(basename "$cmd")"
88
- ln -sf "$cmd" "$HOME/.claude/commands/$name"
89
- echo " ✅ Claude Command: $name → $HOME/.claude/commands/$name"
90
- done
91
- ```
46
+ | 选项 | 说明 |
47
+ |------|------|
48
+ | `--with-score` | 包含 team-score Skill(默认隐藏) |
49
+ | `--no-hooks` | 跳过 Hooks 安装 |
50
+ | `--force` | 覆盖已有的 symlink 和文件 |
51
+ | `--dry-run` | 只显示操作,不实际执行 |
92
52
 
93
- ### 6. 安装 Hooks(可选)
53
+ ## 验证
94
54
 
95
- 如果目标平台支持 hooks(Cursor / Claude Code),将 `hooks/hooks.json` 和 `hooks/session-start` 安装到对应平台的 hooks 目录。
55
+ 安装后会自动验证每个 symlink 是否正确创建。也可手动检查:
96
56
 
97
57
  ```bash
98
- install_hooks() {
99
- local hook_dir="$1"
100
- local platform="$2"
101
- mkdir -p "$hook_dir"
102
- if [ -f "$REPO_ROOT/hooks/hooks.json" ]; then
103
- ln -sf "$REPO_ROOT/hooks/hooks.json" "$hook_dir/hooks.json"
104
- echo " ✅ ${platform} hooks.json"
105
- fi
106
- if [ -f "$REPO_ROOT/hooks/session-start" ]; then
107
- ln -sf "$REPO_ROOT/hooks/session-start" "$hook_dir/session-start"
108
- chmod +x "$hook_dir/session-start" 2>/dev/null || true
109
- echo " ✅ ${platform} session-start"
110
- fi
111
- }
112
-
113
- # Cursor hooks
114
- install_hooks "$HOME/.cursor/hooks" "Cursor"
115
- # Claude Code hooks
116
- install_hooks "$HOME/.claude/hooks" "Claude Code"
58
+ team-skills list
117
59
  ```
118
60
 
119
- ## 验证
61
+ ## 卸载
120
62
 
121
63
  ```bash
122
- echo ""
123
- echo "=== 验证安装 ==="
124
-
125
- # 确认每个 Agent Skill 目录是软链接
126
- errors=0
127
- for dir in "$REPO_ROOT/skills"/*/; do
128
- name="$(basename "$dir")"
129
- [ "$name" = "_team-rules" ] && continue
130
- if [ -L "$TARGET/$name" ] && [ -d "$TARGET/$name" ]; then
131
- echo " ✅ $name → $(readlink "$TARGET/$name")"
132
- else
133
- echo " ❌ $name 未正确安装"
134
- errors=$((errors + 1))
135
- fi
136
- done
137
-
138
- # 确认 _team-rules 规则文件
139
- for f in "$REPO_ROOT/skills/_team-rules"/*; do
140
- [ -f "$f" ] || continue
141
- name="$(basename "$f")"
142
- if [ -L "$TARGET/_team-rules/$name" ]; then
143
- echo " ✅ _team-rules/$name → $(readlink "$TARGET/_team-rules/$name")"
144
- else
145
- echo " ❌ _team-rules/$name 未正确安装"
146
- errors=$((errors + 1))
147
- fi
148
- done
149
-
150
- # 确认 Command Skills
151
- for cmd in "$REPO_ROOT/.claude/commands"/*.md; do
152
- [ -f "$cmd" ] || continue
153
- name="$(basename "$cmd" .md)"
154
- if [ -L "$TARGET/$name/SKILL.md" ]; then
155
- echo " ✅ Command Skill $name → $(readlink "$TARGET/$name/SKILL.md")"
156
- else
157
- echo " ❌ Command Skill $name 未正确安装"
158
- errors=$((errors + 1))
159
- fi
160
- done
161
-
162
- # 确认 Claude Code 命令
163
- for cmd in "$REPO_ROOT/.claude/commands"/*.md; do
164
- [ -f "$cmd" ] || continue
165
- name="$(basename "$cmd")"
166
- if [ -L "$HOME/.claude/commands/$name" ]; then
167
- echo " ✅ Claude Command $name → $(readlink "$HOME/.claude/commands/$name")"
168
- else
169
- echo " ❌ Claude Command $name 未正确安装"
170
- errors=$((errors + 1))
171
- fi
172
- done
173
-
174
- if [ "$errors" -eq 0 ]; then
175
- echo ""
176
- echo "🎉 安装完成!所有组件已正确安装。"
177
- echo ""
178
- echo "后续可通过 /team-pull 拉取更新。"
179
- else
180
- echo ""
181
- echo "⚠️ 有 $errors 个组件安装异常,请检查。"
182
- fi
64
+ team-skills uninstall
183
65
  ```
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: 卸载 team-skills 的所有 symlink(Skills、Commands、Hooks)
2
+ description: 卸载 team-skills 的所有 symlink(Skills、斜杠命令、Hooks)
3
3
  argument-hint: [target-dir]
4
4
  ---
5
5
 
@@ -7,101 +7,47 @@ argument-hint: [target-dir]
7
7
 
8
8
  ## 功能
9
9
 
10
- 移除 `/team-setup` 创建的所有软链接,不影响本仓库源文件。
10
+ 移除 `team-skills setup` 创建的所有软链接,不影响源文件。
11
11
 
12
- ## 参数
12
+ ## 移除内容
13
13
 
14
- - `$1`(可选):目标目录,默认为 `~/.agents/skills`
14
+ | 组件 | 位置 |
15
+ |------|------|
16
+ | Cursor Skills | `~/.agents/skills/team-*` |
17
+ | Claude Code Skill 斜杠命令 | `~/.claude/commands/team-*.md` |
18
+ | 共享规则 | `~/.agents/skills/_team-rules/` |
19
+ | CLI 辅助命令 | 两端均移除 |
20
+ | Hooks | `~/.cursor/hooks/`、`~/.claude/hooks/` |
15
21
 
16
- ## 执行步骤
17
-
18
- ### 1. 确定目标目录
22
+ ## 使用方式
19
23
 
20
24
  ```bash
21
- set -euo pipefail
22
- TARGET="${1:-$HOME/.agents/skills}"
23
- REPO_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || echo "$(cd "$(dirname "$0")/../.." && pwd)")"
24
- echo "卸载来源: $REPO_ROOT"
25
- echo "目标目录: $TARGET"
26
- removed=0
27
- ```
25
+ # 完整卸载
26
+ team-skills uninstall
28
27
 
29
- ### 2. 移除 Agent Skills
28
+ # 保留 Hooks
29
+ team-skills uninstall --no-hooks
30
30
 
31
- ```bash
32
- for dir in "$REPO_ROOT/skills"/*/; do
33
- name="$(basename "$dir")"
34
- [ "$name" = "_team-rules" ] && continue
35
- if [ -L "$TARGET/$name" ]; then
36
- rm "$TARGET/$name"
37
- echo " 🗑️ Skill: $name"
38
- removed=$((removed + 1))
39
- fi
40
- done
41
- ```
31
+ # 保留 CLI 辅助命令
32
+ team-skills uninstall --no-commands
42
33
 
43
- ### 3. 移除共享规则
34
+ # 预览不执行
35
+ team-skills uninstall --dry-run
44
36
 
45
- ```bash
46
- for f in "$REPO_ROOT/skills/_team-rules"/*; do
47
- [ -f "$f" ] || continue
48
- name="$(basename "$f")"
49
- if [ -L "$TARGET/_team-rules/$name" ]; then
50
- rm "$TARGET/_team-rules/$name"
51
- echo " 🗑️ Rule: $name"
52
- removed=$((removed + 1))
53
- fi
54
- done
55
- rmdir "$TARGET/_team-rules" 2>/dev/null || true
37
+ # 指定目标目录
38
+ team-skills uninstall /path/to/target
56
39
  ```
57
40
 
58
- ### 4. 移除 Command Skills
41
+ ## 选项
59
42
 
60
- ```bash
61
- for cmd in "$REPO_ROOT/.claude/commands"/*.md; do
62
- [ -f "$cmd" ] || continue
63
- name="$(basename "$cmd" .md)"
64
- if [ -L "$TARGET/$name/SKILL.md" ]; then
65
- rm "$TARGET/$name/SKILL.md"
66
- rmdir "$TARGET/$name" 2>/dev/null || true
67
- echo " 🗑️ Command Skill: $name"
68
- removed=$((removed + 1))
69
- fi
70
- done
71
- ```
43
+ | 选项 | 说明 |
44
+ |------|------|
45
+ | `--no-hooks` | 跳过移除 Hooks |
46
+ | `--no-commands` | 跳过移除 CLI 辅助命令 |
47
+ | `--dry-run` | 只显示操作,不实际执行 |
72
48
 
73
- ### 5. 移除 Claude Code 命令
49
+ ## 安全机制
74
50
 
75
- ```bash
76
- for cmd in "$REPO_ROOT/.claude/commands"/*.md; do
77
- [ -f "$cmd" ] || continue
78
- name="$(basename "$cmd")"
79
- if [ -L "$HOME/.claude/commands/$name" ]; then
80
- rm "$HOME/.claude/commands/$name"
81
- echo " 🗑️ Claude Command: $name"
82
- removed=$((removed + 1))
83
- fi
84
- done
85
- ```
86
-
87
- ### 6. 移除 Hooks
88
-
89
- ```bash
90
- for hook_dir in "$HOME/.cursor/hooks" "$HOME/.claude/hooks"; do
91
- for f in hooks.json session-start; do
92
- if [ -L "$hook_dir/$f" ]; then
93
- rm "$hook_dir/$f"
94
- echo " 🗑️ Hook: $hook_dir/$f"
95
- removed=$((removed + 1))
96
- fi
97
- done
98
- done
99
- ```
100
-
101
- ### 7. 汇报
102
-
103
- ```bash
104
- echo ""
105
- echo "✅ 卸载完成,共移除 $removed 个软链接。"
106
- echo "本仓库源文件未受影响。"
107
- ```
51
+ - 只移除指向 team-skills 源文件的 symlink
52
+ - 指向其他来源的同名 symlink 会跳过(标记为 `foreign`)
53
+ - symlink 文件不会被删除
package/CHANGELOG.md CHANGED
@@ -5,6 +5,67 @@
5
5
  格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),
6
6
  本项目遵循[语义化版本](https://semver.org/lang/zh-CN/spec/v2.0.0.html)。
7
7
 
8
+ ## [1.1.2] - 2026-06-23
9
+
10
+ ### 变更
11
+
12
+ - 所有 Skill 的项目规范引用从 `CLAUDE.md` 扩展为 `CLAUDE.md / .cursor/rules/`,支持 Cursor 项目
13
+ - `.claude/commands/team-setup.md` 和 `team-uninstall.md` 重写为 Node.js CLI 文档(原为过时的 bash 脚本)
14
+ - CHANGELOG.md 补齐 1.x 版本记录
15
+
16
+ ### 修复
17
+
18
+ - hooks.json 仅安装到 Cursor hooks 目录(不再错误安装到 Claude Code)
19
+ - `cleanStaleSkills` 仅清理 `team-*` 前缀目录(保护用户自定义 Skill)
20
+ - `list` 命令 hooks.json 仅显示在 Cursor 下
21
+ - README/CHANGELOG 与代码实现对齐
22
+
23
+ ## [1.1.1] - 2026-06-23
24
+
25
+ ### 新增
26
+
27
+ - `setup` 为所有 Skill 创建 Claude Code 斜杠命令(`~/.claude/commands/{name}.md`)
28
+ - `init` 支持 Claude Code:将 SKILL.md 复制为斜杠命令
29
+ - `update` 支持 Claude Code 命令更新 + 过时命令清理
30
+ - `uninstall` 移除 Claude Code Skill 斜杠命令
31
+ - `list` 新增 "Claude Code Skill 斜杠命令" 独立展示区
32
+
33
+ ### 修复
34
+
35
+ - P0: `--force` 处理目录时使用 `rmSync` 替代 `unlinkSync`
36
+ - P0: `update.js` 修复 shell 注入(`readFileSync` 替代 `execSync`)
37
+ - P0: `JSON.parse("1.1.0")` 崩溃修复
38
+
39
+ ### 变更
40
+
41
+ - `skills/CLAUDE.md` 合并到根目录 `CLAUDE.md` §十三(SKILL.md 开发规范)
42
+
43
+ ## [1.1.0] - 2026-06-22
44
+
45
+ ### 新增
46
+
47
+ - Node.js CLI 工具(`bin/team-skills.js`),取代原有 bash 脚本
48
+ - 5 个命令:`setup`、`init`、`update`、`uninstall`、`list`
49
+ - `--ide` 选项:强制指定目标 IDE(claude/cursor/both)
50
+ - `--with-score` 选项:可选安装 team-score Skill
51
+ - `--dry-run` 选项:所有命令均支持
52
+ - `detectIDE` 共享模块:自动检测项目 IDE 类型
53
+ - `check-skill-structure.js` CI 检查脚本
54
+ - npm 发布配置(`package.json` 的 `files`、`bin`、`engines`)
55
+ - GitHub Actions release workflow:`v*` tag 自动发布到 npm
56
+
57
+ ### 变更
58
+
59
+ - `team-score` 默认不安装,需 `--with-score` 显式启用
60
+ - 从其他 Skill 中移除 team-score 硬编码引用
61
+ - CI 简化为 npm scripts 驱动
62
+
63
+ ### 移除
64
+
65
+ - Makefile(功能迁移到 npm scripts)
66
+ - `src/lib/manifest.js`(不再需要)
67
+ - `rules/` 目录(开发规范已合并到 CLAUDE.md)
68
+
8
69
  ## [0.2.0] - 2026-06-22
9
70
 
10
71
  ### 新增
package/README.md CHANGED
@@ -77,6 +77,12 @@ npx team-skills@latest setup
77
77
 
78
78
  自动将 Skills、斜杠命令和 Hooks 以 symlink 方式安装到全局目录。
79
79
 
80
+ 启用可选的项目评分功能(`team-score`):
81
+
82
+ ```bash
83
+ npx team-skills@latest setup --with-score
84
+ ```
85
+
80
86
  如需频繁使用 CLI,可全局安装:
81
87
 
82
88
  ```bash
@@ -90,21 +96,26 @@ team-skills setup
90
96
 
91
97
  ```bash
92
98
  npx team-skills@latest init
99
+ # 含评分功能
100
+ npx team-skills@latest init --with-score
93
101
  ```
94
102
 
95
- 创建 `.team-skills/` 目录,包含 Skills、Hooks 和命令文件。后续更新:
103
+ 自动检测项目中的 `.claude/` `.cursor/` 目录,将对应文件复制到 IDE 能发现的位置。后续更新:
96
104
 
97
105
  ```bash
98
106
  npx team-skills@latest update
99
107
  ```
100
108
 
109
+ > **提示**:Hooks 仅在全局安装(`setup`)模式下生效,`init` 不安装 hooks。
110
+
101
111
  ### 安装内容
102
112
 
103
113
  | 内容 | 位置 | 说明 |
104
114
  |------|------|------|
105
- | 12 个 Agent Skills | `~/.agents/skills/` | Cursor 自动发现 |
106
- | 斜杠命令 | `~/.claude/commands/` | Claude Code `/team-{name}` |
115
+ | 11 个 Agent Skills | `~/.agents/skills/` | Cursor 自动发现 |
116
+ | 11 个 Skill 斜杠命令 | `~/.claude/commands/` | Claude Code `/team-{name}` |
107
117
  | 共享规则 | `~/.agents/skills/_team-rules/` | 被所有 Skill 引用 |
118
+ | CLI 辅助命令 | 两端均安装 | team-setup/uninstall/pull/push |
108
119
  | Hooks(可选) | `~/.cursor/hooks/` | session-start 自动加载 |
109
120
 
110
121
  ### 验证
@@ -116,13 +127,13 @@ npx team-skills@latest update
116
127
 
117
128
  ### CLI 参考
118
129
 
119
- | 命令 | 说明 |
120
- |------|------|
121
- | `team-skills setup` | symlink 安装到全局目录 |
122
- | `team-skills init [dir]` | 复制到项目目录 |
123
- | `team-skills update [dir]` | 增量更新项目副本 |
124
- | `team-skills uninstall` | 移除所有 symlink |
125
- | `team-skills list` | 查看安装状态 |
130
+ | 命令 | 说明 | 关键选项 |
131
+ |------|------|----------|
132
+ | `team-skills setup` | symlink 安装到全局目录 | `--with-score` `--no-hooks` `--force` |
133
+ | `team-skills init [dir]` | 复制到项目 IDE 目录 | `--ide <claude\|cursor\|both>` `--with-score` |
134
+ | `team-skills update [dir]` | 升级包 + 更新项目副本 | `--skip-self` `--ide` `--with-score` |
135
+ | `team-skills uninstall` | 移除所有全局 symlink | `--no-hooks` `--no-commands` |
136
+ | `team-skills list` | 查看全局安装状态 | `--json` |
126
137
 
127
138
  所有命令支持 `--dry-run`。
128
139
 
@@ -0,0 +1,63 @@
1
+ # 示例:使用 team-debug 进行调试
2
+
3
+ 本示例展示 `team-debug` 如何系统性地定位根因。
4
+
5
+ ## 问题描述
6
+
7
+ 用户报告:"登录接口间歇性返回 500 错误。"
8
+
9
+ ## 第一步:收集证据
10
+
11
+ ```bash
12
+ /team-debug 登录接口间歇性 500 错误
13
+ ```
14
+
15
+ 调试 Agent 开始收集:
16
+
17
+ - 过去一小时的错误日志
18
+ - 请求/响应模式
19
+ - 最近的代码变更
20
+ - 依赖版本
21
+
22
+ ## 第二步:生成假设
23
+
24
+ ```
25
+ H1:数据库连接池耗尽
26
+ H2:会话创建时的竞态条件
27
+ H3:认证中间件内存泄漏
28
+ H4:第三方限流
29
+ ```
30
+
31
+ ## 第三步:判别性验证
32
+
33
+ 每个假设通过特定实验验证:
34
+
35
+ | 假设 | 实验 | 结果 |
36
+ |------|------|------|
37
+ | H1:连接池耗尽 | 检查 max_connections vs 活跃连接数 | ❌ 活跃连接 < 连接池 50% |
38
+ | H2:竞态条件 | 在会话创建前后增加日志 | ✅ 两个并发请求创建了重复会话 |
39
+ | H3:内存泄漏 | 监控认证前后的堆内存 | ❌ 无明显变化 |
40
+ | H4:第三方限流 | 检查第三方 API 响应码 | ❌ 无 429 响应 |
41
+
42
+ ## 第四步:找到根因
43
+
44
+ **竞态条件**:当两个登录请求同时到达同一个新用户时,两个请求都通过了"用户是否存在"检查,然后都尝试创建会话。第二个请求因为第一个已创建而失败。
45
+
46
+ ## 第五步:修复
47
+
48
+ ```python
49
+ # 修复前(存在竞态条件)
50
+ if not user.has_session():
51
+ user.create_session()
52
+
53
+ # 修复后(原子操作)
54
+ user.create_session_if_not_exists() # 数据库级别的原子操作
55
+ ```
56
+
57
+ ## 第六步:验证
58
+
59
+ ```bash
60
+ # 运行模拟并发登录的测试
61
+ pytest tests/test_login_concurrent.py -v
62
+ # ✅ 所有测试通过
63
+ ```
@@ -0,0 +1,124 @@
1
+ # 失败路径示例:回退、H3 介入与 Kill Switch
2
+
3
+ 真实项目不会总走 happy path。本指南展示 Team Skills 在遇到问题时如何处理。
4
+
5
+ ## 场景 1:testAgent 发现 bug → 回退 implAgent
6
+
7
+ ```
8
+ 用户: /team-orchestrator 实现金额计算功能
9
+
10
+ [H1 确认通过]
11
+ [specAgent 产出 01-05 文件]
12
+ [H2 确认通过]
13
+ [implAgent 完成 TDD 开发]
14
+
15
+ testAgent:
16
+ 发现 bug:边界条件未处理 — 当金额为 0 时,计算返回 NaN 而非 0
17
+ 路由决策:→ implAgent
18
+
19
+ 编排器:
20
+ 回退计数:test→impl = 1(上限 2)
21
+ 传递上下文:
22
+ - 问题:金额为 0 时返回 NaN
23
+ - 复现步骤:calculateAmount(0) → NaN
24
+ - 期望行为:calculateAmount(0) → 0(SDD §七 B3)
25
+ - 建议方向:添加零值边界检查
26
+
27
+ implAgent(第二次):
28
+ 1. RED: 写测试 expect(calculateAmount(0)).toBe(0) → 失败 ✓
29
+ 2. GREEN: 添加零值检查 → 通过 ✓
30
+ 3. REFACTOR: 无需重构
31
+ git commit -m "fix: handle zero amount edge case"
32
+
33
+ testAgent(第二次):
34
+ 全部通过 → reviewAgent
35
+ ```
36
+
37
+ ## 场景 2:reviewAgent 发现 spec 遗漏 → 回退 specAgent
38
+
39
+ ```
40
+ reviewAgent:
41
+ Phase 1.5 Constitutional 合规检查:
42
+ 发现 03-sdd.md 未定义并发场景 — 两个用户同时修改同一记录
43
+ 严重级别:P1(spec 遗漏)
44
+ 路由决策:→ specAgent
45
+
46
+ 编排器:
47
+ 回退计数:review→spec = 1(上限 2)
48
+ 传递上下文:
49
+ - 问题:并发修改场景未定义
50
+ - 发现位置:11-review.md §一 正确性审查
51
+ - 期望补充:03-sdd.md §七 添加并发边界条件
52
+ - 建议方向:乐观锁 vs 悲观锁
53
+
54
+ specAgent(第二次):
55
+ 更新 03-sdd.md:
56
+ §七 新增 B5:并发修改 — 使用乐观锁,版本号冲突返回 409
57
+ 更新 04-boundary.md:新增并发约束
58
+
59
+ [重新走 impl → test → review]
60
+ ```
61
+
62
+ ## 场景 3:回退超限 → 触发 H3
63
+
64
+ ```
65
+ testAgent 发现 bug → 回退 implAgent(计数 1)
66
+ implAgent 修复后 → testAgent 又发现新 bug → 回退 implAgent(计数 2)
67
+ implAgent 再次修复 → testAgent 又发现 bug
68
+
69
+ 编排器:
70
+ 回退计数 test→impl = 3 → 超过上限(≤ 2)
71
+ 强制触发 H3!
72
+
73
+ H3 人类介入请求:
74
+ 触发来源:testAgent | 触发原因:回退超限
75
+ 问题描述:test→impl 已回退 3 次,可能存在架构问题
76
+ 已尝试:
77
+ - 第 1 次:修复零值边界
78
+ - 第 2 次:修复类型转换
79
+ - 第 3 次:又发现精度丢失
80
+ 选项:
81
+ - A: 重新审视 SDD 架构方案(回退 specAgent)
82
+ - B: 人类直接介入修复
83
+ - C: Kill Switch — 终止任务
84
+ 推荐:A — 反复出现的计算问题暗示底层数据类型选择有误
85
+
86
+ 用户选择 A → 编排器回退到 specAgent,传递三次失败的完整上下文
87
+ ```
88
+
89
+ ## 场景 4:Kill Switch 激活
90
+
91
+ ```
92
+ implAgent Phase 0.5(审计同步):
93
+ 发现:spec 要求调用第三方支付 API,但该 API 文档标注 deprecated,
94
+ 将于下月下线。方案不可行。
95
+
96
+ 编排器:
97
+ 触发 Kill Switch → H3
98
+
99
+ H3 人类介入请求:
100
+ 触发来源:implAgent | 触发原因:Kill Switch
101
+ 问题描述:第三方支付 API 已标记 deprecated,下月下线,SDD 方案不可行
102
+ 选项:
103
+ - A: 回退 specAgent,改用新版 API 重新设计
104
+ - B: 回退 specAgent,改用其他支付服务商
105
+ - C: Kill Switch — 终止任务,等 API 迁移完成后再启动
106
+ 推荐:A — 新版 API 已上线且接口兼容性好
107
+
108
+ 用户选择 C → 任务终止
109
+ 进度账本记录:0005-payment | KILLED | 原因:第三方 API deprecated
110
+ ```
111
+
112
+ ## 场景 5:BLOCKED 状态
113
+
114
+ ```
115
+ specAgent:
116
+ Phase 1 探索:需要读取数据库 schema,但没有数据库访问权限
117
+ 状态:BLOCKED
118
+ 阻塞原因:无法访问 production DB schema
119
+ 需要:DBA 提供 schema dump 或只读访问
120
+
121
+ 编排器:
122
+ 触发 H3
123
+ 用户提供 schema.sql → specAgent 继续
124
+ ```