claude-apprentice 1.0.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 (39) hide show
  1. package/CHANGELOG.md +112 -0
  2. package/LICENSE +21 -0
  3. package/README.md +311 -0
  4. package/bin/apprentice.js +196 -0
  5. package/install.sh +92 -0
  6. package/package.json +38 -0
  7. package/templates/CLAUDE.md +60 -0
  8. package/templates/commands/backend.md +18 -0
  9. package/templates/commands/frontend.md +18 -0
  10. package/templates/commands/fullstack.md +18 -0
  11. package/templates/commands/scan-todos.md +123 -0
  12. package/templates/commands/spec.md +88 -0
  13. package/templates/memory/architecture.md +55 -0
  14. package/templates/memory/backend-standards.md +84 -0
  15. package/templates/memory/business-logic.md +59 -0
  16. package/templates/memory/frontend-standards.md +89 -0
  17. package/templates/memory/issues.md +34 -0
  18. package/templates/memory/learned-lessons.md +78 -0
  19. package/templates/memory/superpowers-config.md +46 -0
  20. package/templates/rules/INDEX.md +63 -0
  21. package/templates/rules/coding-standards.md +25 -0
  22. package/templates/rules/git-safety.md +9 -0
  23. package/templates/rules/superpowers-workflow.md +15 -0
  24. package/templates/scripts/auto-review.sh +77 -0
  25. package/templates/scripts/health-check.sh +189 -0
  26. package/templates/scripts/init.sh +2476 -0
  27. package/templates/settings.json +23 -0
  28. package/templates/skills/backend-workflow.md +87 -0
  29. package/templates/skills/code-review/SKILL.md +253 -0
  30. package/templates/skills/code-review/standards.md +189 -0
  31. package/templates/skills/frontend-workflow.md +75 -0
  32. package/templates/skills/fullstack-workflow.md +121 -0
  33. package/templates/specs/SPEC-GUIDE.md +99 -0
  34. package/templates/specs/active/README.md +7 -0
  35. package/templates/specs/archived/README.md +10 -0
  36. package/templates/usage-guides/README.md +84 -0
  37. package/templates/usage-guides/bottleneck-navigation.md +146 -0
  38. package/templates/usage-guides/usage-guide-v5.8.md +1261 -0
  39. package/templates/workflow/WORKFLOW-GUIDE.md +78 -0
@@ -0,0 +1,89 @@
1
+ # 前端开发规范
2
+
3
+ ## 组件开发规范
4
+
5
+ ### 命名规范
6
+ - 组件文件名:PascalCase(如:UserList.vue / UserList.tsx)
7
+ - 组件内变量:camelCase
8
+ - 常量:UPPER_SNAKE_CASE
9
+
10
+ ### 组件结构(Vue 3 Composition API)
11
+ ```vue
12
+ <template>
13
+ <!-- 模板内容 -->
14
+ </template>
15
+
16
+ <script setup lang="ts">
17
+ import { ref, computed, onMounted } from 'vue'
18
+
19
+ // 响应式数据
20
+ const list = ref([])
21
+
22
+ // 计算属性
23
+ const total = computed(() => list.value.length)
24
+
25
+ // 方法
26
+ function handleSearch() {}
27
+ </script>
28
+
29
+ <style scoped>
30
+ /* 样式 */
31
+ </style>
32
+ ```
33
+
34
+ ### 组件结构(React Hooks)
35
+ ```tsx
36
+ import { useState, useEffect, useMemo } from 'react'
37
+
38
+ export default function UserList() {
39
+ const [list, setList] = useState([])
40
+
41
+ useEffect(() => {}, [])
42
+
43
+ return <div>...</div>
44
+ }
45
+ ```
46
+
47
+ ## 状态管理规范
48
+
49
+ ### Vue(Pinia)
50
+ ```typescript
51
+ // stores/user.ts
52
+ export const useUserStore = defineStore('user', () => {
53
+ const userInfo = ref(null)
54
+ function setUser(info) { userInfo.value = info }
55
+ return { userInfo, setUser }
56
+ })
57
+ ```
58
+
59
+ ### React(Zustand / Redux Toolkit)
60
+ ```typescript
61
+ // stores/userSlice.ts
62
+ const useUserStore = create((set) => ({
63
+ userInfo: null,
64
+ setUser: (info) => set({ userInfo: info }),
65
+ }))
66
+ ```
67
+
68
+ ## API 调用规范
69
+
70
+ ```typescript
71
+ // api/user.ts
72
+ import request from '@/utils/request'
73
+
74
+ export const getUserList = (params: object) => {
75
+ return request({ url: '/api/users', method: 'get', params })
76
+ }
77
+ ```
78
+
79
+ - API 调用统一走 `api/` 目录模块,不直接写 fetch/axios
80
+ - 必须处理 loading / error / empty 三种状态
81
+
82
+ ## 代码检查工具
83
+
84
+ - ESLint + Prettier:代码质量和格式化
85
+ - TypeScript:类型安全
86
+
87
+ ---
88
+
89
+ **最后更新:** 2026-06-01
@@ -0,0 +1,34 @@
1
+ # 问题记录
2
+
3
+ ## 已解决问题
4
+
5
+ ### 问题1:[问题标题]
6
+ - **发现时间:** YYYY-MM-DD
7
+ - **问题描述:** [详细描述问题现象]
8
+ - **影响范围:** [受影响的功能/模块]
9
+ - **原因分析:** [问题根本原因]
10
+ - **解决方案:** [具体解决方法]
11
+ - **解决时间:** YYYY-MM-DD
12
+ - **相关代码:** [文件路径和行号]
13
+
14
+ ## 待解决问题
15
+
16
+ ### 问题1:[问题标题]
17
+ - **发现时间:** YYYY-MM-DD
18
+ - **问题描述:** [详细描述问题现象]
19
+ - **影响范围:** [受影响的功能/模块]
20
+ - **优先级:** P0/P1/P2/P3
21
+ - **负责人:** [负责人姓名]
22
+ - **预计解决:** YYYY-MM-DD
23
+
24
+ ## 技术债务
25
+
26
+ ### 债务1:[债务描述]
27
+ - **类型:** 代码质量/性能/安全
28
+ - **影响:** [具体影响]
29
+ - **优先级:** P0/P1/P2/P3
30
+ - **预计处理:** YYYY-MM-DD
31
+
32
+ ---
33
+
34
+ **最后更新:** 2026-05-18
@@ -0,0 +1,78 @@
1
+ # 错误驱动的知识积累
2
+
3
+ > 每一条规则对应一个过去 AI 犯过的错误。Agent 犯错 → 加一条规则 → 以后不再犯同类错误。
4
+
5
+ ## 编码错误
6
+
7
+ ### L-001: AI 先写实现再补测试
8
+
9
+ - **错误现象:** AI 直接写完整个实现,然后说"接下来补测试"
10
+ - **根因:** 没有强制 TDD 流程,AI 倾向走捷径
11
+ - **规避规则:** workflow 步骤 3 必须先写失败测试,看到红灯再写实现
12
+ - **添加日期:** 2026-05-27
13
+
14
+ ### L-002: AI mock 所有依赖导致测试无意义
15
+
16
+ - **错误现象:** 测试中 mock 了 Service、DAO、甚至实体类,断言只是在验证 mock 本身
17
+ - **根因:** AI 追求测试通过率,全 mock 最容易通过
18
+ - **规避规则:** 测试中必须有至少一个真实断言(非 mock 返回值),核心逻辑不能全部 mock
19
+ - **添加日期:** 2026-05-27
20
+
21
+ ### L-003: AI 直接修改编译产物或生成文件
22
+
23
+ - **错误现象:** 修改了 dist/、target/、node_modules/ 下的文件
24
+ - **根因:** AI 不知道哪些是生成文件
25
+ - **规避规则:** 编辑前确认文件不在 .gitignore 中,不修改 build 输出目录
26
+ - **添加日期:** 2026-05-27
27
+
28
+ ## 流程错误
29
+
30
+ ### L-004: 长任务中上下文腐化导致质量下降
31
+
32
+ - **错误现象:** 对话超过 40% 上下文后,AI 开始兜圈子、幻觉增多、代码质量下降
33
+ - **根因:** 上下文过长,关键信息被淹没
34
+ - **规避规则:** 复杂任务拆分为子任务,每个子任务独立完成;主动开新对话比在旧对话中继续更高效
35
+ - **添加日期:** 2026-05-27
36
+
37
+ ### L-005: 需求靠对话确认,后续上下文丢失后自由发挥
38
+
39
+ - **错误现象:** 开头说好的约束,执行到一半 AI 忘了,开始自由发挥
40
+ - **根因:** 对话上下文不是可靠的约束载体
41
+ - **规避规则:** 中等+复杂任务必须写 spec 文件,AI 从文件读约束而非聊天记录
42
+ - **添加日期:** 2026-05-27
43
+
44
+ ### L-006: 口头说"应该没问题"就宣布完成
45
+
46
+ - **错误现象:** AI 说"代码改完了,应该没问题"但没有运行任何验证命令
47
+ - **根因:** 没有强制验证闭环
48
+ - **规避规则:** 完成前必须运行验证命令(构建、测试、lint),贴出当前运行结果作为证据
49
+ - **添加日期:** 2026-05-27
50
+
51
+ ## 架构错误
52
+
53
+ ### L-007: Controller 层写业务逻辑
54
+
55
+ - **错误现象:** AI 在 Controller 中直接操作 DAO 或写业务判断
56
+ - **根因:** AI 不了解项目分层约束
57
+ - **规避规则:** coding-standards.md 中明确禁止跨层调用,workflow 步骤 3 按层实现
58
+ - **添加日期:** 2026-05-27
59
+
60
+ ## Loop 层错误
61
+
62
+ ### L-008: 扫描类命令的自指噪声
63
+
64
+ - **错误现象:** `/scan-todos` 在体系目录跑试点,扫到的 12 条匹配全是命令文档自身的 TODO/FIXME 字样,真实待办为 0,报告失真
65
+ - **根因:** 命令文档自己用 `TODO`/`FIXME` 作为说明文字,扫描时没排除命令文件所在目录
66
+ - **规避规则:** 扫描类命令必须排除命令文档所在目录(`.claude/commands/`、`.claude/usage-guides/`),并对剩余结果做"自指过滤"判定(示例/fixture 里的关键字不算真实待办)
67
+ - **沉淀位置:** `commands/scan-todos.md` v2 已加自指过滤规则和情况 A/B 双模板
68
+ - **元教训:** Loop 层试点跑一次就暴露工程问题 — 这正是 Loop 的价值,不是失败
69
+ - **添加日期:** 2026-06-22
70
+
71
+ ---
72
+
73
+ ## 记录规则
74
+
75
+ - **触发条件:** AI 犯了一个新的、有代表性的错误(非偶然失误)
76
+ - **记录内容:** 错误现象 + 根因 + 规避规则 + 日期
77
+ - **后续动作:** 如果是编码层面 → 考虑更新 rules/;如果是流程层面 → 考虑更新 workflow 步骤
78
+ - **维护者:** 任何发现 AI 重复犯同类错误的人
@@ -0,0 +1,46 @@
1
+ # Superpowers 配置
2
+
3
+ ## 启用状态
4
+
5
+ | 阶段 | Skill | 状态 | 说明 |
6
+ |------|-------|------|------|
7
+ | 入口 | using-superpowers | 始终启用 | 自动判断走哪条流程 |
8
+ | 设计 | brainstorming | 条件启用 | 中等以上复杂度触发 |
9
+ | 规划 | writing-plans | 条件启用 | 复杂任务触发 |
10
+ | 隔离 | using-git-worktrees | 条件启用 | 复杂任务触发 |
11
+ | 执行 | subagent-driven-development | 条件启用 | 复杂任务触发 |
12
+ | 测试 | test-driven-development | 条件启用 | 中等以上复杂度触发 |
13
+ | 调试 | systematic-debugging | 始终启用 | 遇到 bug 自动触发 |
14
+ | 审查 | requesting/receiving-code-review | 条件启用 | 复杂任务触发 |
15
+ | 验证 | verification-before-completion | 始终启用 | 完成前必须验证 |
16
+ | 收尾 | finishing-a-development-branch | 条件启用 | 中等以上触发 |
17
+
18
+ ## JSON 配置块
19
+
20
+ <!-- superpowers-config
21
+ {
22
+ "enabled": [
23
+ "verification-before-completion",
24
+ "systematic-debugging"
25
+ ],
26
+ "disabled": [],
27
+ "conditional": {
28
+ "brainstorming": "complexity >= medium",
29
+ "writing-plans": "complexity >= complex",
30
+ "test-driven-development": "complexity >= medium",
31
+ "using-git-worktrees": "complexity >= complex",
32
+ "subagent-driven-development": "complexity >= complex",
33
+ "requesting-code-review": "complexity >= complex",
34
+ "receiving-code-review": "complexity >= complex",
35
+ "finishing-a-development-branch": "complexity >= medium",
36
+ "dispatching-parallel-agents": "manual"
37
+ },
38
+ "complexity": {
39
+ "simple": "单文件修改、样式调整、文案修改(< 30 分钟)",
40
+ "medium": "新组件、新接口、多文件变更(30 分钟 - 2 小时)",
41
+ "complex": "新功能模块、跨前后端、多表多接口(> 2 小时)"
42
+ }
43
+ }
44
+ -->
45
+
46
+ > 修改配置:编辑上方 JSON 注释块。workflow skills 执行时会读取此文件。
@@ -0,0 +1,63 @@
1
+ # Rules 触发条件索引
2
+
3
+ > 让规则可审计、可优化。每条 rule 在什么条件下触发,一目了然。
4
+
5
+ ## 当前规则
6
+
7
+ | 规则文件 | 触发条件 | 规则要点 |
8
+ |---------|---------|---------|
9
+ | `coding-standards.md` | `editing any source code file` | 不引入安全漏洞、不超设计、不写多余注释、命名清晰 |
10
+ | `coding-standards.md` | `creating or modifying backend code` | Controller→Service→DAO 分层,统一响应,异常统一处理 |
11
+ | `coding-standards.md` | `creating or modifying frontend code` | PascalCase 命名,API 走 `api/` 模块,处理 loading/error/empty |
12
+ | `git-safety.md` | `running git commands or creating commits` | 不 force push、不 rm -rf、不跳 hooks、不提交密钥 |
13
+ | `superpowers-workflow.md` | `executing any workflow skill` | 没设计不写代码、没测试不写代码、没验证不说完成 |
14
+ | `superpowers-workflow.md` | `encountering a bug or test failure` | 先找根因再修,连续 3 次失败停下来审视架构 |
15
+
16
+ ## 颗粒度设计
17
+
18
+ 当前覆盖五个场景:
19
+ - **后端代码** — 分层、规范
20
+ - **前端代码** — 组件、API 调用
21
+ - **Git 操作** — 安全红线
22
+ - **Workflow 执行** — 开发铁律
23
+ - **调试** — 根因优先
24
+
25
+ 更细的颗粒度(按语言/框架)由 `init.sh` 自动生成的技术栈专属 rules 处理:
26
+
27
+ | 技术栈 | Rule 文件 |
28
+ |--------|----------|
29
+ | Java/Spring Boot | `spring-boot.md` |
30
+ | Python/FastAPI | `python-api.md` |
31
+ | Vue | `vue-standards.md` |
32
+ | React | `react-standards.md` |
33
+ | Go | `go-standards.md` |
34
+
35
+ ## 是否需要进一步细化?
36
+
37
+ | 触发场景 | 当前条件 | 评估 |
38
+ |---------|---------|------|
39
+ | 编辑代码(通用) | `editing any source code file` | ✅ 兜底通用,保持 |
40
+ | 后端代码 | `creating or modifying backend code` | ✅ 颗粒度合适 |
41
+ | 前端代码 | `creating or modifying frontend code` | ✅ 颗粒度合适 |
42
+ | Git 操作 | `running git commands or creating commits` | ✅ 颗粒度合适 |
43
+
44
+ **结论:** 当前颗粒度合适,不需要进一步细化。`editing any source code file` 是兜底通用规则,不该按语言拆(那是技术栈专属 rules 的事)。
45
+
46
+ ## 维护规则
47
+
48
+ - 新增 rule 时,在 `learned-lessons.md` 记录对应的错误案例
49
+ - 删除 rule 前,确认 `learned-lessons.md` 里对应的错误已不再犯
50
+ - 触发条件改动时,同步更新本索引
51
+ - 加新 rule 前,先查 `bottleneck-navigation.md` 确认瓶颈确实在 Harness 层
52
+
53
+ ## 与其他文档的关系
54
+
55
+ ```
56
+ learned-lessons.md ← 错误登记(为什么有这条 rule)
57
+
58
+ rules/*.md ← 规则本身(规则是什么)
59
+
60
+ INDEX.md ← 规则索引(什么时候触发)— 本文件
61
+
62
+ bottleneck-navigation.md ← 元认知(该不该加 rule)
63
+ ```
@@ -0,0 +1,25 @@
1
+ <important if="editing any source code file">
2
+ 编码标准:
3
+
4
+ - 不引入安全漏洞(SQL 注入、XSS、命令注入等 OWASP Top 10)
5
+ - 不添加超出任务需求的抽象或功能
6
+ - 不写多余注释,只在 WHY 不明显时注释
7
+ - 命名清晰即可,不写解释 WHAT 的注释
8
+ </important>
9
+
10
+ <important if="creating or modifying backend code">
11
+ 后端分层:
12
+
13
+ - Controller 层:只接收请求、参数校验,不写业务逻辑
14
+ - Service 层:业务逻辑,可调用 DAO 或其他 Service
15
+ - DAO/Repository 层:数据访问,不含业务逻辑
16
+ - 禁止跨层调用,统一响应格式,异常统一处理
17
+ </important>
18
+
19
+ <important if="creating or modifying frontend code">
20
+ 前端规范:
21
+
22
+ - 组件文件名 PascalCase,新增前先搜索已有组件
23
+ - API 调用统一通过 `api/` 目录模块,不直接写 fetch/axios
24
+ - 处理 loading / error / empty 三种状态
25
+ </important>
@@ -0,0 +1,9 @@
1
+ <important if="running git commands or creating commits">
2
+ Git 安全规则:
3
+
4
+ - 不执行 `git push --force`
5
+ - 不执行 `rm -rf`
6
+ - 不跳过 hooks(不使用 --no-verify)
7
+ - 创建新 commit 而非 amend(除非明确要求)
8
+ - 不提交含密钥的文件(.env、credentials 等)
9
+ </important>
@@ -0,0 +1,15 @@
1
+ <important if="executing any workflow skill">
2
+ Workflow 执行规则:
3
+
4
+ 1. 没设计不写代码 — 先确认文件、范围、方案
5
+ 2. 没测试不写代码 — 先写失败测试,再写实现
6
+ 3. 没验证不说完成 — 运行验证命令并贴结果
7
+ </important>
8
+
9
+ <important if="encountering a bug or test failure">
10
+ 调试规则:
11
+
12
+ - 先找根因再修,不靠猜
13
+ - 读堆栈 → 复现 → 追踪数据流 → 假设 → 最小改动验证
14
+ - 连续 3 次失败,停下来审视架构
15
+ </important>
@@ -0,0 +1,77 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # 自动 review 最近一次 commit
4
+ #
5
+ # 用法:
6
+ # .claude/scripts/auto-review.sh # review HEAD
7
+ # .claude/scripts/auto-review.sh <commit-hash> # review 指定 commit
8
+ #
9
+ # 配置为 Claude Code PostToolUse hook(异步触发,不阻塞 commit):
10
+ #
11
+ # 在 .claude/settings.json 加:
12
+ #
13
+ # {
14
+ # "hooks": {
15
+ # "PostToolUse": [
16
+ # {
17
+ # "matcher": "Bash",
18
+ # "hooks": [
19
+ # {
20
+ # "type": "command",
21
+ # "command": "bash .claude/scripts/auto-review.sh"
22
+ # }
23
+ # ]
24
+ # }
25
+ # ]
26
+ # }
27
+ # }
28
+ #
29
+ # Hook 触发时,通过 stdin 收到 JSON 载荷(含 tool_name 和 command),
30
+ # 脚本判断是否为 git commit,非 commit 命令直接退出 0。
31
+ #
32
+ # 不想配 hook 时,也可手动调用,或在 Claude Code 对话里说:
33
+ # "review 上次 commit"
34
+ #
35
+
36
+ set -euo pipefail
37
+
38
+ # 从 hook 触发时,判断是不是 git commit
39
+ if [ ! -t 0 ]; then
40
+ PAYLOAD="$(cat 2>/dev/null || true)"
41
+ if echo "$PAYLOAD" | grep -q '"tool_name":"Bash"' 2>/dev/null; then
42
+ if ! echo "$PAYLOAD" | grep -Eq 'git commit' 2>/dev/null; then
43
+ exit 0
44
+ fi
45
+ fi
46
+ fi
47
+
48
+ # 确定要 review 的 commit
49
+ COMMIT="${1:-HEAD}"
50
+
51
+ # 确认在 git 仓库内
52
+ if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
53
+ echo "[auto-review] 不在 git 仓库内,跳过" >&2
54
+ exit 0
55
+ fi
56
+
57
+ REPO_ROOT="$(git rev-parse --show-toplevel)"
58
+ REPORT_DIR="$REPO_ROOT/.claude/reports"
59
+ mkdir -p "$REPORT_DIR"
60
+
61
+ # 检查 ocr 是否可用
62
+ if ! command -v ocr >/dev/null 2>&1; then
63
+ echo "[auto-review] ocr CLI 未安装,跳过自动 review" >&2
64
+ echo "[auto-review] 备选:在 Claude Code 对话里说 'review 上次 commit'" >&2
65
+ exit 0
66
+ fi
67
+
68
+ TIMESTAMP="$(date +%Y%m%d-%H%M%S)"
69
+ REPORT="$REPORT_DIR/auto-review-$TIMESTAMP.md"
70
+
71
+ echo "[auto-review] Reviewing commit $COMMIT..."
72
+ ocr review "$COMMIT" --output "$REPORT" 2>&1 || {
73
+ echo "[auto-review] review 失败,请手动检查 $COMMIT" >&2
74
+ exit 1
75
+ }
76
+
77
+ echo "[auto-review] 报告已生成: $REPORT"
@@ -0,0 +1,189 @@
1
+ #!/bin/bash
2
+ #
3
+ # claude-apprentice 健康巡检脚本
4
+ # 用法: .claude/scripts/health-check.sh
5
+ #
6
+ # 检查项:未归档 spec、知识库过时、CLAUDE.md 膨胀、rules 一致性、错题本、报告目录
7
+ #
8
+
9
+ set -e
10
+
11
+ GREEN='\033[0;32m'
12
+ YELLOW='\033[0;33m'
13
+ RED='\033[0;31m'
14
+ BLUE='\033[0;34m'
15
+ NC='\033[0m'
16
+
17
+ WARN=0
18
+ ERR=0
19
+
20
+ warn() { echo -e "${YELLOW}[WARN]${NC} $1"; WARN=$((WARN + 1)); }
21
+ err() { echo -e "${RED}[ERR]${NC} $1"; ERR=$((ERR + 1)); }
22
+ ok() { echo -e "${GREEN}[OK]${NC} $1"; }
23
+ info() { echo -e "${BLUE}[INFO]${NC} $1"; }
24
+
25
+ # ── 跨平台日期差计算 ─────────────────────────────────────────────────
26
+ # 用法: days_since "YYYY-MM-DD"
27
+ # 输出: 距今天的天数(失败返回 -1)
28
+ days_since() {
29
+ local date_str="$1"
30
+ if command -v python3 >/dev/null 2>&1; then
31
+ python3 -c "
32
+ from datetime import datetime, date
33
+ try:
34
+ d = datetime.strptime('$date_str', '%Y-%m-%d').date()
35
+ print((date.today() - d).days)
36
+ except Exception:
37
+ print(-1)
38
+ " 2>/dev/null || echo -1
39
+ elif command -v python >/dev/null 2>&1; then
40
+ python -c "
41
+ from datetime import datetime, date
42
+ try:
43
+ d = datetime.strptime('$date_str', '%Y-%m-%d').date()
44
+ print((date.today() - d).days)
45
+ except Exception:
46
+ print(-1)
47
+ " 2>/dev/null || echo -1
48
+ elif [[ "$(uname)" == "Darwin" ]]; then
49
+ # macOS BSD date
50
+ local now_ts then_ts
51
+ now_ts=$(date +%s)
52
+ then_ts=$(date -j -f "%Y-%m-%d" "$date_str" +%s 2>/dev/null || echo 0)
53
+ if [ "$then_ts" -gt 0 ]; then
54
+ echo $(( (now_ts - then_ts) / 86400 ))
55
+ else
56
+ echo -1
57
+ fi
58
+ else
59
+ # Linux GNU date
60
+ local now_ts then_ts
61
+ now_ts=$(date +%s)
62
+ then_ts=$(date -d "$date_str" +%s 2>/dev/null || echo 0)
63
+ if [ "$then_ts" -gt 0 ]; then
64
+ echo $(( (now_ts - then_ts) / 86400 ))
65
+ else
66
+ echo -1
67
+ fi
68
+ fi
69
+ }
70
+
71
+ echo "=== claude-apprentice 健康巡检 ==="
72
+ echo ""
73
+
74
+ # ===== 1. CLAUDE.md 行数检查 =====
75
+ info "1. CLAUDE.md 膨胀检查"
76
+ if [ -f "CLAUDE.md" ]; then
77
+ LINES=$(wc -l < CLAUDE.md)
78
+ if [ "$LINES" -gt 80 ]; then
79
+ warn "CLAUDE.md 当前 ${LINES} 行,超过 80 行阈值(目标 < 60 行)"
80
+ echo " 建议:将详细内容移到子文档,CLAUDE.md 只保留目录和核心约束"
81
+ else
82
+ ok "CLAUDE.md ${LINES} 行,在合理范围内"
83
+ fi
84
+ else
85
+ err "CLAUDE.md 不存在"
86
+ fi
87
+
88
+ # ===== 2. Active Spec 积压检查 =====
89
+ info "2. Active Spec 积压检查"
90
+ if [ -d ".claude/specs/active" ]; then
91
+ ACTIVE_COUNT=$(find .claude/specs/active -name "*.md" ! -name "README.md" 2>/dev/null | wc -l | tr -d ' ')
92
+ if [ "$ACTIVE_COUNT" -gt 3 ]; then
93
+ warn "specs/active/ 下有 ${ACTIVE_COUNT} 个未归档 spec"
94
+ echo " 建议:已完成的 spec 应归档到 specs/archived/"
95
+ elif [ "$ACTIVE_COUNT" -eq 0 ]; then
96
+ ok "没有未归档的 spec"
97
+ else
98
+ ok "specs/active/ 下有 ${ACTIVE_COUNT} 个进行中的 spec"
99
+ fi
100
+ else
101
+ warn "specs/active/ 目录不存在"
102
+ fi
103
+
104
+ # ===== 3. 知识库过时检查 =====
105
+ info "3. 知识库更新时间检查"
106
+ if [ -d ".claude/memory" ]; then
107
+ for f in architecture.md frontend-standards.md backend-standards.md business-logic.md; do
108
+ if [ -f ".claude/memory/$f" ]; then
109
+ LAST_UPDATE=$(grep "最后更新" ".claude/memory/$f" 2>/dev/null | head -1 | grep -oE '[0-9]{4}-[0-9]{2}-[0-9]{2}' || echo "unknown")
110
+ if [ "$LAST_UPDATE" != "unknown" ] && [ "$LAST_UPDATE" != "待填写" ]; then
111
+ DAYS_SINCE=$(days_since "$LAST_UPDATE")
112
+ if [ "$DAYS_SINCE" -ge 0 ] && [ "$DAYS_SINCE" -gt 90 ]; then
113
+ warn "memory/$f 已 ${DAYS_SINCE} 天未更新(最后: $LAST_UPDATE)"
114
+ fi
115
+ fi
116
+ fi
117
+ done
118
+ ok "知识库时间检查完成"
119
+ else
120
+ err "memory/ 目录不存在"
121
+ fi
122
+
123
+ # ===== 4. Rules 一致性检查 =====
124
+ info "4. Rules 一致性检查"
125
+ for rule in coding-standards.md git-safety.md superpowers-workflow.md; do
126
+ if [ ! -f ".claude/rules/$rule" ]; then
127
+ err "缺少核心规则文件: rules/$rule"
128
+ fi
129
+ done
130
+ ok "Rules 一致性检查完成"
131
+
132
+ # ===== 5. Superpowers 配置位置检查 =====
133
+ info "5. Superpowers 配置位置检查"
134
+ if [ -f ".claude/memory/superpowers-config.md" ]; then
135
+ ok "superpowers-config.md 在正确位置(memory/)"
136
+ else
137
+ warn "memory/superpowers-config.md 不存在,Superpowers 配置可能还在 CLAUDE.md 中"
138
+ echo " 建议:将配置移到 memory/superpowers-config.md,CLAUDE.md 保持精简"
139
+ fi
140
+
141
+ # ===== 6. Spec 目录结构检查 =====
142
+ info "6. Spec 目录结构检查"
143
+ if [ -d ".claude/specs" ] && [ -f ".claude/specs/SPEC-GUIDE.md" ]; then
144
+ ok "Spec 目录结构完整(SPEC-GUIDE.md + active/ + archived/)"
145
+ else
146
+ warn "Spec 目录结构不完整"
147
+ echo " 建议:确保 specs/SPEC-GUIDE.md、specs/active/、specs/archived/ 都存在"
148
+ fi
149
+
150
+ # ===== 7. 错误积累检查 =====
151
+ info "7. 错误积累机制检查"
152
+ if [ -f ".claude/memory/learned-lessons.md" ]; then
153
+ LESSON_COUNT=$(grep -c "^### L-" ".claude/memory/learned-lessons.md" 2>/dev/null || echo 0)
154
+ ok "learned-lessons.md 存在,已积累 ${LESSON_COUNT} 条教训"
155
+ else
156
+ warn "learned-lessons.md 不存在"
157
+ echo " 建议:创建 memory/learned-lessons.md 记录 AI 常犯错误和规避规则"
158
+ fi
159
+
160
+ # ===== 8. Reports 目录检查 =====
161
+ info "8. Reports 输出目录检查"
162
+ if [ -d ".claude/reports" ]; then
163
+ REPORT_COUNT=$(find .claude/reports -name "*.md" -o -name "*.xlsx" 2>/dev/null | wc -l | tr -d ' ')
164
+ ok "reports/ 目录存在,已有 ${REPORT_COUNT} 份报告"
165
+ else
166
+ warn "reports/ 目录不存在"
167
+ echo " 建议:运行 init.sh 补全,或手动 mkdir -p .claude/reports"
168
+ fi
169
+
170
+ # ===== 9. 流程定义文件检查 =====
171
+ info "9. 流程定义文件检查"
172
+ if [ -f ".claude/workflow/WORKFLOW-GUIDE.md" ]; then
173
+ ok "workflow/WORKFLOW-GUIDE.md 存在"
174
+ else
175
+ warn "缺少 workflow/WORKFLOW-GUIDE.md"
176
+ echo " 建议:运行 init.sh 补全,或手动创建流程定义文件"
177
+ fi
178
+
179
+ # ===== 汇总 =====
180
+ echo ""
181
+ echo "========================================"
182
+ if [ "$ERR" -gt 0 ]; then
183
+ echo -e "${RED}发现 ${ERR} 个错误,${WARN} 个警告${NC}"
184
+ elif [ "$WARN" -gt 0 ]; then
185
+ echo -e "${YELLOW}发现 ${WARN} 个警告,0 个错误${NC}"
186
+ else
187
+ echo -e "${GREEN}所有检查通过!体系健康状态良好。${NC}"
188
+ fi
189
+ echo "========================================"