team-skills 1.3.4 → 1.3.6

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/CHANGELOG.md CHANGED
@@ -7,6 +7,25 @@
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [1.3.6] - 2026-06-26
11
+
12
+ ### 修复
13
+
14
+ - D12:移除 4 个 SKILL.md 中 `###` 标题后的 bare `>` 空行(using-team-skills×3、team-brainstorm×6、team-finish×6、team-verify×4),统一为标准空行格式
15
+ - D4:`verify_cmd` RESOLVE 链一致性修复——team-impl 和 team-test 补齐 `Cargo.toml`(与 team-verify/team-feedback 对齐)
16
+
17
+ ## [1.3.5] - 2026-06-26
18
+
19
+ ### 变更
20
+
21
+ - `team-refine` 每轮新增 Step 4:team-score 满分校验(硬门槛覆盖 + 评分维度覆盖 + 缺口修复),收敛条件同步强化
22
+ - 6 个 SKILL.md 质量修复:移除 bare `>` 空行(brainstorm)、`*none*` → `*default*` 兜底修正(review/security)、GATE 自检补充对抗性自问(brainstorm/orchestrator/score)
23
+ - CLI 模块化重构:提取 `installers.js` 共享模块(5 个函数),命令文件总行数 -278 行
24
+
25
+ ### 修复
26
+
27
+ - 项目路径与全局路径重叠时保留 symlinks,跳过文件复制(避免 `update`/`init` 覆盖全局 symlinks)
28
+
10
29
  ## [1.3.4] - 2026-06-26
11
30
 
12
31
  ### 变更
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "team-skills",
3
- "version": "1.3.4",
3
+ "version": "1.3.6",
4
4
  "description": "AI Agent Skills framework — Spec-Driven development with directed-graph rollback and quality gates",
5
5
  "type": "module",
6
6
  "bin": {
@@ -67,7 +67,7 @@ NO IMPLEMENTATION WITHOUT USER APPROVED DESIGN FIRST
67
67
  ## 执行步骤
68
68
 
69
69
  ### Phase 1:探索
70
- >
70
+
71
71
  > 理解用户要解决的真实问题和项目现状。不要急于构思方案——先确认"问题是什么"比"答案是什么"更重要。
72
72
 
73
73
  1. **READ** 用户需求,提取核心目标和关键词
@@ -86,7 +86,7 @@ NO IMPLEMENTATION WITHOUT USER APPROVED DESIGN FIRST
86
86
  8. **EXEC** 创建 `docs/tasks/{slug}/` 目录(**IF** 已存在 → 跳过)→ **ASSERT** `exit_code == 0`
87
87
 
88
88
  ### Phase 2:需求澄清(一次性提问)
89
- >
89
+
90
90
  > 挖出用户未说出的假设和隐性约束。好问题比好答案更有价值——问错问题意味着后续全部方向偏移。
91
91
 
92
92
  > TRAP:你会倾向于接受用户的初始框架,不质疑其前提假设。
@@ -109,7 +109,7 @@ NO IMPLEMENTATION WITHOUT USER APPROVED DESIGN FIRST
109
109
  - 整合用户回复,进入 Phase 3
110
110
 
111
111
  ### Phase 3:方案设计
112
- >
112
+
113
113
  > 探索根本不同的解决路径,不是同一个想法的三种措辞。每个方案应从不同的设计取舍出发(如性能 vs 简洁、侵入式 vs 非侵入式)。
114
114
 
115
115
  > TRAP:锚定偏差——你会倾向于围绕第一个想到的方案展开变体,而非探索本质不同的路径。
@@ -136,7 +136,7 @@ NO IMPLEMENTATION WITHOUT USER APPROVED DESIGN FIRST
136
136
  ```
137
137
 
138
138
  ### Phase 4:展示设计
139
- >
139
+
140
140
  > 逐段确认而非一次倾倒,每段确认后再展示下一段。目标是让用户在每个维度上做出知情决策,而非被信息量压垮后草率同意(FP-1)。
141
141
 
142
142
  逐段展示设计,每段后等待用户确认:
@@ -152,6 +152,7 @@ NO IMPLEMENTATION WITHOUT USER APPROVED DESIGN FIRST
152
152
  - [ ] 数据流已展示并确认
153
153
  - [ ] 关键接口已展示并确认
154
154
  - [ ] 测试策略已展示并确认
155
+ - [ ] 我是否因为流程进度压力而对某个维度草草确认?
155
156
 
156
157
  **MATCH** `user_decision`:
157
158
 
@@ -161,7 +162,7 @@ NO IMPLEMENTATION WITHOUT USER APPROVED DESIGN FIRST
161
162
  - *default* → 向用户澄清确认意图
162
163
 
163
164
  ### Phase 5:产出 00-design-brief.md
164
- >
165
+
165
166
  > 将讨论共识固化为结构化文档。这是下游 Skill 的唯一输入——口头讨论不算数,写下来的才算数。
166
167
 
167
168
  > SIGNAL:方案缺少具体下一步行动 → brainstorm 停留在空想层面,补充可执行的交付物定义。
@@ -220,7 +221,7 @@ NO IMPLEMENTATION WITHOUT USER APPROVED DESIGN FIRST
220
221
  - 残留占位符 → 替换为实际值后重新 **WRITE**
221
222
 
222
223
  ### Phase 6:Handoff
223
- >
224
+
224
225
  > 确保 brainstorm 成果顺滑传递给下游 Skill,不丢失上下文。
225
226
 
226
227
  **WRITE**(对话中)slug 目录路径 `docs/tasks/{slug}/`。
@@ -61,7 +61,7 @@ NO BRANCH COMPLETION WITHOUT TEST VERIFICATION FIRST
61
61
  ## 执行步骤
62
62
 
63
63
  ### Step 1:验证测试
64
- >
64
+
65
65
  > 用新鲜执行结果确认代码可交付。"上次跑过了"不是证据——只有当次输出才是。
66
66
 
67
67
  > TRAP:你会倾向于引用上一轮的测试结果来跳过重新执行。Iron Law 不允许——每次进入 finish 都必须重新运行。
@@ -78,7 +78,7 @@ NO BRANCH COMPLETION WITHOUT TEST VERIFICATION FIRST
78
78
  > 不可忽略失败继续展示选项(FP-4)。
79
79
 
80
80
  ### Step 1.5:凭证泄露扫描
81
- >
81
+
82
82
  > 推送前最后一道安全防线。凭证泄露一旦进入远程仓库,撤回成本极高。
83
83
 
84
84
  **EXEC** `grep -rn -E '(AK|SK|access[_-]?key|secret[_-]?key|api[_-]?key|token|password|passwd|credential)\s*[:=]' .` — 推送前凭证扫描(RL-2)
@@ -87,7 +87,7 @@ NO BRANCH COMPLETION WITHOUT TEST VERIFICATION FIRST
87
87
  - **ELSE** → **GOTO** Step 2
88
88
 
89
89
  ### Step 2:确定基准分支
90
- >
90
+
91
91
  > 精确找到合并目标。基准错误 = 合并到错误分支,后果比不合并更糟。
92
92
 
93
93
  **RESOLVE** `base_branch`(首个命中即停):
@@ -105,7 +105,7 @@ NO BRANCH COMPLETION WITHOUT TEST VERIFICATION FIRST
105
105
  - 失败(分支无公共祖先)→ **BLOCKED**,触发 **H3**
106
106
 
107
107
  ### Step 3:展示选项
108
- >
108
+
109
109
  > 让用户在完整信息下做选择。选项列表必须覆盖所有合理路径,不替用户预判。
110
110
 
111
111
  **WRITE**(对话中)选项列表:
@@ -122,7 +122,7 @@ NO BRANCH COMPLETION WITHOUT TEST VERIFICATION FIRST
122
122
  ```
123
123
 
124
124
  ### Step 4:执行选择
125
- >
125
+
126
126
  > 严格按用户选择执行,不添加未要求的操作。不可逆操作必须二次确认。
127
127
 
128
128
  > TRAP:合并成功后你会倾向于跳过重新测试("刚才不是通过了吗")。合并引入的代码交互可能导致回归——必须重新验证。
@@ -181,7 +181,7 @@ NO BRANCH COMPLETION WITHOUT TEST VERIFICATION FIRST
181
181
  - *default* → **WRITE**(对话中)"请选择 A/B/C"
182
182
 
183
183
  ### Step 5:清理工作目录
184
- >
184
+
185
185
  > 操作完成后工作区必须干净。残留的 worktree 或未提交变更是下次操作的隐患。
186
186
 
187
187
  > SIGNAL:`git status` 显示未提交变更 → 提交纪律不完整,有文件遗漏在 commit 之外。
@@ -277,7 +277,7 @@ NO PRODUCTION CODE WITHOUT A FAILING TEST FIRST
277
277
  1. **RESOLVE** `verify_cmd`(首个命中即停):
278
278
  1. `READ("05-risk.md", "§一验证计划")`
279
279
  2. `READ("CLAUDE.md").verify_cmd` / `READ(".cursor/rules/")`
280
- 3. `READ("package.json").scripts.test` / `READ("Makefile")` / `READ("CI 配置")`
280
+ 3. `READ("package.json").scripts.test` / `READ("Makefile")` / `READ("Cargo.toml")` / `READ("CI 配置")`
281
281
  4. *none* → **NEEDS_CONTEXT**:请用户提供验证命令,记录到 `06-tdd-log.md`
282
282
 
283
283
  2. **EXEC** `verify_cmd`(测试)→ **ASSERT** `exit_code == 0` && `failures == 0`
@@ -887,6 +887,7 @@ TDD 强制要求:每个功能点必须先 git commit 失败测试(test: {功
887
887
  - [ ] D5.2 **ASSERT** `14-team.md §二 一致性检查全部通过或已修复`
888
888
  - [ ] D5.3 **ASSERT** `14-team.md §四 真实问题占比 > 0`
889
889
  - [ ] D5.4 **ASSERT** `14-team.md §三 每位贡献者有明确产出物和提交数`
890
+ - [ ] 我是否因为检查项太多而对某些项草草通过了?
890
891
 
891
892
  **IF** `unchecked_items > 0` → 回退对应 Step 补全(D1/D3 缺失 → **GOTO** Step 5;D2 缺失 → **GOTO** Step 2;D4 缺失 → **GOTO** Step 3;D5 缺失 → **GOTO** Step 6)。
892
893
 
@@ -184,7 +184,7 @@ NO COMPLETION CLAIMS WITHOUT CONSTITUTIONAL COMPLIANCE CHECK FIRST
184
184
  - 需要人类决策 → **H3**(有多个可行方案需要选择)
185
185
  - `P2` → 自行修复(**GOTO** Phase 3)
186
186
  - `P3` → 记录但不处理
187
- - *none* → **GOTO** Phase 4
187
+ - *default* → **GOTO** Phase 4
188
188
 
189
189
  **回退时必须提供**:
190
190
 
@@ -258,6 +258,7 @@ NO SCORE WITHOUT EVIDENCE FIRST
258
258
 
259
259
  - [ ] `7 项硬门槛已逐条判定`
260
260
  - [ ] `不通过项已在报告中醒目标注`
261
+ - [ ] 我是否对所有不通过项都给出了具体理由和证据?
261
262
 
262
263
  ### Step 3:逐项评分
263
264
 
@@ -394,6 +394,7 @@ NO AI OPERATIONS WITHOUT RED LINE CHECK FIRST
394
394
  - `权限变更` → **ASSERT** `安全负责人确认记录 EXISTS`
395
395
  - `对外发布` → **ASSERT** `业务负责人审核确认记录 EXISTS`
396
396
  - `资金操作` → **ASSERT** `财务授权人员双人确认记录 EXISTS`
397
+ - *default* → 记录操作类型,无特定确认要求
397
398
 
398
399
  **IF** 确认记录存在 → **ASSERT** `确认为实质性审核` — 非形式审查
399
400
  **ELSE** → 标记 `HITL_MISSING:{operation_type}`
@@ -124,7 +124,7 @@ Phase 1 只分析,不写测试代码。
124
124
 
125
125
  1. `READ("05-risk.md", "§一验证计划")`(精简模式下不存在属于正常)
126
126
  2. `READ("CLAUDE.md").verify_cmd` / `READ(".cursor/rules/")`
127
- 3. `READ("package.json").scripts.test` / `READ("Makefile")`
127
+ 3. `READ("package.json").scripts.test` / `READ("Makefile")` / `READ("Cargo.toml")`
128
128
  4. *none* → **NEEDS_CONTEXT**:请用户提供测试命令
129
129
 
130
130
  ### Phase 4:补充测试(填补缺口)
@@ -53,7 +53,7 @@ NO COMPLETION CLAIMS WITHOUT FRESH VERIFICATION EVIDENCE FIRST
53
53
  ## 执行步骤
54
54
 
55
55
  ### Step 1:确定验证命令
56
- >
56
+
57
57
  > 找到当前项目真正有效的验证命令。"上次用的命令"不等于"现在正确的命令"——项目配置可能已变更。
58
58
 
59
59
  **RESOLVE** `verify_cmd`(首个命中即停):
@@ -66,7 +66,7 @@ NO COMPLETION CLAIMS WITHOUT FRESH VERIFICATION EVIDENCE FIRST
66
66
  - *default* → **NEEDS_CONTEXT**:请用户提供验证命令
67
67
 
68
68
  ### Step 2:执行验证
69
- >
69
+
70
70
  > 亲手执行,亲眼看到。"刚才跑过了"是最危险的借口——上一次结果不是当前事实。
71
71
 
72
72
  > TRAP:你会倾向于引用上一轮输出而非重新执行。每次到这一步,默认假设之前的结果已失效。
@@ -81,7 +81,7 @@ NO COMPLETION CLAIMS WITHOUT FRESH VERIFICATION EVIDENCE FIRST
81
81
  - `exit_code != 0` || `failures > 0` → 记录失败详情 → fix → **GOTO** Step 2
82
82
 
83
83
  ### Step 3:报告结果
84
- >
84
+
85
85
  > 报告是验证的证据——不是总结感想,而是呈现可追溯的事实。缺少 `exit_code` 或输出摘要的报告等于没有报告。
86
86
 
87
87
  > TRAP:"Tests pass" 不等于 "changed code is tested"。如果测试数量比上次减少了,可能是删除了失败测试而非修复了 bug。
@@ -123,7 +123,7 @@ NO COMPLETION CLAIMS WITHOUT FRESH VERIFICATION EVIDENCE FIRST
123
123
  > ```
124
124
 
125
125
  ### Step 4:工具失败恢复
126
- >
126
+
127
127
  > 区分"验证不通过"与"验证命令本身失败"。前者是代码问题,后者是环境问题。修复环境不等于验证通过。
128
128
 
129
129
  > 验证命令本身执行失败(超时、进程崩溃、环境错误),不同于验证不通过。
@@ -70,7 +70,7 @@ NO SKILL RECOMMENDATION WITHOUT SCENE ANALYSIS FIRST
70
70
  ## 执行步骤
71
71
 
72
72
  ### Step 1:分析用户场景
73
- >
73
+
74
74
  > 精准识别用户当前工程阶段,而非表面关键词匹配。错误分诊比慢分诊代价更高。
75
75
 
76
76
  > TRAP:你会倾向于推荐 `team-orchestrator`(最完整的流水线),即使用户只需要一个单点 Skill。
@@ -101,7 +101,7 @@ NO SKILL RECOMMENDATION WITHOUT SCENE ANALYSIS FIRST
101
101
  13. *none* → **NEEDS_CONTEXT**:请用户描述当前阶段和目标
102
102
 
103
103
  ### Step 2:推荐并说明理由
104
- >
104
+
105
105
  > 推荐的核心是"最短路径"——从用户当前状态到目标状态经过最少的 Skill。过度推荐等于浪费用户时间。
106
106
 
107
107
  > GOOD:`用户报告登录接口 500 错误。当前阶段:调试。推荐:team-debug。理由:已有明确错误现象,需先定位根因再决定是否修改规格或实现。启动方式:/team-debug`
@@ -115,7 +115,7 @@ NO SKILL RECOMMENDATION WITHOUT SCENE ANALYSIS FIRST
115
115
  **WRITE**(对话中)推荐结果:推荐 Skill + 推荐理由 + 启动方式
116
116
 
117
117
  ### Step 3:可选 — 展示流程图
118
- >
118
+
119
119
  > 仅在用户主动需要全貌时展示,不主动展开——信息过载是另一种误导。
120
120
 
121
121
  **IF** 用户需要了解全貌 → 展示 Mermaid 流程图
@@ -6,7 +6,7 @@ import { discoverSkills, discoverSharedRules } from '../lib/inventory.js';
6
6
  import { detectIDE } from '../lib/detect-ide.js';
7
7
  import {
8
8
  installSkillsGlobal, verifyGlobalSymlinks,
9
- installSkillsProject, cleanStaleSkills,
9
+ installSkillsProject, cleanStaleSkills, isGlobalTarget,
10
10
  } from '../lib/installers.js';
11
11
  import * as log from '../lib/logger.js';
12
12
 
@@ -88,7 +88,9 @@ function runUpdate(dir, opts) {
88
88
 
89
89
  for (const ideName of ides) {
90
90
  const skillsDst = join(dir, PROJECT_IDE_DIRS[ideName], 'skills');
91
- cleanStaleSkills(skillsDst, projectSkillNames, { dryRun, exclude });
91
+ if (!isGlobalTarget(skillsDst)) {
92
+ cleanStaleSkills(skillsDst, projectSkillNames, { dryRun, exclude });
93
+ }
92
94
  }
93
95
 
94
96
  count += installSkillsProject(dir, ides, projectSkills, rules, { dryRun, verb: '更新' });
@@ -1,9 +1,15 @@
1
1
  import { join } from 'node:path';
2
2
  import { existsSync, readdirSync, rmSync, copyFileSync } from 'node:fs';
3
3
  import { createSymlinkSafe, ensureDir, isSymlink, copyRecursive } from './fs-utils.js';
4
- import { PROJECT_IDE_DIRS } from './constants.js';
4
+ import { GLOBAL_TARGETS, PROJECT_IDE_DIRS } from './constants.js';
5
5
  import * as log from './logger.js';
6
6
 
7
+ const globalDirSet = new Set(GLOBAL_TARGETS.map(t => t.dir));
8
+
9
+ export function isGlobalTarget(dir) {
10
+ return globalDirSet.has(dir);
11
+ }
12
+
7
13
  export function logInstallResult(label, result) {
8
14
  switch (result) {
9
15
  case 'created':
@@ -80,6 +86,12 @@ export function installSkillsProject(projectDir, ides, skills, rules, { dryRun,
80
86
  if (!ideSubdir) continue;
81
87
 
82
88
  const skillsDst = join(projectDir, ideSubdir, 'skills');
89
+
90
+ if (globalDirSet.has(skillsDst)) {
91
+ log.skip(`${skillsDst} 与全局路径重叠,保留 symlinks,跳过复制`);
92
+ continue;
93
+ }
94
+
83
95
  log.heading(`${verb} → ${skillsDst}`);
84
96
 
85
97
  if (!dryRun) ensureDir(skillsDst);