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,325 @@
1
+ /**
2
+ * Detect Changed Modules Tool
3
+ * Find modules affected by git changes or recent modifications
4
+ */
5
+
6
+ import { z } from 'zod';
7
+ import type { ToolSchema, ToolResult } from '../types/tool.js';
8
+ import { readdirSync, statSync, existsSync } from 'fs';
9
+ import { join, resolve, dirname, extname, relative } from 'path';
10
+ import { execSync } from 'child_process';
11
+
12
+ // Source file extensions to track
13
+ const SOURCE_EXTENSIONS = [
14
+ '.md', '.js', '.ts', '.jsx', '.tsx',
15
+ '.py', '.go', '.rs', '.java', '.cpp', '.c', '.h',
16
+ '.sh', '.ps1', '.json', '.yaml', '.yml'
17
+ ];
18
+
19
+ // Directories to exclude
20
+ const EXCLUDE_DIRS = [
21
+ '.git', '__pycache__', 'node_modules', '.venv', 'venv', 'env',
22
+ 'dist', 'build', '.cache', '.pytest_cache', '.mypy_cache',
23
+ 'coverage', '.nyc_output', 'logs', 'tmp', 'temp'
24
+ ];
25
+
26
+ // Define Zod schema for validation
27
+ const ParamsSchema = z.object({
28
+ format: z.enum(['list', 'grouped', 'paths']).default('paths'),
29
+ path: z.string().default('.'),
30
+ });
31
+
32
+ type Params = z.infer<typeof ParamsSchema>;
33
+
34
+ interface ModuleResult {
35
+ depth: number;
36
+ path: string;
37
+ files: number;
38
+ types: string[];
39
+ has_claude: boolean;
40
+ }
41
+
42
+ interface ToolOutput {
43
+ format: string;
44
+ change_source: 'git' | 'mtime' | 'none';
45
+ changed_files_count: number;
46
+ affected_modules_count: number;
47
+ results: ModuleResult[];
48
+ output: string;
49
+ }
50
+
51
+ /**
52
+ * Check if git is available and we're in a repo
53
+ */
54
+ function isGitRepo(basePath: string): boolean {
55
+ try {
56
+ execSync('git rev-parse --git-dir', { cwd: basePath, stdio: 'pipe' });
57
+ return true;
58
+ } catch (e) {
59
+ return false;
60
+ }
61
+ }
62
+
63
+ /**
64
+ * Get changed files from git
65
+ */
66
+ function getGitChangedFiles(basePath: string): string[] {
67
+ try {
68
+ // Get staged + unstaged changes
69
+ let output = execSync('git diff --name-only HEAD 2>/dev/null', {
70
+ cwd: basePath,
71
+ encoding: 'utf8',
72
+ stdio: ['pipe', 'pipe', 'pipe']
73
+ }).trim();
74
+
75
+ const cachedOutput = execSync('git diff --name-only --cached 2>/dev/null', {
76
+ cwd: basePath,
77
+ encoding: 'utf8',
78
+ stdio: ['pipe', 'pipe', 'pipe']
79
+ }).trim();
80
+
81
+ if (cachedOutput) {
82
+ output = output ? `${output}\n${cachedOutput}` : cachedOutput;
83
+ }
84
+
85
+ // If no working changes, check last commit
86
+ if (!output) {
87
+ output = execSync('git diff --name-only HEAD~1 HEAD 2>/dev/null', {
88
+ cwd: basePath,
89
+ encoding: 'utf8',
90
+ stdio: ['pipe', 'pipe', 'pipe']
91
+ }).trim();
92
+ }
93
+
94
+ return output ? output.split('\n').filter(f => f.trim()) : [];
95
+ } catch (e) {
96
+ return [];
97
+ }
98
+ }
99
+
100
+ /**
101
+ * Find recently modified files (fallback when no git changes)
102
+ */
103
+ function findRecentlyModified(basePath: string, hoursAgo: number = 24): string[] {
104
+ const results: string[] = [];
105
+ const cutoffTime = Date.now() - (hoursAgo * 60 * 60 * 1000);
106
+
107
+ function scan(dirPath: string): void {
108
+ try {
109
+ const entries = readdirSync(dirPath, { withFileTypes: true });
110
+
111
+ for (const entry of entries) {
112
+ if (entry.isDirectory()) {
113
+ if (EXCLUDE_DIRS.includes(entry.name)) continue;
114
+ scan(join(dirPath, entry.name));
115
+ } else if (entry.isFile()) {
116
+ const ext = extname(entry.name).toLowerCase();
117
+ if (!SOURCE_EXTENSIONS.includes(ext)) continue;
118
+
119
+ const fullPath = join(dirPath, entry.name);
120
+ try {
121
+ const stat = statSync(fullPath);
122
+ if (stat.mtimeMs > cutoffTime) {
123
+ results.push(relative(basePath, fullPath));
124
+ }
125
+ } catch (e) {
126
+ // Skip files we can't stat
127
+ }
128
+ }
129
+ }
130
+ } catch (e) {
131
+ // Ignore permission errors
132
+ }
133
+ }
134
+
135
+ scan(basePath);
136
+ return results;
137
+ }
138
+
139
+ /**
140
+ * Extract unique parent directories from file list
141
+ */
142
+ function extractDirectories(files: string[], basePath: string): string[] {
143
+ const dirs = new Set<string>();
144
+
145
+ for (const file of files) {
146
+ const dir = dirname(file);
147
+ if (dir === '.' || dir === '') {
148
+ dirs.add('.');
149
+ } else {
150
+ dirs.add('./' + dir.replace(/\\/g, '/'));
151
+ }
152
+ }
153
+
154
+ return Array.from(dirs).sort();
155
+ }
156
+
157
+ /**
158
+ * Count files in directory
159
+ */
160
+ function countFiles(dirPath: string): number {
161
+ try {
162
+ const entries = readdirSync(dirPath, { withFileTypes: true });
163
+ return entries.filter(e => e.isFile()).length;
164
+ } catch (e) {
165
+ return 0;
166
+ }
167
+ }
168
+
169
+ /**
170
+ * Get file types in directory
171
+ */
172
+ function getFileTypes(dirPath: string): string[] {
173
+ const types = new Set<string>();
174
+ try {
175
+ const entries = readdirSync(dirPath, { withFileTypes: true });
176
+ entries.forEach(entry => {
177
+ if (entry.isFile()) {
178
+ const ext = extname(entry.name).slice(1);
179
+ if (ext) types.add(ext);
180
+ }
181
+ });
182
+ } catch (e) {
183
+ // Ignore
184
+ }
185
+ return Array.from(types);
186
+ }
187
+
188
+ // Tool schema for MCP
189
+ export const schema: ToolSchema = {
190
+ name: 'detect_changed_modules',
191
+ description: `Detect modules affected by git changes or recent file modifications.
192
+ Features:
193
+ - Git-aware: detects staged, unstaged, or last commit changes
194
+ - Fallback: finds files modified in last 24 hours
195
+ - Respects .gitignore patterns
196
+
197
+ Output formats: list, grouped, paths (default)`,
198
+ inputSchema: {
199
+ type: 'object',
200
+ properties: {
201
+ format: {
202
+ type: 'string',
203
+ enum: ['list', 'grouped', 'paths'],
204
+ description: 'Output format (default: paths)',
205
+ default: 'paths'
206
+ },
207
+ path: {
208
+ type: 'string',
209
+ description: 'Target directory path (default: current directory)',
210
+ default: '.'
211
+ }
212
+ },
213
+ required: []
214
+ }
215
+ };
216
+
217
+ // Handler function
218
+ export async function handler(params: Record<string, unknown>): Promise<ToolResult<ToolOutput>> {
219
+ const parsed = ParamsSchema.safeParse(params);
220
+ if (!parsed.success) {
221
+ return { success: false, error: `Invalid params: ${parsed.error.message}` };
222
+ }
223
+
224
+ const { format, path: targetPath } = parsed.data;
225
+
226
+ try {
227
+ const basePath = resolve(process.cwd(), targetPath);
228
+
229
+ if (!existsSync(basePath)) {
230
+ return { success: false, error: `Directory not found: ${basePath}` };
231
+ }
232
+
233
+ // Get changed files
234
+ let changedFiles: string[] = [];
235
+ let changeSource: 'git' | 'mtime' | 'none' = 'none';
236
+
237
+ if (isGitRepo(basePath)) {
238
+ changedFiles = getGitChangedFiles(basePath);
239
+ changeSource = changedFiles.length > 0 ? 'git' : 'none';
240
+ }
241
+
242
+ // Fallback to recently modified files
243
+ if (changedFiles.length === 0) {
244
+ changedFiles = findRecentlyModified(basePath);
245
+ changeSource = changedFiles.length > 0 ? 'mtime' : 'none';
246
+ }
247
+
248
+ // Extract affected directories
249
+ const affectedDirs = extractDirectories(changedFiles, basePath);
250
+
251
+ // Format output
252
+ let output: string;
253
+ const results: ModuleResult[] = [];
254
+
255
+ for (const dir of affectedDirs) {
256
+ const fullPath = dir === '.' ? basePath : resolve(basePath, dir);
257
+ if (!existsSync(fullPath) || !statSync(fullPath).isDirectory()) continue;
258
+
259
+ const fileCount = countFiles(fullPath);
260
+ const types = getFileTypes(fullPath);
261
+ const depth = dir === '.' ? 0 : (dir.match(/\//g) || []).length;
262
+ const hasClaude = existsSync(join(fullPath, 'CLAUDE.md'));
263
+
264
+ results.push({
265
+ depth,
266
+ path: dir,
267
+ files: fileCount,
268
+ types,
269
+ has_claude: hasClaude
270
+ });
271
+ }
272
+
273
+ switch (format) {
274
+ case 'list':
275
+ output = results.map(r =>
276
+ `depth:${r.depth}|path:${r.path}|files:${r.files}|types:[${r.types.join(',')}]|has_claude:${r.has_claude ? 'yes' : 'no'}|status:changed`
277
+ ).join('\n');
278
+ break;
279
+
280
+ case 'grouped':
281
+ const maxDepth = results.length > 0 ? Math.max(...results.map(r => r.depth)) : 0;
282
+ const lines = ['Affected modules by changes:'];
283
+
284
+ for (let d = 0; d <= maxDepth; d++) {
285
+ const atDepth = results.filter(r => r.depth === d);
286
+ if (atDepth.length > 0) {
287
+ lines.push(` Depth ${d}:`);
288
+ atDepth.forEach(r => {
289
+ const claudeIndicator = r.has_claude ? ' [OK]' : '';
290
+ lines.push(` - ${r.path}${claudeIndicator} (changed)`);
291
+ });
292
+ }
293
+ }
294
+
295
+ if (results.length === 0) {
296
+ lines.push(' No recent changes detected');
297
+ }
298
+
299
+ output = lines.join('\n');
300
+ break;
301
+
302
+ case 'paths':
303
+ default:
304
+ output = affectedDirs.join('\n');
305
+ break;
306
+ }
307
+
308
+ return {
309
+ success: true,
310
+ result: {
311
+ format,
312
+ change_source: changeSource,
313
+ changed_files_count: changedFiles.length,
314
+ affected_modules_count: results.length,
315
+ results,
316
+ output
317
+ }
318
+ };
319
+ } catch (error) {
320
+ return {
321
+ success: false,
322
+ error: `Failed to detect changed modules: ${(error as Error).message}`
323
+ };
324
+ }
325
+ }
@@ -3,29 +3,67 @@
3
3
  * Find CSS/JS/HTML design-related files and output JSON
4
4
  */
5
5
 
6
+ import { z } from 'zod';
7
+ import type { ToolSchema, ToolResult } from '../types/tool.js';
6
8
  import { readdirSync, statSync, existsSync, writeFileSync } from 'fs';
7
9
  import { join, resolve, relative, extname } from 'path';
8
10
 
9
11
  // Directories to exclude
10
12
  const EXCLUDE_DIRS = [
11
- 'node_modules', 'dist', '.git', 'build', 'coverage',
12
- '.cache', '.next', '.nuxt', '__pycache__', '.venv'
13
+ 'node_modules',
14
+ 'dist',
15
+ '.git',
16
+ 'build',
17
+ 'coverage',
18
+ '.cache',
19
+ '.next',
20
+ '.nuxt',
21
+ '__pycache__',
22
+ '.venv',
13
23
  ];
14
24
 
15
25
  // File type patterns
16
26
  const FILE_PATTERNS = {
17
27
  css: ['.css', '.scss', '.sass', '.less', '.styl'],
18
28
  js: ['.js', '.ts', '.jsx', '.tsx', '.mjs', '.cjs', '.vue', '.svelte'],
19
- html: ['.html', '.htm']
29
+ html: ['.html', '.htm'],
20
30
  };
21
31
 
32
+ // Zod schema
33
+ const ParamsSchema = z.object({
34
+ sourceDir: z.string().default('.'),
35
+ outputPath: z.string().optional(),
36
+ });
37
+
38
+ type Params = z.infer<typeof ParamsSchema>;
39
+
40
+ interface DiscoveryResult {
41
+ discovery_time: string;
42
+ source_directory: string;
43
+ file_types: {
44
+ css: { count: number; files: string[] };
45
+ js: { count: number; files: string[] };
46
+ html: { count: number; files: string[] };
47
+ };
48
+ total_files: number;
49
+ }
50
+
51
+ interface ToolOutput {
52
+ css_count: number;
53
+ js_count: number;
54
+ html_count: number;
55
+ total_files: number;
56
+ output_path: string | null;
57
+ result: DiscoveryResult;
58
+ }
59
+
22
60
  /**
23
61
  * Find files matching extensions recursively
24
62
  */
25
- function findFiles(basePath, extensions) {
26
- const results = [];
63
+ function findFiles(basePath: string, extensions: string[]): string[] {
64
+ const results: string[] = [];
27
65
 
28
- function scan(dirPath) {
66
+ function scan(dirPath: string): void {
29
67
  try {
30
68
  const entries = readdirSync(dirPath, { withFileTypes: true });
31
69
 
@@ -52,7 +90,7 @@ function findFiles(basePath, extensions) {
52
90
  /**
53
91
  * Main execute function
54
92
  */
55
- async function execute(params) {
93
+ async function execute(params: Params): Promise<ToolOutput> {
56
94
  const { sourceDir = '.', outputPath } = params;
57
95
 
58
96
  const basePath = resolve(process.cwd(), sourceDir);
@@ -71,24 +109,24 @@ async function execute(params) {
71
109
  const htmlFiles = findFiles(basePath, FILE_PATTERNS.html);
72
110
 
73
111
  // Build result
74
- const result = {
112
+ const result: DiscoveryResult = {
75
113
  discovery_time: new Date().toISOString(),
76
114
  source_directory: basePath,
77
115
  file_types: {
78
116
  css: {
79
117
  count: cssFiles.length,
80
- files: cssFiles
118
+ files: cssFiles,
81
119
  },
82
120
  js: {
83
121
  count: jsFiles.length,
84
- files: jsFiles
122
+ files: jsFiles,
85
123
  },
86
124
  html: {
87
125
  count: htmlFiles.length,
88
- files: htmlFiles
89
- }
126
+ files: htmlFiles,
127
+ },
90
128
  },
91
- total_files: cssFiles.length + jsFiles.length + htmlFiles.length
129
+ total_files: cssFiles.length + jsFiles.length + htmlFiles.length,
92
130
  };
93
131
 
94
132
  // Write to file if outputPath specified
@@ -103,32 +141,44 @@ async function execute(params) {
103
141
  html_count: htmlFiles.length,
104
142
  total_files: result.total_files,
105
143
  output_path: outputPath || null,
106
- result
144
+ result,
107
145
  };
108
146
  }
109
147
 
110
- /**
111
- * Tool Definition
112
- */
113
- export const discoverDesignFilesTool = {
148
+ // Tool schema for MCP
149
+ export const schema: ToolSchema = {
114
150
  name: 'discover_design_files',
115
151
  description: `Discover CSS/JS/HTML design-related files in a directory.
116
152
  Scans recursively and excludes common build/cache directories.
117
153
  Returns JSON with file discovery results.`,
118
- parameters: {
154
+ inputSchema: {
119
155
  type: 'object',
120
156
  properties: {
121
157
  sourceDir: {
122
158
  type: 'string',
123
159
  description: 'Source directory to scan (default: current directory)',
124
- default: '.'
160
+ default: '.',
125
161
  },
126
162
  outputPath: {
127
163
  type: 'string',
128
- description: 'Optional path to write JSON output file'
129
- }
164
+ description: 'Optional path to write JSON output file',
165
+ },
130
166
  },
131
- required: []
167
+ required: [],
132
168
  },
133
- execute
134
169
  };
170
+
171
+ // Handler function
172
+ export async function handler(params: Record<string, unknown>): Promise<ToolResult<ToolOutput>> {
173
+ const parsed = ParamsSchema.safeParse(params);
174
+ if (!parsed.success) {
175
+ return { success: false, error: `Invalid params: ${parsed.error.message}` };
176
+ }
177
+
178
+ try {
179
+ const result = await execute(parsed.data);
180
+ return { success: true, result };
181
+ } catch (error) {
182
+ return { success: false, error: (error as Error).message };
183
+ }
184
+ }