3.8 KiB
3.8 KiB
首次初始化自检(最高优先级 · 必须最先执行)
每一次会话的首次用户消息响应之前,Agent 必须执行以下检测(二选一,按优先级):
检测方式
方式 1(优先):检查 .claude/.pending-init 标记文件。
此文件由 session-init Hook 确定性创建(不依赖 Agent 记忆):
- Hook 在 SessionStart 时运行
.init-done不存在 → Hook 创建.pending-init.init-done存在 → Hook 删除.pending-init(清理残留)
Agent 只需 Read .claude/.pending-init:
- 文件存在 → 首次会话,必须触发 claude-init
- 文件不存在 → 已初始化,跳过
方式 2(兜底):直接检查 .claude/.init-done。
若方式 1 未执行(Hook 未配置或未运行),回退到直接检查 sentinel。
判定逻辑
IF .claude/.pending-init 存在 OR .claude/.init-done 不存在:
→ 本仓库是"clone 模板后的首次会话"
→ 必须在处理用户原始请求之前先完成 claude-init
ELSE:
→ 已 init 过,跳过本自检
→ 仅当用户命中下方"手动触发关键词"时才再次执行本 Skill
首次触发的执行方式
- 暂存用户原始请求,明确告诉用户:
"检测到当前仓库刚从模板 clone 下来,还未完成 .claude 初始化。需要先跑一遍 claude-init (清理模板遗留数据、配置项目画像、可选生成 .gitignore)。完成后再处理你的请求:{原始请求概要}。"
- 等用户明确回复"继续/OK"后,读取
.claude/skills/claude-init/SKILL.md并严格执行阶段 0 → 7 - init 完成后(阶段 7 写入
.init-done成功后),回到被暂存的用户原始请求继续处理 - 若用户说"先不做 init,就处理我的请求":
- 尊重用户选择,跳过本次 init
- 但仍在本次回复中明确说明 sentinel 缺失,并提示"下次会话还会再次提醒"
自检成本说明
已 init 项目:每次会话仅多一次 Read .claude/.pending-init(极低成本,文件不存在时 Read 返回 error 即视为"已初始化")。
.pending-init 由 Hook 维护,Agent 无需写入。
手动触发关键词(任意时刻,已 init 仓库也可用)
A. 全流程重置(阶段 0 → 7)
匹配任一:
- "初始化 claude" / "初始化claude" / "claude 初始化"
- "重置 claude" / "reset claude"
- "claude init" / "init claude"
- "把复制过来的 .claude 清理一下" / "按 baserule 归位一下"
执行方式:读取 .claude/skills/claude-init/SKILL.md,按阶段 0 → 7 执行。
若 .claude/.init-done 已存在,阶段 0 会展示其元数据并要求用户二次确认。
B. 仅补 .gitignore(只跑阶段 5.5)
匹配任一:
- "补 gitignore" / "补一下 gitignore" / "补个 gitignore"
- "生成 gitignore" / "生成 .gitignore"
- "gitignore 模板" / "来份 gitignore"
执行方式:读取 SKILL.md 的阶段 5.5 章节单独执行,不触碰其他阶段。
完成后更新 .init-done 中的 gitignore_generated: true。
执行原则
- 稳定准确优先于 token 成本
- 破坏性操作(删除、重置、移动)前必须给用户 dry-run 清单
- 分类不清的文件必须逐条询问用户,不要猜
- 开始前先执行
git status并提醒用户 commit/stash - 设计为幂等——重复运行在已干净状态下不应造成破坏
不触发本 Skill 的情况
- 用户只是问"claude 有什么 skill" —— 这是浏览需求,后续阶段会由
epee-orchestrator类 Skill 处理 - 用户只是想初始化某个具体数据文件(如"初始化画像")—— 走对应 Skill,不涉及全局重置
.claude/.init-done存在 且 用户请求中没有任一 A/B 组关键词 —— 正常响应用户,不提 init