@xulthekl/team-flow 0.54.0 → 0.56.0

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.
Files changed (63) hide show
  1. package/.claude/always/phase-guard.md +1 -1
  2. package/.claude-plugin/marketplace.json +1 -1
  3. package/.claude-plugin/plugin.json +1 -1
  4. package/.codex-plugin/plugin.json +1 -1
  5. package/.cursor-plugin/marketplace.json +1 -1
  6. package/.cursor-plugin/plugin.json +1 -1
  7. package/.github/plugin/marketplace.json +2 -2
  8. package/AGENTS.md +2 -2
  9. package/CHANGELOG.md +92 -1
  10. package/GEMINI.md +1 -1
  11. package/INSTALL.md +1 -1
  12. package/README.md +1 -1
  13. package/agents/prototype-env-scout.md +4 -4
  14. package/dist/parsing/requirement-blocks.d.ts +26 -0
  15. package/dist/parsing/requirement-blocks.js +33 -5
  16. package/dist/validation/validator.js +8 -1
  17. package/docs/README_en.md +1 -1
  18. package/gemini-extension.json +1 -1
  19. package/hooks/session-start +19 -2
  20. package/llms.txt +1 -1
  21. package/package.json +1 -1
  22. package/plugin.json +1 -1
  23. package/scripts/check-project-config.mjs +84 -0
  24. package/scripts/design-system-clone.mjs +150 -0
  25. package/scripts/design-system-import.mjs +102 -14
  26. package/scripts/gen-primer.mjs +65 -13
  27. package/scripts/guard/checks/tasks-complete.mjs +9 -4
  28. package/scripts/guard/design-token-guard.mjs +136 -117
  29. package/scripts/infer-workflow.mjs +10 -1
  30. package/scripts/lib/arch-merge.mjs +20 -6
  31. package/scripts/lib/arch-parse.mjs +5 -11
  32. package/scripts/lib/ds-inputs.mjs +125 -0
  33. package/scripts/lib/ds-parse.mjs +124 -12
  34. package/scripts/lib/execution-recommendation.mjs +10 -1
  35. package/scripts/lib/glaf4-delegation.mjs +14 -3
  36. package/scripts/lib/hash.mjs +18 -2
  37. package/scripts/lib/md-normalize.mjs +108 -0
  38. package/scripts/lib/prototype-sync.mjs +19 -1
  39. package/scripts/lib/sdd-overlay.mjs +17 -6
  40. package/scripts/lib/slug.mjs +68 -0
  41. package/scripts/lib/solutions-capture.mjs +6 -12
  42. package/scripts/lib/solutions-index-gen.mjs +2 -2
  43. package/scripts/lib/solutions-phases.mjs +32 -0
  44. package/scripts/lib/solutions-promote.mjs +16 -5
  45. package/scripts/lib/spec-merge.mjs +46 -11
  46. package/scripts/lib/state-loader.mjs +4 -1
  47. package/scripts/lib/test-merge.mjs +4 -1
  48. package/scripts/token-extract.mjs +101 -9
  49. package/skills/ce-compound/references/three-tier-index.md +6 -2
  50. package/skills/design-system/SKILL.md +46 -23
  51. package/skills/design-system/references/agents/design-system-architect.md +25 -12
  52. package/skills/design-system/references/creation-flow.md +17 -0
  53. package/skills/design-system/references/creation-modes.md +171 -0
  54. package/skills/design-system/references/showcase-board-b-end.md +50 -36
  55. package/skills/design-system/references/showcase-board-c-end.md +59 -36
  56. package/skills/design-system/references/variant-schema.md +21 -1
  57. package/skills/prototype/SKILL.md +4 -0
  58. package/skills/prototype/references/builder-methodology.md +11 -4
  59. package/skills/prototype/references/layouts.md +10 -0
  60. package/skills/prototype/references/orchestration-flow.md +8 -0
  61. package/skills/workflow-bootstrap/SKILL.md +15 -5
  62. package/src/parsing/requirement-blocks.ts +34 -5
  63. package/src/validation/validator.ts +8 -1
@@ -33,6 +33,14 @@
33
33
 
34
34
  环境简报显示设计系统缺失/不完整时:
35
35
  1. 主代理调用 `/team-flow:design-system` skill(独立入口,用户主导交互创建)。
36
+ > **传达范围(v0.55.0)**:只传 **① 环境简报里与"起点"相关的资产事实**,**不预选起点**——
37
+ > design-system 的 Step 0 会**无条件展示全部 7 条**(移植 / 模板库 / `--profile antd` / 文档导入 / 代码逆向 / 从零 / iterate)。
38
+ > 本侧无从判断用户手上有什么资产,**预选会让其余 6 条不可见**(能力存在但用户不知道 = 能力不存在)。
39
+ >
40
+ > 可传达的资产事实(由 scout 简报得出,**仅作提示、不代替用户选择**):
41
+ > 简报含"已有符合规范的原型代码"→ 提示 `create-from-code` 可用;
42
+ > 需求方提到"有既有 UI 规范文档/规范树"→ 提示 `create-from-docs` 可用;
43
+ > 需求方提到"公司另一个后台项目已建过设计系统"→ 提示 clone 可用。
36
44
  2. design-system skill 内部执行:需求收集(≤5 个预填推荐问题)→ 确定性 token 派生 → 草稿生成(base.md + 变体)→ 预览生成(preview.html)→ 用户评审确认 → 落盘 `.team-flow/design-system/` + guard 校验。
37
45
  3. 创建完成后回 ① 补齐环境简报。
38
46
 
@@ -218,16 +218,26 @@ Step 2: 确定性提取(兜底)
218
218
 
219
219
  **不做的事**:不写 SOP 流程(由 skill 负责)、不写变更级状态机(由 workflow skill 负责)、不列可自动发现的文件清单。
220
220
 
221
- ### B4.6: Design System 起点选择(advisory,v0.54.0 新增)
221
+ ### B4.6: Design System 起点选择(advisory,v0.54.0 新增;v0.55.0 扩为六项)
222
222
 
223
223
  > 编号说明:B4.5 已被占用(CLAUDE.md 初始化),本步骤为 B4.6。
224
224
 
225
- `.team-flow/design-system/` 不存在时,AskUserQuestion 呈现起点四选一(**不阻断**,延续 advisory 约定):
225
+ `.team-flow/design-system/` 不存在时,AskUserQuestion 呈现**起点六选一 + 跳过**(**不阻断**,延续 advisory 约定):
226
226
 
227
- > 「检测到项目尚无设计系统。选择起点方式:[从模板库选择 | 逆向建库 | 从零创建 | 跳过]」
227
+ > 「检测到项目尚无设计系统。选择起点方式:[移植已有设计系统 | 从模板库选择 | 通用起点(Ant Design 规格) | 从文档规范导入 | 从代码逆向建库 | 从零创建 | 跳过]」
228
228
 
229
- - **模板库**:调 `/team-flow:design-system`(起点=模板库)——由该 skill 呈现 `${CLAUDE_PLUGIN_ROOT}/templates/design-systems/registry.json`(8 个参考设计系统),选定后执行导入并**续跑 Step 5 评审 → Step 6 落盘**(含 primer 生成 + guard 校验)。**本步骤不直接调转换器**:转换器只产 base.md,缺少 primer 会让后续 prototype Step 0 对 `contract: v1` 系统直接 blocked(v0.54.0 P4 实证死路)
230
- - **逆向建库 / 从零创建**:调 `/team-flow:design-system`(create-from-code / 交互式 6 步)
229
+ **六项全部展示,每项带适用场景一句话**——能力存在但用户不知道 = 能力不存在(v0.55.0 D-23);按**资产就绪度降序**排列(从最厚的已有资产到最薄的空白起点):
230
+
231
+ | # | 起点 | 适用场景(对用户的一句话) | 委托给 design-system 时的参数 |
232
+ |---|------|---------------------------|------------------------------|
233
+ | 1 | **移植已有设计系统** | "你们公司**另一个后台项目**已经建过设计系统 → 直接复制过来改" | `clone --from <源路径>` |
234
+ | 2 | **从模板库选择** | "想参考某个成熟产品(Linear / Stripe / Vercel…)的视觉风格" | 起点=模板库(呈现 `${CLAUDE_PLUGIN_ROOT}/templates/design-systems/registry.json` 的 8 个参考) |
235
+ | 3 | **通用起点(Ant Design 规格)** | "全新项目、**没有任何规范**,先要一套像 Ant Design 的合规底座" | `--profile antd`(零 LLM) |
236
+ | 4 | **从文档规范导入** | "手里有**一套写好的 UI 规范**(Markdown / 规范树)" | `create-from-docs` |
237
+ | 5 | **从代码逆向建库** | "项目里**已有符合规范的原型代码**" | `create-from-code` |
238
+ | 6 | **从零创建** | "什么都没有,边聊边定" | 交互式 6 步 |
239
+
240
+ - **本步骤不直接调转换器**:六项**全部委托 `/team-flow:design-system`**,且必须**续跑 Step 5 评审 → Step 6 落盘**(含 primer 生成 + guard 校验)——转换器只产 base.md,缺少 primer 会让后续 prototype Step 0 对 `contract: v1` 系统直接 blocked(v0.54.0 P4 实证死路)
231
241
  - **跳过** → 继续 B5;**已存在** → 跳过
232
242
 
233
243
  ### B5: Path Decision(路径判断,v0.42.0 重构:降级路径设计)
@@ -12,11 +12,40 @@ export interface RequirementsSectionParts {
12
12
  after: string;
13
13
  }
14
14
 
15
+ /**
16
+ * 行内强调剥离 + 去反引号(v0.55.0 §8.4.3 横展;与 `scripts/lib/md-normalize.mjs` 同约定)。
17
+ *
18
+ * **根因**:解析层对最常见的 Markdown 强调语法脆弱且**失败静默**——手写
19
+ * `### **Requirement**: X` 或 `` ### `Requirement`: X `` 会让需求块整块漏解析,
20
+ * 而这条路径在 `tf sync`(→ `spec-merge` → 本模块)上是**活路径**,且
21
+ * `guard/checks/specs-merged` 会在 delta spec 存在时硬阻断 `executing → closing`。
22
+ * JS 侧已修(`md-normalize.mjs`),本函数是 TS 侧的对应实现(D-16「全修」)。
23
+ *
24
+ * **只剥双符号对**(`**` / `__`):单 `*` 可能是列表符、单 `_` 可能是 snake_case
25
+ * 标识符——剥它们是"改语义"而非"容格式"。
26
+ */
27
+ export function stripInlineEmphasis(text: string): string {
28
+ return text.replace(/`/g, '').replace(/\*\*(.+?)\*\*/g, '$1').replace(/__(.+?)__/g, '$1');
29
+ }
30
+
31
+ /** 归一化需求名:剥行内强调/反引号(名称本身被包裹时)+ trim。 */
15
32
  export function normalizeRequirementName(name: string): string {
16
- return name.trim();
33
+ return stripInlineEmphasis(name).trim();
17
34
  }
18
35
 
19
- export const REQUIREMENT_HEADER_REGEX = /^###\s*Requirement:\s*(.+)\s*$/i;
36
+ /**
37
+ * 需求块标题:`### Requirement: <name>`。
38
+ *
39
+ * v0.55.0 容忍:`Requirement` 键被加粗/反引号包裹(`**Requirement**` /
40
+ * `` `Requirement` `` / `` **`Requirement`** ``——**两种符号可任意交错、任意顺序**,
41
+ * 故用字符类而非固定序列)、全角冒号、冒号前后空格。
42
+ * 名称内的标记由 {@link normalizeRequirementName} 归一。
43
+ *
44
+ * 注:单 `*` 包裹(`*Requirement*`)也在容错内——键名两侧的星号无论一个两个
45
+ * 都是强调写法,剥它不改变语义。**需求名内部**的单符号才是语义边界,
46
+ * 由 `stripInlineEmphasis` 只剥成对双符号来保证。
47
+ */
48
+ export const REQUIREMENT_HEADER_REGEX = /^###\s*[`*]{0,4}\s*Requirement\s*[`*]{0,4}\s*[::]\s*(.+?)\s*$/i;
20
49
 
21
50
  function normalizeLineEndings(content: string): string {
22
51
  return content.replace(/\r\n?/g, '\n');
@@ -183,7 +212,7 @@ function parseRemovedNames(sectionBody: string): string[] {
183
212
  names.push(normalizeRequirementName(m[1]));
184
213
  continue;
185
214
  }
186
- const bullet = line.match(/^\s*-\s*`?###\s*Requirement:\s*(.+?)`?\s*$/);
215
+ const bullet = line.match(/^\s*-\s*`?###\s*[`*]{0,4}\s*Requirement\s*[`*]{0,4}\s*[::]\s*(.+?)\s*$/i);
187
216
  if (bullet) {
188
217
  names.push(normalizeRequirementName(bullet[1]));
189
218
  }
@@ -200,10 +229,10 @@ function parseRenamedPairs(
200
229
  let current: { from?: string; to?: string } = {};
201
230
  for (const line of lines) {
202
231
  const fromMatch = line.match(
203
- /^\s*-?\s*FROM:\s*`?###\s*Requirement:\s*(.+?)`?\s*$/
232
+ /^\s*-?\s*FROM\s*[::]\s*`?###\s*[`*]{0,4}\s*Requirement\s*[`*]{0,4}\s*[::]\s*(.+?)\s*$/i
204
233
  );
205
234
  const toMatch = line.match(
206
- /^\s*-?\s*TO:\s*`?###\s*Requirement:\s*(.+?)`?\s*$/
235
+ /^\s*-?\s*TO\s*[::]\s*`?###\s*[`*]{0,4}\s*Requirement\s*[`*]{0,4}\s*[::]\s*(.+?)\s*$/i
207
236
  );
208
237
  if (fromMatch) {
209
238
  current.from = normalizeRequirementName(fromMatch[1]);
@@ -16,7 +16,14 @@ import {
16
16
  extractRequirementsSection,
17
17
  } from '../parsing/requirement-blocks.js';
18
18
 
19
- const REQUIREMENT_HEADER_REGEX = /^###\s*Requirement:\s*(.+)\s*$/i;
19
+ // v0.55.0 §8.4.3(D-16「全修」横展):本文件原有第二份 `REQUIREMENT_HEADER_REGEX`
20
+ // 定义(`/^###\s*Requirement:\s*(.+)\s*$/i`)——**定义后从未使用**(本文件的需求头
21
+ // 解析全部经 `parseDeltaSpec` / `extractRequirementsSection` 走解析层),属"同一契约
22
+ // 两处定义"的维护陷阱:改解析层正则时无人知道这里还有一份。已删除,需求头正则的
23
+ // 唯一真相源是 `parsing/requirement-blocks.ts`。
24
+ //
25
+ // ⚠️ 不要再在本文件内定义需求头/场景头以外格式约定的正则——场景头(下方)是
26
+ // 本文件唯一自有的格式契约,其余一律从解析层引入。
20
27
  const SCENARIO_HEADER_REGEX = /^####\s+Scenario:/i;
21
28
 
22
29
  function normalizeLineEndings(content: string): string {