Files
CursorInitGeneral/.cursor/skills/cursor-init/SKILL.md
2026-04-21 17:08:42 +08:00

25 KiB
Raw Blame History

name, description
name description
cursor-init 初始化新项目的 .cursor 结构。两种触发方式: 1首次自动触发 —— 当 `.cursor/.init-done` sentinel 不存在时,`cursor-init-recall.mdc` 会在会话首次响应前引导 Agent 主动执行本 Skill 2关键词手动触发 —— "初始化cursor"、"cursor init"、"重置 cursor"、"补 gitignore" 等。 流程:识别并迁移目标项目原有的 rules/skills清理模板残留的项目专用数据 changelog/deferred/pitfalls/profile/distillery/local-env/项目级 rules 与 skills 可选生成 .gitignore 模板,最后写入 `.cursor/.init-done` 标记完成。 已 init 仓库不会再自动触发,除非用户主动通过关键词请求。

Cursor Init Skill

把从其它项目复制过来(或通过 git clone 模板仓库获得)的 .cursor/ 目录重置为当前新项目的干净起点。

使用场景

场景 A克隆模板仓库后的首次会话

1. 用户把本模板作为 git 仓库发布
2. 其他人 `git clone <模板仓库>` 得到新项目骨架
3. 用户打开 Cursor在该仓库发出任意第一条消息
4. `cursor-init-recall.mdc`alwaysApply检测 .cursor/.init-done 不存在
   → 引导 Agent 暂停用户原始请求,先执行本 Skill
5. Agent 按阶段 0 → 7 跑完,写入 .init-done
6. 后续会话 sentinel 已存在,不再自动触发

场景 B从已有项目直接复制 .cursor 目录

1. 用户在 "源项目 A" 中使用本 .cursor 模板开发
2. 用户开 "新项目 B",把 A 的 .cursor/ 整体拷贝到 B
3. B 原先可能也有自己零散的 rules/SKILL 文件(未必标准)
4. 用户在 B 中说"初始化cursor"(或首次会话被 recall 触发)
5. 本 Skill 把 B 原有的 rules/skills 按 baserule 归位,清空 A 遗留的项目数据,
   重建 registry生成 .gitignore写入 sentinel

场景 C只补 .gitignore

init 后用户说"补一下 gitignore"或"生成 gitignore" → 只跑阶段 5.5

触发条件

本 Skill 由 cursor-init-recall.mdc 触发,两类入口:

A. 全流程(阶段 0 → 7

  • .cursor/.init-done 不存在 → 会话首次响应前由 recall 规则自动引导
  • 用户关键词:初始化cursor / cursor init / 重置 cursor / reset cursor
  • 口头描述"把复制过来的 .cursor 清理一下"、"按 baserule 归位一下"

B. 仅补 .gitignore只跑阶段 5.5

  • 用户关键词:补 gitignore / 生成 gitignore / gitignore 模板
  • 跳过阶段 1-5 和阶段 7 的除"更新 gitignore_generated 字段"外的其他操作

执行原则(不可协商)

  1. 稳定准确 > token 成本:每一步可以多读、多确认、让用户点头,不要图快
  2. 破坏性操作必须 dry-run:删除、重置必须先列清单给用户确认
  3. 不可逆操作前提醒 git:开始前先提示用户确认工作区已 commit/stash
  4. 模糊就问:分类不清的文件一律问用户,不要猜
  5. 幂等:反复运行应当无害(第二次在已干净状态下不会做破坏)
  6. 中断可恢复:任何阶段异常 abort 不写入 .init-done,下次会话仍会被 recall 触发从头继续

核心流程

阶段 0前置确认 + 幂等判断

1. 检查当前工作目录下存在 .cursor/
   - 不存在 → 直接结束,提示用户先复制模板
2. 读取 .cursor/.init-done
   - 不存在 → 继续,按"首次 init"路径执行
   - 已存在 → 展示其元数据initialized_at、project_type 等),提示:
     "检测到本仓库已于 {initialized_at} 完成初始化project_type: {type})。
      继续执行会清空 deferred / pitfalls / distillery 等数据文件。确认要继续吗?"
     等用户明确回复"继续"再往下
3. 运行 `git status`
   - 不是 git 仓库 → 警告但不阻塞,建议手动备份
   - 有未提交改动 → 提醒"建议先 commit 或 stash便于回滚",等用户明确回复"继续"
4. 向用户声明本次操作范围(见"分组规则"),请求口头确认启动

阶段 1递归扫描 .cursor/

1. 用 shell 列出 .cursor 下所有文件(含子目录)
2. 把每个文件对照"规范清单"和"清理清单"分成三组:
   - A 组canonical在规范清单中原样保留
   - B 组template-data在清理清单中需要删除或重置
   - C 组foreign两张清单都没覆盖到的视作目标项目原有文件或未知项
3. 把分组结果用表格汇报给用户:
   | 组 | 路径 | 处理动作 |

阶段 2处理 C 组(目标项目原有文件归位)

对 C 组中的每个文件,按 baserule.mdc 的归属约定分类,逐条询问用户(可一次性列清单批量确认):

文件特征 建议归属 目标路径
.mdc 且内容是跨项目通用规则 通用 Rule .cursor/rules/common/<name>.mdc
.mdc 且内容是当前新项目专属规则 项目 Rule .cursor/rules/project/<name>.mdc
包含 SKILL.md 的目录 Skill无论通用/项目专属) .cursor/skills/<skill-name>/
看不出归属 询问用户
明显是临时/垃圾文件(*.log*.tmp、缓存等) 删除(需用户确认)

执行要点:

  • 先列清单一次性确认,然后批量执行移动/删除,避免交互过于频繁
  • 重名冲突C 组文件若与 A 组规范文件重名,保留 A 组版本,把 C 组备份到 .cursor/_init-backup/ 下让用户自行 diff不直接覆盖
  • Skill 归属提示:通用 Skill 建议用户之后手动同步到 ~/.cursor/skills/(跨项目便利副本,可选)
  • 迁移后核查:移动完成后重新扫描,确认 C 组已清空

阶段 3处理 B 组(源项目项目专用数据清理/重置)

按"清理清单"执行:

A. 直接删除

  • .cursor/rules/project/*.mdc(全部)—— 源项目的项目级 rules新项目不适用
  • .cursor/skills/<非规范 skill 目录>/ —— 源项目的项目级 Skills不在白名单的所有 skill 目录)
  • .cursor/plans/ 下所有文件(目录保留,内容清空)
  • .cursor/debug-*.log.cursor/*.log —— 调试日志
  • .cursor/local-env.json —— 设备绑定,需新设备重新生成(local-env-check.mdc 自动探测)

B. 重置为空模板(保留文件,仅清内容)

文件 模板(见"模板内容"节)
.cursor/changelog/changelog-full.md L1 模板
.cursor/changelog/changelog-recent.md L2 模板
.cursor/changelog/changelog-headlines.md L3 模板
.cursor/changelog/.changelog-ack 空文件touch
.cursor/deferred/registry.md deferred 模板
.cursor/pitfalls/pitfalls.md pitfalls 模板
.cursor/distillery/problems.md problems 模板
.cursor/distillery/insights.md insights 模板
.cursor/distillery/golden-rules.md golden-rules 模板
.cursor/profile/project-profile.md project-profile 模板
.cursor/profile/project-profile-log.md project-profile-log 模板

执行要点:

  • 每个重置前先 Read 现有内容预览前 10 行给用户,避免误删有价值数据(特别是 deferred/pitfalls 用户可能想保留)
  • 如用户对某个数据文件明确说"保留"(例如 golden-rules 想带过去),跳过该文件的重置

阶段 4重建 registry

打开 .cursor/skills/epee-orchestrator/registry.md

  1. 解析现有条目(每条 ### <skill-name> 块)
  2. 删除所有 类型: 项目级 的条目
  3. 遍历 .cursor/skills/ 目录,对照 registry
    • registry 有条目但 skill 目录不存在 → 删除条目
    • skill 目录存在但 registry 无条目 → 读取该 skill 的 SKILL.md frontmatter新增条目
  4. 确保 cursor-init 条目本身存在(类型: 基础设施)
  5. 写回 registry.md

阶段 5同步 hooks.json(跨平台保守处理)

  • 读取 .cursor/hooks.json
  • command 字段硬编码为 powershell ...,且目标新项目声明/探测到的 shell 不是 powershell参考 local-env-check.mdc提醒用户需要按 hooks/README.md 手动改为 bash .cursor/hooks/xxx.sh
  • 本阶段不自动改 hooks.json避免误判

阶段 5.5.gitignore 交互式生成

5.5.1 前置检测

检测项目根 .gitignore
  不存在        → 进入 5.5.2 问卷
  已存在且非空  → Read 前 30 行展示给用户,询问:
                  [覆盖 / 追加到文件末尾 / 跳过本阶段]
  用户选"跳过"  → 本阶段结束,.init-done 里标记 gitignore_generated: false

5.5.2 问卷(一次性批量 AskQuestion 收集)

必问 3 项 + 可选 1 项:

编号 问题 类型 选项
Q1 项目主要技术栈 多选 Unity / Node.js / Python / Rust / Go / C# 非 Unity / Web 静态站点 / 其他 / 不确定(跳过语言段)
Q2 IDE 偏好 多选 Cursor预勾/ VSCode / JetBrains 全家桶 / Visual Studio / Vim+Emacs
Q3 操作系统 多选 Windows / macOS / Linux按探测到的当前 OS 预勾)
Q4可选 其他要忽略的路径 自由文本 用户可跳过

5.5.3 片段组装

按问卷选择拼装,片段内容见下方"模板内容 · .gitignore 片段库"。拼装顺序固定:

# === Cursor固定所有项目都包含 ===
# === OS ===
# === IDE ===
# === Language / Framework ===
# === Custom ===

若 Q1 选"不确定" → 跳过 Language 段,其他段正常拼装(极简版仍可用)。

5.5.4 预览与确认

  1. 把组装结果写到 .cursor/_gitignore-preview(临时文件)
  2. 给用户完整展示(超过 60 行则折叠中段)
  3. AskQuestion[写入 .gitignore / 让我调整再确认 / 放弃本阶段]
  4. "写入"→ move 到项目根 .gitignore(已存在时按 5.5.1 的选择做覆盖或追加),删除预览文件
  5. "调整"→ 根据用户描述修改后重复步骤 2-3
  6. "放弃"→ 删除预览文件,.init-done 标记 gitignore_generated: false

阶段 6验证与报告

1. 重新递归扫描 .cursor/,再次分组
2. 期望状态:
   - A 组:全部保留,文件内容未被动过
   - B 组:数据文件仅含模板内容;项目级 rules/skills/日志 已删除
   - C 组:为空(或仅剩用户明确要求保留的文件)
   - 项目根 .gitignore按用户选择存在或被放弃状态记到报告里
3. 给用户一份结构化报告,至少包含:
   - 移动的文件from → to
   - 删除的文件
   - 重置的文件
   - 新注册/移除的 registry 条目
   - .gitignore 的处理结果(新建/追加/覆盖/放弃)
   - 未处理的文件(如果有,逐条说明原因)

阶段 7写入 .init-done sentinel

仅在阶段 6 验证全部通过后执行。任何前序阶段异常中断都不写入此文件,确保下次会话 recall 能再次触发。

1. 按"模板内容 · .init-done"格式,填充实际值写入 .cursor/.init-done
2. 向用户输出收尾提示:
   > 初始化完成。建议现在执行:
   >   git add .cursor/ .gitignore
   >   git diff --cached -- .cursor/
   >   git commit -m "chore(cursor): initialize .cursor from template"
   >
   > ⚠️ .cursor/.init-done 必须 commit否则团队其他成员 clone 后会被再次触发 init。

仅跑阶段 5.5 时(用户说"补 gitignore"

  • .init-done 存在 → 更新其中的 gitignore_generated: true 字段,保留其他字段
  • .init-done 不存在 → 提示用户"仓库尚未完整 init只补 gitignore 不会写 sentinel。是否改为跑完整 init"

规范清单canonical

下列文件构成本 .cursor 模板的"主干",初始化后必须都在、内容不被删改(数据文件除外):

顶层

  • .cursor/hooks.json
  • .cursor/local-env.example.json
  • .cursor/.init-done —— 阶段 7 写入;模板仓库自身不应包含此文件

Rules通用

  • .cursor/rules/common/baserule.mdc
  • .cursor/rules/common/changelog-recall.mdc
  • .cursor/rules/common/deferred-recall.mdc
  • .cursor/rules/common/distillery-recall.mdc
  • .cursor/rules/common/epee-orchestrator.mdc
  • .cursor/rules/common/pitfall-recall.mdc
  • .cursor/rules/common/profile-recall.mdc
  • .cursor/rules/common/cursor-init-recall.mdc

Rules项目专属目录

  • .cursor/rules/project/(保留空目录;源项目的 .mdc 内容一律删除)

Skills规范 Skill 目录白名单)

  • .cursor/skills/cursor-init/
  • .cursor/skills/deferred-decisions/
  • .cursor/skills/dev-changelog/
  • .cursor/skills/epee-orchestrator/(含 registry.md,见阶段 4
  • .cursor/skills/pitfall-journal/
  • .cursor/skills/problem-distillery/
  • .cursor/skills/profile-memory/

任何不在此白名单中的 skill 目录,在阶段 3 中一律删除(视为源项目的项目级 Skill

Hooks

  • .cursor/hooks/README.md
  • .cursor/hooks/run-hook.ps1
  • .cursor/hooks/session-init.ps1
  • .cursor/hooks/session-init.sh
  • .cursor/hooks/check-changelog.ps1
  • .cursor/hooks/check-changelog.sh

数据占位目录(保留目录,文件重置为模板内容)

  • .cursor/changelog/{changelog-full.md, changelog-recent.md, changelog-headlines.md, .changelog-ack}
  • .cursor/deferred/registry.md
  • .cursor/pitfalls/pitfalls.md
  • .cursor/distillery/{problems.md, insights.md, golden-rules.md}
  • .cursor/profile/{project-profile.md, project-profile-log.md}
  • .cursor/plans/(空目录)

清理清单cleanup list

强制删除

路径 原因
.cursor/rules/project/*.mdc 源项目的项目级 Rules
.cursor/skills/<非白名单>/ 源项目的项目级 Skills
.cursor/plans/*(内容) 源项目规划文档
.cursor/*.log.cursor/debug-*.log 调试日志遗留
.cursor/local-env.json 设备绑定配置,需由新设备重新生成
.cursor/_init-backup/(如果是上一轮残留) 仅阶段 2 冲突备份用,运行前应不存在
.cursor/_gitignore-preview(如果是上一轮残留) 阶段 5.5 临时文件

重置为模板

见"模板内容"节。


模板内容

重置数据文件时使用以下内容。带 {{DATE}} 的占位符替换为当天日期(YYYY-MM-DD)。

changelog-full.md

# Dev Changelog — Full

完整的开发改动记录,按时间倒序排列。作为主动 RAG 的数据源,用户手动唤醒时读取。

## 记录

changelog-recent.md

# Dev Changelog — Recent

最近 ~10 次改动的摘要记录,按时间倒序排列。
当 Agent 检测到当前任务与近期改动相关时自动读取。

changelog-headlines.md

# Dev Changelog — Headlines

最近 ~50 次改动的一句话概要,按时间倒序排列。每次会话自动注入上下文。

.changelog-ack

空文件0 字节),只用于更新 mtime 阻止 hook 重复提醒。

deferred/registry.md

# Deferred Decisions Registry

## Active Items

(暂无延期方案)

---

## Completed / Cancelled Items

(暂无已完成或已废弃的方案)

pitfalls/pitfalls.md

# Pitfall Journal

开发过程中踩过的坑,按时间倒序排列。
Agent 进入 Debug mode 或遇到运行时错误时自动检索匹配。

---

distillery/problems.md

# Problem Distillery — Problems

反复出现的顽固问题追踪记录,按时间倒序排列。

<!-- 新条目追加在此行下方 -->

distillery/insights.md

# Problem Distillery — Insights

从已解决的顽固问题中蒸馏出的精炼方法论。

<!-- 新条目追加在此行下方 -->

---
last_distill_date: {{DATE}}

distillery/golden-rules.md

# Golden Rules

经过实践验证(权重 >= 5的精炼认知每次新会话自动注入。

<!-- 当条目达到权重阈值后由 Agent 自动写入 -->

profile/project-profile.md

# Project Profile

## 项目定位

## 技术栈与架构

## 设计约定

## 产品方向

profile/project-profile-log.md

# Project Profile Log

详细记录每次项目画像更新的完整上下文,按时间正序追加。

## 记录

.init-done

阶段 7 写入的 sentinelYAML 格式,字段固定:

# .cursor/.init-done — cursor-init Skill 写入的初始化标记文件
# 本文件的存在表示本仓库已完成 .cursor 模板初始化
# 请务必 git commit 此文件,避免团队成员 clone 后被再次触发 init
initialized_at: {{ISO_DATETIME}}      # 如 2026-04-21T16:30:00+08:00
initialized_by: cursor-init
skill_version: 2
project_type: {{PROJECT_TYPE}}        # 阶段 5.5 问卷 Q1 结果;多选逗号分隔;"不确定"写 unknown
gitignore_generated: {{BOOL}}         # true / false

写入时机

  • 全流程跑完(阶段 6 验证通过)时由阶段 7 写入
  • "补 gitignore" 单独跑阶段 5.5 时,若已存在则只更新 gitignore_generated 字段

模板内容 · .gitignore 片段库

阶段 5.5 按用户问卷选择拼接以下片段。每段前后各空一行,保证可读性。

固定段Cursor

# === Cursor ===
# 设备绑定配置,不同机器需独立生成
.cursor/local-env.json

# Hook 运行态标记(仅影响本地会话)
.cursor/changelog/.changelog-ack

# cursor-init 临时产物
.cursor/_init-backup/
.cursor/_gitignore-preview

OS 段(按问卷 Q3 多选拼接)

Windows

# === OS: Windows ===
Thumbs.db
Thumbs.db:encryptable
ehthumbs.db
ehthumbs_vista.db
Desktop.ini
$RECYCLE.BIN/
*.stackdump
*.lnk

macOS

# === OS: macOS ===
.DS_Store
.AppleDouble
.LSOverride
Icon
._*
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent

Linux

# === OS: Linux ===
*~
.fuse_hidden*
.directory
.Trash-*
.nfs*

IDE 段(按问卷 Q2 多选拼接)

VSCode

# === IDE: VSCode ===
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
!.vscode/*.code-snippets
.history/
*.vsix

JetBrains

# === IDE: JetBrains ===
.idea/
*.iml
*.ipr
*.iws
.idea_modules/
atlassian-ide-plugin.xml

Visual Studio

# === IDE: Visual Studio ===
.vs/
*.user
*.suo
*.userprefs
bin/
obj/
[Dd]ebug/
[Rr]elease/
x64/
x86/

Vim/Emacs

# === IDE: Vim / Emacs ===
*.swp
*.swo
*.swn
Session.vim
.netrwhist
*~
\#*\#
.\#*

Cursor:固定段已覆盖,无需额外片段。

Language / Framework 段(按问卷 Q1 多选拼接)

Unity

# === Language: Unity ===
[Ll]ibrary/
[Tt]emp/
[Oo]bj/
[Bb]uild/
[Bb]uilds/
[Ll]ogs/
[Uu]ser[Ss]ettings/
[Mm]emoryCaptures/
[Rr]ecordings/
sysinfo.txt
*.apk
*.aab
*.unitypackage
*.app
*.csproj
*.unityproj
*.sln
*.suo
*.tmp
*.user
*.userprefs
*.pidb
*.booproj
*.svd
*.pdb
*.mdb
*.opendb
*.VC.db

Node.js

# === Language: Node.js ===
node_modules/
.npm/
.yarn/
.pnp.*
dist/
build/
out/
.next/
.nuxt/
.cache/
.parcel-cache/
coverage/
.env
.env.local
.env.*.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
.turbo/

Python

# === Language: Python ===
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
build/
dist/
*.egg-info/
*.egg
.venv/
venv/
env/
.pytest_cache/
.mypy_cache/
.ruff_cache/
.coverage
.coverage.*
htmlcov/
.tox/
.nox/
.hypothesis/
.ipynb_checkpoints/

Rust

# === Language: Rust ===
target/
**/*.rs.bk
*.pdb
# Cargo.locklib crate 建议忽略bin crate 建议提交,默认不忽略
# Cargo.lock

Go

# === Language: Go ===
bin/
vendor/
*.exe
*.exe~
*.dll
*.so
*.dylib
*.test
*.out
go.work

C# 非 Unity

# === Language: C# (non-Unity) ===
bin/
obj/
*.user
*.suo
*.pdb
*.cache
[Dd]ebug/
[Rr]elease/
x64/
x86/
[Bb]uild/
*.dll
*.pdb

Web 静态站点

# === Language: Web Static ===
node_modules/
dist/
build/
public/build/
.cache/
.tmp/
.sass-cache/
.parcel-cache/

其他:不拼接语言段,用户在 # === Custom === 段自行补充。

Custom 段(固定尾部)

# === Custom ===
# 在此段追加项目专属需要忽略的路径

若用户在问卷 Q4 填了自由文本,按行拆分后追加到 Custom 段下方。


冲突与边界情况处理

场景 处理
C 组某文件与 A 组重名 保留 A 组C 组移到 .cursor/_init-backup/,告知用户自行 diff
C 组有 SKILL.md 且 skill 名与 A 组白名单同名 保留 A 组 skillC 组整个 skill 目录移到 _init-backup/
数据文件(如 pitfalls.md)用户明确说"保留" 跳过该文件重置
local-env.json 存在且用户说"我就在这台机器上开 B保留它" 跳过删除,但提醒其已在 .gitignore
.cursor/rules/project/ 为空目录 保留空目录(便于未来放项目级 rules
扫描到 .cursor/_init-backup/(上轮残留) 警告用户并询问:删除 / 保留 / 重命名
git status 不能执行(不是 git 仓库) 警告但不阻塞,改为建议用户手动备份
.cursor/.init-done 已存在且用户触发了全流程 阶段 0 展示其元数据并要求二次确认
阶段 5.5 项目根已有 .gitignore 且用户选"追加" 把拼装结果追加到现有文件末尾(用 \n\n# --- 以下由 cursor-init 追加 ---\n 分隔)
阶段 5.5 中途异常或用户放弃 不写入 .gitignore.init-donegitignore_generated 记 false
阶段 7 写 .init-done 前前序阶段已 abort 不写入 sentinel下次会话 recall 会重新触发
用户说"补 gitignore" 但 .init-done 不存在 提醒"仓库尚未完整 init",询问是否改为跑全流程

与其他系统的协作

系统 关系 说明
baserule.mdc 分类权威 阶段 2 归位目录严格按 baserule 约定
cursor-init-recall.mdc 触发器 负责首次自动触发alwaysApply + sentinel 检查)和关键词触发
epee-orchestrator Skill 双向 本 Skill 被 Orchestrator 在 registry 里注册;同时本 Skill 负责清理 registry
dev-changelog / pitfall-journal / deferred-decisions / problem-distillery / profile-memory 下游数据主人 本 Skill 只在阶段 3 重置其数据文件,不改动 SKILL.md
local-env-check.mdc 后继 本 Skill 删除 local-env.json,后续新会话由 local-env-check 自动重新探测并生成

一次运行的最终状态(验收标准)

全流程(阶段 0 → 7完成后 .cursor/ 应当满足:

  1. 规范清单中列出的所有文件/目录都存在
  2. 所有数据文件changelog/deferred/pitfalls/distillery/profile仅含模板内容
  3. .cursor/rules/project/ 为空目录
  4. .cursor/skills/ 下仅有白名单中的 skill 目录
  5. .cursor/skills/epee-orchestrator/registry.md 中只有:基础设施 + 个人级 skill 条目,且包含 cursor-init 条目
  6. 不存在 *.loglocal-env.json_init-backup/_gitignore-preview
  7. .cursor/.init-done 已写入,字段完整且值有效
  8. 项目根 .gitignore 状态明确(存在且有内容 / 被用户显式放弃)
  9. git status .cursor/ .gitignore 能让用户清楚看到所有改动

仅跑阶段 5.5"补 gitignore")完成后:

  1. 项目根 .gitignore 存在或被显式放弃
  2. .init-done 已存在,其 gitignore_generated 字段被更新
  3. 其他 .cursor/ 内容零改动

自迭代日志

本节记录使用本 Skill 过程中发现的必要检查项。

已知必要检查

  1. 阶段 2 的 C 组归位前必须先做 dry-run 展示 —— 批量移动 .mdc / SKILL 文件是高破坏性操作,只要有一条分类错误就会污染 canonical 结构,必须让用户在列表上逐条过一遍再执行。

  2. 重名冲突不许直接覆盖 —— C 组与 A 组重名时A 组(模板版本)永远是 source of truth冲突文件只能进 _init-backup/,让用户自行决定是否把差异合并回 common rule。

  3. registry 重建时先读后写 —— 阶段 4 不要直接用硬编码模板覆盖 registry.md必须先解析现有条目只移除项目级条目、补齐缺失条目避免丢失用户自己添加的个人级 Skill 条目。

  4. .init-done 是完成度契约 —— 只有阶段 6 验证通过后才能写入此文件。中途 abort 必须让 sentinel 缺失,这是保证下次会话能恢复触发的关键设计。

  5. .gitignore 用户主导 —— 阶段 5.5 对语言栈/IDE/OS 的判断完全来自用户问卷,不要根据文件探测"智能推断",因为新项目此时通常还是空白,推断不准反而会填错条目。