claude-code-workflow 6.1.4 → 6.2.2

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 (437) hide show
  1. package/.claude/CLAUDE.md +10 -0
  2. package/.claude/agents/action-planning-agent.md +857 -778
  3. package/.claude/agents/cli-execution-agent.md +266 -269
  4. package/.claude/agents/cli-explore-agent.md +2 -2
  5. package/.claude/agents/cli-lite-planning-agent.md +142 -92
  6. package/.claude/agents/cli-planning-agent.md +4 -4
  7. package/.claude/agents/code-developer.md +7 -6
  8. package/.claude/agents/conceptual-planning-agent.md +2 -2
  9. package/.claude/agents/context-search-agent.md +31 -32
  10. package/.claude/agents/doc-generator.md +4 -4
  11. package/.claude/agents/memory-bridge.md +93 -93
  12. package/.claude/agents/test-context-search-agent.md +8 -7
  13. package/.claude/agents/test-fix-agent.md +7 -6
  14. package/.claude/commands/clean.md +516 -0
  15. package/.claude/commands/memory/compact.md +383 -0
  16. package/.claude/commands/memory/docs-full-cli.md +471 -471
  17. package/.claude/commands/memory/docs-related-cli.md +386 -386
  18. package/.claude/commands/memory/docs.md +615 -615
  19. package/.claude/commands/memory/load.md +5 -5
  20. package/.claude/commands/memory/tech-research-rules.md +310 -0
  21. package/.claude/commands/memory/update-full.md +332 -332
  22. package/.claude/commands/memory/workflow-skill-memory.md +4 -4
  23. package/.claude/commands/task/create.md +151 -151
  24. package/.claude/commands/version.md +254 -254
  25. package/.claude/commands/workflow/brainstorm/api-designer.md +587 -585
  26. package/.claude/commands/workflow/brainstorm/artifacts.md +1 -0
  27. package/.claude/commands/workflow/brainstorm/auto-parallel.md +443 -443
  28. package/.claude/commands/workflow/brainstorm/data-architect.md +220 -220
  29. package/.claude/commands/workflow/brainstorm/product-manager.md +200 -200
  30. package/.claude/commands/workflow/brainstorm/product-owner.md +200 -200
  31. package/.claude/commands/workflow/brainstorm/scrum-master.md +200 -200
  32. package/.claude/commands/workflow/brainstorm/subject-matter-expert.md +200 -200
  33. package/.claude/commands/workflow/brainstorm/system-architect.md +389 -387
  34. package/.claude/commands/workflow/brainstorm/ui-designer.md +221 -221
  35. package/.claude/commands/workflow/brainstorm/ux-expert.md +221 -221
  36. package/.claude/commands/workflow/debug.md +321 -0
  37. package/.claude/commands/workflow/execute.md +13 -0
  38. package/.claude/commands/workflow/init.md +165 -164
  39. package/.claude/commands/workflow/lite-execute.md +119 -13
  40. package/.claude/commands/workflow/lite-fix.md +623 -621
  41. package/.claude/commands/workflow/lite-plan.md +610 -592
  42. package/.claude/commands/workflow/plan.md +5 -5
  43. package/.claude/commands/workflow/review-module-cycle.md +2 -0
  44. package/.claude/commands/workflow/review-session-cycle.md +2 -0
  45. package/.claude/commands/workflow/review.md +297 -291
  46. package/.claude/commands/workflow/session/complete.md +153 -500
  47. package/.claude/commands/workflow/session/list.md +95 -95
  48. package/.claude/commands/workflow/session/resume.md +60 -60
  49. package/.claude/commands/workflow/session/start.md +199 -199
  50. package/.claude/commands/workflow/tdd-plan.md +3 -3
  51. package/.claude/commands/workflow/tdd-verify.md +23 -9
  52. package/.claude/commands/workflow/test-cycle-execute.md +2 -0
  53. package/.claude/commands/workflow/test-fix-gen.md +699 -699
  54. package/.claude/commands/workflow/tools/conflict-resolution.md +104 -18
  55. package/.claude/commands/workflow/tools/context-gather.md +436 -434
  56. package/.claude/commands/workflow/tools/task-generate-agent.md +490 -291
  57. package/.claude/commands/workflow/tools/task-generate-tdd.md +18 -10
  58. package/.claude/commands/workflow/tools/test-concept-enhanced.md +2 -1
  59. package/.claude/commands/workflow/tools/test-context-gather.md +1 -0
  60. package/.claude/commands/workflow/tools/test-task-generate.md +1 -0
  61. package/.claude/commands/workflow/ui-design/import-from-code.md +9 -6
  62. package/.claude/skills/command-guide/SKILL.md +5 -5
  63. package/.claude/skills/command-guide/index/all-commands.json +1 -1
  64. package/.claude/skills/command-guide/index/by-category.json +1 -1
  65. package/.claude/skills/command-guide/index/by-use-case.json +1 -1
  66. package/.claude/skills/command-guide/reference/agents/action-planning-agent.md +857 -778
  67. package/.claude/skills/command-guide/reference/agents/cli-execution-agent.md +266 -269
  68. package/.claude/skills/command-guide/reference/agents/cli-explore-agent.md +2 -2
  69. package/.claude/skills/command-guide/reference/agents/cli-lite-planning-agent.md +142 -92
  70. package/.claude/skills/command-guide/reference/agents/cli-planning-agent.md +4 -4
  71. package/.claude/skills/command-guide/reference/agents/code-developer.md +7 -6
  72. package/.claude/skills/command-guide/reference/agents/conceptual-planning-agent.md +2 -2
  73. package/.claude/skills/command-guide/reference/agents/context-search-agent.md +31 -32
  74. package/.claude/skills/command-guide/reference/agents/doc-generator.md +4 -4
  75. package/.claude/skills/command-guide/reference/agents/memory-bridge.md +93 -93
  76. package/.claude/skills/command-guide/reference/agents/test-context-search-agent.md +8 -7
  77. package/.claude/skills/command-guide/reference/agents/test-fix-agent.md +7 -6
  78. package/.claude/skills/command-guide/reference/commands/memory/docs-full-cli.md +471 -471
  79. package/.claude/skills/command-guide/reference/commands/memory/docs-related-cli.md +386 -386
  80. package/.claude/skills/command-guide/reference/commands/memory/docs.md +17 -16
  81. package/.claude/skills/command-guide/reference/commands/memory/load.md +5 -5
  82. package/.claude/skills/command-guide/reference/commands/memory/tech-research.md +194 -357
  83. package/.claude/skills/command-guide/reference/commands/memory/update-full.md +332 -332
  84. package/.claude/skills/command-guide/reference/commands/memory/workflow-skill-memory.md +4 -4
  85. package/.claude/skills/command-guide/reference/commands/task/create.md +151 -151
  86. package/.claude/skills/command-guide/reference/commands/version.md +254 -254
  87. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/api-designer.md +585 -585
  88. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/auto-parallel.md +443 -443
  89. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/data-architect.md +220 -220
  90. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-manager.md +200 -200
  91. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-owner.md +200 -200
  92. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/scrum-master.md +200 -200
  93. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/subject-matter-expert.md +200 -200
  94. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/system-architect.md +387 -387
  95. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ui-designer.md +221 -221
  96. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ux-expert.md +221 -221
  97. package/.claude/skills/command-guide/reference/commands/workflow/execute.md +25 -20
  98. package/.claude/skills/command-guide/reference/commands/workflow/init.md +164 -164
  99. package/.claude/skills/command-guide/reference/commands/workflow/lite-execute.md +748 -686
  100. package/.claude/skills/command-guide/reference/commands/workflow/lite-fix.md +664 -621
  101. package/.claude/skills/command-guide/reference/commands/workflow/lite-plan.md +645 -592
  102. package/.claude/skills/command-guide/reference/commands/workflow/plan.md +5 -5
  103. package/.claude/skills/command-guide/reference/commands/workflow/review.md +25 -18
  104. package/.claude/skills/command-guide/reference/commands/workflow/session/complete.md +547 -500
  105. package/.claude/skills/command-guide/reference/commands/workflow/session/list.md +45 -27
  106. package/.claude/skills/command-guide/reference/commands/workflow/session/resume.md +35 -19
  107. package/.claude/skills/command-guide/reference/commands/workflow/session/start.md +90 -33
  108. package/.claude/skills/command-guide/reference/commands/workflow/tdd-plan.md +3 -3
  109. package/.claude/skills/command-guide/reference/commands/workflow/tdd-verify.md +23 -9
  110. package/.claude/skills/command-guide/reference/commands/workflow/test-fix-gen.md +699 -699
  111. package/.claude/skills/command-guide/reference/commands/workflow/tools/conflict-resolution.md +103 -17
  112. package/.claude/skills/command-guide/reference/commands/workflow/tools/context-gather.md +434 -434
  113. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-agent.md +487 -291
  114. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-tdd.md +17 -10
  115. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-concept-enhanced.md +1 -1
  116. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/import-from-code.md +6 -6
  117. package/.claude/workflows/chinese-response.md +38 -0
  118. package/.claude/workflows/cli-templates/prompts/rules/rule-api.txt +122 -0
  119. package/.claude/workflows/cli-templates/prompts/rules/rule-components.txt +122 -0
  120. package/.claude/workflows/cli-templates/prompts/rules/rule-config.txt +89 -0
  121. package/.claude/workflows/cli-templates/prompts/rules/rule-core.txt +60 -0
  122. package/.claude/workflows/cli-templates/prompts/rules/rule-patterns.txt +70 -0
  123. package/.claude/workflows/cli-templates/prompts/rules/rule-testing.txt +81 -0
  124. package/.claude/workflows/cli-templates/prompts/rules/tech-rules-agent-prompt.txt +89 -0
  125. package/.claude/workflows/cli-templates/prompts/workflow/gemini-solution-design.txt +131 -131
  126. package/.claude/workflows/cli-templates/prompts/workflow/skill-conflict-patterns.txt +5 -9
  127. package/.claude/workflows/cli-templates/prompts/workflow/skill-lessons-learned.txt +5 -9
  128. package/.claude/workflows/cli-templates/protocols/analysis-protocol.md +112 -0
  129. package/.claude/workflows/cli-templates/protocols/write-protocol.md +201 -0
  130. package/.claude/workflows/cli-templates/schemas/conflict-resolution-schema.json +137 -0
  131. package/.claude/workflows/cli-templates/schemas/debug-log-json-schema.json +127 -0
  132. package/.claude/workflows/cli-templates/schemas/fix-plan-json-schema.json +25 -0
  133. package/.claude/workflows/cli-templates/schemas/plan-json-schema.json +25 -0
  134. package/.claude/workflows/cli-tools-usage.md +526 -0
  135. package/{CLAUDE.md → .claude/workflows/coding-philosophy.md} +24 -45
  136. package/.claude/workflows/context-tools.md +84 -0
  137. package/.claude/workflows/file-modification.md +64 -0
  138. package/.claude/workflows/tool-strategy.md +216 -79
  139. package/.claude/workflows/windows-platform.md +16 -0
  140. package/.claude/workflows/workflow-architecture.md +942 -942
  141. package/.codex/AGENTS.md +63 -330
  142. package/.codex/prompts/debug.md +318 -0
  143. package/.codex/prompts/execute.md +273 -0
  144. package/.codex/prompts/lite-execute.md +164 -0
  145. package/.codex/prompts/lite-plan.md +469 -0
  146. package/.codex/prompts.zip +0 -0
  147. package/.gemini/GEMINI.md +25 -164
  148. package/.qwen/QWEN.md +0 -139
  149. package/README.md +29 -9
  150. package/ccw/README.md +30 -6
  151. package/ccw/bin/ccw-mcp.js +7 -0
  152. package/ccw/bin/ccw.js +9 -9
  153. package/ccw/package.json +65 -47
  154. package/ccw/src/.workflow/.cli-history/history.db +0 -0
  155. package/ccw/src/.workflow/.cli-history/history.db-shm +0 -0
  156. package/ccw/src/.workflow/.cli-history/history.db-wal +0 -0
  157. package/ccw/src/cli.ts +244 -0
  158. package/ccw/src/commands/cli.ts +740 -0
  159. package/ccw/src/commands/core-memory.ts +770 -0
  160. package/ccw/src/commands/hook.ts +315 -0
  161. package/ccw/src/commands/install.ts +519 -0
  162. package/ccw/src/commands/{list.js → list.ts} +1 -1
  163. package/ccw/src/commands/memory.ts +1090 -0
  164. package/ccw/src/commands/{serve.js → serve.ts} +14 -5
  165. package/ccw/src/commands/session-path-resolver.ts +372 -0
  166. package/ccw/src/commands/session.ts +1141 -0
  167. package/ccw/src/commands/{stop.js → stop.ts} +16 -6
  168. package/ccw/src/commands/tool.ts +201 -0
  169. package/ccw/src/commands/{uninstall.js → uninstall.ts} +89 -40
  170. package/ccw/src/commands/{upgrade.js → upgrade.ts} +68 -23
  171. package/ccw/src/commands/{view.js → view.ts} +22 -8
  172. package/ccw/src/config/storage-paths.ts +670 -0
  173. package/ccw/src/core/cache-manager.ts +294 -0
  174. package/ccw/src/core/claude-freshness.ts +319 -0
  175. package/ccw/src/core/core-memory-store.ts +1528 -0
  176. package/ccw/src/core/{dashboard-generator-patch.js → dashboard-generator-patch.ts} +18 -0
  177. package/ccw/src/core/{dashboard-generator.js → dashboard-generator.ts} +69 -12
  178. package/ccw/src/core/data-aggregator.ts +584 -0
  179. package/ccw/src/core/history-importer.ts +625 -0
  180. package/ccw/src/core/{lite-scanner.js → lite-scanner-complete.ts} +162 -66
  181. package/ccw/src/core/lite-scanner.ts +469 -0
  182. package/ccw/src/core/{manifest.js → manifest.ts} +104 -34
  183. package/ccw/src/core/memory-embedder-bridge.ts +262 -0
  184. package/ccw/src/core/memory-store.ts +978 -0
  185. package/ccw/src/core/routes/ccw-routes.ts +96 -0
  186. package/ccw/src/core/routes/claude-routes.ts +1183 -0
  187. package/ccw/src/core/routes/cli-routes.ts +561 -0
  188. package/ccw/src/core/routes/codexlens-routes.ts +806 -0
  189. package/ccw/src/core/routes/core-memory-routes.ts +605 -0
  190. package/ccw/src/core/routes/files-routes.ts +428 -0
  191. package/ccw/src/core/routes/graph-routes.md +164 -0
  192. package/ccw/src/core/routes/graph-routes.ts +626 -0
  193. package/ccw/src/core/routes/help-routes.ts +308 -0
  194. package/ccw/src/core/routes/hooks-routes.ts +405 -0
  195. package/ccw/src/core/routes/mcp-routes.ts +1271 -0
  196. package/ccw/src/core/routes/mcp-routes.ts.backup +550 -0
  197. package/ccw/src/core/routes/mcp-templates-db.ts +268 -0
  198. package/ccw/src/core/routes/memory-routes.ts +1206 -0
  199. package/ccw/src/core/routes/rules-routes.ts +526 -0
  200. package/ccw/src/core/routes/session-routes.ts +467 -0
  201. package/ccw/src/core/routes/skills-routes.ts +599 -0
  202. package/ccw/src/core/routes/status-routes.ts +57 -0
  203. package/ccw/src/core/routes/system-routes.ts +427 -0
  204. package/ccw/src/core/server.ts +431 -0
  205. package/ccw/src/core/session-clustering-service.ts +1258 -0
  206. package/ccw/src/core/session-scanner.ts +283 -0
  207. package/ccw/src/core/websocket.ts +190 -0
  208. package/ccw/src/{index.js → index.ts} +1 -0
  209. package/ccw/src/mcp-server/index.ts +186 -0
  210. package/ccw/src/templates/assets/css/github-dark.min.css +10 -0
  211. package/ccw/src/templates/assets/css/github.min.css +10 -0
  212. package/ccw/src/templates/assets/js/cytoscape.min.js +32 -0
  213. package/ccw/src/templates/assets/js/d3.min.js +2 -0
  214. package/ccw/src/templates/assets/js/highlight.min.js +1244 -0
  215. package/ccw/src/templates/assets/js/lucide.min.js +12 -0
  216. package/ccw/src/templates/assets/js/marked.min.js +69 -0
  217. package/ccw/src/templates/assets/js/tailwind.js +83 -0
  218. package/ccw/src/templates/dashboard-css/01-base.css +11 -0
  219. package/ccw/src/templates/dashboard-css/02-session.css +22 -0
  220. package/ccw/src/templates/dashboard-css/04-lite-tasks.css +10 -0
  221. package/ccw/src/templates/dashboard-css/06-cards.css +10 -4
  222. package/ccw/src/templates/dashboard-css/07-managers.css +1178 -7
  223. package/ccw/src/templates/dashboard-css/09-explorer.css +23 -12
  224. package/ccw/src/templates/dashboard-css/10-cli-status.css +337 -0
  225. package/ccw/src/templates/dashboard-css/11-cli-history.css +271 -0
  226. package/ccw/src/templates/dashboard-css/12-cli-legacy.css +796 -0
  227. package/ccw/src/templates/dashboard-css/13-cli-ccw.css +199 -0
  228. package/ccw/src/templates/dashboard-css/14-cli-modals.css +258 -0
  229. package/ccw/src/templates/dashboard-css/15-cli-endpoints.css +305 -0
  230. package/ccw/src/templates/dashboard-css/16-cli-session.css +241 -0
  231. package/ccw/src/templates/dashboard-css/17-cli-conversation.css +283 -0
  232. package/ccw/src/templates/dashboard-css/18-cli-settings.css +160 -0
  233. package/ccw/src/templates/dashboard-css/19-cli-native-session.css +496 -0
  234. package/ccw/src/templates/dashboard-css/20-cli-taskqueue.css +188 -0
  235. package/ccw/src/templates/dashboard-css/21-cli-toolmgmt.css +310 -0
  236. package/ccw/src/templates/dashboard-css/22-cli-semantic.css +240 -0
  237. package/ccw/src/templates/dashboard-css/23-memory.css +2390 -0
  238. package/ccw/src/templates/dashboard-css/24-prompt-history.css +1089 -0
  239. package/ccw/src/templates/dashboard-css/25-skills-rules.css +326 -0
  240. package/ccw/src/templates/dashboard-css/26-claude-manager.css +908 -0
  241. package/ccw/src/templates/dashboard-css/27-graph-explorer.css +1678 -0
  242. package/ccw/src/templates/dashboard-css/28-mcp-manager.css +748 -0
  243. package/ccw/src/templates/dashboard-css/29-help.css +264 -0
  244. package/ccw/src/templates/dashboard-css/30-core-memory.css +1700 -0
  245. package/ccw/src/templates/dashboard-js/api.js +162 -142
  246. package/ccw/src/templates/dashboard-js/components/carousel.js +4 -4
  247. package/ccw/src/templates/dashboard-js/components/cli-history.js +876 -0
  248. package/ccw/src/templates/dashboard-js/components/cli-status.js +978 -0
  249. package/ccw/src/templates/dashboard-js/components/global-notifications.js +508 -219
  250. package/ccw/src/templates/dashboard-js/components/hook-manager.js +1277 -282
  251. package/ccw/src/templates/dashboard-js/components/index-manager.js +302 -0
  252. package/ccw/src/templates/dashboard-js/components/mcp-manager.js +718 -27
  253. package/ccw/src/templates/dashboard-js/components/modals.js +66 -0
  254. package/ccw/src/templates/dashboard-js/components/navigation.js +80 -12
  255. package/ccw/src/templates/dashboard-js/components/notifications.js +758 -194
  256. package/ccw/src/templates/dashboard-js/components/storage-manager.js +478 -0
  257. package/ccw/src/templates/dashboard-js/components/tabs-other.js +157 -6
  258. package/ccw/src/templates/dashboard-js/components/task-queue-sidebar.js +716 -0
  259. package/ccw/src/templates/dashboard-js/help-i18n.js +272 -0
  260. package/ccw/src/templates/dashboard-js/i18n.js +2807 -0
  261. package/ccw/src/templates/dashboard-js/main.js +15 -0
  262. package/ccw/src/templates/dashboard-js/state.js +243 -42
  263. package/ccw/src/templates/dashboard-js/utils.js +47 -1
  264. package/ccw/src/templates/dashboard-js/views/claude-manager.js +912 -0
  265. package/ccw/src/templates/dashboard-js/views/cli-manager.js +2272 -0
  266. package/ccw/src/templates/dashboard-js/views/codexlens-manager.js +964 -0
  267. package/ccw/src/templates/dashboard-js/views/core-memory-clusters.js +503 -0
  268. package/ccw/src/templates/dashboard-js/views/core-memory.js +782 -0
  269. package/ccw/src/templates/dashboard-js/views/explorer.js +888 -852
  270. package/ccw/src/templates/dashboard-js/views/graph-explorer.js +1157 -0
  271. package/ccw/src/templates/dashboard-js/views/help.js +856 -0
  272. package/ccw/src/templates/dashboard-js/views/history.js +337 -0
  273. package/ccw/src/templates/dashboard-js/views/home.js +61 -15
  274. package/ccw/src/templates/dashboard-js/views/hook-manager.js +311 -43
  275. package/ccw/src/templates/dashboard-js/views/lite-tasks.js +204 -28
  276. package/ccw/src/templates/dashboard-js/views/mcp-manager.js +2187 -411
  277. package/ccw/src/templates/dashboard-js/views/mcp-manager.js.backup +1729 -0
  278. package/ccw/src/templates/dashboard-js/views/mcp-manager.js.new +928 -0
  279. package/ccw/src/templates/dashboard-js/views/memory.js +1221 -0
  280. package/ccw/src/templates/dashboard-js/views/prompt-history.js +713 -0
  281. package/ccw/src/templates/dashboard-js/views/rules-manager.js +828 -0
  282. package/ccw/src/templates/dashboard-js/views/session-detail.js +54 -53
  283. package/ccw/src/templates/dashboard-js/views/skills-manager.js +819 -0
  284. package/ccw/src/templates/dashboard.html +185 -85
  285. package/ccw/src/templates/hooks-config-example.json +60 -0
  286. package/ccw/src/tools/classify-folders.ts +245 -0
  287. package/ccw/src/tools/cli-config-manager.ts +268 -0
  288. package/ccw/src/tools/cli-executor.ts +2014 -0
  289. package/ccw/src/tools/cli-history-store.ts +1195 -0
  290. package/ccw/src/tools/codex-lens.ts +1141 -0
  291. package/ccw/src/tools/{convert-tokens-to-css.js → convert-tokens-to-css.ts} +73 -23
  292. package/ccw/src/tools/core-memory.ts +444 -0
  293. package/ccw/src/tools/detect-changed-modules.ts +325 -0
  294. package/ccw/src/tools/{discover-design-files.js → discover-design-files.ts} +74 -24
  295. package/ccw/src/tools/edit-file.ts +568 -0
  296. package/ccw/src/tools/{generate-module-docs.js → generate-module-docs.ts} +207 -185
  297. package/ccw/src/tools/{get-modules-by-depth.js → get-modules-by-depth.ts} +120 -79
  298. package/ccw/src/tools/index.ts +370 -0
  299. package/ccw/src/tools/native-session-discovery.ts +795 -0
  300. package/ccw/src/tools/notifier.ts +129 -0
  301. package/ccw/src/tools/read-file.ts +410 -0
  302. package/ccw/src/tools/resume-strategy.ts +345 -0
  303. package/ccw/src/tools/session-content-parser.ts +619 -0
  304. package/ccw/src/tools/session-manager.ts +1026 -0
  305. package/ccw/src/tools/smart-context.ts +228 -0
  306. package/ccw/src/tools/smart-search.ts +2065 -0
  307. package/ccw/src/tools/smart-search.ts.backup +1233 -0
  308. package/ccw/src/tools/storage-manager.ts +455 -0
  309. package/ccw/src/tools/write-file.ts +222 -0
  310. package/ccw/src/types/config.ts +11 -0
  311. package/ccw/src/types/index.ts +3 -0
  312. package/ccw/src/types/session.ts +25 -0
  313. package/ccw/src/types/tool.ts +41 -0
  314. package/ccw/src/utils/{browser-launcher.js → browser-launcher.ts} +10 -8
  315. package/ccw/src/utils/file-utils.ts +48 -0
  316. package/ccw/src/utils/{path-resolver.js → path-resolver.ts} +114 -78
  317. package/ccw/src/utils/path-validator.ts +153 -0
  318. package/ccw/src/utils/{ui.js → ui.ts} +32 -25
  319. package/codex-lens/pyproject.toml +48 -0
  320. package/codex-lens/src/codexlens/.workflow/.cli-history/history.db +0 -0
  321. package/codex-lens/src/codexlens/__init__.py +28 -0
  322. package/codex-lens/src/codexlens/__main__.py +14 -0
  323. package/codex-lens/src/codexlens/__pycache__/__init__.cpython-313.pyc +0 -0
  324. package/codex-lens/src/codexlens/__pycache__/__main__.cpython-313.pyc +0 -0
  325. package/codex-lens/src/codexlens/__pycache__/config.cpython-313.pyc +0 -0
  326. package/codex-lens/src/codexlens/__pycache__/entities.cpython-313.pyc +0 -0
  327. package/codex-lens/src/codexlens/__pycache__/errors.cpython-313.pyc +0 -0
  328. package/codex-lens/src/codexlens/cli/__init__.py +27 -0
  329. package/codex-lens/src/codexlens/cli/__pycache__/__init__.cpython-313.pyc +0 -0
  330. package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-313.pyc +0 -0
  331. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-313.pyc +0 -0
  332. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-313.pyc +0 -0
  333. package/codex-lens/src/codexlens/cli/__pycache__/output.cpython-313.pyc +0 -0
  334. package/codex-lens/src/codexlens/cli/commands.py +1931 -0
  335. package/codex-lens/src/codexlens/cli/embedding_manager.py +620 -0
  336. package/codex-lens/src/codexlens/cli/model_manager.py +289 -0
  337. package/codex-lens/src/codexlens/cli/output.py +124 -0
  338. package/codex-lens/src/codexlens/config.py +201 -0
  339. package/codex-lens/src/codexlens/entities.py +121 -0
  340. package/codex-lens/src/codexlens/errors.py +55 -0
  341. package/codex-lens/src/codexlens/indexing/README.md +77 -0
  342. package/codex-lens/src/codexlens/indexing/__init__.py +4 -0
  343. package/codex-lens/src/codexlens/indexing/__pycache__/__init__.cpython-313.pyc +0 -0
  344. package/codex-lens/src/codexlens/indexing/__pycache__/symbol_extractor.cpython-313.pyc +0 -0
  345. package/codex-lens/src/codexlens/indexing/symbol_extractor.py +243 -0
  346. package/codex-lens/src/codexlens/parsers/__init__.py +8 -0
  347. package/codex-lens/src/codexlens/parsers/__pycache__/__init__.cpython-313.pyc +0 -0
  348. package/codex-lens/src/codexlens/parsers/__pycache__/encoding.cpython-313.pyc +0 -0
  349. package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-313.pyc +0 -0
  350. package/codex-lens/src/codexlens/parsers/__pycache__/tokenizer.cpython-313.pyc +0 -0
  351. package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-313.pyc +0 -0
  352. package/codex-lens/src/codexlens/parsers/encoding.py +202 -0
  353. package/codex-lens/src/codexlens/parsers/factory.py +256 -0
  354. package/codex-lens/src/codexlens/parsers/tokenizer.py +98 -0
  355. package/codex-lens/src/codexlens/parsers/treesitter_parser.py +335 -0
  356. package/codex-lens/src/codexlens/search/__init__.py +15 -0
  357. package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-313.pyc +0 -0
  358. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-313.pyc +0 -0
  359. package/codex-lens/src/codexlens/search/__pycache__/enrichment.cpython-313.pyc +0 -0
  360. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-313.pyc +0 -0
  361. package/codex-lens/src/codexlens/search/__pycache__/query_parser.cpython-313.pyc +0 -0
  362. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-313.pyc +0 -0
  363. package/codex-lens/src/codexlens/search/chain_search.py +647 -0
  364. package/codex-lens/src/codexlens/search/enrichment.py +150 -0
  365. package/codex-lens/src/codexlens/search/hybrid_search.py +313 -0
  366. package/codex-lens/src/codexlens/search/query_parser.py +242 -0
  367. package/codex-lens/src/codexlens/search/ranking.py +274 -0
  368. package/codex-lens/src/codexlens/semantic/__init__.py +39 -0
  369. package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-313.pyc +0 -0
  370. package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-313.pyc +0 -0
  371. package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-313.pyc +0 -0
  372. package/codex-lens/src/codexlens/semantic/__pycache__/code_extractor.cpython-313.pyc +0 -0
  373. package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-313.pyc +0 -0
  374. package/codex-lens/src/codexlens/semantic/__pycache__/graph_analyzer.cpython-313.pyc +0 -0
  375. package/codex-lens/src/codexlens/semantic/__pycache__/llm_enhancer.cpython-313.pyc +0 -0
  376. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-313.pyc +0 -0
  377. package/codex-lens/src/codexlens/semantic/ann_index.py +414 -0
  378. package/codex-lens/src/codexlens/semantic/chunker.py +448 -0
  379. package/codex-lens/src/codexlens/semantic/code_extractor.py +274 -0
  380. package/codex-lens/src/codexlens/semantic/embedder.py +185 -0
  381. package/codex-lens/src/codexlens/semantic/vector_store.py +955 -0
  382. package/codex-lens/src/codexlens/storage/__init__.py +29 -0
  383. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-313.pyc +0 -0
  384. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-313.pyc +0 -0
  385. package/codex-lens/src/codexlens/storage/__pycache__/file_cache.cpython-313.pyc +0 -0
  386. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-313.pyc +0 -0
  387. package/codex-lens/src/codexlens/storage/__pycache__/migration_manager.cpython-313.pyc +0 -0
  388. package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-313.pyc +0 -0
  389. package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-313.pyc +0 -0
  390. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-313.pyc +0 -0
  391. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_utils.cpython-313.pyc +0 -0
  392. package/codex-lens/src/codexlens/storage/dir_index.py +1850 -0
  393. package/codex-lens/src/codexlens/storage/file_cache.py +32 -0
  394. package/codex-lens/src/codexlens/storage/index_tree.py +776 -0
  395. package/codex-lens/src/codexlens/storage/migration_manager.py +154 -0
  396. package/codex-lens/src/codexlens/storage/migrations/__init__.py +1 -0
  397. package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-313.pyc +0 -0
  398. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_001_normalize_keywords.cpython-313.pyc +0 -0
  399. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_002_add_token_metadata.cpython-313.pyc +0 -0
  400. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_003_code_relationships.cpython-313.pyc +0 -0
  401. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_004_dual_fts.cpython-313.pyc +0 -0
  402. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_005_cleanup_unused_fields.cpython-313.pyc +0 -0
  403. package/codex-lens/src/codexlens/storage/migrations/migration_001_normalize_keywords.py +123 -0
  404. package/codex-lens/src/codexlens/storage/migrations/migration_002_add_token_metadata.py +48 -0
  405. package/codex-lens/src/codexlens/storage/migrations/migration_004_dual_fts.py +232 -0
  406. package/codex-lens/src/codexlens/storage/migrations/migration_005_cleanup_unused_fields.py +196 -0
  407. package/codex-lens/src/codexlens/storage/path_mapper.py +274 -0
  408. package/codex-lens/src/codexlens/storage/registry.py +670 -0
  409. package/codex-lens/src/codexlens/storage/sqlite_store.py +576 -0
  410. package/codex-lens/src/codexlens/storage/sqlite_utils.py +64 -0
  411. package/package.json +4 -1
  412. package/.claude/commands/memory/tech-research.md +0 -477
  413. package/.claude/scripts/classify-folders.sh +0 -39
  414. package/.claude/scripts/convert_tokens_to_css.sh +0 -229
  415. package/.claude/scripts/detect_changed_modules.sh +0 -161
  416. package/.claude/scripts/discover-design-files.sh +0 -87
  417. package/.claude/scripts/extract-animations.js +0 -243
  418. package/.claude/scripts/extract-computed-styles.js +0 -118
  419. package/.claude/scripts/extract-layout-structure.js +0 -411
  420. package/.claude/scripts/generate_module_docs.sh +0 -717
  421. package/.claude/scripts/get_modules_by_depth.sh +0 -170
  422. package/.claude/scripts/ui-generate-preview.sh +0 -395
  423. package/.claude/scripts/ui-instantiate-prototypes.sh +0 -815
  424. package/.claude/scripts/update_module_claude.sh +0 -337
  425. package/.claude/workflows/context-search-strategy.md +0 -77
  426. package/.claude/workflows/intelligent-tools-strategy.md +0 -662
  427. package/ccw/src/cli.js +0 -119
  428. package/ccw/src/commands/install.js +0 -324
  429. package/ccw/src/commands/tool.js +0 -138
  430. package/ccw/src/core/data-aggregator.js +0 -409
  431. package/ccw/src/core/server.js +0 -2063
  432. package/ccw/src/core/session-scanner.js +0 -235
  433. package/ccw/src/tools/classify-folders.js +0 -204
  434. package/ccw/src/tools/detect-changed-modules.js +0 -288
  435. package/ccw/src/tools/edit-file.js +0 -266
  436. package/ccw/src/tools/index.js +0 -176
  437. package/ccw/src/utils/file-utils.js +0 -48
@@ -0,0 +1,526 @@
1
+ // @ts-nocheck
2
+ /**
3
+ * Rules Routes Module
4
+ * Handles all Rules-related API endpoints
5
+ */
6
+ import type { IncomingMessage, ServerResponse } from 'http';
7
+ import { readFileSync, existsSync, readdirSync, unlinkSync, promises as fsPromises } from 'fs';
8
+ import { join } from 'path';
9
+ import { homedir } from 'os';
10
+ import { executeCliTool } from '../../tools/cli-executor.js';
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;
20
+ }
21
+
22
+ /**
23
+ * Parse rule frontmatter
24
+ * @param {string} content
25
+ * @returns {Object}
26
+ */
27
+ function parseRuleFrontmatter(content) {
28
+ const result = {
29
+ paths: [],
30
+ content: content
31
+ };
32
+
33
+ // Check for YAML frontmatter
34
+ if (content.startsWith('---')) {
35
+ const endIndex = content.indexOf('---', 3);
36
+ if (endIndex > 0) {
37
+ const frontmatter = content.substring(3, endIndex).trim();
38
+ result.content = content.substring(endIndex + 3).trim();
39
+
40
+ // Parse frontmatter lines
41
+ const lines = frontmatter.split('\n');
42
+ for (const line of lines) {
43
+ const colonIndex = line.indexOf(':');
44
+ if (colonIndex > 0) {
45
+ const key = line.substring(0, colonIndex).trim().toLowerCase();
46
+ const value = line.substring(colonIndex + 1).trim();
47
+
48
+ if (key === 'paths') {
49
+ // Parse as comma-separated or YAML array
50
+ result.paths = value.replace(/^\[|\]$/g, '').split(',').map(t => t.trim()).filter(Boolean);
51
+ }
52
+ }
53
+ }
54
+ }
55
+ }
56
+
57
+ return result;
58
+ }
59
+
60
+ /**
61
+ * Recursively scan rules directory for .md files
62
+ * @param {string} dirPath
63
+ * @param {string} location
64
+ * @param {string} subdirectory
65
+ * @returns {Object[]}
66
+ */
67
+ function scanRulesDirectory(dirPath, location, subdirectory) {
68
+ const rules = [];
69
+
70
+ try {
71
+ const entries = readdirSync(dirPath, { withFileTypes: true });
72
+ for (const entry of entries) {
73
+ const fullPath = join(dirPath, entry.name);
74
+
75
+ if (entry.isFile() && entry.name.endsWith('.md')) {
76
+ const content = readFileSync(fullPath, 'utf8');
77
+ const parsed = parseRuleFrontmatter(content);
78
+
79
+ rules.push({
80
+ name: entry.name,
81
+ paths: parsed.paths,
82
+ content: parsed.content,
83
+ location,
84
+ path: fullPath,
85
+ subdirectory: subdirectory || null
86
+ });
87
+ } else if (entry.isDirectory()) {
88
+ // Recursively scan subdirectories
89
+ const subRules = scanRulesDirectory(fullPath, location, subdirectory ? `${subdirectory}/${entry.name}` : entry.name);
90
+ rules.push(...subRules);
91
+ }
92
+ }
93
+ } catch (e) {
94
+ // Ignore errors
95
+ }
96
+
97
+ return rules;
98
+ }
99
+
100
+ /**
101
+ * Get rules configuration from project and user directories
102
+ * @param {string} projectPath
103
+ * @returns {Object}
104
+ */
105
+ function getRulesConfig(projectPath) {
106
+ const result = {
107
+ projectRules: [],
108
+ userRules: []
109
+ };
110
+
111
+ try {
112
+ // Project rules: .claude/rules/
113
+ const projectRulesDir = join(projectPath, '.claude', 'rules');
114
+ if (existsSync(projectRulesDir)) {
115
+ const rules = scanRulesDirectory(projectRulesDir, 'project', '');
116
+ result.projectRules = rules;
117
+ }
118
+
119
+ // User rules: ~/.claude/rules/
120
+ const userRulesDir = join(homedir(), '.claude', 'rules');
121
+ if (existsSync(userRulesDir)) {
122
+ const rules = scanRulesDirectory(userRulesDir, 'user', '');
123
+ result.userRules = rules;
124
+ }
125
+ } catch (error) {
126
+ console.error('Error reading rules config:', error);
127
+ }
128
+
129
+ return result;
130
+ }
131
+
132
+ /**
133
+ * Find rule file in directory (including subdirectories)
134
+ * @param {string} baseDir
135
+ * @param {string} ruleName
136
+ * @returns {string|null}
137
+ */
138
+ function findRuleFile(baseDir, ruleName) {
139
+ try {
140
+ // Direct path
141
+ const directPath = join(baseDir, ruleName);
142
+ if (existsSync(directPath)) {
143
+ return directPath;
144
+ }
145
+
146
+ // Search in subdirectories
147
+ const entries = readdirSync(baseDir, { withFileTypes: true });
148
+ for (const entry of entries) {
149
+ if (entry.isDirectory()) {
150
+ const subPath = findRuleFile(join(baseDir, entry.name), ruleName);
151
+ if (subPath) return subPath;
152
+ }
153
+ }
154
+ } catch (e) {
155
+ // Ignore errors
156
+ }
157
+ return null;
158
+ }
159
+
160
+ /**
161
+ * Get single rule detail
162
+ * @param {string} ruleName
163
+ * @param {string} location - 'project' or 'user'
164
+ * @param {string} projectPath
165
+ * @returns {Object}
166
+ */
167
+ function getRuleDetail(ruleName, location, projectPath) {
168
+ try {
169
+ const baseDir = location === 'project'
170
+ ? join(projectPath, '.claude', 'rules')
171
+ : join(homedir(), '.claude', 'rules');
172
+
173
+ // Find the rule file (could be in subdirectory)
174
+ const rulePath = findRuleFile(baseDir, ruleName);
175
+
176
+ if (!rulePath) {
177
+ return { error: 'Rule not found' };
178
+ }
179
+
180
+ const content = readFileSync(rulePath, 'utf8');
181
+ const parsed = parseRuleFrontmatter(content);
182
+
183
+ return {
184
+ rule: {
185
+ name: ruleName,
186
+ paths: parsed.paths,
187
+ content: parsed.content,
188
+ location,
189
+ path: rulePath
190
+ }
191
+ };
192
+ } catch (error) {
193
+ return { error: (error as Error).message };
194
+ }
195
+ }
196
+
197
+ /**
198
+ * Delete a rule
199
+ * @param {string} ruleName
200
+ * @param {string} location
201
+ * @param {string} projectPath
202
+ * @returns {Object}
203
+ */
204
+ function deleteRule(ruleName, location, projectPath) {
205
+ try {
206
+ const baseDir = location === 'project'
207
+ ? join(projectPath, '.claude', 'rules')
208
+ : join(homedir(), '.claude', 'rules');
209
+
210
+ const rulePath = findRuleFile(baseDir, ruleName);
211
+
212
+ if (!rulePath) {
213
+ return { error: 'Rule not found' };
214
+ }
215
+
216
+ unlinkSync(rulePath);
217
+
218
+ return { success: true, ruleName, location };
219
+ } catch (error) {
220
+ return { error: (error as Error).message };
221
+ }
222
+ }
223
+
224
+ /**
225
+ * Generate rule content via CLI tool
226
+ * @param {Object} params
227
+ * @param {string} params.generationType - 'description' | 'template' | 'extract'
228
+ * @param {string} params.description - Rule description (for 'description' mode)
229
+ * @param {string} params.templateType - Template type (for 'template' mode)
230
+ * @param {string} params.extractScope - Scope pattern (for 'extract' mode)
231
+ * @param {string} params.extractFocus - Focus areas (for 'extract' mode)
232
+ * @param {string} params.fileName - Target file name
233
+ * @param {string} params.location - 'project' or 'user'
234
+ * @param {string} params.subdirectory - Optional subdirectory
235
+ * @param {string} params.projectPath - Project root path
236
+ * @returns {Object}
237
+ */
238
+ async function generateRuleViaCLI(params) {
239
+ try {
240
+ const {
241
+ generationType,
242
+ description,
243
+ templateType,
244
+ extractScope,
245
+ extractFocus,
246
+ fileName,
247
+ location,
248
+ subdirectory,
249
+ projectPath
250
+ } = params;
251
+
252
+ let prompt = '';
253
+ let mode = 'analysis';
254
+ let workingDir = projectPath;
255
+
256
+ // Build prompt based on generation type
257
+ if (generationType === 'description') {
258
+ 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}`;
269
+ } else if (generationType === 'template') {
270
+ mode = 'write';
271
+ prompt = `PURPOSE: Generate Claude Code rule from template type
272
+ TASK: • Create rule based on ${templateType} template • Generate structured markdown content
273
+ MODE: write
274
+ 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
276
+
277
+ TEMPLATE TYPE: ${templateType}
278
+ FILE NAME: ${fileName}`;
279
+ } else if (generationType === 'extract') {
280
+ 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'}`;
290
+ } else {
291
+ return { error: `Unknown generation type: ${generationType}` };
292
+ }
293
+
294
+ // Execute CLI tool (Gemini) with at least 10 minutes timeout
295
+ const result = await executeCliTool({
296
+ tool: 'gemini',
297
+ prompt,
298
+ mode,
299
+ cd: workingDir,
300
+ timeout: 600000 // 10 minutes
301
+ });
302
+
303
+ if (!result.success) {
304
+ return {
305
+ error: `CLI execution failed: ${result.stderr || 'Unknown error'}`,
306
+ stderr: result.stderr
307
+ };
308
+ }
309
+
310
+ // Extract generated content from stdout
311
+ const generatedContent = result.stdout.trim();
312
+
313
+ if (!generatedContent) {
314
+ return {
315
+ error: 'CLI execution returned empty content',
316
+ stdout: result.stdout,
317
+ stderr: result.stderr
318
+ };
319
+ }
320
+
321
+ // Create the rule using the generated content
322
+ const createResult = await createRule({
323
+ fileName,
324
+ content: generatedContent,
325
+ paths: [],
326
+ location,
327
+ subdirectory,
328
+ projectPath
329
+ });
330
+
331
+ return {
332
+ success: createResult.success || false,
333
+ ...createResult,
334
+ generatedContent,
335
+ executionId: result.conversation?.id
336
+ };
337
+ } catch (error) {
338
+ return { error: (error as Error).message };
339
+ }
340
+ }
341
+
342
+ /**
343
+ * Create a new rule
344
+ * @param {Object} params
345
+ * @param {string} params.fileName - Rule file name (must end with .md)
346
+ * @param {string} params.content - Rule content (markdown)
347
+ * @param {string[]} params.paths - Optional paths for conditional rule
348
+ * @param {string} params.location - 'project' or 'user'
349
+ * @param {string} params.subdirectory - Optional subdirectory path
350
+ * @param {string} params.projectPath - Project root path
351
+ * @returns {Object}
352
+ */
353
+ async function createRule(params) {
354
+ try {
355
+ const { fileName, content, paths, location, subdirectory, projectPath } = params;
356
+
357
+ // Validate file name
358
+ if (!fileName || !fileName.endsWith('.md')) {
359
+ return { error: 'File name must end with .md' };
360
+ }
361
+
362
+ // Build base directory
363
+ const baseDir = location === 'project'
364
+ ? join(projectPath, '.claude', 'rules')
365
+ : join(homedir(), '.claude', 'rules');
366
+
367
+ // Build target directory (with optional subdirectory)
368
+ const targetDir = subdirectory
369
+ ? join(baseDir, subdirectory)
370
+ : baseDir;
371
+
372
+ // Ensure target directory exists
373
+ await fsPromises.mkdir(targetDir, { recursive: true });
374
+
375
+ // Build complete file path
376
+ const filePath = join(targetDir, fileName);
377
+
378
+ // Check if file already exists
379
+ if (existsSync(filePath)) {
380
+ return { error: `Rule '${fileName}' already exists in ${location} location` };
381
+ }
382
+
383
+ // Build complete content with frontmatter if paths provided
384
+ let completeContent = content;
385
+ if (paths && paths.length > 0) {
386
+ const frontmatter = `---
387
+ paths: [${paths.join(', ')}]
388
+ ---
389
+
390
+ `;
391
+ completeContent = frontmatter + content;
392
+ }
393
+
394
+ // Write rule file
395
+ await fsPromises.writeFile(filePath, completeContent, 'utf8');
396
+
397
+ return {
398
+ success: true,
399
+ fileName,
400
+ location,
401
+ path: filePath,
402
+ subdirectory: subdirectory || null
403
+ };
404
+ } catch (error) {
405
+ return { error: (error as Error).message };
406
+ }
407
+ }
408
+
409
+ /**
410
+ * Handle Rules routes
411
+ * @returns true if route was handled, false otherwise
412
+ */
413
+ export async function handleRulesRoutes(ctx: RouteContext): Promise<boolean> {
414
+ const { pathname, url, req, res, initialPath, handlePostRequest } = ctx;
415
+
416
+ // API: Get all rules
417
+ if (pathname === '/api/rules') {
418
+ const projectPathParam = url.searchParams.get('path') || initialPath;
419
+ const rulesData = getRulesConfig(projectPathParam);
420
+ res.writeHead(200, { 'Content-Type': 'application/json' });
421
+ res.end(JSON.stringify(rulesData));
422
+ return true;
423
+ }
424
+
425
+ // API: Get single rule detail
426
+ if (pathname.startsWith('/api/rules/') && req.method === 'GET' && !pathname.endsWith('/rules/')) {
427
+ const ruleName = decodeURIComponent(pathname.replace('/api/rules/', ''));
428
+ const location = url.searchParams.get('location') || 'project';
429
+ const projectPathParam = url.searchParams.get('path') || initialPath;
430
+ const ruleDetail = getRuleDetail(ruleName, location, projectPathParam);
431
+ if (ruleDetail.error) {
432
+ res.writeHead(404, { 'Content-Type': 'application/json' });
433
+ res.end(JSON.stringify(ruleDetail));
434
+ } else {
435
+ res.writeHead(200, { 'Content-Type': 'application/json' });
436
+ res.end(JSON.stringify(ruleDetail));
437
+ }
438
+ return true;
439
+ }
440
+
441
+ // API: Delete rule
442
+ if (pathname.startsWith('/api/rules/') && req.method === 'DELETE') {
443
+ const ruleName = decodeURIComponent(pathname.replace('/api/rules/', ''));
444
+ handlePostRequest(req, res, async (body) => {
445
+ const { location, projectPath: projectPathParam } = body;
446
+ return deleteRule(ruleName, location, projectPathParam || initialPath);
447
+ });
448
+ return true;
449
+ }
450
+
451
+ // API: Create rule
452
+ if (pathname === '/api/rules/create' && req.method === 'POST') {
453
+ handlePostRequest(req, res, async (body) => {
454
+ const {
455
+ mode,
456
+ fileName,
457
+ content,
458
+ paths,
459
+ location,
460
+ subdirectory,
461
+ projectPath: projectPathParam,
462
+ // CLI generation parameters
463
+ generationType,
464
+ description,
465
+ templateType,
466
+ extractScope,
467
+ extractFocus
468
+ } = body;
469
+
470
+ if (!fileName) {
471
+ return { error: 'File name is required' };
472
+ }
473
+
474
+ if (!location) {
475
+ return { error: 'Location is required (project or user)' };
476
+ }
477
+
478
+ const projectPath = projectPathParam || initialPath;
479
+
480
+ // CLI generation mode
481
+ if (mode === 'cli-generate') {
482
+ if (!generationType) {
483
+ return { error: 'generationType is required for CLI generation mode' };
484
+ }
485
+
486
+ // Validate based on generation type
487
+ if (generationType === 'description' && !description) {
488
+ return { error: 'description is required for description-based generation' };
489
+ }
490
+
491
+ if (generationType === 'template' && !templateType) {
492
+ return { error: 'templateType is required for template-based generation' };
493
+ }
494
+
495
+ return await generateRuleViaCLI({
496
+ generationType,
497
+ description,
498
+ templateType,
499
+ extractScope,
500
+ extractFocus,
501
+ fileName,
502
+ location,
503
+ subdirectory: subdirectory || '',
504
+ projectPath
505
+ });
506
+ }
507
+
508
+ // Manual creation mode
509
+ if (!content) {
510
+ return { error: 'Content is required for manual creation' };
511
+ }
512
+
513
+ return await createRule({
514
+ fileName,
515
+ content,
516
+ paths: paths || [],
517
+ location,
518
+ subdirectory: subdirectory || '',
519
+ projectPath
520
+ });
521
+ });
522
+ return true;
523
+ }
524
+
525
+ return false;
526
+ }