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