create-vibe-workflow 0.1.0 → 0.2.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 (120) hide show
  1. package/README.md +248 -57
  2. package/dist/adapters/next-only/skills.recommend.json +1 -0
  3. package/dist/adapters/node-api/skills.recommend.json +1 -0
  4. package/dist/cli.js +163 -5
  5. package/dist/cli.js.map +1 -1
  6. package/dist/generator.d.ts.map +1 -1
  7. package/dist/generator.js +255 -44
  8. package/dist/generator.js.map +1 -1
  9. package/dist/questions.d.ts +11 -1
  10. package/dist/questions.d.ts.map +1 -1
  11. package/dist/questions.js +103 -16
  12. package/dist/questions.js.map +1 -1
  13. package/dist/templates/claude-md/CLAUDE.zh-CN.md +51 -46
  14. package/dist/templates/claude-md/next-only/CLAUDE.zh-CN.md +46 -0
  15. package/dist/templates/claude-md/node-api/CLAUDE.zh-CN.md +47 -0
  16. package/dist/templates/commands/gstack/cso.md.ejs +213 -0
  17. package/dist/templates/commands/gstack/office-hours.md.ejs +109 -0
  18. package/dist/templates/commands/gstack/review.md.ejs +192 -0
  19. package/dist/templates/commands/gstack/ship.md.ejs +256 -0
  20. package/dist/templates/commands/opsx/apply.md.ejs +106 -0
  21. package/dist/templates/commands/opsx/archive.md.ejs +88 -0
  22. package/dist/templates/commands/opsx/explore.md.ejs +84 -0
  23. package/dist/templates/commands/opsx/propose.md.ejs +185 -0
  24. package/dist/templates/commands/superpowers/brainstorm.md.ejs +240 -0
  25. package/dist/templates/commands/superpowers/tdd.md.ejs +230 -0
  26. package/dist/templates/commands/superpowers/verify.md.ejs +211 -0
  27. package/dist/templates/commands/workflow/plan.md.ejs +219 -0
  28. package/dist/templates/hooks/check-deps.mjs +66 -65
  29. package/dist/templates/memory/.gitkeep +0 -0
  30. package/dist/templates/memory/MEMORY.md.ejs +88 -0
  31. package/dist/templates/memory/dev-notes.md.ejs +61 -0
  32. package/dist/templates/memory/troubleshooting.md.ejs +30 -0
  33. package/dist/templates/rules/agents.md +49 -49
  34. package/dist/templates/rules/coding-style.md +156 -117
  35. package/dist/templates/rules/development-workflow.md +103 -50
  36. package/dist/templates/rules/git-workflow.md +103 -47
  37. package/dist/templates/rules/hooks.md +159 -0
  38. package/dist/templates/rules/hooks.md.ejs +159 -0
  39. package/dist/templates/rules/memory.md +106 -0
  40. package/dist/templates/rules/memory.md.ejs +106 -0
  41. package/dist/templates/rules/patterns.md +117 -48
  42. package/dist/templates/rules/performance.md +108 -0
  43. package/dist/templates/rules/performance.md.ejs +108 -0
  44. package/dist/templates/rules/security.md +52 -37
  45. package/dist/templates/rules/testing.md +83 -30
  46. package/dist/templates/settings/settings.template.json +18 -2
  47. package/dist/templates/skills/advanced/caveman/SKILL.md.ejs +144 -0
  48. package/dist/templates/skills/advanced/diagnose/SKILL.md.ejs +159 -0
  49. package/dist/templates/skills/advanced/grill-with-docs/SKILL.md.ejs +154 -0
  50. package/dist/templates/skills/advanced/improve-codebase-architecture/SKILL.md.ejs +172 -0
  51. package/dist/templates/skills/backend/backend-patterns/SKILL.md.ejs +263 -0
  52. package/dist/templates/skills/database/database-migrations/SKILL.md.ejs +202 -0
  53. package/dist/templates/skills/database/postgres-patterns/SKILL.md.ejs +235 -0
  54. package/dist/templates/skills/devops/deployment-patterns/SKILL.md.ejs +228 -0
  55. package/dist/templates/skills/devops/docker-patterns/SKILL.md.ejs +215 -0
  56. package/dist/templates/skills/frontend/frontend-patterns/SKILL.md.ejs +195 -0
  57. package/dist/templates/skills/skill-manifest.json +59 -0
  58. package/dist/templates/skills/skills-lock.template.json +12 -0
  59. package/dist/templates/skills/testing/e2e-testing/SKILL.md.ejs +224 -0
  60. package/dist/templates/skills/workflow/coding-standards/SKILL.md.ejs +143 -0
  61. package/dist/templates/skills/workflow/search-first/SKILL.md.ejs +103 -0
  62. package/dist/templates/skills/workflow/security-review/SKILL.md.ejs +146 -0
  63. package/dist/templates/skills/workflow/strategic-compact/SKILL.md.ejs +108 -0
  64. package/dist/templates/skills/workflow/tdd-workflow/SKILL.md.ejs +104 -0
  65. package/dist/templates/skills/workflow/verification-loop/SKILL.md.ejs +144 -0
  66. package/dist/utils.d.ts +40 -0
  67. package/dist/utils.d.ts.map +1 -0
  68. package/dist/utils.js +110 -0
  69. package/dist/utils.js.map +1 -0
  70. package/package.json +2 -2
  71. package/templates/claude-md/CLAUDE.zh-CN.md +51 -46
  72. package/templates/claude-md/next-only/CLAUDE.zh-CN.md +46 -0
  73. package/templates/claude-md/node-api/CLAUDE.zh-CN.md +47 -0
  74. package/templates/commands/gstack/cso.md.ejs +213 -0
  75. package/templates/commands/gstack/office-hours.md.ejs +109 -0
  76. package/templates/commands/gstack/review.md.ejs +192 -0
  77. package/templates/commands/gstack/ship.md.ejs +256 -0
  78. package/templates/commands/opsx/apply.md.ejs +106 -0
  79. package/templates/commands/opsx/archive.md.ejs +88 -0
  80. package/templates/commands/opsx/explore.md.ejs +84 -0
  81. package/templates/commands/opsx/propose.md.ejs +185 -0
  82. package/templates/commands/superpowers/brainstorm.md.ejs +240 -0
  83. package/templates/commands/superpowers/tdd.md.ejs +230 -0
  84. package/templates/commands/superpowers/verify.md.ejs +211 -0
  85. package/templates/commands/workflow/plan.md.ejs +219 -0
  86. package/templates/hooks/check-deps.mjs +66 -65
  87. package/templates/memory/.gitkeep +0 -0
  88. package/templates/memory/MEMORY.md.ejs +88 -0
  89. package/templates/memory/dev-notes.md.ejs +61 -0
  90. package/templates/memory/troubleshooting.md.ejs +30 -0
  91. package/templates/rules/agents.md +49 -49
  92. package/templates/rules/coding-style.md +156 -117
  93. package/templates/rules/development-workflow.md +103 -50
  94. package/templates/rules/git-workflow.md +103 -47
  95. package/templates/rules/hooks.md +159 -0
  96. package/templates/rules/memory.md +106 -0
  97. package/templates/rules/patterns.md +117 -48
  98. package/templates/rules/performance.md +108 -0
  99. package/templates/rules/security.md +52 -37
  100. package/templates/rules/testing.md +83 -30
  101. package/templates/settings/settings.template.json +18 -2
  102. package/templates/skills/advanced/caveman/SKILL.md.ejs +144 -0
  103. package/templates/skills/advanced/diagnose/SKILL.md.ejs +159 -0
  104. package/templates/skills/advanced/grill-with-docs/SKILL.md.ejs +154 -0
  105. package/templates/skills/advanced/improve-codebase-architecture/SKILL.md.ejs +172 -0
  106. package/templates/skills/backend/backend-patterns/SKILL.md.ejs +263 -0
  107. package/templates/skills/database/database-migrations/SKILL.md.ejs +202 -0
  108. package/templates/skills/database/postgres-patterns/SKILL.md.ejs +235 -0
  109. package/templates/skills/devops/deployment-patterns/SKILL.md.ejs +228 -0
  110. package/templates/skills/devops/docker-patterns/SKILL.md.ejs +215 -0
  111. package/templates/skills/frontend/frontend-patterns/SKILL.md.ejs +195 -0
  112. package/templates/skills/skill-manifest.json +59 -0
  113. package/templates/skills/skills-lock.template.json +12 -0
  114. package/templates/skills/testing/e2e-testing/SKILL.md.ejs +224 -0
  115. package/templates/skills/workflow/coding-standards/SKILL.md.ejs +143 -0
  116. package/templates/skills/workflow/search-first/SKILL.md.ejs +103 -0
  117. package/templates/skills/workflow/security-review/SKILL.md.ejs +146 -0
  118. package/templates/skills/workflow/strategic-compact/SKILL.md.ejs +108 -0
  119. package/templates/skills/workflow/tdd-workflow/SKILL.md.ejs +104 -0
  120. package/templates/skills/workflow/verification-loop/SKILL.md.ejs +144 -0
@@ -0,0 +1,159 @@
1
+ ---
2
+ paths:
3
+ - "**/*.ts"
4
+ - "**/*.tsx"
5
+ - "**/*.js"
6
+ - "**/*.jsx"
7
+ ---
8
+
9
+ # Hooks 配置指南
10
+
11
+ > 本文件定义如何通过 `.claude/settings.json` 配置 Claude Code 的 PostToolUse 和 Stop hooks。
12
+ > 具体依赖声明见 `.claude/settings.json`(由 `create-vibe-workflow` 生成)。
13
+
14
+ ## 什么是 Hooks
15
+
16
+ Hooks 是 Claude Code 在工具调用前后触发的自动化脚本,用于:
17
+
18
+ - **PostToolUse hooks**: 在工具使用后自动执行(如自动格式化代码)
19
+ - **Stop hooks**: 在会话停止/结束时执行(如最终检查)
20
+
21
+ Hooks 在 `.claude/settings.json` 中配置,脚本存放在 `.claude/hooks/` 目录。
22
+
23
+ ## PostToolUse Hooks
24
+
25
+ 在每次工具调用后触发。适用于自动化质量检查。
26
+
27
+ ### 配置结构
28
+
29
+ ```jsonc
30
+ // .claude/settings.json
31
+ {
32
+ "hooks": {
33
+ "PostToolUse": [
34
+ {
35
+ "matcher": {
36
+ "tool_name": "$<工具名>",
37
+ "scope": "project" // 或 "user" / "global"
38
+ },
39
+ "command": "node .claude/hooks/<脚本名>",
40
+ "description": "描述这个 hook 的作用"
41
+ }
42
+ ]
43
+ }
44
+ }
45
+ ```
46
+
47
+ ### matcher 字段说明
48
+
49
+ | 字段 | 说明 | 示例 |
50
+ |------|------|------|
51
+ | `tool_name` | 匹配的工具名称 | `Bash`、`Edit`、`Write` |
52
+ | `scope` | 作用域 | `project`(项目级)、`user`(用户级)、`global`(全局) |
53
+
54
+ ### Stop Hooks
55
+
56
+ 在会话停止时触发。适用于清理、审计等一次性操作。
57
+
58
+ ```jsonc
59
+ // .claude/settings.json
60
+ {
61
+ "hooks": {
62
+ "Stop": [
63
+ {
64
+ "matcher": {
65
+ "scope": "project"
66
+ },
67
+ "command": "node .claude/hooks/<脚本名>",
68
+ "description": "描述这个 hook 的作用"
69
+ }
70
+ ]
71
+ }
72
+ }
73
+ ```
74
+
75
+ ## 本项目生成的 Hooks
76
+
77
+ 本模板生成了以下两个 hook 脚本(在 `.claude/hooks/` 目录):
78
+
79
+ | 脚本 | 类型 | 触发时机 | 作用 |
80
+ |------|------|----------|------|
81
+ | `post-commit-check.js` | PostToolUse | 每次 Bash 工具调用后 | 检测到 `git commit` 命令后提示文档反写检查清单 |
82
+ | `check-deps.mjs` | PostToolUse | 每次工具调用后 | 检查 git 配置是否满足项目规范 |
83
+
84
+ ## 自定义 Hooks 示例
85
+
86
+ ### 示例 1:PostToolUse — 自动格式化
87
+
88
+ 编辑 TypeScript 文件后自动运行 Prettier:
89
+
90
+ ```jsonc
91
+ {
92
+ "hooks": {
93
+ "PostToolUse": [
94
+ {
95
+ "matcher": {
96
+ "tool_name": "Edit",
97
+ "scope": "project"
98
+ },
99
+ "command": "npx prettier --write --ignore-unknown .claude/hooks/post-commit-check.js",
100
+ "description": "编辑文件后自动格式化"
101
+ }
102
+ ]
103
+ }
104
+ }
105
+ ```
106
+
107
+ ### 示例 2:PostToolUse — 每次 Bash 后检查 TypeScript 编译
108
+
109
+ ```jsonc
110
+ {
111
+ "hooks": {
112
+ "PostToolUse": [
113
+ {
114
+ "matcher": {
115
+ "tool_name": "Bash",
116
+ "scope": "project"
117
+ },
118
+ "command": "npx tsc --noEmit 2>&1 | head -30",
119
+ "description": "Bash 命令后检查 TypeScript 编译"
120
+ }
121
+ ]
122
+ }
123
+ }
124
+ ```
125
+
126
+ ### 示例 3:Stop — 格式化所有文件
127
+
128
+ ```jsonc
129
+ {
130
+ "hooks": {
131
+ "Stop": [
132
+ {
133
+ "matcher": {
134
+ "scope": "project"
135
+ },
136
+ "command": "npx prettier --write \"src/**/*.{ts,tsx,js,jsx,json}\"",
137
+ "description": "会话结束时格式化所有源文件"
138
+ }
139
+ ]
140
+ }
141
+ }
142
+ ```
143
+
144
+ ## 最佳实践
145
+
146
+ 1. **Hook 脚本要轻量**: hook 在每次工具调用后触发,脚本执行时间不宜超过 1 秒
147
+ 2. **避免副作用**: hook 脚本应该只读或只写格式化相关的内容,不要修改业务逻辑
148
+ 3. **合理使用 matcher**: 精确匹配工具名,避免不必要的触发
149
+ 4. **静默执行**: hook 脚本不应该输出大量日志到终端,除非有错误
150
+ 5. **错误不影响主流程**: hook 脚本执行失败不应阻断主工具调用
151
+
152
+ ## 故障排查
153
+
154
+ | 现象 | 可能原因 | 解决 |
155
+ |------|----------|------|
156
+ | Hook 未触发 | matcher 不匹配或路径错误 | 检查 `tool_name` 和脚本路径 |
157
+ | Hook 输出乱码 | 脚本编码问题 | 确保脚本使用 UTF-8 编码 |
158
+ | Hook 执行缓慢 | 脚本中存在耗时操作 | 简化脚本逻辑 |
159
+ | Hook 报错但未被注意 | 错误被静默吞掉 | 在脚本中添加 `console.error` 输出 |
@@ -0,0 +1,159 @@
1
+ ---
2
+ paths:
3
+ - "**/*.ts"
4
+ - "**/*.tsx"
5
+ - "**/*.js"
6
+ - "**/*.jsx"
7
+ ---
8
+
9
+ # Hooks 配置指南
10
+
11
+ > 本文件定义如何通过 `.claude/settings.json` 配置 Claude Code 的 PostToolUse 和 Stop hooks。
12
+ > 具体依赖声明见 `.claude/settings.json`(由 `create-vibe-workflow` 生成)。
13
+
14
+ ## 什么是 Hooks
15
+
16
+ Hooks 是 Claude Code 在工具调用前后触发的自动化脚本,用于:
17
+
18
+ - **PostToolUse hooks**: 在工具使用后自动执行(如自动格式化代码)
19
+ - **Stop hooks**: 在会话停止/结束时执行(如最终检查)
20
+
21
+ Hooks 在 `.claude/settings.json` 中配置,脚本存放在 `.claude/hooks/` 目录。
22
+
23
+ ## PostToolUse Hooks
24
+
25
+ 在每次工具调用后触发。适用于自动化质量检查。
26
+
27
+ ### 配置结构
28
+
29
+ ```jsonc
30
+ // .claude/settings.json
31
+ {
32
+ "hooks": {
33
+ "PostToolUse": [
34
+ {
35
+ "matcher": {
36
+ "tool_name": "$<工具名>",
37
+ "scope": "project" // 或 "user" / "global"
38
+ },
39
+ "command": "node .claude/hooks/<脚本名>",
40
+ "description": "描述这个 hook 的作用"
41
+ }
42
+ ]
43
+ }
44
+ }
45
+ ```
46
+
47
+ ### matcher 字段说明
48
+
49
+ | 字段 | 说明 | 示例 |
50
+ |------|------|------|
51
+ | `tool_name` | 匹配的工具名称 | `Bash`、`Edit`、`Write` |
52
+ | `scope` | 作用域 | `project`(项目级)、`user`(用户级)、`global`(全局) |
53
+
54
+ ### Stop Hooks
55
+
56
+ 在会话停止时触发。适用于清理、审计等一次性操作。
57
+
58
+ ```jsonc
59
+ // .claude/settings.json
60
+ {
61
+ "hooks": {
62
+ "Stop": [
63
+ {
64
+ "matcher": {
65
+ "scope": "project"
66
+ },
67
+ "command": "node .claude/hooks/<脚本名>",
68
+ "description": "描述这个 hook 的作用"
69
+ }
70
+ ]
71
+ }
72
+ }
73
+ ```
74
+
75
+ ## 本项目生成的 Hooks
76
+
77
+ 本模板生成了以下两个 hook 脚本(在 `.claude/hooks/` 目录):
78
+
79
+ | 脚本 | 类型 | 触发时机 | 作用 |
80
+ |------|------|----------|------|
81
+ | `post-commit-check.js` | PostToolUse | 每次 Bash 工具调用后 | 检测到 `git commit` 命令后提示文档反写检查清单 |
82
+ | `check-deps.mjs` | PostToolUse | 每次工具调用后 | 检查 git 配置是否满足项目规范 |
83
+
84
+ ## 自定义 Hooks 示例
85
+
86
+ ### 示例 1:PostToolUse — 自动格式化
87
+
88
+ 编辑 TypeScript 文件后自动运行 Prettier:
89
+
90
+ ```jsonc
91
+ {
92
+ "hooks": {
93
+ "PostToolUse": [
94
+ {
95
+ "matcher": {
96
+ "tool_name": "Edit",
97
+ "scope": "project"
98
+ },
99
+ "command": "npx prettier --write --ignore-unknown .claude/hooks/post-commit-check.js",
100
+ "description": "编辑文件后自动格式化"
101
+ }
102
+ ]
103
+ }
104
+ }
105
+ ```
106
+
107
+ ### 示例 2:PostToolUse — 每次 Bash 后检查 TypeScript 编译
108
+
109
+ ```jsonc
110
+ {
111
+ "hooks": {
112
+ "PostToolUse": [
113
+ {
114
+ "matcher": {
115
+ "tool_name": "Bash",
116
+ "scope": "project"
117
+ },
118
+ "command": "npx tsc --noEmit 2>&1 | head -30",
119
+ "description": "Bash 命令后检查 TypeScript 编译"
120
+ }
121
+ ]
122
+ }
123
+ }
124
+ ```
125
+
126
+ ### 示例 3:Stop — 格式化所有文件
127
+
128
+ ```jsonc
129
+ {
130
+ "hooks": {
131
+ "Stop": [
132
+ {
133
+ "matcher": {
134
+ "scope": "project"
135
+ },
136
+ "command": "npx prettier --write \"src/**/*.{ts,tsx,js,jsx,json}\"",
137
+ "description": "会话结束时格式化所有源文件"
138
+ }
139
+ ]
140
+ }
141
+ }
142
+ ```
143
+
144
+ ## 最佳实践
145
+
146
+ 1. **Hook 脚本要轻量**: hook 在每次工具调用后触发,脚本执行时间不宜超过 1 秒
147
+ 2. **避免副作用**: hook 脚本应该只读或只写格式化相关的内容,不要修改业务逻辑
148
+ 3. **合理使用 matcher**: 精确匹配工具名,避免不必要的触发
149
+ 4. **静默执行**: hook 脚本不应该输出大量日志到终端,除非有错误
150
+ 5. **错误不影响主流程**: hook 脚本执行失败不应阻断主工具调用
151
+
152
+ ## 故障排查
153
+
154
+ | 现象 | 可能原因 | 解决 |
155
+ |------|----------|------|
156
+ | Hook 未触发 | matcher 不匹配或路径错误 | 检查 `tool_name` 和脚本路径 |
157
+ | Hook 输出乱码 | 脚本编码问题 | 确保脚本使用 UTF-8 编码 |
158
+ | Hook 执行缓慢 | 脚本中存在耗时操作 | 简化脚本逻辑 |
159
+ | Hook 报错但未被注意 | 错误被静默吞掉 | 在脚本中添加 `console.error` 输出 |
@@ -0,0 +1,106 @@
1
+ ---
2
+ paths:
3
+ - "**/*"
4
+ ---
5
+
6
+ # 记忆系统使用规则
7
+
8
+ > 本文件定义了 AI 如何读写项目记忆文件。记忆系统是项目的"长期大脑",记录经验、决策和上下文。
9
+
10
+ ## 记忆类型
11
+
12
+ | 类型 | 目录 | 内容 | 谁写 | 谁读 |
13
+ |------|------|------|------|------|
14
+ | **用户 & 团队** | `memory/` (MEMORY.md 索引) | 团队角色、用户偏好、沟通方式 | AI 记录 | AI 在启动时读取 |
15
+ | **反馈 & 经验** | `memory/` | 用户反馈、经验教训、历史决策 | AI + 用户 | AI 在相关任务时读取 |
16
+ | **项目状态** | `memory/` | 里程碑、活跃模块、TODO、技术债务 | AI 维护 | AI 在规划时读取 |
17
+ | **参考 & 外部** | `memory/` | ADR、外部 API、术语表 | AI + 用户 | 按需读取 |
18
+
19
+ ## 记忆文件格式
20
+
21
+ 每条记忆文件使用以下格式:
22
+
23
+ ```markdown
24
+ # 标题
25
+
26
+ > 记忆元数据
27
+ > - 创建: YYYY-MM-DD
28
+ > - 相关: 关联的模块/功能
29
+ > - 状态: active | archived | deprecated
30
+
31
+ ## 内容
32
+
33
+ 记忆正文...
34
+
35
+ ---
36
+
37
+ ## 相关链接
38
+
39
+ - [相关记忆](../other-memory.md)
40
+ - [相关代码](../../src/modules/xxx.ts)
41
+ ```
42
+
43
+ ### 元数据说明
44
+
45
+ | 字段 | 必填 | 说明 |
46
+ |------|------|------|
47
+ | `创建` | 是 | 该条记忆的创建日期 |
48
+ | `相关` | 否 | 关联的模块、功能、PR 编号等 |
49
+ | `状态` | 否 | `active`(默认)、`archived`(不再相关但保留)、`deprecated`(已过时) |
50
+
51
+ ## MEMORY.md 索引格式
52
+
53
+ `memory/MEMORY.md` 是所有记忆的索引文件,每次对话开始时 AI 会自动读取。
54
+
55
+ ```markdown
56
+ # 记忆索引
57
+
58
+ ## 👤 用户 & 团队
59
+ - [标题](file.md) — 一句话钩子
60
+
61
+ ## 💬 反馈 & 经验
62
+ - [标题](file.md) — 一句话钩子
63
+
64
+ ## 📋 项目状态
65
+ - [标题](file.md) — 一句话钩子
66
+
67
+ ## 📚 参考 & 外部
68
+ - [标题](file.md) — 一句话钩子
69
+ ```
70
+
71
+ ### 索引规则
72
+
73
+ 1. **每行一个记忆文件**,用 `- [标题](相对路径)` 格式
74
+ 2. **一句话钩子**帮助 AI 在启动时判断是否值得深入阅读
75
+ 3. 新增记忆后**立即更新** MEMORY.md
76
+ 4. 已归档的记忆保留索引行,标注 `(archived)`
77
+ 5. 不做硬性分类,四条大类足够
78
+
79
+ ## 写入前置检查清单
80
+
81
+ 在写入或修改任何记忆文件前,检查以下四项:
82
+
83
+ - [ ] **是否重复**: 这条信息是否已经存在于某条记忆中?如果是,更新已有记录而不是新建
84
+ - [ ] **是否有价值**: 这条信息对未来开发有用吗?3 个月后还会需要它吗?
85
+ - [ ] **是否事实**: 这是客观事实还是主观猜测?如是猜测,标注 `(待确认)`
86
+ - [ ] **一个主题一个文件**: 相关事实是否应归入同一条目或同一个文件?
87
+
88
+ ## 何时读取记忆
89
+
90
+ | 场景 | 应该读取 |
91
+ |------|----------|
92
+ | 对话开始时 | MEMORY.md 索引 |
93
+ | 开始新功能 | 用户偏好、相关模块状态 |
94
+ | 遇到错误 | troubleshooting.md |
95
+ | 做技术决策 | architecture-decisions.md |
96
+ | 修 Bug | 相关模块记忆、troubleshooting.md |
97
+ | 用户给反馈 | 反馈历史(避免重复讨论) |
98
+
99
+ ## 记忆目录保护规则
100
+
101
+ > **关键规则:在合并模式下(已有 `.claude/` 目录),`memory/` 目录永不覆盖。**
102
+
103
+ - 合并模式下:`memory/` 目录**完全保留不动**,不写入、不修改、不删除任何文件
104
+ - 覆盖模式下(`--overwrite`):仍保留 `memory/`,但会添加缺失的模板文件
105
+ - 卸载模式下(`--uninstall`):`memory/` 中的文件不列入 manifest,不会被卸载删除
106
+ - 原因:记忆是项目积累的宝贵上下文,新生成的模板不应冲掉已有记录
@@ -0,0 +1,106 @@
1
+ ---
2
+ paths:
3
+ - "**/*"
4
+ ---
5
+
6
+ # 记忆系统使用规则
7
+
8
+ > 本文件定义了 AI 如何读写项目记忆文件。记忆系统是项目的"长期大脑",记录经验、决策和上下文。
9
+
10
+ ## 记忆类型
11
+
12
+ | 类型 | 目录 | 内容 | 谁写 | 谁读 |
13
+ |------|------|------|------|------|
14
+ | **用户 & 团队** | `memory/` (MEMORY.md 索引) | 团队角色、用户偏好、沟通方式 | AI 记录 | AI 在启动时读取 |
15
+ | **反馈 & 经验** | `memory/` | 用户反馈、经验教训、历史决策 | AI + 用户 | AI 在相关任务时读取 |
16
+ | **项目状态** | `memory/` | 里程碑、活跃模块、TODO、技术债务 | AI 维护 | AI 在规划时读取 |
17
+ | **参考 & 外部** | `memory/` | ADR、外部 API、术语表 | AI + 用户 | 按需读取 |
18
+
19
+ ## 记忆文件格式
20
+
21
+ 每条记忆文件使用以下格式:
22
+
23
+ ```markdown
24
+ # 标题
25
+
26
+ > 记忆元数据
27
+ > - 创建: YYYY-MM-DD
28
+ > - 相关: 关联的模块/功能
29
+ > - 状态: active | archived | deprecated
30
+
31
+ ## 内容
32
+
33
+ 记忆正文...
34
+
35
+ ---
36
+
37
+ ## 相关链接
38
+
39
+ - [相关记忆](../other-memory.md)
40
+ - [相关代码](../../src/modules/xxx.ts)
41
+ ```
42
+
43
+ ### 元数据说明
44
+
45
+ | 字段 | 必填 | 说明 |
46
+ |------|------|------|
47
+ | `创建` | 是 | 该条记忆的创建日期 |
48
+ | `相关` | 否 | 关联的模块、功能、PR 编号等 |
49
+ | `状态` | 否 | `active`(默认)、`archived`(不再相关但保留)、`deprecated`(已过时) |
50
+
51
+ ## MEMORY.md 索引格式
52
+
53
+ `memory/MEMORY.md` 是所有记忆的索引文件,每次对话开始时 AI 会自动读取。
54
+
55
+ ```markdown
56
+ # 记忆索引
57
+
58
+ ## 👤 用户 & 团队
59
+ - [标题](file.md) — 一句话钩子
60
+
61
+ ## 💬 反馈 & 经验
62
+ - [标题](file.md) — 一句话钩子
63
+
64
+ ## 📋 项目状态
65
+ - [标题](file.md) — 一句话钩子
66
+
67
+ ## 📚 参考 & 外部
68
+ - [标题](file.md) — 一句话钩子
69
+ ```
70
+
71
+ ### 索引规则
72
+
73
+ 1. **每行一个记忆文件**,用 `- [标题](相对路径)` 格式
74
+ 2. **一句话钩子**帮助 AI 在启动时判断是否值得深入阅读
75
+ 3. 新增记忆后**立即更新** MEMORY.md
76
+ 4. 已归档的记忆保留索引行,标注 `(archived)`
77
+ 5. 不做硬性分类,四条大类足够
78
+
79
+ ## 写入前置检查清单
80
+
81
+ 在写入或修改任何记忆文件前,检查以下四项:
82
+
83
+ - [ ] **是否重复**: 这条信息是否已经存在于某条记忆中?如果是,更新已有记录而不是新建
84
+ - [ ] **是否有价值**: 这条信息对未来开发有用吗?3 个月后还会需要它吗?
85
+ - [ ] **是否事实**: 这是客观事实还是主观猜测?如是猜测,标注 `(待确认)`
86
+ - [ ] **一个主题一个文件**: 相关事实是否应归入同一条目或同一个文件?
87
+
88
+ ## 何时读取记忆
89
+
90
+ | 场景 | 应该读取 |
91
+ |------|----------|
92
+ | 对话开始时 | MEMORY.md 索引 |
93
+ | 开始新功能 | 用户偏好、相关模块状态 |
94
+ | 遇到错误 | troubleshooting.md |
95
+ | 做技术决策 | architecture-decisions.md |
96
+ | 修 Bug | 相关模块记忆、troubleshooting.md |
97
+ | 用户给反馈 | 反馈历史(避免重复讨论) |
98
+
99
+ ## 记忆目录保护规则
100
+
101
+ > **关键规则:在合并模式下(已有 `.claude/` 目录),`memory/` 目录永不覆盖。**
102
+
103
+ - 合并模式下:`memory/` 目录**完全保留不动**,不写入、不修改、不删除任何文件
104
+ - 覆盖模式下(`--overwrite`):仍保留 `memory/`,但会添加缺失的模板文件
105
+ - 卸载模式下(`--uninstall`):`memory/` 中的文件不列入 manifest,不会被卸载删除
106
+ - 原因:记忆是项目积累的宝贵上下文,新生成的模板不应冲掉已有记录
@@ -1,48 +1,117 @@
1
- ---
2
- paths:
3
- - "**/*.ts"
4
- - "**/*.tsx"
5
- - "**/*.js"
6
- - "**/*.jsx"
7
- ---
8
- # TypeScript/JavaScript Patterns
9
-
10
- ## API Response Format
11
-
12
- ```typescript
13
- interface ApiResponse<T> {
14
- success: boolean
15
- data?: T
16
- error?: string
17
- meta?: {
18
- total: number
19
- page: number
20
- limit: number
21
- }
22
- }
23
- ```
24
-
25
- ## Custom Hooks Pattern
26
-
27
- ```typescript
28
- export function useDebounce<T>(value: T, delay: number): T {
29
- const [debouncedValue, setDebouncedValue] = useState<T>(value)
30
- useEffect(() => {
31
- const handler = setTimeout(() => setDebouncedValue(value), delay)
32
- return () => clearTimeout(handler)
33
- }, [value, delay])
34
- return debouncedValue
35
- }
36
- ```
37
-
38
- ## Repository Pattern
39
-
40
- ```typescript
41
- interface Repository<T> {
42
- findAll(filters?: Filters): Promise<T[]>
43
- findById(id: string): Promise<T | null>
44
- create(data: CreateDto): Promise<T>
45
- update(id: string, data: UpdateDto): Promise<T>
46
- delete(id: string): Promise<void>
47
- }
48
- ```
1
+ ---
2
+ paths:
3
+ - "**/*.ts"
4
+ - "**/*.tsx"
5
+ - "**/*.js"
6
+ - "**/*.jsx"
7
+ ---
8
+ # 代码模式规范(Patterns
9
+
10
+ > 本文件定义项目中应遵循的通用代码模式。保持一致性比"最好"更重要。
11
+
12
+ ## API 响应格式
13
+
14
+ ```typescript
15
+ interface ApiResponse<T> {
16
+ success: boolean
17
+ data?: T
18
+ error?: string
19
+ meta?: {
20
+ total: number
21
+ page: number
22
+ limit: number
23
+ }
24
+ }
25
+ ```
26
+
27
+ ## 自定义 Hook 模式(前端)
28
+
29
+ ```typescript
30
+ export function useDebounce<T>(value: T, delay: number): T {
31
+ const [debouncedValue, setDebouncedValue] = useState<T>(value)
32
+ useEffect(() => {
33
+ const handler = setTimeout(() => setDebouncedValue(value), delay)
34
+ return () => clearTimeout(handler)
35
+ }, [value, delay])
36
+ return debouncedValue
37
+ }
38
+ ```
39
+
40
+ ## Repository 模式(后端)
41
+
42
+ ```typescript
43
+ interface Repository<T, CreateDto, UpdateDto> {
44
+ findAll(filters?: FilterOptions): Promise<T[]>
45
+ findById(id: string): Promise<T | null>
46
+ findByUnique(field: keyof T, value: unknown): Promise<T | null>
47
+ create(data: CreateDto): Promise<T>
48
+ update(id: string, data: UpdateDto): Promise<T>
49
+ softDelete?(id: string): Promise<T> // 可选:软删除
50
+ delete(id: string): Promise<void>
51
+ }
52
+ ```
53
+
54
+ ## Service 层模式
55
+
56
+ ```typescript
57
+ @Injectable() // NestJS 示例,其他框架类似
58
+ export class UserService {
59
+ constructor(
60
+ private readonly userRepo: UserRepository,
61
+ private readonly logger: LoggerService,
62
+ ) {}
63
+
64
+ async createUser(dto: CreateUserDto): Promise<User> {
65
+ // 1. 校验
66
+ const exists = await this.userRepo.findByEmail(dto.email)
67
+ if (exists) throw new ConflictException('用户已存在')
68
+
69
+ // 2. 业务逻辑
70
+ const hashedPassword = await hash(dto.password, 10)
71
+
72
+ // 3. 持久化
73
+ const user = await this.userRepo.create({
74
+ ...dto,
75
+ password: hashedPassword,
76
+ })
77
+
78
+ this.logger.info('用户创建成功', { userId: user.id })
79
+ return user
80
+ }
81
+ }
82
+ ```
83
+
84
+ ## 错误处理统一模式
85
+
86
+ > **底层错误收窄技巧(unknown → Error、async/await try-catch)见 `.claude/rules/coding-style.md` § 错误处理**
87
+ > 本节定义业务层错误分类体系,与 coding-style.md 互补。
88
+
89
+ ```typescript
90
+ // 自定义业务错误类
91
+ export class AppError extends Error {
92
+ constructor(
93
+ message: string,
94
+ public statusCode: number = 500,
95
+ public code: string = 'INTERNAL_ERROR',
96
+ ) {
97
+ super(message);
98
+ this.name = 'AppError';
99
+ }
100
+ }
101
+
102
+ // 常用快捷错误
103
+ export class NotFoundError extends AppError {
104
+ constructor(resource: string, id?: string) {
105
+ super(`${resource}${id ? ` (${id})` : ''} 不存在`, 404, 'NOT_FOUND');
106
+ }
107
+ }
108
+
109
+ export class ValidationError extends AppError {
110
+ constructor(details: string) {
111
+ super(details, 400, 'VALIDATION_ERROR');
112
+ }
113
+ }
114
+
115
+ // 使用示例
116
+ if (!user) throw new NotFoundError('User', userId);
117
+ ```