Skip to content

Commit 40eb233

Browse files
alpha-86claude
andcommitted
refactor: 移除 skills/shared 层级,skills/ 直接作为源目录
- 将 skills/shared/ 目录下所有内容上移到 skills/ - 修复 bootstrap-sync.py 增加 Skill() 调用替换和 skills/{name}/SKILL.md 路径替换 - 更新 bootstrap-sync.yml 和 install.sh 的路径引用 - 更新 CLAUDE.md 添加 ADF 命名空间说明 - 修复 skills/ 下的 Skill 调用和路径引用(去掉 adf- 前缀) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 4c3a61f commit 40eb233

58 files changed

Lines changed: 188 additions & 152 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/bootstrap-sync.py

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22
"""
33
Bootstrap Sync Script for AgentDevFlow (adf-prefix version)
44
5-
Reads all .md files from skills/shared/ and generates corresponding skill files
5+
Reads all .md files from skills/ and generates corresponding skill files
66
in .claude/skills/ with adf- prefix.
77
88
Each skill gets its own subdirectory: .claude/skills/adf-{name}/
99
SKILL.md is generated for top-level entries; subdirectory contents are copied.
1010
1111
Step 0: Clear .claude/skills/
12-
Step 1: Dynamically scan skills/shared/ and generate adf- prefix mapping
12+
Step 1: Dynamically scan skills/ and generate adf- prefix mapping
1313
Step 2: Generate SKILL.md files to .claude/skills/adf-*/
1414
Step 3: Batch replace internal references
1515
Step 4: git add -> commit -> push to main
@@ -23,7 +23,7 @@
2323
from pathlib import Path
2424
from typing import Optional
2525

26-
SKILLS_SHARED_DIR = Path("skills/shared")
26+
SKILLS_SHARED_DIR = Path("skills")
2727
TARGET_DIR = Path(".claude/skills")
2828

2929
# Files that should NOT be synced (internal/shared use only)
@@ -78,7 +78,7 @@ def extract_name_and_description(content: str) -> tuple[str, str]:
7878

7979

8080
def build_name_mapping() -> dict[str, str]:
81-
"""Dynamically scan skills/shared/ and build {original_name: adf_name} mapping."""
81+
"""Dynamically scan skills/ and build {original_name: adf_name} mapping."""
8282
mapping = {}
8383

8484
# Top-level .md files → top-level skills
@@ -102,9 +102,10 @@ def replace_internal_references(content: str, mapping: dict[str, str]) -> str:
102102
"""Replace all internal skill references in content.
103103
104104
Patterns replaced:
105-
- /{orig} → /adf-{adf} (skill invocation paths, only when / is followed by word char)
106-
- skills/shared/{orig}/ → .claude/skills/adf-{adf}/ (subdirectory references)
107-
- skills/shared/{orig}.md → .claude/skills/adf-{adf}/SKILL.md (direct file references)
105+
- /{orig} → /adf-{adf} (skill invocation paths)
106+
- Skill("{orig}") → Skill("{adf}") (skill invocation calls)
107+
- {orig}/SKILL.md → .claude/skills/{adf}/SKILL.md (skill file references)
108+
- skills/{orig}/SKILL.md → .claude/skills/{adf}/SKILL.md (skills prefix references)
108109
"""
109110

110111
# Only apply replacements for non-skipped items
@@ -117,20 +118,18 @@ def replace_internal_references(content: str, mapping: dict[str, str]) -> str:
117118
continue
118119

119120
# Skill invocation paths: /agent-bootstrap → /adf-agent-bootstrap
120-
# Use word-boundary aware replacement (only at / + word start)
121-
# This avoids replacing things like "/start-agent-team" inside "/adf-start-agent-team"
122121
replacements.append((f"/{orig}", f"/{adf}"))
123122

124-
# Subdirectory references: skills/shared/agents/.claude/skills/adf-agents/
125-
replacements.append((f"skills/shared/{orig}/", f".claude/skills/{adf}/"))
123+
# Skill invocation calls: Skill("product-manager")Skill("adf-product-manager")
124+
replacements.append((f'Skill("{orig}")', f'Skill("{adf}")'))
126125

127-
# Direct file references: skills/shared/agent-bootstrap.md → .claude/skills/adf-agent-bootstrap/SKILL.md
128-
replacements.append(
129-
(f"skills/shared/{orig}.md", f".claude/skills/{adf}/SKILL.md")
130-
)
126+
# Subdirectory references: product-manager/SKILL.md → .claude/skills/adf-product-manager/SKILL.md
127+
replacements.append((f"{orig}/SKILL.md", f".claude/skills/{adf}/SKILL.md"))
128+
129+
# Also handle skills/ prefix: skills/architect/SKILL.md → .claude/skills/adf-architect/SKILL.md
130+
replacements.append((f"skills/{orig}/SKILL.md", f".claude/skills/{adf}/SKILL.md"))
131131

132132
# Sort by length descending to avoid partial replacement issues
133-
# (e.g., replace "skills/shared/agents/" before "skills/shared/agent-...")
134133
replacements.sort(key=lambda x: -len(x[0]))
135134

136135
for old, new in replacements:

.github/workflows/bootstrap-sync.yml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
name: Bootstrap Sync
22

3-
# 持续部署:将 skills/shared/ 中的源文件同步到 .claude/skills/
3+
# 持续部署:将 skills/ 中的源文件同步到 .claude/skills/
44
# 作为 AgentDevFlow 的 adf-prefix 自举技能包。
55
#
66
# 工作原理:
7-
# 1. 当 skills/shared/ 中的共享技能发生变更并合并到 main 分支时触发
8-
# 2. 读取 skills/shared/ 中每个 .md 文件
7+
# 1. 当 skills/ 中的共享技能发生变更并合并到 main 分支时触发
8+
# 2. 读取 skills/ 中每个 .md 文件
99
# 3. 为每个共享技能在 .claude/skills/ 下创建或更新对应的 SKILL.md
1010
# 4. 直接提交到 main 分支(自举部署,无 PR)
1111
#
1212
# 禁止:
13-
# - 禁止修改 skills/shared/ 源文件(只读取)
13+
# - 禁止修改 skills/ 源文件(只读取)
1414
# - 禁止修改非生成文件
1515
# - 禁止在没有变更时提交空提交
1616

@@ -19,7 +19,7 @@ on:
1919
branches:
2020
- main
2121
paths:
22-
- 'skills/shared/**/*.md'
22+
- 'skills/**/*.md'
2323
- '.github/workflows/bootstrap-sync.yml'
2424
workflow_dispatch:
2525
inputs:
@@ -30,7 +30,7 @@ on:
3030
type: boolean
3131

3232
env:
33-
SKILLS_SHARED_DIR: skills/shared
33+
SKILLS_SHARED_DIR: skills
3434
SKILLS_TARGET_DIR: .claude/skills
3535

3636
jobs:

CLAUDE.md

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,59 @@
11
# AgentDevFlow CLAUDE.md
22

3+
## ADF 命名空间的核心认知(本项目最关键的架构设计)
4+
5+
### adf- 前缀的真正含义
6+
7+
`adf-` 是 AgentDevFlow 的**开发版命名空间**,用于区分本项目自举用的开发版和外部用户安装的稳定版。
8+
9+
| 环境 | 路径 | 命名空间 | Skill 调用 |
10+
|------|------|---------|-----------|
11+
| 本项目 (`~/code/AgentDevFlow`) | `.claude/skills/adf-*/` | adf- 开发版 | `Skill("adf-product-manager")` |
12+
| 外部用户 (`~/.claude/skills/`) | `skills/product-manager/` | 稳定版(无前缀) | `Skill("product-manager")` |
13+
14+
### 核心规则
15+
16+
1. **`skills/` 是唯一源文件**,所有 Skill 调用在源文件中**不带 adf- 前缀**
17+
2. **bootstrap-sync** 在生成 `.claude/skills/adf-*/` 时,自动把 Skill 调用加上 adf- 前缀
18+
3. **禁止在 `skills/` 源文件中写 adf- 前缀**(会导致双重前缀或外部用户无法使用)
19+
20+
### bootstrap-sync 替换规则
21+
22+
`skills/start-agent-team/SKILL.md` 包含 `Skill("product-manager")` 时:
23+
- bootstrap-sync 生成 `.claude/skills/adf-start-agent-team/SKILL.md` 时自动替换为 `Skill("adf-product-manager")`
24+
25+
### 错误示例(我曾经犯过的错)
26+
27+
**错误**`skills/start-agent-team/SKILL.md` 里写 `Skill("adf-product-manager")`
28+
- 原因:外部用户安装后没有 `adf-product-manager` 这个 skill,会导致调用失败
29+
30+
**正确**`skills/start-agent-team/SKILL.md` 里写 `Skill("product-manager")`
31+
- bootstrap-sync 会自动在生成的目标文件中替换为 `Skill("adf-product-manager")`
32+
33+
### 判断依据
34+
35+
- `prompts/by-me/005_V1_如何在本项目中使用.md` — 明确说明 adf- 是命名空间隔离机制
36+
- `prompts/discuss/024_2026-04-10_adf-prefix自举部署方案.md` — 说明 bootstrap-sync 的替换逻辑
37+
38+
---
39+
340
## ADF Bootstrap Skill 架构:真实源 vs 重命名产物
441

542
### 核心概念:禁止直接修改 bootstrap 产物
643

744
`.claude/skills/adf-*/SKILL.md` 文件是 `bootstrap-sync` 脚本的**自动生成产物**,不是源文件。
845

9-
- **真实源文件**`skills/shared/`
10-
- **bootstrap-sync** 做的是:路径替换(`skills/shared/``.claude/skills/adf-*`)+ frontmatter 注入
46+
- **真实源文件**`skills/`
47+
- **bootstrap-sync** 做的是:路径替换(`skills/``.claude/skills/adf-*`)+ frontmatter 注入
1148
- **禁止直接修改** `.claude/skills/adf-*/SKILL.md`,这些文件会被 bootstrap-sync 覆盖
1249

1350
### bootstrap-sync 自动同步机制
1451

15-
bootstrap-sync.yml 在 `skills/shared/**/*.md` 变更时自动触发(push to main)。
52+
bootstrap-sync.yml 在 `skills/**/*.md` 变更时自动触发(push to main)。
1653

1754
**注意**:commit message 中多行 shell 字符串引号可能导致 YAML 解析失败(`[skip ci]"` 结尾问题),需保持 commit message 简洁。
1855

19-
| 真实源 (`skills/shared/`) | bootstrap 产物 (`.claude/skills/`) |
56+
| 真实源 (`skills/`) | bootstrap 产物 (`.claude/skills/`) |
2057
|---------------------------|-------------------------------------|
2158
| `start-agent-team.md` | `adf-start-agent-team/SKILL.md` |
2259
| `team-setup.md` | `adf-team-setup/SKILL.md` |
@@ -34,7 +71,7 @@ bootstrap-sync 修复后,产物与源文件的差异仅为 frontmatter 注入
3471

3572
### 工作流原则
3673

37-
1. **只修改源 skill**`skills/shared/*.md` 是唯一的真实来源,禁止直接修改 `.claude/skills/adf-*/SKILL.md`
74+
1. **只修改源 skill**`skills/*.md` 是唯一的真实来源,禁止直接修改 `.claude/skills/adf-*/SKILL.md`
3875
2. **验证后才发布**:PR 合并前 diff 对照表中的对应文件对,确保产物与源一致
3976

4077
### GitHub Issue 操作规范
@@ -78,7 +115,7 @@ python scripts/github_issue_sync.py
78115
### 相关文件位置
79116

80117
- bootstrap-sync 脚本:`.github/workflows/bootstrap-sync.py`
81-
- 源 skill:`skills/shared/`
118+
- 源 skill:`skills/`
82119
- bootstrap 产物:`.claude/skills/adf-*/SKILL.md`
83120
- issue-poll workflow:`.github/workflows/issue-poll.yml`
84121
- task_router 脚本:`scripts/task_router.py`

scripts/install.sh

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
# ./scripts/install.sh --dry-run # 预览模式
1313
#
1414
# 安装内容:
15-
# - skills/shared/ -> {target}/skills/shared/
15+
# - skills/ -> {target}/skills/
1616
# - adapters/claude/.claude/ -> {target}/skills/
1717
#
1818
# 注意:
@@ -113,8 +113,8 @@ check_prerequisites() {
113113
exit 1
114114
fi
115115

116-
if [[ ! -d "$REPO_ROOT/skills/shared" ]]; then
117-
error "skills/shared/ 目录不存在"
116+
if [[ ! -d "$REPO_ROOT/skills" ]]; then
117+
error "skills/ 目录不存在"
118118
exit 1
119119
fi
120120

@@ -162,9 +162,9 @@ install_dev() {
162162
fi
163163
echo ""
164164

165-
# 安装共享技能(skills/shared/
166-
local shared_source="${REPO_ROOT}/skills/shared"
167-
local shared_target="${TARGET_DIR}/skills/shared"
165+
# 安装共享技能(skills/)
166+
local shared_source="${REPO_ROOT}/skills"
167+
local shared_target="${TARGET_DIR}/skills"
168168

169169
info "安装共享技能到 ${shared_target}..."
170170
if $DRY_RUN; then
@@ -258,8 +258,8 @@ post_install_check() {
258258
local skill_count=0
259259
local adapter_count=0
260260

261-
if [[ -d "${TARGET_DIR}/skills/shared" ]]; then
262-
skill_count=$(find "${TARGET_DIR}/skills/shared" -name "*.md" 2>/dev/null | wc -l)
261+
if [[ -d "${TARGET_DIR}/skills" ]]; then
262+
skill_count=$(find "${TARGET_DIR}/skills" -name "*.md" 2>/dev/null | wc -l)
263263
fi
264264

265265
if [[ -d "${TARGET_DIR}/skills" ]]; then
@@ -300,7 +300,7 @@ show_next_steps() {
300300
echo ""
301301
info "更多信息请查看:"
302302
echo " - ${REPO_ROOT}/README.md"
303-
echo " - ${REPO_ROOT}/skills/shared/README.md"
303+
echo " - ${REPO_ROOT}/skills/README.md"
304304
echo ""
305305
}
306306

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# 共享技能目录
22

3-
`skills/shared/` 是 AgentDevFlow 的平台无关执行资产层。
3+
`skills/` 是 AgentDevFlow 的平台无关执行资产层。
44

55
## 结构
66

@@ -62,7 +62,7 @@
6262

6363
## 当前判定
6464

65-
`skills/shared/` 现在已经基本构成插件核心资产层,原因是它已经具备:
65+
`skills/` 现在已经基本构成插件核心资产层,原因是它已经具备:
6666

6767
- 共享启动入口:`team-setup.md``start-agent-team.md``create-agent.md`
6868
- 共享协议:`skill-protocol.md`
@@ -74,4 +74,4 @@
7474

7575
- `github-issue/SKILL.md` 对应的共享入口还不够明确
7676
- `review-org/SKILL.md` 对应的共享入口还不够明确
77-
- evaluation checker 还没有沉到 `skills/shared/` 形成更独立的检查子能力
77+
- evaluation checker 还没有沉到 `skills/` 形成更独立的检查子能力
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@
1111
| 适用场景 | 任意目标项目启动 AgentDevFlow | AgentDevFlow 自身初始化 |
1212
| 起点 | 目标项目已有骨架 | 项目骨架待建立或待复核 |
1313
| 重点 | 建立交付目录、Issue、团队 | 建立 AgentDevFlow 自身治理 + 交付机制 |
14-
| 角色来源 | `skills/shared/{role}.md` | `skills/shared/{role}.md` (自身) |
14+
| 角色来源 | `skills/{role}.md` | `skills/{role}.md` (自身) |
1515

1616
## 执行前必读
1717

18-
1. `skills/shared/start-agent-team.md`
19-
2. `skills/shared/create-agent.md`
20-
3. `skills/shared/skill-protocol.md`
21-
4. `skills/shared/event-bus.md`
18+
1. `skills/start-agent-team.md`
19+
2. `skills/create-agent.md`
20+
3. `skills/skill-protocol.md`
21+
4. `skills/event-bus.md`
2222
5. `prompts/001_team_topology.md`
2323
6. `prompts/010_team_setup_and_bootstrap.md`
2424
7. `docs/governance/core-principles.md`
@@ -43,7 +43,7 @@
4343
- `docs/release/` - 发布记录
4444
- `docs/memo/` - 纪要
4545
- `docs/todo/` - 待办注册
46-
- `skills/shared/` - 共享资产层
46+
- `skills/` - 共享资产层
4747
- `prompts/` - 规则层
4848
- `adapters/` - 平台适配
4949

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,11 @@
5151
6. `prompts/017_human_review_and_signoff.md`
5252
7. `prompts/019_dual_stage_pr_and_three_layer_safeguard.md`
5353
8. `prompts/021_platform_checks_and_gate_automation.md`
54-
9. `skills/shared/workflows/tech-review.md`
55-
10. `skills/shared/workflows/human-review.md`
56-
11. `skills/shared/workflows/implementation.md`
57-
12. `skills/shared/templates/tech-spec-template.md`
58-
13. `skills/shared/templates/review-comment-template.md`
54+
9. `skills/workflows/tech-review.md`
55+
10. `skills/workflows/human-review.md`
56+
11. `skills/workflows/implementation.md`
57+
12. `skills/templates/tech-spec-template.md`
58+
13. `skills/templates/review-comment-template.md`
5959

6060
## 初始化后必做
6161

@@ -79,7 +79,7 @@
7979

8080
## 评审前准备
8181

82-
1. 读取 `skills/shared/workflows/tech-review.md`
82+
1. 读取 `skills/workflows/tech-review.md`
8383
2. 检查 PRD 中的关键需求、非目标和验收标准。
8484
3. 检查 Tech Spec 是否覆盖接口、数据流、依赖、验证、发布推进、回滚。
8585
4. 检查 Issue 评论 中是否已有上游结论。
Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@
1818

1919
| 序号 | Agent 名称 | 角色类型 | 角色 Skill | 状态 |
2020
|------|-----------|---------|------------|------|
21-
| 1 | Team Lead | team-lead | `adf-team-lead` | **不创建**(Human 本身)|
22-
| 2 | Product Manager | product-manager | `adf-product-manager` | 立即创建 |
23-
| 3 | 架构师 | architect | `adf-architect` | 立即创建 |
24-
| 4 | 质量工程师 | qa-engineer | `adf-qa-engineer` | 立即创建 |
25-
| 5 | 工程师 | engineer | `adf-engineer` | 立即创建 |
26-
| 6 | 平台与发布负责人 | platform-sre | `adf-platform-sre` | 立即创建 |
27-
| 7 | PMO | pmo | `adf-pmo` | 按需创建 |
21+
| 1 | Team Lead | team-lead | `team-lead` | **不创建**(Human 本身)|
22+
| 2 | Product Manager | product-manager | `product-manager` | 立即创建 |
23+
| 3 | 架构师 | architect | `architect` | 立即创建 |
24+
| 4 | 质量工程师 | qa-engineer | `qa-engineer` | 立即创建 |
25+
| 5 | 工程师 | engineer | `engineer` | 立即创建 |
26+
| 6 | 平台与发布负责人 | platform-sre | `platform-sre` | 立即创建 |
27+
| 7 | PMO | pmo | `pmo` | 按需创建 |
2828

2929
**状态说明**
3030
- **不创建**:Team Lead 是 Human 本身,不需要创建 Agent 实例
@@ -36,8 +36,8 @@
3636
## 执行前必读
3737

3838
1. `prompts/006_agent_creation_contract.md`
39-
2. `skills/shared/skill-protocol.md`
40-
3. `skills/shared/event-bus.md`
39+
2. `skills/skill-protocol.md`
40+
3. `skills/event-bus.md`
4141
4. 对应角色 Skill(见上方速查表)
4242

4343
## 创建步骤
@@ -55,12 +55,12 @@
5555

5656
| 角色类型 | Skill 路径 |
5757
|---------|-----------|
58-
| `product-manager` | `.claude/skills/adf-product-manager/SKILL.md` |
59-
| `architect` | `.claude/skills/adf-architect/SKILL.md` |
60-
| `qa-engineer` | `.claude/skills/adf-qa-engineer/SKILL.md` |
61-
| `engineer` | `.claude/skills/adf-engineer/SKILL.md` |
62-
| `platform-sre` | `.claude/skills/adf-platform-sre/SKILL.md` |
63-
| `pmo` | `.claude/skills/adf-pmo/SKILL.md` |
58+
| `product-manager` | `product-manager/SKILL.md` |
59+
| `architect` | `architect/SKILL.md` |
60+
| `qa-engineer` | `qa-engineer/SKILL.md` |
61+
| `engineer` | `engineer/SKILL.md` |
62+
| `platform-sre` | `platform-sre/SKILL.md` |
63+
| `pmo` | `pmo/SKILL.md` |
6464

6565
### 步骤 1.5. team-lead 类型特殊处理
6666

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,9 @@
5858
5. `prompts/013_github_issue_and_review_comments.md`
5959
6. `prompts/016_dual_track_delivery_mechanism.md`
6060
7. `prompts/019_dual_stage_pr_and_three_layer_safeguard.md`
61-
8. `skills/shared/workflows/implementation.md`
62-
9. `skills/shared/workflows/qa-validation.md`
63-
10. `skills/shared/templates/review-comment-template.md`
61+
8. `skills/workflows/implementation.md`
62+
9. `skills/workflows/qa-validation.md`
63+
10. `skills/templates/review-comment-template.md`
6464

6565
## 何时启用
6666

File renamed without changes.

0 commit comments

Comments
 (0)