sync-project-configlisted
Install: claude install-skill pkulijing/claude-code-global
把 `~/.claude/templates/` 的变化反映到当前项目。两种模式:
- **Normal sync**(项目根有 `.agent-template.yml` marker):算 diff → 智能 merge 提议 → 用户批量决策 → 执行
- **Adopt**(无 marker):让用户选 stack → 当作「全是新增」���整套用一次 → 写 marker
**动手改文件前先读 `templates/MECHANICS.md`** —— 落点语义(`__root__` / `__subpath__` / `_common`)、fragment 合并、变体组落地、后端可跑化、前端装依赖、迁移去重全在那里,本 skill 不复述。字段 schema 与设计取舍见 `~/.claude/global-repo/docs/11-跨项目共享模板与sync-skill/`。
**三态收敛约定**(下文统一遵循、不再逐处复述):marker 的 `stacks` 可以有 0、1 或多条。凡「遍历 stacks」对每条各跑一遍;`len == 1` 退化为单条、行为与旧单 stack 完全一致;`len == 0` 走「仅 `_common`」分支。skipped 的读写位置随形态而定 —— `len >= 1` 用 `stacks[].skipped`(`_common` 归 `stacks[0]`),`len == 0` 用 marker **顶层** `skipped`(不为 `_common` 造虚拟 stack 条目,以免破坏「`_common` 不进 stacks 列表」的约定)。
`len == 0` 的用途:模板源仓库自身(`claude-code-global`),或所有 stack 都不合身、但仍想复用 `_common` 的 stack-无关资源的项目。
## 前置检查
按顺序,**任一失败立即停止并报告**:
- 当前目录是 git 仓库(`git rev-parse --is-inside-work-tree`)
- `~/.claude/templates/` 存在且至少含一个 stack 子目录
- `~/.claude/global-repo/` 存在、是指向本仓库的软链、且能跑 `git rev-parse HEAD`
失败 → 提示用户重跑 `bash ~/.claude/global-repo/install.sh` 并退出。
## 模式判断
### 旧名 marker 自动迁移
marker 文件名在 round 22 由 `.cc-template.yml` 改为 `.agent-template.yml`。读 marker 前先查:
- 只有旧名 → `git mv .cc-template.yml .agent-template.yml`,并明确告知用户已自动迁移
- **两者同时存在** → 报冲突并停止,请用户手动处理(不猜哪个为准)
### 废弃 BACKLOG.md 一次性迁移
需求管理已改为「云端 issue 单一真源、无本地索引文件」(见 `GLOBAL_AGENTS.md`)。老项目遗留的 `docs/BACKLOG.md` 与云端 open issues 是双写副本,正是新约定要消除的 drift;sync 是「把约定变更落地到老项目」的天然承载点。
项目根无 `docs/BACKLOG.md` → 跳过本节(绝大多数项目走这里)。有则停下来引导