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,121 @@
1
+ """Pydantic entity models for CodexLens."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from enum import Enum
6
+ from typing import Any, Dict, List, Optional, Tuple
7
+
8
+ from pydantic import BaseModel, Field, field_validator
9
+
10
+
11
+ class Symbol(BaseModel):
12
+ """A code symbol discovered in a file."""
13
+
14
+ name: str = Field(..., min_length=1)
15
+ kind: str = Field(..., min_length=1)
16
+ range: Tuple[int, int] = Field(..., description="(start_line, end_line), 1-based inclusive")
17
+ file: Optional[str] = Field(default=None, description="Full path to the file containing this symbol")
18
+
19
+ @field_validator("range")
20
+ @classmethod
21
+ def validate_range(cls, value: Tuple[int, int]) -> Tuple[int, int]:
22
+ if len(value) != 2:
23
+ raise ValueError("range must be a (start_line, end_line) tuple")
24
+ start_line, end_line = value
25
+ if start_line < 1 or end_line < 1:
26
+ raise ValueError("range lines must be >= 1")
27
+ if end_line < start_line:
28
+ raise ValueError("end_line must be >= start_line")
29
+ return value
30
+
31
+
32
+ class SemanticChunk(BaseModel):
33
+ """A semantically meaningful chunk of content, optionally embedded."""
34
+
35
+ content: str = Field(..., min_length=1)
36
+ embedding: Optional[List[float]] = Field(default=None, description="Vector embedding for semantic search")
37
+ metadata: Dict[str, Any] = Field(default_factory=dict)
38
+
39
+ @field_validator("embedding")
40
+ @classmethod
41
+ def validate_embedding(cls, value: Optional[List[float]]) -> Optional[List[float]]:
42
+ if value is None:
43
+ return value
44
+ if not value:
45
+ raise ValueError("embedding cannot be empty when provided")
46
+ return value
47
+
48
+
49
+ class IndexedFile(BaseModel):
50
+ """An indexed source file with symbols and optional semantic chunks."""
51
+
52
+ path: str = Field(..., min_length=1)
53
+ language: str = Field(..., min_length=1)
54
+ symbols: List[Symbol] = Field(default_factory=list)
55
+ chunks: List[SemanticChunk] = Field(default_factory=list)
56
+
57
+ @field_validator("path", "language")
58
+ @classmethod
59
+ def strip_and_validate_nonempty(cls, value: str) -> str:
60
+ cleaned = value.strip()
61
+ if not cleaned:
62
+ raise ValueError("value cannot be blank")
63
+ return cleaned
64
+
65
+
66
+ class RelationshipType(str, Enum):
67
+ """Types of code relationships."""
68
+ CALL = "call"
69
+ INHERITS = "inherits"
70
+ IMPORTS = "imports"
71
+
72
+
73
+ class CodeRelationship(BaseModel):
74
+ """A relationship between code symbols (e.g., function calls, inheritance)."""
75
+
76
+ source_symbol: str = Field(..., min_length=1, description="Name of source symbol")
77
+ target_symbol: str = Field(..., min_length=1, description="Name of target symbol")
78
+ relationship_type: RelationshipType = Field(..., description="Type of relationship (call, inherits, etc.)")
79
+ source_file: str = Field(..., min_length=1, description="File path containing source symbol")
80
+ target_file: Optional[str] = Field(default=None, description="File path containing target (None if same file)")
81
+ source_line: int = Field(..., ge=1, description="Line number where relationship occurs (1-based)")
82
+
83
+
84
+ class AdditionalLocation(BaseModel):
85
+ """A pointer to another location where a similar result was found.
86
+
87
+ Used for grouping search results with similar scores and content,
88
+ where the primary result is stored in SearchResult and secondary
89
+ locations are stored in this model.
90
+ """
91
+
92
+ path: str = Field(..., min_length=1)
93
+ score: float = Field(..., ge=0.0)
94
+ start_line: Optional[int] = Field(default=None, description="Start line of the result (1-based)")
95
+ end_line: Optional[int] = Field(default=None, description="End line of the result (1-based)")
96
+ symbol_name: Optional[str] = Field(default=None, description="Name of matched symbol")
97
+
98
+
99
+ class SearchResult(BaseModel):
100
+ """A unified search result for lexical or semantic search."""
101
+
102
+ path: str = Field(..., min_length=1)
103
+ score: float = Field(..., ge=0.0)
104
+ excerpt: Optional[str] = None
105
+ content: Optional[str] = Field(default=None, description="Full content of matched code block")
106
+ symbol: Optional[Symbol] = None
107
+ chunk: Optional[SemanticChunk] = None
108
+ metadata: Dict[str, Any] = Field(default_factory=dict)
109
+
110
+ # Additional context for complete code blocks
111
+ start_line: Optional[int] = Field(default=None, description="Start line of code block (1-based)")
112
+ end_line: Optional[int] = Field(default=None, description="End line of code block (1-based)")
113
+ symbol_name: Optional[str] = Field(default=None, description="Name of matched symbol/function/class")
114
+ symbol_kind: Optional[str] = Field(default=None, description="Kind of symbol (function/class/method)")
115
+
116
+ # Field for grouping similar results
117
+ additional_locations: List["AdditionalLocation"] = Field(
118
+ default_factory=list,
119
+ description="Other locations for grouped results with similar scores and content."
120
+ )
121
+
@@ -0,0 +1,55 @@
1
+ """CodexLens exception hierarchy."""
2
+
3
+ from __future__ import annotations
4
+
5
+
6
+ class CodexLensError(Exception):
7
+ """Base class for all CodexLens errors."""
8
+
9
+
10
+ class ConfigError(CodexLensError):
11
+ """Raised when configuration is invalid or cannot be loaded."""
12
+
13
+
14
+ class ParseError(CodexLensError):
15
+ """Raised when parsing or indexing a file fails."""
16
+
17
+
18
+ class StorageError(CodexLensError):
19
+ """Raised when reading/writing index storage fails.
20
+
21
+ Attributes:
22
+ message: Human-readable error description
23
+ db_path: Path to the database file (if applicable)
24
+ operation: The operation that failed (e.g., 'query', 'initialize', 'migrate')
25
+ details: Additional context for debugging
26
+ """
27
+
28
+ def __init__(
29
+ self,
30
+ message: str,
31
+ db_path: str | None = None,
32
+ operation: str | None = None,
33
+ details: dict | None = None
34
+ ) -> None:
35
+ super().__init__(message)
36
+ self.message = message
37
+ self.db_path = db_path
38
+ self.operation = operation
39
+ self.details = details or {}
40
+
41
+ def __str__(self) -> str:
42
+ parts = [self.message]
43
+ if self.db_path:
44
+ parts.append(f"[db: {self.db_path}]")
45
+ if self.operation:
46
+ parts.append(f"[op: {self.operation}]")
47
+ if self.details:
48
+ detail_str = ", ".join(f"{k}={v}" for k, v in self.details.items())
49
+ parts.append(f"[{detail_str}]")
50
+ return " ".join(parts)
51
+
52
+
53
+ class SearchError(CodexLensError):
54
+ """Raised when a search operation fails."""
55
+
@@ -0,0 +1,77 @@
1
+ # Symbol Extraction and Indexing
2
+
3
+ This module provides symbol extraction and relationship tracking for code graph enrichment.
4
+
5
+ ## Overview
6
+
7
+ The `SymbolExtractor` class extracts code symbols (functions, classes) and their relationships (calls, imports) from source files using regex-based pattern matching.
8
+
9
+ ## Supported Languages
10
+
11
+ - Python (.py)
12
+ - TypeScript (.ts, .tsx)
13
+ - JavaScript (.js, .jsx)
14
+
15
+ ## Database Schema
16
+
17
+ ### Symbols Table
18
+ Stores code symbols with their location information:
19
+ - `id`: Primary key
20
+ - `qualified_name`: Fully qualified name (e.g., "module.ClassName")
21
+ - `name`: Symbol name
22
+ - `kind`: Symbol type (function, class)
23
+ - `file_path`: Path to source file
24
+ - `start_line`: Starting line number
25
+ - `end_line`: Ending line number
26
+
27
+ ### Symbol Relationships Table
28
+ Stores relationships between symbols:
29
+ - `id`: Primary key
30
+ - `source_symbol_id`: Foreign key to symbols table
31
+ - `target_symbol_fqn`: Fully qualified name of target symbol
32
+ - `relationship_type`: Type of relationship (calls, imports)
33
+ - `file_path`: Path to source file
34
+ - `line`: Line number where relationship occurs
35
+
36
+ ## Usage Example
37
+
38
+ ```python
39
+ from pathlib import Path
40
+ from codexlens.indexing.symbol_extractor import SymbolExtractor
41
+
42
+ # Initialize extractor
43
+ db_path = Path("./code_index.db")
44
+ extractor = SymbolExtractor(db_path)
45
+ extractor.connect()
46
+
47
+ # Extract from file
48
+ file_path = Path("src/my_module.py")
49
+ with open(file_path) as f:
50
+ content = f.read()
51
+
52
+ symbols, relationships = extractor.extract_from_file(file_path, content)
53
+
54
+ # Save to database
55
+ name_to_id = extractor.save_symbols(symbols)
56
+ extractor.save_relationships(relationships, name_to_id)
57
+
58
+ # Clean up
59
+ extractor.close()
60
+ ```
61
+
62
+ ## Pattern Matching
63
+
64
+ The extractor uses regex patterns to identify:
65
+
66
+ - **Functions**: Function definitions (including async, export keywords)
67
+ - **Classes**: Class definitions (including export keyword)
68
+ - **Imports**: Import/require statements
69
+ - **Calls**: Function/method invocations
70
+
71
+ ## Future Enhancements
72
+
73
+ - Tree-sitter integration for more accurate parsing
74
+ - Support for additional languages
75
+ - Method and variable extraction
76
+ - Enhanced scope tracking
77
+ - Relationship type expansion (inherits, implements, etc.)
@@ -0,0 +1,4 @@
1
+ """Code indexing and symbol extraction."""
2
+ from codexlens.indexing.symbol_extractor import SymbolExtractor
3
+
4
+ __all__ = ["SymbolExtractor"]
@@ -0,0 +1,243 @@
1
+ """Symbol and relationship extraction from source code."""
2
+ import re
3
+ import sqlite3
4
+ from pathlib import Path
5
+ from typing import Any, Dict, List, Optional, Tuple
6
+
7
+
8
+ class SymbolExtractor:
9
+ """Extract symbols and relationships from source code using regex patterns."""
10
+
11
+ # Pattern definitions for different languages
12
+ PATTERNS = {
13
+ 'python': {
14
+ 'function': r'^(?:async\s+)?def\s+(\w+)\s*\(',
15
+ 'class': r'^class\s+(\w+)\s*[:\(]',
16
+ 'import': r'^(?:from\s+([\w.]+)\s+)?import\s+([\w.,\s]+)',
17
+ 'call': r'(?<![.\w])(\w+)\s*\(',
18
+ },
19
+ 'typescript': {
20
+ 'function': r'(?:export\s+)?(?:async\s+)?function\s+(\w+)\s*[<\(]',
21
+ 'class': r'(?:export\s+)?class\s+(\w+)',
22
+ 'import': r"import\s+.*\s+from\s+['\"]([^'\"]+)['\"]",
23
+ 'call': r'(?<![.\w])(\w+)\s*[<\(]',
24
+ },
25
+ 'javascript': {
26
+ 'function': r'(?:export\s+)?(?:async\s+)?function\s+(\w+)\s*\(',
27
+ 'class': r'(?:export\s+)?class\s+(\w+)',
28
+ 'import': r"(?:import|require)\s*\(?['\"]([^'\"]+)['\"]",
29
+ 'call': r'(?<![.\w])(\w+)\s*\(',
30
+ }
31
+ }
32
+
33
+ LANGUAGE_MAP = {
34
+ '.py': 'python',
35
+ '.ts': 'typescript',
36
+ '.tsx': 'typescript',
37
+ '.js': 'javascript',
38
+ '.jsx': 'javascript',
39
+ }
40
+
41
+ def __init__(self, db_path: Path):
42
+ self.db_path = db_path
43
+ self.db_conn: Optional[sqlite3.Connection] = None
44
+
45
+ def connect(self) -> None:
46
+ """Connect to database and ensure schema exists."""
47
+ self.db_conn = sqlite3.connect(str(self.db_path))
48
+ self._ensure_tables()
49
+
50
+ def __enter__(self) -> "SymbolExtractor":
51
+ """Context manager entry: connect to database."""
52
+ self.connect()
53
+ return self
54
+
55
+ def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
56
+ """Context manager exit: close database connection."""
57
+ self.close()
58
+
59
+ def _ensure_tables(self) -> None:
60
+ """Create symbols and relationships tables if they don't exist."""
61
+ if not self.db_conn:
62
+ return
63
+ cursor = self.db_conn.cursor()
64
+
65
+ # Create symbols table with qualified_name
66
+ cursor.execute('''
67
+ CREATE TABLE IF NOT EXISTS symbols (
68
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
69
+ qualified_name TEXT NOT NULL,
70
+ name TEXT NOT NULL,
71
+ kind TEXT NOT NULL,
72
+ file_path TEXT NOT NULL,
73
+ start_line INTEGER NOT NULL,
74
+ end_line INTEGER NOT NULL,
75
+ UNIQUE(file_path, name, start_line)
76
+ )
77
+ ''')
78
+
79
+ # Create relationships table with target_symbol_fqn
80
+ cursor.execute('''
81
+ CREATE TABLE IF NOT EXISTS symbol_relationships (
82
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
83
+ source_symbol_id INTEGER NOT NULL,
84
+ target_symbol_fqn TEXT NOT NULL,
85
+ relationship_type TEXT NOT NULL,
86
+ file_path TEXT NOT NULL,
87
+ line INTEGER,
88
+ FOREIGN KEY (source_symbol_id) REFERENCES symbols(id) ON DELETE CASCADE
89
+ )
90
+ ''')
91
+
92
+ # Create performance indexes
93
+ cursor.execute('CREATE INDEX IF NOT EXISTS idx_symbols_name ON symbols(name)')
94
+ cursor.execute('CREATE INDEX IF NOT EXISTS idx_symbols_file ON symbols(file_path)')
95
+ cursor.execute('CREATE INDEX IF NOT EXISTS idx_rel_source ON symbol_relationships(source_symbol_id)')
96
+ cursor.execute('CREATE INDEX IF NOT EXISTS idx_rel_target ON symbol_relationships(target_symbol_fqn)')
97
+ cursor.execute('CREATE INDEX IF NOT EXISTS idx_rel_type ON symbol_relationships(relationship_type)')
98
+
99
+ self.db_conn.commit()
100
+
101
+ def extract_from_file(self, file_path: Path, content: str) -> Tuple[List[Dict], List[Dict]]:
102
+ """Extract symbols and relationships from file content.
103
+
104
+ Args:
105
+ file_path: Path to the source file
106
+ content: File content as string
107
+
108
+ Returns:
109
+ Tuple of (symbols, relationships) where:
110
+ - symbols: List of symbol dicts with qualified_name, name, kind, file_path, start_line, end_line
111
+ - relationships: List of relationship dicts with source_scope, target, type, file_path, line
112
+ """
113
+ ext = file_path.suffix.lower()
114
+ lang = self.LANGUAGE_MAP.get(ext)
115
+
116
+ if not lang or lang not in self.PATTERNS:
117
+ return [], []
118
+
119
+ patterns = self.PATTERNS[lang]
120
+ symbols = []
121
+ relationships = []
122
+ lines = content.split('\n')
123
+
124
+ current_scope = None
125
+
126
+ for line_num, line in enumerate(lines, 1):
127
+ # Extract function/class definitions
128
+ for kind in ['function', 'class']:
129
+ if kind in patterns:
130
+ match = re.search(patterns[kind], line)
131
+ if match:
132
+ name = match.group(1)
133
+ qualified_name = f"{file_path.stem}.{name}"
134
+ symbols.append({
135
+ 'qualified_name': qualified_name,
136
+ 'name': name,
137
+ 'kind': kind,
138
+ 'file_path': str(file_path),
139
+ 'start_line': line_num,
140
+ 'end_line': line_num, # Simplified - would need proper parsing for actual end
141
+ })
142
+ current_scope = name
143
+
144
+ # Extract imports
145
+ if 'import' in patterns:
146
+ match = re.search(patterns['import'], line)
147
+ if match:
148
+ import_target = match.group(1) or match.group(2) if match.lastindex >= 2 else match.group(1)
149
+ if import_target and current_scope:
150
+ relationships.append({
151
+ 'source_scope': current_scope,
152
+ 'target': import_target.strip(),
153
+ 'type': 'imports',
154
+ 'file_path': str(file_path),
155
+ 'line': line_num,
156
+ })
157
+
158
+ # Extract function calls (simplified)
159
+ if 'call' in patterns and current_scope:
160
+ for match in re.finditer(patterns['call'], line):
161
+ call_name = match.group(1)
162
+ # Skip common keywords and the current function
163
+ if call_name not in ['if', 'for', 'while', 'return', 'print', 'len', 'str', 'int', 'float', 'list', 'dict', 'set', 'tuple', current_scope]:
164
+ relationships.append({
165
+ 'source_scope': current_scope,
166
+ 'target': call_name,
167
+ 'type': 'calls',
168
+ 'file_path': str(file_path),
169
+ 'line': line_num,
170
+ })
171
+
172
+ return symbols, relationships
173
+
174
+ def save_symbols(self, symbols: List[Dict]) -> Dict[str, int]:
175
+ """Save symbols to database and return name->id mapping.
176
+
177
+ Args:
178
+ symbols: List of symbol dicts with qualified_name, name, kind, file_path, start_line, end_line
179
+
180
+ Returns:
181
+ Dictionary mapping symbol name to database id
182
+ """
183
+ if not self.db_conn or not symbols:
184
+ return {}
185
+
186
+ cursor = self.db_conn.cursor()
187
+ name_to_id = {}
188
+
189
+ for sym in symbols:
190
+ try:
191
+ cursor.execute('''
192
+ INSERT OR IGNORE INTO symbols
193
+ (qualified_name, name, kind, file_path, start_line, end_line)
194
+ VALUES (?, ?, ?, ?, ?, ?)
195
+ ''', (sym['qualified_name'], sym['name'], sym['kind'],
196
+ sym['file_path'], sym['start_line'], sym['end_line']))
197
+
198
+ # Get the id
199
+ cursor.execute('''
200
+ SELECT id FROM symbols
201
+ WHERE file_path = ? AND name = ? AND start_line = ?
202
+ ''', (sym['file_path'], sym['name'], sym['start_line']))
203
+
204
+ row = cursor.fetchone()
205
+ if row:
206
+ name_to_id[sym['name']] = row[0]
207
+ except sqlite3.Error:
208
+ continue
209
+
210
+ self.db_conn.commit()
211
+ return name_to_id
212
+
213
+ def save_relationships(self, relationships: List[Dict], name_to_id: Dict[str, int]) -> None:
214
+ """Save relationships to database.
215
+
216
+ Args:
217
+ relationships: List of relationship dicts with source_scope, target, type, file_path, line
218
+ name_to_id: Dictionary mapping symbol names to database ids
219
+ """
220
+ if not self.db_conn or not relationships:
221
+ return
222
+
223
+ cursor = self.db_conn.cursor()
224
+
225
+ for rel in relationships:
226
+ source_id = name_to_id.get(rel['source_scope'])
227
+ if source_id:
228
+ try:
229
+ cursor.execute('''
230
+ INSERT INTO symbol_relationships
231
+ (source_symbol_id, target_symbol_fqn, relationship_type, file_path, line)
232
+ VALUES (?, ?, ?, ?, ?)
233
+ ''', (source_id, rel['target'], rel['type'], rel['file_path'], rel['line']))
234
+ except sqlite3.Error:
235
+ continue
236
+
237
+ self.db_conn.commit()
238
+
239
+ def close(self) -> None:
240
+ """Close database connection."""
241
+ if self.db_conn:
242
+ self.db_conn.close()
243
+ self.db_conn = None
@@ -0,0 +1,8 @@
1
+ """Parsers for CodexLens."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from .factory import ParserFactory
6
+
7
+ __all__ = ["ParserFactory"]
8
+