@double-codeing/flow2spec 2.2.0 → 2.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,119 +1,76 @@
1
1
  # 目录与路径约定
2
2
 
3
- 本文档说明 **Flow2Spec** 在项目内使用的目录结构、文档路径与链接约定,以及版本管理字段。遵守这些约定可避免 AI 生成错误链接、便于索源与更新。
3
+ **配置根**:`flow2spec init` 写入的目录(默认 **`.cursor/`**,亦可 **`.claude/`**、**`.codex/`**)。下文以 **`.cursor/`** 为例,其它 agent 将 `.cursor` 换成对应目录名即可。
4
4
 
5
- **命名一览(区分:业务项目「配置根」下的文档目录 vs Flow2Spec 包内的说明目录)**
5
+ **文档**:[Flow2Spec使用说明](./Flow2Spec使用说明.md) · [README-命令说明](./README-命令说明.md) · [README-体系与原理](./README-体系与原理.md) · [Flow2Spec-使用案例-模拟对话](./Flow2Spec-使用案例-模拟对话.md)
6
6
 
7
- | 目录 | 位置 | 用途 |
8
- |------|------|------|
9
- | **`stock-docs/`** | `.cursor/stock-docs/` | **存量上下文源**:PDF/初稿/终稿/架构说明等,供 **f2s-ctx-build** 技能生成 Rules、Skills、索引 |
10
- | **`req-docs/`** | `.cursor/req-docs/` | **需求与技术方案**:澄清需求、后端技术方案、PDF MD(实现用)等,配合 `implement-tech-design` **按方案写代码** |
7
+ | 路径(逻辑) | 示例(Cursor) | 说明 |
8
+ |--------------|----------------|------|
9
+ | **stock-docs/** | `.cursor/stock-docs/` | 存量源文档(终稿/初稿/架构等)→ **f2s-ctx-build**;**f2s-doc-arch**(架构初稿)、**f2s-doc-add**(**工作中**已落地能力、多文件聚合进上下文)的初稿/终稿亦在此,**勿**与 **req-docs** 混用 |
10
+ | **req-docs/** | `.cursor/req-docs/` | 技术方案、澄清文档等 **implement-tech-design** 按方案写代码 |
11
+ | **rules/** | `.cursor/rules/` | **main.mdc**(唯一 alwaysApply)+ 专题 `*-context.mdc` |
12
+ | **skills/** | `.cursor/skills/` | 各 `SKILL.md` |
13
+ | **template/** | `.cursor/template/` | 终稿模版、后端技术模版 |
14
+ | **docs-index.md** | `.cursor/docs-index.md` | 文档 ↔ Rules / Skills 索引表 |
11
15
 
16
+ **init**:创建上表目录并复制模板。**升级**:旧名 `docs/` 可改名为 `stock-docs/`;`req-docs` 须在**配置根内**,勿与 `.cursor` 同级。
12
17
 
13
- ---
14
-
15
- ## 1. 目录结构(配置根与配置根父目录)
16
-
17
- **「配置根」**:`flow2spec init [agent ...]` 写入的 AI 工具配置目录。默认 **Cursor** 为 **`.cursor/`**;可选 **`.claude/`**、**`.codex/`** 等(可多选,各自一套相同子结构)。下文表格以 **`.cursor/`** 为例;若你的配置根为 `.claude/`,将路径中的 `.cursor` 替换为 `.claude` 即可。
18
-
19
- **配置根**下为 **stock-docs/**、**req-docs/**、**rules/**、**skills/**、**template/** 及 **docs-index.md**。下表**左列**为逻辑位置,**中列**为 Cursor(配置根 `.cursor/`)时的完整路径示例;使用 **`.claude/`** 等时把中列的 `.cursor` 换成对应目录名即可。
18
+ ### 1.1 Cursor 与 Claude Code:`rules/` 扩展名
20
19
 
21
- | 逻辑位置(相对配置根或配置根父目录) | Cursor 下路径示例 | 说明 |
22
- | ------------------------ | ----------------- | ---- |
23
- | `stock-docs/` | `.cursor/stock-docs/` | **存量源文档**;终稿、架构初稿、从 PDF 整理的 MD 等,用于**生成 Rules、Skills、索引** |
24
- | `rules/` | `.cursor/rules/` | **main.mdc**(总概述,唯一 alwaysApply)与各**专题 Rule**(*-context.mdc |
25
- | `skills/` | `.cursor/skills/` | Agent Skills:按主题分子目录,每目录下 **SKILL.md**(工作流与说明由 `flow2spec init` 写入) |
26
- | `template/` | `.cursor/template/` | 《终稿模版》《后端技术模版》等 |
27
- | **docs-index.md**(与 `stock-docs/` 同级) | `.cursor/docs-index.md` | 需求/文档索引表 |
28
- | `req-docs/` | `.cursor/req-docs/` | **需要实现成代码的文档**(技术方案等);对话中 **`.cursor/req-docs/xxx.md`** + implement-tech-design |
20
+ | 配置根 | 规则文件扩展名 | 路径范围(frontmatter) | 说明 |
21
+ |--------|----------------|-------------------------|------|
22
+ | **`.cursor/`**(Cursor) | **`.mdc`** | **`globs:`** + **`alwaysApply:`** | Cursor 约定 |
23
+ | **`.claude/`**(Claude Code) | **`.md`** | **`paths:`**(无 `paths` 则与会话同载) | Claude Code 不识别 `.mdc`;`flow2spec init claude` 由模板自动转换 |
29
24
 
30
- **flow2spec init 会创建**:对每个所选 agent,创建 **配置根** **`stock-docs/`**、**`req-docs/`**、**`template/`**、**`rules/`**、**`skills/`** 子目录,并写入模板。
31
-
32
- **从旧版升级**:若仍使用旧名 **`docs/`**(配置根下),可改名为 **`stock-docs/`**。若曾把 **`req-docs/` 误放在配置根父目录**(与 `.cursor` 同级而非其下),请**整体迁入**当前所用配置根下(如 `.cursor/req-docs/`),再执行 `flow2spec init` 可确保目录存在(已存在则保留其中文件)。
25
+ **`.claude/`** 下手工维护规则时,请使用 **`.md`** **`paths:`**;勿复制 Cursor 的 **`globs:`** / **`.mdc`** 以免不生效。Claude Code **不会**把 **`.mdx`** 当作项目规则加载;请勿用 **`.mdx`** 作为 `rules/` 内规则扩展名。
33
26
 
34
27
  ---
35
28
 
36
- ## 2. 文档路径与链接约定(必守)
37
-
38
- 生成 Rule、Skill、docs-index 时,引用 **`stock-docs/`**(配置根下)内文档的链接写法必须按下列规则,否则在编辑器里打开产物时链接会失效。
39
-
40
- **与配置根的关系**:下表以 **Cursor**(配置根为 **`.cursor/`**)为例书写路径。若你通过 `flow2spec init claude` 等使用 **`.claude/`**、**`.codex/`** 等作为配置根,则:
41
-
42
- - **显示路径、sourceDoc、docs-index 文档列**中的 **`.cursor`** 一律改为你的配置根目录名(例如 `sourceDoc: .claude/stock-docs/<文件名>.md`,docs-index 显示列写 `.claude/stock-docs/...`)。
43
- - **相对链接**规则不变:Rule 内仍用 `../stock-docs/<文件名>.md`,Skill 内仍用 `../../stock-docs/<文件名>.md`,docs-index 的链接 href 仍仅为 `stock-docs/<文件名>.md`(均相对于**该配置根**内部的 `rules/`、`skills/`、`docs-index.md` 位置,与 **`req-docs/`** 无关)。
29
+ ## 2. 链接写法(生成 Rule / Skill / docs-index 时必守)
44
30
 
45
- | 写入位置(以 `.cursor/` 为例) | 引用该文档时的写法 |
46
- | -------------------------------- | ----------------------------------------------------------------------- |
47
- | **`rules/*.mdc`** | 链接 href 为 `**../stock-docs/<文件名>.md**`(从 rules 到同配置根下 stock-docs 的相对路径) |
48
- | **`skills/<主题>/SKILL.md`** | 链接 href 为 `**../../stock-docs/<文件名>.md**`(从 skills/xxx 到 stock-docs 的相对路径) |
49
- | **`docs-index.md`** | 链接 href 为 `**stock-docs/<文件名>.md**`(docs-index 与 `stock-docs/` 同级,故 href 不含 `../`) |
50
- | **frontmatter 的 sourceDoc** | **`<配置根>/stock-docs/<文件名>.md`**(与 **f2s-ctx-build** 技能入参一致,如 `.cursor/stock-docs/...` 或 `.claude/stock-docs/...`) |
31
+ **rules/**、**skills/**、**docs-index.md** 指向 **stock-docs/** 的 **href** 必须如下(否则链接断):
51
32
 
52
- **正确示例(配置根为 `.cursor/` 时):**
33
+ | 写入位置 | 链接 href |
34
+ |----------|-----------|
35
+ | `rules/*.mdc` | `../stock-docs/<文件名>.md` |
36
+ | `skills/<主题>/SKILL.md` | `../../stock-docs/<文件名>.md` |
37
+ | `docs-index.md` | `stock-docs/<文件名>.md`(无 `../`) |
38
+ | **sourceDoc**(frontmatter) | **`<配置根>/stock-docs/<文件名>.md`**(如 `.cursor/stock-docs/xxx.md`) |
53
39
 
54
- - Rule 内:`[拼团技术方案设计](../stock-docs/拼团技术方案设计.md)`
55
- - Skill 内:`[拼团技术方案设计](../../stock-docs/拼团技术方案设计.md)`
56
- - docs-index 单元格:`[.cursor/stock-docs/拼团技术方案设计.md](stock-docs/拼团技术方案设计.md)`
57
- - frontmatter:`sourceDoc: .cursor/stock-docs/拼团技术方案设计.md`
40
+ **禁止**:Rule/Skill/docs-index **req-docs** 当 stock-docs 链出;docs-index 的 href 写成 `../stock-docs/` 或裸绝对路径。
58
41
 
59
- **若配置根为 `.claude/`**:docs-index 显示列与 sourceDoc 改为 `.claude/stock-docs/<文件名>.md`;链接 href 仍同上三行相对规则。
60
-
61
- **禁止:**
62
-
63
- - 在 Rule 内使用 `../../stock-docs/` 或把 **`req-docs/`** 下的技术方案误当作 **stock-docs** 链出目标(会 404 或链错)
64
- - 在 Skill 内使用 `../stock-docs/` 或上述误链
65
- - 在 docs-index 的链接 href 中使用 `../stock-docs/` 或裸路径 `.cursor/stock-docs/xxx.md`(应仅为 `stock-docs/<文件名>.md`)
66
- - 在 sourceDoc 中写 `../stock-docs/xxx.md` 或 **`req-docs/xxx.md`**(生成上下文的 sourceDoc 必须为 **`<配置根>/stock-docs/<文件名>.md`**)
67
-
68
- **记忆要点**:生成 Rules/Skills 的**源文档**只在 **`stock-docs/`** 下(勿把 **`req-docs/`** 当链出目标);Rule 内 `../stock-docs/`,Skill 内 `../../stock-docs/`,docs-index 内 `stock-docs/`;sourceDoc 用 **实际配置根** + `/stock-docs/<文件名>.md`。
42
+ **记忆**:链出只认 **stock-docs**;Rule `../`,Skill `../../`,索引 `stock-docs/`;sourceDoc 用配置根全路径。
69
43
 
70
44
  ---
71
45
 
72
- ## 3. 文档产物阶段(原稿 / 初稿 / 终稿)
73
-
74
- 文档在流程中的阶段与命名约定如下,便于区分「未加工 → 待确认 → 可生成上下文」的形态。以下路径均在 **`stock-docs/`** 下(Cursor 下即 `.cursor/stock-docs/`,其他 agent 将 `.cursor` 换为对应目录名)。
46
+ ## 3. 文档产物阶段(均在 stock-docs/)
75
47
 
76
- | 阶段 | 含义 | 典型文件名 / 来源 |
77
- |------|------|-------------------|
78
- | **原稿** | 原始材料(如 PDF、未结构化的 MD),未放入本体系时的形态。 | 任意 PDF、`stock-docs/xxx.md`(未规范前) |
79
- | **初稿** | **f2s-doc-final** 技能从 **PDF 首次**转出、或 **f2s-doc-arch** 技能生成的架构说明,供人工检查与修改。 | `stock-docs/<方案名>_初稿.md`、`<项目名>架构说明_初稿.md` |
80
- | **终稿** | 初稿或任意 MD 经 **f2s-doc-final** 技能转为《终稿模版》规范格式后的**最终产物**,用于生成 Rules、Skills。 | `stock-docs/<方案名>_终稿.md` |
48
+ | 阶段 | 含义 | 典型名 |
49
+ |------|------|--------|
50
+ | 原稿 | 未纳入体系前的材料 | 任意 PDF、杂乱 MD |
51
+ | 初稿 | **f2s-doc-final**(PDF 首次)、**f2s-doc-arch**(架构说明),或 **f2s-doc-add**(**工作中**把**已落地能力**从多文件聚合成的初稿) | `*_初稿.md`、`*架构说明_初稿.md` 等;**f2s-doc-add** 与 **f2s-doc-arch** 分工见各自 `SKILL.md` |
52
+ | 终稿 | **f2s-doc-final** 规范输出 | `*_终稿.md` → **f2s-ctx-build** 入参 |
81
53
 
82
- **与命令的对应关系:**
83
-
84
- - **f2s-doc-final**:传入 PDF → 输出初稿(`_初稿.md`);传入初稿或 MD → 输出**终稿**(`_终稿.md`)。
85
- - **f2s-ctx-build**:入参为**终稿或等价存量文档路径**(如 `stock-docs/<方案名>_终稿.md`,即 `.cursor/stock-docs/...` 或 `.claude/stock-docs/...` 等),根据该文档生成 Rules、Skills、索引。生成的 **Rules、Skills 文件名与目录名不带 `_终稿` 后缀**,保持现有约定(如 `rules/<主题>-context.mdc`、`skills/<主题>-context/SKILL.md`)。
86
-
87
- 小结:**文档**可有 原稿 → 初稿(`_初稿`)→ 终稿(`_终稿`);**Rules、Skills** 由终稿生成,命名不加 `_终稿`。
54
+ Rules/Skills **文件名不带 `_终稿`**。
88
55
 
89
56
  ---
90
57
 
91
58
  ## 4. 版本管理(sourceDoc 与 generatedAt)
92
59
 
93
- 每条 Rule、每条 Skill 的 frontmatter 中**必须**包含:
94
-
95
- - **sourceDoc**:源文档路径,格式 **`<配置根>/stock-docs/<文件名>.md`**(与 **f2s-ctx-build** 技能入参一致,如 `.cursor/stock-docs/xxx.md`、`.claude/stock-docs/xxx.md`)
96
- - **generatedAt**:本次生成时间,东八区北京时间,ISO 8601,如 `2026-01-28T20:00:00+08:00`
97
-
98
- 用途:**从产物找文档**(看 Rule/Skill 的 `sourceDoc`)、**从文档找产物**(查该配置根下的 docs-index)、**更新**(改文档后对同一路径再执行 **f2s-ctx-build** 技能)。索源与典型用法见 [README-体系与原理 - 版本管理与索源](./README-体系与原理.md#5-版本管理与索源)。
60
+ 每条 RuleSkill 的 frontmatter:**sourceDoc**(同上表)、**generatedAt**(东八区 ISO 8601,如 `2026-01-28T20:00:00+08:00`)。
61
+ **索源**:产物看 `sourceDoc`;文档看 **docs-index** 对应行;更新对同路径再跑 **f2s-ctx-build**。用法见 [README-体系与原理 §5](./README-体系与原理.md#5-版本管理与索源)。
99
62
 
100
63
  ---
101
64
 
102
- ## 5. 模版目录(`template/`)
65
+ ## 5. template/
103
66
 
104
- - **包内路径**:Flow2Spec 包内模版目录 **templates/template/**(与 `templates/skills` 等同级),包含 `终稿模版.md`、`后端技术模版.md` 等。
105
- - **init 注入**:`flow2spec init` 将包内 **templates/template/** 整目录复制到**每个所选配置根**下的 **`template/`**(Cursor 下即 **`.cursor/template/`**,Claude 下即 **`.claude/template/`** 等),例如 `终稿模版.md`、`后端技术模版.md` 位于 **`template/`** 内。
106
- - **f2s-doc-final**:转换时优先读取 **`template/终稿模版.md`** 作为格式规范;若不存在则使用命令内嵌的模板结构。
107
- - **生成后端技术文档**:结构范本为 **`template/后端技术模版.md`**;产出技术方案默认写入 **`req-docs/`**。
108
- - 团队可自行修改**当前所用配置根**下 `template/` 内文件;再次 init 会**覆盖**该目录(与 rules/skills 行为一致)。
67
+ 包内 **templates/template/** → init 复制到 **配置根/template/**。**f2s-doc-final** 读 `template/终稿模版.md`;**f2s-req-backend** 参考 `template/后端技术模版.md`。再次 init **覆盖** `template/`。
109
68
 
110
69
  ---
111
70
 
112
71
  ## 6. 小结
113
72
 
114
- - **配置根**下:`stock-docs/`、**`req-docs/`**、`rules/`、`skills/`、`template/`,索引文件 **docs-index.md**(如 `.cursor/docs-index.md`)。
115
- - **文档产物阶段**:原稿 初稿(`_初稿.md`)→ 终稿(`_终稿.md`);f2s-doc-final 的最终输出为终稿;f2s-ctx-build 用终稿生成 Rules、Skills,但 Rules、Skills 命名不带 `_终稿`。
116
- - 文档链接按**写入位置**使用不同相对路径:Rule 用 `../stock-docs/`,Skill 用 `../../stock-docs/`,docs-index 用 `stock-docs/`;**sourceDoc** 与显示路径用 **实际配置根** + `/stock-docs/<文件名>.md`(见 §2)。
117
- - 版本管理用 **sourceDoc** + **generatedAt**,便于索源与按文档更新产物。
73
+ - **stock-docs** = 上下文源;**req-docs** = 实现用方案。
74
+ - 链接层级见 §2;产物阶段见 §3;版本字段见 §4。
118
75
 
119
- **相关文档**:[Flow2Spec使用说明](./Flow2Spec使用说明.md)(init、目录约定引用、典型流程) | [README-命令说明](./README-命令说明.md)(各命令入参输出、按使用顺序查找) | [README-体系与原理](./README-体系与原理.md)(main 与 docs-index、设计原则)
76
+ **相关文档**:[Flow2Spec使用说明](./Flow2Spec使用说明.md) | [Flow2Spec-使用案例-模拟对话](./Flow2Spec-使用案例-模拟对话.md) | [README-命令说明](./README-命令说明.md) | [README-体系与原理](./README-体系与原理.md)
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Cursor 规则为 .mdc + frontmatter globs、alwaysApply。
3
+ * Claude Code 仅识别 .claude/rules 下扩展名为 .md 的规则文件,路径范围用 paths(见 Claude Code 文档:Organize rules with .claude/rules)。
4
+ */
5
+
6
+ /**
7
+ * @param {string} mdcSource 完整 .mdc 文件正文
8
+ * @returns {string} 写入 `.claude/rules/*.md` 的正文
9
+ */
10
+ function adaptRuleMdcToClaudeMd(mdcSource) {
11
+ let out = mdcSource;
12
+ // YAML:globs → paths(与 Cursor 语义等价)
13
+ out = out.replace(/^globs:/m, "paths:");
14
+ // Claude Code 不按 Cursor 的 alwaysApply 解析;无 paths 的规则与会话同载
15
+ out = out.replace(/^\s*alwaysApply:\s*(true|false)\s*\r?\n/m, "");
16
+ // 正文与示例中的 .mdc 引用改为 .md,与落盘扩展名一致
17
+ out = out.replace(/\.mdc\b/g, ".md");
18
+ return out;
19
+ }
20
+
21
+ /**
22
+ * @param {string} agentRoot AGENTS[id].root,如 `.claude`
23
+ */
24
+ function shouldWriteClaudeStyleRules(agentRoot) {
25
+ return agentRoot === ".claude";
26
+ }
27
+
28
+ module.exports = { adaptRuleMdcToClaudeMd, shouldWriteClaudeStyleRules };
package/lib/init.js CHANGED
@@ -1,6 +1,7 @@
1
1
  const path = require("path");
2
2
  const fs = require("fs");
3
3
  const { AGENTS, SUBDIRS, normalizeAgentIds } = require("./agents");
4
+ const { adaptRuleMdcToClaudeMd, shouldWriteClaudeStyleRules } = require("./claudeRulesAdapter");
4
5
 
5
6
  function ensureDirs(cwd, agentRoot) {
6
7
  for (const sub of SUBDIRS) {
@@ -22,18 +23,46 @@ function copyRecursive(src, dest) {
22
23
  }
23
24
  }
24
25
 
26
+ /** 复制 templates/rules:Cursor 保留 .mdc;Claude Code 写入 .md 并转换 frontmatter(globs→paths,去掉 alwaysApply) */
27
+ function copyRulesTemplates(cwd, agentRoot, templatesDir) {
28
+ const rulesSrc = path.join(templatesDir, "rules");
29
+ const rulesDest = path.join(cwd, agentRoot, "rules");
30
+ if (!fs.existsSync(rulesSrc)) return;
31
+ if (!fs.existsSync(rulesDest)) fs.mkdirSync(rulesDest, { recursive: true });
32
+
33
+ const claudeStyle = shouldWriteClaudeStyleRules(agentRoot);
34
+ if (claudeStyle) {
35
+ for (const name of fs.readdirSync(rulesDest)) {
36
+ if (name.endsWith(".mdc")) {
37
+ fs.unlinkSync(path.join(rulesDest, name));
38
+ }
39
+ }
40
+ }
41
+
42
+ for (const name of fs.readdirSync(rulesSrc)) {
43
+ const srcPath = path.join(rulesSrc, name);
44
+ const st = fs.statSync(srcPath);
45
+ if (st.isDirectory()) {
46
+ copyRecursive(srcPath, path.join(rulesDest, name));
47
+ continue;
48
+ }
49
+ if (!name.endsWith(".mdc")) {
50
+ fs.copyFileSync(srcPath, path.join(rulesDest, name));
51
+ continue;
52
+ }
53
+ const raw = fs.readFileSync(srcPath, "utf8");
54
+ const body = claudeStyle ? adaptRuleMdcToClaudeMd(raw) : raw;
55
+ const destName = claudeStyle ? name.replace(/\.mdc$/i, ".md") : name;
56
+ fs.writeFileSync(path.join(rulesDest, destName), body, "utf8");
57
+ }
58
+ }
59
+
25
60
  /** 将 templates 下全部内容复制到指定配置根目录(如 .cursor、.claude) */
26
61
  function copyTemplatesToAgentRoot(cwd, agentRoot) {
27
62
  const templatesDir = path.join(__dirname, "..", "templates");
28
63
  const destRoot = path.join(cwd, agentRoot);
29
64
 
30
- const rulesSrc = path.join(templatesDir, "rules");
31
- const rulesDest = path.join(destRoot, "rules");
32
- if (fs.existsSync(rulesSrc)) {
33
- for (const name of fs.readdirSync(rulesSrc)) {
34
- copyRecursive(path.join(rulesSrc, name), path.join(rulesDest, name));
35
- }
36
- }
65
+ copyRulesTemplates(cwd, agentRoot, templatesDir);
37
66
 
38
67
  const skillsSrc = path.join(templatesDir, "skills");
39
68
  const skillsDest = path.join(destRoot, "skills");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@double-codeing/flow2spec",
3
- "version": "2.2.0",
3
+ "version": "2.2.2",
4
4
  "description": "flow2spec init:落盘 .cursor/.claude/.codex 等配置根的 rules、skills、stock-docs/req-docs,文档驱动、f2s 可写回知识库工作流。",
5
5
  "homepage": "https://github.com/Lands-1203/Flow2Spec#readme",
6
6
  "repository": {
@@ -8,7 +8,7 @@ alwaysApply: false
8
8
 
9
9
  # stock-docs 与 req-docs
10
10
 
11
- - **`配置根/stock-docs/`**:PDF/初稿/终稿/架构说明等**存量源文档**;**f2s-ctx-build**、**f2s-doc-final**、**f2s-doc-arch** 等技能的落盘(除 PDF→初稿等另有说明外)优先在此。Rule/Skill/docs-index 链出文档用 `../stock-docs/`、`../../stock-docs/`、`stock-docs/<文件名>.md`;`sourceDoc` 为 `<配置根>/stock-docs/<文件名>.md`。
11
+ - **`配置根/stock-docs/`**:PDF/初稿/终稿/架构说明等**存量源文档**;**f2s-ctx-build**、**f2s-doc-final**、**f2s-doc-arch**(架构初稿)、**f2s-doc-add**(**工作中**将**已落地能力**从多文件解析进上下文:初稿→终稿→Rules/Skills;与 f2s-doc-arch 分工不同)等技能的落盘(除 PDF→初稿等另有说明外)优先在此。Rule/Skill/docs-index 链出文档用 `../stock-docs/`、`../../stock-docs/`、`stock-docs/<文件名>.md`;`sourceDoc` 为 `<配置根>/stock-docs/<文件名>.md`。
12
12
  - **`req-docs/`**(**配置根**下,如 `.cursor/req-docs/`):需求澄清、**后端技术方案**、f2s-doc-pdf 输出的「按方案实现」MD;`implement-tech-design` 的 globs 为 `**/req-docs/**/*.md`。
13
13
 
14
14
  完整约定与链接表见仓库 **`docs/README-目录与路径约定.md`**(包内说明;用户项目无此目录时以 init 写入的 **skills** 与 **rules** 为准)。
@@ -1,12 +1,13 @@
1
1
  ---
2
- name: f2s-ctx-build
2
+
3
+ ## name: f2s-ctx-build
3
4
  description: 根据 stock-docs 文档生成 Rules、Skills 与文档索引;触发:生成项目上下文、f2s-ctx-build、终稿生成上下文
4
- ---
5
- > **「配置根」**:当前 agent 对应的 AI 工具配置目录(`flow2spec init` 写入,常见 **`.cursor/`**、**`.claude/`**、**`.codex/`**)。下文 **`配置根/...`** 指该目录下的相对路径。
5
+
6
+ > **「配置根」**:当前 agent 对应的 AI 工具配置目录(`flow2spec init` 写入,常见 `**.cursor/`**、`**.claude/**`、`**.codex/**`)。下文 `**配置根/...**` 指该目录下的相对路径。
6
7
 
7
8
  # 根据文档生成项目上下文(Rules、Skills、文档索引)
8
9
 
9
- 用户会在本技能后附带**一个参数**:要么是一个 **URL**(如 `https://xxx.com/doc`),要么是一个**本地路径**,且路径应指向 **配置根/stock-docs/** 下的 Markdown(PDF/初稿/终稿/架构说明等**存量上下文源**,用于生成 Rules、Skills)。**不要**把 **`配置根/req-docs/`**(按方案实现代码的技术方案目录)当作本技能入参;若用户只持有该目录下的方案,应提示先将符合《终稿模版》的文档复制或整理到 **`配置根/stock-docs/`** 再执行。请按以下步骤执行,用你的**大模型能力**分析文档并生成完整架构。
10
+ 用户会在本技能后附带**一个参数**:要么是一个 **URL**(如 `https://xxx.com/doc`),要么是一个**本地路径**,且路径应指向 **配置根/stock-docs/** 下的 Markdown(PDF/初稿/终稿/架构说明等**存量上下文源**,用于生成 Rules、Skills)。**不要**把 `**配置根/req-docs/`**(按方案实现代码的技术方案目录)当作本技能入参;若用户只持有该目录下的方案,应提示先将符合《终稿模版》的文档复制或整理到 `**配置根/stock-docs/**` 再执行。请按以下步骤执行,用你的**大模型能力**分析文档并生成完整架构。
10
11
 
11
12
  **文档产物阶段约定**:doc 中的产物一般分为 **原稿**、**初稿**、**终稿**;本技能生成的 **Rules、Skills 文件名与目录名不带 `_终稿` 等后缀**,与现有约定一致(如 `<主题>-context.mdc`、`<主题>-context/SKILL.md`)。
12
13
 
@@ -15,15 +16,15 @@ description: 根据 stock-docs 文档生成 Rules、Skills 与文档索引;触
15
16
 
16
17
  1. **拆解**:根据文档篇幅与领域块数量,决定是「单 Rule + 单 Skill」还是「索引入口 + 多条专题 Rule/Skill」。篇幅长或含多块独立内容(如接口约定、消息队列、配置、公共工具等)时,应拆成索引入口 + 多条按场景/主题的 Rule 与 Skill,使单条更聚焦、按需加载。
17
18
  2. **分工**:
18
- - **Rules**:承担**约束、约定、作用范围**;一条 alwaysApply 的索引入口 + 若干条用 globs 限定在相关路径的专题规则;正文写「必须/禁止/约定」类内容。
19
- - **Skills**:承担**领域知识、操作步骤、示例**;一个总览 skill + 若干专题 skill;description 写清触发词与使用场景,正文写概念、流程、方法表、示例。
19
+ - **Rules**:承担**约束、约定、作用范围**;一条 alwaysApply 的索引入口 + 若干条用 globs 限定在相关路径的专题规则;正文写「必须/禁止/约定」类内容。
20
+ - **Skills**:承担**领域知识、操作步骤、示例**;一个总览 skill + 若干专题 skill;description 写清触发词与使用场景,正文写概念、流程、方法表、示例。
20
21
 
21
22
  ---
22
23
 
23
24
  ## 步骤 1:获取文档内容
24
25
 
25
26
  - 若用户给出的是 **HTTPS/HTTP URL**:使用你可用的网络请求能力(如 web fetch)拉取该 URL 的页面内容。若你所在环境无法访问该 URL(如内网),则回复用户说明「请将页面内容复制到项目内 `配置根/stock-docs/xxx.md`,再执行本技能并传入路径 `配置根/stock-docs/xxx.md`」。
26
- - 若用户给出的是**本地路径**:从配置根的父目录读取该文件(须为 **`配置根/stock-docs/…`**,如 `配置根/stock-docs/功能描述.md`)。若路径落在 **`配置根/req-docs/`**(技术方案目录),应提醒用户:本技能入参须为 **stock-docs** 下的存量源文档;请先将符合《终稿模版》的内容整理到 **`stock-docs/`** 再执行。
27
+ - 若用户给出的是**本地路径**:从配置根的父目录读取该文件(须为 `**配置根/stock-docs/…`**,如 `配置根/stock-docs/功能描述.md`)。若路径落在 `**配置根/req-docs/**`(技术方案目录),应提醒用户:本技能入参须为 **stock-docs** 下的存量源文档;请先将符合《终稿模版》的内容整理到 `**stock-docs/`** 再执行。
27
28
 
28
29
  得到的内容可能是 Markdown、HTML 或富文本,请先提取出**正文**(若是 HTML 可提取 body 内的文本或转成可读的 Markdown)。
29
30
 
@@ -33,27 +34,31 @@ description: 根据 stock-docs 文档生成 Rules、Skills 与文档索引;触
33
34
 
34
35
  生成任何产物时,**必须**按下列规则写文档路径与链接。**路径写错会导致 Cursor 中链接失效、AI 无法正确打开源文档,务必严格按表执行。**
35
36
 
36
- | 写入位置 | 文档所在目录(固定) | 引用该文档时的写法 |
37
- |----------|----------------------|--------------------|
38
- | **配置根/rules/*.mdc** | 文档在 `配置根/stock-docs/<文件名>.md` | 链接 **必须** 写为 `[文档标题](../stock-docs/<文件名>.md)`,即 href 为 **`../stock-docs/<文件名>.md`**(从 配置根/rules 到 配置根/stock-docs 的相对路径)。 |
39
- | **配置根/skills/<主题>/SKILL.md** | 同上 | 链接 **必须** 写为 `[文档标题](../../stock-docs/<文件名>.md)`,即 href 为 **`../../stock-docs/<文件名>.md`**(从 配置根/skills/xxx 到 配置根/stock-docs 的相对路径)。 |
40
- | **配置根/docs-index.md** | 同上 | 文档路径列:显示可写 `配置根/stock-docs/<文件名>.md`;链接 href **必须** **`stock-docs/<文件名>.md`**(因 docs-index 位于配置根下,同级的 **stock-docs** 目录即 `stock-docs/<文件名>.md`)。示例:`[配置根/stock-docs/技术方案设计.md](stock-docs/技术方案设计.md)`。 |
41
- | **frontmatter sourceDoc** | 同上 | **必须** 写为 **`配置根/stock-docs/<文件名>.md`**(与用户传入的本地路径一致;若用户传的是相对路径如 `配置根/stock-docs/xxx.md`,即用该值)。 |
37
+
38
+ | 写入位置 | 文档所在目录(固定) | 引用该文档时的写法 |
39
+ | ---------------------------- | ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
40
+ | **配置根/rules/*.mdc** | 文档在 `配置根/stock-docs/<文件名>.md` | 链接 **必须** 写为 `[文档标题](../stock-docs/<文件名>.md)`,即 href 为 `**../stock-docs/<文件名>.md`**(从 配置根/rules 到 配置根/stock-docs 的相对路径)。 |
41
+ | **配置根/skills/<主题>/SKILL.md** | 同上 | 链接 **必须** 写为 `[文档标题](../../stock-docs/<文件名>.md)`,即 href 为 `**../../stock-docs/<文件名>.md`**(从 配置根/skills/xxx 配置根/stock-docs 的相对路径)。 |
42
+ | **配置根/docs-index.md** | 同上 | 文档路径列:显示可写 `配置根/stock-docs/<文件名>.md`;链接 href **必须** `**stock-docs/<文件名>.md`**(因 docs-index 位于配置根下,同级的 **stock-docs** 目录即 `stock-docs/<文件名>.md`)。示例:`[配置根/stock-docs/技术方案设计.md](stock-docs/技术方案设计.md)`。 |
43
+ | **frontmatter 的 sourceDoc** | 同上 | **必须** 写为 `**配置根/stock-docs/<文件名>.md`**(与用户传入的本地路径一致;若用户传的是相对路径如 `配置根/stock-docs/xxx.md`,即用该值)。 |
44
+
42
45
 
43
46
  **正确示例(按位置抄写格式):**
47
+
44
48
  - Rule 内:`[技术方案设计](../stock-docs/技术方案设计.md)`
45
49
  - Skill 内:`[技术方案设计](../../stock-docs/技术方案设计.md)`
46
50
  - docs-index 表格单元格:`[配置根/stock-docs/技术方案设计.md](stock-docs/技术方案设计.md)`
47
51
  - frontmatter:`sourceDoc: 配置根/stock-docs/技术方案设计.md`
48
52
 
49
53
  **常见错误(禁止):**
54
+
50
55
  - **禁止** 在 Rule 内使用 `../../stock-docs/` 或 `req-docs/`(配置根下技术方案目录,非 stock-docs)—— 会 404。
51
56
  - **禁止** 在 Skill 内使用 `../stock-docs/` 或 `req-docs/`(配置根下技术方案目录,非 stock-docs)—— 会 404。
52
57
  - **禁止** 在 docs-index 内使用 `../stock-docs/` 或 `配置根/stock-docs/xxx.md` 作为链接 href —— 应仅为 `stock-docs/<文件名>.md`。
53
- - **禁止** 在链接或 sourceDoc 中混用目录:生成上下文的链出与 **sourceDoc** 仅指向 **`stock-docs/`**;勿把 **`配置根/req-docs/`** 下的技术方案当作本技能产物的链出目标。
54
- - **禁止** 在 sourceDoc 中写相对路径如 `../stock-docs/xxx.md` 或 **`配置根/req-docs/xxx.md`** —— 必须为 `配置根/stock-docs/<文件名>.md`。
58
+ - **禁止** 在链接或 sourceDoc 中混用目录:生成上下文的链出与 **sourceDoc** 仅指向 `**stock-docs/`**;勿把 `**配置根/req-docs/**` 下的技术方案当作本技能产物的链出目标。
59
+ - **禁止** 在 sourceDoc 中写相对路径如 `../stock-docs/xxx.md` 或 `**配置根/req-docs/xxx.md`** —— 必须为 `配置根/stock-docs/<文件名>.md`。
55
60
 
56
- **记忆要点**:默认文档目录为 **`配置根/stock-docs/`**(与项目约定一致);Rule 内链出用 `../stock-docs/`,Skill 内链出用 `../../stock-docs/`,docs-index 内链出用 `stock-docs/`;sourceDoc 用 `配置根/stock-docs/<文件名>.md`。生成后自检所有链接与 sourceDoc,确保层级正确、与项目约定目录一致。
61
+ **记忆要点**:默认文档目录为 `**配置根/stock-docs/`**(与项目约定一致);Rule 内链出用 `../stock-docs/`,Skill 内链出用 `../../stock-docs/`,docs-index 内链出用 `stock-docs/`;sourceDoc 用 `配置根/stock-docs/<文件名>.md`。生成后自检所有链接与 sourceDoc,确保层级正确、与项目约定目录一致。
57
62
 
58
63
  ---
59
64
 
@@ -76,6 +81,7 @@ description: 根据 stock-docs 文档生成 Rules、Skills 与文档索引;触
76
81
  **路径提醒**:写入 Rule/Skill/docs-index 时,文档链接 href 和 sourceDoc **必须**严格按「文档路径与链接约定」表执行——Rule 仅用 `../stock-docs/<文件名>.md`,Skill 仅用 `../../stock-docs/<文件名>.md`,docs-index 仅用 `stock-docs/<文件名>.md`,sourceDoc 仅用 `配置根/stock-docs/<文件名>.md`。勿凭印象写错层级。
77
82
 
78
83
  **main.mdc 与 docs-index.md 的区别**
84
+
79
85
  - **main.mdc**(`配置根/rules/main.mdc`):**项目的总概述和索引**,固定命名 **main**,**唯一** alwaysApply 的 rule。给 AI 看的「体系结构 + 模块一览 + 公共能力入口」,让 AI 大致知道项目结构,需要时再去读各模块的 rule/skill;并在正文中**强制约定**「先查 `docs-index.md` 再下钻」(见 3.0 正文第 4 点),以落实渐进式读取。
80
86
  - **docs-index.md**(`配置根/docs-index.md`):**需求/文档索引**,按文档列出的表格(文档路径、Rules、Skills、简要说明),供人与 AI 查「某文档对应哪些产物」。不参与 alwaysApply,**须由 main 正文显式要求 Agent 在定位文档↔产物时优先读取**,否则不会自动进入上下文。
81
87
 
@@ -88,9 +94,9 @@ description: 根据 stock-docs 文档生成 Rules、Skills 与文档索引;触
88
94
  2. **模块一览**(表格):列「模块名」「说明」「详细约定加载方式」。每行对应一个功能模块:说明该模块用途;加载方式写「打开项目约定的该模块路径时自动加载对应 rule;或查阅 配置根/stock-docs/xxx、配置根/skills/xxx」。
89
95
  3. **公共能力入口**(若有):接口与上下文、消息队列、配置、公共工具等入口的简短描述 + 指向对应 rule,并写实现位置(按项目约定,如 ctx 注入、MQ 辅助、配置辅助、模型、公共工具等)。
90
96
  4. **全文索引与渐进式读取(必填)**:须单独成段或小节,至少包含以下语义(可压缩措辞,不可删掉任一条):
91
- - **映射表位置**:「文档路径 ↔ Rules / Skills」的完整表在 **`配置根/docs-index.md`**(`docs-index` 非 alwaysApply,不会自动进上下文,须按需打开)。
92
- - **读取顺序**:当要根据**某份 stock-docs 文档、某需求/模块名**定位应遵循的规则或应加载的技能时,**应先读取 `docs-index.md`**,在表中找到对应行,再按 **Rules**、**Skills** 列给出的路径打开 `.mdc` / `SKILL.md`;需要长文细节时再打开 **stock-docs** 链出的源文档;仍不足再下钻**业务源码**。
93
- - **避免**:在未查 `docs-index.md`、未锁定相关 Rule/Skill 前,对工作区做**无范围**的大面积检索,或通读与当前问题**无关**的长文档。
97
+ - **映射表位置**:「文档路径 ↔ Rules / Skills」的完整表在 `**配置根/docs-index.md`**(`docs-index` 非 alwaysApply,不会自动进上下文,须按需打开)。
98
+ - **读取顺序**:当要根据**某份 stock-docs 文档、某需求/模块名**定位应遵循的规则或应加载的技能时,**应先读取 `docs-index.md`**,在表中找到对应行,再按 **Rules**、**Skills** 列给出的路径打开 `.mdc` / `SKILL.md`;需要长文细节时再打开 **stock-docs** 链出的源文档;仍不足再下钻**业务源码**。
99
+ - **避免**:在未查 `docs-index.md`、未锁定相关 Rule/Skill 前,对工作区做**无范围**的大面积检索,或通读与当前问题**无关**的长文档。
94
100
  5. 文末可再单列一行链接提示:**全文索引文件**:`配置根/docs-index.md`(与第 4 点呼应即可)。
95
101
  - **main.mdc 的更新时机**:每次执行本技能时,**可能**会更新 main.mdc,**也可能**不更新。
96
102
  - **会更新**:若本次文档属于「功能模块」或「公共模块说明」类,需在 main 的「模块一览」或「公共能力入口」中体现,则更新 main(若 main 不存在则先创建;若已存在则只更新与本次文档相关的部分,不删已有且无关的模块行)。
@@ -98,11 +104,14 @@ description: 根据 stock-docs 文档生成 Rules、Skills 与文档索引;触
98
104
 
99
105
  ### 3.1 Rules(专题规则,一律非 alwaysApply)
100
106
 
101
- - **路径**:`配置根/rules/<主题>-context.mdc`(或拆解后的多条,如 common-interface-ctx.mdc)
102
- - **格式**:
107
+ - **路径**:`配置根/rules/<主题>-ctx.mdc`(或拆解后的多条,如 common-interface-ctx.mdc)
108
+ - **按配置根区分(必守)**:
109
+ - `**.cursor/`(Cursor)**:规则文件扩展名 `**.mdc`**;路径范围用 `**globs:**`;专题规则 `**alwaysApply: false**`;总览 `**main.mdc**` 唯一 `**alwaysApply: true**`。
110
+ - `**.claude/`(Claude Code)**:规则须为 `**.md`**(Claude Code 不加载 `.mdc`);路径范围用 `**paths:**`,**不要**写 `**globs:`**;**不要**写 `**alwaysApply`**(无 `paths` 的规则与会话一并加载)。若项目同时存在 `.cursor/` 与 `.claude/`,生成或更新 `**.claude/rules/**` 时须按上表写 `**.md**` + `**paths:**`。`flow2spec init claude` 已对包内模板做自动转换,手工新增规则时请对齐官方文档。
111
+ - **格式**(以 **Cursor `.mdc`** 为默认表述;**Claude** 将 `globs`→`paths`、扩展名 `.md` 即可):
103
112
  - frontmatter:`description: <一句话说明本规则>`,**禁止** `alwaysApply: true`(唯一 alwaysApply 为 main.mdc)
104
- - **globs(必填)**:按主题限定在相关路径,例如功能模块 → `globs: "**/functions/<模块名>/**"`;接口与 ctx → `globs: "**/functions/**/*.js"`;消息队列消费 → `globs: "**/qmq/**/*.js"` 或项目约定的 MQ 消费目录;公共工具 → `globs: "**/utils/common.js"` 或项目约定的工具路径。
105
- - `alwaysApply: false`
113
+ - **globs(必填,仅 Cursor)**:按主题限定在相关路径,例如功能模块 → `globs: "**/functions/<模块名>/**"`;接口与 ctx → `globs: "**/functions/**/*.js"`;消息队列消费 → `globs: "**/qmq/**/*.js"` 或项目约定的 MQ 消费目录;公共工具 → `globs: "**/utils/common.js"` 或项目约定的工具路径。**Claude Code 下改为 `paths:`,键名同列表写法。**
114
+ - `alwaysApply: false`(仅 Cursor;Claude 专题规则不写此项)
106
115
  - **版本管理(必填)**:`sourceDoc: <本次命令入参,即 配置根/stock-docs/xxx.md>`,`generatedAt: "<当前时间东八区北京时间,ISO 8601 如 2026-01-28T20:00:00+08:00>"`
107
116
  - 正文:提炼的**核心概念、关键流程、规则要点**(Markdown,简洁可读)+ **文档链接**(链接 href 必须为 `../stock-docs/<文件名>.md`,见「文档路径与链接约定」)
108
117
  - **与 main.mdc 的联动**:仅当本次**会更新** main.mdc 时(见 3.0「main.mdc 的更新时机」):若本次是功能模块,生成/更新该 rule 后**必须**在 main 的「模块一览」中增加或更新该模块行;若本次是公共模块说明,在 main 的「公共能力入口」中体现即可。若本次**不更新** main,则不改 main.mdc。
@@ -119,18 +128,16 @@ description: 根据 stock-docs 文档生成 Rules、Skills 与文档索引;触
119
128
 
120
129
  - **路径**:`配置根/docs-index.md`
121
130
  - **操作**:若文件不存在,先创建表头:
122
-
123
131
  ```markdown
124
132
  # 需求/文档索引
125
133
 
126
134
  | 需求/模块 | 文档路径 | Rules | Skills | 简要说明 |
127
135
  | --------- | -------- | ----- | ------ | -------- |
128
136
  ```
129
-
130
137
  然后**追加一行**,且**必须填写 Rules、Skills 列**:
131
138
  - **Rules**:本次生成的 Rule 路径,多个用顿号或空格分隔,如 `配置根/rules/<主题>-context.mdc` 或 `配置根/rules/common-interface-ctx.mdc`。注意:main.mdc 不在此列逐文档列出(main 为总索引,与单文档非一对一)。
132
139
  - **Skills**:本次生成的 Skill 路径,多个用顿号或空格分隔,如 `配置根/skills/<主题>-context/SKILL.md` 或 `配置根/skills/common-modules-context/SKILL.md`、`配置根/skills/common-modules-mq-usage/SKILL.md`。
133
- - **文档路径与链接(必守)**:文档路径列显示 `配置根/stock-docs/<文件名>.md`;链接 **必须** 为 `[配置根/stock-docs/<文件名>.md](stock-docs/<文件名>.md)`,即 href 只能是 **`stock-docs/<文件名>.md`**(见上文「文档路径与链接约定」)。勿写成 `../stock-docs/` 或误指 **`req-docs/`**。
140
+ - **文档路径与链接(必守)**:文档路径列显示 `配置根/stock-docs/<文件名>.md`;链接 **必须** 为 `[配置根/stock-docs/<文件名>.md](stock-docs/<文件名>.md)`,即 href 只能是 `**stock-docs/<文件名>.md`**(见上文「文档路径与链接约定」)。勿写成 `../stock-docs/` 或误指 `**req-docs/**`。
134
141
  - 行示例:`| <文档标题> | [配置根/stock-docs/<文件名>.md](stock-docs/<文件名>.md) | <Rules 路径> | <Skills 路径> | <一两句摘要> |`
135
142
  - 若文件已存在且表头无 Rules、Skills 列,则先补全表头再追加;追加时仍须填写 Rules、Skills 列。
136
143
  - **同一文档只占一行**:若该文档路径(或文档标题)在表中已有行,则**更新该行**(覆盖 Rules、Skills、简要说明),不要追加新行,便于日后「修改文档后重新生成」时索引保持一对一。
@@ -158,7 +165,7 @@ description: 根据 stock-docs 文档生成 Rules、Skills 与文档索引;触
158
165
  - 接口与 ctx 约定 → `globs: "**/functions/**/*.js"`
159
166
  - 消息队列约定 → `globs: "**/qmq/**/*.js"` 或项目约定的 MQ 消费目录
160
167
  - 公共工具约定 → `globs: "**/utils/common.js"` 或项目约定路径
161
- - 每条 rule 的 frontmatter 中 **且必须含** `sourceDoc`、`generatedAt`(同上),正文写该主题的**核心概念、关键流程、规则要点**,可带简短示例;单条建议 &lt;50 行。生成功能模块 rule 后必须在 main.mdc 的「模块一览」中追加/更新对应行。
168
+ - 每条 rule 的 frontmatter 中 **且必须含** `sourceDoc`、`generatedAt`(同上),正文写该主题的**核心概念、关键流程、规则要点**,可带简短示例;单条建议 <50 行。生成功能模块 rule 后必须在 main.mdc 的「模块一览」中追加/更新对应行。
162
169
 
163
170
  **Skills 拆分建议:**
164
171
 
@@ -177,20 +184,21 @@ description: 根据 stock-docs 文档生成 Rules、Skills 与文档索引;触
177
184
 
178
185
  ## 步骤 4:若输入是 URL,保存原文到项目
179
186
 
180
- 若用户提供的是 **URL**,请将你拉取到的**原始正文**保存到项目内 **`配置根/stock-docs/<主题>.md`**(或项目约定的文档目录),以便后续引用。主题名可从文档标题或 URL 路径推断,并做合法文件名处理。
187
+ 若用户提供的是 **URL**,请将你拉取到的**原始正文**保存到项目内 `**配置根/stock-docs/<主题>.md`**(或项目约定的文档目录),以便后续引用。主题名可从文档标题或 URL 路径推断,并做合法文件名处理。
181
188
 
182
189
  ---
183
190
 
184
191
  ## 约束与注意
185
192
 
186
193
  - 所有路径均相对于**配置根的父目录**。
187
- - **文档路径与链接(必守)**:一律按上文「文档路径与链接约定」执行。Rule 内链到文档 **仅允许** `../stock-docs/<文件名>.md`;Skill 内链到文档 **仅允许** `../../stock-docs/<文件名>.md`;docs-index 内链到文档 **仅允许** `stock-docs/<文件名>.md`。sourceDoc 仅允许 `配置根/stock-docs/<文件名>.md`。勿将 **`配置根/req-docs/`** 下的技术方案当作本技能产物的链出目标(链出**仅**指向 **stock-docs**)。
194
+ - **文档路径与链接(必守)**:一律按上文「文档路径与链接约定」执行。Rule 内链到文档 **仅允许** `../stock-docs/<文件名>.md`;Skill 内链到文档 **仅允许** `../../stock-docs/<文件名>.md`;docs-index 内链到文档 **仅允许** `stock-docs/<文件名>.md`。sourceDoc 仅允许 `配置根/stock-docs/<文件名>.md`。勿将 `**配置根/req-docs/`** 下的技术方案当作本技能产物的链出目标(链出**仅**指向 **stock-docs**)。
188
195
  - **版本管理**:每条 Rule 与每条 Skill 的 frontmatter 必须含 `sourceDoc`(`配置根/stock-docs/xxx.md`)、`generatedAt`(东八区北京时间 ISO 8601 +08:00),便于更新时索源与重新生成。
189
196
  - 生成前可先确认 `配置根/rules`、`配置根/skills`、`配置根/stock-docs` 目录存在,不存在则创建。
190
197
  - **完成后自检(路径必查)**:
191
- 1. 每个 `.mdc` 中指向源文档的链接 href 是否为 **`../stock-docs/<文件名>.md`**(不是 `../../stock-docs/` 或误链到 `req-docs/`)。
192
- 2. 每个 `配置根/skills/**/SKILL.md` 中指向源文档的链接 href 是否为 **`../../stock-docs/<文件名>.md`**(不是 `../stock-docs/` 或误链到 `req-docs/`)。
193
- 3. `docs-index.md` 中该文档行的链接 href 是否为 **`stock-docs/<文件名>.md`**(不是 `../stock-docs/` 或裸路径)。
194
- 4. 所有 Rule/Skill 的 frontmatter 中 `sourceDoc` 是否为 **`配置根/stock-docs/<文件名>.md`**。
195
- 5. 链接目标与项目约定的文档目录一致(若约定为 `配置根/stock-docs/`,则勿用 **`配置根/req-docs/`** 作为链接目标)。
198
+ 1. 每个 `.mdc` 中指向源文档的链接 href 是否为 `**../stock-docs/<文件名>.md`**(不是 `../../stock-docs/` 或误链到 `req-docs/`)。
199
+ 2. 每个 `配置根/skills/**/SKILL.md` 中指向源文档的链接 href 是否为 `**../../stock-docs/<文件名>.md**`(不是 `../stock-docs/` 或误链到 `req-docs/`)。
200
+ 3. `docs-index.md` 中该文档行的链接 href 是否为 `**stock-docs/<文件名>.md**`(不是 `../stock-docs/` 或裸路径)。
201
+ 4. 所有 Rule/Skill 的 frontmatter 中 `sourceDoc` 是否为 `**配置根/stock-docs/<文件名>.md**`。
202
+ 5. 链接目标与项目约定的文档目录一致(若约定为 `配置根/stock-docs/`,则勿用 `**配置根/req-docs/**` 作为链接目标)。
196
203
  完成后用一句话总结:已生成 Rules、Skills、文档索引及(若适用)配置根/stock-docs 下的原文备份;并确认「文档路径与链接约定」已遵守。
204
+