@dianzhong/create-harness-app 0.1.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 (95) hide show
  1. package/dist/index.mjs +412 -0
  2. package/package.json +29 -0
  3. package/templates/axios/.env.example +2 -0
  4. package/templates/axios/src/api/auth.ts +19 -0
  5. package/templates/axios/src/api/request.ts +61 -0
  6. package/templates/axios/src/types/api.ts +26 -0
  7. package/templates/axios/src/utils/auth.ts +5 -0
  8. package/templates/axios/src/utils/storage.ts +17 -0
  9. package/templates/harness/full/.agents/skills/find-skills/SKILL.md +143 -0
  10. package/templates/harness/full/.agents/skills/vue-best-practices/LICENSE.md +21 -0
  11. package/templates/harness/full/.agents/skills/vue-best-practices/SKILL.md +155 -0
  12. package/templates/harness/full/.agents/skills/vue-best-practices/SYNC.md +5 -0
  13. package/templates/harness/full/.agents/skills/vue-best-practices/references/animation-class-based-technique.md +258 -0
  14. package/templates/harness/full/.agents/skills/vue-best-practices/references/animation-state-driven-technique.md +287 -0
  15. package/templates/harness/full/.agents/skills/vue-best-practices/references/component-async.md +99 -0
  16. package/templates/harness/full/.agents/skills/vue-best-practices/references/component-data-flow.md +313 -0
  17. package/templates/harness/full/.agents/skills/vue-best-practices/references/component-fallthrough-attrs.md +179 -0
  18. package/templates/harness/full/.agents/skills/vue-best-practices/references/component-keep-alive.md +139 -0
  19. package/templates/harness/full/.agents/skills/vue-best-practices/references/component-slots.md +226 -0
  20. package/templates/harness/full/.agents/skills/vue-best-practices/references/component-suspense.md +231 -0
  21. package/templates/harness/full/.agents/skills/vue-best-practices/references/component-teleport.md +110 -0
  22. package/templates/harness/full/.agents/skills/vue-best-practices/references/component-transition-group.md +131 -0
  23. package/templates/harness/full/.agents/skills/vue-best-practices/references/component-transition.md +135 -0
  24. package/templates/harness/full/.agents/skills/vue-best-practices/references/composables.md +303 -0
  25. package/templates/harness/full/.agents/skills/vue-best-practices/references/directives.md +168 -0
  26. package/templates/harness/full/.agents/skills/vue-best-practices/references/perf-avoid-component-abstraction-in-lists.md +177 -0
  27. package/templates/harness/full/.agents/skills/vue-best-practices/references/perf-v-once-v-memo-directives.md +185 -0
  28. package/templates/harness/full/.agents/skills/vue-best-practices/references/perf-virtualize-large-lists.md +182 -0
  29. package/templates/harness/full/.agents/skills/vue-best-practices/references/plugins.md +178 -0
  30. package/templates/harness/full/.agents/skills/vue-best-practices/references/reactivity.md +371 -0
  31. package/templates/harness/full/.agents/skills/vue-best-practices/references/render-functions.md +227 -0
  32. package/templates/harness/full/.agents/skills/vue-best-practices/references/sfc.md +355 -0
  33. package/templates/harness/full/.agents/skills/vue-best-practices/references/state-management.md +138 -0
  34. package/templates/harness/full/.agents/skills/vue-best-practices/references/updated-hook-performance.md +193 -0
  35. package/templates/harness/full/.claude/agents/code-reviewer.md +109 -0
  36. package/templates/harness/full/.claude/agents/harness-reviewer.md +51 -0
  37. package/templates/harness/full/.claude/hooks/guard-tool.cjs +234 -0
  38. package/templates/harness/full/.claude/hooks/notify.cjs +168 -0
  39. package/templates/harness/full/.claude/hooks/quality-gate.cjs +135 -0
  40. package/templates/harness/full/.claude/rules/delivery.md +66 -0
  41. package/templates/harness/full/.claude/rules/formatting.md +7 -0
  42. package/templates/harness/full/.claude/rules/git.md +8 -0
  43. package/templates/harness/full/.claude/rules/skills-mcp.md +13 -0
  44. package/templates/harness/full/.claude/rules/vue.md +227 -0
  45. package/templates/harness/full/.claude/settings.json +123 -0
  46. package/templates/harness/full/.claude/skills/find-skills/SKILL.md +143 -0
  47. package/templates/harness/full/.claude/skills/vue-best-practices/LICENSE.md +21 -0
  48. package/templates/harness/full/.claude/skills/vue-best-practices/SKILL.md +155 -0
  49. package/templates/harness/full/.claude/skills/vue-best-practices/SYNC.md +5 -0
  50. package/templates/harness/full/.claude/skills/vue-best-practices/references/animation-class-based-technique.md +258 -0
  51. package/templates/harness/full/.claude/skills/vue-best-practices/references/animation-state-driven-technique.md +287 -0
  52. package/templates/harness/full/.claude/skills/vue-best-practices/references/component-async.md +99 -0
  53. package/templates/harness/full/.claude/skills/vue-best-practices/references/component-data-flow.md +313 -0
  54. package/templates/harness/full/.claude/skills/vue-best-practices/references/component-fallthrough-attrs.md +179 -0
  55. package/templates/harness/full/.claude/skills/vue-best-practices/references/component-keep-alive.md +139 -0
  56. package/templates/harness/full/.claude/skills/vue-best-practices/references/component-slots.md +226 -0
  57. package/templates/harness/full/.claude/skills/vue-best-practices/references/component-suspense.md +231 -0
  58. package/templates/harness/full/.claude/skills/vue-best-practices/references/component-teleport.md +110 -0
  59. package/templates/harness/full/.claude/skills/vue-best-practices/references/component-transition-group.md +131 -0
  60. package/templates/harness/full/.claude/skills/vue-best-practices/references/component-transition.md +135 -0
  61. package/templates/harness/full/.claude/skills/vue-best-practices/references/composables.md +303 -0
  62. package/templates/harness/full/.claude/skills/vue-best-practices/references/directives.md +168 -0
  63. package/templates/harness/full/.claude/skills/vue-best-practices/references/perf-avoid-component-abstraction-in-lists.md +177 -0
  64. package/templates/harness/full/.claude/skills/vue-best-practices/references/perf-v-once-v-memo-directives.md +185 -0
  65. package/templates/harness/full/.claude/skills/vue-best-practices/references/perf-virtualize-large-lists.md +182 -0
  66. package/templates/harness/full/.claude/skills/vue-best-practices/references/plugins.md +178 -0
  67. package/templates/harness/full/.claude/skills/vue-best-practices/references/reactivity.md +371 -0
  68. package/templates/harness/full/.claude/skills/vue-best-practices/references/render-functions.md +227 -0
  69. package/templates/harness/full/.claude/skills/vue-best-practices/references/sfc.md +355 -0
  70. package/templates/harness/full/.claude/skills/vue-best-practices/references/state-management.md +138 -0
  71. package/templates/harness/full/.claude/skills/vue-best-practices/references/updated-hook-performance.md +193 -0
  72. package/templates/harness/full/.editorconfig +8 -0
  73. package/templates/harness/full/.husky/commit-msg +1 -0
  74. package/templates/harness/full/.husky/pre-commit +1 -0
  75. package/templates/harness/full/.lintstagedrc.json +4 -0
  76. package/templates/harness/full/.nvmrc +1 -0
  77. package/templates/harness/full/.oxlintrc.json +11 -0
  78. package/templates/harness/full/.prettierrc.json +6 -0
  79. package/templates/harness/full/AGENTS.md +3 -0
  80. package/templates/harness/full/CLAUDE.md +28 -0
  81. package/templates/harness/full/GEMINI.md +3 -0
  82. package/templates/harness/full/commitlint.config.ts +3 -0
  83. package/templates/harness/full/docs/ai-harness.md +77 -0
  84. package/templates/harness/full/docs/delivery-template.md +66 -0
  85. package/templates/harness/full/docs/git.md +24 -0
  86. package/templates/harness/full/docs/harness-quick-reference.md +89 -0
  87. package/templates/harness/full/docs/review-checklist.md +49 -0
  88. package/templates/harness/full/scripts/harness-hooks.test.mjs +218 -0
  89. package/templates/harness/full/scripts/verify-skills.mjs +248 -0
  90. package/templates/harness/full/scripts/verify-skills.test.mjs +72 -0
  91. package/templates/harness/full/skills-lock.json +50 -0
  92. package/templates/harness/minimal/.claude/hooks/guard-tool.cjs +234 -0
  93. package/templates/harness/minimal/.claude/hooks/quality-gate.cjs +135 -0
  94. package/templates/harness/minimal/.claude/settings.json +27 -0
  95. package/templates/harness/minimal/CLAUDE.md +12 -0
@@ -0,0 +1,193 @@
1
+ ---
2
+ title: Avoid Expensive Operations in Updated Hook
3
+ impact: MEDIUM
4
+ impactDescription: Heavy computations in updated hook cause performance bottlenecks and potential infinite loops
5
+ type: capability
6
+ tags: [vue3, vue2, lifecycle, updated, performance, optimization, reactivity]
7
+ ---
8
+
9
+ # Avoid Expensive Operations in Updated Hook
10
+
11
+ **Impact: MEDIUM** - The `updated` hook runs after every reactive state change that causes a re-render. Placing expensive operations, API calls, or state mutations here can cause severe performance degradation, infinite loops, and dropped frames below the optimal 60fps threshold.
12
+
13
+ Use `updated`/`onUpdated` sparingly for post-DOM-update operations that cannot be handled by watchers or computed properties. For most reactive data handling, prefer watchers (`watch`/`watchEffect`) which provide more control over what triggers the callback.
14
+
15
+ ## Task List
16
+
17
+ - Never perform API calls in updated hook
18
+ - Never mutate reactive state inside updated (causes infinite loops)
19
+ - Use conditional checks to verify updates are relevant before acting
20
+ - Prefer `watch` or `watchEffect` for reacting to specific data changes
21
+ - Use throttling/debouncing if updated operations are expensive
22
+ - Reserve updated for low-level DOM synchronization tasks
23
+
24
+ **BAD:**
25
+
26
+ ```javascript
27
+ // BAD: API call in updated - fires on every re-render
28
+ export default {
29
+ data() {
30
+ return { items: [], lastUpdate: null }
31
+ },
32
+ updated() {
33
+ // This runs after every single state change!
34
+ fetch('/api/sync', {
35
+ method: 'POST',
36
+ body: JSON.stringify(this.items),
37
+ })
38
+ },
39
+ }
40
+ ```
41
+
42
+ ```javascript
43
+ // BAD: State mutation in updated - infinite loop
44
+ export default {
45
+ data() {
46
+ return { renderCount: 0 }
47
+ },
48
+ updated() {
49
+ // This causes another update, which triggers updated again!
50
+ this.renderCount++ // Infinite loop
51
+ },
52
+ }
53
+ ```
54
+
55
+ ```javascript
56
+ // BAD: Heavy computation on every update
57
+ export default {
58
+ updated() {
59
+ // Expensive operation runs on every keystroke, every state change
60
+ this.processedData = this.heavyComputation(this.rawData)
61
+ this.analytics = this.calculateMetrics(this.allData)
62
+ },
63
+ }
64
+ ```
65
+
66
+ **GOOD:**
67
+
68
+ ```javascript
69
+ import debounce from 'lodash-es/debounce'
70
+
71
+ // GOOD: Use watcher for specific data changes
72
+ export default {
73
+ data() {
74
+ return { items: [] }
75
+ },
76
+ watch: {
77
+ // Only fires when items actually changes
78
+ items: {
79
+ handler(newItems) {
80
+ this.syncToServer(newItems)
81
+ },
82
+ deep: true,
83
+ },
84
+ },
85
+ methods: {
86
+ syncToServer: debounce((items) => {
87
+ fetch('/api/sync', {
88
+ method: 'POST',
89
+ body: JSON.stringify(items),
90
+ })
91
+ }, 500),
92
+ },
93
+ }
94
+ ```
95
+
96
+ ```vue
97
+ <!-- GOOD: Composition API with targeted watchers -->
98
+ <script setup>
99
+ import { useDebounceFn } from '@vueuse/core'
100
+ import { onUpdated, ref, watch } from 'vue'
101
+
102
+ const items = ref([])
103
+ const scrollContainer = ref(null)
104
+
105
+ // Watch specific data - not all updates
106
+ watch(
107
+ items,
108
+ (newItems) => {
109
+ syncToServer(newItems)
110
+ },
111
+ { deep: true },
112
+ )
113
+
114
+ const syncToServer = useDebounceFn((items) => {
115
+ fetch('/api/sync', { method: 'POST', body: JSON.stringify(items) })
116
+ }, 500)
117
+
118
+ // Only use onUpdated for DOM synchronization
119
+ onUpdated(() => {
120
+ // Scroll to bottom only if content changed height
121
+ if (scrollContainer.value) {
122
+ scrollContainer.value.scrollTop = scrollContainer.value.scrollHeight
123
+ }
124
+ })
125
+ </script>
126
+ ```
127
+
128
+ ```javascript
129
+ // GOOD: Conditional check in updated hook
130
+ export default {
131
+ data() {
132
+ return {
133
+ content: '',
134
+ lastSyncedContent: '',
135
+ }
136
+ },
137
+ updated() {
138
+ // Only act if specific condition is met
139
+ if (this.content !== this.lastSyncedContent) {
140
+ this.syncContent()
141
+ this.lastSyncedContent = this.content
142
+ }
143
+ },
144
+ methods: {
145
+ syncContent: debounce(() => {
146
+ // Sync logic
147
+ }, 300),
148
+ },
149
+ }
150
+ ```
151
+
152
+ ## Valid Use Cases for Updated Hook
153
+
154
+ ```javascript
155
+ // GOOD: Low-level DOM synchronization
156
+ export default {
157
+ updated() {
158
+ // Sync third-party library with Vue's DOM
159
+ this.thirdPartyWidget.refresh()
160
+
161
+ // Update scroll position after content change
162
+ this.$nextTick(() => {
163
+ this.maintainScrollPosition()
164
+ })
165
+ },
166
+ }
167
+ ```
168
+
169
+ ## Prefer Computed Properties for Derived Data
170
+
171
+ ```javascript
172
+ // BAD: Calculating derived data in updated
173
+ export default {
174
+ data() {
175
+ return { numbers: [1, 2, 3, 4, 5] }
176
+ },
177
+ updated() {
178
+ this.sum = this.numbers.reduce((a, b) => a + b, 0) // Causes another update!
179
+ }
180
+ }
181
+
182
+ // GOOD: Use computed property instead
183
+ export default {
184
+ data() {
185
+ return { numbers: [1, 2, 3, 4, 5] }
186
+ },
187
+ computed: {
188
+ sum() {
189
+ return this.numbers.reduce((a, b) => a + b, 0)
190
+ }
191
+ }
192
+ }
193
+ ```
@@ -0,0 +1,8 @@
1
+ [*.{js,jsx,mjs,cjs,ts,tsx,mts,cts,vue,css,scss,sass,less,styl}]
2
+ charset = utf-8
3
+ indent_size = 2
4
+ indent_style = space
5
+ insert_final_newline = true
6
+ trim_trailing_whitespace = true
7
+ end_of_line = lf
8
+ max_line_length = 100
@@ -0,0 +1 @@
1
+ pnpm commitlint --edit "$1"
@@ -0,0 +1 @@
1
+ pnpm lint-staged
@@ -0,0 +1,4 @@
1
+ {
2
+ "*.{vue,ts,mts,tsx,js,json,md,scss,css}": ["prettier --write"],
3
+ "*.{vue,ts,mts,tsx}": ["eslint --fix --cache", "oxlint --fix"]
4
+ }
@@ -0,0 +1 @@
1
+ 22.12.0
@@ -0,0 +1,11 @@
1
+ {
2
+ "$schema": "./node_modules/oxlint/configuration_schema.json",
3
+ "plugins": ["eslint", "typescript", "unicorn", "oxc", "vue"],
4
+ "env": {
5
+ "browser": true
6
+ },
7
+ "categories": {
8
+ "correctness": "error"
9
+ },
10
+ "ignorePatterns": ["dist/**", "node_modules/**"]
11
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/prettierrc",
3
+ "semi": false,
4
+ "singleQuote": true,
5
+ "printWidth": 100
6
+ }
@@ -0,0 +1,3 @@
1
+ # Agents Guide
2
+
3
+ See CLAUDE.md for the full project guide.
@@ -0,0 +1,28 @@
1
+ # Claude Code 项目指南
2
+
3
+ 本项目由 AI agent 辅助开发。Claude Code 是主要执行工具。
4
+
5
+ ## 项目事实
6
+ - 技术栈:Vue 3、TypeScript、Vite、[在此填写 UI 库]、Pinia、Vue Router。
7
+ - 包管理器:pnpm。
8
+ - (在此补充:API 路径规范、路由约定、业务模型等项目专属信息)
9
+
10
+ ## 工作流
11
+ - 先探索,再编辑;先读相关代码、规则和文档。
12
+ - 优先沿用项目已有模式,不轻易创建新抽象。
13
+ - 修改必须小而确定,可 review、可验证。
14
+
15
+ ## Vue 实现
16
+ 详细规则见 `.claude/rules/vue.md`。
17
+
18
+ ## 质量门禁与安全
19
+ - 一般代码变更运行 `pnpm check`。
20
+ - Harness 变更先运行 `pnpm harness:sync`,再运行 `pnpm harness:check`。
21
+ - 不读取、不写入密钥文件(`.env*`、私钥、证书)。
22
+ - 不自动提交;未经允许不执行破坏性操作。
23
+
24
+ ## Skills 与 Agent
25
+ skill 决策见 `docs/harness-quick-reference.md`。
26
+
27
+ ## Git
28
+ Commit message 使用 Conventional Commits(见 `docs/git.md`)。
@@ -0,0 +1,3 @@
1
+ # Gemini Project Guide
2
+
3
+ See CLAUDE.md for the full project guide.
@@ -0,0 +1,3 @@
1
+ export default {
2
+ extends: ['@commitlint/config-conventional'],
3
+ }
@@ -0,0 +1,77 @@
1
+ # AI Harness 规范
2
+
3
+ 本项目是公司第一个纯 AI 编写项目的工程底座。目标不是依赖某个最强模型的临场发挥,而是通过项目记忆、规则、hooks、subagents、skills 和自动校验,让不同模型在同一轨道上工作。
4
+
5
+ 这里的 harness 指 AI Harness / Claude Code Harness,不是 Harness.io,也不是测试 harness。
6
+
7
+ ## 目标
8
+
9
+ - Claude Code 优先,同时让其他 agent 能从 `AGENTS.md` 读取同一套核心规则。
10
+ - 每次 AI 改动都经过质量门禁和 code review subagent。
11
+ - hooks 跨 macOS 和 Windows 可用,不依赖 `jq`、`bash` 或平台专属通知命令。
12
+ - 重要规范进入仓库,可版本化、可 review、可复用。
13
+
14
+ ## 组成
15
+
16
+ - `CLAUDE.md`:Claude Code 主入口,定义项目事实和执行流程。
17
+ - `AGENTS.md`:模型通用入口,降低不同 agent 的理解差异。
18
+ - `.claude/settings.json`:Claude Code 权限和 hooks 配置。
19
+ - `.claude/hooks/*.cjs`:跨平台 Node hooks。
20
+ - `.claude/agents/*.md`:项目级 review subagents。
21
+ - `.claude/rules/*.md`:可按任务加载的细分规则。
22
+ - `.claude/skills/`:Claude Code 项目 skills 源。
23
+ - `.agents/skills/`:Codex 和其他 agent 使用的项目 skills 镜像。
24
+ - `scripts/verify-skills.mjs`:校验 skills 文档和 lock 是否同步。
25
+ - `scripts/sync-harness-docs.mjs`:校验 harness 文档入口是否完整、是否仍引用废弃清单。
26
+ - `scripts/check-project-structure.mjs`:校验通用前端结构护栏,不固化当前占位业务。
27
+ - `scripts/*.test.mjs`:校验 harness 脚本自身行为,防止门禁脚本静默漂移。
28
+ - `docs/harness-quick-reference.md`:给团队和 AI agent 使用的速查表。
29
+ - `docs/delivery-template.md`:AI 交付说明模板,要求每次交付暴露改动、影响范围、验证、人工复核项、人工决策和剩余风险。
30
+ - `openspec/`:业务规格事实源;`specs/` 保存当前有效规格,`changes/` 保存 PRD 或口头需求变更。
31
+
32
+ ## 事实来源
33
+
34
+ - Harness 配置以源文件为准,不维护单独的 generated 配置清单。
35
+ - 权限和 hooks 以 `.claude/settings.json` 为准。
36
+ - `.claude/settings.local.json` 只允许保存个人本地效率增强,不作为团队事实源。
37
+ - Hook 行为以 `.claude/hooks/*.cjs` 为准。
38
+ - Review agent 定义以 `.claude/agents/*.md` 为准;`.claude/settings.json` 中的 Stop agent 内联 prompt 是当前强制 review 入口。
39
+ - Rules 以 `.claude/rules/*.md` 为准。
40
+ - Skills 以 `.claude/skills/` 为源,`.agents/skills/` 为其他 agent 镜像,`skills-lock.json` 保存校验 hash。
41
+ - 业务规格以 OpenSpec 的 `openspec/specs/` 为准;待确认或待实现的业务变更以 `openspec/changes/<change-id>/` 为准。
42
+ - 人工审核交付格式以 `docs/delivery-template.md` 为准。
43
+
44
+ ## 执行流程
45
+
46
+ 1. 主 agent 探索代码和规则。
47
+ 2. 主 agent 实现变更。
48
+ 3. `Stop` hook 先运行 `pnpm format` 自动修复格式,再运行 `pnpm type-check`、`pnpm lint`、`pnpm harness:check`。注意:Stop hook 有意省略 `openspec:check`(该检查较慢,且仅在业务规格变更时有意义);完整检查请手动运行 `pnpm check`。
49
+ 4. `Stop` agent hook 启动 review subagent。
50
+ 5. review subagent 返回 `HARNESS_REVIEW_RESULT: PASS` 或 `HARNESS_REVIEW_RESULT: FAIL`。
51
+ 6. 通过后发送系统通知;失败时阻止停止并要求主 agent 修复。
52
+ 7. 主 agent 按 `docs/delivery-template.md` 输出人工审核交接单,列出改动、影响范围、验证记录、人工复核项、人工决策和剩余风险。
53
+ 8. 即使强制 review 通过,仍需人工复核后再提交。
54
+
55
+ ## 质量门禁
56
+
57
+ - `pnpm type-check`:Vue + TypeScript 类型校验。
58
+ - `pnpm lint`:oxlint + ESLint。
59
+ - `pnpm format:check`:校验 Prettier 格式一致性。
60
+ - `pnpm check:fix`:显式执行格式化与 lint 自动修复。
61
+ - `pnpm harness:structure`:通用前端结构护栏检查,覆盖 route meta 基础约束、动态菜单组件解析、明显第二套菜单/权限源和高风险 Element Plus 深层覆盖提示。
62
+ - `pnpm harness:test`:运行 harness 脚本测试,覆盖结构检查、skill 校验和 hooks 基础行为。
63
+ - `pnpm harness:check`:skills、docs、lock、入口文档、`.agents/skills` 镜像、项目结构护栏和 harness 脚本测试。
64
+ - `pnpm build`:生产构建校验,适用于构建配置、路由、样式或依赖变更。
65
+
66
+ ## 维护规则
67
+
68
+ - 修改 `.claude/settings.json` 时,必须同步检查 `.claude/hooks/` 和本文件。
69
+ - 修改 `.claude/settings.local.json` 时,不得放宽敏感文件访问、破坏性 Git 或质量门禁;本地特权不写入团队默认配置。
70
+ - 新增或更新 skill:同步规则见 `.claude/rules/skills-mcp.md`,不在此重复。
71
+ - 修改 harness 配置后,先运行 `pnpm harness:sync` 再运行 `pnpm harness:check`。
72
+ - 修改人工审核流程或交付要求时,同步 `docs/review-checklist.md` 和 `docs/delivery-template.md`。
73
+ - 当前业务代码是占位实现,不允许把项目看板、审核流、mock 数据或临时页面形态沉淀为 harness 规则或工程规范。
74
+ - 业务规格(页面布局、字段口径、状态机、角色权限矩阵、接口契约等)统一放在 OpenSpec。当前有效规格沉淀到 `openspec/specs/`;PRD 链接、钉钉文档更新或口头需求变更先建 `openspec/changes/<change-id>/`,明确来源、影响页面、接口影响、验收标准和待确认问题。
75
+ - OpenSpec 不自动进入 Claude Code 默认上下文,由 AI 按任务需要主动 view。harness 文档(本文件、`docs/harness-quick-reference.md`、`docs/development.md`、`.claude/rules/*`、`CLAUDE.md`、`AGENTS.md`、`GEMINI.md`)只引用 OpenSpec 入口,不复制业务内容。
76
+ - 反复使用的业务规则(全局权限矩阵、跨页面状态机)应做成 `.claude/skills/<name>/`,由 AI 按需加载。
77
+ - `quality-gate.cjs stop` 是唯一允许自动格式化的 hook,用于 Stop 收尾;其他 hooks 不得自动格式化、暂存或改写 repo-tracked 文件。`lint-staged` 作为 pre-commit safety net 是另一处显式例外。
@@ -0,0 +1,66 @@
1
+ # AI 交付说明模板
2
+
3
+ 本模板用于让 AI 每次交付都能被人工快速审核。AI 不应只说"完成了"或"检查通过",而要把改动、影响、验证、人工复核项和风险交代清楚。
4
+
5
+ ## 标准格式
6
+
7
+ ```text
8
+ 改动摘要:
9
+ - ...
10
+
11
+ 影响范围:
12
+ - 页面/组件:
13
+ - 权限/角色:
14
+ - 数据/接口:
15
+ - 样式/路由/构建:
16
+
17
+ AI 已验证:
18
+ - pnpm check
19
+ - pnpm build(如适用)
20
+ - 浏览器验证(如适用,写明页面、角色、视口或交互路径)
21
+
22
+ 需要人工复核:
23
+ - ...
24
+
25
+ 人工决策记录:
26
+ - 已确认:
27
+ - 待确认:
28
+
29
+ 剩余风险:
30
+ - ...
31
+ ```
32
+
33
+ ## 填写规则
34
+
35
+ - "改动摘要"写用户能读懂的行为变化,不只列文件名。
36
+ - "影响范围"必须覆盖页面/组件、权限/角色、数据/接口、样式/路由/构建;无影响时写"无"。
37
+ - "AI 已验证"只能写实际运行过的命令或实际打开过的页面,不能代写未运行的检查。
38
+ - "需要人工复核"用于真实业务判断、复杂权限、审批流、状态机、真实接口数据和异常流程。
39
+ - "人工决策记录"记录用户已经确认的业务规则,以及还没确认但会影响验收的事项。
40
+ - "剩余风险"必须写清风险来源,例如 mock 数据、未联调接口、未覆盖角色、未跑构建或未做浏览器验证。
41
+
42
+ ## 人工反馈后的第二版交接
43
+
44
+ 用户指出问题后,AI 应先复述理解并定位相关代码和规则,再判断反馈类型:
45
+
46
+ ```text
47
+ 反馈理解:
48
+ - ...
49
+
50
+ 问题类型:
51
+ - bug / 需求补充 / 业务决策 / 验证遗漏 / 误报
52
+
53
+ 处理结果:
54
+ - ...
55
+
56
+ 重新验证:
57
+ - ...
58
+
59
+ 第二版需要人工复核:
60
+ - ...
61
+
62
+ 更新后的剩余风险:
63
+ - ...
64
+ ```
65
+
66
+ 如果人工确认某条复杂业务规则是长期规则,后续应沉淀到 OpenSpec 规格、类型、测试或代码约束中,而不是只留在聊天记录里。
@@ -0,0 +1,24 @@
1
+ # Git 规范(团队约定)
2
+
3
+ 本文件描述团队提交流程;AI 操作约束见 `.claude/rules/git.md`,不在此重复。
4
+
5
+ ## 分支
6
+
7
+ - `main`:生产稳定分支。
8
+ - `develop`:日常集成分支。
9
+ - `feature/<name>`:功能分支。
10
+ - `fix/<name>`:缺陷修复分支。
11
+ - `chore/<name>`:工程化调整分支。
12
+
13
+ ## Conventional Commits
14
+
15
+ 提交信息使用 Conventional Commits,常用类型:
16
+
17
+ - `feat:` 新功能
18
+ - `fix:` 缺陷修复
19
+ - `docs:` 文档
20
+ - `style:` 样式或格式
21
+ - `refactor:` 重构
22
+ - `chore:` 工程事务
23
+
24
+ `.husky/pre-commit` 运行 `pnpm lint-staged`,提交信息由 `commitlint` 校验。完整质量检查走 `pnpm check`(详见 `docs/harness-quick-reference.md`)。
@@ -0,0 +1,89 @@
1
+ # Harness 速查表
2
+
3
+ 遇到某类任务时,该看哪个规则、用哪个 skill、让哪个 agent review、需要跑哪些命令。详细规范见 `docs/ai-harness.md`。
4
+
5
+ ## Skill 使用决策表
6
+
7
+ | 场景 | 优先使用 | 说明 |
8
+ | ----------------------------------------- | ------------------------- | -------------------------------------------------------------- |
9
+ | Vue、Vite、Pinia、Vue Router、`.vue` 组件 | `vue-best-practices` | 先确认 Composition API、组件边界、响应式数据和类型规则。 |
10
+ | Element Plus 表单、表格、弹窗、主题覆盖 | `element-plus-vue3` | 先查组件用法、props/events、主题和按需导入规则。 |
11
+ | 页面视觉优化、组件美化、前端交互体验 | `frontend-design` | 用于提高 UI 质量,但必须服从项目样式规则和 Element Plus 约束。 |
12
+ | 路由、权限、菜单来源、布局、全局样式 | `project-structure-guard` | 避免破坏后端菜单树动态路由模型和前端结构护栏。 |
13
+ | 不确定是否已有合适 skill | `find-skills` | 先查可用 skill,再决定是否安装或创建项目内 skill。 |
14
+
15
+ Harness 配置、hooks、review agents、skills 同步和治理文档变更没有专用 skill;先读 `docs/ai-harness.md` 和 `.claude/agents/harness-reviewer.md`。
16
+
17
+ ## Agent 使用决策表
18
+
19
+ | 场景 | Agent | 说明 |
20
+ | ----------------------------------------------------- | ------------------ | -------------------------------------------------- |
21
+ | 一般代码变更完成前 | `code-reviewer` | 检查 Vue、TypeScript、权限、路由、样式和质量门禁。 |
22
+ | 修改 `.claude/**`、hooks、rules、skills、harness 文档 | `harness-reviewer` | 检查 harness 配置是否一致、可维护、可跨平台运行。 |
23
+ | Claude Code Stop 阶段 | Stop agent hook | 自动执行强制 review,不需要手动触发。 |
24
+
25
+ `.claude/agents/*.md` 是项目 reviewer 定义;`.claude/settings.json` 中的 Stop agent 内联 prompt 是当前强制 review 入口。
26
+
27
+ ## Hooks 速查
28
+
29
+ | Hook | 作用 |
30
+ | ------------------ | ------------------------------------------------------------------------------------------------------------------- |
31
+ | `guard-tool.cjs` | 阻断危险命令和敏感文件访问。 |
32
+ | `quality-gate.cjs` | Stop 时先自动格式化,再运行 type-check / lint / harness:check(有意省略 openspec:check,完整检查用 `pnpm check`)。 |
33
+ | `notify.cjs` | 处理 macOS/Windows 完成通知和失败通知。 |
34
+
35
+ 详细行为见 `docs/ai-harness.md`。
36
+
37
+ ## 格式化命令
38
+
39
+ 详见 `.claude/rules/formatting.md`。最常用:
40
+
41
+ ```sh
42
+ pnpm format # 全量格式化
43
+ pnpm format:check # 只检查
44
+ pnpm check:fix # 格式化 + lint 修复
45
+ ```
46
+
47
+ ## 常用命令
48
+
49
+ ```sh
50
+ pnpm format # 全量格式化
51
+ pnpm format:check # 只检查
52
+ pnpm check:fix # 格式化 + lint 修复
53
+ pnpm check # 完整质量门禁(type-check + lint + format:check + openspec:check + harness:check)
54
+ pnpm build # 生产构建校验
55
+ pnpm openspec:check # 校验 OpenSpec specs/changes
56
+ pnpm openspec:list # 列出 OpenSpec 变更
57
+ pnpm openspec:specs # 列出 OpenSpec 当前规格
58
+ pnpm harness:sync # 同步 skill lock
59
+ pnpm harness:check # harness 脚本验证
60
+ pnpm harness:structure # 项目结构护栏检查
61
+ pnpm harness:test # harness 脚本测试
62
+ ```
63
+
64
+ 详细格式化规则见 `.claude/rules/formatting.md`。
65
+
66
+ ## OpenSpec 业务规格
67
+
68
+ 产品 PRD、钉钉文档链接和口头需求都是原始输入;可执行的业务规格事实源是 OpenSpec。当前有效规格放在 `openspec/specs/`,每次 PRD 更新或口头变更先建 `openspec/changes/<change-id>/`,再进入代码实现。
69
+
70
+ OpenSpec 只管理业务规格和需求变更;Harness 继续管理 AI 执行规则、hooks、skills、review 和质量门禁。不要把页面业务规则复制进 harness 文档,也不要用 OpenSpec 替代 `pnpm check`、review 或人工复核。
71
+
72
+ ## 本地浏览器验证
73
+
74
+ 涉及新页面、UI 调整、路由权限、表单、弹窗、上传、布局或全局样式时,按 `docs/verification.md` 做本地浏览器验证。纯文档、纯脚本、无运行时 UI 影响的 harness 变更可以不做浏览器验证,但交付说明中要说明原因。
75
+
76
+ ## 人工审核交接单
77
+
78
+ 每次 AI 交付都必须按 `docs/delivery-template.md` 输出交接单,至少包含改动摘要、影响范围、AI 已验证、需要人工复核、人工决策记录、剩余风险。复杂业务场景(真实审批流、角色权限口径、状态机、真实接口数据)必须列入"需要人工复核"。强制 review 通过不代表可以直接提交,人工复核是最终门槛,详见 `docs/review-checklist.md`。
79
+
80
+ ## Harness 变更 Checklist
81
+
82
+ | 步骤 | 检查项 | 参考文档 |
83
+ | ---- | ----------------------------------------------------------------------------------------------------------- | ----------------------------- |
84
+ | 1 | 是否修改了 `.claude/settings.json`、hooks、agents、rules、skills?同步入口文档了吗? | `docs/ai-harness.md` 维护规则 |
85
+ | 2 | 如果新增或修改 skill,是否同步了 `.claude/skills/{skill}`、`.agents/skills/{skill}` 和 `skills-lock.json`? | `.claude/rules/skills-mcp.md` |
86
+ | 3 | 是否运行了 `pnpm harness:sync` 和 `pnpm harness:check`? | `docs/ai-harness.md` 质量门禁 |
87
+ | 4 | 是否需要按 `docs/verification.md` 做本地浏览器验证? | `docs/verification.md` |
88
+ | 5 | 是否确认 Stop 收尾不会自动 `git add`? | `docs/ai-harness.md` 维护规则 |
89
+ | 6 | 是否确认强制 review 通过后仍会安排人工复核? | `docs/delivery-template.md` |
@@ -0,0 +1,49 @@
1
+ # 人工审核流程
2
+
3
+ Claude Code 或其他 agent 完成任务后,提交前必须由人做最终复核。AI 的职责是提供可审核的交接单;人的职责是确认业务判断、真实场景和可接受风险。
4
+
5
+ ## 收到 AI 交接单后
6
+
7
+ - 先看 `docs/delivery-template.md` 中要求的信息是否完整:改动摘要、影响范围、AI 已验证、需要人工复核、人工决策记录、剩余风险。
8
+ - 如果交接单只写"已完成"或"检查通过",要求 AI 补齐交接单后再审。
9
+ - 如果涉及复杂业务,但没有列人工复核项,要求 AI 补充真实业务场景和剩余风险。
10
+ - 如果 AI 声称已验证某个场景,确认它是否说明了验证方式、账号/角色、页面路径、数据条件或命令结果。
11
+
12
+ ## 需求与行为
13
+
14
+ - 需求是否实现完整,没有遗漏显式验收标准。
15
+ - 页面、接口、交互和错误提示是否符合当前需求。
16
+ - 是否引入了未要求的新行为、新抽象或新依赖。
17
+ - 是否误把当前占位业务页面、mock 数据或临时流程沉淀为永久规范。
18
+
19
+ ## 路由、权限与安全
20
+
21
+ - 路由 `meta`、角色与权限控制是否正确。
22
+ - 是否误放宽了访问范围、权限字符串或敏感文件访问边界。
23
+ - 是否出现了不该存在的未类型化边界、宽泛 `any` 或隐式状态来源。
24
+
25
+ ## UI 与代码改动范围
26
+
27
+ - UI 是否符合现有产品风格、Element Plus 使用习惯和样式规则。
28
+ - 是否误改无关文件,尤其是大范围格式化、锁文件之外的杂散修改。
29
+ - hooks、rules、skills、docs 的更新是否和本次治理意图一致。
30
+
31
+ ## 人工反馈方式
32
+
33
+ 人工复核时可以直接指出问题、补充业务规则或确认风险。AI 收到反馈后必须按以下流程处理:
34
+
35
+ 1. 复述理解:说明自己理解的问题是什么。
36
+ 2. 定位范围:检查相关代码、文档、路由、权限、状态或接口边界。
37
+ 3. 判断类型:明确这是 bug、需求补充、业务决策、验证遗漏还是误报。
38
+ 4. 修复或解释:需要修改时再动代码;不修改时说明技术和业务理由。
39
+ 5. 重新验证:运行对应检查,必要时重新做浏览器验证。
40
+ 6. 二次交接:输出第二版交接单,说明修了什么、哪些决策已确认、还剩什么风险。
41
+
42
+ 如果人工确认某条复杂业务规则是长期规则,应要求 AI 后续沉淀到 OpenSpec 规格、类型、测试或代码约束中,而不是只留在聊天记录里。
43
+
44
+ ## 验证记录
45
+
46
+ - 本次实际运行了哪些命令:`pnpm check`、`pnpm build`、`pnpm harness:sync`、`pnpm harness:check`、`pnpm format:check` 等。
47
+ - 涉及可见 UI、布局、路由权限、表单、弹窗或上传时,是否按 `docs/verification.md` 做了本地浏览器验证。
48
+ - 如果某些命令未运行,是否已经在交付说明中记录原因和剩余风险。
49
+ - 强制 review 通过后,是否仍完成了人工最终复核。