claude-code-workflow 6.2.5 → 6.2.7

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 (965) hide show
  1. package/.claude/CLAUDE.md +10 -0
  2. package/.claude/agents/action-planning-agent.md +857 -0
  3. package/.claude/agents/cli-execution-agent.md +267 -0
  4. package/.claude/agents/cli-explore-agent.md +182 -0
  5. package/.claude/agents/cli-lite-planning-agent.md +446 -0
  6. package/.claude/agents/cli-planning-agent.md +558 -0
  7. package/.claude/agents/code-developer.md +311 -0
  8. package/.claude/agents/conceptual-planning-agent.md +308 -0
  9. package/.claude/agents/context-search-agent.md +581 -0
  10. package/.claude/agents/doc-generator.md +330 -0
  11. package/.claude/agents/memory-bridge.md +94 -0
  12. package/.claude/agents/test-context-search-agent.md +400 -0
  13. package/.claude/agents/test-fix-agent.md +344 -0
  14. package/.claude/agents/ui-design-agent.md +593 -0
  15. package/.claude/agents/universal-executor.md +131 -0
  16. package/.claude/commands/clean.md +516 -0
  17. package/.claude/commands/cli/cli-init.md +440 -0
  18. package/.claude/commands/enhance-prompt.md +93 -0
  19. package/.claude/commands/memory/code-map-memory.md +687 -0
  20. package/.claude/commands/memory/compact.md +383 -0
  21. package/.claude/commands/memory/docs-full-cli.md +471 -0
  22. package/.claude/commands/memory/docs-related-cli.md +386 -0
  23. package/.claude/commands/memory/docs.md +615 -0
  24. package/.claude/commands/memory/load-skill-memory.md +182 -0
  25. package/.claude/commands/memory/load.md +240 -0
  26. package/.claude/commands/memory/skill-memory.md +525 -0
  27. package/.claude/commands/memory/style-skill-memory.md +396 -0
  28. package/.claude/commands/memory/tech-research-rules.md +310 -0
  29. package/.claude/commands/memory/update-full.md +332 -0
  30. package/.claude/commands/memory/update-related.md +332 -0
  31. package/.claude/commands/memory/workflow-skill-memory.md +517 -0
  32. package/.claude/commands/task/breakdown.md +204 -0
  33. package/.claude/commands/task/create.md +152 -0
  34. package/.claude/commands/task/execute.md +270 -0
  35. package/.claude/commands/task/replan.md +437 -0
  36. package/.claude/commands/version.md +254 -0
  37. package/.claude/commands/workflow/action-plan-verify.md +447 -0
  38. package/.claude/commands/workflow/brainstorm/api-designer.md +587 -0
  39. package/.claude/commands/workflow/brainstorm/artifacts.md +453 -0
  40. package/.claude/commands/workflow/brainstorm/auto-parallel.md +443 -0
  41. package/.claude/commands/workflow/brainstorm/data-architect.md +220 -0
  42. package/.claude/commands/workflow/brainstorm/product-manager.md +200 -0
  43. package/.claude/commands/workflow/brainstorm/product-owner.md +200 -0
  44. package/.claude/commands/workflow/brainstorm/scrum-master.md +200 -0
  45. package/.claude/commands/workflow/brainstorm/subject-matter-expert.md +200 -0
  46. package/.claude/commands/workflow/brainstorm/synthesis.md +398 -0
  47. package/.claude/commands/workflow/brainstorm/system-architect.md +389 -0
  48. package/.claude/commands/workflow/brainstorm/ui-designer.md +221 -0
  49. package/.claude/commands/workflow/brainstorm/ux-expert.md +221 -0
  50. package/.claude/commands/workflow/debug.md +321 -0
  51. package/.claude/commands/workflow/execute.md +475 -0
  52. package/.claude/commands/workflow/init.md +165 -0
  53. package/.claude/commands/workflow/lite-execute.md +792 -0
  54. package/.claude/commands/workflow/lite-fix.md +623 -0
  55. package/.claude/commands/workflow/lite-plan.md +610 -0
  56. package/.claude/commands/workflow/plan.md +551 -0
  57. package/.claude/commands/workflow/replan.md +515 -0
  58. package/.claude/commands/workflow/review-fix.md +606 -0
  59. package/.claude/commands/workflow/review-module-cycle.md +767 -0
  60. package/.claude/commands/workflow/review-session-cycle.md +778 -0
  61. package/.claude/commands/workflow/review.md +297 -0
  62. package/.claude/commands/workflow/session/complete.md +153 -0
  63. package/.claude/commands/workflow/session/list.md +96 -0
  64. package/.claude/commands/workflow/session/resume.md +61 -0
  65. package/.claude/commands/workflow/session/start.md +200 -0
  66. package/.claude/commands/workflow/tdd-plan.md +460 -0
  67. package/.claude/commands/workflow/tdd-verify.md +400 -0
  68. package/.claude/commands/workflow/test-cycle-execute.md +500 -0
  69. package/.claude/commands/workflow/test-fix-gen.md +699 -0
  70. package/.claude/commands/workflow/test-gen.md +529 -0
  71. package/.claude/commands/workflow/tools/conflict-resolution.md +766 -0
  72. package/.claude/commands/workflow/tools/context-gather.md +436 -0
  73. package/.claude/commands/workflow/tools/task-generate-agent.md +490 -0
  74. package/.claude/commands/workflow/tools/task-generate-tdd.md +526 -0
  75. package/.claude/commands/workflow/tools/tdd-coverage-analysis.md +309 -0
  76. package/.claude/commands/workflow/tools/test-concept-enhanced.md +164 -0
  77. package/.claude/commands/workflow/tools/test-context-gather.md +236 -0
  78. package/.claude/commands/workflow/tools/test-task-generate.md +257 -0
  79. package/.claude/commands/workflow/ui-design/animation-extract.md +1150 -0
  80. package/.claude/commands/workflow/ui-design/codify-style.md +652 -0
  81. package/.claude/commands/workflow/ui-design/design-sync.md +454 -0
  82. package/.claude/commands/workflow/ui-design/explore-auto.md +678 -0
  83. package/.claude/commands/workflow/ui-design/generate.md +504 -0
  84. package/.claude/commands/workflow/ui-design/imitate-auto.md +745 -0
  85. package/.claude/commands/workflow/ui-design/import-from-code.md +540 -0
  86. package/.claude/commands/workflow/ui-design/layout-extract.md +788 -0
  87. package/.claude/commands/workflow/ui-design/reference-page-generator.md +356 -0
  88. package/.claude/commands/workflow/ui-design/style-extract.md +773 -0
  89. package/.claude/skills/command-guide/SKILL.md +388 -0
  90. package/.claude/skills/command-guide/UPDATE-GUIDELINE.md +592 -0
  91. package/.claude/skills/command-guide/guides/cli-tools-guide.md +410 -0
  92. package/.claude/skills/command-guide/guides/examples.md +537 -0
  93. package/.claude/skills/command-guide/guides/getting-started.md +242 -0
  94. package/.claude/skills/command-guide/guides/implementation-details.md +1010 -0
  95. package/.claude/skills/command-guide/guides/index-structure.md +326 -0
  96. package/.claude/skills/command-guide/guides/troubleshooting.md +92 -0
  97. package/.claude/skills/command-guide/guides/ui-design-workflow-guide.md +316 -0
  98. package/.claude/skills/command-guide/guides/workflow-patterns.md +662 -0
  99. package/.claude/skills/command-guide/index/all-commands.json +772 -0
  100. package/.claude/skills/command-guide/index/by-category.json +800 -0
  101. package/.claude/skills/command-guide/index/by-use-case.json +786 -0
  102. package/.claude/skills/command-guide/index/command-relationships.json +307 -0
  103. package/.claude/skills/command-guide/index/essential-commands.json +112 -0
  104. package/.claude/skills/command-guide/reference/agents/action-planning-agent.md +857 -0
  105. package/.claude/skills/command-guide/reference/agents/cli-execution-agent.md +267 -0
  106. package/.claude/skills/command-guide/reference/agents/cli-explore-agent.md +182 -0
  107. package/.claude/skills/command-guide/reference/agents/cli-lite-planning-agent.md +446 -0
  108. package/.claude/skills/command-guide/reference/agents/cli-planning-agent.md +558 -0
  109. package/.claude/skills/command-guide/reference/agents/code-developer.md +311 -0
  110. package/.claude/skills/command-guide/reference/agents/conceptual-planning-agent.md +308 -0
  111. package/.claude/skills/command-guide/reference/agents/context-search-agent.md +581 -0
  112. package/.claude/skills/command-guide/reference/agents/doc-generator.md +330 -0
  113. package/.claude/skills/command-guide/reference/agents/memory-bridge.md +94 -0
  114. package/.claude/skills/command-guide/reference/agents/test-context-search-agent.md +400 -0
  115. package/.claude/skills/command-guide/reference/agents/test-fix-agent.md +344 -0
  116. package/.claude/skills/command-guide/reference/agents/ui-design-agent.md +593 -0
  117. package/.claude/skills/command-guide/reference/agents/universal-executor.md +131 -0
  118. package/.claude/skills/command-guide/reference/commands/cli/cli-init.md +440 -0
  119. package/.claude/skills/command-guide/reference/commands/enhance-prompt.md +93 -0
  120. package/.claude/skills/command-guide/reference/commands/memory/code-map-memory.md +687 -0
  121. package/.claude/skills/command-guide/reference/commands/memory/docs-full-cli.md +471 -0
  122. package/.claude/skills/command-guide/reference/commands/memory/docs-related-cli.md +386 -0
  123. package/.claude/skills/command-guide/reference/commands/memory/docs.md +616 -0
  124. package/.claude/skills/command-guide/reference/commands/memory/load-skill-memory.md +182 -0
  125. package/.claude/skills/command-guide/reference/commands/memory/load.md +240 -0
  126. package/.claude/skills/command-guide/reference/commands/memory/skill-memory.md +525 -0
  127. package/.claude/skills/command-guide/reference/commands/memory/style-skill-memory.md +396 -0
  128. package/.claude/skills/command-guide/reference/commands/memory/tech-research.md +314 -0
  129. package/.claude/skills/command-guide/reference/commands/memory/update-full.md +332 -0
  130. package/.claude/skills/command-guide/reference/commands/memory/update-related.md +332 -0
  131. package/.claude/skills/command-guide/reference/commands/memory/workflow-skill-memory.md +517 -0
  132. package/.claude/skills/command-guide/reference/commands/task/breakdown.md +204 -0
  133. package/.claude/skills/command-guide/reference/commands/task/create.md +152 -0
  134. package/.claude/skills/command-guide/reference/commands/task/execute.md +270 -0
  135. package/.claude/skills/command-guide/reference/commands/task/replan.md +437 -0
  136. package/.claude/skills/command-guide/reference/commands/version.md +254 -0
  137. package/.claude/skills/command-guide/reference/commands/workflow/action-plan-verify.md +447 -0
  138. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/api-designer.md +585 -0
  139. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/artifacts.md +452 -0
  140. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/auto-parallel.md +443 -0
  141. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/data-architect.md +220 -0
  142. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-manager.md +200 -0
  143. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-owner.md +200 -0
  144. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/scrum-master.md +200 -0
  145. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/subject-matter-expert.md +200 -0
  146. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/synthesis.md +398 -0
  147. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/system-architect.md +387 -0
  148. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ui-designer.md +221 -0
  149. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ux-expert.md +221 -0
  150. package/.claude/skills/command-guide/reference/commands/workflow/execute.md +465 -0
  151. package/.claude/skills/command-guide/reference/commands/workflow/init.md +164 -0
  152. package/.claude/skills/command-guide/reference/commands/workflow/lite-execute.md +748 -0
  153. package/.claude/skills/command-guide/reference/commands/workflow/lite-fix.md +664 -0
  154. package/.claude/skills/command-guide/reference/commands/workflow/lite-plan.md +645 -0
  155. package/.claude/skills/command-guide/reference/commands/workflow/plan.md +551 -0
  156. package/.claude/skills/command-guide/reference/commands/workflow/replan.md +515 -0
  157. package/.claude/skills/command-guide/reference/commands/workflow/review-fix.md +606 -0
  158. package/.claude/skills/command-guide/reference/commands/workflow/review-module-cycle.md +765 -0
  159. package/.claude/skills/command-guide/reference/commands/workflow/review-session-cycle.md +776 -0
  160. package/.claude/skills/command-guide/reference/commands/workflow/review.md +298 -0
  161. package/.claude/skills/command-guide/reference/commands/workflow/session/complete.md +547 -0
  162. package/.claude/skills/command-guide/reference/commands/workflow/session/list.md +114 -0
  163. package/.claude/skills/command-guide/reference/commands/workflow/session/resume.md +77 -0
  164. package/.claude/skills/command-guide/reference/commands/workflow/session/start.md +257 -0
  165. package/.claude/skills/command-guide/reference/commands/workflow/tdd-plan.md +460 -0
  166. package/.claude/skills/command-guide/reference/commands/workflow/tdd-verify.md +400 -0
  167. package/.claude/skills/command-guide/reference/commands/workflow/test-cycle-execute.md +498 -0
  168. package/.claude/skills/command-guide/reference/commands/workflow/test-fix-gen.md +699 -0
  169. package/.claude/skills/command-guide/reference/commands/workflow/test-gen.md +529 -0
  170. package/.claude/skills/command-guide/reference/commands/workflow/tools/conflict-resolution.md +766 -0
  171. package/.claude/skills/command-guide/reference/commands/workflow/tools/context-gather.md +434 -0
  172. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-agent.md +487 -0
  173. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-tdd.md +525 -0
  174. package/.claude/skills/command-guide/reference/commands/workflow/tools/tdd-coverage-analysis.md +309 -0
  175. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-concept-enhanced.md +163 -0
  176. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-context-gather.md +235 -0
  177. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-task-generate.md +256 -0
  178. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/animation-extract.md +1150 -0
  179. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/codify-style.md +652 -0
  180. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/design-sync.md +454 -0
  181. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/explore-auto.md +678 -0
  182. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/generate.md +504 -0
  183. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/imitate-auto.md +745 -0
  184. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/import-from-code.md +537 -0
  185. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/layout-extract.md +788 -0
  186. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/reference-page-generator.md +356 -0
  187. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/style-extract.md +773 -0
  188. package/.claude/skills/command-guide/scripts/analyze_commands.py +502 -0
  189. package/.claude/skills/command-guide/scripts/update-index.sh +130 -0
  190. package/.claude/skills/command-guide/templates/issue-bug.md +104 -0
  191. package/.claude/skills/command-guide/templates/issue-diagnosis.md +275 -0
  192. package/.claude/skills/command-guide/templates/issue-feature.md +97 -0
  193. package/.claude/skills/command-guide/templates/issue-question.md +141 -0
  194. package/.claude/skills/prompt-enhancer/SKILL.md +124 -0
  195. package/.claude/workflows/_template-compare-matrix.html +692 -0
  196. package/.claude/workflows/chinese-response.md +38 -0
  197. package/.claude/workflows/cli-templates/fix-plan-template.json +75 -0
  198. package/.claude/workflows/cli-templates/fix-progress-template.json +48 -0
  199. package/.claude/workflows/cli-templates/memory/style-skill-memory/skill-md-template.md +299 -0
  200. package/.claude/workflows/cli-templates/planning-roles/data-architect.md +120 -0
  201. package/.claude/workflows/cli-templates/planning-roles/product-manager.md +119 -0
  202. package/.claude/workflows/cli-templates/planning-roles/product-owner.md +261 -0
  203. package/.claude/workflows/cli-templates/planning-roles/scrum-master.md +186 -0
  204. package/.claude/workflows/cli-templates/planning-roles/subject-matter-expert.md +281 -0
  205. package/.claude/workflows/cli-templates/planning-roles/synthesis-role.md +414 -0
  206. package/.claude/workflows/cli-templates/planning-roles/system-architect.md +106 -0
  207. package/.claude/workflows/cli-templates/planning-roles/test-strategist.md +124 -0
  208. package/.claude/workflows/cli-templates/planning-roles/ui-designer.md +379 -0
  209. package/.claude/workflows/cli-templates/planning-roles/ux-expert.md +240 -0
  210. package/.claude/workflows/cli-templates/prompts/analysis/01-diagnose-bug-root-cause.txt +127 -0
  211. package/.claude/workflows/cli-templates/prompts/analysis/01-trace-code-execution.txt +115 -0
  212. package/.claude/workflows/cli-templates/prompts/analysis/02-analyze-code-patterns.txt +37 -0
  213. package/.claude/workflows/cli-templates/prompts/analysis/02-analyze-technical-document.txt +33 -0
  214. package/.claude/workflows/cli-templates/prompts/analysis/02-review-architecture.txt +29 -0
  215. package/.claude/workflows/cli-templates/prompts/analysis/02-review-code-quality.txt +28 -0
  216. package/.claude/workflows/cli-templates/prompts/analysis/03-analyze-performance.txt +29 -0
  217. package/.claude/workflows/cli-templates/prompts/analysis/03-assess-security-risks.txt +29 -0
  218. package/.claude/workflows/cli-templates/prompts/analysis/03-review-quality-standards.txt +29 -0
  219. package/.claude/workflows/cli-templates/prompts/development/02-generate-tests.txt +70 -0
  220. package/.claude/workflows/cli-templates/prompts/development/02-implement-component-ui.txt +55 -0
  221. package/.claude/workflows/cli-templates/prompts/development/02-implement-feature.txt +58 -0
  222. package/.claude/workflows/cli-templates/prompts/development/02-refactor-codebase.txt +55 -0
  223. package/.claude/workflows/cli-templates/prompts/development/03-debug-runtime-issues.txt +55 -0
  224. package/.claude/workflows/cli-templates/prompts/documentation/api.txt +15 -0
  225. package/.claude/workflows/cli-templates/prompts/documentation/folder-navigation.txt +27 -0
  226. package/.claude/workflows/cli-templates/prompts/documentation/module-readme.txt +49 -0
  227. package/.claude/workflows/cli-templates/prompts/documentation/project-architecture.txt +41 -0
  228. package/.claude/workflows/cli-templates/prompts/documentation/project-examples.txt +35 -0
  229. package/.claude/workflows/cli-templates/prompts/documentation/project-readme.txt +35 -0
  230. package/.claude/workflows/cli-templates/prompts/memory/02-document-module-structure.txt +165 -0
  231. package/.claude/workflows/cli-templates/prompts/planning/01-plan-architecture-design.txt +109 -0
  232. package/.claude/workflows/cli-templates/prompts/planning/02-breakdown-task-steps.txt +30 -0
  233. package/.claude/workflows/cli-templates/prompts/planning/02-design-component-spec.txt +28 -0
  234. package/.claude/workflows/cli-templates/prompts/planning/03-evaluate-concept-feasibility.txt +127 -0
  235. package/.claude/workflows/cli-templates/prompts/planning/03-plan-migration-strategy.txt +30 -0
  236. package/.claude/workflows/cli-templates/prompts/rules/rule-api.txt +122 -0
  237. package/.claude/workflows/cli-templates/prompts/rules/rule-components.txt +122 -0
  238. package/.claude/workflows/cli-templates/prompts/rules/rule-config.txt +89 -0
  239. package/.claude/workflows/cli-templates/prompts/rules/rule-core.txt +60 -0
  240. package/.claude/workflows/cli-templates/prompts/rules/rule-patterns.txt +70 -0
  241. package/.claude/workflows/cli-templates/prompts/rules/rule-testing.txt +81 -0
  242. package/.claude/workflows/cli-templates/prompts/rules/tech-rules-agent-prompt.txt +89 -0
  243. package/.claude/workflows/cli-templates/prompts/tech/tech-module-format.txt +359 -0
  244. package/.claude/workflows/cli-templates/prompts/tech/tech-skill-index.txt +185 -0
  245. package/.claude/workflows/cli-templates/prompts/test/test-concept-analysis.txt +179 -0
  246. package/.claude/workflows/cli-templates/prompts/universal/00-universal-creative-style.txt +95 -0
  247. package/.claude/workflows/cli-templates/prompts/universal/00-universal-rigorous-style.txt +92 -0
  248. package/.claude/workflows/cli-templates/prompts/verification/codex-technical.txt +28 -0
  249. package/.claude/workflows/cli-templates/prompts/verification/cross-validation.txt +28 -0
  250. package/.claude/workflows/cli-templates/prompts/verification/gemini-strategic.txt +27 -0
  251. package/.claude/workflows/cli-templates/prompts/workflow/analysis-results-structure.txt +224 -0
  252. package/.claude/workflows/cli-templates/prompts/workflow/codex-feasibility-validation.txt +176 -0
  253. package/.claude/workflows/cli-templates/prompts/workflow/gemini-solution-design.txt +131 -0
  254. package/.claude/workflows/cli-templates/prompts/workflow/impl-plan-template.txt +286 -0
  255. package/.claude/workflows/cli-templates/prompts/workflow/skill-aggregation.txt +172 -0
  256. package/.claude/workflows/cli-templates/prompts/workflow/skill-conflict-patterns.txt +94 -0
  257. package/.claude/workflows/cli-templates/prompts/workflow/skill-index.txt +224 -0
  258. package/.claude/workflows/cli-templates/prompts/workflow/skill-lessons-learned.txt +94 -0
  259. package/.claude/workflows/cli-templates/prompts/workflow/skill-sessions-timeline.txt +53 -0
  260. package/.claude/workflows/cli-templates/prompts/workflow/task-json-agent-mode.txt +123 -0
  261. package/.claude/workflows/cli-templates/prompts/workflow/task-json-cli-mode.txt +182 -0
  262. package/.claude/workflows/cli-templates/protocols/analysis-protocol.md +112 -0
  263. package/.claude/workflows/cli-templates/protocols/write-protocol.md +201 -0
  264. package/.claude/workflows/cli-templates/schemas/conflict-resolution-schema.json +137 -0
  265. package/.claude/workflows/cli-templates/schemas/debug-log-json-schema.json +127 -0
  266. package/.claude/workflows/cli-templates/schemas/diagnosis-json-schema.json +234 -0
  267. package/.claude/workflows/cli-templates/schemas/explore-json-schema.json +124 -0
  268. package/.claude/workflows/cli-templates/schemas/fix-plan-json-schema.json +298 -0
  269. package/.claude/workflows/cli-templates/schemas/plan-json-schema.json +244 -0
  270. package/.claude/workflows/cli-templates/schemas/project-json-schema.json +221 -0
  271. package/.claude/workflows/cli-templates/schemas/review-deep-dive-results-schema.json +82 -0
  272. package/.claude/workflows/cli-templates/schemas/review-dimension-results-schema.json +51 -0
  273. package/.claude/workflows/cli-templates/tech-stacks/go-dev.md +91 -0
  274. package/.claude/workflows/cli-templates/tech-stacks/java-dev.md +107 -0
  275. package/.claude/workflows/cli-templates/tech-stacks/javascript-dev.md +58 -0
  276. package/.claude/workflows/cli-templates/tech-stacks/python-dev.md +79 -0
  277. package/.claude/workflows/cli-templates/tech-stacks/react-dev.md +103 -0
  278. package/.claude/workflows/cli-templates/tech-stacks/typescript-dev.md +83 -0
  279. package/.claude/workflows/cli-templates/ui-design/systems/animation-tokens.json +247 -0
  280. package/.claude/workflows/cli-templates/ui-design/systems/design-tokens.json +342 -0
  281. package/.claude/workflows/cli-templates/ui-design/systems/layout-templates.json +145 -0
  282. package/.claude/workflows/cli-tools-usage.md +526 -0
  283. package/.claude/workflows/coding-philosophy.md +70 -0
  284. package/.claude/workflows/context-tools.md +84 -0
  285. package/.claude/workflows/file-modification.md +64 -0
  286. package/.claude/workflows/review-directory-specification.md +336 -0
  287. package/.claude/workflows/task-core.md +214 -0
  288. package/.claude/workflows/tool-strategy.md +216 -0
  289. package/.claude/workflows/windows-platform.md +16 -0
  290. package/.claude/workflows/workflow-architecture.md +942 -0
  291. package/.codex/AGENTS.md +63 -0
  292. package/.codex/prompts/debug.md +318 -0
  293. package/.codex/prompts/execute.md +273 -0
  294. package/.codex/prompts/lite-execute.md +164 -0
  295. package/.codex/prompts/lite-plan.md +469 -0
  296. package/.codex/prompts.zip +0 -0
  297. package/.gemini/GEMINI.md +25 -0
  298. package/.qwen/QWEN.md +25 -0
  299. package/LICENSE +21 -0
  300. package/README.md +294 -145
  301. package/ccw/README.md +145 -0
  302. package/ccw/dist/core/lite-scanner-complete.d.ts.map +1 -0
  303. package/ccw/dist/core/lite-scanner-complete.js +371 -0
  304. package/ccw/dist/core/lite-scanner-complete.js.map +1 -0
  305. package/ccw/dist/core/lite-scanner.d.ts.map +1 -0
  306. package/ccw/dist/core/lite-scanner.js +371 -0
  307. package/ccw/dist/core/lite-scanner.js.map +1 -0
  308. package/ccw/dist/core/routes/claude-routes.d.ts.map +1 -0
  309. package/ccw/dist/core/routes/claude-routes.js +1015 -0
  310. package/ccw/dist/core/routes/claude-routes.js.map +1 -0
  311. package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -0
  312. package/ccw/dist/core/routes/cli-routes.js +469 -0
  313. package/ccw/dist/core/routes/cli-routes.js.map +1 -0
  314. package/ccw/dist/core/routes/rules-routes.d.ts.map +1 -0
  315. package/ccw/dist/core/routes/rules-routes.js +443 -0
  316. package/ccw/dist/core/routes/rules-routes.js.map +1 -0
  317. package/ccw/dist/core/routes/skills-routes.d.ts.map +1 -0
  318. package/ccw/dist/core/routes/skills-routes.js +651 -0
  319. package/ccw/dist/core/routes/skills-routes.js.map +1 -0
  320. package/ccw/dist/tools/cli-executor.d.ts +376 -0
  321. package/ccw/dist/tools/cli-executor.d.ts.map +1 -0
  322. package/ccw/dist/tools/cli-executor.js +1677 -0
  323. package/ccw/dist/tools/cli-executor.js.map +1 -0
  324. package/ccw/package.json +65 -0
  325. package/ccw/src/core/lite-scanner-complete.ts +473 -0
  326. package/ccw/src/core/lite-scanner.ts +473 -0
  327. package/ccw/src/core/routes/claude-routes.ts +1181 -0
  328. package/ccw/src/core/routes/cli-routes.ts +562 -0
  329. package/ccw/src/core/routes/rules-routes.ts +527 -0
  330. package/ccw/src/core/routes/skills-routes.ts +737 -0
  331. package/ccw/src/templates/dashboard-js/components/cli-status.js +1011 -0
  332. package/ccw/src/templates/dashboard-js/i18n.js +2969 -0
  333. package/ccw/src/templates/dashboard-js/views/claude-manager.js +926 -0
  334. package/ccw/src/templates/dashboard-js/views/cli-manager.js +2313 -0
  335. package/ccw/src/templates/dashboard-js/views/rules-manager.js +857 -0
  336. package/ccw/src/templates/dashboard-js/views/skills-manager.js +1183 -0
  337. package/ccw/src/tools/cli-executor.ts +2082 -0
  338. package/codex-lens/pyproject.toml +66 -0
  339. package/codex-lens/src/codexlens/.workflow/.cli-history/history.db +0 -0
  340. package/codex-lens/src/codexlens/__init__.py +28 -0
  341. package/codex-lens/src/codexlens/__main__.py +14 -0
  342. package/codex-lens/src/codexlens/__pycache__/__init__.cpython-313.pyc +0 -0
  343. package/codex-lens/src/codexlens/__pycache__/__main__.cpython-313.pyc +0 -0
  344. package/codex-lens/src/codexlens/__pycache__/config.cpython-313.pyc +0 -0
  345. package/codex-lens/src/codexlens/__pycache__/entities.cpython-313.pyc +0 -0
  346. package/codex-lens/src/codexlens/__pycache__/errors.cpython-313.pyc +0 -0
  347. package/codex-lens/src/codexlens/cli/__init__.py +27 -0
  348. package/codex-lens/src/codexlens/cli/__pycache__/__init__.cpython-313.pyc +0 -0
  349. package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-313.pyc +0 -0
  350. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-313.pyc +0 -0
  351. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-313.pyc +0 -0
  352. package/codex-lens/src/codexlens/cli/__pycache__/output.cpython-313.pyc +0 -0
  353. package/codex-lens/src/codexlens/cli/commands.py +1940 -0
  354. package/codex-lens/src/codexlens/cli/embedding_manager.py +635 -0
  355. package/codex-lens/src/codexlens/cli/model_manager.py +337 -0
  356. package/codex-lens/src/codexlens/cli/output.py +124 -0
  357. package/codex-lens/src/codexlens/config.py +201 -0
  358. package/codex-lens/src/codexlens/entities.py +121 -0
  359. package/codex-lens/src/codexlens/errors.py +55 -0
  360. package/codex-lens/src/codexlens/indexing/README.md +77 -0
  361. package/codex-lens/src/codexlens/indexing/__init__.py +4 -0
  362. package/codex-lens/src/codexlens/indexing/__pycache__/__init__.cpython-313.pyc +0 -0
  363. package/codex-lens/src/codexlens/indexing/__pycache__/symbol_extractor.cpython-313.pyc +0 -0
  364. package/codex-lens/src/codexlens/indexing/symbol_extractor.py +243 -0
  365. package/codex-lens/src/codexlens/parsers/__init__.py +8 -0
  366. package/codex-lens/src/codexlens/parsers/__pycache__/__init__.cpython-313.pyc +0 -0
  367. package/codex-lens/src/codexlens/parsers/__pycache__/encoding.cpython-313.pyc +0 -0
  368. package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-313.pyc +0 -0
  369. package/codex-lens/src/codexlens/parsers/__pycache__/tokenizer.cpython-313.pyc +0 -0
  370. package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-313.pyc +0 -0
  371. package/codex-lens/src/codexlens/parsers/encoding.py +202 -0
  372. package/codex-lens/src/codexlens/parsers/factory.py +256 -0
  373. package/codex-lens/src/codexlens/parsers/tokenizer.py +98 -0
  374. package/codex-lens/src/codexlens/parsers/treesitter_parser.py +335 -0
  375. package/codex-lens/src/codexlens/search/__init__.py +15 -0
  376. package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-313.pyc +0 -0
  377. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-313.pyc +0 -0
  378. package/codex-lens/src/codexlens/search/__pycache__/enrichment.cpython-313.pyc +0 -0
  379. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-313.pyc +0 -0
  380. package/codex-lens/src/codexlens/search/__pycache__/query_parser.cpython-313.pyc +0 -0
  381. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-313.pyc +0 -0
  382. package/codex-lens/src/codexlens/search/chain_search.py +660 -0
  383. package/codex-lens/src/codexlens/search/enrichment.py +150 -0
  384. package/codex-lens/src/codexlens/search/hybrid_search.py +326 -0
  385. package/codex-lens/src/codexlens/search/query_parser.py +242 -0
  386. package/codex-lens/src/codexlens/search/ranking.py +274 -0
  387. package/codex-lens/src/codexlens/semantic/__init__.py +76 -0
  388. package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-313.pyc +0 -0
  389. package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-313.pyc +0 -0
  390. package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-313.pyc +0 -0
  391. package/codex-lens/src/codexlens/semantic/__pycache__/code_extractor.cpython-313.pyc +0 -0
  392. package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-313.pyc +0 -0
  393. package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-313.pyc +0 -0
  394. package/codex-lens/src/codexlens/semantic/__pycache__/graph_analyzer.cpython-313.pyc +0 -0
  395. package/codex-lens/src/codexlens/semantic/__pycache__/llm_enhancer.cpython-313.pyc +0 -0
  396. package/codex-lens/src/codexlens/semantic/__pycache__/ollama_backend.cpython-313.pyc +0 -0
  397. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-313.pyc +0 -0
  398. package/codex-lens/src/codexlens/semantic/ann_index.py +414 -0
  399. package/codex-lens/src/codexlens/semantic/chunker.py +448 -0
  400. package/codex-lens/src/codexlens/semantic/code_extractor.py +274 -0
  401. package/codex-lens/src/codexlens/semantic/embedder.py +244 -0
  402. package/codex-lens/src/codexlens/semantic/gpu_support.py +192 -0
  403. package/codex-lens/src/codexlens/semantic/vector_store.py +1052 -0
  404. package/codex-lens/src/codexlens/storage/__init__.py +29 -0
  405. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-313.pyc +0 -0
  406. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-313.pyc +0 -0
  407. package/codex-lens/src/codexlens/storage/__pycache__/file_cache.cpython-313.pyc +0 -0
  408. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-313.pyc +0 -0
  409. package/codex-lens/src/codexlens/storage/__pycache__/migration_manager.cpython-313.pyc +0 -0
  410. package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-313.pyc +0 -0
  411. package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-313.pyc +0 -0
  412. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-313.pyc +0 -0
  413. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_utils.cpython-313.pyc +0 -0
  414. package/codex-lens/src/codexlens/storage/dir_index.py +1850 -0
  415. package/codex-lens/src/codexlens/storage/file_cache.py +32 -0
  416. package/codex-lens/src/codexlens/storage/index_tree.py +776 -0
  417. package/codex-lens/src/codexlens/storage/migration_manager.py +154 -0
  418. package/codex-lens/src/codexlens/storage/migrations/__init__.py +1 -0
  419. package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-313.pyc +0 -0
  420. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_001_normalize_keywords.cpython-313.pyc +0 -0
  421. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_002_add_token_metadata.cpython-313.pyc +0 -0
  422. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_003_code_relationships.cpython-313.pyc +0 -0
  423. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_004_dual_fts.cpython-313.pyc +0 -0
  424. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_005_cleanup_unused_fields.cpython-313.pyc +0 -0
  425. package/codex-lens/src/codexlens/storage/migrations/migration_001_normalize_keywords.py +123 -0
  426. package/codex-lens/src/codexlens/storage/migrations/migration_002_add_token_metadata.py +48 -0
  427. package/codex-lens/src/codexlens/storage/migrations/migration_004_dual_fts.py +232 -0
  428. package/codex-lens/src/codexlens/storage/migrations/migration_005_cleanup_unused_fields.py +196 -0
  429. package/codex-lens/src/codexlens/storage/path_mapper.py +274 -0
  430. package/codex-lens/src/codexlens/storage/registry.py +670 -0
  431. package/codex-lens/src/codexlens/storage/sqlite_store.py +576 -0
  432. package/codex-lens/src/codexlens/storage/sqlite_utils.py +64 -0
  433. package/package.json +36 -28
  434. package/dist/core/lite-scanner-complete.d.ts.map +0 -1
  435. package/dist/core/lite-scanner-complete.js +0 -368
  436. package/dist/core/lite-scanner-complete.js.map +0 -1
  437. package/dist/core/lite-scanner.d.ts.map +0 -1
  438. package/dist/core/lite-scanner.js +0 -368
  439. package/dist/core/lite-scanner.js.map +0 -1
  440. package/dist/core/routes/claude-routes.d.ts.map +0 -1
  441. package/dist/core/routes/claude-routes.js +0 -1017
  442. package/dist/core/routes/claude-routes.js.map +0 -1
  443. package/dist/core/routes/cli-routes.d.ts.map +0 -1
  444. package/dist/core/routes/cli-routes.js +0 -468
  445. package/dist/core/routes/cli-routes.js.map +0 -1
  446. package/dist/core/routes/rules-routes.d.ts.map +0 -1
  447. package/dist/core/routes/rules-routes.js +0 -442
  448. package/dist/core/routes/rules-routes.js.map +0 -1
  449. package/dist/core/routes/skills-routes.d.ts.map +0 -1
  450. package/dist/core/routes/skills-routes.js +0 -533
  451. package/dist/core/routes/skills-routes.js.map +0 -1
  452. package/dist/tools/cli-executor.d.ts +0 -373
  453. package/dist/tools/cli-executor.d.ts.map +0 -1
  454. package/dist/tools/cli-executor.js +0 -1625
  455. package/dist/tools/cli-executor.js.map +0 -1
  456. package/src/core/lite-scanner-complete.ts +0 -469
  457. package/src/core/lite-scanner.ts +0 -469
  458. package/src/core/routes/claude-routes.ts +0 -1183
  459. package/src/core/routes/cli-routes.ts +0 -561
  460. package/src/core/routes/rules-routes.ts +0 -526
  461. package/src/core/routes/skills-routes.ts +0 -599
  462. package/src/templates/dashboard-js/components/cli-status.js +0 -978
  463. package/src/templates/dashboard-js/i18n.js +0 -2963
  464. package/src/templates/dashboard-js/views/claude-manager.js +0 -912
  465. package/src/templates/dashboard-js/views/cli-manager.js +0 -2272
  466. package/src/templates/dashboard-js/views/rules-manager.js +0 -828
  467. package/src/templates/dashboard-js/views/skills-manager.js +0 -819
  468. package/src/tools/cli-executor.ts +0 -2014
  469. /package/{bin → ccw/bin}/ccw-mcp.js +0 -0
  470. /package/{bin → ccw/bin}/ccw.js +0 -0
  471. /package/{dist → ccw/dist}/cli.d.ts +0 -0
  472. /package/{dist → ccw/dist}/cli.d.ts.map +0 -0
  473. /package/{dist → ccw/dist}/cli.js +0 -0
  474. /package/{dist → ccw/dist}/cli.js.map +0 -0
  475. /package/{dist → ccw/dist}/commands/cli.d.ts +0 -0
  476. /package/{dist → ccw/dist}/commands/cli.d.ts.map +0 -0
  477. /package/{dist → ccw/dist}/commands/cli.js +0 -0
  478. /package/{dist → ccw/dist}/commands/cli.js.map +0 -0
  479. /package/{dist → ccw/dist}/commands/core-memory.d.ts +0 -0
  480. /package/{dist → ccw/dist}/commands/core-memory.d.ts.map +0 -0
  481. /package/{dist → ccw/dist}/commands/core-memory.js +0 -0
  482. /package/{dist → ccw/dist}/commands/core-memory.js.map +0 -0
  483. /package/{dist → ccw/dist}/commands/hook.d.ts +0 -0
  484. /package/{dist → ccw/dist}/commands/hook.d.ts.map +0 -0
  485. /package/{dist → ccw/dist}/commands/hook.js +0 -0
  486. /package/{dist → ccw/dist}/commands/hook.js.map +0 -0
  487. /package/{dist → ccw/dist}/commands/install.d.ts +0 -0
  488. /package/{dist → ccw/dist}/commands/install.d.ts.map +0 -0
  489. /package/{dist → ccw/dist}/commands/install.js +0 -0
  490. /package/{dist → ccw/dist}/commands/install.js.map +0 -0
  491. /package/{dist → ccw/dist}/commands/list.d.ts +0 -0
  492. /package/{dist → ccw/dist}/commands/list.d.ts.map +0 -0
  493. /package/{dist → ccw/dist}/commands/list.js +0 -0
  494. /package/{dist → ccw/dist}/commands/list.js.map +0 -0
  495. /package/{dist → ccw/dist}/commands/memory.d.ts +0 -0
  496. /package/{dist → ccw/dist}/commands/memory.d.ts.map +0 -0
  497. /package/{dist → ccw/dist}/commands/memory.js +0 -0
  498. /package/{dist → ccw/dist}/commands/memory.js.map +0 -0
  499. /package/{dist → ccw/dist}/commands/serve.d.ts +0 -0
  500. /package/{dist → ccw/dist}/commands/serve.d.ts.map +0 -0
  501. /package/{dist → ccw/dist}/commands/serve.js +0 -0
  502. /package/{dist → ccw/dist}/commands/serve.js.map +0 -0
  503. /package/{dist → ccw/dist}/commands/session-path-resolver.d.ts +0 -0
  504. /package/{dist → ccw/dist}/commands/session-path-resolver.d.ts.map +0 -0
  505. /package/{dist → ccw/dist}/commands/session-path-resolver.js +0 -0
  506. /package/{dist → ccw/dist}/commands/session-path-resolver.js.map +0 -0
  507. /package/{dist → ccw/dist}/commands/session.d.ts +0 -0
  508. /package/{dist → ccw/dist}/commands/session.d.ts.map +0 -0
  509. /package/{dist → ccw/dist}/commands/session.js +0 -0
  510. /package/{dist → ccw/dist}/commands/session.js.map +0 -0
  511. /package/{dist → ccw/dist}/commands/stop.d.ts +0 -0
  512. /package/{dist → ccw/dist}/commands/stop.d.ts.map +0 -0
  513. /package/{dist → ccw/dist}/commands/stop.js +0 -0
  514. /package/{dist → ccw/dist}/commands/stop.js.map +0 -0
  515. /package/{dist → ccw/dist}/commands/tool.d.ts +0 -0
  516. /package/{dist → ccw/dist}/commands/tool.d.ts.map +0 -0
  517. /package/{dist → ccw/dist}/commands/tool.js +0 -0
  518. /package/{dist → ccw/dist}/commands/tool.js.map +0 -0
  519. /package/{dist → ccw/dist}/commands/uninstall.d.ts +0 -0
  520. /package/{dist → ccw/dist}/commands/uninstall.d.ts.map +0 -0
  521. /package/{dist → ccw/dist}/commands/uninstall.js +0 -0
  522. /package/{dist → ccw/dist}/commands/uninstall.js.map +0 -0
  523. /package/{dist → ccw/dist}/commands/upgrade.d.ts +0 -0
  524. /package/{dist → ccw/dist}/commands/upgrade.d.ts.map +0 -0
  525. /package/{dist → ccw/dist}/commands/upgrade.js +0 -0
  526. /package/{dist → ccw/dist}/commands/upgrade.js.map +0 -0
  527. /package/{dist → ccw/dist}/commands/view.d.ts +0 -0
  528. /package/{dist → ccw/dist}/commands/view.d.ts.map +0 -0
  529. /package/{dist → ccw/dist}/commands/view.js +0 -0
  530. /package/{dist → ccw/dist}/commands/view.js.map +0 -0
  531. /package/{dist → ccw/dist}/config/storage-paths.d.ts +0 -0
  532. /package/{dist → ccw/dist}/config/storage-paths.d.ts.map +0 -0
  533. /package/{dist → ccw/dist}/config/storage-paths.js +0 -0
  534. /package/{dist → ccw/dist}/config/storage-paths.js.map +0 -0
  535. /package/{dist → ccw/dist}/core/cache-manager.d.ts +0 -0
  536. /package/{dist → ccw/dist}/core/cache-manager.d.ts.map +0 -0
  537. /package/{dist → ccw/dist}/core/cache-manager.js +0 -0
  538. /package/{dist → ccw/dist}/core/cache-manager.js.map +0 -0
  539. /package/{dist → ccw/dist}/core/claude-freshness.d.ts +0 -0
  540. /package/{dist → ccw/dist}/core/claude-freshness.d.ts.map +0 -0
  541. /package/{dist → ccw/dist}/core/claude-freshness.js +0 -0
  542. /package/{dist → ccw/dist}/core/claude-freshness.js.map +0 -0
  543. /package/{dist → ccw/dist}/core/core-memory-store.d.ts +0 -0
  544. /package/{dist → ccw/dist}/core/core-memory-store.d.ts.map +0 -0
  545. /package/{dist → ccw/dist}/core/core-memory-store.js +0 -0
  546. /package/{dist → ccw/dist}/core/core-memory-store.js.map +0 -0
  547. /package/{dist → ccw/dist}/core/dashboard-generator-patch.d.ts +0 -0
  548. /package/{dist → ccw/dist}/core/dashboard-generator-patch.d.ts.map +0 -0
  549. /package/{dist → ccw/dist}/core/dashboard-generator-patch.js +0 -0
  550. /package/{dist → ccw/dist}/core/dashboard-generator-patch.js.map +0 -0
  551. /package/{dist → ccw/dist}/core/dashboard-generator.d.ts +0 -0
  552. /package/{dist → ccw/dist}/core/dashboard-generator.d.ts.map +0 -0
  553. /package/{dist → ccw/dist}/core/dashboard-generator.js +0 -0
  554. /package/{dist → ccw/dist}/core/dashboard-generator.js.map +0 -0
  555. /package/{dist → ccw/dist}/core/data-aggregator.d.ts +0 -0
  556. /package/{dist → ccw/dist}/core/data-aggregator.d.ts.map +0 -0
  557. /package/{dist → ccw/dist}/core/data-aggregator.js +0 -0
  558. /package/{dist → ccw/dist}/core/data-aggregator.js.map +0 -0
  559. /package/{dist → ccw/dist}/core/history-importer.d.ts +0 -0
  560. /package/{dist → ccw/dist}/core/history-importer.d.ts.map +0 -0
  561. /package/{dist → ccw/dist}/core/history-importer.js +0 -0
  562. /package/{dist → ccw/dist}/core/history-importer.js.map +0 -0
  563. /package/{dist → ccw/dist}/core/lite-scanner-complete.d.ts +0 -0
  564. /package/{dist → ccw/dist}/core/lite-scanner.d.ts +0 -0
  565. /package/{dist → ccw/dist}/core/manifest.d.ts +0 -0
  566. /package/{dist → ccw/dist}/core/manifest.d.ts.map +0 -0
  567. /package/{dist → ccw/dist}/core/manifest.js +0 -0
  568. /package/{dist → ccw/dist}/core/manifest.js.map +0 -0
  569. /package/{dist → ccw/dist}/core/memory-embedder-bridge.d.ts +0 -0
  570. /package/{dist → ccw/dist}/core/memory-embedder-bridge.d.ts.map +0 -0
  571. /package/{dist → ccw/dist}/core/memory-embedder-bridge.js +0 -0
  572. /package/{dist → ccw/dist}/core/memory-embedder-bridge.js.map +0 -0
  573. /package/{dist → ccw/dist}/core/memory-store.d.ts +0 -0
  574. /package/{dist → ccw/dist}/core/memory-store.d.ts.map +0 -0
  575. /package/{dist → ccw/dist}/core/memory-store.js +0 -0
  576. /package/{dist → ccw/dist}/core/memory-store.js.map +0 -0
  577. /package/{dist → ccw/dist}/core/routes/ccw-routes.d.ts +0 -0
  578. /package/{dist → ccw/dist}/core/routes/ccw-routes.d.ts.map +0 -0
  579. /package/{dist → ccw/dist}/core/routes/ccw-routes.js +0 -0
  580. /package/{dist → ccw/dist}/core/routes/ccw-routes.js.map +0 -0
  581. /package/{dist → ccw/dist}/core/routes/claude-routes.d.ts +0 -0
  582. /package/{dist → ccw/dist}/core/routes/cli-routes.d.ts +0 -0
  583. /package/{dist → ccw/dist}/core/routes/codexlens-routes.d.ts +0 -0
  584. /package/{dist → ccw/dist}/core/routes/codexlens-routes.d.ts.map +0 -0
  585. /package/{dist → ccw/dist}/core/routes/codexlens-routes.js +0 -0
  586. /package/{dist → ccw/dist}/core/routes/codexlens-routes.js.map +0 -0
  587. /package/{dist → ccw/dist}/core/routes/core-memory-routes.d.ts +0 -0
  588. /package/{dist → ccw/dist}/core/routes/core-memory-routes.d.ts.map +0 -0
  589. /package/{dist → ccw/dist}/core/routes/core-memory-routes.js +0 -0
  590. /package/{dist → ccw/dist}/core/routes/core-memory-routes.js.map +0 -0
  591. /package/{dist → ccw/dist}/core/routes/files-routes.d.ts +0 -0
  592. /package/{dist → ccw/dist}/core/routes/files-routes.d.ts.map +0 -0
  593. /package/{dist → ccw/dist}/core/routes/files-routes.js +0 -0
  594. /package/{dist → ccw/dist}/core/routes/files-routes.js.map +0 -0
  595. /package/{dist → ccw/dist}/core/routes/graph-routes.d.ts +0 -0
  596. /package/{dist → ccw/dist}/core/routes/graph-routes.d.ts.map +0 -0
  597. /package/{dist → ccw/dist}/core/routes/graph-routes.js +0 -0
  598. /package/{dist → ccw/dist}/core/routes/graph-routes.js.map +0 -0
  599. /package/{dist → ccw/dist}/core/routes/help-routes.d.ts +0 -0
  600. /package/{dist → ccw/dist}/core/routes/help-routes.d.ts.map +0 -0
  601. /package/{dist → ccw/dist}/core/routes/help-routes.js +0 -0
  602. /package/{dist → ccw/dist}/core/routes/help-routes.js.map +0 -0
  603. /package/{dist → ccw/dist}/core/routes/hooks-routes.d.ts +0 -0
  604. /package/{dist → ccw/dist}/core/routes/hooks-routes.d.ts.map +0 -0
  605. /package/{dist → ccw/dist}/core/routes/hooks-routes.js +0 -0
  606. /package/{dist → ccw/dist}/core/routes/hooks-routes.js.map +0 -0
  607. /package/{dist → ccw/dist}/core/routes/mcp-routes.d.ts +0 -0
  608. /package/{dist → ccw/dist}/core/routes/mcp-routes.d.ts.map +0 -0
  609. /package/{dist → ccw/dist}/core/routes/mcp-routes.js +0 -0
  610. /package/{dist → ccw/dist}/core/routes/mcp-routes.js.map +0 -0
  611. /package/{dist → ccw/dist}/core/routes/mcp-templates-db.d.ts +0 -0
  612. /package/{dist → ccw/dist}/core/routes/mcp-templates-db.d.ts.map +0 -0
  613. /package/{dist → ccw/dist}/core/routes/mcp-templates-db.js +0 -0
  614. /package/{dist → ccw/dist}/core/routes/mcp-templates-db.js.map +0 -0
  615. /package/{dist → ccw/dist}/core/routes/memory-routes.d.ts +0 -0
  616. /package/{dist → ccw/dist}/core/routes/memory-routes.d.ts.map +0 -0
  617. /package/{dist → ccw/dist}/core/routes/memory-routes.js +0 -0
  618. /package/{dist → ccw/dist}/core/routes/memory-routes.js.map +0 -0
  619. /package/{dist → ccw/dist}/core/routes/rules-routes.d.ts +0 -0
  620. /package/{dist → ccw/dist}/core/routes/session-routes.d.ts +0 -0
  621. /package/{dist → ccw/dist}/core/routes/session-routes.d.ts.map +0 -0
  622. /package/{dist → ccw/dist}/core/routes/session-routes.js +0 -0
  623. /package/{dist → ccw/dist}/core/routes/session-routes.js.map +0 -0
  624. /package/{dist → ccw/dist}/core/routes/skills-routes.d.ts +0 -0
  625. /package/{dist → ccw/dist}/core/routes/status-routes.d.ts +0 -0
  626. /package/{dist → ccw/dist}/core/routes/status-routes.d.ts.map +0 -0
  627. /package/{dist → ccw/dist}/core/routes/status-routes.js +0 -0
  628. /package/{dist → ccw/dist}/core/routes/status-routes.js.map +0 -0
  629. /package/{dist → ccw/dist}/core/routes/system-routes.d.ts +0 -0
  630. /package/{dist → ccw/dist}/core/routes/system-routes.d.ts.map +0 -0
  631. /package/{dist → ccw/dist}/core/routes/system-routes.js +0 -0
  632. /package/{dist → ccw/dist}/core/routes/system-routes.js.map +0 -0
  633. /package/{dist → ccw/dist}/core/server.d.ts +0 -0
  634. /package/{dist → ccw/dist}/core/server.d.ts.map +0 -0
  635. /package/{dist → ccw/dist}/core/server.js +0 -0
  636. /package/{dist → ccw/dist}/core/server.js.map +0 -0
  637. /package/{dist → ccw/dist}/core/session-clustering-service.d.ts +0 -0
  638. /package/{dist → ccw/dist}/core/session-clustering-service.d.ts.map +0 -0
  639. /package/{dist → ccw/dist}/core/session-clustering-service.js +0 -0
  640. /package/{dist → ccw/dist}/core/session-clustering-service.js.map +0 -0
  641. /package/{dist → ccw/dist}/core/session-scanner.d.ts +0 -0
  642. /package/{dist → ccw/dist}/core/session-scanner.d.ts.map +0 -0
  643. /package/{dist → ccw/dist}/core/session-scanner.js +0 -0
  644. /package/{dist → ccw/dist}/core/session-scanner.js.map +0 -0
  645. /package/{dist → ccw/dist}/core/websocket.d.ts +0 -0
  646. /package/{dist → ccw/dist}/core/websocket.d.ts.map +0 -0
  647. /package/{dist → ccw/dist}/core/websocket.js +0 -0
  648. /package/{dist → ccw/dist}/core/websocket.js.map +0 -0
  649. /package/{dist → ccw/dist}/index.d.ts +0 -0
  650. /package/{dist → ccw/dist}/index.d.ts.map +0 -0
  651. /package/{dist → ccw/dist}/index.js +0 -0
  652. /package/{dist → ccw/dist}/index.js.map +0 -0
  653. /package/{dist → ccw/dist}/mcp-server/index.d.ts +0 -0
  654. /package/{dist → ccw/dist}/mcp-server/index.d.ts.map +0 -0
  655. /package/{dist → ccw/dist}/mcp-server/index.js +0 -0
  656. /package/{dist → ccw/dist}/mcp-server/index.js.map +0 -0
  657. /package/{dist → ccw/dist}/tools/classify-folders.d.ts +0 -0
  658. /package/{dist → ccw/dist}/tools/classify-folders.d.ts.map +0 -0
  659. /package/{dist → ccw/dist}/tools/classify-folders.js +0 -0
  660. /package/{dist → ccw/dist}/tools/classify-folders.js.map +0 -0
  661. /package/{dist → ccw/dist}/tools/cli-config-manager.d.ts +0 -0
  662. /package/{dist → ccw/dist}/tools/cli-config-manager.d.ts.map +0 -0
  663. /package/{dist → ccw/dist}/tools/cli-config-manager.js +0 -0
  664. /package/{dist → ccw/dist}/tools/cli-config-manager.js.map +0 -0
  665. /package/{dist → ccw/dist}/tools/cli-history-store.d.ts +0 -0
  666. /package/{dist → ccw/dist}/tools/cli-history-store.d.ts.map +0 -0
  667. /package/{dist → ccw/dist}/tools/cli-history-store.js +0 -0
  668. /package/{dist → ccw/dist}/tools/cli-history-store.js.map +0 -0
  669. /package/{dist → ccw/dist}/tools/codex-lens.d.ts +0 -0
  670. /package/{dist → ccw/dist}/tools/codex-lens.d.ts.map +0 -0
  671. /package/{dist → ccw/dist}/tools/codex-lens.js +0 -0
  672. /package/{dist → ccw/dist}/tools/codex-lens.js.map +0 -0
  673. /package/{dist → ccw/dist}/tools/convert-tokens-to-css.d.ts +0 -0
  674. /package/{dist → ccw/dist}/tools/convert-tokens-to-css.d.ts.map +0 -0
  675. /package/{dist → ccw/dist}/tools/convert-tokens-to-css.js +0 -0
  676. /package/{dist → ccw/dist}/tools/convert-tokens-to-css.js.map +0 -0
  677. /package/{dist → ccw/dist}/tools/core-memory.d.ts +0 -0
  678. /package/{dist → ccw/dist}/tools/core-memory.d.ts.map +0 -0
  679. /package/{dist → ccw/dist}/tools/core-memory.js +0 -0
  680. /package/{dist → ccw/dist}/tools/core-memory.js.map +0 -0
  681. /package/{dist → ccw/dist}/tools/detect-changed-modules.d.ts +0 -0
  682. /package/{dist → ccw/dist}/tools/detect-changed-modules.d.ts.map +0 -0
  683. /package/{dist → ccw/dist}/tools/detect-changed-modules.js +0 -0
  684. /package/{dist → ccw/dist}/tools/detect-changed-modules.js.map +0 -0
  685. /package/{dist → ccw/dist}/tools/discover-design-files.d.ts +0 -0
  686. /package/{dist → ccw/dist}/tools/discover-design-files.d.ts.map +0 -0
  687. /package/{dist → ccw/dist}/tools/discover-design-files.js +0 -0
  688. /package/{dist → ccw/dist}/tools/discover-design-files.js.map +0 -0
  689. /package/{dist → ccw/dist}/tools/edit-file.d.ts +0 -0
  690. /package/{dist → ccw/dist}/tools/edit-file.d.ts.map +0 -0
  691. /package/{dist → ccw/dist}/tools/edit-file.js +0 -0
  692. /package/{dist → ccw/dist}/tools/edit-file.js.map +0 -0
  693. /package/{dist → ccw/dist}/tools/generate-module-docs.d.ts +0 -0
  694. /package/{dist → ccw/dist}/tools/generate-module-docs.d.ts.map +0 -0
  695. /package/{dist → ccw/dist}/tools/generate-module-docs.js +0 -0
  696. /package/{dist → ccw/dist}/tools/generate-module-docs.js.map +0 -0
  697. /package/{dist → ccw/dist}/tools/get-modules-by-depth.d.ts +0 -0
  698. /package/{dist → ccw/dist}/tools/get-modules-by-depth.d.ts.map +0 -0
  699. /package/{dist → ccw/dist}/tools/get-modules-by-depth.js +0 -0
  700. /package/{dist → ccw/dist}/tools/get-modules-by-depth.js.map +0 -0
  701. /package/{dist → ccw/dist}/tools/index.d.ts +0 -0
  702. /package/{dist → ccw/dist}/tools/index.d.ts.map +0 -0
  703. /package/{dist → ccw/dist}/tools/index.js +0 -0
  704. /package/{dist → ccw/dist}/tools/index.js.map +0 -0
  705. /package/{dist → ccw/dist}/tools/native-session-discovery.d.ts +0 -0
  706. /package/{dist → ccw/dist}/tools/native-session-discovery.d.ts.map +0 -0
  707. /package/{dist → ccw/dist}/tools/native-session-discovery.js +0 -0
  708. /package/{dist → ccw/dist}/tools/native-session-discovery.js.map +0 -0
  709. /package/{dist → ccw/dist}/tools/notifier.d.ts +0 -0
  710. /package/{dist → ccw/dist}/tools/notifier.d.ts.map +0 -0
  711. /package/{dist → ccw/dist}/tools/notifier.js +0 -0
  712. /package/{dist → ccw/dist}/tools/notifier.js.map +0 -0
  713. /package/{dist → ccw/dist}/tools/read-file.d.ts +0 -0
  714. /package/{dist → ccw/dist}/tools/read-file.d.ts.map +0 -0
  715. /package/{dist → ccw/dist}/tools/read-file.js +0 -0
  716. /package/{dist → ccw/dist}/tools/read-file.js.map +0 -0
  717. /package/{dist → ccw/dist}/tools/resume-strategy.d.ts +0 -0
  718. /package/{dist → ccw/dist}/tools/resume-strategy.d.ts.map +0 -0
  719. /package/{dist → ccw/dist}/tools/resume-strategy.js +0 -0
  720. /package/{dist → ccw/dist}/tools/resume-strategy.js.map +0 -0
  721. /package/{dist → ccw/dist}/tools/session-content-parser.d.ts +0 -0
  722. /package/{dist → ccw/dist}/tools/session-content-parser.d.ts.map +0 -0
  723. /package/{dist → ccw/dist}/tools/session-content-parser.js +0 -0
  724. /package/{dist → ccw/dist}/tools/session-content-parser.js.map +0 -0
  725. /package/{dist → ccw/dist}/tools/session-manager.d.ts +0 -0
  726. /package/{dist → ccw/dist}/tools/session-manager.d.ts.map +0 -0
  727. /package/{dist → ccw/dist}/tools/session-manager.js +0 -0
  728. /package/{dist → ccw/dist}/tools/session-manager.js.map +0 -0
  729. /package/{dist → ccw/dist}/tools/smart-context.d.ts +0 -0
  730. /package/{dist → ccw/dist}/tools/smart-context.d.ts.map +0 -0
  731. /package/{dist → ccw/dist}/tools/smart-context.js +0 -0
  732. /package/{dist → ccw/dist}/tools/smart-context.js.map +0 -0
  733. /package/{dist → ccw/dist}/tools/smart-search.d.ts +0 -0
  734. /package/{dist → ccw/dist}/tools/smart-search.d.ts.map +0 -0
  735. /package/{dist → ccw/dist}/tools/smart-search.js +0 -0
  736. /package/{dist → ccw/dist}/tools/smart-search.js.map +0 -0
  737. /package/{dist → ccw/dist}/tools/storage-manager.d.ts +0 -0
  738. /package/{dist → ccw/dist}/tools/storage-manager.d.ts.map +0 -0
  739. /package/{dist → ccw/dist}/tools/storage-manager.js +0 -0
  740. /package/{dist → ccw/dist}/tools/storage-manager.js.map +0 -0
  741. /package/{dist → ccw/dist}/tools/ui-generate-preview.d.ts +0 -0
  742. /package/{dist → ccw/dist}/tools/ui-generate-preview.d.ts.map +0 -0
  743. /package/{dist → ccw/dist}/tools/ui-generate-preview.js +0 -0
  744. /package/{dist → ccw/dist}/tools/ui-generate-preview.js.map +0 -0
  745. /package/{dist → ccw/dist}/tools/ui-instantiate-prototypes.d.ts +0 -0
  746. /package/{dist → ccw/dist}/tools/ui-instantiate-prototypes.d.ts.map +0 -0
  747. /package/{dist → ccw/dist}/tools/ui-instantiate-prototypes.js +0 -0
  748. /package/{dist → ccw/dist}/tools/ui-instantiate-prototypes.js.map +0 -0
  749. /package/{dist → ccw/dist}/tools/update-module-claude.d.ts +0 -0
  750. /package/{dist → ccw/dist}/tools/update-module-claude.d.ts.map +0 -0
  751. /package/{dist → ccw/dist}/tools/update-module-claude.js +0 -0
  752. /package/{dist → ccw/dist}/tools/update-module-claude.js.map +0 -0
  753. /package/{dist → ccw/dist}/tools/write-file.d.ts +0 -0
  754. /package/{dist → ccw/dist}/tools/write-file.d.ts.map +0 -0
  755. /package/{dist → ccw/dist}/tools/write-file.js +0 -0
  756. /package/{dist → ccw/dist}/tools/write-file.js.map +0 -0
  757. /package/{dist → ccw/dist}/types/config.d.ts +0 -0
  758. /package/{dist → ccw/dist}/types/config.d.ts.map +0 -0
  759. /package/{dist → ccw/dist}/types/config.js +0 -0
  760. /package/{dist → ccw/dist}/types/config.js.map +0 -0
  761. /package/{dist → ccw/dist}/types/index.d.ts +0 -0
  762. /package/{dist → ccw/dist}/types/index.d.ts.map +0 -0
  763. /package/{dist → ccw/dist}/types/index.js +0 -0
  764. /package/{dist → ccw/dist}/types/index.js.map +0 -0
  765. /package/{dist → ccw/dist}/types/session.d.ts +0 -0
  766. /package/{dist → ccw/dist}/types/session.d.ts.map +0 -0
  767. /package/{dist → ccw/dist}/types/session.js +0 -0
  768. /package/{dist → ccw/dist}/types/session.js.map +0 -0
  769. /package/{dist → ccw/dist}/types/tool.d.ts +0 -0
  770. /package/{dist → ccw/dist}/types/tool.d.ts.map +0 -0
  771. /package/{dist → ccw/dist}/types/tool.js +0 -0
  772. /package/{dist → ccw/dist}/types/tool.js.map +0 -0
  773. /package/{dist → ccw/dist}/utils/browser-launcher.d.ts +0 -0
  774. /package/{dist → ccw/dist}/utils/browser-launcher.d.ts.map +0 -0
  775. /package/{dist → ccw/dist}/utils/browser-launcher.js +0 -0
  776. /package/{dist → ccw/dist}/utils/browser-launcher.js.map +0 -0
  777. /package/{dist → ccw/dist}/utils/file-utils.d.ts +0 -0
  778. /package/{dist → ccw/dist}/utils/file-utils.d.ts.map +0 -0
  779. /package/{dist → ccw/dist}/utils/file-utils.js +0 -0
  780. /package/{dist → ccw/dist}/utils/file-utils.js.map +0 -0
  781. /package/{dist → ccw/dist}/utils/path-resolver.d.ts +0 -0
  782. /package/{dist → ccw/dist}/utils/path-resolver.d.ts.map +0 -0
  783. /package/{dist → ccw/dist}/utils/path-resolver.js +0 -0
  784. /package/{dist → ccw/dist}/utils/path-resolver.js.map +0 -0
  785. /package/{dist → ccw/dist}/utils/path-validator.d.ts +0 -0
  786. /package/{dist → ccw/dist}/utils/path-validator.d.ts.map +0 -0
  787. /package/{dist → ccw/dist}/utils/path-validator.js +0 -0
  788. /package/{dist → ccw/dist}/utils/path-validator.js.map +0 -0
  789. /package/{dist → ccw/dist}/utils/ui.d.ts +0 -0
  790. /package/{dist → ccw/dist}/utils/ui.d.ts.map +0 -0
  791. /package/{dist → ccw/dist}/utils/ui.js +0 -0
  792. /package/{dist → ccw/dist}/utils/ui.js.map +0 -0
  793. /package/{src → ccw/src}/.workflow/.cli-history/history.db +0 -0
  794. /package/{src → ccw/src}/.workflow/.cli-history/history.db-shm +0 -0
  795. /package/{src → ccw/src}/.workflow/.cli-history/history.db-wal +0 -0
  796. /package/{src → ccw/src}/cli.ts +0 -0
  797. /package/{src → ccw/src}/commands/cli.ts +0 -0
  798. /package/{src → ccw/src}/commands/core-memory.ts +0 -0
  799. /package/{src → ccw/src}/commands/hook.ts +0 -0
  800. /package/{src → ccw/src}/commands/install.ts +0 -0
  801. /package/{src → ccw/src}/commands/list.ts +0 -0
  802. /package/{src → ccw/src}/commands/memory.ts +0 -0
  803. /package/{src → ccw/src}/commands/serve.ts +0 -0
  804. /package/{src → ccw/src}/commands/session-path-resolver.ts +0 -0
  805. /package/{src → ccw/src}/commands/session.ts +0 -0
  806. /package/{src → ccw/src}/commands/stop.ts +0 -0
  807. /package/{src → ccw/src}/commands/tool.ts +0 -0
  808. /package/{src → ccw/src}/commands/uninstall.ts +0 -0
  809. /package/{src → ccw/src}/commands/upgrade.ts +0 -0
  810. /package/{src → ccw/src}/commands/view.ts +0 -0
  811. /package/{src → ccw/src}/config/storage-paths.ts +0 -0
  812. /package/{src → ccw/src}/core/cache-manager.ts +0 -0
  813. /package/{src → ccw/src}/core/claude-freshness.ts +0 -0
  814. /package/{src → ccw/src}/core/core-memory-store.ts +0 -0
  815. /package/{src → ccw/src}/core/dashboard-generator-patch.ts +0 -0
  816. /package/{src → ccw/src}/core/dashboard-generator.ts +0 -0
  817. /package/{src → ccw/src}/core/data-aggregator.ts +0 -0
  818. /package/{src → ccw/src}/core/history-importer.ts +0 -0
  819. /package/{src → ccw/src}/core/manifest.ts +0 -0
  820. /package/{src → ccw/src}/core/memory-embedder-bridge.ts +0 -0
  821. /package/{src → ccw/src}/core/memory-store.ts +0 -0
  822. /package/{src → ccw/src}/core/routes/ccw-routes.ts +0 -0
  823. /package/{src → ccw/src}/core/routes/codexlens-routes.ts +0 -0
  824. /package/{src → ccw/src}/core/routes/core-memory-routes.ts +0 -0
  825. /package/{src → ccw/src}/core/routes/files-routes.ts +0 -0
  826. /package/{src → ccw/src}/core/routes/graph-routes.md +0 -0
  827. /package/{src → ccw/src}/core/routes/graph-routes.ts +0 -0
  828. /package/{src → ccw/src}/core/routes/help-routes.ts +0 -0
  829. /package/{src → ccw/src}/core/routes/hooks-routes.ts +0 -0
  830. /package/{src → ccw/src}/core/routes/mcp-routes.ts +0 -0
  831. /package/{src → ccw/src}/core/routes/mcp-routes.ts.backup +0 -0
  832. /package/{src → ccw/src}/core/routes/mcp-templates-db.ts +0 -0
  833. /package/{src → ccw/src}/core/routes/memory-routes.ts +0 -0
  834. /package/{src → ccw/src}/core/routes/session-routes.ts +0 -0
  835. /package/{src → ccw/src}/core/routes/status-routes.ts +0 -0
  836. /package/{src → ccw/src}/core/routes/system-routes.ts +0 -0
  837. /package/{src → ccw/src}/core/server.ts +0 -0
  838. /package/{src → ccw/src}/core/session-clustering-service.ts +0 -0
  839. /package/{src → ccw/src}/core/session-scanner.ts +0 -0
  840. /package/{src → ccw/src}/core/websocket.ts +0 -0
  841. /package/{src → ccw/src}/index.ts +0 -0
  842. /package/{src → ccw/src}/mcp-server/index.ts +0 -0
  843. /package/{src → ccw/src}/templates/assets/css/github-dark.min.css +0 -0
  844. /package/{src → ccw/src}/templates/assets/css/github.min.css +0 -0
  845. /package/{src → ccw/src}/templates/assets/js/cytoscape.min.js +0 -0
  846. /package/{src → ccw/src}/templates/assets/js/d3.min.js +0 -0
  847. /package/{src → ccw/src}/templates/assets/js/highlight.min.js +0 -0
  848. /package/{src → ccw/src}/templates/assets/js/lucide.min.js +0 -0
  849. /package/{src → ccw/src}/templates/assets/js/marked.min.js +0 -0
  850. /package/{src → ccw/src}/templates/assets/js/tailwind.js +0 -0
  851. /package/{src → ccw/src}/templates/dashboard-css/01-base.css +0 -0
  852. /package/{src → ccw/src}/templates/dashboard-css/02-session.css +0 -0
  853. /package/{src → ccw/src}/templates/dashboard-css/03-tasks.css +0 -0
  854. /package/{src → ccw/src}/templates/dashboard-css/04-lite-tasks.css +0 -0
  855. /package/{src → ccw/src}/templates/dashboard-css/05-context.css +0 -0
  856. /package/{src → ccw/src}/templates/dashboard-css/06-cards.css +0 -0
  857. /package/{src → ccw/src}/templates/dashboard-css/07-managers.css +0 -0
  858. /package/{src → ccw/src}/templates/dashboard-css/08-review.css +0 -0
  859. /package/{src → ccw/src}/templates/dashboard-css/09-explorer.css +0 -0
  860. /package/{src → ccw/src}/templates/dashboard-css/10-cli-status.css +0 -0
  861. /package/{src → ccw/src}/templates/dashboard-css/11-cli-history.css +0 -0
  862. /package/{src → ccw/src}/templates/dashboard-css/12-cli-legacy.css +0 -0
  863. /package/{src → ccw/src}/templates/dashboard-css/13-cli-ccw.css +0 -0
  864. /package/{src → ccw/src}/templates/dashboard-css/14-cli-modals.css +0 -0
  865. /package/{src → ccw/src}/templates/dashboard-css/15-cli-endpoints.css +0 -0
  866. /package/{src → ccw/src}/templates/dashboard-css/16-cli-session.css +0 -0
  867. /package/{src → ccw/src}/templates/dashboard-css/17-cli-conversation.css +0 -0
  868. /package/{src → ccw/src}/templates/dashboard-css/18-cli-settings.css +0 -0
  869. /package/{src → ccw/src}/templates/dashboard-css/19-cli-native-session.css +0 -0
  870. /package/{src → ccw/src}/templates/dashboard-css/20-cli-taskqueue.css +0 -0
  871. /package/{src → ccw/src}/templates/dashboard-css/21-cli-toolmgmt.css +0 -0
  872. /package/{src → ccw/src}/templates/dashboard-css/22-cli-semantic.css +0 -0
  873. /package/{src → ccw/src}/templates/dashboard-css/23-memory.css +0 -0
  874. /package/{src → ccw/src}/templates/dashboard-css/24-prompt-history.css +0 -0
  875. /package/{src → ccw/src}/templates/dashboard-css/25-skills-rules.css +0 -0
  876. /package/{src → ccw/src}/templates/dashboard-css/26-claude-manager.css +0 -0
  877. /package/{src → ccw/src}/templates/dashboard-css/27-graph-explorer.css +0 -0
  878. /package/{src → ccw/src}/templates/dashboard-css/28-mcp-manager.css +0 -0
  879. /package/{src → ccw/src}/templates/dashboard-css/29-help.css +0 -0
  880. /package/{src → ccw/src}/templates/dashboard-css/30-core-memory.css +0 -0
  881. /package/{src → ccw/src}/templates/dashboard-js/api.js +0 -0
  882. /package/{src → ccw/src}/templates/dashboard-js/components/_conflict_tab.js +0 -0
  883. /package/{src → ccw/src}/templates/dashboard-js/components/_exp_helpers.js +0 -0
  884. /package/{src → ccw/src}/templates/dashboard-js/components/_review_tab.js +0 -0
  885. /package/{src → ccw/src}/templates/dashboard-js/components/carousel.js +0 -0
  886. /package/{src → ccw/src}/templates/dashboard-js/components/cli-history.js +0 -0
  887. /package/{src → ccw/src}/templates/dashboard-js/components/flowchart.js +0 -0
  888. /package/{src → ccw/src}/templates/dashboard-js/components/global-notifications.js +0 -0
  889. /package/{src → ccw/src}/templates/dashboard-js/components/hook-manager.js +0 -0
  890. /package/{src → ccw/src}/templates/dashboard-js/components/index-manager.js +0 -0
  891. /package/{src → ccw/src}/templates/dashboard-js/components/mcp-manager.js +0 -0
  892. /package/{src → ccw/src}/templates/dashboard-js/components/modals.js +0 -0
  893. /package/{src → ccw/src}/templates/dashboard-js/components/navigation.js +0 -0
  894. /package/{src → ccw/src}/templates/dashboard-js/components/notifications.js +0 -0
  895. /package/{src → ccw/src}/templates/dashboard-js/components/sidebar.js +0 -0
  896. /package/{src → ccw/src}/templates/dashboard-js/components/storage-manager.js +0 -0
  897. /package/{src → ccw/src}/templates/dashboard-js/components/tabs-context.js +0 -0
  898. /package/{src → ccw/src}/templates/dashboard-js/components/tabs-other.js +0 -0
  899. /package/{src → ccw/src}/templates/dashboard-js/components/task-drawer-core.js +0 -0
  900. /package/{src → ccw/src}/templates/dashboard-js/components/task-drawer-renderers.js +0 -0
  901. /package/{src → ccw/src}/templates/dashboard-js/components/task-queue-sidebar.js +0 -0
  902. /package/{src → ccw/src}/templates/dashboard-js/components/theme.js +0 -0
  903. /package/{src → ccw/src}/templates/dashboard-js/components/version-check.js +0 -0
  904. /package/{src → ccw/src}/templates/dashboard-js/help-i18n.js +0 -0
  905. /package/{src → ccw/src}/templates/dashboard-js/main.js +0 -0
  906. /package/{src → ccw/src}/templates/dashboard-js/state.js +0 -0
  907. /package/{src → ccw/src}/templates/dashboard-js/utils.js +0 -0
  908. /package/{src → ccw/src}/templates/dashboard-js/views/codexlens-manager.js +0 -0
  909. /package/{src → ccw/src}/templates/dashboard-js/views/core-memory-clusters.js +0 -0
  910. /package/{src → ccw/src}/templates/dashboard-js/views/core-memory.js +0 -0
  911. /package/{src → ccw/src}/templates/dashboard-js/views/explorer.js +0 -0
  912. /package/{src → ccw/src}/templates/dashboard-js/views/fix-session.js +0 -0
  913. /package/{src → ccw/src}/templates/dashboard-js/views/graph-explorer.js +0 -0
  914. /package/{src → ccw/src}/templates/dashboard-js/views/help.js +0 -0
  915. /package/{src → ccw/src}/templates/dashboard-js/views/history.js +0 -0
  916. /package/{src → ccw/src}/templates/dashboard-js/views/home.js +0 -0
  917. /package/{src → ccw/src}/templates/dashboard-js/views/hook-manager.js +0 -0
  918. /package/{src → ccw/src}/templates/dashboard-js/views/lite-tasks.js +0 -0
  919. /package/{src → ccw/src}/templates/dashboard-js/views/mcp-manager.js +0 -0
  920. /package/{src → ccw/src}/templates/dashboard-js/views/mcp-manager.js.backup +0 -0
  921. /package/{src → ccw/src}/templates/dashboard-js/views/mcp-manager.js.new +0 -0
  922. /package/{src → ccw/src}/templates/dashboard-js/views/memory.js +0 -0
  923. /package/{src → ccw/src}/templates/dashboard-js/views/project-overview.js +0 -0
  924. /package/{src → ccw/src}/templates/dashboard-js/views/prompt-history.js +0 -0
  925. /package/{src → ccw/src}/templates/dashboard-js/views/review-session.js +0 -0
  926. /package/{src → ccw/src}/templates/dashboard-js/views/session-detail.js +0 -0
  927. /package/{src → ccw/src}/templates/dashboard.html +0 -0
  928. /package/{src → ccw/src}/templates/hooks-config-example.json +0 -0
  929. /package/{src → ccw/src}/templates/review-cycle-dashboard.html +0 -0
  930. /package/{src → ccw/src}/templates/workflow-dashboard.html +0 -0
  931. /package/{src → ccw/src}/tools/classify-folders.ts +0 -0
  932. /package/{src → ccw/src}/tools/cli-config-manager.ts +0 -0
  933. /package/{src → ccw/src}/tools/cli-history-store.ts +0 -0
  934. /package/{src → ccw/src}/tools/codex-lens.ts +0 -0
  935. /package/{src → ccw/src}/tools/convert-tokens-to-css.ts +0 -0
  936. /package/{src → ccw/src}/tools/core-memory.ts +0 -0
  937. /package/{src → ccw/src}/tools/detect-changed-modules.ts +0 -0
  938. /package/{src → ccw/src}/tools/discover-design-files.ts +0 -0
  939. /package/{src → ccw/src}/tools/edit-file.ts +0 -0
  940. /package/{src → ccw/src}/tools/generate-module-docs.ts +0 -0
  941. /package/{src → ccw/src}/tools/get-modules-by-depth.ts +0 -0
  942. /package/{src → ccw/src}/tools/index.ts +0 -0
  943. /package/{src → ccw/src}/tools/native-session-discovery.ts +0 -0
  944. /package/{src → ccw/src}/tools/notifier.ts +0 -0
  945. /package/{src → ccw/src}/tools/read-file.ts +0 -0
  946. /package/{src → ccw/src}/tools/resume-strategy.ts +0 -0
  947. /package/{src → ccw/src}/tools/session-content-parser.ts +0 -0
  948. /package/{src → ccw/src}/tools/session-manager.ts +0 -0
  949. /package/{src → ccw/src}/tools/smart-context.ts +0 -0
  950. /package/{src → ccw/src}/tools/smart-search.ts +0 -0
  951. /package/{src → ccw/src}/tools/smart-search.ts.backup +0 -0
  952. /package/{src → ccw/src}/tools/storage-manager.ts +0 -0
  953. /package/{src → ccw/src}/tools/ui-generate-preview.js +0 -0
  954. /package/{src → ccw/src}/tools/ui-instantiate-prototypes.js +0 -0
  955. /package/{src → ccw/src}/tools/update-module-claude.js +0 -0
  956. /package/{src → ccw/src}/tools/write-file.ts +0 -0
  957. /package/{src → ccw/src}/types/config.ts +0 -0
  958. /package/{src → ccw/src}/types/index.ts +0 -0
  959. /package/{src → ccw/src}/types/session.ts +0 -0
  960. /package/{src → ccw/src}/types/tool.ts +0 -0
  961. /package/{src → ccw/src}/utils/browser-launcher.ts +0 -0
  962. /package/{src → ccw/src}/utils/file-utils.ts +0 -0
  963. /package/{src → ccw/src}/utils/path-resolver.ts +0 -0
  964. /package/{src → ccw/src}/utils/path-validator.ts +0 -0
  965. /package/{src → ccw/src}/utils/ui.ts +0 -0
@@ -0,0 +1,1052 @@
1
+ """Vector storage and similarity search for semantic chunks.
2
+
3
+ Optimized for high-performance similarity search using:
4
+ - HNSW index for O(log N) approximate nearest neighbor search (primary)
5
+ - Cached embedding matrix for batch operations (fallback)
6
+ - NumPy vectorized cosine similarity (fallback, 100x+ faster than loops)
7
+ - Lazy content loading (only fetch for top-k results)
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import json
13
+ import logging
14
+ import sqlite3
15
+ import threading
16
+ from pathlib import Path
17
+ from typing import Any, Dict, List, Optional, Tuple
18
+
19
+ from codexlens.entities import SearchResult, SemanticChunk
20
+ from codexlens.errors import StorageError
21
+
22
+ from . import SEMANTIC_AVAILABLE
23
+
24
+ if SEMANTIC_AVAILABLE:
25
+ import numpy as np
26
+
27
+ # Try to import ANN index (optional hnswlib dependency)
28
+ try:
29
+ from codexlens.semantic.ann_index import ANNIndex, HNSWLIB_AVAILABLE
30
+ except ImportError:
31
+ HNSWLIB_AVAILABLE = False
32
+ ANNIndex = None
33
+
34
+
35
+ logger = logging.getLogger(__name__)
36
+
37
+
38
+ def _cosine_similarity(a: List[float], b: List[float]) -> float:
39
+ """Compute cosine similarity between two vectors."""
40
+ if not SEMANTIC_AVAILABLE:
41
+ raise ImportError("numpy required for vector operations")
42
+
43
+ a_arr = np.array(a)
44
+ b_arr = np.array(b)
45
+
46
+ norm_a = np.linalg.norm(a_arr)
47
+ norm_b = np.linalg.norm(b_arr)
48
+
49
+ if norm_a == 0 or norm_b == 0:
50
+ return 0.0
51
+
52
+ return float(np.dot(a_arr, b_arr) / (norm_a * norm_b))
53
+
54
+
55
+ class VectorStore:
56
+ """SQLite-based vector storage with HNSW-accelerated similarity search.
57
+
58
+ Performance optimizations:
59
+ - HNSW index for O(log N) approximate nearest neighbor search
60
+ - Embedding matrix cached in memory for batch similarity computation (fallback)
61
+ - NumPy vectorized operations instead of Python loops (fallback)
62
+ - Lazy content loading - only fetch full content for top-k results
63
+ - Thread-safe cache invalidation
64
+ - Bulk insert mode for efficient batch operations
65
+ """
66
+
67
+ # Default embedding dimension (used when creating new index)
68
+ DEFAULT_DIM = 768
69
+
70
+ def __init__(self, db_path: str | Path) -> None:
71
+ if not SEMANTIC_AVAILABLE:
72
+ raise ImportError(
73
+ "Semantic search dependencies not available. "
74
+ "Install with: pip install codexlens[semantic]"
75
+ )
76
+
77
+ self.db_path = Path(db_path)
78
+ self.db_path.parent.mkdir(parents=True, exist_ok=True)
79
+
80
+ # Embedding cache for fast similarity search (fallback)
81
+ self._cache_lock = threading.RLock()
82
+ self._embedding_matrix: Optional[np.ndarray] = None
83
+ self._embedding_norms: Optional[np.ndarray] = None
84
+ self._chunk_ids: Optional[List[int]] = None
85
+ self._cache_version: int = 0
86
+
87
+ # ANN index for O(log N) search
88
+ self._ann_index: Optional[ANNIndex] = None
89
+ self._ann_dim: Optional[int] = None
90
+ self._ann_write_lock = threading.Lock() # Protects ANN index modifications
91
+
92
+ # Bulk insert mode tracking
93
+ self._bulk_insert_mode: bool = False
94
+ self._bulk_insert_ids: List[int] = []
95
+ self._bulk_insert_embeddings: List[np.ndarray] = []
96
+
97
+ self._init_schema()
98
+ self._init_ann_index()
99
+
100
+ def _init_schema(self) -> None:
101
+ """Initialize vector storage schema."""
102
+ with sqlite3.connect(self.db_path) as conn:
103
+ # Enable memory mapping for faster reads
104
+ conn.execute("PRAGMA mmap_size = 30000000000") # 30GB limit
105
+ conn.execute("""
106
+ CREATE TABLE IF NOT EXISTS semantic_chunks (
107
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
108
+ file_path TEXT NOT NULL,
109
+ content TEXT NOT NULL,
110
+ embedding BLOB NOT NULL,
111
+ metadata TEXT,
112
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
113
+ )
114
+ """)
115
+ conn.execute("""
116
+ CREATE INDEX IF NOT EXISTS idx_chunks_file
117
+ ON semantic_chunks(file_path)
118
+ """)
119
+ # Model configuration table - tracks which model generated the embeddings
120
+ conn.execute("""
121
+ CREATE TABLE IF NOT EXISTS embeddings_config (
122
+ id INTEGER PRIMARY KEY CHECK (id = 1),
123
+ model_profile TEXT NOT NULL,
124
+ model_name TEXT NOT NULL,
125
+ embedding_dim INTEGER NOT NULL,
126
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
127
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
128
+ )
129
+ """)
130
+ conn.commit()
131
+
132
+ def _init_ann_index(self) -> None:
133
+ """Initialize ANN index (lazy loading from existing data)."""
134
+ if not HNSWLIB_AVAILABLE:
135
+ logger.debug("hnswlib not available, using brute-force search")
136
+ return
137
+
138
+ # Try to detect embedding dimension from existing data
139
+ dim = self._detect_embedding_dim()
140
+ if dim is None:
141
+ # No data yet, will initialize on first add
142
+ logger.debug("No embeddings found, ANN index will be created on first add")
143
+ return
144
+
145
+ self._ann_dim = dim
146
+
147
+ try:
148
+ self._ann_index = ANNIndex(self.db_path, dim)
149
+ if self._ann_index.load():
150
+ logger.debug(
151
+ "Loaded ANN index with %d vectors", self._ann_index.count()
152
+ )
153
+ else:
154
+ # Index file doesn't exist, try to build from SQLite data
155
+ logger.debug("ANN index file not found, rebuilding from SQLite")
156
+ self._rebuild_ann_index_internal()
157
+ except Exception as e:
158
+ logger.warning("Failed to initialize ANN index: %s", e)
159
+ self._ann_index = None
160
+
161
+ def _detect_embedding_dim(self) -> Optional[int]:
162
+ """Detect embedding dimension from existing data."""
163
+ with sqlite3.connect(self.db_path) as conn:
164
+ row = conn.execute(
165
+ "SELECT embedding FROM semantic_chunks LIMIT 1"
166
+ ).fetchone()
167
+ if row and row[0]:
168
+ # Embedding is stored as float32 blob
169
+ blob = row[0]
170
+ return len(blob) // np.dtype(np.float32).itemsize
171
+ return None
172
+
173
+ @property
174
+ def dimension(self) -> Optional[int]:
175
+ """Return the dimension of embeddings in the store.
176
+
177
+ Returns:
178
+ Embedding dimension if available, None if store is empty.
179
+ """
180
+ if self._ann_dim is not None:
181
+ return self._ann_dim
182
+ self._ann_dim = self._detect_embedding_dim()
183
+ return self._ann_dim
184
+
185
+ def _rebuild_ann_index_internal(self) -> int:
186
+ """Internal method to rebuild ANN index from SQLite data."""
187
+ if self._ann_index is None:
188
+ return 0
189
+
190
+ with sqlite3.connect(self.db_path) as conn:
191
+ conn.execute("PRAGMA mmap_size = 30000000000")
192
+ rows = conn.execute(
193
+ "SELECT id, embedding FROM semantic_chunks"
194
+ ).fetchall()
195
+
196
+ if not rows:
197
+ return 0
198
+
199
+ # Extract IDs and embeddings
200
+ ids = [r[0] for r in rows]
201
+ embeddings = np.vstack([
202
+ np.frombuffer(r[1], dtype=np.float32) for r in rows
203
+ ])
204
+
205
+ # Add to ANN index
206
+ self._ann_index.add_vectors(ids, embeddings)
207
+ self._ann_index.save()
208
+
209
+ logger.info("Rebuilt ANN index with %d vectors", len(ids))
210
+ return len(ids)
211
+
212
+ def rebuild_ann_index(self) -> int:
213
+ """Rebuild HNSW index from all chunks in SQLite.
214
+
215
+ Use this method to:
216
+ - Migrate existing data to use ANN search
217
+ - Repair corrupted index
218
+ - Reclaim space after many deletions
219
+
220
+ Returns:
221
+ Number of vectors indexed.
222
+ """
223
+ if not HNSWLIB_AVAILABLE:
224
+ logger.warning("hnswlib not available, cannot rebuild ANN index")
225
+ return 0
226
+
227
+ # Detect dimension
228
+ dim = self._detect_embedding_dim()
229
+ if dim is None:
230
+ logger.warning("No embeddings found, cannot rebuild ANN index")
231
+ return 0
232
+
233
+ self._ann_dim = dim
234
+
235
+ # Create new index
236
+ try:
237
+ self._ann_index = ANNIndex(self.db_path, dim)
238
+ return self._rebuild_ann_index_internal()
239
+ except Exception as e:
240
+ logger.error("Failed to rebuild ANN index: %s", e)
241
+ self._ann_index = None
242
+ return 0
243
+
244
+ def _invalidate_cache(self) -> None:
245
+ """Invalidate the embedding cache (thread-safe)."""
246
+ with self._cache_lock:
247
+ self._embedding_matrix = None
248
+ self._embedding_norms = None
249
+ self._chunk_ids = None
250
+ self._cache_version += 1
251
+
252
+ def _refresh_cache(self) -> bool:
253
+ """Load embeddings into numpy matrix for fast similarity search.
254
+
255
+ Returns:
256
+ True if cache was refreshed successfully, False if no data.
257
+ """
258
+ with self._cache_lock:
259
+ with sqlite3.connect(self.db_path) as conn:
260
+ conn.execute("PRAGMA mmap_size = 30000000000")
261
+ rows = conn.execute(
262
+ "SELECT id, embedding FROM semantic_chunks"
263
+ ).fetchall()
264
+
265
+ if not rows:
266
+ self._embedding_matrix = None
267
+ self._embedding_norms = None
268
+ self._chunk_ids = None
269
+ return False
270
+
271
+ # Extract IDs and embeddings
272
+ self._chunk_ids = [r[0] for r in rows]
273
+
274
+ # Bulk convert binary blobs to numpy matrix
275
+ embeddings = [
276
+ np.frombuffer(r[1], dtype=np.float32) for r in rows
277
+ ]
278
+ self._embedding_matrix = np.vstack(embeddings)
279
+
280
+ # Pre-compute norms for faster similarity calculation
281
+ self._embedding_norms = np.linalg.norm(
282
+ self._embedding_matrix, axis=1, keepdims=True
283
+ )
284
+ # Avoid division by zero
285
+ self._embedding_norms = np.where(
286
+ self._embedding_norms == 0, 1e-10, self._embedding_norms
287
+ )
288
+
289
+ return True
290
+
291
+ def _ensure_ann_index(self, dim: int) -> bool:
292
+ """Ensure ANN index is initialized with correct dimension.
293
+
294
+ This method is thread-safe and uses double-checked locking.
295
+
296
+ Args:
297
+ dim: Embedding dimension
298
+
299
+ Returns:
300
+ True if ANN index is ready, False otherwise
301
+ """
302
+ if not HNSWLIB_AVAILABLE:
303
+ return False
304
+
305
+ # Fast path: index already initialized (no lock needed)
306
+ if self._ann_index is not None:
307
+ return True
308
+
309
+ # Slow path: acquire lock for initialization
310
+ with self._ann_write_lock:
311
+ # Double-check after acquiring lock
312
+ if self._ann_index is not None:
313
+ return True
314
+
315
+ try:
316
+ self._ann_dim = dim
317
+ self._ann_index = ANNIndex(self.db_path, dim)
318
+ self._ann_index.load() # Try to load existing
319
+ return True
320
+ except Exception as e:
321
+ logger.warning("Failed to initialize ANN index: %s", e)
322
+ self._ann_index = None
323
+ return False
324
+
325
+ def add_chunk(self, chunk: SemanticChunk, file_path: str) -> int:
326
+ """Add a single chunk with its embedding.
327
+
328
+ Returns:
329
+ The inserted chunk ID.
330
+ """
331
+ if chunk.embedding is None:
332
+ raise ValueError("Chunk must have embedding before adding to store")
333
+
334
+ embedding_arr = np.array(chunk.embedding, dtype=np.float32)
335
+ embedding_blob = embedding_arr.tobytes()
336
+ metadata_json = json.dumps(chunk.metadata) if chunk.metadata else None
337
+
338
+ with sqlite3.connect(self.db_path) as conn:
339
+ cursor = conn.execute(
340
+ """
341
+ INSERT INTO semantic_chunks (file_path, content, embedding, metadata)
342
+ VALUES (?, ?, ?, ?)
343
+ """,
344
+ (file_path, chunk.content, embedding_blob, metadata_json)
345
+ )
346
+ conn.commit()
347
+ chunk_id = cursor.lastrowid or 0
348
+
349
+ # Add to ANN index
350
+ if self._ensure_ann_index(len(chunk.embedding)):
351
+ with self._ann_write_lock:
352
+ try:
353
+ self._ann_index.add_vectors([chunk_id], embedding_arr.reshape(1, -1))
354
+ self._ann_index.save()
355
+ except Exception as e:
356
+ logger.warning("Failed to add to ANN index: %s", e)
357
+
358
+ # Invalidate cache after modification
359
+ self._invalidate_cache()
360
+ return chunk_id
361
+
362
+ def add_chunks(self, chunks: List[SemanticChunk], file_path: str) -> List[int]:
363
+ """Add multiple chunks with embeddings (batch insert).
364
+
365
+ Returns:
366
+ List of inserted chunk IDs.
367
+ """
368
+ if not chunks:
369
+ return []
370
+
371
+ # Prepare batch data
372
+ batch_data = []
373
+ embeddings_list = []
374
+ for chunk in chunks:
375
+ if chunk.embedding is None:
376
+ raise ValueError("All chunks must have embeddings")
377
+ embedding_arr = np.array(chunk.embedding, dtype=np.float32)
378
+ embedding_blob = embedding_arr.tobytes()
379
+ metadata_json = json.dumps(chunk.metadata) if chunk.metadata else None
380
+ batch_data.append((file_path, chunk.content, embedding_blob, metadata_json))
381
+ embeddings_list.append(embedding_arr)
382
+
383
+ # Batch insert to SQLite
384
+ with sqlite3.connect(self.db_path) as conn:
385
+ # Get starting ID before insert
386
+ row = conn.execute("SELECT MAX(id) FROM semantic_chunks").fetchone()
387
+ start_id = (row[0] or 0) + 1
388
+
389
+ conn.executemany(
390
+ """
391
+ INSERT INTO semantic_chunks (file_path, content, embedding, metadata)
392
+ VALUES (?, ?, ?, ?)
393
+ """,
394
+ batch_data
395
+ )
396
+ conn.commit()
397
+ # Calculate inserted IDs based on starting ID
398
+ ids = list(range(start_id, start_id + len(chunks)))
399
+
400
+ # Add to ANN index
401
+ if embeddings_list and self._ensure_ann_index(len(embeddings_list[0])):
402
+ with self._ann_write_lock:
403
+ try:
404
+ embeddings_matrix = np.vstack(embeddings_list)
405
+ self._ann_index.add_vectors(ids, embeddings_matrix)
406
+ self._ann_index.save()
407
+ except Exception as e:
408
+ logger.warning("Failed to add batch to ANN index: %s", e)
409
+
410
+ # Invalidate cache after modification
411
+ self._invalidate_cache()
412
+ return ids
413
+
414
+ def add_chunks_batch(
415
+ self,
416
+ chunks_with_paths: List[Tuple[SemanticChunk, str]],
417
+ update_ann: bool = True,
418
+ auto_save_ann: bool = True,
419
+ ) -> List[int]:
420
+ """Batch insert chunks from multiple files in a single transaction.
421
+
422
+ This method is optimized for bulk operations during index generation.
423
+
424
+ Args:
425
+ chunks_with_paths: List of (chunk, file_path) tuples
426
+ update_ann: If True, update ANN index with new vectors (default: True)
427
+ auto_save_ann: If True, save ANN index after update (default: True).
428
+ Set to False for bulk inserts to reduce I/O overhead.
429
+
430
+ Returns:
431
+ List of inserted chunk IDs
432
+ """
433
+ if not chunks_with_paths:
434
+ return []
435
+
436
+ # Prepare batch data
437
+ batch_data = []
438
+ embeddings_list = []
439
+ for chunk, file_path in chunks_with_paths:
440
+ if chunk.embedding is None:
441
+ raise ValueError("All chunks must have embeddings")
442
+ # Optimize: avoid repeated np.array() if already numpy
443
+ if isinstance(chunk.embedding, np.ndarray):
444
+ embedding_arr = chunk.embedding.astype(np.float32)
445
+ else:
446
+ embedding_arr = np.array(chunk.embedding, dtype=np.float32)
447
+ embedding_blob = embedding_arr.tobytes()
448
+ metadata_json = json.dumps(chunk.metadata) if chunk.metadata else None
449
+ batch_data.append((file_path, chunk.content, embedding_blob, metadata_json))
450
+ embeddings_list.append(embedding_arr)
451
+
452
+ # Batch insert to SQLite in single transaction
453
+ with sqlite3.connect(self.db_path) as conn:
454
+ # Get starting ID before insert
455
+ row = conn.execute("SELECT MAX(id) FROM semantic_chunks").fetchone()
456
+ start_id = (row[0] or 0) + 1
457
+
458
+ conn.executemany(
459
+ """
460
+ INSERT INTO semantic_chunks (file_path, content, embedding, metadata)
461
+ VALUES (?, ?, ?, ?)
462
+ """,
463
+ batch_data
464
+ )
465
+ conn.commit()
466
+ # Calculate inserted IDs based on starting ID
467
+ ids = list(range(start_id, start_id + len(chunks_with_paths)))
468
+
469
+ # Handle ANN index updates
470
+ if embeddings_list and update_ann and self._ensure_ann_index(len(embeddings_list[0])):
471
+ # In bulk insert mode, accumulate for later batch update
472
+ if self._bulk_insert_mode:
473
+ self._bulk_insert_ids.extend(ids)
474
+ self._bulk_insert_embeddings.extend(embeddings_list)
475
+ else:
476
+ # Normal mode: update immediately
477
+ with self._ann_write_lock:
478
+ try:
479
+ embeddings_matrix = np.vstack(embeddings_list)
480
+ self._ann_index.add_vectors(ids, embeddings_matrix)
481
+ if auto_save_ann:
482
+ self._ann_index.save()
483
+ except Exception as e:
484
+ logger.warning("Failed to add batch to ANN index: %s", e)
485
+
486
+ # Invalidate cache after modification
487
+ self._invalidate_cache()
488
+ return ids
489
+
490
+ def add_chunks_batch_numpy(
491
+ self,
492
+ chunks_with_paths: List[Tuple[SemanticChunk, str]],
493
+ embeddings_matrix: np.ndarray,
494
+ update_ann: bool = True,
495
+ auto_save_ann: bool = True,
496
+ ) -> List[int]:
497
+ """Batch insert chunks with pre-computed numpy embeddings matrix.
498
+
499
+ This method accepts embeddings as a numpy matrix to avoid list->array conversions.
500
+ Useful when embeddings are already in numpy format from batch encoding.
501
+
502
+ Args:
503
+ chunks_with_paths: List of (chunk, file_path) tuples (embeddings can be None)
504
+ embeddings_matrix: Pre-computed embeddings as (N, D) numpy array
505
+ update_ann: If True, update ANN index with new vectors (default: True)
506
+ auto_save_ann: If True, save ANN index after update (default: True)
507
+
508
+ Returns:
509
+ List of inserted chunk IDs
510
+ """
511
+ if not chunks_with_paths:
512
+ return []
513
+
514
+ if len(chunks_with_paths) != embeddings_matrix.shape[0]:
515
+ raise ValueError(
516
+ f"Mismatch: {len(chunks_with_paths)} chunks but "
517
+ f"{embeddings_matrix.shape[0]} embeddings"
518
+ )
519
+
520
+ # Ensure float32 format
521
+ embeddings_matrix = embeddings_matrix.astype(np.float32)
522
+
523
+ # Prepare batch data
524
+ batch_data = []
525
+ for i, (chunk, file_path) in enumerate(chunks_with_paths):
526
+ embedding_arr = embeddings_matrix[i]
527
+ embedding_blob = embedding_arr.tobytes()
528
+ metadata_json = json.dumps(chunk.metadata) if chunk.metadata else None
529
+ batch_data.append((file_path, chunk.content, embedding_blob, metadata_json))
530
+
531
+ # Batch insert to SQLite in single transaction
532
+ with sqlite3.connect(self.db_path) as conn:
533
+ # Get starting ID before insert
534
+ row = conn.execute("SELECT MAX(id) FROM semantic_chunks").fetchone()
535
+ start_id = (row[0] or 0) + 1
536
+
537
+ conn.executemany(
538
+ """
539
+ INSERT INTO semantic_chunks (file_path, content, embedding, metadata)
540
+ VALUES (?, ?, ?, ?)
541
+ """,
542
+ batch_data
543
+ )
544
+ conn.commit()
545
+ # Calculate inserted IDs based on starting ID
546
+ ids = list(range(start_id, start_id + len(chunks_with_paths)))
547
+
548
+ # Handle ANN index updates
549
+ if update_ann and self._ensure_ann_index(embeddings_matrix.shape[1]):
550
+ # In bulk insert mode, accumulate for later batch update
551
+ if self._bulk_insert_mode:
552
+ self._bulk_insert_ids.extend(ids)
553
+ # Split matrix into individual arrays for accumulation
554
+ self._bulk_insert_embeddings.extend([embeddings_matrix[i] for i in range(len(ids))])
555
+ else:
556
+ # Normal mode: update immediately
557
+ with self._ann_write_lock:
558
+ try:
559
+ self._ann_index.add_vectors(ids, embeddings_matrix)
560
+ if auto_save_ann:
561
+ self._ann_index.save()
562
+ except Exception as e:
563
+ logger.warning("Failed to add batch to ANN index: %s", e)
564
+
565
+ # Invalidate cache after modification
566
+ self._invalidate_cache()
567
+ return ids
568
+
569
+ def begin_bulk_insert(self) -> None:
570
+ """Begin bulk insert mode - disable ANN auto-update for better performance.
571
+
572
+ Usage:
573
+ store.begin_bulk_insert()
574
+ try:
575
+ for batch in batches:
576
+ store.add_chunks_batch(batch, auto_save_ann=False)
577
+ finally:
578
+ store.end_bulk_insert()
579
+
580
+ Or use context manager:
581
+ with store.bulk_insert():
582
+ for batch in batches:
583
+ store.add_chunks_batch(batch)
584
+ """
585
+ self._bulk_insert_mode = True
586
+ self._bulk_insert_ids.clear()
587
+ self._bulk_insert_embeddings.clear()
588
+ logger.debug("Entered bulk insert mode")
589
+
590
+ def end_bulk_insert(self) -> None:
591
+ """End bulk insert mode and rebuild ANN index from accumulated data.
592
+
593
+ This method should be called after all bulk inserts are complete to
594
+ update the ANN index in a single batch operation.
595
+ """
596
+ if not self._bulk_insert_mode:
597
+ logger.warning("end_bulk_insert called but not in bulk insert mode")
598
+ return
599
+
600
+ self._bulk_insert_mode = False
601
+
602
+ # Update ANN index with all accumulated data
603
+ if self._bulk_insert_ids and self._bulk_insert_embeddings:
604
+ if self._ensure_ann_index(len(self._bulk_insert_embeddings[0])):
605
+ with self._ann_write_lock:
606
+ try:
607
+ embeddings_matrix = np.vstack(self._bulk_insert_embeddings)
608
+ self._ann_index.add_vectors(self._bulk_insert_ids, embeddings_matrix)
609
+ self._ann_index.save()
610
+ logger.info(
611
+ "Bulk insert complete: added %d vectors to ANN index",
612
+ len(self._bulk_insert_ids)
613
+ )
614
+ except Exception as e:
615
+ logger.error("Failed to update ANN index after bulk insert: %s", e)
616
+
617
+ # Clear accumulated data
618
+ self._bulk_insert_ids.clear()
619
+ self._bulk_insert_embeddings.clear()
620
+ logger.debug("Exited bulk insert mode")
621
+
622
+ class BulkInsertContext:
623
+ """Context manager for bulk insert operations."""
624
+
625
+ def __init__(self, store: "VectorStore") -> None:
626
+ self.store = store
627
+
628
+ def __enter__(self) -> "VectorStore":
629
+ self.store.begin_bulk_insert()
630
+ return self.store
631
+
632
+ def __exit__(self, exc_type, exc_val, exc_tb) -> None:
633
+ self.store.end_bulk_insert()
634
+
635
+ def bulk_insert(self) -> "VectorStore.BulkInsertContext":
636
+ """Return a context manager for bulk insert operations.
637
+
638
+ Usage:
639
+ with store.bulk_insert():
640
+ for batch in batches:
641
+ store.add_chunks_batch(batch)
642
+ """
643
+ return self.BulkInsertContext(self)
644
+
645
+ def delete_file_chunks(self, file_path: str) -> int:
646
+ """Delete all chunks for a file.
647
+
648
+ Returns:
649
+ Number of deleted chunks.
650
+ """
651
+ # Get chunk IDs before deletion (for ANN index)
652
+ chunk_ids_to_delete = []
653
+ if self._ann_index is not None:
654
+ with sqlite3.connect(self.db_path) as conn:
655
+ rows = conn.execute(
656
+ "SELECT id FROM semantic_chunks WHERE file_path = ?",
657
+ (file_path,)
658
+ ).fetchall()
659
+ chunk_ids_to_delete = [r[0] for r in rows]
660
+
661
+ # Delete from SQLite
662
+ with sqlite3.connect(self.db_path) as conn:
663
+ cursor = conn.execute(
664
+ "DELETE FROM semantic_chunks WHERE file_path = ?",
665
+ (file_path,)
666
+ )
667
+ conn.commit()
668
+ deleted = cursor.rowcount
669
+
670
+ # Remove from ANN index
671
+ if deleted > 0 and self._ann_index is not None and chunk_ids_to_delete:
672
+ with self._ann_write_lock:
673
+ try:
674
+ self._ann_index.remove_vectors(chunk_ids_to_delete)
675
+ self._ann_index.save()
676
+ except Exception as e:
677
+ logger.warning("Failed to remove from ANN index: %s", e)
678
+
679
+ if deleted > 0:
680
+ self._invalidate_cache()
681
+ return deleted
682
+
683
+ def search_similar(
684
+ self,
685
+ query_embedding: List[float],
686
+ top_k: int = 10,
687
+ min_score: float = 0.0,
688
+ return_full_content: bool = True,
689
+ ) -> List[SearchResult]:
690
+ """Find chunks most similar to query embedding.
691
+
692
+ Uses HNSW index for O(log N) search when available, falls back to
693
+ brute-force NumPy search otherwise.
694
+
695
+ Args:
696
+ query_embedding: Query vector.
697
+ top_k: Maximum results to return.
698
+ min_score: Minimum similarity score (0-1).
699
+ return_full_content: If True, return full code block content.
700
+
701
+ Returns:
702
+ List of SearchResult ordered by similarity (highest first).
703
+ """
704
+ query_vec = np.array(query_embedding, dtype=np.float32)
705
+
706
+ # Try HNSW search first (O(log N))
707
+ if (
708
+ HNSWLIB_AVAILABLE
709
+ and self._ann_index is not None
710
+ and self._ann_index.is_loaded
711
+ and self._ann_index.count() > 0
712
+ ):
713
+ try:
714
+ return self._search_with_ann(
715
+ query_vec, top_k, min_score, return_full_content
716
+ )
717
+ except Exception as e:
718
+ logger.warning("ANN search failed, falling back to brute-force: %s", e)
719
+
720
+ # Fallback to brute-force search (O(N))
721
+ return self._search_brute_force(
722
+ query_vec, top_k, min_score, return_full_content
723
+ )
724
+
725
+ def _search_with_ann(
726
+ self,
727
+ query_vec: np.ndarray,
728
+ top_k: int,
729
+ min_score: float,
730
+ return_full_content: bool,
731
+ ) -> List[SearchResult]:
732
+ """Search using HNSW index (O(log N)).
733
+
734
+ Args:
735
+ query_vec: Query vector as numpy array
736
+ top_k: Maximum results to return
737
+ min_score: Minimum similarity score (0-1)
738
+ return_full_content: If True, return full code block content
739
+
740
+ Returns:
741
+ List of SearchResult ordered by similarity (highest first)
742
+ """
743
+ # Limit top_k to available vectors to prevent hnswlib error
744
+ ann_count = self._ann_index.count()
745
+ effective_top_k = min(top_k, ann_count) if ann_count > 0 else 0
746
+
747
+ if effective_top_k == 0:
748
+ return []
749
+
750
+ # HNSW search returns (ids, distances)
751
+ # For cosine space: distance = 1 - similarity
752
+ ids, distances = self._ann_index.search(query_vec, effective_top_k)
753
+
754
+ if not ids:
755
+ return []
756
+
757
+ # Convert distances to similarity scores
758
+ scores = [1.0 - d for d in distances]
759
+
760
+ # Filter by min_score
761
+ filtered = [
762
+ (chunk_id, score)
763
+ for chunk_id, score in zip(ids, scores)
764
+ if score >= min_score
765
+ ]
766
+
767
+ if not filtered:
768
+ return []
769
+
770
+ top_ids = [f[0] for f in filtered]
771
+ top_scores = [f[1] for f in filtered]
772
+
773
+ # Fetch content from SQLite
774
+ return self._fetch_results_by_ids(top_ids, top_scores, return_full_content)
775
+
776
+ def _search_brute_force(
777
+ self,
778
+ query_vec: np.ndarray,
779
+ top_k: int,
780
+ min_score: float,
781
+ return_full_content: bool,
782
+ ) -> List[SearchResult]:
783
+ """Brute-force search using NumPy (O(N) fallback).
784
+
785
+ Args:
786
+ query_vec: Query vector as numpy array
787
+ top_k: Maximum results to return
788
+ min_score: Minimum similarity score (0-1)
789
+ return_full_content: If True, return full code block content
790
+
791
+ Returns:
792
+ List of SearchResult ordered by similarity (highest first)
793
+ """
794
+ logger.warning(
795
+ "Using brute-force vector search (hnswlib not available). "
796
+ "This may cause high memory usage for large indexes. "
797
+ "Install hnswlib for better performance: pip install hnswlib"
798
+ )
799
+
800
+ with self._cache_lock:
801
+ # Refresh cache if needed
802
+ if self._embedding_matrix is None:
803
+ if not self._refresh_cache():
804
+ return [] # No data
805
+
806
+ # Vectorized cosine similarity
807
+ query_vec = query_vec.reshape(1, -1)
808
+ query_norm = np.linalg.norm(query_vec)
809
+ if query_norm == 0:
810
+ return []
811
+
812
+ # Compute all similarities at once: (N,) scores
813
+ # similarity = (A @ B.T) / (||A|| * ||B||)
814
+ dot_products = np.dot(self._embedding_matrix, query_vec.T).flatten()
815
+ scores = dot_products / (self._embedding_norms.flatten() * query_norm)
816
+
817
+ # Filter by min_score and get top-k indices
818
+ valid_mask = scores >= min_score
819
+ valid_indices = np.where(valid_mask)[0]
820
+
821
+ if len(valid_indices) == 0:
822
+ return []
823
+
824
+ # Sort by score descending and take top_k
825
+ valid_scores = scores[valid_indices]
826
+ sorted_order = np.argsort(valid_scores)[::-1][:top_k]
827
+ top_indices = valid_indices[sorted_order]
828
+ top_scores = valid_scores[sorted_order]
829
+
830
+ # Get chunk IDs for top results
831
+ top_ids = [self._chunk_ids[i] for i in top_indices]
832
+
833
+ # Fetch content only for top-k results (lazy loading)
834
+ results = self._fetch_results_by_ids(
835
+ top_ids, top_scores.tolist(), return_full_content
836
+ )
837
+
838
+ return results
839
+
840
+ def _fetch_results_by_ids(
841
+ self,
842
+ chunk_ids: List[int],
843
+ scores: List[float],
844
+ return_full_content: bool,
845
+ ) -> List[SearchResult]:
846
+ """Fetch full result data for specific chunk IDs.
847
+
848
+ Args:
849
+ chunk_ids: List of chunk IDs to fetch.
850
+ scores: Corresponding similarity scores.
851
+ return_full_content: Whether to include full content.
852
+
853
+ Returns:
854
+ List of SearchResult objects.
855
+ """
856
+ if not chunk_ids:
857
+ return []
858
+
859
+ # Build parameterized query for IN clause
860
+ placeholders = ",".join("?" * len(chunk_ids))
861
+ query = f"""
862
+ SELECT id, file_path, content, metadata
863
+ FROM semantic_chunks
864
+ WHERE id IN ({placeholders})
865
+ """
866
+
867
+ with sqlite3.connect(self.db_path) as conn:
868
+ conn.execute("PRAGMA mmap_size = 30000000000")
869
+ rows = conn.execute(query, chunk_ids).fetchall()
870
+
871
+ # Build ID -> row mapping
872
+ id_to_row = {r[0]: r for r in rows}
873
+
874
+ results = []
875
+ for chunk_id, score in zip(chunk_ids, scores):
876
+ row = id_to_row.get(chunk_id)
877
+ if not row:
878
+ continue
879
+
880
+ _, file_path, content, metadata_json = row
881
+ metadata = json.loads(metadata_json) if metadata_json else {}
882
+
883
+ # Build excerpt (short preview)
884
+ excerpt = content[:200] + "..." if len(content) > 200 else content
885
+
886
+ # Extract symbol information from metadata
887
+ symbol_name = metadata.get("symbol_name")
888
+ symbol_kind = metadata.get("symbol_kind")
889
+ start_line = metadata.get("start_line")
890
+ end_line = metadata.get("end_line")
891
+
892
+ # Build Symbol object if we have symbol info
893
+ symbol = None
894
+ if symbol_name and symbol_kind and start_line and end_line:
895
+ try:
896
+ from codexlens.entities import Symbol
897
+ symbol = Symbol(
898
+ name=symbol_name,
899
+ kind=symbol_kind,
900
+ range=(start_line, end_line)
901
+ )
902
+ except Exception:
903
+ pass
904
+
905
+ results.append(SearchResult(
906
+ path=file_path,
907
+ score=score,
908
+ excerpt=excerpt,
909
+ content=content if return_full_content else None,
910
+ symbol=symbol,
911
+ metadata=metadata,
912
+ start_line=start_line,
913
+ end_line=end_line,
914
+ symbol_name=symbol_name,
915
+ symbol_kind=symbol_kind,
916
+ ))
917
+
918
+ return results
919
+
920
+ def count_chunks(self) -> int:
921
+ """Count total chunks in store."""
922
+ with sqlite3.connect(self.db_path) as conn:
923
+ row = conn.execute("SELECT COUNT(*) FROM semantic_chunks").fetchone()
924
+ return row[0] if row else 0
925
+
926
+ def clear_cache(self) -> None:
927
+ """Manually clear the embedding cache."""
928
+ self._invalidate_cache()
929
+
930
+ @property
931
+ def ann_available(self) -> bool:
932
+ """Check if ANN index is available and ready."""
933
+ return (
934
+ HNSWLIB_AVAILABLE
935
+ and self._ann_index is not None
936
+ and self._ann_index.is_loaded
937
+ )
938
+
939
+ @property
940
+ def ann_count(self) -> int:
941
+ """Get number of vectors in ANN index."""
942
+ if self._ann_index is not None:
943
+ return self._ann_index.count()
944
+ return 0
945
+
946
+ def get_model_config(self) -> Optional[Dict[str, Any]]:
947
+ """Get the model configuration used for embeddings in this store.
948
+
949
+ Returns:
950
+ Dictionary with model_profile, model_name, embedding_dim, or None if not set.
951
+ """
952
+ with sqlite3.connect(self.db_path) as conn:
953
+ row = conn.execute(
954
+ "SELECT model_profile, model_name, embedding_dim, created_at, updated_at "
955
+ "FROM embeddings_config WHERE id = 1"
956
+ ).fetchone()
957
+ if row:
958
+ return {
959
+ "model_profile": row[0],
960
+ "model_name": row[1],
961
+ "embedding_dim": row[2],
962
+ "created_at": row[3],
963
+ "updated_at": row[4],
964
+ }
965
+ return None
966
+
967
+ def set_model_config(
968
+ self, model_profile: str, model_name: str, embedding_dim: int
969
+ ) -> None:
970
+ """Set the model configuration for embeddings in this store.
971
+
972
+ This should be called when generating new embeddings. If a different
973
+ model was previously used, this will update the configuration.
974
+
975
+ Args:
976
+ model_profile: Model profile name (fast, code, minilm, etc.)
977
+ model_name: Full model name (e.g., jinaai/jina-embeddings-v2-base-code)
978
+ embedding_dim: Embedding dimension (e.g., 768)
979
+ """
980
+ with sqlite3.connect(self.db_path) as conn:
981
+ conn.execute(
982
+ """
983
+ INSERT INTO embeddings_config (id, model_profile, model_name, embedding_dim)
984
+ VALUES (1, ?, ?, ?)
985
+ ON CONFLICT(id) DO UPDATE SET
986
+ model_profile = excluded.model_profile,
987
+ model_name = excluded.model_name,
988
+ embedding_dim = excluded.embedding_dim,
989
+ updated_at = CURRENT_TIMESTAMP
990
+ """,
991
+ (model_profile, model_name, embedding_dim)
992
+ )
993
+ conn.commit()
994
+
995
+ def check_model_compatibility(
996
+ self, model_profile: str, model_name: str, embedding_dim: int
997
+ ) -> Tuple[bool, Optional[str]]:
998
+ """Check if the given model is compatible with existing embeddings.
999
+
1000
+ Args:
1001
+ model_profile: Model profile to check
1002
+ model_name: Model name to check
1003
+ embedding_dim: Embedding dimension to check
1004
+
1005
+ Returns:
1006
+ Tuple of (is_compatible, warning_message).
1007
+ is_compatible is True if no existing config or configs match.
1008
+ warning_message is a user-friendly message if incompatible.
1009
+ """
1010
+ existing = self.get_model_config()
1011
+ if existing is None:
1012
+ return True, None
1013
+
1014
+ # Check dimension first (most critical)
1015
+ if existing["embedding_dim"] != embedding_dim:
1016
+ return False, (
1017
+ f"Dimension mismatch: existing embeddings use {existing['embedding_dim']}d "
1018
+ f"({existing['model_profile']}), but requested model uses {embedding_dim}d "
1019
+ f"({model_profile}). Use --force to regenerate all embeddings."
1020
+ )
1021
+
1022
+ # Check model (different models with same dimension may have different semantic spaces)
1023
+ if existing["model_profile"] != model_profile:
1024
+ return False, (
1025
+ f"Model mismatch: existing embeddings use '{existing['model_profile']}' "
1026
+ f"({existing['model_name']}), but requested '{model_profile}' "
1027
+ f"({model_name}). Use --force to regenerate all embeddings."
1028
+ )
1029
+
1030
+ return True, None
1031
+
1032
+ def close(self) -> None:
1033
+ """Close the vector store and release resources.
1034
+
1035
+ This ensures SQLite connections are closed and ANN index is cleared,
1036
+ allowing temporary files to be deleted on Windows.
1037
+ """
1038
+ with self._cache_lock:
1039
+ self._embedding_matrix = None
1040
+ self._embedding_norms = None
1041
+ self._chunk_ids = None
1042
+
1043
+ with self._ann_write_lock:
1044
+ self._ann_index = None
1045
+
1046
+ def __enter__(self) -> "VectorStore":
1047
+ """Context manager entry."""
1048
+ return self
1049
+
1050
+ def __exit__(self, exc_type, exc_val, exc_tb) -> None:
1051
+ """Context manager exit - close resources."""
1052
+ self.close()