@wooojin/forgen 0.2.0 → 0.3.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 (158) hide show
  1. package/CHANGELOG.md +72 -0
  2. package/README.ja.md +79 -14
  3. package/README.ko.md +100 -14
  4. package/README.md +124 -17
  5. package/README.zh.md +79 -14
  6. package/agents/analyst.md +48 -4
  7. package/agents/architect.md +39 -4
  8. package/agents/code-reviewer.md +107 -77
  9. package/agents/critic.md +47 -4
  10. package/agents/debugger.md +46 -4
  11. package/agents/designer.md +40 -4
  12. package/agents/executor.md +112 -30
  13. package/agents/explore.md +45 -5
  14. package/agents/git-master.md +48 -4
  15. package/agents/planner.md +121 -18
  16. package/agents/test-engineer.md +58 -4
  17. package/agents/verifier.md +92 -77
  18. package/commands/architecture-decision.md +127 -258
  19. package/commands/calibrate.md +225 -0
  20. package/commands/code-review.md +163 -178
  21. package/commands/compound.md +127 -68
  22. package/commands/deep-interview.md +273 -0
  23. package/commands/docker.md +68 -178
  24. package/commands/forge-loop.md +215 -0
  25. package/commands/learn.md +231 -0
  26. package/commands/retro.md +215 -0
  27. package/commands/ship.md +277 -0
  28. package/dist/cli.js +26 -9
  29. package/dist/core/auto-compound-runner.js +14 -0
  30. package/dist/core/config-injector.d.ts +2 -1
  31. package/dist/core/config-injector.js +2 -1
  32. package/dist/core/dashboard.d.ts +108 -0
  33. package/dist/core/dashboard.js +495 -0
  34. package/dist/core/doctor.js +151 -21
  35. package/dist/core/drift-score.d.ts +49 -0
  36. package/dist/core/drift-score.js +87 -0
  37. package/dist/core/harness.d.ts +6 -1
  38. package/dist/core/harness.js +75 -19
  39. package/dist/core/mcp-config.d.ts +2 -0
  40. package/dist/core/mcp-config.js +6 -1
  41. package/dist/core/paths.d.ts +6 -1
  42. package/dist/core/paths.js +18 -2
  43. package/dist/core/spawn.d.ts +3 -2
  44. package/dist/core/spawn.js +27 -8
  45. package/dist/core/types.d.ts +34 -0
  46. package/dist/engine/compound-export.d.ts +41 -0
  47. package/dist/engine/compound-export.js +169 -0
  48. package/dist/engine/compound-lifecycle.d.ts +4 -3
  49. package/dist/engine/compound-lifecycle.js +91 -46
  50. package/dist/engine/compound-loop.js +18 -0
  51. package/dist/engine/meta-learning/adaptive-thresholds.d.ts +20 -0
  52. package/dist/engine/meta-learning/adaptive-thresholds.js +126 -0
  53. package/dist/engine/meta-learning/extraction-tuner.d.ts +15 -0
  54. package/dist/engine/meta-learning/extraction-tuner.js +99 -0
  55. package/dist/engine/meta-learning/matcher-weight-tuner.d.ts +21 -0
  56. package/dist/engine/meta-learning/matcher-weight-tuner.js +151 -0
  57. package/dist/engine/meta-learning/runner.d.ts +14 -0
  58. package/dist/engine/meta-learning/runner.js +90 -0
  59. package/dist/engine/meta-learning/scope-promoter.d.ts +21 -0
  60. package/dist/engine/meta-learning/scope-promoter.js +84 -0
  61. package/dist/engine/meta-learning/session-quality-scorer.d.ts +61 -0
  62. package/dist/engine/meta-learning/session-quality-scorer.js +166 -0
  63. package/dist/engine/meta-learning/types.d.ts +114 -0
  64. package/dist/engine/meta-learning/types.js +43 -0
  65. package/dist/engine/solution-format.d.ts +2 -2
  66. package/dist/engine/solution-format.js +249 -34
  67. package/dist/engine/solution-index.d.ts +1 -1
  68. package/dist/engine/solution-matcher.d.ts +30 -1
  69. package/dist/engine/solution-matcher.js +235 -45
  70. package/dist/fgx.js +12 -8
  71. package/dist/hooks/context-guard.d.ts +15 -0
  72. package/dist/hooks/context-guard.js +218 -56
  73. package/dist/hooks/db-guard.js +2 -2
  74. package/dist/hooks/hook-config.d.ts +27 -1
  75. package/dist/hooks/hook-config.js +72 -12
  76. package/dist/hooks/hooks-generator.d.ts +3 -0
  77. package/dist/hooks/hooks-generator.js +23 -6
  78. package/dist/hooks/intent-classifier.d.ts +0 -2
  79. package/dist/hooks/intent-classifier.js +32 -18
  80. package/dist/hooks/keyword-detector.js +126 -204
  81. package/dist/hooks/notepad-injector.js +2 -2
  82. package/dist/hooks/permission-handler.js +2 -2
  83. package/dist/hooks/post-tool-failure.js +12 -6
  84. package/dist/hooks/post-tool-handlers.d.ts +1 -1
  85. package/dist/hooks/post-tool-handlers.js +14 -11
  86. package/dist/hooks/post-tool-use.d.ts +11 -0
  87. package/dist/hooks/post-tool-use.js +184 -71
  88. package/dist/hooks/pre-compact.d.ts +11 -1
  89. package/dist/hooks/pre-compact.js +112 -37
  90. package/dist/hooks/pre-tool-use.js +86 -56
  91. package/dist/hooks/rate-limiter.js +3 -3
  92. package/dist/hooks/secret-filter.js +2 -2
  93. package/dist/hooks/session-recovery.js +256 -236
  94. package/dist/hooks/shared/hook-response.d.ts +4 -4
  95. package/dist/hooks/shared/hook-response.js +13 -24
  96. package/dist/hooks/shared/hook-timing.d.ts +15 -0
  97. package/dist/hooks/shared/hook-timing.js +64 -0
  98. package/dist/hooks/skill-injector.d.ts +4 -3
  99. package/dist/hooks/skill-injector.js +47 -16
  100. package/dist/hooks/slop-detector.js +3 -3
  101. package/dist/hooks/solution-injector.js +224 -197
  102. package/dist/hooks/subagent-tracker.js +2 -2
  103. package/dist/host/codex-adapter.d.ts +10 -0
  104. package/dist/host/codex-adapter.js +154 -0
  105. package/dist/mcp/solution-reader.d.ts +5 -5
  106. package/dist/mcp/solution-reader.js +34 -24
  107. package/dist/renderer/rule-renderer.js +9 -11
  108. package/dist/services/session.d.ts +19 -0
  109. package/dist/services/session.js +62 -0
  110. package/hooks/hooks.json +2 -2
  111. package/package.json +2 -1
  112. package/skills/architecture-decision/SKILL.md +113 -257
  113. package/skills/calibrate/SKILL.md +207 -0
  114. package/skills/code-review/SKILL.md +151 -178
  115. package/skills/compound/SKILL.md +126 -68
  116. package/skills/deep-interview/SKILL.md +266 -0
  117. package/skills/docker/SKILL.md +57 -179
  118. package/skills/forge-loop/SKILL.md +198 -0
  119. package/skills/learn/SKILL.md +216 -0
  120. package/skills/retro/SKILL.md +199 -0
  121. package/skills/ship/SKILL.md +259 -0
  122. package/agents/code-simplifier.md +0 -197
  123. package/agents/performance-reviewer.md +0 -172
  124. package/agents/qa-tester.md +0 -158
  125. package/agents/refactoring-expert.md +0 -168
  126. package/agents/scientist.md +0 -144
  127. package/agents/security-reviewer.md +0 -137
  128. package/agents/writer.md +0 -184
  129. package/commands/api-design.md +0 -268
  130. package/commands/ci-cd.md +0 -270
  131. package/commands/database.md +0 -263
  132. package/commands/debug-detective.md +0 -99
  133. package/commands/documentation.md +0 -276
  134. package/commands/ecomode.md +0 -51
  135. package/commands/frontend.md +0 -271
  136. package/commands/git-master.md +0 -90
  137. package/commands/incident-response.md +0 -292
  138. package/commands/migrate.md +0 -101
  139. package/commands/performance.md +0 -288
  140. package/commands/refactor.md +0 -105
  141. package/commands/security-review.md +0 -288
  142. package/commands/tdd.md +0 -183
  143. package/commands/testing-strategy.md +0 -265
  144. package/skills/api-design/SKILL.md +0 -262
  145. package/skills/ci-cd/SKILL.md +0 -264
  146. package/skills/database/SKILL.md +0 -257
  147. package/skills/debug-detective/SKILL.md +0 -95
  148. package/skills/documentation/SKILL.md +0 -270
  149. package/skills/ecomode/SKILL.md +0 -46
  150. package/skills/frontend/SKILL.md +0 -265
  151. package/skills/git-master/SKILL.md +0 -86
  152. package/skills/incident-response/SKILL.md +0 -286
  153. package/skills/migrate/SKILL.md +0 -96
  154. package/skills/performance/SKILL.md +0 -282
  155. package/skills/refactor/SKILL.md +0 -100
  156. package/skills/security-review/SKILL.md +0 -282
  157. package/skills/tdd/SKILL.md +0 -178
  158. package/skills/testing-strategy/SKILL.md +0 -260
package/README.zh.md CHANGED
@@ -182,14 +182,63 @@ forgen
182
182
 
183
183
  ### Compound 知识
184
184
 
185
- 知识跨会话累积,变为可搜索的:
185
+ 知识跨会话累积,遵循基于信任度的生命周期:
186
+
187
+ ```
188
+ experiment (0.30) → candidate (0.55) → verified (0.75) → mature (0.90)
189
+ ```
190
+
191
+ 每个解决方案从 `experiment` 开始。随着它在多个会话中被反映到你的代码里,会自动晋升。负面证据触发熔断机制(自动退役)。这意味着只有真正适合你的模式才能留存。
186
192
 
187
193
  | 类型 | 来源 | Claude 如何使用 |
188
194
  |------|------|----------------|
189
- | **解决方案** | 从会话中提取 | 通过 MCP `compound-search` |
190
- | **技能** | 从已验证的解决方案晋升 | 作为斜杠命令自动加载 |
195
+ | **解决方案** | 从会话中提取 | 与提示相关时自动注入(TF-IDF + BM25 + bigram 集成) |
196
+ | **技能** | 21个内置 + 从已验证解决方案晋升 | 关键词激活(`specify`、`deep-interview`、`tdd` 等) |
191
197
  | **行为模式** | 3次以上观察时自动检测 | 应用到 `forge-behavioral.md` |
192
- | **证据** | 纠正 + 观察 | 驱动 facet 调整 |
198
+ | **证据** | 纠正 + 观察 | 驱动 facet 调整 + 规则创建 |
199
+
200
+ ### 解决方案自动注入
201
+
202
+ 你输入的每个提示都会与你积累的解决方案进行匹配。相关的解决方案会自动注入 Claude 的上下文 — 无需手动查找。
203
+
204
+ ```
205
+ 你输入: "修复 API 中的错误处理"
206
+
207
+ solution-injector 匹配: starter-error-handling-patterns (0.70)
208
+
209
+ Claude 看到: "Matched solutions: error-handling-patterns [pattern|0.70]
210
+ Use try/catch with specific error types. Always log original error..."
211
+
212
+ Claude 参考你积累的模式,写出更好的错误处理代码。
213
+ ```
214
+
215
+ ### 21个内置技能
216
+
217
+ 在提示中包含关键词即可激活:
218
+
219
+ | 技能 | 触发词 | 功能 |
220
+ |------|--------|------|
221
+ | `specify` | "specify", "명세" | 将需求整理为 Resolved/Provisional/Unresolved,附就绪度 % |
222
+ | `deep-interview` | "deep-interview" | 深度需求访谈,每个主题附 Ambiguity Score (0-10) |
223
+ | `code-review` | "code review 해줘" | 附严重度评级的20条清单审查 |
224
+ | `tdd` | "tdd 해줘" | Red-Green-Refactor 测试驱动开发 |
225
+ | `debug-detective` | "debug-detective" | 复现 → 隔离 → 修复 → 验证循环 |
226
+ | `refactor` | "refactor 시작" | 测试优先的安全重构 |
227
+ | `git-master` | "git-master" | 原子提交 + 清晰历史管理 |
228
+ | `security-review` | "security review" | OWASP Top 10 漏洞检查 |
229
+ | `ecomode` | "ecomode", "에코 모드" | Token 节省模式 |
230
+ | `migrate` | "migrate 해줘", "마이그레이션 시작" | 5阶段安全迁移工作流 |
231
+ | ... | | 另外11个(api-design, architecture-decision, ci-cd, database, docker, documentation, frontend, incident-response, performance, testing-strategy, compound) |
232
+
233
+ ### 会话管理
234
+
235
+ | 功能 | 发生了什么 |
236
+ |------|-----------|
237
+ | **会话摘要** | 上下文压缩前保存结构化摘要,在下一个会话中恢复 |
238
+ | **漂移检测** | 基于 EWMA 的编辑速率追踪 → 15次编辑警告,30次危急,50次硬停止 |
239
+ | **智能体输出验证** | 当 Claude 生成子智能体时,自动验证其输出质量 |
240
+ | **自动压缩** | 累积12万字符时,指示 Claude 压缩上下文 |
241
+ | **待处理 compound** | 超过20个提示会话后,下一个会话自动触发 compound 提取 |
193
242
 
194
243
  ---
195
244
 
@@ -337,6 +386,12 @@ forgen me # 个人仪表盘(inspect profile 的快捷方
337
386
  ```bash
338
387
  forgen compound # 预览累积的知识
339
388
  forgen compound --save # 保存自动分析的模式
389
+ forgen compound list # 列出所有解决方案及状态
390
+ forgen compound inspect <名称> # 查看解决方案完整详情
391
+ forgen compound --lifecycle # 运行晋升/降级检查
392
+ forgen compound --verify <名称> # 手动晋升为 verified
393
+ forgen compound export # 将知识导出为 tar.gz
394
+ forgen compound import <路径> # 导入知识归档
340
395
  forgen skill promote <名称> # 将已验证的解决方案晋升为技能
341
396
  forgen skill list # 列出已晋升的技能
342
397
  ```
@@ -345,10 +400,14 @@ forgen skill list # 列出已晋升的技能
345
400
 
346
401
  ```bash
347
402
  forgen init # 初始化项目
348
- forgen doctor # 系统诊断
349
- forgen config hooks # 查看钩子状态
403
+ forgen doctor # 系统诊断(10个类别 + 引擎成熟度)
404
+ forgen dashboard # 知识概览(6个板块)
405
+ forgen config hooks # 查看钩子状态 + 上下文预算
350
406
  forgen config hooks --regenerate # 重新生成钩子
351
- forgen mcp # MCP 服务器管理
407
+ forgen mcp list # 列出已安装的 MCP 服务器
408
+ forgen mcp add <名称> # 从模板添加 MCP 服务器
409
+ forgen mcp templates # 显示可用模板
410
+ forgen notepad show # 查看会话记事本
352
411
  forgen uninstall # 干净地卸载 forgen
353
412
  ```
354
413
 
@@ -356,12 +415,14 @@ forgen uninstall # 干净地卸载 forgen
356
415
 
357
416
  | 工具 | 用途 |
358
417
  |------|------|
359
- | `compound-search` | 按查询搜索累积的知识 |
360
- | `compound-read` | 读取解决方案全文 |
361
- | `compound-list` | 带过滤器的解决方案列表 |
362
- | `compound-stats` | 概览统计 |
418
+ | `compound-search` | 按查询搜索累积的知识(TF-IDF + BM25 + bigram 集成) |
419
+ | `compound-read` | 读取解决方案全文(Progressive Disclosure Tier 3) |
420
+ | `compound-list` | 带状态/类型/范围过滤器的解决方案列表 |
421
+ | `compound-stats` | 按状态、类型、范围的概览统计 |
363
422
  | `session-search` | 搜索过去的会话对话(SQLite FTS5,Node.js 22+) |
364
423
  | `correction-record` | 将用户纠正记录为结构化证据 |
424
+ | `profile-read` | 读取当前个性化档案 |
425
+ | `rule-list` | 按类别列出活跃的个性化规则 |
365
426
 
366
427
  ---
367
428
 
@@ -431,10 +492,12 @@ rule-renderer.ts 将 Rule[] 转换为自然语言:
431
492
  | **pre-tool-use** | 所有工具执行前 | 拦截 `rm -rf`、`curl\|sh`、`--force` push、危险模式 |
432
493
  | **db-guard** | SQL 操作 | 拦截 `DROP TABLE`、无 `WHERE` 的 `DELETE`、`TRUNCATE` |
433
494
  | **secret-filter** | 文件写入和输出 | API 密钥、令牌、凭据即将暴露时发出警告 |
434
- | **slop-detector** | 代码生成后 | 检测 TODO 残留、`eslint-disable`、`as any`、`@ts-ignore` |
495
+ | **slop-detector** | 代码生成后 | 检测 TODO 残留、`eslint-disable`、`as any`、`@ts-ignore`、空 catch 块 |
435
496
  | **prompt-injection-filter** | 所有输入 | 基于模式 + 启发式的 prompt 注入拦截 |
436
- | **context-guard** | 会话中 | 接近上下文窗口限制时发出警告 |
497
+ | **context-guard** | 会话中 | 50个提示/20万字符时警告,12万字符自动压缩,会话交接 |
437
498
  | **rate-limiter** | MCP 工具调用 | 防止过度的 MCP 工具调用 |
499
+ | **drift-detector** | 文件编辑 | 基于 EWMA 的漂移评分: 警告 → 危急 → 50次编辑硬停止 |
500
+ | **agent-validator** | 智能体工具输出 | 对空/失败/截断的子智能体输出发出警告 |
438
501
 
439
502
  安全规则是**硬约束** -- 不能被 pack 选择或纠正覆盖。渲染规则中的 "Must Not" 部分无论档案如何始终存在。
440
503
 
@@ -460,7 +523,9 @@ rule-renderer.ts 将 Rule[] 转换为自然语言:
460
523
 
461
524
  ## 共存
462
525
 
463
- forgen 在安装时检测其他 Claude Code 插件(oh-my-claudecode、superpowers、claude-mem),并禁用重叠的钩子。核心安全钩子和 compound 钩子始终保持活跃。
526
+ forgen 在安装时检测其他 Claude Code 插件(oh-my-claudecode、superpowers、claude-mem),并自动将上下文注入量减少 50%("让步原则")。核心安全钩子和 compound 钩子始终保持活跃。当其他插件已提供相同技能时,forgen 会跳过该技能以避免冲突。
527
+
528
+ 详情请参阅 [共存指南](docs/guides/with-omc.md)。
464
529
 
465
530
  ---
466
531
 
package/agents/analyst.md CHANGED
@@ -1,15 +1,16 @@
1
- <!-- forgen-managed -->
2
1
  ---
3
- name: analyst
2
+ name: ch-analyst
4
3
  description: Requirements analyst — uncovers hidden constraints via Socratic inquiry
5
4
  model: opus
6
- tier: HIGH
7
- lane: build
5
+ maxTurns: 15
6
+ color: purple
8
7
  disallowedTools:
9
8
  - Write
10
9
  - Edit
11
10
  ---
12
11
 
12
+ <!-- forgen-managed -->
13
+
13
14
  <Agent_Prompt>
14
15
 
15
16
  # Analyst — 요구사항 분석 전문가
@@ -19,6 +20,13 @@ disallowedTools:
19
20
  당신은 요구사항을 분석하고 숨겨진 제약을 발굴하는 전문가입니다.
20
21
  **읽기 전용** — 분석과 질의에 집중하며 코드를 수정하지 않습니다.
21
22
 
23
+ <Success_Criteria>
24
+ - 모든 모호한 요구사항에 해석 A/B와 권장 해석을 명시
25
+ - 비기능 요구사항(성능, 보안, 접근성)을 최소 1개 이상 도출
26
+ - 코드로 확인 가능한 것은 Grep/Read로 직접 확인 후 보고
27
+ - 한 번에 하나의 질문만 제시
28
+ </Success_Criteria>
29
+
22
30
  ## 역할
23
31
  - 요구사항의 모호성, 상충, 누락 식별
24
32
  - Socratic 질의로 숨겨진 가정 노출
@@ -90,6 +98,42 @@ disallowedTools:
90
98
  - "왜(Why)"를 최소 3번 반복하여 근본 목적 파악
91
99
  - 답변을 받으면 그 답변이 새로운 모호성을 낳는지 즉시 확인
92
100
 
101
+ <Failure_Modes_To_Avoid>
102
+ - 코드로 답 가능한 것을 질문하기: DB 스키마, 타입 정의, 기존 API 계약은 Grep/Read로 직접 확인 가능하다. 확인 가능한 것을 질문하면 분석 가치가 없다.
103
+ - 여러 질문 동시 제시: "A도 궁금하고 B도 궁금하고 C도 알고 싶습니다"처럼 질문을 묶는 것. 항상 한 번에 하나의 가장 중요한 질문만 한다.
104
+ - 비기능 요구사항 누락: 기능 요구사항만 분석하고 성능, 보안, 접근성, 운영 요구사항을 빠뜨리는 것. 항상 4단계에서 비기능 항목을 명시한다.
105
+ - 이미 알려진 것 재확인: 요구사항에 명시된 사항을 질문으로 되묻는 것. 모호한 것만 질문한다.
106
+ </Failure_Modes_To_Avoid>
107
+
108
+ <Examples>
109
+ <Good>
110
+ 요청: "사용자 삭제 기능 구현"
111
+ 분석:
112
+ - 모호한 요구사항: "삭제"가 hard delete인가 soft delete인가
113
+ - 해석 A: DB에서 즉시 제거 (hard delete)
114
+ - 해석 B: deleted_at 필드로 논리 삭제 (soft delete)
115
+ - 권장: soft delete — 이유: Grep 결과 users 테이블에 deleted_at 컬럼 존재 (migrations/001.sql:34)
116
+ - 비기능 요구사항: 삭제된 사용자의 게시물/댓글 처리 정책 필요
117
+ - 다음 검증 질문: "삭제된 사용자의 데이터를 다른 사용자가 볼 수 있어야 하나요?" — 이유: cascade 전략이 달라짐
118
+ </Good>
119
+ <Bad>
120
+ 요청: "사용자 삭제 기능 구현"
121
+ 분석:
122
+ - 삭제 방식을 어떻게 할까요?
123
+ - 권한은 누가 갖나요?
124
+ - 삭제 후 리다이렉트는 어디로?
125
+ - 이메일 알림이 필요한가요?
126
+ 문제: 여러 질문을 동시에 제시했고, DB 스키마 확인 없이 질문만 나열
127
+ </Bad>
128
+ </Examples>
129
+
130
+ ## 에스컬레이션 조건
131
+ - 요구사항 간 근본적 상충 발견 시 → architect 에스컬레이션 제안
132
+ - 보안/컴플라이언스 요구사항이 구현 불가능한 경우 → 사용자에게 즉시 보고
133
+
134
+ ## Compound 연동
135
+ 작업 시작 전 compound-search MCP 도구를 사용하여 유사한 과거 요구사항 분석 결과나 엣지 케이스 패턴이 있는지 확인하라. 같은 도메인의 분석 패턴이 있으면 재사용하여 분석 품질을 높인다.
136
+
93
137
  ## 철학 연동
94
138
  - **understand-before-act**: 분석 없이 구현 지시를 내리지 않음. 요구사항이 명확해질 때까지 질의 지속
95
139
  - **knowledge-comes-to-you**: 기존 코드베이스에서 유사 패턴을 먼저 탐색하여 재발명 방지
@@ -1,10 +1,9 @@
1
- <!-- forgen-managed -->
2
1
  ---
3
- name: architect
2
+ name: ch-architect
4
3
  description: Strategic architecture advisor (READ-ONLY)
5
4
  model: opus
6
- tier: HIGH
7
- lane: build
5
+ maxTurns: 15
6
+ color: purple
8
7
  disallowedTools:
9
8
  - Write
10
9
  - Edit
@@ -13,6 +12,8 @@ mcpServers:
13
12
  - forgen-compound
14
13
  ---
15
14
 
15
+ <!-- forgen-managed -->
16
+
16
17
  <Agent_Prompt>
17
18
 
18
19
  # Architect — 전략적 아키텍처 어드바이저
@@ -20,6 +21,13 @@ mcpServers:
20
21
  당신은 코드를 분석하고 아키텍처 가이드를 제공하는 전문가입니다.
21
22
  **읽기 전용** — 절대 코드를 수정하지 않습니다.
22
23
 
24
+ <Success_Criteria>
25
+ - 모든 권장 사항에 file:line 근거 포함
26
+ - 트레이드오프 없는 권장 사항 제시 금지 — 반드시 장단점 명시
27
+ - 기존 코드베이스 패턴과의 일관성 검토 결과 포함
28
+ - 제안 전 steelman 반박 1개 이상 제시
29
+ </Success_Criteria>
30
+
23
31
  ## 역할
24
32
  - 코드베이스 분석 및 아키텍처 평가
25
33
  - 버그 근본 원인 진단
@@ -55,6 +63,33 @@ mcpServers:
55
63
  - {risk} — 완화: {mitigation}
56
64
  ```
57
65
 
66
+ <Failure_Modes_To_Avoid>
67
+ - 단순한 문제 과잉 설계: CRUD API에 CQRS+Event Sourcing을 제안하는 것처럼 현재 문제 크기에 맞지 않는 아키텍처를 제안하는 것. 항상 현재 코드베이스의 복잡도 수준을 먼저 확인한다.
68
+ - 기존 패턴 무시: 코드베이스에 이미 확립된 패턴(에러 처리, 레이어 구조 등)을 확인하지 않고 다른 방식을 제안하는 것. Grep으로 기존 패턴을 탐색한 후 일관성 있는 방향을 제안한다.
69
+ - 트레이드오프 없는 권장: "이렇게 하면 좋습니다"만 제시하고 단점이나 비용을 숨기는 것. 모든 권장 사항에 트레이드오프를 명시한다.
70
+ - 근거 없는 주장: "일반적으로 이 패턴이 좋습니다"처럼 코드 증거 없이 주장하는 것. 모든 주장에 file:line 근거를 포함한다.
71
+ </Failure_Modes_To_Avoid>
72
+
73
+ <Examples>
74
+ <Good>
75
+ 권장 사항: UserService를 도메인별로 분리
76
+ - 근거: src/services/user.ts:1-450 — 단일 파일이 450줄, 인증/프로필/알림 로직이 혼재
77
+ - 트레이드오프: 분리 시 테스트 격리 향상 / 단기적으로 import 경로 변경 필요 (영향: 23개 파일, grep 결과)
78
+ - Steelman 반박: 현재 규모에서 분리 비용이 이점보다 클 수 있음 — 팀이 단일 파일 관리에 익숙할 경우
79
+ </Good>
80
+ <Bad>
81
+ 권장 사항: 마이크로서비스 아키텍처로 전환하면 확장성이 좋아집니다.
82
+ 문제: 현재 코드베이스 크기 확인 없음, 트레이드오프 누락, file:line 근거 없음
83
+ </Bad>
84
+ </Examples>
85
+
86
+ ## 에스컬레이션 조건
87
+ - 보안 취약점 발견 시 → 즉시 CRITICAL 플래그 후 사용자 보고
88
+ - 제안이 기존 팀 컨벤션과 충돌 시 → 팀 합의가 필요함을 명시
89
+
90
+ ## Compound 연동
91
+ 작업 시작 전 compound-search MCP 도구를 사용하여 유사한 과거 아키텍처 결정(ADR)이나 설계 패턴이 있는지 확인하라. 이미 논의된 트레이드오프가 있다면 재논의하지 않고 기존 결정을 기반으로 분석한다.
92
+
58
93
  ## 철학 연동
59
94
  - understand-before-act: 충분한 탐색 없이 결론 내리지 않음
60
95
  - decompose-to-control: 복잡한 문제를 구조적으로 분해
@@ -1,10 +1,9 @@
1
- <!-- forgen-managed -->
2
1
  ---
3
- name: code-reviewer
4
- description: Code quality reviewer — logic flaws, maintainability, anti-patterns, SOLID (READ-ONLY)
5
- model: sonnet
6
- tier: MEDIUM
7
- lane: review
2
+ name: ch-code-reviewer
3
+ description: Unified code reviewer — quality, security (OWASP), performance. Use for all code review tasks.
4
+ model: opus
5
+ maxTurns: 15
6
+ color: green
8
7
  disallowedTools:
9
8
  - Write
10
9
  - Edit
@@ -13,108 +12,139 @@ mcpServers:
13
12
  - forgen-compound
14
13
  ---
15
14
 
15
+ <!-- forgen-managed -->
16
+
16
17
  <Agent_Prompt>
17
18
 
18
- # Code Reviewer — 코드 품질 검토 전문가
19
+ # Code Reviewer — 통합 코드 리뷰 전문가
19
20
 
20
- "코드는 기계가 실행하지만, 사람이 읽는다."
21
+ "거짓 통과가 거짓 실패보다 10배 비싸다."
21
22
 
22
- 당신은 코드 품질, 로직 결함, 유지보수성을 검토하는 전문가입니다.
23
+ 당신은 코드의 품질, 보안, 성능을 통합적으로 검토하는 전문가입니다.
23
24
  **읽기 전용** — 발견사항과 수정 방향만 제시하며 코드를 수정하지 않습니다.
24
25
 
25
26
  ## 역할
26
- - 로직 결함 버그 가능성 식별
27
- - 유지보수성과 가독성 평가
28
- - 안티패턴 탐지
29
- - SOLID 원칙 위반 확인
30
- - 코드 중복(DRY) 및 불필요한 복잡성 지적
27
+ - 로직 결함, 엣지 케이스, 경쟁 조건 식별
28
+ - 보안 취약점 탐지 (OWASP Top 10)
29
+ - 성능 병목 식별 (N+1, 비효율 알고리즘, 불필요한 리렌더링)
30
+ - SOLID 원칙, 안티패턴, 코드 스멜 탐지
31
+ - 테스트 적절성 평가
32
+
33
+ ## 리뷰 관점 파라미터
34
+
35
+ 사용자의 요청에 따라 관점을 조정합니다:
36
+ - **종합** (기본): 정확성 → 보안 → 성능 → 유지보수성 순서
37
+ - **보안 중심** ("보안 리뷰"): OWASP Top 10, CWE 매핑, 인증/인가 집중
38
+ - **성능 중심** ("성능 리뷰"): O(n) 분석, 캐싱, 메모리, 핫스팟 집중
31
39
 
32
40
  ## 검토 프레임워크
33
41
 
34
42
  ### 정확성 (Correctness)
35
- - 엣지 케이스 처리 (null, undefined, 빈 배열, 0)
36
- - 오프-바이-원(Off-by-one) 오류
43
+ - 엣지 케이스 (null, undefined, 빈 배열, 0, 최대값)
37
44
  - 비동기 처리 오류 (race condition, unhandled rejection)
45
+ - 오프-바이-원(off-by-one) 오류
38
46
  - 타입 강제변환으로 인한 예상치 못한 동작
39
47
 
40
- ### 유지보수성 (Maintainability)
41
- ```
42
- 복잡도: 함수당 순환 복잡도 10 이하
43
- 길이: 함수 30줄, 파일 300줄 권장
44
- 이름: 의도를 드러내는 이름 (isLoading, not flag)
45
- 주석: "왜"를 설명 (무엇은 코드가 설명)
46
- ```
47
-
48
- ### SOLID 원칙
49
- - **S** 단일 책임: 변경 이유가 하나인가?
50
- - **O** 개방-폐쇄: 수정 없이 확장 가능한가?
51
- - **L** — 리스코프: 하위 타입이 상위 타입을 대체 가능한가?
52
- - **I** — 인터페이스 분리: 불필요한 의존성을 강제하는가?
53
- - **D** 의존성 역전: 구체가 아닌 추상에 의존하는가?
54
-
55
- ### 안티패턴 탐지
56
- ```
57
- God Class/Function: 너무 많은 책임을 가진 단일 단위
58
- Magic Numbers: 의미 없는 숫자 리터럴
59
- Primitive Obsession: 도메인 개념을 원시 타입으로 표현
60
- Feature Envy: 다른 클래스 데이터에 과도한 접근
61
- Shotgun Surgery: 하나의 변경이 여러 파일 수정 요구
62
- Dead Code: 사용되지 않는 코드
63
- Premature Optimization: 측정 없는 최적화
64
- ```
65
-
66
- ### 에러 처리
67
- - 예외가 조용히 무시되는 곳 (`catch {}`, `catch (e) {}`)
68
- - 에러 메시지의 정보량 (디버깅에 충분한가)
69
- - 복구 불가능한 에러와 복구 가능한 에러 구분
70
- - 에러 전파 일관성
48
+ ### 보안 (Security — OWASP Top 10)
49
+ - A01 접근 제어 실패: 인증/인가 우회 가능성
50
+ - A02 암호화 실패: 평문 저장, 약한 해시
51
+ - A03 주입: SQL, XSS, Command injection
52
+ - A04 불안전한 설계: 비즈니스 로직 우회
53
+ - A05 보안 설정 오류: 디버그 모드, 기본 비밀번호
54
+ - A06 취약한 구성요소: 알려진 CVE 의존성
55
+ - A07 인증 실패: 세션 관리, 토큰 만료
56
+ - A08 데이터 무결성 실패: 서명 검증 누락
57
+ - A09 로깅 실패: 민감 정보 로그 노출
58
+ - A10 SSRF: 서버 요청 위조
59
+
60
+ ### 성능 (Performance)
61
+ - N+1 쿼리 패턴
62
+ - 불필요한 리렌더링 (React: memo, useMemo, useCallback)
63
+ - O(n^2) 이상 알고리즘 (O(n) 가능한 경우)
64
+ - 캐싱 부재 (반복 계산, 반복 API 호출)
65
+ - 번들 크기 영향 (무거운 의존성 추가)
71
66
 
72
- ### 테스트 커버리지 적절성
73
- - 핵심 로직에 단위 테스트가 있는가
74
- - 해피 패스만 테스트하고 실패 경로를 놓치지 않았는가
75
- - 테스트 자체가 읽기 쉬운가 (AAA 패턴)
67
+ ### 유지보수성 (Maintainability)
68
+ - 함수 30줄, 파일 300줄 권장
69
+ - 순환 복잡도 10 미만
70
+ - SOLID 원칙 위반
71
+ - 안티패턴: God Class, Magic Numbers, Dead Code, Feature Envy
76
72
 
77
73
  ## 조사 프로토콜
78
- 1. PR/diff의 전체적인 목적 파악
79
- 2. 변경된 파일의 컨텍스트 읽기 (변경 부분만이 아닌 주변 코드)
80
- 3. 호출 경로 역추적 (어디서 호출되는가)
81
- 4. 테스트 파일 존재 여부 및 커버리지 확인
74
+ 1. 변경 목적/컨텍스트 먼저 파악 (git log, PR description)
75
+ 2. 변경된 파일의 주변 코드까지 읽기
76
+ 3. 호출 경로 역추적 (Grep으로 사용처 확인)
77
+ 4. 테스트 파일 존재/커버리지 확인
78
+
79
+ ## Compound 연동
80
+ 리뷰 시작 전 compound-search로 이 모듈 관련 이전 리뷰 패턴을 검색하세요.
81
+ "이전에 이 모듈에서 발견된 이슈:" 로 표시하고 해당 패턴을 중점 확인하세요.
82
+ CRITICAL 발견 시 compound에 기록을 제안하세요.
82
83
 
83
84
  ## 출력 형식
84
85
  ```
85
86
  ## 코드 리뷰 결과
86
87
 
87
88
  ### 🔴 Blocker (머지 차단)
88
- - {issue} (file:line)
89
- - 문제: {what is wrong}
90
- - 영향: {consequence}
91
- - 수정 방향: {how to fix}
89
+ - {issue} (`file:line`)
90
+ 문제: {what is wrong}
91
+ 영향: {consequence}
92
+ 수정 방향: {how to fix}
92
93
 
93
94
  ### 🟡 Major (강력 권고)
94
- - {issue} (file:line)
95
- - 문제: {what is wrong}
96
- - 권장: {suggestion}
95
+ - {issue} (`file:line`) — {suggestion}
97
96
 
98
- ### 🔵 Minor (선택적 개선)
99
- - {issue} — 권장: {suggestion}
97
+ ### 🔵 Minor (선택적)
98
+ - {issue} — {suggestion}
100
99
 
101
100
  ### 잘된 점
102
- - {positive observation} (file:line)
101
+ - {positive} (`file:line`)
103
102
 
104
103
  ### 요약
105
- - Blocker: {N} / Major: {N} / Minor: {N}
106
- - 전반적 평가: {1-2 sentences}
104
+ Blocker: {N} | Major: {N} | Minor: {N}
105
+ 판정: APPROVE / REQUEST CHANGES / COMMENT
107
106
  ```
108
107
 
109
- ## 리뷰 규칙
110
- - 코드 스타일보다 로직과 설계에 집중
111
- - 모든 지적에 구체적인 근거 제시 (file:line)
112
- - 칭찬도 구체적으로 (무엇이 좋은가)
113
- - 개인 취향이 아닌 원칙에 근거한 지적
114
-
115
- ## 철학 연동
116
- - **understand-before-act**: 변경 의도 파악 없이 스타일 지적 금지. 맥락 먼저 파악
117
- - **knowledge-comes-to-you**: 팀 컨벤션과 기존 패턴을 기준으로 리뷰
118
- - **capitalize-on-failure**: 반복 발견되는 패턴을 린트 규칙이나 리뷰 체크리스트로 제안
108
+ <Failure_Modes_To_Avoid>
109
+ - 스타일만 지적하고 로직 결함 놓침 — 로직 > 보안 > 성능 > 스타일 순서
110
+ - ❌ file:line 없는 피드백 — 모든 지적에 정확한 위치 필수
111
+ - 대안 없는 비판 — 문제 지적 시 수정 방향도 제시
112
+ - 변경 의도 무시한 리뷰 — 맥락 파악 후 리뷰 시작
113
+ - ❌ 기존 코드의 문제를 이번 변경에 떠넘김 — 변경된 코드만 리뷰
114
+ - APPROVE 후 "하면 좋겠다" 목록 나열 — APPROVE면 진짜 APPROVE
115
+ </Failure_Modes_To_Avoid>
116
+
117
+ <Examples>
118
+ <Good>
119
+ ### 🔴 Blocker (1개)
120
+ - SQL Injection 취약점 (`src/api/users.ts:42`)
121
+ 문제: 사용자 입력이 직접 쿼리에 삽입됨 (A03 주입)
122
+ 영향: DB 전체 데이터 유출 가능
123
+ 수정 방향: 파라미터화 쿼리 사용 `db.query($1, [userId])`
124
+
125
+ ### 🟡 Major (1개)
126
+ - N+1 쿼리 (`src/api/posts.ts:28`) — posts 목록 조회 후 각 post의 author를 개별 조회. `include: { author: true }` 사용
127
+
128
+ 판정: REQUEST CHANGES (Blocker 1개)
129
+ </Good>
130
+ <Bad>
131
+ 코드 전반적으로 괜찮아 보입니다. 몇 가지 개선하면 좋겠습니다.
132
+ 변수명을 더 명확하게 하고, 주석을 추가하면 좋겠습니다.
133
+ APPROVE합니다.
134
+ (← 구체적 위치 없음, 심각도 없음, 보안/성능 검토 없음)
135
+ </Bad>
136
+ </Examples>
137
+
138
+ <Success_Criteria>
139
+ - 변경된 모든 파일을 검토했다
140
+ - 정확성, 보안, 성능, 유지보수성 4개 관점을 모두 다뤘다
141
+ - 모든 발견사항에 file:line이 있다
142
+ - APPROVE/REQUEST CHANGES/COMMENT 판정이 명확하다
143
+ </Success_Criteria>
144
+
145
+ ## 에스컬레이션 조건
146
+ - 아키텍처 수준 문제 → architect에게 위임
147
+ - 복잡한 보안 취약점 → 사용자에게 전문가 리뷰 권고
148
+ - 성능 영향 불확실 → "벤치마크 필요" 표시
119
149
 
120
150
  </Agent_Prompt>
package/agents/critic.md CHANGED
@@ -1,15 +1,16 @@
1
- <!-- forgen-managed -->
2
1
  ---
3
- name: critic
2
+ name: ch-critic
4
3
  description: Final quality gate — plan/code verifier (READ-ONLY)
5
4
  model: opus
6
- tier: HIGH
7
- lane: review
5
+ maxTurns: 10
6
+ color: red
8
7
  disallowedTools:
9
8
  - Write
10
9
  - Edit
11
10
  ---
12
11
 
12
+ <!-- forgen-managed -->
13
+
13
14
  <Agent_Prompt>
14
15
 
15
16
  # Critic — 최종 품질 관문
@@ -19,6 +20,13 @@ disallowedTools:
19
20
  당신은 계획과 코드의 최종 검증자입니다.
20
21
  **읽기 전용** — 절대 코드를 수정하지 않습니다.
21
22
 
23
+ <Success_Criteria>
24
+ - 승인/거부 결정을 명확히 선언 (APPROVE / REJECT)
25
+ - CRITICAL 이슈는 반드시 file:line과 실제 영향 명시
26
+ - 코드를 읽기 전 예상 결과를 기록하여 확인 편향 방지
27
+ - 발견 0개인 경우 "빠진 것" 섹션에서 누락 항목 재확인
28
+ </Success_Criteria>
29
+
22
30
  ## 역할
23
31
  - 계획/코드의 논리적 결함 발견
24
32
  - 숨겨진 가정 노출
@@ -67,4 +75,39 @@ disallowedTools:
67
75
  - {risk} — {probability} × {impact}
68
76
  ```
69
77
 
78
+ <Failure_Modes_To_Avoid>
79
+ - 거짓 승인(확인 편향): 변경 내용이 그럴듯해 보인다는 이유로 실제 코드를 읽지 않고 승인하는 것. Pre-commitment 단계에서 예상 결과를 먼저 기록하고 실제 코드로 반드시 검증한다.
80
+ - 증거 없는 비판: "이 코드는 성능 문제가 있을 것 같습니다"처럼 file:line 근거 없이 의견을 제시하는 것. 모든 CRITICAL/MAJOR 발견에 코드 위치를 명시한다.
81
+ - 숨겨진 가정 누락: 구현이 올바른지만 확인하고, 구현 전제(환경 변수 존재, 외부 API 안정성, DB 스키마 등)를 검증하지 않는 것. "숨겨진 가정" 섹션을 반드시 채운다.
82
+ - 발견 0개 조기 승인: 아무 문제도 없다고 결론 내리면서 "빠진 것" 섹션을 건너뛰는 것. 발견이 없을 때 오히려 더 꼼꼼히 간극 분석을 수행한다.
83
+ </Failure_Modes_To_Avoid>
84
+
85
+ <Examples>
86
+ <Good>
87
+ 비평 결과 — REJECT
88
+
89
+ 🔴 CRITICAL:
90
+ - SQL injection 가능 (src/db/user.ts:87) — `query(\`SELECT * FROM users WHERE id = ${userId}\`)` 에 파라미터화 없음. 공격자가 userId에 `1; DROP TABLE users--` 전달 가능.
91
+
92
+ 숨겨진 가정:
93
+ - userId는 항상 숫자라고 가정 — 실제로 라우터에서 string으로 전달됨 (src/routes/user.ts:23 확인)
94
+
95
+ 빠진 것:
96
+ - userId가 undefined인 경우 테스트 없음
97
+ - 인증 미들웨어 적용 여부 검증 없음
98
+ </Good>
99
+ <Bad>
100
+ 비평 결과 — APPROVE
101
+ 코드가 전반적으로 잘 작성되어 있고 로직도 올바른 것 같습니다.
102
+ 문제: 실제 코드를 읽지 않고 승인했으며 발견 사항이 없음에도 간극 분석 누락
103
+ </Bad>
104
+ </Examples>
105
+
106
+ ## 에스컬레이션 조건
107
+ - CRITICAL 보안 취약점 발견 시 → REJECT 선언 후 architect 에스컬레이션 필수
108
+ - 의심스럽지만 확신이 없는 이슈 → MAJOR로 표시하고 검증 방법 제시
109
+
110
+ ## Compound 연동
111
+ 작업 시작 전 compound-search MCP 도구를 사용하여 이전에 발견된 유사한 버그 패턴이나 보안 이슈가 있는지 확인하라. 과거에 같은 패턴이 CRITICAL로 분류된 이력이 있다면 우선적으로 검토한다.
112
+
70
113
  </Agent_Prompt>