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
@@ -1,288 +0,0 @@
1
- /**
2
- * Detect Changed Modules Tool
3
- * Find modules affected by git changes or recent modifications
4
- */
5
-
6
- import { readdirSync, statSync, existsSync, readFileSync } from 'fs';
7
- import { join, resolve, dirname, extname, relative } from 'path';
8
- import { execSync } from 'child_process';
9
-
10
- // Source file extensions to track
11
- const SOURCE_EXTENSIONS = [
12
- '.md', '.js', '.ts', '.jsx', '.tsx',
13
- '.py', '.go', '.rs', '.java', '.cpp', '.c', '.h',
14
- '.sh', '.ps1', '.json', '.yaml', '.yml'
15
- ];
16
-
17
- // Directories to exclude
18
- const EXCLUDE_DIRS = [
19
- '.git', '__pycache__', 'node_modules', '.venv', 'venv', 'env',
20
- 'dist', 'build', '.cache', '.pytest_cache', '.mypy_cache',
21
- 'coverage', '.nyc_output', 'logs', 'tmp', 'temp'
22
- ];
23
-
24
- /**
25
- * Check if git is available and we're in a repo
26
- */
27
- function isGitRepo(basePath) {
28
- try {
29
- execSync('git rev-parse --git-dir', { cwd: basePath, stdio: 'pipe' });
30
- return true;
31
- } catch (e) {
32
- return false;
33
- }
34
- }
35
-
36
- /**
37
- * Get changed files from git
38
- */
39
- function getGitChangedFiles(basePath) {
40
- try {
41
- // Get staged + unstaged changes
42
- let output = execSync('git diff --name-only HEAD 2>/dev/null', {
43
- cwd: basePath,
44
- encoding: 'utf8',
45
- stdio: ['pipe', 'pipe', 'pipe']
46
- }).trim();
47
-
48
- const cachedOutput = execSync('git diff --name-only --cached 2>/dev/null', {
49
- cwd: basePath,
50
- encoding: 'utf8',
51
- stdio: ['pipe', 'pipe', 'pipe']
52
- }).trim();
53
-
54
- if (cachedOutput) {
55
- output = output ? `${output}\n${cachedOutput}` : cachedOutput;
56
- }
57
-
58
- // If no working changes, check last commit
59
- if (!output) {
60
- output = execSync('git diff --name-only HEAD~1 HEAD 2>/dev/null', {
61
- cwd: basePath,
62
- encoding: 'utf8',
63
- stdio: ['pipe', 'pipe', 'pipe']
64
- }).trim();
65
- }
66
-
67
- return output ? output.split('\n').filter(f => f.trim()) : [];
68
- } catch (e) {
69
- return [];
70
- }
71
- }
72
-
73
- /**
74
- * Find recently modified files (fallback when no git changes)
75
- */
76
- function findRecentlyModified(basePath, hoursAgo = 24) {
77
- const results = [];
78
- const cutoffTime = Date.now() - (hoursAgo * 60 * 60 * 1000);
79
-
80
- function scan(dirPath) {
81
- try {
82
- const entries = readdirSync(dirPath, { withFileTypes: true });
83
-
84
- for (const entry of entries) {
85
- if (entry.isDirectory()) {
86
- if (EXCLUDE_DIRS.includes(entry.name)) continue;
87
- scan(join(dirPath, entry.name));
88
- } else if (entry.isFile()) {
89
- const ext = extname(entry.name).toLowerCase();
90
- if (!SOURCE_EXTENSIONS.includes(ext)) continue;
91
-
92
- const fullPath = join(dirPath, entry.name);
93
- try {
94
- const stat = statSync(fullPath);
95
- if (stat.mtimeMs > cutoffTime) {
96
- results.push(relative(basePath, fullPath));
97
- }
98
- } catch (e) {
99
- // Skip files we can't stat
100
- }
101
- }
102
- }
103
- } catch (e) {
104
- // Ignore permission errors
105
- }
106
- }
107
-
108
- scan(basePath);
109
- return results;
110
- }
111
-
112
- /**
113
- * Extract unique parent directories from file list
114
- */
115
- function extractDirectories(files, basePath) {
116
- const dirs = new Set();
117
-
118
- for (const file of files) {
119
- const dir = dirname(file);
120
- if (dir === '.' || dir === '') {
121
- dirs.add('.');
122
- } else {
123
- dirs.add('./' + dir.replace(/\\/g, '/'));
124
- }
125
- }
126
-
127
- return Array.from(dirs).sort();
128
- }
129
-
130
- /**
131
- * Count files in directory
132
- */
133
- function countFiles(dirPath) {
134
- try {
135
- const entries = readdirSync(dirPath, { withFileTypes: true });
136
- return entries.filter(e => e.isFile()).length;
137
- } catch (e) {
138
- return 0;
139
- }
140
- }
141
-
142
- /**
143
- * Get file types in directory
144
- */
145
- function getFileTypes(dirPath) {
146
- const types = new Set();
147
- try {
148
- const entries = readdirSync(dirPath, { withFileTypes: true });
149
- entries.forEach(entry => {
150
- if (entry.isFile()) {
151
- const ext = extname(entry.name).slice(1);
152
- if (ext) types.add(ext);
153
- }
154
- });
155
- } catch (e) {
156
- // Ignore
157
- }
158
- return Array.from(types);
159
- }
160
-
161
- /**
162
- * Main execute function
163
- */
164
- async function execute(params) {
165
- const { format = 'paths', path: targetPath = '.' } = params;
166
-
167
- const basePath = resolve(process.cwd(), targetPath);
168
-
169
- if (!existsSync(basePath)) {
170
- throw new Error(`Directory not found: ${basePath}`);
171
- }
172
-
173
- // Get changed files
174
- let changedFiles = [];
175
- let changeSource = 'none';
176
-
177
- if (isGitRepo(basePath)) {
178
- changedFiles = getGitChangedFiles(basePath);
179
- changeSource = changedFiles.length > 0 ? 'git' : 'none';
180
- }
181
-
182
- // Fallback to recently modified files
183
- if (changedFiles.length === 0) {
184
- changedFiles = findRecentlyModified(basePath);
185
- changeSource = changedFiles.length > 0 ? 'mtime' : 'none';
186
- }
187
-
188
- // Extract affected directories
189
- const affectedDirs = extractDirectories(changedFiles, basePath);
190
-
191
- // Format output
192
- let output;
193
- const results = [];
194
-
195
- for (const dir of affectedDirs) {
196
- const fullPath = dir === '.' ? basePath : resolve(basePath, dir);
197
- if (!existsSync(fullPath) || !statSync(fullPath).isDirectory()) continue;
198
-
199
- const fileCount = countFiles(fullPath);
200
- const types = getFileTypes(fullPath);
201
- const depth = dir === '.' ? 0 : (dir.match(/\//g) || []).length;
202
- const hasClaude = existsSync(join(fullPath, 'CLAUDE.md'));
203
-
204
- results.push({
205
- depth,
206
- path: dir,
207
- files: fileCount,
208
- types,
209
- has_claude: hasClaude
210
- });
211
- }
212
-
213
- switch (format) {
214
- case 'list':
215
- output = results.map(r =>
216
- `depth:${r.depth}|path:${r.path}|files:${r.files}|types:[${r.types.join(',')}]|has_claude:${r.has_claude ? 'yes' : 'no'}|status:changed`
217
- ).join('\n');
218
- break;
219
-
220
- case 'grouped':
221
- const maxDepth = results.length > 0 ? Math.max(...results.map(r => r.depth)) : 0;
222
- const lines = ['Affected modules by changes:'];
223
-
224
- for (let d = 0; d <= maxDepth; d++) {
225
- const atDepth = results.filter(r => r.depth === d);
226
- if (atDepth.length > 0) {
227
- lines.push(` Depth ${d}:`);
228
- atDepth.forEach(r => {
229
- const claudeIndicator = r.has_claude ? ' [OK]' : '';
230
- lines.push(` - ${r.path}${claudeIndicator} (changed)`);
231
- });
232
- }
233
- }
234
-
235
- if (results.length === 0) {
236
- lines.push(' No recent changes detected');
237
- }
238
-
239
- output = lines.join('\n');
240
- break;
241
-
242
- case 'paths':
243
- default:
244
- output = affectedDirs.join('\n');
245
- break;
246
- }
247
-
248
- return {
249
- format,
250
- change_source: changeSource,
251
- changed_files_count: changedFiles.length,
252
- affected_modules_count: results.length,
253
- results,
254
- output
255
- };
256
- }
257
-
258
- /**
259
- * Tool Definition
260
- */
261
- export const detectChangedModulesTool = {
262
- name: 'detect_changed_modules',
263
- description: `Detect modules affected by git changes or recent file modifications.
264
- Features:
265
- - Git-aware: detects staged, unstaged, or last commit changes
266
- - Fallback: finds files modified in last 24 hours
267
- - Respects .gitignore patterns
268
-
269
- Output formats: list, grouped, paths (default)`,
270
- parameters: {
271
- type: 'object',
272
- properties: {
273
- format: {
274
- type: 'string',
275
- enum: ['list', 'grouped', 'paths'],
276
- description: 'Output format (default: paths)',
277
- default: 'paths'
278
- },
279
- path: {
280
- type: 'string',
281
- description: 'Target directory path (default: current directory)',
282
- default: '.'
283
- }
284
- },
285
- required: []
286
- },
287
- execute
288
- };
@@ -1,266 +0,0 @@
1
- /**
2
- * Edit File Tool - AI-focused file editing
3
- * Two complementary modes:
4
- * - update: Content-driven text replacement (AI primary use)
5
- * - line: Position-driven line operations (precise control)
6
- */
7
-
8
- import { readFileSync, writeFileSync, existsSync } from 'fs';
9
- import { resolve, isAbsolute } from 'path';
10
-
11
- /**
12
- * Resolve file path and read content
13
- * @param {string} filePath - Path to file
14
- * @returns {{resolvedPath: string, content: string}}
15
- */
16
- function readFile(filePath) {
17
- const resolvedPath = isAbsolute(filePath) ? filePath : resolve(process.cwd(), filePath);
18
-
19
- if (!existsSync(resolvedPath)) {
20
- throw new Error(`File not found: ${resolvedPath}`);
21
- }
22
-
23
- try {
24
- const content = readFileSync(resolvedPath, 'utf8');
25
- return { resolvedPath, content };
26
- } catch (error) {
27
- throw new Error(`Failed to read file: ${error.message}`);
28
- }
29
- }
30
-
31
- /**
32
- * Write content to file
33
- * @param {string} filePath - Path to file
34
- * @param {string} content - Content to write
35
- */
36
- function writeFile(filePath, content) {
37
- try {
38
- writeFileSync(filePath, content, 'utf8');
39
- } catch (error) {
40
- throw new Error(`Failed to write file: ${error.message}`);
41
- }
42
- }
43
-
44
- /**
45
- * Mode: update - Simple text replacement
46
- * Auto-adapts line endings (CRLF/LF)
47
- */
48
- function executeUpdateMode(content, params) {
49
- const { oldText, newText, replaceAll } = params;
50
-
51
- if (!oldText) throw new Error('Parameter "oldText" is required for update mode');
52
- if (newText === undefined) throw new Error('Parameter "newText" is required for update mode');
53
-
54
- // Detect original line ending
55
- const hasCRLF = content.includes('\r\n');
56
-
57
- // Normalize to LF for matching
58
- const normalize = (str) => str.replace(/\r\n/g, '\n');
59
- const normalizedContent = normalize(content);
60
- const normalizedOld = normalize(oldText);
61
- const normalizedNew = normalize(newText);
62
-
63
- let newContent = normalizedContent;
64
- let status = 'not found';
65
- let replacements = 0;
66
-
67
- if (newContent.includes(normalizedOld)) {
68
- if (replaceAll) {
69
- const parts = newContent.split(normalizedOld);
70
- replacements = parts.length - 1;
71
- newContent = parts.join(normalizedNew);
72
- status = 'replaced_all';
73
- } else {
74
- newContent = newContent.replace(normalizedOld, normalizedNew);
75
- status = 'replaced';
76
- replacements = 1;
77
- }
78
- }
79
-
80
- // Restore original line ending
81
- if (hasCRLF) {
82
- newContent = newContent.replace(/\n/g, '\r\n');
83
- }
84
-
85
- return {
86
- content: newContent,
87
- modified: content !== newContent,
88
- status,
89
- replacements,
90
- message:
91
- status === 'replaced_all'
92
- ? `Text replaced successfully (${replacements} occurrences)`
93
- : status === 'replaced'
94
- ? 'Text replaced successfully'
95
- : 'oldText not found in file'
96
- };
97
- }
98
-
99
- /**
100
- * Mode: line - Line-based operations
101
- * Operations: insert_before, insert_after, replace, delete
102
- */
103
- function executeLineMode(content, params) {
104
- const { operation, line, text, end_line } = params;
105
-
106
- if (!operation) throw new Error('Parameter "operation" is required for line mode');
107
- if (line === undefined) throw new Error('Parameter "line" is required for line mode');
108
-
109
- // Detect original line ending and normalize for processing
110
- const hasCRLF = content.includes('\r\n');
111
- const normalizedContent = hasCRLF ? content.replace(/\r\n/g, '\n') : content;
112
-
113
- const lines = normalizedContent.split('\n');
114
- const lineIndex = line - 1; // Convert to 0-based
115
-
116
- if (lineIndex < 0 || lineIndex >= lines.length) {
117
- throw new Error(`Line ${line} out of range (1-${lines.length})`);
118
- }
119
-
120
- let newLines = [...lines];
121
- let message = '';
122
-
123
- switch (operation) {
124
- case 'insert_before':
125
- if (text === undefined) throw new Error('Parameter "text" is required for insert_before');
126
- newLines.splice(lineIndex, 0, text);
127
- message = `Inserted before line ${line}`;
128
- break;
129
-
130
- case 'insert_after':
131
- if (text === undefined) throw new Error('Parameter "text" is required for insert_after');
132
- newLines.splice(lineIndex + 1, 0, text);
133
- message = `Inserted after line ${line}`;
134
- break;
135
-
136
- case 'replace':
137
- if (text === undefined) throw new Error('Parameter "text" is required for replace');
138
- const endIdx = end_line ? end_line - 1 : lineIndex;
139
- if (endIdx < lineIndex || endIdx >= lines.length) {
140
- throw new Error(`end_line ${end_line} is invalid`);
141
- }
142
- const deleteCount = endIdx - lineIndex + 1;
143
- newLines.splice(lineIndex, deleteCount, text);
144
- message = end_line ? `Replaced lines ${line}-${end_line}` : `Replaced line ${line}`;
145
- break;
146
-
147
- case 'delete':
148
- const endDelete = end_line ? end_line - 1 : lineIndex;
149
- if (endDelete < lineIndex || endDelete >= lines.length) {
150
- throw new Error(`end_line ${end_line} is invalid`);
151
- }
152
- const count = endDelete - lineIndex + 1;
153
- newLines.splice(lineIndex, count);
154
- message = end_line ? `Deleted lines ${line}-${end_line}` : `Deleted line ${line}`;
155
- break;
156
-
157
- default:
158
- throw new Error(`Unknown operation: ${operation}. Valid: insert_before, insert_after, replace, delete`);
159
- }
160
-
161
- let newContent = newLines.join('\n');
162
-
163
- // Restore original line endings
164
- if (hasCRLF) {
165
- newContent = newContent.replace(/\n/g, '\r\n');
166
- }
167
-
168
- return {
169
- content: newContent,
170
- modified: content !== newContent,
171
- operation,
172
- line,
173
- end_line,
174
- message
175
- };
176
- }
177
-
178
- /**
179
- * Main execute function - routes to appropriate mode
180
- */
181
- async function execute(params) {
182
- const { path: filePath, mode = 'update' } = params;
183
-
184
- if (!filePath) throw new Error('Parameter "path" is required');
185
-
186
- const { resolvedPath, content } = readFile(filePath);
187
-
188
- let result;
189
- switch (mode) {
190
- case 'update':
191
- result = executeUpdateMode(content, params);
192
- break;
193
- case 'line':
194
- result = executeLineMode(content, params);
195
- break;
196
- default:
197
- throw new Error(`Unknown mode: ${mode}. Valid modes: update, line`);
198
- }
199
-
200
- // Write if modified
201
- if (result.modified) {
202
- writeFile(resolvedPath, result.content);
203
- }
204
-
205
- // Remove content from result (don't return file content)
206
- const { content: _, ...output } = result;
207
- return output;
208
- }
209
-
210
- /**
211
- * Edit File Tool Definition
212
- */
213
- export const editFileTool = {
214
- name: 'edit_file',
215
- description: `Update file with two modes:
216
- - update: Replace oldText with newText (default)
217
- - line: Position-driven line operations`,
218
- parameters: {
219
- type: 'object',
220
- properties: {
221
- path: {
222
- type: 'string',
223
- description: 'Path to the file to modify'
224
- },
225
- mode: {
226
- type: 'string',
227
- enum: ['update', 'line'],
228
- description: 'Edit mode (default: update)',
229
- default: 'update'
230
- },
231
- // Update mode params
232
- oldText: {
233
- type: 'string',
234
- description: '[update mode] Text to find and replace'
235
- },
236
- newText: {
237
- type: 'string',
238
- description: '[update mode] Replacement text'
239
- },
240
- replaceAll: {
241
- type: 'boolean',
242
- description: '[update mode] Replace all occurrences of oldText (default: false)'
243
- },
244
- // Line mode params
245
- operation: {
246
- type: 'string',
247
- enum: ['insert_before', 'insert_after', 'replace', 'delete'],
248
- description: '[line mode] Line operation type'
249
- },
250
- line: {
251
- type: 'number',
252
- description: '[line mode] Line number (1-based)'
253
- },
254
- end_line: {
255
- type: 'number',
256
- description: '[line mode] End line for range operations'
257
- },
258
- text: {
259
- type: 'string',
260
- description: '[line mode] Text for insert/replace operations'
261
- }
262
- },
263
- required: ['path']
264
- },
265
- execute
266
- };