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,129 @@
1
+ /**
2
+ * Notifier Module - CLI to Server Communication
3
+ * Provides best-effort notification to running CCW Server
4
+ * when CLI commands modify data that should trigger UI updates
5
+ */
6
+
7
+ import http from 'http';
8
+
9
+ // Default server configuration
10
+ const DEFAULT_HOST = 'localhost';
11
+ const DEFAULT_PORT = 3456;
12
+ const NOTIFY_TIMEOUT = 2000; // 2 seconds - quick timeout for best-effort
13
+
14
+ export type NotifyScope = 'memory' | 'history' | 'insights' | 'all';
15
+
16
+ export interface NotifyPayload {
17
+ type: 'REFRESH_REQUIRED' | 'MEMORY_UPDATED' | 'HISTORY_UPDATED' | 'INSIGHT_GENERATED';
18
+ scope: NotifyScope;
19
+ data?: {
20
+ entityType?: string;
21
+ entityId?: string | number;
22
+ action?: string;
23
+ executionId?: string;
24
+ [key: string]: unknown;
25
+ };
26
+ }
27
+
28
+ export interface NotifyResult {
29
+ success: boolean;
30
+ error?: string;
31
+ }
32
+
33
+ /**
34
+ * Send notification to CCW Server (best-effort, non-blocking)
35
+ * If server is not running or unreachable, silently fails
36
+ */
37
+ export async function notifyServer(
38
+ payload: NotifyPayload,
39
+ options?: { host?: string; port?: number }
40
+ ): Promise<NotifyResult> {
41
+ const host = options?.host || DEFAULT_HOST;
42
+ const port = options?.port || DEFAULT_PORT;
43
+
44
+ return new Promise((resolve) => {
45
+ const postData = JSON.stringify(payload);
46
+
47
+ const req = http.request(
48
+ {
49
+ hostname: host,
50
+ port: port,
51
+ path: '/api/system/notify',
52
+ method: 'POST',
53
+ headers: {
54
+ 'Content-Type': 'application/json',
55
+ 'Content-Length': Buffer.byteLength(postData),
56
+ },
57
+ timeout: NOTIFY_TIMEOUT,
58
+ },
59
+ (res) => {
60
+ // Success if we get a 2xx response
61
+ if (res.statusCode && res.statusCode >= 200 && res.statusCode < 300) {
62
+ resolve({ success: true });
63
+ } else {
64
+ resolve({ success: false, error: `HTTP ${res.statusCode}` });
65
+ }
66
+ }
67
+ );
68
+
69
+ // Handle errors silently - server may not be running
70
+ req.on('error', () => {
71
+ resolve({ success: false, error: 'Server not reachable' });
72
+ });
73
+
74
+ req.on('timeout', () => {
75
+ req.destroy();
76
+ resolve({ success: false, error: 'Timeout' });
77
+ });
78
+
79
+ req.write(postData);
80
+ req.end();
81
+ });
82
+ }
83
+
84
+ /**
85
+ * Convenience: Notify memory update
86
+ */
87
+ export async function notifyMemoryUpdate(data?: {
88
+ entityType?: string;
89
+ entityId?: string | number;
90
+ action?: string;
91
+ }): Promise<NotifyResult> {
92
+ return notifyServer({
93
+ type: 'MEMORY_UPDATED',
94
+ scope: 'memory',
95
+ data,
96
+ });
97
+ }
98
+
99
+ /**
100
+ * Convenience: Notify CLI history update
101
+ */
102
+ export async function notifyHistoryUpdate(executionId?: string): Promise<NotifyResult> {
103
+ return notifyServer({
104
+ type: 'HISTORY_UPDATED',
105
+ scope: 'history',
106
+ data: executionId ? { executionId } : undefined,
107
+ });
108
+ }
109
+
110
+ /**
111
+ * Convenience: Notify insight generated
112
+ */
113
+ export async function notifyInsightGenerated(executionId?: string): Promise<NotifyResult> {
114
+ return notifyServer({
115
+ type: 'INSIGHT_GENERATED',
116
+ scope: 'insights',
117
+ data: executionId ? { executionId } : undefined,
118
+ });
119
+ }
120
+
121
+ /**
122
+ * Convenience: Request full refresh
123
+ */
124
+ export async function notifyRefreshRequired(scope: NotifyScope = 'all'): Promise<NotifyResult> {
125
+ return notifyServer({
126
+ type: 'REFRESH_REQUIRED',
127
+ scope,
128
+ });
129
+ }
@@ -0,0 +1,410 @@
1
+ /**
2
+ * Read File Tool - Read files with multi-file, directory, and regex support
3
+ *
4
+ * Features:
5
+ * - Read single or multiple files
6
+ * - Read all files in a directory (with depth control)
7
+ * - Filter files by glob/regex pattern
8
+ * - Content search with regex
9
+ * - Compact output format
10
+ */
11
+
12
+ import { z } from 'zod';
13
+ import type { ToolSchema, ToolResult } from '../types/tool.js';
14
+ import { readFileSync, readdirSync, statSync, existsSync } from 'fs';
15
+ import { resolve, isAbsolute, join, relative, extname } from 'path';
16
+ import { validatePath, getProjectRoot } from '../utils/path-validator.js';
17
+
18
+ // Max content per file (truncate if larger)
19
+ const MAX_CONTENT_LENGTH = 5000;
20
+ // Max files to return
21
+ const MAX_FILES = 50;
22
+ // Max total content length
23
+ const MAX_TOTAL_CONTENT = 50000;
24
+
25
+ // Define Zod schema for validation
26
+ const ParamsSchema = z.object({
27
+ paths: z.union([z.string(), z.array(z.string())]).describe('File path(s) or directory'),
28
+ pattern: z.string().optional().describe('Glob pattern to filter files (e.g., "*.ts", "**/*.js")'),
29
+ contentPattern: z.string().optional().describe('Regex to search within file content'),
30
+ maxDepth: z.number().default(3).describe('Max directory depth to traverse'),
31
+ includeContent: z.boolean().default(true).describe('Include file content in result'),
32
+ maxFiles: z.number().default(MAX_FILES).describe('Max number of files to return'),
33
+ offset: z.number().min(0).optional().describe('Line offset to start reading from (0-based, for single file only)'),
34
+ limit: z.number().min(1).optional().describe('Number of lines to read (for single file only)'),
35
+ });
36
+
37
+ type Params = z.infer<typeof ParamsSchema>;
38
+
39
+ interface FileEntry {
40
+ path: string;
41
+ size: number;
42
+ content?: string;
43
+ truncated?: boolean;
44
+ matches?: string[];
45
+ totalLines?: number;
46
+ lineRange?: { start: number; end: number };
47
+ }
48
+
49
+ interface ReadResult {
50
+ files: FileEntry[];
51
+ totalFiles: number;
52
+ message: string;
53
+ }
54
+
55
+ // Common binary extensions to skip
56
+ const BINARY_EXTENSIONS = new Set([
57
+ '.png', '.jpg', '.jpeg', '.gif', '.bmp', '.ico', '.webp', '.svg',
58
+ '.pdf', '.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx',
59
+ '.zip', '.tar', '.gz', '.rar', '.7z',
60
+ '.exe', '.dll', '.so', '.dylib',
61
+ '.mp3', '.mp4', '.wav', '.avi', '.mov',
62
+ '.woff', '.woff2', '.ttf', '.eot', '.otf',
63
+ '.pyc', '.class', '.o', '.obj',
64
+ ]);
65
+
66
+ /**
67
+ * Check if file is likely binary
68
+ */
69
+ function isBinaryFile(filePath: string): boolean {
70
+ const ext = extname(filePath).toLowerCase();
71
+ return BINARY_EXTENSIONS.has(ext);
72
+ }
73
+
74
+ /**
75
+ * Convert glob pattern to regex
76
+ */
77
+ function globToRegex(pattern: string): RegExp {
78
+ const escaped = pattern
79
+ .replace(/[.+^${}()|[\]\\]/g, '\\$&')
80
+ .replace(/\*/g, '.*')
81
+ .replace(/\?/g, '.');
82
+ return new RegExp(`^${escaped}$`, 'i');
83
+ }
84
+
85
+ /**
86
+ * Check if filename matches glob pattern
87
+ */
88
+ function matchesPattern(filename: string, pattern: string): boolean {
89
+ const regex = globToRegex(pattern);
90
+ return regex.test(filename);
91
+ }
92
+
93
+ /**
94
+ * Recursively collect files from directory
95
+ */
96
+ function collectFiles(
97
+ dir: string,
98
+ pattern: string | undefined,
99
+ maxDepth: number,
100
+ currentDepth: number = 0
101
+ ): string[] {
102
+ if (currentDepth > maxDepth) return [];
103
+
104
+ const files: string[] = [];
105
+
106
+ try {
107
+ const entries = readdirSync(dir, { withFileTypes: true });
108
+
109
+ for (const entry of entries) {
110
+ // Skip hidden files/dirs and node_modules
111
+ if (entry.name.startsWith('.') || entry.name === 'node_modules') continue;
112
+
113
+ const fullPath = join(dir, entry.name);
114
+
115
+ if (entry.isDirectory()) {
116
+ files.push(...collectFiles(fullPath, pattern, maxDepth, currentDepth + 1));
117
+ } else if (entry.isFile()) {
118
+ if (!pattern || matchesPattern(entry.name, pattern)) {
119
+ files.push(fullPath);
120
+ }
121
+ }
122
+ }
123
+ } catch {
124
+ // Skip directories we can't read
125
+ }
126
+
127
+ return files;
128
+ }
129
+
130
+ interface ReadContentOptions {
131
+ maxLength: number;
132
+ offset?: number;
133
+ limit?: number;
134
+ }
135
+
136
+ interface ReadContentResult {
137
+ content: string;
138
+ truncated: boolean;
139
+ totalLines?: number;
140
+ lineRange?: { start: number; end: number };
141
+ }
142
+
143
+ /**
144
+ * Read file content with truncation and optional line-based pagination
145
+ */
146
+ function readFileContent(filePath: string, options: ReadContentOptions): ReadContentResult {
147
+ const { maxLength, offset, limit } = options;
148
+
149
+ if (isBinaryFile(filePath)) {
150
+ return { content: '[Binary file]', truncated: false };
151
+ }
152
+
153
+ try {
154
+ const content = readFileSync(filePath, 'utf8');
155
+ const lines = content.split('\n');
156
+ const totalLines = lines.length;
157
+
158
+ // If offset/limit specified, use line-based pagination
159
+ if (offset !== undefined || limit !== undefined) {
160
+ const startLine = Math.min(offset ?? 0, totalLines);
161
+ const endLine = limit !== undefined ? Math.min(startLine + limit, totalLines) : totalLines;
162
+ const selectedLines = lines.slice(startLine, endLine);
163
+ const selectedContent = selectedLines.join('\n');
164
+
165
+ const actualEnd = endLine;
166
+ const hasMore = actualEnd < totalLines;
167
+
168
+ let finalContent = selectedContent;
169
+ if (selectedContent.length > maxLength) {
170
+ finalContent = selectedContent.substring(0, maxLength) + `\n... (+${selectedContent.length - maxLength} chars)`;
171
+ }
172
+
173
+ // Calculate actual line range (handle empty selection)
174
+ const actualLineEnd = selectedLines.length > 0 ? startLine + selectedLines.length - 1 : startLine;
175
+
176
+ return {
177
+ content: finalContent,
178
+ truncated: hasMore || selectedContent.length > maxLength,
179
+ totalLines,
180
+ lineRange: { start: startLine, end: actualLineEnd },
181
+ };
182
+ }
183
+
184
+ // Default behavior: truncate by character length
185
+ if (content.length > maxLength) {
186
+ return {
187
+ content: content.substring(0, maxLength) + `\n... (+${content.length - maxLength} chars)`,
188
+ truncated: true,
189
+ totalLines,
190
+ };
191
+ }
192
+ return { content, truncated: false, totalLines };
193
+ } catch (error) {
194
+ return { content: `[Error: ${(error as Error).message}]`, truncated: false };
195
+ }
196
+ }
197
+
198
+ /**
199
+ * Find regex matches in content
200
+ */
201
+ function findMatches(content: string, pattern: string): string[] {
202
+ try {
203
+ const regex = new RegExp(pattern, 'gm');
204
+ const matches: string[] = [];
205
+ let match;
206
+
207
+ while ((match = regex.exec(content)) !== null && matches.length < 10) {
208
+ // Get line containing match
209
+ const lineStart = content.lastIndexOf('\n', match.index) + 1;
210
+ const lineEnd = content.indexOf('\n', match.index);
211
+ const line = content.substring(lineStart, lineEnd === -1 ? undefined : lineEnd).trim();
212
+ matches.push(line.substring(0, 200)); // Truncate long lines
213
+ }
214
+
215
+ return matches;
216
+ } catch {
217
+ return [];
218
+ }
219
+ }
220
+
221
+ // Tool schema for MCP
222
+ export const schema: ToolSchema = {
223
+ name: 'read_file',
224
+ description: `Read files with multi-file, directory, regex support, and line-based pagination.
225
+
226
+ Usage:
227
+ read_file(paths="file.ts") # Single file (full content)
228
+ read_file(paths="file.ts", offset=100, limit=50) # Lines 100-149 (0-based)
229
+ read_file(paths=["a.ts", "b.ts"]) # Multiple files
230
+ read_file(paths="src/", pattern="*.ts") # Directory with pattern
231
+ read_file(paths="src/", contentPattern="TODO") # Search content
232
+
233
+ Supports both absolute and relative paths. Relative paths are resolved from project root.
234
+ Returns compact file list with optional content. Use offset/limit for large file pagination.`,
235
+ inputSchema: {
236
+ type: 'object',
237
+ properties: {
238
+ paths: {
239
+ oneOf: [
240
+ { type: 'string', description: 'Single file or directory path' },
241
+ { type: 'array', items: { type: 'string' }, description: 'Array of file paths' }
242
+ ],
243
+ description: 'File path(s) or directory to read',
244
+ },
245
+ pattern: {
246
+ type: 'string',
247
+ description: 'Glob pattern to filter files (e.g., "*.ts", "*.{js,ts}")',
248
+ },
249
+ contentPattern: {
250
+ type: 'string',
251
+ description: 'Regex pattern to search within file content',
252
+ },
253
+ maxDepth: {
254
+ type: 'number',
255
+ description: 'Max directory depth to traverse (default: 3)',
256
+ default: 3,
257
+ },
258
+ includeContent: {
259
+ type: 'boolean',
260
+ description: 'Include file content in result (default: true)',
261
+ default: true,
262
+ },
263
+ maxFiles: {
264
+ type: 'number',
265
+ description: `Max number of files to return (default: ${MAX_FILES})`,
266
+ default: MAX_FILES,
267
+ },
268
+ offset: {
269
+ type: 'number',
270
+ description: 'Line offset to start reading from (0-based, for single file only)',
271
+ minimum: 0,
272
+ },
273
+ limit: {
274
+ type: 'number',
275
+ description: 'Number of lines to read (for single file only)',
276
+ minimum: 1,
277
+ },
278
+ },
279
+ required: ['paths'],
280
+ },
281
+ };
282
+
283
+ // Handler function
284
+ export async function handler(params: Record<string, unknown>): Promise<ToolResult<ReadResult>> {
285
+ const parsed = ParamsSchema.safeParse(params);
286
+ if (!parsed.success) {
287
+ return { success: false, error: `Invalid params: ${parsed.error.message}` };
288
+ }
289
+
290
+ const {
291
+ paths,
292
+ pattern,
293
+ contentPattern,
294
+ maxDepth,
295
+ includeContent,
296
+ maxFiles,
297
+ offset,
298
+ limit,
299
+ } = parsed.data;
300
+
301
+ const cwd = getProjectRoot();
302
+
303
+ // Normalize paths to array
304
+ const inputPaths = Array.isArray(paths) ? paths : [paths];
305
+
306
+ // Collect all files to read
307
+ const allFiles: string[] = [];
308
+
309
+ for (const inputPath of inputPaths) {
310
+ const resolvedPath = await validatePath(inputPath);
311
+
312
+ if (!existsSync(resolvedPath)) {
313
+ continue; // Skip non-existent paths
314
+ }
315
+
316
+ const stat = statSync(resolvedPath);
317
+
318
+ if (stat.isDirectory()) {
319
+ // Collect files from directory
320
+ const dirFiles = collectFiles(resolvedPath, pattern, maxDepth);
321
+ allFiles.push(...dirFiles);
322
+ } else if (stat.isFile()) {
323
+ // Add single file (check pattern if provided)
324
+ if (!pattern || matchesPattern(relative(cwd, resolvedPath), pattern)) {
325
+ allFiles.push(resolvedPath);
326
+ }
327
+ }
328
+ }
329
+
330
+ // Limit files
331
+ const limitedFiles = allFiles.slice(0, maxFiles);
332
+ const totalFiles = allFiles.length;
333
+
334
+ // Process files
335
+ const files: FileEntry[] = [];
336
+ let totalContent = 0;
337
+
338
+ // Only apply offset/limit for single file mode
339
+ const isSingleFile = limitedFiles.length === 1;
340
+ const useLinePagination = isSingleFile && (offset !== undefined || limit !== undefined);
341
+
342
+ for (const filePath of limitedFiles) {
343
+ if (totalContent >= MAX_TOTAL_CONTENT) break;
344
+
345
+ const stat = statSync(filePath);
346
+ const entry: FileEntry = {
347
+ path: relative(cwd, filePath) || filePath,
348
+ size: stat.size,
349
+ };
350
+
351
+ if (includeContent) {
352
+ const remainingSpace = MAX_TOTAL_CONTENT - totalContent;
353
+ const maxLen = Math.min(MAX_CONTENT_LENGTH, remainingSpace);
354
+
355
+ // Pass offset/limit only for single file mode
356
+ const readOptions: ReadContentOptions = { maxLength: maxLen };
357
+ if (useLinePagination) {
358
+ if (offset !== undefined) readOptions.offset = offset;
359
+ if (limit !== undefined) readOptions.limit = limit;
360
+ }
361
+
362
+ const { content, truncated, totalLines, lineRange } = readFileContent(filePath, readOptions);
363
+
364
+ // If contentPattern provided, only include files with matches
365
+ if (contentPattern) {
366
+ const matches = findMatches(content, contentPattern);
367
+ if (matches.length > 0) {
368
+ entry.matches = matches;
369
+ entry.content = content;
370
+ entry.truncated = truncated;
371
+ entry.totalLines = totalLines;
372
+ entry.lineRange = lineRange;
373
+ totalContent += content.length;
374
+ } else {
375
+ continue; // Skip files without matches
376
+ }
377
+ } else {
378
+ entry.content = content;
379
+ entry.truncated = truncated;
380
+ entry.totalLines = totalLines;
381
+ entry.lineRange = lineRange;
382
+ totalContent += content.length;
383
+ }
384
+ }
385
+
386
+ files.push(entry);
387
+ }
388
+
389
+ // Build message
390
+ let message = `Read ${files.length} file(s)`;
391
+ if (totalFiles > maxFiles) {
392
+ message += ` (showing ${maxFiles} of ${totalFiles})`;
393
+ }
394
+ if (useLinePagination && files.length > 0 && files[0].lineRange) {
395
+ const { start, end } = files[0].lineRange;
396
+ message += ` [lines ${start}-${end} of ${files[0].totalLines}]`;
397
+ }
398
+ if (contentPattern) {
399
+ message += ` matching "${contentPattern}"`;
400
+ }
401
+
402
+ return {
403
+ success: true,
404
+ result: {
405
+ files,
406
+ totalFiles,
407
+ message,
408
+ },
409
+ };
410
+ }