claude-code-workflow 6.3.18 → 6.3.19

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 (822) hide show
  1. package/.claude/CLAUDE.md +8 -5
  2. package/.claude/agents/action-planning-agent.md +26 -2
  3. package/.claude/agents/code-developer.md +132 -43
  4. package/.claude/agents/debug-explore-agent.md +434 -0
  5. package/.claude/agents/test-fix-agent.md +14 -0
  6. package/.claude/commands/issue/discover.md +41 -0
  7. package/.claude/commands/issue/execute.md +200 -19
  8. package/.claude/commands/issue/new.md +1 -1
  9. package/.claude/commands/issue/plan.md +6 -1
  10. package/.claude/commands/issue/queue.md +94 -39
  11. package/.claude/commands/memory/swagger-docs.md +773 -0
  12. package/.claude/commands/workflow/brainstorm/auto-parallel.md +21 -21
  13. package/.claude/commands/workflow/execute.md +54 -34
  14. package/.claude/commands/workflow/lite-execute.md +48 -164
  15. package/.claude/commands/workflow/lite-fix.md +4 -4
  16. package/.claude/commands/workflow/lite-plan.md +5 -5
  17. package/.claude/commands/workflow/plan.md +27 -27
  18. package/.claude/commands/workflow/review.md +42 -17
  19. package/.claude/commands/workflow/tdd-plan.md +25 -25
  20. package/.claude/commands/workflow/test-fix-gen.md +10 -10
  21. package/.claude/commands/workflow/test-gen.md +14 -14
  22. package/.claude/commands/workflow/ui-design/explore-auto.md +21 -21
  23. package/.claude/commands/workflow/ui-design/imitate-auto.md +24 -24
  24. package/.claude/skills/_shared/SKILL-DESIGN-SPEC.md +693 -0
  25. package/.claude/skills/ccw/SKILL.md +462 -0
  26. package/.claude/skills/ccw/index/command-capabilities.json +127 -0
  27. package/.claude/skills/ccw/index/intent-rules.json +136 -0
  28. package/.claude/skills/ccw/index/workflow-chains.json +451 -0
  29. package/.claude/skills/ccw/phases/actions/bugfix.md +218 -0
  30. package/.claude/skills/ccw/phases/actions/coupled.md +194 -0
  31. package/.claude/skills/ccw/phases/actions/docs.md +93 -0
  32. package/.claude/skills/ccw/phases/actions/full.md +154 -0
  33. package/.claude/skills/ccw/phases/actions/issue.md +201 -0
  34. package/.claude/skills/ccw/phases/actions/rapid.md +104 -0
  35. package/.claude/skills/ccw/phases/actions/review-fix.md +84 -0
  36. package/.claude/skills/ccw/phases/actions/tdd.md +66 -0
  37. package/.claude/skills/ccw/phases/actions/ui.md +79 -0
  38. package/.claude/skills/ccw/phases/orchestrator.md +435 -0
  39. package/.claude/skills/ccw/specs/intent-classification.md +336 -0
  40. package/.claude/skills/ccw-help/SKILL.md +177 -0
  41. package/.claude/skills/ccw-help/index/all-agents.json +82 -0
  42. package/.claude/skills/{command-guide → ccw-help}/index/all-commands.json +183 -73
  43. package/.claude/skills/{command-guide → ccw-help}/index/by-category.json +187 -73
  44. package/.claude/skills/{command-guide → ccw-help}/index/by-use-case.json +295 -185
  45. package/.claude/skills/{command-guide → ccw-help}/index/command-relationships.json +19 -166
  46. package/.claude/skills/{command-guide → ccw-help}/index/essential-commands.json +10 -10
  47. package/.claude/skills/ccw-help/scripts/analyze_commands.py +337 -0
  48. package/.claude/skills/code-reviewer/README.md +340 -0
  49. package/.claude/skills/code-reviewer/SKILL.md +308 -0
  50. package/.claude/skills/code-reviewer/phases/01-code-discovery.md +246 -0
  51. package/.claude/skills/code-reviewer/phases/02-security-analysis.md +442 -0
  52. package/.claude/skills/code-reviewer/phases/03-best-practices-review.md +36 -0
  53. package/.claude/skills/code-reviewer/phases/04-report-generation.md +278 -0
  54. package/.claude/skills/code-reviewer/specs/best-practices-requirements.md +346 -0
  55. package/.claude/skills/code-reviewer/specs/quality-standards.md +252 -0
  56. package/.claude/skills/code-reviewer/specs/security-requirements.md +243 -0
  57. package/.claude/skills/code-reviewer/templates/best-practice-finding.md +234 -0
  58. package/.claude/skills/code-reviewer/templates/report-template.md +316 -0
  59. package/.claude/skills/code-reviewer/templates/security-finding.md +161 -0
  60. package/.claude/skills/skill-generator/SKILL.md +187 -0
  61. package/.claude/skills/skill-generator/phases/01-requirements-discovery.md +239 -0
  62. package/.claude/skills/skill-generator/phases/02-structure-generation.md +207 -0
  63. package/.claude/skills/skill-generator/phases/03-phase-generation.md +802 -0
  64. package/.claude/skills/skill-generator/phases/04-specs-templates.md +328 -0
  65. package/.claude/skills/skill-generator/phases/05-validation.md +334 -0
  66. package/.claude/skills/skill-generator/specs/cli-integration.md +448 -0
  67. package/.claude/skills/skill-generator/specs/execution-modes.md +396 -0
  68. package/.claude/skills/skill-generator/specs/scripting-integration.md +265 -0
  69. package/.claude/skills/skill-generator/specs/skill-requirements.md +466 -0
  70. package/.claude/skills/skill-generator/templates/autonomous-action.md +517 -0
  71. package/.claude/skills/skill-generator/templates/autonomous-orchestrator.md +276 -0
  72. package/.claude/skills/skill-generator/templates/code-analysis-action.md +503 -0
  73. package/.claude/skills/skill-generator/templates/llm-action.md +355 -0
  74. package/.claude/skills/skill-generator/templates/script-bash.md +277 -0
  75. package/.claude/skills/skill-generator/templates/script-python.md +198 -0
  76. package/.claude/skills/skill-generator/templates/sequential-phase.md +441 -0
  77. package/.claude/skills/skill-generator/templates/skill-md.md +156 -0
  78. package/.claude/workflows/chinese-response.md +15 -28
  79. package/.claude/workflows/cli-templates/prompts/documentation/swagger-api.txt +266 -0
  80. package/.claude/workflows/cli-tools-usage.md +221 -177
  81. package/.claude/workflows/windows-platform.md +13 -10
  82. package/.codex/prompts/issue-execute.md +305 -82
  83. package/.codex/prompts/issue-queue.md +22 -0
  84. package/.codex/prompts/lite-execute.md +36 -11
  85. package/README.md +309 -305
  86. package/ccw/README.md +10 -4
  87. package/ccw/dist/cli.d.ts.map +1 -1
  88. package/ccw/dist/cli.js +4 -1
  89. package/ccw/dist/cli.js.map +1 -1
  90. package/ccw/dist/commands/cli.d.ts.map +1 -1
  91. package/ccw/dist/commands/cli.js +131 -34
  92. package/ccw/dist/commands/cli.js.map +1 -1
  93. package/ccw/dist/commands/issue.d.ts +152 -0
  94. package/ccw/dist/commands/issue.d.ts.map +1 -1
  95. package/ccw/dist/commands/issue.js +550 -85
  96. package/ccw/dist/commands/issue.js.map +1 -1
  97. package/ccw/dist/commands/serve.d.ts +1 -0
  98. package/ccw/dist/commands/serve.d.ts.map +1 -1
  99. package/ccw/dist/commands/serve.js +12 -5
  100. package/ccw/dist/commands/serve.js.map +1 -1
  101. package/ccw/dist/commands/stop.d.ts.map +1 -1
  102. package/ccw/dist/commands/stop.js +29 -5
  103. package/ccw/dist/commands/stop.js.map +1 -1
  104. package/ccw/dist/commands/tool.d.ts.map +1 -1
  105. package/ccw/dist/commands/tool.js +19 -2
  106. package/ccw/dist/commands/tool.js.map +1 -1
  107. package/ccw/dist/commands/view.d.ts +1 -0
  108. package/ccw/dist/commands/view.d.ts.map +1 -1
  109. package/ccw/dist/commands/view.js +10 -3
  110. package/ccw/dist/commands/view.js.map +1 -1
  111. package/ccw/dist/config/cli-settings-manager.d.ts +86 -0
  112. package/ccw/dist/config/cli-settings-manager.d.ts.map +1 -0
  113. package/ccw/dist/config/cli-settings-manager.js +392 -0
  114. package/ccw/dist/config/cli-settings-manager.js.map +1 -0
  115. package/ccw/dist/config/litellm-api-config-manager.d.ts +71 -5
  116. package/ccw/dist/config/litellm-api-config-manager.d.ts.map +1 -1
  117. package/ccw/dist/config/litellm-api-config-manager.js +290 -20
  118. package/ccw/dist/config/litellm-api-config-manager.js.map +1 -1
  119. package/ccw/dist/core/auth/csrf-manager.d.ts +18 -0
  120. package/ccw/dist/core/auth/csrf-manager.d.ts.map +1 -0
  121. package/ccw/dist/core/auth/csrf-manager.js +80 -0
  122. package/ccw/dist/core/auth/csrf-manager.js.map +1 -0
  123. package/ccw/dist/core/auth/csrf-middleware.d.ts +8 -0
  124. package/ccw/dist/core/auth/csrf-middleware.d.ts.map +1 -0
  125. package/ccw/dist/core/auth/csrf-middleware.js +141 -0
  126. package/ccw/dist/core/auth/csrf-middleware.js.map +1 -0
  127. package/ccw/dist/core/auth/middleware.d.ts +15 -0
  128. package/ccw/dist/core/auth/middleware.d.ts.map +1 -0
  129. package/ccw/dist/core/auth/middleware.js +76 -0
  130. package/ccw/dist/core/auth/middleware.js.map +1 -0
  131. package/ccw/dist/core/auth/token-manager.d.ts +41 -0
  132. package/ccw/dist/core/auth/token-manager.d.ts.map +1 -0
  133. package/ccw/dist/core/auth/token-manager.js +171 -0
  134. package/ccw/dist/core/auth/token-manager.js.map +1 -0
  135. package/ccw/dist/core/cache-manager.d.ts +6 -6
  136. package/ccw/dist/core/cache-manager.d.ts.map +1 -1
  137. package/ccw/dist/core/cache-manager.js +70 -48
  138. package/ccw/dist/core/cache-manager.js.map +1 -1
  139. package/ccw/dist/core/claude-freshness.d.ts.map +1 -1
  140. package/ccw/dist/core/claude-freshness.js +23 -3
  141. package/ccw/dist/core/claude-freshness.js.map +1 -1
  142. package/ccw/dist/core/core-memory-store.d.ts.map +1 -1
  143. package/ccw/dist/core/core-memory-store.js +2 -1
  144. package/ccw/dist/core/core-memory-store.js.map +1 -1
  145. package/ccw/dist/core/cors.d.ts +3 -0
  146. package/ccw/dist/core/cors.d.ts.map +1 -0
  147. package/ccw/dist/core/cors.js +10 -0
  148. package/ccw/dist/core/cors.js.map +1 -0
  149. package/ccw/dist/core/dashboard-generator-patch.js +0 -1
  150. package/ccw/dist/core/dashboard-generator-patch.js.map +1 -1
  151. package/ccw/dist/core/dashboard-generator.d.ts.map +1 -1
  152. package/ccw/dist/core/dashboard-generator.js +417 -416
  153. package/ccw/dist/core/dashboard-generator.js.map +1 -1
  154. package/ccw/dist/core/data-aggregator.js +2 -2
  155. package/ccw/dist/core/data-aggregator.js.map +1 -1
  156. package/ccw/dist/core/lite-scanner.d.ts +1 -1
  157. package/ccw/dist/core/lite-scanner.d.ts.map +1 -1
  158. package/ccw/dist/core/lite-scanner.js +130 -127
  159. package/ccw/dist/core/lite-scanner.js.map +1 -1
  160. package/ccw/dist/core/routes/auth-routes.d.ts +12 -0
  161. package/ccw/dist/core/routes/auth-routes.d.ts.map +1 -0
  162. package/ccw/dist/core/routes/auth-routes.js +80 -0
  163. package/ccw/dist/core/routes/auth-routes.js.map +1 -0
  164. package/ccw/dist/core/routes/ccw-routes.d.ts +1 -14
  165. package/ccw/dist/core/routes/ccw-routes.d.ts.map +1 -1
  166. package/ccw/dist/core/routes/ccw-routes.js +9 -4
  167. package/ccw/dist/core/routes/ccw-routes.js.map +1 -1
  168. package/ccw/dist/core/routes/claude-routes.d.ts +1 -14
  169. package/ccw/dist/core/routes/claude-routes.d.ts.map +1 -1
  170. package/ccw/dist/core/routes/claude-routes.js +98 -39
  171. package/ccw/dist/core/routes/claude-routes.js.map +1 -1
  172. package/ccw/dist/core/routes/cli-routes.d.ts +14 -12
  173. package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -1
  174. package/ccw/dist/core/routes/cli-routes.js +122 -43
  175. package/ccw/dist/core/routes/cli-routes.js.map +1 -1
  176. package/ccw/dist/core/routes/cli-settings-routes.d.ts +11 -0
  177. package/ccw/dist/core/routes/cli-settings-routes.d.ts.map +1 -0
  178. package/ccw/dist/core/routes/cli-settings-routes.js +204 -0
  179. package/ccw/dist/core/routes/cli-settings-routes.js.map +1 -0
  180. package/ccw/dist/core/routes/codexlens/config-handlers.d.ts +6 -0
  181. package/ccw/dist/core/routes/codexlens/config-handlers.d.ts.map +1 -0
  182. package/ccw/dist/core/routes/codexlens/config-handlers.js +1195 -0
  183. package/ccw/dist/core/routes/codexlens/config-handlers.js.map +1 -0
  184. package/ccw/dist/core/routes/codexlens/index-handlers.d.ts +10 -0
  185. package/ccw/dist/core/routes/codexlens/index-handlers.d.ts.map +1 -0
  186. package/ccw/dist/core/routes/codexlens/index-handlers.js +322 -0
  187. package/ccw/dist/core/routes/codexlens/index-handlers.js.map +1 -0
  188. package/ccw/dist/core/routes/codexlens/semantic-handlers.d.ts +6 -0
  189. package/ccw/dist/core/routes/codexlens/semantic-handlers.d.ts.map +1 -0
  190. package/ccw/dist/core/routes/codexlens/semantic-handlers.js +865 -0
  191. package/ccw/dist/core/routes/codexlens/semantic-handlers.js.map +1 -0
  192. package/ccw/dist/core/routes/codexlens/utils.d.ts +23 -0
  193. package/ccw/dist/core/routes/codexlens/utils.d.ts.map +1 -0
  194. package/ccw/dist/core/routes/codexlens/utils.js +85 -0
  195. package/ccw/dist/core/routes/codexlens/utils.js.map +1 -0
  196. package/ccw/dist/core/routes/codexlens/watcher-handlers.d.ts +13 -0
  197. package/ccw/dist/core/routes/codexlens/watcher-handlers.d.ts.map +1 -0
  198. package/ccw/dist/core/routes/codexlens/watcher-handlers.js +235 -0
  199. package/ccw/dist/core/routes/codexlens/watcher-handlers.js.map +1 -0
  200. package/ccw/dist/core/routes/codexlens-routes.d.ts +2 -11
  201. package/ccw/dist/core/routes/codexlens-routes.d.ts.map +1 -1
  202. package/ccw/dist/core/routes/codexlens-routes.js +10 -981
  203. package/ccw/dist/core/routes/codexlens-routes.js.map +1 -1
  204. package/ccw/dist/core/routes/discovery-routes.d.ts +1 -35
  205. package/ccw/dist/core/routes/discovery-routes.d.ts.map +1 -1
  206. package/ccw/dist/core/routes/discovery-routes.js +25 -0
  207. package/ccw/dist/core/routes/discovery-routes.js.map +1 -1
  208. package/ccw/dist/core/routes/files-routes.d.ts +1 -14
  209. package/ccw/dist/core/routes/files-routes.d.ts.map +1 -1
  210. package/ccw/dist/core/routes/files-routes.js +57 -14
  211. package/ccw/dist/core/routes/files-routes.js.map +1 -1
  212. package/ccw/dist/core/routes/graph-routes.d.ts +1 -14
  213. package/ccw/dist/core/routes/graph-routes.d.ts.map +1 -1
  214. package/ccw/dist/core/routes/graph-routes.js +36 -37
  215. package/ccw/dist/core/routes/graph-routes.js.map +1 -1
  216. package/ccw/dist/core/routes/help-routes.d.ts +1 -14
  217. package/ccw/dist/core/routes/help-routes.d.ts.map +1 -1
  218. package/ccw/dist/core/routes/help-routes.js +5 -0
  219. package/ccw/dist/core/routes/help-routes.js.map +1 -1
  220. package/ccw/dist/core/routes/hooks-routes.d.ts +4 -14
  221. package/ccw/dist/core/routes/hooks-routes.d.ts.map +1 -1
  222. package/ccw/dist/core/routes/hooks-routes.js +43 -21
  223. package/ccw/dist/core/routes/hooks-routes.js.map +1 -1
  224. package/ccw/dist/core/routes/issue-routes.d.ts +1 -34
  225. package/ccw/dist/core/routes/issue-routes.d.ts.map +1 -1
  226. package/ccw/dist/core/routes/issue-routes.js +24 -0
  227. package/ccw/dist/core/routes/issue-routes.js.map +1 -1
  228. package/ccw/dist/core/routes/litellm-api-routes.d.ts +1 -14
  229. package/ccw/dist/core/routes/litellm-api-routes.d.ts.map +1 -1
  230. package/ccw/dist/core/routes/litellm-api-routes.js +505 -48
  231. package/ccw/dist/core/routes/litellm-api-routes.js.map +1 -1
  232. package/ccw/dist/core/routes/litellm-routes.d.ts +1 -14
  233. package/ccw/dist/core/routes/litellm-routes.d.ts.map +1 -1
  234. package/ccw/dist/core/routes/litellm-routes.js +28 -11
  235. package/ccw/dist/core/routes/litellm-routes.js.map +1 -1
  236. package/ccw/dist/core/routes/mcp-routes.d.ts +1 -14
  237. package/ccw/dist/core/routes/mcp-routes.d.ts.map +1 -1
  238. package/ccw/dist/core/routes/mcp-routes.js +99 -30
  239. package/ccw/dist/core/routes/mcp-routes.js.map +1 -1
  240. package/ccw/dist/core/routes/mcp-templates-db.d.ts.map +1 -1
  241. package/ccw/dist/core/routes/mcp-templates-db.js +30 -31
  242. package/ccw/dist/core/routes/mcp-templates-db.js.map +1 -1
  243. package/ccw/dist/core/routes/memory-routes.d.ts.map +1 -1
  244. package/ccw/dist/core/routes/memory-routes.js +74 -24
  245. package/ccw/dist/core/routes/memory-routes.js.map +1 -1
  246. package/ccw/dist/core/routes/nav-status-routes.d.ts +3 -0
  247. package/ccw/dist/core/routes/nav-status-routes.d.ts.map +1 -0
  248. package/ccw/dist/core/routes/nav-status-routes.js +217 -0
  249. package/ccw/dist/core/routes/nav-status-routes.js.map +1 -0
  250. package/ccw/dist/core/routes/rules-routes.d.ts +1 -14
  251. package/ccw/dist/core/routes/rules-routes.d.ts.map +1 -1
  252. package/ccw/dist/core/routes/rules-routes.js +481 -58
  253. package/ccw/dist/core/routes/rules-routes.js.map +1 -1
  254. package/ccw/dist/core/routes/session-routes.d.ts +1 -14
  255. package/ccw/dist/core/routes/session-routes.d.ts.map +1 -1
  256. package/ccw/dist/core/routes/session-routes.js +15 -3
  257. package/ccw/dist/core/routes/session-routes.js.map +1 -1
  258. package/ccw/dist/core/routes/skills-routes.d.ts +1 -14
  259. package/ccw/dist/core/routes/skills-routes.d.ts.map +1 -1
  260. package/ccw/dist/core/routes/skills-routes.js +394 -112
  261. package/ccw/dist/core/routes/skills-routes.js.map +1 -1
  262. package/ccw/dist/core/routes/status-routes.d.ts +1 -14
  263. package/ccw/dist/core/routes/status-routes.d.ts.map +1 -1
  264. package/ccw/dist/core/routes/status-routes.js +4 -0
  265. package/ccw/dist/core/routes/status-routes.js.map +1 -1
  266. package/ccw/dist/core/routes/system-routes.d.ts +4 -10
  267. package/ccw/dist/core/routes/system-routes.d.ts.map +1 -1
  268. package/ccw/dist/core/routes/system-routes.js +6 -4
  269. package/ccw/dist/core/routes/system-routes.js.map +1 -1
  270. package/ccw/dist/core/routes/types.d.ts +19 -0
  271. package/ccw/dist/core/routes/types.d.ts.map +1 -0
  272. package/ccw/dist/core/routes/types.js +2 -0
  273. package/ccw/dist/core/routes/types.js.map +1 -0
  274. package/ccw/dist/core/server.d.ts.map +1 -1
  275. package/ccw/dist/core/server.js +201 -29
  276. package/ccw/dist/core/server.js.map +1 -1
  277. package/ccw/dist/core/services/api-key-tester.d.ts +31 -0
  278. package/ccw/dist/core/services/api-key-tester.d.ts.map +1 -0
  279. package/ccw/dist/core/services/api-key-tester.js +106 -0
  280. package/ccw/dist/core/services/api-key-tester.js.map +1 -0
  281. package/ccw/dist/core/services/health-check-service.d.ts +82 -0
  282. package/ccw/dist/core/services/health-check-service.d.ts.map +1 -0
  283. package/ccw/dist/core/services/health-check-service.js +271 -0
  284. package/ccw/dist/core/services/health-check-service.js.map +1 -0
  285. package/ccw/dist/core/websocket.d.ts +9 -7
  286. package/ccw/dist/core/websocket.d.ts.map +1 -1
  287. package/ccw/dist/core/websocket.js +9 -4
  288. package/ccw/dist/core/websocket.js.map +1 -1
  289. package/ccw/dist/tools/claude-cli-tools.d.ts +152 -28
  290. package/ccw/dist/tools/claude-cli-tools.d.ts.map +1 -1
  291. package/ccw/dist/tools/claude-cli-tools.js +490 -100
  292. package/ccw/dist/tools/claude-cli-tools.js.map +1 -1
  293. package/ccw/dist/tools/cli-config-manager.d.ts +24 -8
  294. package/ccw/dist/tools/cli-config-manager.d.ts.map +1 -1
  295. package/ccw/dist/tools/cli-config-manager.js +76 -156
  296. package/ccw/dist/tools/cli-config-manager.js.map +1 -1
  297. package/ccw/dist/tools/cli-executor-core.d.ts +85 -0
  298. package/ccw/dist/tools/cli-executor-core.d.ts.map +1 -0
  299. package/ccw/dist/tools/cli-executor-core.js +1310 -0
  300. package/ccw/dist/tools/cli-executor-core.js.map +1 -0
  301. package/ccw/dist/tools/cli-executor-state.d.ts +241 -0
  302. package/ccw/dist/tools/cli-executor-state.d.ts.map +1 -0
  303. package/ccw/dist/tools/cli-executor-state.js +392 -0
  304. package/ccw/dist/tools/cli-executor-state.js.map +1 -0
  305. package/ccw/dist/tools/cli-executor-utils.d.ts +36 -0
  306. package/ccw/dist/tools/cli-executor-utils.d.ts.map +1 -0
  307. package/ccw/dist/tools/cli-executor-utils.js +298 -0
  308. package/ccw/dist/tools/cli-executor-utils.js.map +1 -0
  309. package/ccw/dist/tools/cli-executor.d.ts +3 -377
  310. package/ccw/dist/tools/cli-executor.d.ts.map +1 -1
  311. package/ccw/dist/tools/cli-executor.js +3 -1884
  312. package/ccw/dist/tools/cli-executor.js.map +1 -1
  313. package/ccw/dist/tools/cli-history-store.d.ts +2 -0
  314. package/ccw/dist/tools/cli-history-store.d.ts.map +1 -1
  315. package/ccw/dist/tools/cli-history-store.js.map +1 -1
  316. package/ccw/dist/tools/cli-output-converter.d.ts +192 -0
  317. package/ccw/dist/tools/cli-output-converter.d.ts.map +1 -0
  318. package/ccw/dist/tools/cli-output-converter.js +1047 -0
  319. package/ccw/dist/tools/cli-output-converter.js.map +1 -0
  320. package/ccw/dist/tools/cli-prompt-builder.d.ts +113 -0
  321. package/ccw/dist/tools/cli-prompt-builder.d.ts.map +1 -0
  322. package/ccw/dist/tools/cli-prompt-builder.js +363 -0
  323. package/ccw/dist/tools/cli-prompt-builder.js.map +1 -0
  324. package/ccw/dist/tools/codex-lens.d.ts +15 -1
  325. package/ccw/dist/tools/codex-lens.d.ts.map +1 -1
  326. package/ccw/dist/tools/codex-lens.js +289 -55
  327. package/ccw/dist/tools/codex-lens.js.map +1 -1
  328. package/ccw/dist/tools/detect-changed-modules.d.ts.map +1 -1
  329. package/ccw/dist/tools/detect-changed-modules.js +22 -4
  330. package/ccw/dist/tools/detect-changed-modules.js.map +1 -1
  331. package/ccw/dist/tools/index.d.ts.map +1 -1
  332. package/ccw/dist/tools/index.js +2 -0
  333. package/ccw/dist/tools/index.js.map +1 -1
  334. package/ccw/dist/tools/litellm-client.d.ts.map +1 -1
  335. package/ccw/dist/tools/litellm-client.js +10 -4
  336. package/ccw/dist/tools/litellm-client.js.map +1 -1
  337. package/ccw/dist/tools/litellm-executor.d.ts +2 -4
  338. package/ccw/dist/tools/litellm-executor.d.ts.map +1 -1
  339. package/ccw/dist/tools/litellm-executor.js +39 -8
  340. package/ccw/dist/tools/litellm-executor.js.map +1 -1
  341. package/ccw/dist/tools/native-session-discovery.d.ts +2 -0
  342. package/ccw/dist/tools/native-session-discovery.d.ts.map +1 -1
  343. package/ccw/dist/tools/native-session-discovery.js +197 -1
  344. package/ccw/dist/tools/native-session-discovery.js.map +1 -1
  345. package/ccw/dist/tools/session-manager.d.ts.map +1 -1
  346. package/ccw/dist/tools/session-manager.js +79 -0
  347. package/ccw/dist/tools/session-manager.js.map +1 -1
  348. package/ccw/dist/tools/skill-context-loader.d.ts +15 -0
  349. package/ccw/dist/tools/skill-context-loader.d.ts.map +1 -0
  350. package/ccw/dist/tools/skill-context-loader.js +198 -0
  351. package/ccw/dist/tools/skill-context-loader.js.map +1 -0
  352. package/ccw/dist/tools/smart-search.d.ts +8 -3
  353. package/ccw/dist/tools/smart-search.d.ts.map +1 -1
  354. package/ccw/dist/tools/smart-search.js +378 -75
  355. package/ccw/dist/tools/smart-search.js.map +1 -1
  356. package/ccw/dist/types/cli-settings.d.ts +86 -0
  357. package/ccw/dist/types/cli-settings.d.ts.map +1 -0
  358. package/ccw/dist/types/cli-settings.js +54 -0
  359. package/ccw/dist/types/cli-settings.js.map +1 -0
  360. package/ccw/dist/types/litellm-api-config.d.ts +40 -1
  361. package/ccw/dist/types/litellm-api-config.d.ts.map +1 -1
  362. package/ccw/dist/utils/exec-constants.d.ts +25 -0
  363. package/ccw/dist/utils/exec-constants.d.ts.map +1 -0
  364. package/ccw/dist/utils/exec-constants.js +25 -0
  365. package/ccw/dist/utils/exec-constants.js.map +1 -0
  366. package/ccw/dist/utils/path-resolver.d.ts +1 -0
  367. package/ccw/dist/utils/path-resolver.d.ts.map +1 -1
  368. package/ccw/dist/utils/path-resolver.js +48 -3
  369. package/ccw/dist/utils/path-resolver.js.map +1 -1
  370. package/ccw/dist/utils/path-validator.d.ts.map +1 -1
  371. package/ccw/dist/utils/path-validator.js +25 -6
  372. package/ccw/dist/utils/path-validator.js.map +1 -1
  373. package/ccw/dist/utils/python-utils.d.ts.map +1 -1
  374. package/ccw/dist/utils/python-utils.js +27 -7
  375. package/ccw/dist/utils/python-utils.js.map +1 -1
  376. package/ccw/dist/utils/shell-escape.d.ts +8 -0
  377. package/ccw/dist/utils/shell-escape.d.ts.map +1 -0
  378. package/ccw/dist/utils/shell-escape.js +24 -0
  379. package/ccw/dist/utils/shell-escape.js.map +1 -0
  380. package/ccw/dist/utils/uv-manager.d.ts +167 -0
  381. package/ccw/dist/utils/uv-manager.d.ts.map +1 -0
  382. package/ccw/dist/utils/uv-manager.js +644 -0
  383. package/ccw/dist/utils/uv-manager.js.map +1 -0
  384. package/ccw/src/cli.ts +4 -1
  385. package/ccw/src/commands/cli.ts +132 -34
  386. package/ccw/src/commands/issue.ts +605 -91
  387. package/ccw/src/commands/serve.ts +15 -5
  388. package/ccw/src/commands/stop.ts +32 -5
  389. package/ccw/src/commands/tool.ts +17 -2
  390. package/ccw/src/commands/view.ts +13 -3
  391. package/ccw/src/config/cli-settings-manager.ts +460 -0
  392. package/ccw/src/config/litellm-api-config-manager.ts +392 -57
  393. package/ccw/src/core/auth/csrf-manager.ts +104 -0
  394. package/ccw/src/core/auth/csrf-middleware.ts +159 -0
  395. package/ccw/src/core/auth/middleware.ts +94 -0
  396. package/ccw/src/core/auth/token-manager.ts +219 -0
  397. package/ccw/src/core/cache-manager.ts +64 -52
  398. package/ccw/src/core/claude-freshness.ts +26 -6
  399. package/ccw/src/core/core-memory-store.ts +2 -1
  400. package/ccw/src/core/cors.ts +10 -0
  401. package/ccw/src/core/dashboard-generator-patch.ts +47 -48
  402. package/ccw/src/core/dashboard-generator.ts +797 -744
  403. package/ccw/src/core/data-aggregator.ts +667 -667
  404. package/ccw/src/core/lite-scanner.ts +156 -140
  405. package/ccw/src/core/routes/auth-routes.ts +98 -0
  406. package/ccw/src/core/routes/ccw-routes.ts +10 -20
  407. package/ccw/src/core/routes/claude-routes.ts +101 -51
  408. package/ccw/src/core/routes/cli-routes.ts +152 -55
  409. package/ccw/src/core/routes/cli-settings-routes.ts +232 -0
  410. package/ccw/src/core/routes/codexlens/README.md +37 -0
  411. package/ccw/src/core/routes/codexlens/config-handlers.ts +1269 -0
  412. package/ccw/src/core/routes/codexlens/index-handlers.ts +354 -0
  413. package/ccw/src/core/routes/codexlens/semantic-handlers.ts +931 -0
  414. package/ccw/src/core/routes/codexlens/utils.ts +96 -0
  415. package/ccw/src/core/routes/codexlens/watcher-handlers.ts +265 -0
  416. package/ccw/src/core/routes/codexlens-routes.ts +11 -1044
  417. package/ccw/src/core/routes/discovery-routes.ts +1 -12
  418. package/ccw/src/core/routes/files-routes.ts +112 -40
  419. package/ccw/src/core/routes/graph-routes.ts +39 -46
  420. package/ccw/src/core/routes/help-routes.ts +2 -12
  421. package/ccw/src/core/routes/hooks-routes.ts +83 -44
  422. package/ccw/src/core/routes/issue-routes.ts +1 -12
  423. package/ccw/src/core/routes/litellm-api-routes.ts +566 -60
  424. package/ccw/src/core/routes/litellm-routes.ts +35 -27
  425. package/ccw/src/core/routes/mcp-routes.ts +157 -60
  426. package/ccw/src/core/routes/mcp-routes.ts.backup +549 -550
  427. package/ccw/src/core/routes/mcp-templates-db.ts +267 -268
  428. package/ccw/src/core/routes/memory-routes.ts +76 -22
  429. package/ccw/src/core/routes/nav-status-routes.ts +231 -0
  430. package/ccw/src/core/routes/rules-routes.ts +600 -81
  431. package/ccw/src/core/routes/session-routes.ts +28 -22
  432. package/ccw/src/core/routes/skills-routes.ts +452 -132
  433. package/ccw/src/core/routes/status-routes.ts +1 -12
  434. package/ccw/src/core/routes/system-routes.ts +15 -22
  435. package/ccw/src/core/routes/types.ts +25 -0
  436. package/ccw/src/core/server.ts +651 -468
  437. package/ccw/src/core/services/api-key-tester.ts +137 -0
  438. package/ccw/src/core/services/health-check-service.ts +340 -0
  439. package/ccw/src/core/websocket.ts +20 -12
  440. package/ccw/src/templates/dashboard-css/01-base.css +109 -0
  441. package/ccw/src/templates/dashboard-css/10-cli-status.css +202 -0
  442. package/ccw/src/templates/dashboard-css/21-cli-toolmgmt.css +308 -0
  443. package/ccw/src/templates/dashboard-css/30-core-memory.css +20 -0
  444. package/ccw/src/templates/dashboard-css/31-api-settings.css +751 -14
  445. package/ccw/src/templates/dashboard-css/33-cli-stream-viewer.css +230 -2
  446. package/ccw/src/templates/dashboard-js/api.js +5 -0
  447. package/ccw/src/templates/dashboard-js/components/cli-status.js +279 -107
  448. package/ccw/src/templates/dashboard-js/components/cli-stream-viewer.js +262 -20
  449. package/ccw/src/templates/dashboard-js/components/hook-manager.js +105 -5
  450. package/ccw/src/templates/dashboard-js/components/mcp-manager.js +317 -0
  451. package/ccw/src/templates/dashboard-js/components/navigation.js +45 -0
  452. package/ccw/src/templates/dashboard-js/components/notifications.js +128 -0
  453. package/ccw/src/templates/dashboard-js/i18n.js +4438 -3983
  454. package/ccw/src/templates/dashboard-js/main.js +71 -0
  455. package/ccw/src/templates/dashboard-js/services.js +289 -0
  456. package/ccw/src/templates/dashboard-js/views/api-settings.js +5613 -3361
  457. package/ccw/src/templates/dashboard-js/views/claude-manager.js +1 -7
  458. package/ccw/src/templates/dashboard-js/views/cli-manager.js +581 -87
  459. package/ccw/src/templates/dashboard-js/views/codexlens-manager.js +6091 -1965
  460. package/ccw/src/templates/dashboard-js/views/core-memory.js +129 -20
  461. package/ccw/src/templates/dashboard-js/views/hook-manager.js +17 -3
  462. package/ccw/src/templates/dashboard-js/views/mcp-manager.js +63 -0
  463. package/ccw/src/templates/dashboard-js/views/project-overview.js +182 -37
  464. package/ccw/src/templates/dashboard-js/views/rules-manager.js +26 -3
  465. package/ccw/src/templates/dashboard-js/views/skills-manager.js +2 -42
  466. package/ccw/src/templates/dashboard.html +6 -0
  467. package/ccw/src/tools/README.md +29 -0
  468. package/ccw/src/tools/claude-cli-tools.ts +640 -125
  469. package/ccw/src/tools/cli-config-manager.ts +102 -172
  470. package/ccw/src/tools/cli-executor-core.ts +1533 -0
  471. package/ccw/src/tools/cli-executor-state.ts +560 -0
  472. package/ccw/src/tools/cli-executor-utils.ts +349 -0
  473. package/ccw/src/tools/cli-executor.ts +3 -2309
  474. package/ccw/src/tools/cli-history-store.ts +2 -0
  475. package/ccw/src/tools/cli-output-converter.ts +1237 -0
  476. package/ccw/src/tools/cli-prompt-builder.ts +487 -0
  477. package/ccw/src/tools/codex-lens.ts +324 -59
  478. package/ccw/src/tools/detect-changed-modules.ts +24 -6
  479. package/ccw/src/tools/index.ts +2 -0
  480. package/ccw/src/tools/litellm-client.ts +10 -4
  481. package/ccw/src/tools/litellm-executor.ts +146 -114
  482. package/ccw/src/tools/native-session-discovery.ts +209 -1
  483. package/ccw/src/tools/session-manager.ts +88 -0
  484. package/ccw/src/tools/skill-context-loader.ts +213 -0
  485. package/ccw/src/tools/smart-search.ts +427 -76
  486. package/ccw/src/types/cli-settings.ts +137 -0
  487. package/ccw/src/types/litellm-api-config.ts +55 -1
  488. package/ccw/src/utils/exec-constants.ts +24 -0
  489. package/ccw/src/utils/path-resolver.ts +49 -3
  490. package/ccw/src/utils/path-validator.ts +28 -6
  491. package/ccw/src/utils/python-utils.ts +140 -121
  492. package/ccw/src/utils/shell-escape.ts +30 -0
  493. package/ccw/src/utils/uv-manager.ts +796 -0
  494. package/ccw-litellm/src/ccw_litellm/__pycache__/__init__.cpython-310.pyc +0 -0
  495. package/ccw-litellm/src/ccw_litellm/__pycache__/__init__.cpython-312.pyc +0 -0
  496. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/__init__.cpython-310.pyc +0 -0
  497. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/__init__.cpython-312.pyc +0 -0
  498. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-310.pyc +0 -0
  499. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-312.pyc +0 -0
  500. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-313.pyc +0 -0
  501. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-310.pyc +0 -0
  502. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-312.pyc +0 -0
  503. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-313.pyc +0 -0
  504. package/ccw-litellm/src/ccw_litellm/clients/litellm_embedder.py +270 -251
  505. package/ccw-litellm/src/ccw_litellm/clients/litellm_llm.py +33 -0
  506. package/ccw-litellm/src/ccw_litellm/config/__pycache__/__init__.cpython-310.pyc +0 -0
  507. package/ccw-litellm/src/ccw_litellm/config/__pycache__/__init__.cpython-312.pyc +0 -0
  508. package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-310.pyc +0 -0
  509. package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-312.pyc +0 -0
  510. package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-313.pyc +0 -0
  511. package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-310.pyc +0 -0
  512. package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-312.pyc +0 -0
  513. package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-313.pyc +0 -0
  514. package/ccw-litellm/src/ccw_litellm/config/loader.py +343 -316
  515. package/ccw-litellm/src/ccw_litellm/config/models.py +162 -130
  516. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/__init__.cpython-310.pyc +0 -0
  517. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/__init__.cpython-312.pyc +0 -0
  518. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/embedder.cpython-310.pyc +0 -0
  519. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/embedder.cpython-312.pyc +0 -0
  520. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/llm.cpython-310.pyc +0 -0
  521. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/llm.cpython-312.pyc +0 -0
  522. package/codex-lens/pyproject.toml +43 -0
  523. package/codex-lens/src/codexlens/__pycache__/__init__.cpython-310.pyc +0 -0
  524. package/codex-lens/src/codexlens/__pycache__/__init__.cpython-312.pyc +0 -0
  525. package/codex-lens/src/codexlens/__pycache__/__main__.cpython-310.pyc +0 -0
  526. package/codex-lens/src/codexlens/__pycache__/__main__.cpython-312.pyc +0 -0
  527. package/codex-lens/src/codexlens/__pycache__/config.cpython-310.pyc +0 -0
  528. package/codex-lens/src/codexlens/__pycache__/config.cpython-312.pyc +0 -0
  529. package/codex-lens/src/codexlens/__pycache__/config.cpython-313.pyc +0 -0
  530. package/codex-lens/src/codexlens/__pycache__/entities.cpython-310.pyc +0 -0
  531. package/codex-lens/src/codexlens/__pycache__/entities.cpython-312.pyc +0 -0
  532. package/codex-lens/src/codexlens/__pycache__/entities.cpython-313.pyc +0 -0
  533. package/codex-lens/src/codexlens/__pycache__/env_config.cpython-310.pyc +0 -0
  534. package/codex-lens/src/codexlens/__pycache__/env_config.cpython-312.pyc +0 -0
  535. package/codex-lens/src/codexlens/__pycache__/env_config.cpython-313.pyc +0 -0
  536. package/codex-lens/src/codexlens/__pycache__/errors.cpython-310.pyc +0 -0
  537. package/codex-lens/src/codexlens/__pycache__/errors.cpython-312.pyc +0 -0
  538. package/codex-lens/src/codexlens/cli/__pycache__/__init__.cpython-310.pyc +0 -0
  539. package/codex-lens/src/codexlens/cli/__pycache__/__init__.cpython-312.pyc +0 -0
  540. package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-310.pyc +0 -0
  541. package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-312.pyc +0 -0
  542. package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-313.pyc +0 -0
  543. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-310.pyc +0 -0
  544. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-312.pyc +0 -0
  545. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-313.pyc +0 -0
  546. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-310.pyc +0 -0
  547. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-312.pyc +0 -0
  548. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-313.pyc +0 -0
  549. package/codex-lens/src/codexlens/cli/__pycache__/output.cpython-310.pyc +0 -0
  550. package/codex-lens/src/codexlens/cli/__pycache__/output.cpython-312.pyc +0 -0
  551. package/codex-lens/src/codexlens/cli/commands.py +4416 -2295
  552. package/codex-lens/src/codexlens/cli/embedding_manager.py +767 -14
  553. package/codex-lens/src/codexlens/cli/model_manager.py +676 -0
  554. package/codex-lens/src/codexlens/config.py +321 -12
  555. package/codex-lens/src/codexlens/entities.py +4 -1
  556. package/codex-lens/src/codexlens/env_config.py +298 -0
  557. package/codex-lens/src/codexlens/indexing/__init__.py +23 -1
  558. package/codex-lens/src/codexlens/indexing/__pycache__/__init__.cpython-313.pyc +0 -0
  559. package/codex-lens/src/codexlens/indexing/__pycache__/embedding.cpython-313.pyc +0 -0
  560. package/codex-lens/src/codexlens/indexing/__pycache__/symbol_extractor.cpython-313.pyc +0 -0
  561. package/codex-lens/src/codexlens/indexing/embedding.py +582 -0
  562. package/codex-lens/src/codexlens/indexing/symbol_extractor.py +62 -28
  563. package/codex-lens/src/codexlens/parsers/__pycache__/__init__.cpython-310.pyc +0 -0
  564. package/codex-lens/src/codexlens/parsers/__pycache__/__init__.cpython-312.pyc +0 -0
  565. package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-310.pyc +0 -0
  566. package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-312.pyc +0 -0
  567. package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-313.pyc +0 -0
  568. package/codex-lens/src/codexlens/parsers/__pycache__/tokenizer.cpython-310.pyc +0 -0
  569. package/codex-lens/src/codexlens/parsers/__pycache__/tokenizer.cpython-312.pyc +0 -0
  570. package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-310.pyc +0 -0
  571. package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-312.pyc +0 -0
  572. package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-313.pyc +0 -0
  573. package/codex-lens/src/codexlens/parsers/factory.py +139 -10
  574. package/codex-lens/src/codexlens/parsers/treesitter_parser.py +487 -13
  575. package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-310.pyc +0 -0
  576. package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-312.pyc +0 -0
  577. package/codex-lens/src/codexlens/search/__pycache__/binary_searcher.cpython-313.pyc +0 -0
  578. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-310.pyc +0 -0
  579. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-312.pyc +0 -0
  580. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-313.pyc +0 -0
  581. package/codex-lens/src/codexlens/search/__pycache__/enrichment.cpython-313.pyc +0 -0
  582. package/codex-lens/src/codexlens/search/__pycache__/graph_expander.cpython-313.pyc +0 -0
  583. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-310.pyc +0 -0
  584. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-312.pyc +0 -0
  585. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-313.pyc +0 -0
  586. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-310.pyc +0 -0
  587. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-312.pyc +0 -0
  588. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-313.pyc +0 -0
  589. package/codex-lens/src/codexlens/search/binary_searcher.py +277 -0
  590. package/codex-lens/src/codexlens/search/chain_search.py +1642 -8
  591. package/codex-lens/src/codexlens/search/enrichment.py +21 -0
  592. package/codex-lens/src/codexlens/search/graph_expander.py +264 -0
  593. package/codex-lens/src/codexlens/search/hybrid_search.py +772 -37
  594. package/codex-lens/src/codexlens/search/ranking.py +347 -8
  595. package/codex-lens/src/codexlens/semantic/SPLADE_IMPLEMENTATION.md +225 -0
  596. package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-310.pyc +0 -0
  597. package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-312.pyc +0 -0
  598. package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-310.pyc +0 -0
  599. package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-312.pyc +0 -0
  600. package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-313.pyc +0 -0
  601. package/codex-lens/src/codexlens/semantic/__pycache__/base.cpython-310.pyc +0 -0
  602. package/codex-lens/src/codexlens/semantic/__pycache__/base.cpython-312.pyc +0 -0
  603. package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-310.pyc +0 -0
  604. package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-312.pyc +0 -0
  605. package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-310.pyc +0 -0
  606. package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-312.pyc +0 -0
  607. package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-310.pyc +0 -0
  608. package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-312.pyc +0 -0
  609. package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-313.pyc +0 -0
  610. package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-310.pyc +0 -0
  611. package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-312.pyc +0 -0
  612. package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-313.pyc +0 -0
  613. package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-310.pyc +0 -0
  614. package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-312.pyc +0 -0
  615. package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-313.pyc +0 -0
  616. package/codex-lens/src/codexlens/semantic/__pycache__/reranker.cpython-313.pyc +0 -0
  617. package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-310.pyc +0 -0
  618. package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-312.pyc +0 -0
  619. package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-313.pyc +0 -0
  620. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-310.pyc +0 -0
  621. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-312.pyc +0 -0
  622. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-313.pyc +0 -0
  623. package/codex-lens/src/codexlens/semantic/ann_index.py +654 -0
  624. package/codex-lens/src/codexlens/semantic/factory.py +63 -3
  625. package/codex-lens/src/codexlens/semantic/gpu_support.py +19 -2
  626. package/codex-lens/src/codexlens/semantic/litellm_embedder.py +144 -144
  627. package/codex-lens/src/codexlens/semantic/reranker/__init__.py +25 -0
  628. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/__init__.cpython-310.pyc +0 -0
  629. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/__init__.cpython-313.pyc +0 -0
  630. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/api_reranker.cpython-310.pyc +0 -0
  631. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/api_reranker.cpython-313.pyc +0 -0
  632. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/base.cpython-310.pyc +0 -0
  633. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/base.cpython-313.pyc +0 -0
  634. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/factory.cpython-310.pyc +0 -0
  635. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/factory.cpython-313.pyc +0 -0
  636. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/fastembed_reranker.cpython-310.pyc +0 -0
  637. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/fastembed_reranker.cpython-313.pyc +0 -0
  638. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/legacy.cpython-310.pyc +0 -0
  639. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/legacy.cpython-313.pyc +0 -0
  640. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/litellm_reranker.cpython-313.pyc +0 -0
  641. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/onnx_reranker.cpython-310.pyc +0 -0
  642. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/onnx_reranker.cpython-313.pyc +0 -0
  643. package/codex-lens/src/codexlens/semantic/reranker/api_reranker.py +403 -0
  644. package/codex-lens/src/codexlens/semantic/reranker/base.py +46 -0
  645. package/codex-lens/src/codexlens/semantic/reranker/factory.py +159 -0
  646. package/codex-lens/src/codexlens/semantic/reranker/fastembed_reranker.py +257 -0
  647. package/codex-lens/src/codexlens/semantic/reranker/legacy.py +91 -0
  648. package/codex-lens/src/codexlens/semantic/reranker/litellm_reranker.py +214 -0
  649. package/codex-lens/src/codexlens/semantic/reranker/onnx_reranker.py +268 -0
  650. package/codex-lens/src/codexlens/semantic/splade_encoder.py +567 -0
  651. package/codex-lens/src/codexlens/semantic/vector_store.py +472 -352
  652. package/codex-lens/src/codexlens/storage/__init__.py +3 -0
  653. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-310.pyc +0 -0
  654. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-312.pyc +0 -0
  655. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-313.pyc +0 -0
  656. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-310.pyc +0 -0
  657. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-312.pyc +0 -0
  658. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-313.pyc +0 -0
  659. package/codex-lens/src/codexlens/storage/__pycache__/global_index.cpython-310.pyc +0 -0
  660. package/codex-lens/src/codexlens/storage/__pycache__/global_index.cpython-312.pyc +0 -0
  661. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-310.pyc +0 -0
  662. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-312.pyc +0 -0
  663. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-313.pyc +0 -0
  664. package/codex-lens/src/codexlens/storage/__pycache__/merkle_tree.cpython-313.pyc +0 -0
  665. package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-310.pyc +0 -0
  666. package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-312.pyc +0 -0
  667. package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-310.pyc +0 -0
  668. package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-312.pyc +0 -0
  669. package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-310.pyc +0 -0
  670. package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-312.pyc +0 -0
  671. package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-313.pyc +0 -0
  672. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-310.pyc +0 -0
  673. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-312.pyc +0 -0
  674. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-313.pyc +0 -0
  675. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_utils.cpython-310.pyc +0 -0
  676. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_utils.cpython-312.pyc +0 -0
  677. package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-310.pyc +0 -0
  678. package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-312.pyc +0 -0
  679. package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-313.pyc +0 -0
  680. package/codex-lens/src/codexlens/storage/dir_index.py +310 -12
  681. package/codex-lens/src/codexlens/storage/index_tree.py +194 -23
  682. package/codex-lens/src/codexlens/storage/merkle_tree.py +136 -0
  683. package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-310.pyc +0 -0
  684. package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-312.pyc +0 -0
  685. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_006_enhance_relationships.cpython-313.pyc +0 -0
  686. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-310.pyc +0 -0
  687. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-312.pyc +0 -0
  688. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-313.pyc +0 -0
  689. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_008_add_merkle_hashes.cpython-313.pyc +0 -0
  690. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_009_add_splade.cpython-313.pyc +0 -0
  691. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_010_add_multi_vector_chunks.cpython-313.pyc +0 -0
  692. package/codex-lens/src/codexlens/storage/migrations/migration_006_enhance_relationships.py +37 -0
  693. package/codex-lens/src/codexlens/storage/migrations/migration_007_add_graph_neighbors.py +47 -0
  694. package/codex-lens/src/codexlens/storage/migrations/migration_008_add_merkle_hashes.py +81 -0
  695. package/codex-lens/src/codexlens/storage/migrations/migration_009_add_splade.py +103 -0
  696. package/codex-lens/src/codexlens/storage/migrations/migration_010_add_multi_vector_chunks.py +162 -0
  697. package/codex-lens/src/codexlens/storage/splade_index.py +578 -0
  698. package/codex-lens/src/codexlens/storage/sqlite_store.py +508 -184
  699. package/codex-lens/src/codexlens/storage/vector_meta_store.py +415 -0
  700. package/codex-lens/src/codexlens/watcher/__init__.py +17 -0
  701. package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-310.pyc +0 -0
  702. package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-312.pyc +0 -0
  703. package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-313.pyc +0 -0
  704. package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-310.pyc +0 -0
  705. package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-312.pyc +0 -0
  706. package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-313.pyc +0 -0
  707. package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-310.pyc +0 -0
  708. package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-312.pyc +0 -0
  709. package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-313.pyc +0 -0
  710. package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-310.pyc +0 -0
  711. package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-312.pyc +0 -0
  712. package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-313.pyc +0 -0
  713. package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-310.pyc +0 -0
  714. package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-312.pyc +0 -0
  715. package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-313.pyc +0 -0
  716. package/codex-lens/src/codexlens/watcher/events.py +82 -0
  717. package/codex-lens/src/codexlens/watcher/file_watcher.py +347 -0
  718. package/codex-lens/src/codexlens/watcher/incremental_indexer.py +369 -0
  719. package/codex-lens/src/codexlens/watcher/manager.py +255 -0
  720. package/package.json +4 -1
  721. package/.claude/commands/workflow/docs/analyze.md +0 -1467
  722. package/.claude/commands/workflow/docs/copyright.md +0 -1265
  723. package/.claude/skills/command-guide/SKILL.md +0 -388
  724. package/.claude/skills/command-guide/UPDATE-GUIDELINE.md +0 -592
  725. package/.claude/skills/command-guide/guides/cli-tools-guide.md +0 -410
  726. package/.claude/skills/command-guide/guides/examples.md +0 -537
  727. package/.claude/skills/command-guide/guides/getting-started.md +0 -242
  728. package/.claude/skills/command-guide/guides/implementation-details.md +0 -1010
  729. package/.claude/skills/command-guide/guides/index-structure.md +0 -326
  730. package/.claude/skills/command-guide/guides/troubleshooting.md +0 -92
  731. package/.claude/skills/command-guide/guides/ui-design-workflow-guide.md +0 -316
  732. package/.claude/skills/command-guide/guides/workflow-patterns.md +0 -662
  733. package/.claude/skills/command-guide/reference/agents/action-planning-agent.md +0 -855
  734. package/.claude/skills/command-guide/reference/agents/cli-execution-agent.md +0 -267
  735. package/.claude/skills/command-guide/reference/agents/cli-explore-agent.md +0 -182
  736. package/.claude/skills/command-guide/reference/agents/cli-lite-planning-agent.md +0 -446
  737. package/.claude/skills/command-guide/reference/agents/cli-planning-agent.md +0 -558
  738. package/.claude/skills/command-guide/reference/agents/code-developer.md +0 -311
  739. package/.claude/skills/command-guide/reference/agents/conceptual-planning-agent.md +0 -308
  740. package/.claude/skills/command-guide/reference/agents/context-search-agent.md +0 -581
  741. package/.claude/skills/command-guide/reference/agents/doc-generator.md +0 -330
  742. package/.claude/skills/command-guide/reference/agents/memory-bridge.md +0 -94
  743. package/.claude/skills/command-guide/reference/agents/test-context-search-agent.md +0 -400
  744. package/.claude/skills/command-guide/reference/agents/test-fix-agent.md +0 -344
  745. package/.claude/skills/command-guide/reference/agents/ui-design-agent.md +0 -593
  746. package/.claude/skills/command-guide/reference/agents/universal-executor.md +0 -131
  747. package/.claude/skills/command-guide/reference/commands/cli/cli-init.md +0 -440
  748. package/.claude/skills/command-guide/reference/commands/enhance-prompt.md +0 -93
  749. package/.claude/skills/command-guide/reference/commands/memory/code-map-memory.md +0 -687
  750. package/.claude/skills/command-guide/reference/commands/memory/docs-full-cli.md +0 -471
  751. package/.claude/skills/command-guide/reference/commands/memory/docs-related-cli.md +0 -386
  752. package/.claude/skills/command-guide/reference/commands/memory/docs.md +0 -616
  753. package/.claude/skills/command-guide/reference/commands/memory/load-skill-memory.md +0 -182
  754. package/.claude/skills/command-guide/reference/commands/memory/load.md +0 -240
  755. package/.claude/skills/command-guide/reference/commands/memory/skill-memory.md +0 -525
  756. package/.claude/skills/command-guide/reference/commands/memory/style-skill-memory.md +0 -396
  757. package/.claude/skills/command-guide/reference/commands/memory/tech-research.md +0 -314
  758. package/.claude/skills/command-guide/reference/commands/memory/update-full.md +0 -332
  759. package/.claude/skills/command-guide/reference/commands/memory/update-related.md +0 -332
  760. package/.claude/skills/command-guide/reference/commands/memory/workflow-skill-memory.md +0 -517
  761. package/.claude/skills/command-guide/reference/commands/task/breakdown.md +0 -204
  762. package/.claude/skills/command-guide/reference/commands/task/create.md +0 -152
  763. package/.claude/skills/command-guide/reference/commands/task/execute.md +0 -270
  764. package/.claude/skills/command-guide/reference/commands/task/replan.md +0 -437
  765. package/.claude/skills/command-guide/reference/commands/version.md +0 -254
  766. package/.claude/skills/command-guide/reference/commands/workflow/action-plan-verify.md +0 -447
  767. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/api-designer.md +0 -585
  768. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/artifacts.md +0 -452
  769. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/auto-parallel.md +0 -443
  770. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/data-architect.md +0 -220
  771. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-manager.md +0 -200
  772. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-owner.md +0 -200
  773. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/scrum-master.md +0 -200
  774. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/subject-matter-expert.md +0 -200
  775. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/synthesis.md +0 -398
  776. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/system-architect.md +0 -387
  777. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ui-designer.md +0 -221
  778. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ux-expert.md +0 -221
  779. package/.claude/skills/command-guide/reference/commands/workflow/execute.md +0 -465
  780. package/.claude/skills/command-guide/reference/commands/workflow/init.md +0 -164
  781. package/.claude/skills/command-guide/reference/commands/workflow/lite-execute.md +0 -748
  782. package/.claude/skills/command-guide/reference/commands/workflow/lite-fix.md +0 -664
  783. package/.claude/skills/command-guide/reference/commands/workflow/lite-plan.md +0 -645
  784. package/.claude/skills/command-guide/reference/commands/workflow/plan.md +0 -551
  785. package/.claude/skills/command-guide/reference/commands/workflow/replan.md +0 -515
  786. package/.claude/skills/command-guide/reference/commands/workflow/review-fix.md +0 -606
  787. package/.claude/skills/command-guide/reference/commands/workflow/review-module-cycle.md +0 -765
  788. package/.claude/skills/command-guide/reference/commands/workflow/review-session-cycle.md +0 -776
  789. package/.claude/skills/command-guide/reference/commands/workflow/review.md +0 -298
  790. package/.claude/skills/command-guide/reference/commands/workflow/session/complete.md +0 -547
  791. package/.claude/skills/command-guide/reference/commands/workflow/session/list.md +0 -114
  792. package/.claude/skills/command-guide/reference/commands/workflow/session/resume.md +0 -77
  793. package/.claude/skills/command-guide/reference/commands/workflow/session/start.md +0 -257
  794. package/.claude/skills/command-guide/reference/commands/workflow/tdd-plan.md +0 -460
  795. package/.claude/skills/command-guide/reference/commands/workflow/tdd-verify.md +0 -400
  796. package/.claude/skills/command-guide/reference/commands/workflow/test-cycle-execute.md +0 -498
  797. package/.claude/skills/command-guide/reference/commands/workflow/test-fix-gen.md +0 -699
  798. package/.claude/skills/command-guide/reference/commands/workflow/test-gen.md +0 -529
  799. package/.claude/skills/command-guide/reference/commands/workflow/tools/conflict-resolution.md +0 -766
  800. package/.claude/skills/command-guide/reference/commands/workflow/tools/context-gather.md +0 -433
  801. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-agent.md +0 -487
  802. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-tdd.md +0 -518
  803. package/.claude/skills/command-guide/reference/commands/workflow/tools/tdd-coverage-analysis.md +0 -309
  804. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-concept-enhanced.md +0 -163
  805. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-context-gather.md +0 -232
  806. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-task-generate.md +0 -254
  807. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/animation-extract.md +0 -1150
  808. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/codify-style.md +0 -652
  809. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/design-sync.md +0 -454
  810. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/explore-auto.md +0 -678
  811. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/generate.md +0 -504
  812. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/imitate-auto.md +0 -745
  813. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/import-from-code.md +0 -537
  814. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/layout-extract.md +0 -788
  815. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/reference-page-generator.md +0 -356
  816. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/style-extract.md +0 -773
  817. package/.claude/skills/command-guide/scripts/analyze_commands.py +0 -502
  818. package/.claude/skills/command-guide/scripts/update-index.sh +0 -130
  819. package/.claude/skills/command-guide/templates/issue-bug.md +0 -104
  820. package/.claude/skills/command-guide/templates/issue-diagnosis.md +0 -275
  821. package/.claude/skills/command-guide/templates/issue-feature.md +0 -97
  822. package/.claude/skills/command-guide/templates/issue-question.md +0 -141
@@ -1,22 +1,54 @@
1
- // @ts-nocheck
2
1
  /**
3
2
  * Rules Routes Module
4
3
  * Handles all Rules-related API endpoints
5
4
  */
6
- import type { IncomingMessage, ServerResponse } from 'http';
7
5
  import { readFileSync, existsSync, readdirSync, unlinkSync, promises as fsPromises } from 'fs';
8
6
  import { join } from 'path';
9
7
  import { homedir } from 'os';
10
8
  import { executeCliTool } from '../../tools/cli-executor.js';
9
+ import { SmartContentFormatter } from '../../tools/cli-output-converter.js';
10
+ import type { RouteContext } from './types.js';
11
11
 
12
- export interface RouteContext {
13
- pathname: string;
14
- url: URL;
15
- req: IncomingMessage;
16
- res: ServerResponse;
17
- initialPath: string;
18
- handlePostRequest: (req: IncomingMessage, res: ServerResponse, handler: (body: unknown) => Promise<any>) => void;
19
- broadcastToClients: (data: unknown) => void;
12
+ interface ParsedRuleFrontmatter {
13
+ paths: string[];
14
+ content: string;
15
+ }
16
+
17
+ interface RuleDetail {
18
+ name: string;
19
+ paths: string[];
20
+ content: string;
21
+ location: string;
22
+ path: string;
23
+ subdirectory: string | null;
24
+ }
25
+
26
+ interface RuleConfigResult {
27
+ projectRules: RuleDetail[];
28
+ userRules: RuleDetail[];
29
+ }
30
+
31
+ interface RuleCreateParams {
32
+ fileName: string;
33
+ content: string;
34
+ paths: string[];
35
+ location: string;
36
+ subdirectory: string;
37
+ projectPath: string;
38
+ }
39
+
40
+ interface RuleGenerateParams {
41
+ generationType: string;
42
+ description?: string;
43
+ templateType?: string;
44
+ extractScope?: string;
45
+ extractFocus?: string;
46
+ fileName: string;
47
+ location: string;
48
+ subdirectory: string;
49
+ projectPath: string;
50
+ enableReview?: boolean;
51
+ broadcastToClients?: (data: unknown) => void;
20
52
  }
21
53
 
22
54
  /**
@@ -24,8 +56,8 @@ export interface RouteContext {
24
56
  * @param {string} content
25
57
  * @returns {Object}
26
58
  */
27
- function parseRuleFrontmatter(content) {
28
- const result = {
59
+ function parseRuleFrontmatter(content: string): ParsedRuleFrontmatter {
60
+ const result: ParsedRuleFrontmatter = {
29
61
  paths: [],
30
62
  content: content
31
63
  };
@@ -64,8 +96,8 @@ function parseRuleFrontmatter(content) {
64
96
  * @param {string} subdirectory
65
97
  * @returns {Object[]}
66
98
  */
67
- function scanRulesDirectory(dirPath, location, subdirectory) {
68
- const rules = [];
99
+ function scanRulesDirectory(dirPath: string, location: string, subdirectory: string): RuleDetail[] {
100
+ const rules: RuleDetail[] = [];
69
101
 
70
102
  try {
71
103
  const entries = readdirSync(dirPath, { withFileTypes: true });
@@ -102,8 +134,8 @@ function scanRulesDirectory(dirPath, location, subdirectory) {
102
134
  * @param {string} projectPath
103
135
  * @returns {Object}
104
136
  */
105
- function getRulesConfig(projectPath) {
106
- const result = {
137
+ function getRulesConfig(projectPath: string): RuleConfigResult {
138
+ const result: RuleConfigResult = {
107
139
  projectRules: [],
108
140
  userRules: []
109
141
  };
@@ -135,7 +167,7 @@ function getRulesConfig(projectPath) {
135
167
  * @param {string} ruleName
136
168
  * @returns {string|null}
137
169
  */
138
- function findRuleFile(baseDir, ruleName) {
170
+ function findRuleFile(baseDir: string, ruleName: string): string | null {
139
171
  try {
140
172
  // Direct path
141
173
  const directPath = join(baseDir, ruleName);
@@ -164,7 +196,7 @@ function findRuleFile(baseDir, ruleName) {
164
196
  * @param {string} projectPath
165
197
  * @returns {Object}
166
198
  */
167
- function getRuleDetail(ruleName, location, projectPath) {
199
+ function getRuleDetail(ruleName: string, location: string, projectPath: string): { rule?: RuleDetail; error?: string } {
168
200
  try {
169
201
  const baseDir = location === 'project'
170
202
  ? join(projectPath, '.claude', 'rules')
@@ -180,17 +212,26 @@ function getRuleDetail(ruleName, location, projectPath) {
180
212
  const content = readFileSync(rulePath, 'utf8');
181
213
  const parsed = parseRuleFrontmatter(content);
182
214
 
215
+ const normalizedBaseDir = baseDir.replace(/\\/g, '/').replace(/\/+$/, '');
216
+ const normalizedRulePath = rulePath.replace(/\\/g, '/');
217
+ const relativePath = normalizedRulePath.startsWith(`${normalizedBaseDir}/`)
218
+ ? normalizedRulePath.slice(normalizedBaseDir.length + 1)
219
+ : ruleName;
220
+ const relativeParts = relativePath.split('/');
221
+ const subdirectory = relativeParts.length > 1 ? relativeParts.slice(0, -1).join('/') : null;
222
+
183
223
  return {
184
224
  rule: {
185
225
  name: ruleName,
186
226
  paths: parsed.paths,
187
227
  content: parsed.content,
188
228
  location,
189
- path: rulePath
229
+ path: rulePath,
230
+ subdirectory
190
231
  }
191
232
  };
192
233
  } catch (error) {
193
- return { error: (error as Error).message };
234
+ return { error: error instanceof Error ? error.message : String(error) };
194
235
  }
195
236
  }
196
237
 
@@ -201,7 +242,11 @@ function getRuleDetail(ruleName, location, projectPath) {
201
242
  * @param {string} projectPath
202
243
  * @returns {Object}
203
244
  */
204
- function deleteRule(ruleName, location, projectPath) {
245
+ function deleteRule(
246
+ ruleName: string,
247
+ location: string,
248
+ projectPath: string
249
+ ): { success: true; ruleName: string; location: string } | { error: string; status?: number } {
205
250
  try {
206
251
  const baseDir = location === 'project'
207
252
  ? join(projectPath, '.claude', 'rules')
@@ -217,10 +262,314 @@ function deleteRule(ruleName, location, projectPath) {
217
262
 
218
263
  return { success: true, ruleName, location };
219
264
  } catch (error) {
220
- return { error: (error as Error).message };
265
+ return { error: error instanceof Error ? error.message : String(error) };
221
266
  }
222
267
  }
223
268
 
269
+ /**
270
+ * Infer rule context from file name and subdirectory for better prompt generation
271
+ * @param {string} fileName - Rule file name
272
+ * @param {string} subdirectory - Optional subdirectory path
273
+ * @param {string} location - 'project' or 'user'
274
+ * @returns {Object} Inferred context
275
+ */
276
+ function inferRuleContext(fileName: string, subdirectory: string, location: string) {
277
+ const normalizedName = fileName.replace(/\.md$/i, '').toLowerCase();
278
+ const normalizedSubdir = (subdirectory || '').toLowerCase();
279
+
280
+ // Rule category inference from file name and subdirectory
281
+ const categories = {
282
+ coding: ['coding', 'code', 'style', 'format', 'lint', 'convention'],
283
+ testing: ['test', 'spec', 'jest', 'vitest', 'mocha', 'coverage'],
284
+ security: ['security', 'auth', 'permission', 'access', 'secret', 'credential'],
285
+ architecture: ['arch', 'design', 'pattern', 'structure', 'module', 'layer'],
286
+ documentation: ['doc', 'comment', 'readme', 'jsdoc', 'api-doc'],
287
+ performance: ['perf', 'performance', 'optimize', 'cache', 'memory'],
288
+ workflow: ['workflow', 'ci', 'cd', 'deploy', 'build', 'release'],
289
+ tooling: ['tool', 'cli', 'script', 'npm', 'yarn', 'pnpm'],
290
+ error: ['error', 'exception', 'handling', 'logging', 'debug']
291
+ };
292
+
293
+ let inferredCategory = 'general';
294
+ let inferredKeywords: string[] = [];
295
+
296
+ for (const [category, keywords] of Object.entries(categories)) {
297
+ for (const keyword of keywords) {
298
+ if (normalizedName.includes(keyword) || normalizedSubdir.includes(keyword)) {
299
+ inferredCategory = category;
300
+ inferredKeywords = keywords;
301
+ break;
302
+ }
303
+ }
304
+ if (inferredCategory !== 'general') break;
305
+ }
306
+
307
+ // Scope inference from location
308
+ const scopeHint = location === 'project'
309
+ ? 'This rule applies to the current project only'
310
+ : 'This rule applies globally to all projects';
311
+
312
+ // Technology hints from file name
313
+ const techPatterns = {
314
+ typescript: ['ts', 'typescript', 'tsc'],
315
+ javascript: ['js', 'javascript', 'node'],
316
+ react: ['react', 'jsx', 'tsx', 'component'],
317
+ vue: ['vue', 'vuex', 'pinia'],
318
+ python: ['python', 'py', 'pip', 'poetry'],
319
+ rust: ['rust', 'cargo', 'rs'],
320
+ go: ['go', 'golang', 'mod'],
321
+ java: ['java', 'maven', 'gradle', 'spring']
322
+ };
323
+
324
+ let inferredTech: string | null = null;
325
+ for (const [tech, patterns] of Object.entries(techPatterns)) {
326
+ if (patterns.some(p => normalizedName.includes(p) || normalizedSubdir.includes(p))) {
327
+ inferredTech = tech;
328
+ break;
329
+ }
330
+ }
331
+
332
+ return {
333
+ category: inferredCategory,
334
+ keywords: inferredKeywords,
335
+ scopeHint,
336
+ technology: inferredTech,
337
+ isConditional: normalizedSubdir.length > 0
338
+ };
339
+ }
340
+
341
+ /**
342
+ * Build structured prompt for rule generation
343
+ * @param {Object} params
344
+ * @returns {string} Structured prompt
345
+ */
346
+ function buildStructuredRulePrompt(params: {
347
+ description: string;
348
+ fileName: string;
349
+ subdirectory: string;
350
+ location: string;
351
+ context: ReturnType<typeof inferRuleContext>;
352
+ enableReview?: boolean;
353
+ }) {
354
+ const { description, fileName, subdirectory, location, context, enableReview } = params;
355
+
356
+ // Build category-specific guidance
357
+ const categoryGuidance: Record<string, string> = {
358
+ coding: 'Focus on code style, naming conventions, and formatting rules. Include specific examples of correct and incorrect patterns.',
359
+ testing: 'Emphasize test structure, coverage expectations, mocking strategies, and assertion patterns.',
360
+ security: 'Highlight security best practices, input validation, authentication requirements, and sensitive data handling.',
361
+ architecture: 'Define module boundaries, dependency rules, layer responsibilities, and design pattern usage.',
362
+ documentation: 'Specify documentation requirements, comment styles, and API documentation standards.',
363
+ performance: 'Address caching strategies, optimization guidelines, resource management, and performance metrics.',
364
+ workflow: 'Define CI/CD requirements, deployment procedures, and release management rules.',
365
+ tooling: 'Specify tool configurations, script conventions, and dependency management rules.',
366
+ error: 'Define error handling patterns, logging requirements, and exception management.',
367
+ general: 'Provide clear, actionable guidelines that Claude can follow consistently.'
368
+ };
369
+
370
+ const guidance = categoryGuidance[context.category] || categoryGuidance.general;
371
+
372
+ // Build technology-specific hint
373
+ const techHint = context.technology
374
+ ? `\nTECHNOLOGY CONTEXT: This rule is for ${context.technology} development. Use ${context.technology}-specific best practices and terminology.`
375
+ : '';
376
+
377
+ // Build subdirectory context
378
+ const subdirHint = subdirectory
379
+ ? `\nORGANIZATION: This rule will be placed in the "${subdirectory}" subdirectory, indicating its category/scope.`
380
+ : '';
381
+
382
+ // Build review instruction if enabled
383
+ const reviewInstruction = enableReview
384
+ ? `\n\nAFTER GENERATION:
385
+ - Verify the rule is specific and actionable
386
+ - Check for ambiguous language that could be misinterpreted
387
+ - Ensure examples are clear and relevant
388
+ - Validate markdown formatting is correct`
389
+ : '';
390
+
391
+ return `PURPOSE: Generate a high-quality Claude Code memory rule that will guide Claude's behavior when working in this codebase
392
+ SUCCESS CRITERIA: The rule must be (1) specific and actionable, (2) include concrete examples, (3) avoid ambiguous language, (4) follow Claude Code rule format
393
+
394
+ TASK:
395
+ • Parse the user's description to identify core requirements
396
+ • Infer additional context from file name "${fileName}" and category "${context.category}"
397
+ • Generate structured markdown content with clear instructions
398
+ • Include DO and DON'T examples where appropriate
399
+ • ${context.isConditional ? 'Consider if frontmatter paths are needed for conditional activation' : 'Create as a global rule'}
400
+
401
+ MODE: write
402
+
403
+ RULE CATEGORY: ${context.category}
404
+ CATEGORY GUIDANCE: ${guidance}
405
+ ${techHint}
406
+ ${subdirHint}
407
+ SCOPE: ${context.scopeHint}
408
+
409
+ EXPECTED OUTPUT FORMAT:
410
+ \`\`\`markdown
411
+ ${context.isConditional ? `---
412
+ paths: [specific/path/patterns/**/*]
413
+ ---
414
+
415
+ ` : ''}# Rule Title
416
+
417
+ Brief description of what this rule enforces.
418
+
419
+ ## Guidelines
420
+
421
+ 1. **First guideline** - Explanation
422
+ 2. **Second guideline** - Explanation
423
+
424
+ ## Examples
425
+
426
+ ### ✅ Correct
427
+ \`\`\`language
428
+ // Good example
429
+ \`\`\`
430
+
431
+ ### ❌ Incorrect
432
+ \`\`\`language
433
+ // Bad example
434
+ \`\`\`
435
+
436
+ ## Exceptions
437
+
438
+ - When this rule may not apply
439
+ \`\`\`
440
+
441
+ USER DESCRIPTION:
442
+ ${description}
443
+
444
+ FILE NAME: ${fileName}
445
+ ${subdirectory ? `SUBDIRECTORY: ${subdirectory}` : ''}
446
+ ${reviewInstruction}
447
+
448
+ RULES: $(cat ~/.claude/workflows/cli-templates/prompts/universal/00-universal-rigorous-style.txt) | Generate ONLY the rule content in markdown | No additional commentary | Do NOT use any tools | Output raw markdown text directly | write=CREATE`;
449
+ }
450
+
451
+ /**
452
+ * Build structured prompt for code extraction
453
+ * @param {Object} params
454
+ * @returns {string} Structured prompt
455
+ */
456
+ function buildExtractPrompt(params: {
457
+ extractScope: string;
458
+ extractFocus: string;
459
+ fileName: string;
460
+ subdirectory: string;
461
+ context: ReturnType<typeof inferRuleContext>;
462
+ }) {
463
+ const { extractScope, extractFocus, fileName, subdirectory, context } = params;
464
+
465
+ const scope = extractScope || '**/*';
466
+ const focus = extractFocus || 'naming conventions, error handling, code structure, patterns';
467
+
468
+ return `PURPOSE: Extract and document coding conventions from the existing codebase to create a Claude Code memory rule
469
+ SUCCESS CRITERIA: The rule must reflect ACTUAL patterns found in the code, not theoretical best practices
470
+
471
+ TASK:
472
+ • Scan files matching "${scope}" for recurring patterns
473
+ • Identify ${focus.split(',').length} or more distinct conventions
474
+ • Document each pattern with real code examples from the codebase
475
+ • Create actionable rules based on observed practices
476
+ • Note any inconsistencies found (optional section)
477
+
478
+ MODE: analysis
479
+
480
+ ANALYSIS SCOPE: @${scope}
481
+ FOCUS AREAS: ${focus}
482
+
483
+ EXTRACTION STRATEGY:
484
+ 1. **Pattern Recognition**: Look for repeated code structures, naming patterns, file organization
485
+ 2. **Consistency Check**: Identify which patterns are consistently followed vs. occasionally violated
486
+ 3. **Frequency Analysis**: Prioritize patterns that appear most frequently
487
+ 4. **Context Awareness**: Consider why certain patterns are used (performance, readability, etc.)
488
+
489
+ EXPECTED OUTPUT FORMAT:
490
+ \`\`\`markdown
491
+ # ${fileName.replace(/\.md$/i, '')} Conventions
492
+
493
+ Conventions extracted from codebase analysis of \`${scope}\`.
494
+
495
+ ## Naming Conventions
496
+
497
+ - **Pattern name**: Description with example
498
+ \`\`\`language
499
+ // Actual code from codebase
500
+ \`\`\`
501
+
502
+ ## Code Structure
503
+
504
+ - **Pattern name**: Description with example
505
+
506
+ ## Error Handling
507
+
508
+ - **Pattern name**: Description with example
509
+
510
+ ## Notes
511
+
512
+ - Any inconsistencies or variations observed
513
+ \`\`\`
514
+
515
+ FILE NAME: ${fileName}
516
+ ${subdirectory ? `SUBDIRECTORY: ${subdirectory}` : ''}
517
+ INFERRED CATEGORY: ${context.category}
518
+
519
+ RULES: $(cat ~/.claude/workflows/cli-templates/prompts/analysis/02-analyze-code-patterns.txt) | Extract REAL patterns from code | Include actual code snippets as examples | Do NOT use any tools | Output raw markdown text directly | analysis=READ-ONLY`;
520
+ }
521
+
522
+ /**
523
+ * Build review prompt for validating and improving generated rules
524
+ * @param {string} content - Generated rule content to review
525
+ * @param {string} fileName - Target file name
526
+ * @param {Object} context - Inferred context
527
+ * @returns {string} Review prompt
528
+ */
529
+ function buildReviewPrompt(
530
+ content: string,
531
+ fileName: string,
532
+ context: ReturnType<typeof inferRuleContext>
533
+ ) {
534
+ return `PURPOSE: Review and improve a Claude Code memory rule for quality, clarity, and actionability
535
+ SUCCESS CRITERIA: Output an improved version that is (1) more specific, (2) includes better examples, (3) has no ambiguous language
536
+
537
+ TASK:
538
+ • Analyze the rule for clarity and specificity
539
+ • Check if guidelines are actionable (Claude can follow them)
540
+ • Verify examples are concrete and helpful
541
+ • Remove any ambiguous or vague language
542
+ • Ensure markdown formatting is correct
543
+ • Improve structure if needed
544
+ • Keep the core intent and requirements intact
545
+
546
+ MODE: write
547
+
548
+ REVIEW CRITERIA:
549
+ 1. **Specificity**: Each guideline should be specific enough to follow without interpretation
550
+ 2. **Actionability**: Guidelines should tell Claude exactly what to do or not do
551
+ 3. **Examples**: Good and bad examples should be clearly different and illustrative
552
+ 4. **Consistency**: Formatting and style should be consistent throughout
553
+ 5. **Completeness**: All necessary aspects of the rule should be covered
554
+ 6. **Conciseness**: No unnecessary verbosity or repetition
555
+
556
+ RULE CATEGORY: ${context.category}
557
+ FILE NAME: ${fileName}
558
+
559
+ ORIGINAL RULE CONTENT:
560
+ \`\`\`markdown
561
+ ${content}
562
+ \`\`\`
563
+
564
+ EXPECTED OUTPUT:
565
+ - Output ONLY the improved rule content in markdown format
566
+ - Do NOT include any commentary, explanation, or meta-text
567
+ - If the original is already high quality, return it unchanged
568
+ - Preserve any frontmatter (---paths---) if present
569
+
570
+ RULES: $(cat ~/.claude/workflows/cli-templates/prompts/universal/00-universal-rigorous-style.txt) | Output ONLY improved markdown content | No additional text | Do NOT use any tools | Output raw markdown text directly | write=CREATE`;
571
+ }
572
+
224
573
  /**
225
574
  * Generate rule content via CLI tool
226
575
  * @param {Object} params
@@ -233,9 +582,13 @@ function deleteRule(ruleName, location, projectPath) {
233
582
  * @param {string} params.location - 'project' or 'user'
234
583
  * @param {string} params.subdirectory - Optional subdirectory
235
584
  * @param {string} params.projectPath - Project root path
585
+ * @param {boolean} params.enableReview - Optional: enable secondary review
236
586
  * @returns {Object}
237
587
  */
238
- async function generateRuleViaCLI(params) {
588
+ async function generateRuleViaCLI(params: RuleGenerateParams): Promise<Record<string, unknown>> {
589
+ // Generate unique execution ID for tracking
590
+ const executionId = `rule-gen-${params.fileName.replace('.md', '')}-${Date.now()}`;
591
+
239
592
  try {
240
593
  const {
241
594
  generationType,
@@ -246,60 +599,107 @@ async function generateRuleViaCLI(params) {
246
599
  fileName,
247
600
  location,
248
601
  subdirectory,
249
- projectPath
602
+ projectPath,
603
+ enableReview,
604
+ broadcastToClients
250
605
  } = params;
251
606
 
252
607
  let prompt = '';
253
608
  let mode = 'analysis';
254
609
  let workingDir = projectPath;
255
610
 
611
+ // Infer context from file name and subdirectory
612
+ const context = inferRuleContext(fileName, subdirectory || '', location);
613
+
256
614
  // Build prompt based on generation type
257
615
  if (generationType === 'description') {
258
616
  mode = 'write';
259
- prompt = `PURPOSE: Generate Claude Code memory rule from description to guide Claude's behavior
260
- TASK: Analyze rule requirements • Generate markdown content with clear instructions
261
- MODE: write
262
- EXPECTED: Complete rule content in markdown format
263
- RULES: $(cat ~/.claude/workflows/cli-templates/prompts/universal/00-universal-rigorous-style.txt) | Follow Claude Code rule format | Use frontmatter for conditional rules if paths specified | write=CREATE
264
-
265
- RULE DESCRIPTION:
266
- ${description}
267
-
268
- FILE NAME: ${fileName}`;
617
+ prompt = buildStructuredRulePrompt({
618
+ description: description || '',
619
+ fileName,
620
+ subdirectory: subdirectory || '',
621
+ location,
622
+ context,
623
+ enableReview
624
+ });
269
625
  } else if (generationType === 'template') {
270
626
  mode = 'write';
271
627
  prompt = `PURPOSE: Generate Claude Code rule from template type
272
628
  TASK: • Create rule based on ${templateType} template • Generate structured markdown content
273
629
  MODE: write
274
630
  EXPECTED: Complete rule content in markdown format following template structure
275
- RULES: $(cat ~/.claude/workflows/cli-templates/prompts/universal/00-universal-rigorous-style.txt) | Follow Claude Code rule format | Use ${templateType} template patterns | write=CREATE
631
+ RULES: $(cat ~/.claude/workflows/cli-templates/prompts/universal/00-universal-rigorous-style.txt) | Follow Claude Code rule format | Use ${templateType} template patterns | Do NOT use any tools | Output raw markdown text directly | write=CREATE
276
632
 
277
633
  TEMPLATE TYPE: ${templateType}
278
634
  FILE NAME: ${fileName}`;
279
635
  } else if (generationType === 'extract') {
280
636
  mode = 'analysis';
281
- prompt = `PURPOSE: Extract coding rules from existing codebase to document patterns and conventions
282
- TASK: Analyze code patterns in specified scope • Extract common conventions • Identify best practices
283
- MODE: analysis
284
- CONTEXT: @${extractScope || '**/*'}
285
- EXPECTED: Rule content based on codebase analysis with examples
286
- RULES: $(cat ~/.claude/workflows/cli-templates/prompts/analysis/02-analyze-code-patterns.txt) | Focus on actual patterns found | Include code examples | analysis=READ-ONLY
287
-
288
- ANALYSIS SCOPE: ${extractScope || '**/*'}
289
- FOCUS AREAS: ${extractFocus || 'naming conventions, error handling, code structure'}`;
637
+ prompt = buildExtractPrompt({
638
+ extractScope: extractScope || '',
639
+ extractFocus: extractFocus || '',
640
+ fileName,
641
+ subdirectory: subdirectory || '',
642
+ context
643
+ });
290
644
  } else {
291
645
  return { error: `Unknown generation type: ${generationType}` };
292
646
  }
293
647
 
648
+ // Broadcast CLI_EXECUTION_STARTED event
649
+ if (broadcastToClients) {
650
+ broadcastToClients({
651
+ type: 'CLI_EXECUTION_STARTED',
652
+ payload: {
653
+ executionId,
654
+ tool: 'claude',
655
+ mode,
656
+ category: 'internal',
657
+ context: 'rule-generation',
658
+ fileName
659
+ }
660
+ });
661
+ }
662
+
663
+ // Create onOutput callback for real-time streaming
664
+ const onOutput = broadcastToClients
665
+ ? (unit: import('../../tools/cli-output-converter.js').CliOutputUnit) => {
666
+ // CliOutputUnit handler: use SmartContentFormatter for intelligent formatting (never returns null)
667
+ const content = SmartContentFormatter.format(unit.content, unit.type);
668
+ broadcastToClients({
669
+ type: 'CLI_OUTPUT',
670
+ payload: {
671
+ executionId,
672
+ chunkType: unit.type,
673
+ data: content
674
+ }
675
+ });
676
+ }
677
+ : undefined;
678
+
294
679
  // Execute CLI tool (Claude) with at least 10 minutes timeout
680
+ const startTime = Date.now();
295
681
  const result = await executeCliTool({
296
682
  tool: 'claude',
297
683
  prompt,
298
684
  mode,
299
685
  cd: workingDir,
300
686
  timeout: 600000, // 10 minutes
301
- category: 'internal'
302
- });
687
+ category: 'internal',
688
+ id: executionId
689
+ }, onOutput);
690
+
691
+ // Broadcast CLI_EXECUTION_COMPLETED event
692
+ if (broadcastToClients) {
693
+ broadcastToClients({
694
+ type: 'CLI_EXECUTION_COMPLETED',
695
+ payload: {
696
+ executionId,
697
+ success: result.success,
698
+ status: result.execution?.status || (result.success ? 'success' : 'error'),
699
+ duration_ms: Date.now() - startTime
700
+ }
701
+ });
702
+ }
303
703
 
304
704
  if (!result.success) {
305
705
  return {
@@ -308,8 +708,15 @@ FOCUS AREAS: ${extractFocus || 'naming conventions, error handling, code structu
308
708
  };
309
709
  }
310
710
 
311
- // Extract generated content from stdout
312
- const generatedContent = result.stdout.trim();
711
+ // Extract generated content - prefer parsedOutput (extracted text from stream JSON)
712
+ let generatedContent = (result.parsedOutput || result.stdout || '').trim();
713
+
714
+ // Remove markdown code block wrapper if present (e.g., ```markdown...```)
715
+ if (generatedContent.startsWith('```markdown')) {
716
+ generatedContent = generatedContent.replace(/^```markdown\s*\n?/, '').replace(/\n?```\s*$/, '');
717
+ } else if (generatedContent.startsWith('```')) {
718
+ generatedContent = generatedContent.replace(/^```\w*\s*\n?/, '').replace(/\n?```\s*$/, '');
719
+ }
313
720
 
314
721
  if (!generatedContent) {
315
722
  return {
@@ -319,6 +726,87 @@ FOCUS AREAS: ${extractFocus || 'naming conventions, error handling, code structu
319
726
  };
320
727
  }
321
728
 
729
+ // Optional review step - verify and improve the generated rule
730
+ let reviewResult = null;
731
+ if (enableReview) {
732
+ const reviewPrompt = buildReviewPrompt(generatedContent, fileName, context);
733
+ const reviewExecutionId = `${executionId}-review`;
734
+
735
+ // Broadcast review CLI_EXECUTION_STARTED event
736
+ if (broadcastToClients) {
737
+ broadcastToClients({
738
+ type: 'CLI_EXECUTION_STARTED',
739
+ payload: {
740
+ executionId: reviewExecutionId,
741
+ tool: 'claude',
742
+ mode: 'write',
743
+ category: 'internal',
744
+ context: 'rule-review',
745
+ fileName
746
+ }
747
+ });
748
+ }
749
+
750
+ // Create onOutput callback for review step
751
+ const reviewOnOutput = broadcastToClients
752
+ ? (unit: import('../../tools/cli-output-converter.js').CliOutputUnit) => {
753
+ // CliOutputUnit handler: use SmartContentFormatter for intelligent formatting (never returns null)
754
+ const content = SmartContentFormatter.format(unit.content, unit.type);
755
+ broadcastToClients({
756
+ type: 'CLI_OUTPUT',
757
+ payload: {
758
+ executionId: reviewExecutionId,
759
+ chunkType: unit.type,
760
+ data: content
761
+ }
762
+ });
763
+ }
764
+ : undefined;
765
+
766
+ const reviewStartTime = Date.now();
767
+ const reviewExecution = await executeCliTool({
768
+ tool: 'claude',
769
+ prompt: reviewPrompt,
770
+ mode: 'write',
771
+ cd: workingDir,
772
+ timeout: 300000, // 5 minutes for review
773
+ category: 'internal',
774
+ id: reviewExecutionId
775
+ }, reviewOnOutput);
776
+
777
+ // Broadcast review CLI_EXECUTION_COMPLETED event
778
+ if (broadcastToClients) {
779
+ broadcastToClients({
780
+ type: 'CLI_EXECUTION_COMPLETED',
781
+ payload: {
782
+ executionId: reviewExecutionId,
783
+ success: reviewExecution.success,
784
+ status: reviewExecution.execution?.status || (reviewExecution.success ? 'success' : 'error'),
785
+ duration_ms: Date.now() - reviewStartTime
786
+ }
787
+ });
788
+ }
789
+
790
+ if (reviewExecution.success) {
791
+ let reviewedContent = (reviewExecution.parsedOutput || reviewExecution.stdout || '').trim();
792
+ // Remove markdown code block wrapper if present
793
+ if (reviewedContent.startsWith('```markdown')) {
794
+ reviewedContent = reviewedContent.replace(/^```markdown\s*\n?/, '').replace(/\n?```\s*$/, '');
795
+ } else if (reviewedContent.startsWith('```')) {
796
+ reviewedContent = reviewedContent.replace(/^```\w*\s*\n?/, '').replace(/\n?```\s*$/, '');
797
+ }
798
+ // Only use reviewed content if it's valid and different
799
+ if (reviewedContent.length > 50 && reviewedContent !== generatedContent) {
800
+ generatedContent = reviewedContent;
801
+ reviewResult = {
802
+ reviewed: true,
803
+ originalLength: (result.parsedOutput || result.stdout || '').trim().length,
804
+ reviewedLength: reviewedContent.length
805
+ };
806
+ }
807
+ }
808
+ }
809
+
322
810
  // Create the rule using the generated content
323
811
  const createResult = await createRule({
324
812
  fileName,
@@ -333,10 +821,11 @@ FOCUS AREAS: ${extractFocus || 'naming conventions, error handling, code structu
333
821
  success: createResult.success || false,
334
822
  ...createResult,
335
823
  generatedContent,
336
- executionId: result.conversation?.id
824
+ executionId: result.conversation?.id,
825
+ review: reviewResult
337
826
  };
338
- } catch (error) {
339
- return { error: (error as Error).message };
827
+ } catch (error: unknown) {
828
+ return { error: error instanceof Error ? error.message : String(error) };
340
829
  }
341
830
  }
342
831
 
@@ -351,7 +840,7 @@ FOCUS AREAS: ${extractFocus || 'naming conventions, error handling, code structu
351
840
  * @param {string} params.projectPath - Project root path
352
841
  * @returns {Object}
353
842
  */
354
- async function createRule(params) {
843
+ async function createRule(params: RuleCreateParams): Promise<Record<string, unknown>> {
355
844
  try {
356
845
  const { fileName, content, paths, location, subdirectory, projectPath } = params;
357
846
 
@@ -402,8 +891,8 @@ paths: [${paths.join(', ')}]
402
891
  path: filePath,
403
892
  subdirectory: subdirectory || null
404
893
  };
405
- } catch (error) {
406
- return { error: (error as Error).message };
894
+ } catch (error: unknown) {
895
+ return { error: error instanceof Error ? error.message : String(error) };
407
896
  }
408
897
  }
409
898
 
@@ -412,7 +901,7 @@ paths: [${paths.join(', ')}]
412
901
  * @returns true if route was handled, false otherwise
413
902
  */
414
903
  export async function handleRulesRoutes(ctx: RouteContext): Promise<boolean> {
415
- const { pathname, url, req, res, initialPath, handlePostRequest } = ctx;
904
+ const { pathname, url, req, res, initialPath, handlePostRequest, broadcastToClients } = ctx;
416
905
 
417
906
  // API: Get all rules
418
907
  if (pathname === '/api/rules') {
@@ -443,8 +932,11 @@ export async function handleRulesRoutes(ctx: RouteContext): Promise<boolean> {
443
932
  if (pathname.startsWith('/api/rules/') && req.method === 'DELETE') {
444
933
  const ruleName = decodeURIComponent(pathname.replace('/api/rules/', ''));
445
934
  handlePostRequest(req, res, async (body) => {
446
- const { location, projectPath: projectPathParam } = body;
447
- return deleteRule(ruleName, location, projectPathParam || initialPath);
935
+ const { location, projectPath: projectPathParam } = body as { location?: unknown; projectPath?: unknown };
936
+ const resolvedLocation = typeof location === 'string' && location.trim().length > 0 ? location : 'project';
937
+ const resolvedProjectPath =
938
+ typeof projectPathParam === 'string' && projectPathParam.trim().length > 0 ? projectPathParam : initialPath;
939
+ return deleteRule(ruleName, resolvedLocation, resolvedProjectPath);
448
940
  });
449
941
  return true;
450
942
  }
@@ -460,63 +952,90 @@ export async function handleRulesRoutes(ctx: RouteContext): Promise<boolean> {
460
952
  location,
461
953
  subdirectory,
462
954
  projectPath: projectPathParam,
463
- // CLI generation parameters
464
955
  generationType,
465
956
  description,
466
957
  templateType,
467
958
  extractScope,
468
959
  extractFocus
469
- } = body;
960
+ } = body as {
961
+ mode?: unknown;
962
+ fileName?: unknown;
963
+ content?: unknown;
964
+ paths?: unknown;
965
+ location?: unknown;
966
+ subdirectory?: unknown;
967
+ projectPath?: unknown;
968
+ generationType?: unknown;
969
+ description?: unknown;
970
+ templateType?: unknown;
971
+ extractScope?: unknown;
972
+ extractFocus?: unknown;
973
+ };
470
974
 
471
- if (!fileName) {
975
+ const resolvedMode = typeof mode === 'string' ? mode : '';
976
+ const resolvedFileName = typeof fileName === 'string' ? fileName : '';
977
+ const resolvedContent = typeof content === 'string' ? content : '';
978
+ const resolvedLocation = typeof location === 'string' && location.trim().length > 0 ? location : '';
979
+ const resolvedSubdirectory = typeof subdirectory === 'string' ? subdirectory : '';
980
+ const resolvedProjectPath =
981
+ typeof projectPathParam === 'string' && projectPathParam.trim().length > 0 ? projectPathParam : initialPath;
982
+ const resolvedGenerationType = typeof generationType === 'string' ? generationType : '';
983
+ const resolvedDescription = typeof description === 'string' ? description : undefined;
984
+ const resolvedTemplateType = typeof templateType === 'string' ? templateType : undefined;
985
+ const resolvedExtractScope = typeof extractScope === 'string' ? extractScope : undefined;
986
+ const resolvedExtractFocus = typeof extractFocus === 'string' ? extractFocus : undefined;
987
+ const resolvedPaths = Array.isArray(paths) ? paths.filter((p): p is string => typeof p === 'string') : [];
988
+
989
+ if (!resolvedFileName) {
472
990
  return { error: 'File name is required' };
473
991
  }
474
992
 
475
- if (!location) {
993
+ if (!resolvedLocation) {
476
994
  return { error: 'Location is required (project or user)' };
477
995
  }
478
996
 
479
- const projectPath = projectPathParam || initialPath;
997
+ const projectPath = resolvedProjectPath;
480
998
 
481
999
  // CLI generation mode
482
- if (mode === 'cli-generate') {
483
- if (!generationType) {
1000
+ if (resolvedMode === 'cli-generate') {
1001
+ if (!resolvedGenerationType) {
484
1002
  return { error: 'generationType is required for CLI generation mode' };
485
1003
  }
486
1004
 
487
1005
  // Validate based on generation type
488
- if (generationType === 'description' && !description) {
1006
+ if (resolvedGenerationType === 'description' && !resolvedDescription) {
489
1007
  return { error: 'description is required for description-based generation' };
490
1008
  }
491
1009
 
492
- if (generationType === 'template' && !templateType) {
1010
+ if (resolvedGenerationType === 'template' && !resolvedTemplateType) {
493
1011
  return { error: 'templateType is required for template-based generation' };
494
1012
  }
495
1013
 
496
1014
  return await generateRuleViaCLI({
497
- generationType,
498
- description,
499
- templateType,
500
- extractScope,
501
- extractFocus,
502
- fileName,
503
- location,
504
- subdirectory: subdirectory || '',
505
- projectPath
1015
+ generationType: resolvedGenerationType,
1016
+ description: resolvedDescription,
1017
+ templateType: resolvedTemplateType,
1018
+ extractScope: resolvedExtractScope,
1019
+ extractFocus: resolvedExtractFocus,
1020
+ fileName: resolvedFileName,
1021
+ location: resolvedLocation,
1022
+ subdirectory: resolvedSubdirectory || '',
1023
+ projectPath,
1024
+ broadcastToClients
506
1025
  });
507
1026
  }
508
1027
 
509
1028
  // Manual creation mode
510
- if (!content) {
1029
+ if (!resolvedContent) {
511
1030
  return { error: 'Content is required for manual creation' };
512
1031
  }
513
1032
 
514
1033
  return await createRule({
515
- fileName,
516
- content,
517
- paths: paths || [],
518
- location,
519
- subdirectory: subdirectory || '',
1034
+ fileName: resolvedFileName,
1035
+ content: resolvedContent,
1036
+ paths: resolvedPaths,
1037
+ location: resolvedLocation,
1038
+ subdirectory: resolvedSubdirectory || '',
520
1039
  projectPath
521
1040
  });
522
1041
  });