Files
CursorInitGeneral/.cursor/skills/cursor-init/reference.md
2026-07-27 15:09:13 +08:00

8.0 KiB
Raw Blame History

Cursor Init Reference

本文件说明多类型初始化的数据契约和验收规则。机器真相源是 .cursor/bootstrap/*.json 流程入口是 SKILL.md。不得在本文件重新维护固定 Rule/Skill 数量。

1. 目录边界

.cursor/
├─ bootstrap/                         # tracked、惰性、自包含可信源
│  ├─ catalog.json                    # 支持类型与状态
│  ├─ common.manifest.json            # common canonical、重置与公共策略
│  ├─ skills.json                     # 全部 Skill 与 Registry 元数据
│  ├─ fragments/                      # common Git managed block 片段
│  ├─ templates/                      # 状态与空 changelog 模板
│  ├─ tools/cursor_init.py            # dry-run/apply/check 引擎
│  ├─ tests/test_cursor_init.py
│  └─ types/<type>/
│     ├─ manifest.json
│     ├─ fragments/
│     └─ payload/                     # 未选时不会进入 Cursor 活动目录
├─ rules/common/                      # 始终活动
├─ rules/project/                     # 只含所选类型general 时仅 .gitkeep
├─ skills/                            # common + 所选类型 Skill
├─ hooks/changelog-scan.json          # 按类型生成的活动扫描策略
├─ .init-state.json                   # managed payload 文件 hash
└─ .init-done                         # 全部验证通过后的提交标记

保护边界

  • .cursor/bootstrap/** 永不被 cleanup、类型切换或 reset 修改。
  • common 只在活动层保存一份;缺失时阻塞,不从不明来源生成空文件。
  • payload 中的 .mdc / SKILL.md 不位于 Cursor 活动路径,未选类型不得物化。
  • source/ 和业务目录不属于初始化管理范围。

2. Catalog

.cursor/bootstrap/catalog.json 字段:

  • schema_version:当前为 1
  • skill_versionsentinel 使用的初始化契约版本;
  • common_manifestskills_catalog:相对 bootstrap 的安全路径;
  • types[]id、用户标签 labelstatus 与 manifest 路径。

合法状态只有:

  • readypayload 和片段完整且可通过校验;会出现在 --list-types
  • draft:允许保留设计占位,但不会暴露给用户,也不能 dry-run/apply。

Agent 只能展示脚本返回的 ready 类型不从文档、MCP 或目录名猜测支持范围。

3. Common Manifest

.cursor/bootstrap/common.manifest.json 是跨类型契约:

  • canonical_files:必须存在的活动 common 文件;
  • skills:始终活动的 Skill ID
  • local_env_fields:所有类型都声明的本机字段;是否由初始化采集由字段元数据决定;
  • scanHook 公共扫描策略;
  • gitignore_fragments / gitattributes_fragments:公共 Git 片段;
  • reset_files:初始化时恢复为空模板的状态文件;
  • cleanup_globs:确认后删除的历史 fragment、缓存、备份和运行标记。

所有路径必须是项目根或 manifest 根内的相对路径;.. 与绝对路径非法。

4. Type Manifest

每个 .cursor/bootstrap/types/<type>/manifest.json 声明:

  • idversion
  • readiness:是否允许空 payload以及 ready 时是否强制要求 scan / gitignore
  • files[]:单文件 source → 活动 target
  • trees[]:完整目录 source → 活动 target适合项目专属 Skill
  • skills[]:该类型激活的 Skill ID
  • local_env_fields:仅选择该类型时生成;是否由初始化采集由字段元数据决定;
  • scan:与 common 合并的 Hook 文件名、扩展名和排除目录;
  • Git managed block 片段。

general 表示 common-only不物化 project Rule/Skill。类型切换时只删除已知 managed 且 hash 未被用户修改的旧 bundle 文件;用户改动过的文件必须成为阻塞项。

5. Skill Registry

.cursor/bootstrap/skills.json 保存每个 Skill 的:

  • idscope、活动 target
  • Registry 的类型、能力、触发场景和输出。

common manifest 和 type manifest 只引用 Skill ID。初始化脚本按活动 ID 生成 .cursor/skills/epee-orchestrator/registry.md,并验证对应目录存在 SKILL.md。 创建、删除、重命名或实质修改 Skill 时,先更新 skills.json 与所属 manifest再重新生成 Registry。

6. Dry-run 与所有权

dry-run 至少包含:

创建 / 更新 / 删除
Foreign
阻塞
PLAN_DIGEST

阻塞条件包括:

  • common canonical、ready payload 或片段缺失;
  • 活动目录存在 manifest 未登记的 Rule/Skill
  • managed 文件内容既不等于 payload也不等于 .init-state.json 记录的安装 hash
  • 本机必填字段缺失;
  • Git managed block 标记缺失一端、重复或损坏;
  • 路径越界或 schema 无效。

Apply 必须重算同一份计划并比对 digest。只有无阻塞计划才可执行。

7. 生成文件

local-env.example.json / local-env.json

common 与所选类型的 local_env_fields 按顺序合并。每个字段可使用:

  • required:初始化完成前是否必须提供;
  • sensitive:值是否属于密钥等敏感信息;
  • collect_at_init:初始化问卷和 --set 是否允许采集。

example 可提交且只能包含占位值local-env 保留未知键和已有用户值,并由 .gitignore 忽略。只有非 sensitive 且 collect_at_init 未设为 false 的字段才允许通过 --set KEY=VALUE 提供。敏感字段不阻塞初始化,也不参与状态漂移,真实值必须由用户 手工写入 .cursor/local-env.json不得保存密码、Cookie 或会话令牌。

changelog-scan.json

common + type 的 included_namesincluded_extensionsexcluded_directories 去重合并。 PowerShell/Bash Hook 只读取此文件会话标记、Git 内容状态与 mtime 的守卫逻辑留在脚本中。

Git managed blocks

脚本只维护以下标记之间的内容:

# >>> cursor-init managed >>>
...
# <<< cursor-init managed <<<

标记外用户内容不得覆盖。选择 --skip-git-files 时不改 .gitignore / .gitattributes sentinel 写 gitignore_generated: false

.init-state.json

记录当前项目类型、bundle 版本、manifest digest 与已物化 payload 文件 hash用于区分 bundle 升级和用户修改。它需要提交,不能包含本机绝对路径或秘密。

8. Sentinel

.cursor/.init-done 仅在 apply 后活动闭包再次验证通过时写入:

initialized_by: cursor-init
initialized_at: <ISO_DATETIME>
schema_version: 1
skill_version: <catalog.skill_version>
project_type: <single-ready-type>
bundle_version: <type-manifest.version>
manifest_digest: <sha256>
gitignore_generated: true|false

sentinel 和 .init-state.json 字段必须与当前 manifest 一致。取消、摘要变化、部分写入或验证失败 都不得创建/更新 sentinel。

9. Hook 契约

check-changelog.ps1.sh 必须保持相同行为:

  1. 非 Agent mode、缺 changelog、缺 scan config、缺 .session-start 时返回 {}
  2. Git 不可用、状态失败或工作区无内容差异时返回 {}
  3. 只扫描活动配置命中的文件,并要求 mtime 晚于 session/changelog
  4. 候选路径还必须被 git status --porcelain 判定为未提交改动;
  5. 任意解析或运行错误 fail-open不阻断用户。

回归测试入口:

python .cursor/hooks/tests/test_check_changelog.py

10. 验收

初始化或重置完成后:

  • python .cursor/bootstrap/tools/cursor_init.py --check 通过;
  • 活动 project Rules/Skills 与单选类型闭包完全一致,未选 payload 仍惰性保留;
  • Registry、scan config、local-env example、Git managed blocks 与 manifest 一致;
  • cleanup 后 changelog entries 仅有 .gitkeep,状态文件等于模板;
  • python .cursor/changelog/tools/changelog_build.py --check 通过;
  • Hook 双实现测试、初始化引擎测试、git diff --check 通过;
  • 本轮写入文本为 UTF-8 无 BOM、LF。