@michaelxwb/code-flow 0.5.1

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 (99) hide show
  1. package/README.md +157 -0
  2. package/package.json +16 -0
  3. package/src/adapters/claude/CLAUDE.md +51 -0
  4. package/src/adapters/claude/commands/cf-init.md +262 -0
  5. package/src/adapters/claude/commands/cf-inject.md +55 -0
  6. package/src/adapters/claude/commands/cf-learn.md +291 -0
  7. package/src/adapters/claude/commands/cf-stats.md +86 -0
  8. package/src/adapters/claude/commands/cf-task/align.md +283 -0
  9. package/src/adapters/claude/commands/cf-task/archive.md +131 -0
  10. package/src/adapters/claude/commands/cf-task/block.md +30 -0
  11. package/src/adapters/claude/commands/cf-task/graph.md +73 -0
  12. package/src/adapters/claude/commands/cf-task/note.md +239 -0
  13. package/src/adapters/claude/commands/cf-task/plan.md +270 -0
  14. package/src/adapters/claude/commands/cf-task/prd.md +138 -0
  15. package/src/adapters/claude/commands/cf-task/start.md +173 -0
  16. package/src/adapters/claude/commands/cf-task/status.md +59 -0
  17. package/src/adapters/claude/commands/cf-validate.md +73 -0
  18. package/src/adapters/claude/settings.local.json +60 -0
  19. package/src/adapters/codex/AGENTS.md +51 -0
  20. package/src/adapters/codex/config.toml +3 -0
  21. package/src/adapters/codex/hooks.json +48 -0
  22. package/src/adapters/codex/skills/cf-init/SKILL.md +271 -0
  23. package/src/adapters/codex/skills/cf-inject/SKILL.md +56 -0
  24. package/src/adapters/codex/skills/cf-learn/SKILL.md +296 -0
  25. package/src/adapters/codex/skills/cf-stats/SKILL.md +87 -0
  26. package/src/adapters/codex/skills/cf-task-align/SKILL.md +284 -0
  27. package/src/adapters/codex/skills/cf-task-archive/SKILL.md +132 -0
  28. package/src/adapters/codex/skills/cf-task-block/SKILL.md +31 -0
  29. package/src/adapters/codex/skills/cf-task-graph/SKILL.md +74 -0
  30. package/src/adapters/codex/skills/cf-task-note/SKILL.md +236 -0
  31. package/src/adapters/codex/skills/cf-task-plan/SKILL.md +271 -0
  32. package/src/adapters/codex/skills/cf-task-prd/SKILL.md +139 -0
  33. package/src/adapters/codex/skills/cf-task-start/SKILL.md +174 -0
  34. package/src/adapters/codex/skills/cf-task-status/SKILL.md +60 -0
  35. package/src/adapters/codex/skills/cf-validate/SKILL.md +74 -0
  36. package/src/adapters/costrict/CLAUDE.md +51 -0
  37. package/src/adapters/costrict/commands/cf-init.md +262 -0
  38. package/src/adapters/costrict/commands/cf-inject.md +55 -0
  39. package/src/adapters/costrict/commands/cf-learn.md +291 -0
  40. package/src/adapters/costrict/commands/cf-stats.md +86 -0
  41. package/src/adapters/costrict/commands/cf-task/align.md +283 -0
  42. package/src/adapters/costrict/commands/cf-task/archive.md +131 -0
  43. package/src/adapters/costrict/commands/cf-task/block.md +30 -0
  44. package/src/adapters/costrict/commands/cf-task/graph.md +73 -0
  45. package/src/adapters/costrict/commands/cf-task/note.md +239 -0
  46. package/src/adapters/costrict/commands/cf-task/plan.md +270 -0
  47. package/src/adapters/costrict/commands/cf-task/prd.md +138 -0
  48. package/src/adapters/costrict/commands/cf-task/start.md +173 -0
  49. package/src/adapters/costrict/commands/cf-task/status.md +59 -0
  50. package/src/adapters/costrict/commands/cf-validate.md +73 -0
  51. package/src/adapters/costrict/settings.local.json +60 -0
  52. package/src/adapters/opencode/AGENTS.md +51 -0
  53. package/src/adapters/opencode/commands/cf-init.md +275 -0
  54. package/src/adapters/opencode/commands/cf-inject.md +59 -0
  55. package/src/adapters/opencode/commands/cf-learn.md +295 -0
  56. package/src/adapters/opencode/commands/cf-stats.md +90 -0
  57. package/src/adapters/opencode/commands/cf-task/align.md +287 -0
  58. package/src/adapters/opencode/commands/cf-task/archive.md +135 -0
  59. package/src/adapters/opencode/commands/cf-task/block.md +34 -0
  60. package/src/adapters/opencode/commands/cf-task/graph.md +77 -0
  61. package/src/adapters/opencode/commands/cf-task/note.md +243 -0
  62. package/src/adapters/opencode/commands/cf-task/plan.md +274 -0
  63. package/src/adapters/opencode/commands/cf-task/prd.md +142 -0
  64. package/src/adapters/opencode/commands/cf-task/start.md +177 -0
  65. package/src/adapters/opencode/commands/cf-task/status.md +63 -0
  66. package/src/adapters/opencode/commands/cf-validate.md +77 -0
  67. package/src/adapters/opencode/opencode.json +4 -0
  68. package/src/adapters/opencode/plugins/code-flow/index.js +132 -0
  69. package/src/adapters/opencode/plugins/code-flow/package.json +6 -0
  70. package/src/cli.js +810 -0
  71. package/src/core/code-flow/config.yml +159 -0
  72. package/src/core/code-flow/scripts/cf_checks.py +306 -0
  73. package/src/core/code-flow/scripts/cf_core.py +954 -0
  74. package/src/core/code-flow/scripts/cf_feedback.py +56 -0
  75. package/src/core/code-flow/scripts/cf_inject_hook.py +178 -0
  76. package/src/core/code-flow/scripts/cf_log.py +146 -0
  77. package/src/core/code-flow/scripts/cf_post_hook.py +196 -0
  78. package/src/core/code-flow/scripts/cf_scan.py +293 -0
  79. package/src/core/code-flow/scripts/cf_session_hook.py +42 -0
  80. package/src/core/code-flow/scripts/cf_stats.py +439 -0
  81. package/src/core/code-flow/scripts/cf_stop_hook.py +191 -0
  82. package/src/core/code-flow/scripts/cf_user_prompt_hook.py +402 -0
  83. package/src/core/code-flow/specs/backend/_map.md +56 -0
  84. package/src/core/code-flow/specs/backend/code-quality-performance.md +47 -0
  85. package/src/core/code-flow/specs/backend/database.md +39 -0
  86. package/src/core/code-flow/specs/backend/directory-structure.md +42 -0
  87. package/src/core/code-flow/specs/backend/logging.md +38 -0
  88. package/src/core/code-flow/specs/backend/platform-rules.md +43 -0
  89. package/src/core/code-flow/specs/frontend/_map.md +52 -0
  90. package/src/core/code-flow/specs/frontend/component-specs.md +56 -0
  91. package/src/core/code-flow/specs/frontend/directory-structure.md +41 -0
  92. package/src/core/code-flow/specs/frontend/quality-standards.md +46 -0
  93. package/src/core/code-flow/specs/shared/_map.md +57 -0
  94. package/src/core/code-flow/specs/shared/design/design-frontend.md +247 -0
  95. package/src/core/code-flow/specs/shared/design/design-full.md +494 -0
  96. package/src/core/code-flow/specs/shared/design/design-lite.md +293 -0
  97. package/src/core/code-flow/specs/shared/prd-template.md +187 -0
  98. package/src/core/code-flow/tasks/.gitkeep +0 -0
  99. package/src/core/code-flow/validation.yml +48 -0
@@ -0,0 +1,52 @@
1
+ # Frontend Retrieval Map
2
+
3
+ > AI 导航地图:定位前端代码结构和关键模块。可由 `/cf-learn --map` 重生成,建议按真实项目手动校准。
4
+
5
+ ## Purpose
6
+
7
+ 前端单页 / 多页应用,负责用户交互、页面渲染与 API 调用。默认假设为基于组件的 SPA。
8
+
9
+ ## Architecture
10
+
11
+ - Framework: 任意主流框架(React / Vue / Svelte / Solid 等)
12
+ - Language: TypeScript(推荐)或 JavaScript + JSDoc
13
+ - State: 局部状态优先,跨组件共享走集中式(Redux / Zustand / Pinia)
14
+ - Routing: 框架官方路由(React Router / Vue Router / 文件路由)
15
+ - Styling: 原子化(Tailwind)或模块化(CSS Modules / styled-components)
16
+ - Build: Vite / Webpack / Next.js 等
17
+
18
+ ## Key Files
19
+
20
+ | File | Purpose |
21
+ |------|---------|
22
+ | `src/main.*` | 应用入口,挂载 Root |
23
+ | `src/App.*` | 根组件,注册路由与全局 Provider |
24
+ | `src/router.*` | 路由定义 |
25
+ | `src/services/` | API 调用封装 |
26
+
27
+ ## Module Map
28
+
29
+ ```
30
+ src/
31
+ ├── components/ # 通用 UI 组件,无业务依赖
32
+ ├── pages/ # 页面级组件(路由叶子)
33
+ ├── hooks/ # 业务复用逻辑(React)/ composables(Vue)
34
+ ├── stores/ # 状态管理
35
+ ├── services/ # API 调用层
36
+ ├── utils/ # 纯函数工具
37
+ ├── types/ # 类型定义
38
+ └── styles/ # 全局样式 / 主题
39
+ ```
40
+
41
+ ## Data Flow
42
+
43
+ ```
44
+ User Action → Event Handler → Service(API) → Store/State → Re-render
45
+ ```
46
+
47
+ ## Navigation Guide
48
+
49
+ - 新增页面 → `pages/` 添加组件 + 路由配置
50
+ - 新增组件 → `components/` 按业务域分子目录,复用优先
51
+ - API 调用 → 统一走 `services/`,不在组件内裸 fetch
52
+ - 状态管理 → 跨组件状态走 `stores/`,组件通过 hook / composable 消费
@@ -0,0 +1,56 @@
1
+ ---
2
+ description: 写/改组件时适用:props、hooks、渲染、UI 样式约束
3
+ ---
4
+
5
+ # Component Specs
6
+
7
+ ## Examples
8
+
9
+ ✅ 稳定唯一 key + 改值经回调上抛
10
+
11
+ ```tsx
12
+ {items.map((it) => <Row key={it.id} item={it} onChange={onChange} />)}
13
+ ```
14
+
15
+ ❌ 用数组 index 作 key + 组件内直接改 props
16
+
17
+ ```tsx
18
+ {items.map((it, i) => { it.value = next; return <Row key={i} item={it} />; })}
19
+ ```
20
+
21
+ ✅ 容器/展示分离 + 样式走 token,展示组件不碰数据获取
22
+
23
+ ```tsx
24
+ // 展示组件:纯 props 驱动,样式用 class/token,无请求
25
+ const OrderRow = ({ order, onSelect }: Props) =>
26
+ <div className={styles.row} onClick={() => onSelect(order.id)}>{order.title}</div>;
27
+ ```
28
+
29
+ ❌ 展示组件内自取数据 + 内联魔法样式
30
+
31
+ ```tsx
32
+ const OrderRow = ({ id }) => {
33
+ const [o, setO] = useState(); useEffect(() => { fetch(`/orders/${id}`)... }, []);
34
+ return <div style={{ margin: 13, color: '#3a7' }}>{o?.title}</div>;
35
+ };
36
+ ```
37
+
38
+ ## Rules
39
+ - Props 必须类型化(TS interface / PropTypes / defineProps),可选项给默认值
40
+ - 组件文件名与导出组件名一致,使用 PascalCase
41
+ - 单组件文件 ≤ 300 行,超出拆成子组件或提取 hook
42
+ - 组件内禁止直接修改 props,需改值通过事件 / 回调上抛
43
+ - **样式与逻辑/数据分离**:样式走 CSS Modules / 原子类 / 设计 token,不与数据获取或业务逻辑混在同一处;展示组件不发起请求
44
+
45
+ ## Patterns
46
+ - 拆分容器组件(数据获取 / 状态)与展示组件(纯 UI),便于测试和复用
47
+ - 复用逻辑提取为 hook(`useXxx`)/ composable,禁止跨组件复制粘贴
48
+ - 列表渲染必须给 `key`,且 `key` 稳定唯一,避免使用数组索引
49
+ - 受控表单优先;非受控仅用于不需要回读值的场景
50
+ - 样式遵循设计系统:间距用 4 的倍数,强调色 ≤ 2 种
51
+
52
+ ## Anti-Patterns
53
+ - 禁止在组件内直接修改 props 或 store 内部状态
54
+ - 禁止把大量逻辑塞进 JSX 表达式,复杂条件提取变量或子组件
55
+ - 禁止用 `index` 作为列表 `key`(顺序变更会触发错误复用)
56
+ - 禁止省略 `alt` / `aria-*` 等可访问性属性
@@ -0,0 +1,41 @@
1
+ ---
2
+ description: 新建/移动前端文件时适用:目录结构、路由/页面/组件存放约束
3
+ ---
4
+
5
+ # Frontend Directory Structure
6
+
7
+ ## Examples
8
+
9
+ ✅ 三层分离:service 发请求 → hook/composable 管状态 → 组件纯展示
10
+
11
+ ```ts
12
+ // services/order.ts — 只管 HTTP,不含状态
13
+ export const fetchOrder = (id: string) => http.get(`/orders/${id}`);
14
+ // hooks/useOrder.ts — 管 loading/error/data,复用逻辑收口于此
15
+ export const useOrder = (id: string) => { /* 调 fetchOrder,返回 { data, loading, error } */ };
16
+ // components/OrderCard.tsx — 纯展示,消费 hook
17
+ const { data, loading, error } = useOrder(id);
18
+ ```
19
+
20
+ ❌ 组件内裸 `fetch`,请求/状态/样式糊在一处
21
+
22
+ ```tsx
23
+ const order = await fetch(`/orders/${id}`).then((r) => r.json());
24
+ ```
25
+
26
+ ## Rules
27
+ - 通用组件放 `src/components/`,页面级组件放 `src/pages/`,业务复用逻辑放 `src/hooks/`(或 `composables/`)
28
+ - **接口调用独立成层**:API 调用必须在 `src/services/` 封装;组件 / hook / composable 经 service 消费,**禁止组件或视图层内裸 `fetch` / `axios`**
29
+ - 类型定义放 `src/types/`(共享)或与组件同目录(局部),禁止散落
30
+ - 新增一级目录必须更新路由 / 入口索引与导航地图
31
+
32
+ ## Patterns
33
+ - 组件目录按业务域分子目录(`components/order/`、`components/user/`)
34
+ - 页面与路由一一对应,路由配置集中在 `router.*`
35
+ - 资源文件(图片 / 字体)放 `src/assets/`,构建工具处理 hash 与压缩
36
+ - 测试文件与源码同目录(`Foo.test.tsx`)或镜像放 `tests/`
37
+
38
+ ## Anti-Patterns
39
+ - 禁止在 `src/` 下随意新增未登记的一级目录
40
+ - 禁止页面与组件互相循环引用
41
+ - 禁止把仅本组件用的 hook / 类型上提到全局目录
@@ -0,0 +1,46 @@
1
+ ---
2
+ description: 写前端代码时适用:类型、lint、错误处理、测试、状态管理质量约束
3
+ ---
4
+
5
+ # Frontend Quality Standards
6
+
7
+ ## Examples
8
+
9
+ ✅ `unknown` 收敛 + 异步三态
10
+
11
+ ```ts
12
+ setState("loading");
13
+ try {
14
+ const raw: unknown = await api.fetch();
15
+ setState("success", parse(raw));
16
+ } catch (e) {
17
+ setState("error", toMessage(e));
18
+ }
19
+ ```
20
+
21
+ ❌ `any` + `@ts-ignore` + 只处理成功路径
22
+
23
+ ```ts
24
+ // @ts-ignore
25
+ const data: any = await api.fetch();
26
+ render(data);
27
+ ```
28
+
29
+ ## Rules
30
+ - TypeScript 项目禁止使用 `any`,未知类型用 `unknown` 并显式收敛
31
+ - 组件统一使用函数组件(React)/ 组合式 API(Vue 3),禁止类组件新增
32
+ - 关键交互(提交 / 删除 / 支付)必须有错误提示与 loading 状态
33
+ - 异步操作必须处理 loading / success / error 三态,禁止只处理成功路径
34
+ - 提交前必须通过 lint 与 type check,禁止 `eslint-disable` / `@ts-ignore` 滥用
35
+
36
+ ## Patterns
37
+ - 跨组件状态用集中式状态管理,避免 prop drilling 超过 2 层
38
+ - 表单校验在提交前完成,错误信息定位到具体字段
39
+ - 网络请求统一处理 401 / 403 / 5xx,避免每个调用方重复
40
+ - 关键路径补端到端测试或组件交互测试
41
+
42
+ ## Anti-Patterns
43
+ - 禁止在 render / setup 中发起未受控的副作用(用 `useEffect` / `onMounted`)
44
+ - 禁止把后端错误直接抛给用户(如 SQL / stack trace)
45
+ - 禁止用 `// @ts-ignore` 绕过类型错误,必须修复或改为 `@ts-expect-error` 加注释
46
+ - 禁止在组件中直接修改 store 内部状态,必须走 action / mutation
@@ -0,0 +1,57 @@
1
+ # Shared Specs Navigation Map
2
+
3
+ > 跨项目的共享模板和规范
4
+
5
+ ## Purpose
6
+
7
+ 共享模板供 `cf-task:align` 和 `cf-task:prd` 命令使用,为文档生成提供规范约束。
8
+
9
+ ## Templates
10
+
11
+ ### PRD Templates
12
+
13
+ | 文件 | 用途 | 适用场景 |
14
+ |------|------|---------|
15
+ | `prd-template.md` | 产品需求文档 | 需求早期阶段,在设计之前 |
16
+
17
+ ### Design Templates
18
+
19
+ | 文件 | 用途 | 适用场景 |
20
+ |------|------|---------|
21
+ | `design/design-lite.md` | 轻量设计简报 | 功能开发/CLI/Bug修复/小型重构 |
22
+ | `design/design-full.md` | 完整设计文档 | 跨系统集成/性能优化/架构演进/中大型功能 |
23
+
24
+ > 两档模板均覆盖:接口设计(API/CLI/函数三形态)、性能与容量设计、可执行验收(场景即 TC)。design-full 额外含方案选型 ADR 决策记录与 §6 需求追溯矩阵。
25
+
26
+ ## Workflow
27
+
28
+ ```
29
+ 需求 → cf-task:prd → PRD (.prd.md)
30
+ ↓ (align 读取 .prd.md 派生)
31
+ → cf-task:align → 设计 (.design.md)
32
+ ↓ (plan 读取 .design.md 拆解)
33
+ → cf-task:plan → 任务
34
+ ```
35
+
36
+ ## Selection Guide
37
+
38
+ ```
39
+ 需求阶段(还未明确用户与场景):
40
+ → cf-task:prd 生成 PRD
41
+
42
+ 设计阶段(已有 PRD 或已明确做什么):
43
+ → cf-task:align 生成设计简报
44
+ - 输入 .prd.md → 派生模式(继承目标/用户/功能/范围)
45
+ - 输入文本 → 新建模式(从零对话)
46
+
47
+ 复杂度判断:
48
+ 简单功能/脚本/Bugfix → design-lite.md
49
+ 复杂系统/跨模块/性能优化 → design-full.md
50
+ ```
51
+
52
+ ## Usage
53
+
54
+ 1. `cf-task:prd` 命令引用 `prd-template.md` 生成 PRD
55
+ 2. `cf-task:align` 命令引用 `design/design-lite.md` 或 `design/design-full.md` 生成设计文档
56
+ 3. PRD 的 US/FEAT ID 被 design 的功能清单"来源"列引用,形成追溯链
57
+ 4. 性能敏感需求:align 在出技术方案时即按最优性能设计,落点 design-lite §3.4 / design-full §3.5,并在 §6 矩阵闭合 US→FEAT→API→TC
@@ -0,0 +1,247 @@
1
+ # {模块名称} 前端模块需求与设计简报
2
+
3
+ > **文档编号**: FE-{模块代号}-{版本号}
4
+ > **文档版本**: v1.0
5
+ > **创建日期**: YYYY-MM-DD
6
+ > **文档状态**: 草稿 / 评审中 / 已批准
7
+
8
+ **评审边界说明**:
9
+ - **需求评审**: 第 2 章(需求分析)→ 通过后锁定需求基线
10
+ - **设计评审**: 第 3 章(前端技术设计)→ 通过后锁定设计基线
11
+
12
+ **ID 体系**: US(来自 PRD,可选)、FEAT(功能)、CMP(组件)、NFR(非功能指标)
13
+ 场景编号:S-(正常)、E-(异常)、B-(边界,按需)
14
+
15
+ **填写约定**: 框架中立——按实际框架(React / Vue / Svelte 等)替换示例为真实写法。表内数值/阈值均为**示例**,必须替换为真实目标或删除;无实测依据填"待定"。标注 `[按需]` 的章节不适用时整节删除,不要留空表。
16
+
17
+ ---
18
+
19
+ ## 目录
20
+
21
+ - [1. 文档控制](#1-文档控制)
22
+ - [2. 需求分析](#2-需求分析)
23
+ - [2.1 需求概述](#21-需求概述-必填)
24
+ - [2.2 功能方案](#22-功能方案-必填)
25
+ - [2.3 范围与边界](#23-范围与边界-必填)
26
+ - [2.4 验收条件](#24-验收条件-必填)
27
+ - [3. 前端技术设计](#3-前端技术设计)
28
+ - [3.1 技术选型](#31-技术选型-必填)
29
+ - [3.2 页面与路由结构](#32-页面与路由结构-必填)
30
+ - [3.3 组件设计](#33-组件设计-必填)
31
+ - [3.4 组件接口契约](#34-组件接口契约-必填)
32
+ - [3.5 状态与数据流](#35-状态与数据流-必填)
33
+ - [3.6 UI 状态](#36-ui-状态-必填)
34
+ - [3.7 样式方案](#37-样式方案-必填)
35
+ - [3.8 可访问性与兼容性](#38-可访问性与兼容性-按需)
36
+ - [4. 风险与依赖](#4-风险与依赖)
37
+ - [附录:术语表](#附录术语表)
38
+
39
+ ---
40
+
41
+ ## 1. 文档控制
42
+
43
+ ### 1.1 责任人
44
+
45
+ | 角色 | 姓名 | 职责范围 |
46
+ |------|------|---------|
47
+ | 开发负责人 | | 技术方案、代码实现 |
48
+ | 设计/交互 | | 视觉与交互稿(如有) |
49
+
50
+ ### 1.2 修订历史
51
+
52
+ | 版本 | 日期 | 作者 | 变更描述 |
53
+ |------|------|------|---------|
54
+ | v0.1 | YYYY-MM-DD | | 初始草稿 |
55
+
56
+ ---
57
+
58
+ ## 2. 需求分析
59
+
60
+ ### 2.1 需求概述 [必填]
61
+
62
+ | 项目 | 内容 |
63
+ |------|------|
64
+ | **模块名称** | |
65
+ | **需求类型** | 新页面 / 组件 / 交互优化 / 重构 |
66
+ | **业务背景** | (需求来源、触发原因) |
67
+ | **核心目标** | (一句话说明要达成的用户价值) |
68
+
69
+ ---
70
+
71
+ ### 2.2 功能方案 [必填]
72
+
73
+ | 功能ID | 功能名称 | 功能描述 | 优先级 | 来源 |
74
+ |--------|---------|---------|--------|------|
75
+ | FEAT-01 | | | P0 | US-01 |
76
+
77
+ > 来源:引用 PRD 中的 US-XX;无 PRD 时留空。
78
+
79
+ ---
80
+
81
+ ### 2.3 范围与边界 [必填]
82
+
83
+ | 类别 | 内容 |
84
+ |------|------|
85
+ | **范围(In Scope)** | 本次覆盖的页面/组件/交互 |
86
+ | **非范围(Out of Scope)** | 明确**不做**的部分 |
87
+ | **有意妥协 / 技术债** | 本次接受的取舍(无则填"无") |
88
+
89
+ ---
90
+
91
+ ### 2.4 验收条件 [必填]
92
+
93
+ > 交互层面的可验证场景,写到可转 e2e / 组件交互测试断言的粒度(明确操作与可观测 UI 结果)。场景 ID 即测试用例来源。
94
+
95
+ **正常场景**
96
+
97
+ | 场景ID | 功能ID | 优先级 | 操作步骤 | 预期 UI 结果 |
98
+ |--------|--------|--------|---------|-------------|
99
+ | S-01 | FEAT-01 | P0 | 1. <操作> | <可见结果> |
100
+
101
+ **异常场景**
102
+
103
+ | 场景ID | 功能ID | 触发条件 | UI 表现 |
104
+ |--------|--------|---------|---------|
105
+ | E-01 | FEAT-01 | (接口失败 / 空数据 / 校验不通过) | (错误提示 / 空态 / 字段定位) |
106
+
107
+ **非功能指标** [按需]
108
+
109
+ | 指标ID | 指标名称 | 目标值 | 测量方法 |
110
+ |--------|---------|-------|---------|
111
+ | NFR-PERF-01 | 首屏 / 交互响应 | 待定 | Lighthouse / 实测 |
112
+
113
+ ---
114
+
115
+ ## 3. 前端技术设计
116
+
117
+ ### 3.1 技术选型 [必填]
118
+
119
+ | 类别 | 选型 | 版本 | 选型理由 |
120
+ |------|------|------|---------|
121
+ | 框架 | (React / Vue / Svelte…) | | |
122
+ | 状态管理 | (局部 / Redux / Zustand / Pinia / stores…) | | |
123
+ | 路由 | | | |
124
+ | 样式方案 | (Tailwind / CSS Modules / styled-components…) | | |
125
+ | 数据请求 | (fetch 封装 / axios / react-query / SWR…) | | |
126
+
127
+ ---
128
+
129
+ ### 3.2 页面与路由结构 [必填]
130
+
131
+ | 页面 | 路由 | 布局 | 说明 |
132
+ |------|------|------|------|
133
+ | | `/path` | | |
134
+
135
+ > 新增页面 → 路由配置 + 入口;与现有路由层级一致。
136
+
137
+ ---
138
+
139
+ ### 3.3 组件设计 [必填]
140
+
141
+ **组件树**(容器/展示分离)
142
+
143
+ ```
144
+ <Page> # 容器:数据获取 + 状态
145
+ └─ <FeaturePanel> # 容器
146
+ ├─ <ItemList> # 展示:纯 UI,props 驱动
147
+ │ └─ <ItemRow> # 展示
148
+ └─ <ActionBar> # 展示,事件回调上抛
149
+ ```
150
+
151
+ | 组件ID | 组件名 | 类型 | 复用来源/去向 | 职责 |
152
+ |--------|--------|------|--------------|------|
153
+ | CMP-01 | | 容器/展示 | 新建 / 复用现有 | |
154
+
155
+ > **分层纪律**:容器组件负责数据与状态,展示组件纯 UI(props in / events out);复用逻辑提取为 hook/composable,禁止跨组件复制粘贴。
156
+
157
+ ---
158
+
159
+ ### 3.4 组件接口契约 [必填]
160
+
161
+ > 替代后端的"接口设计"——前端的接口是组件的 Props / Events。
162
+
163
+ **CMP-01 `<组件名>`**
164
+
165
+ | Props | 类型 | 必填 | 默认 | 说明 |
166
+ |-------|------|------|------|------|
167
+ | | | | | |
168
+
169
+ | Events / 回调 | 载荷类型 | 触发时机 |
170
+ |--------------|---------|---------|
171
+ | `onXxx` | | |
172
+
173
+ > 组件内**禁止直接修改 props**,改值通过事件/回调上抛。
174
+
175
+ ---
176
+
177
+ ### 3.5 状态与数据流 [必填]
178
+
179
+ **状态划分**
180
+
181
+ | 状态 | 作用域(local / shared store) | 形状(shape) | 读写方 |
182
+ |------|------------------------------|--------------|--------|
183
+ | | | | |
184
+
185
+ **数据流**
186
+
187
+ ```
188
+ 用户操作 → 事件处理 → Service(API 封装) → Store/State → 重渲染
189
+ ```
190
+
191
+ **数据获取层**:API 调用必须经 `services/`(或等价封装)统一发起,**组件 / 展示层不出现裸 `fetch`/`axios`**;组件通过 hook/composable 消费。
192
+
193
+ | Service 方法 | 对应后端接口 | 调用方组件/hook |
194
+ |-------------|-------------|----------------|
195
+ | `getXxx()` | `GET /...` | |
196
+
197
+ ---
198
+
199
+ ### 3.6 UI 状态 [必填]
200
+
201
+ > 每个涉及异步/交互的视图列出四态,禁止只处理成功路径。
202
+
203
+ | 视图/交互 | loading | empty | error | success |
204
+ |----------|---------|-------|-------|---------|
205
+ | | (骨架/转圈) | (空态文案/插画) | (错误提示+重试) | (正常内容) |
206
+
207
+ ---
208
+
209
+ ### 3.7 样式方案 [必填]
210
+
211
+ | 维度 | 约定 |
212
+ |------|------|
213
+ | **样式与逻辑分离** | 样式走 CSS Modules / 原子类 / 设计 tokens,不与数据获取/业务逻辑混在同一处 |
214
+ | **设计 tokens** | 间距/颜色/字号引用 token,不散落魔法值 |
215
+ | **响应式断点** | (列出断点与适配策略) |
216
+
217
+ ---
218
+
219
+ ### 3.8 可访问性与兼容性 [按需]
220
+
221
+ | 维度 | 要求 |
222
+ |------|------|
223
+ | 可访问性 | 语义标签、`alt`/`aria-*`、键盘可达、焦点管理 |
224
+ | 浏览器/设备兼容 | (目标范围) |
225
+
226
+ ---
227
+
228
+ ## 4. 风险与依赖 [按需]
229
+
230
+ | 风险ID | 描述 | 影响 | 应对 |
231
+ |--------|------|------|------|
232
+ | | | | |
233
+
234
+ ---
235
+
236
+ ## 附录:术语表
237
+
238
+ | 术语 | 定义 |
239
+ |------|------|
240
+ | US / FEAT / NFR | 用户故事 / 功能项 / 非功能需求 |
241
+ | CMP | Component,组件 |
242
+ | 容器组件 | 负责数据获取与状态的组件 |
243
+ | 展示组件 | 纯 UI、props 驱动、事件上抛的组件 |
244
+
245
+ ---
246
+
247
+ *文档结束*