claude-code-workflow 6.1.4 → 6.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/CLAUDE.md +10 -0
- package/.claude/agents/action-planning-agent.md +857 -778
- package/.claude/agents/cli-execution-agent.md +266 -269
- package/.claude/agents/cli-explore-agent.md +2 -2
- package/.claude/agents/cli-lite-planning-agent.md +142 -92
- package/.claude/agents/cli-planning-agent.md +4 -4
- package/.claude/agents/code-developer.md +7 -6
- package/.claude/agents/conceptual-planning-agent.md +2 -2
- package/.claude/agents/context-search-agent.md +31 -32
- package/.claude/agents/doc-generator.md +4 -4
- package/.claude/agents/memory-bridge.md +93 -93
- package/.claude/agents/test-context-search-agent.md +8 -7
- package/.claude/agents/test-fix-agent.md +7 -6
- package/.claude/commands/clean.md +516 -0
- package/.claude/commands/memory/compact.md +383 -0
- package/.claude/commands/memory/docs-full-cli.md +471 -471
- package/.claude/commands/memory/docs-related-cli.md +386 -386
- package/.claude/commands/memory/docs.md +615 -615
- package/.claude/commands/memory/load.md +5 -5
- package/.claude/commands/memory/tech-research-rules.md +310 -0
- package/.claude/commands/memory/update-full.md +332 -332
- package/.claude/commands/memory/workflow-skill-memory.md +4 -4
- package/.claude/commands/task/create.md +151 -151
- package/.claude/commands/version.md +254 -254
- package/.claude/commands/workflow/brainstorm/api-designer.md +587 -585
- package/.claude/commands/workflow/brainstorm/artifacts.md +1 -0
- package/.claude/commands/workflow/brainstorm/auto-parallel.md +443 -443
- package/.claude/commands/workflow/brainstorm/data-architect.md +220 -220
- package/.claude/commands/workflow/brainstorm/product-manager.md +200 -200
- package/.claude/commands/workflow/brainstorm/product-owner.md +200 -200
- package/.claude/commands/workflow/brainstorm/scrum-master.md +200 -200
- package/.claude/commands/workflow/brainstorm/subject-matter-expert.md +200 -200
- package/.claude/commands/workflow/brainstorm/system-architect.md +389 -387
- package/.claude/commands/workflow/brainstorm/ui-designer.md +221 -221
- package/.claude/commands/workflow/brainstorm/ux-expert.md +221 -221
- package/.claude/commands/workflow/debug.md +321 -0
- package/.claude/commands/workflow/execute.md +13 -0
- package/.claude/commands/workflow/init.md +165 -164
- package/.claude/commands/workflow/lite-execute.md +119 -13
- package/.claude/commands/workflow/lite-fix.md +623 -621
- package/.claude/commands/workflow/lite-plan.md +610 -592
- package/.claude/commands/workflow/plan.md +5 -5
- package/.claude/commands/workflow/review-module-cycle.md +2 -0
- package/.claude/commands/workflow/review-session-cycle.md +2 -0
- package/.claude/commands/workflow/review.md +297 -291
- package/.claude/commands/workflow/session/complete.md +153 -500
- package/.claude/commands/workflow/session/list.md +95 -95
- package/.claude/commands/workflow/session/resume.md +60 -60
- package/.claude/commands/workflow/session/start.md +199 -199
- package/.claude/commands/workflow/tdd-plan.md +3 -3
- package/.claude/commands/workflow/tdd-verify.md +23 -9
- package/.claude/commands/workflow/test-cycle-execute.md +2 -0
- package/.claude/commands/workflow/test-fix-gen.md +699 -699
- package/.claude/commands/workflow/tools/conflict-resolution.md +104 -18
- package/.claude/commands/workflow/tools/context-gather.md +436 -434
- package/.claude/commands/workflow/tools/task-generate-agent.md +490 -291
- package/.claude/commands/workflow/tools/task-generate-tdd.md +18 -10
- package/.claude/commands/workflow/tools/test-concept-enhanced.md +2 -1
- package/.claude/commands/workflow/tools/test-context-gather.md +1 -0
- package/.claude/commands/workflow/tools/test-task-generate.md +1 -0
- package/.claude/commands/workflow/ui-design/import-from-code.md +9 -6
- package/.claude/skills/command-guide/SKILL.md +5 -5
- package/.claude/skills/command-guide/index/all-commands.json +1 -1
- package/.claude/skills/command-guide/index/by-category.json +1 -1
- package/.claude/skills/command-guide/index/by-use-case.json +1 -1
- package/.claude/skills/command-guide/reference/agents/action-planning-agent.md +857 -778
- package/.claude/skills/command-guide/reference/agents/cli-execution-agent.md +266 -269
- package/.claude/skills/command-guide/reference/agents/cli-explore-agent.md +2 -2
- package/.claude/skills/command-guide/reference/agents/cli-lite-planning-agent.md +142 -92
- package/.claude/skills/command-guide/reference/agents/cli-planning-agent.md +4 -4
- package/.claude/skills/command-guide/reference/agents/code-developer.md +7 -6
- package/.claude/skills/command-guide/reference/agents/conceptual-planning-agent.md +2 -2
- package/.claude/skills/command-guide/reference/agents/context-search-agent.md +31 -32
- package/.claude/skills/command-guide/reference/agents/doc-generator.md +4 -4
- package/.claude/skills/command-guide/reference/agents/memory-bridge.md +93 -93
- package/.claude/skills/command-guide/reference/agents/test-context-search-agent.md +8 -7
- package/.claude/skills/command-guide/reference/agents/test-fix-agent.md +7 -6
- package/.claude/skills/command-guide/reference/commands/memory/docs-full-cli.md +471 -471
- package/.claude/skills/command-guide/reference/commands/memory/docs-related-cli.md +386 -386
- package/.claude/skills/command-guide/reference/commands/memory/docs.md +17 -16
- package/.claude/skills/command-guide/reference/commands/memory/load.md +5 -5
- package/.claude/skills/command-guide/reference/commands/memory/tech-research.md +194 -357
- package/.claude/skills/command-guide/reference/commands/memory/update-full.md +332 -332
- package/.claude/skills/command-guide/reference/commands/memory/workflow-skill-memory.md +4 -4
- package/.claude/skills/command-guide/reference/commands/task/create.md +151 -151
- package/.claude/skills/command-guide/reference/commands/version.md +254 -254
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/api-designer.md +585 -585
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/auto-parallel.md +443 -443
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/data-architect.md +220 -220
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-manager.md +200 -200
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-owner.md +200 -200
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/scrum-master.md +200 -200
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/subject-matter-expert.md +200 -200
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/system-architect.md +387 -387
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ui-designer.md +221 -221
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ux-expert.md +221 -221
- package/.claude/skills/command-guide/reference/commands/workflow/execute.md +25 -20
- package/.claude/skills/command-guide/reference/commands/workflow/init.md +164 -164
- package/.claude/skills/command-guide/reference/commands/workflow/lite-execute.md +748 -686
- package/.claude/skills/command-guide/reference/commands/workflow/lite-fix.md +664 -621
- package/.claude/skills/command-guide/reference/commands/workflow/lite-plan.md +645 -592
- package/.claude/skills/command-guide/reference/commands/workflow/plan.md +5 -5
- package/.claude/skills/command-guide/reference/commands/workflow/review.md +25 -18
- package/.claude/skills/command-guide/reference/commands/workflow/session/complete.md +547 -500
- package/.claude/skills/command-guide/reference/commands/workflow/session/list.md +45 -27
- package/.claude/skills/command-guide/reference/commands/workflow/session/resume.md +35 -19
- package/.claude/skills/command-guide/reference/commands/workflow/session/start.md +90 -33
- package/.claude/skills/command-guide/reference/commands/workflow/tdd-plan.md +3 -3
- package/.claude/skills/command-guide/reference/commands/workflow/tdd-verify.md +23 -9
- package/.claude/skills/command-guide/reference/commands/workflow/test-fix-gen.md +699 -699
- package/.claude/skills/command-guide/reference/commands/workflow/tools/conflict-resolution.md +103 -17
- package/.claude/skills/command-guide/reference/commands/workflow/tools/context-gather.md +434 -434
- package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-agent.md +487 -291
- package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-tdd.md +17 -10
- package/.claude/skills/command-guide/reference/commands/workflow/tools/test-concept-enhanced.md +1 -1
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/import-from-code.md +6 -6
- package/.claude/workflows/chinese-response.md +38 -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/workflow/gemini-solution-design.txt +131 -131
- package/.claude/workflows/cli-templates/prompts/workflow/skill-conflict-patterns.txt +5 -9
- package/.claude/workflows/cli-templates/prompts/workflow/skill-lessons-learned.txt +5 -9
- 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/fix-plan-json-schema.json +25 -0
- package/.claude/workflows/cli-templates/schemas/plan-json-schema.json +25 -0
- package/.claude/workflows/cli-tools-usage.md +526 -0
- package/{CLAUDE.md → .claude/workflows/coding-philosophy.md} +24 -45
- package/.claude/workflows/context-tools.md +84 -0
- package/.claude/workflows/file-modification.md +64 -0
- package/.claude/workflows/tool-strategy.md +216 -79
- package/.claude/workflows/windows-platform.md +16 -0
- package/.claude/workflows/workflow-architecture.md +942 -942
- package/.codex/AGENTS.md +63 -330
- 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 -164
- package/.qwen/QWEN.md +0 -139
- package/README.md +29 -9
- package/ccw/README.md +30 -6
- package/ccw/bin/ccw-mcp.js +7 -0
- package/ccw/bin/ccw.js +9 -9
- package/ccw/package.json +65 -47
- package/ccw/src/.workflow/.cli-history/history.db +0 -0
- package/ccw/src/.workflow/.cli-history/history.db-shm +0 -0
- package/ccw/src/.workflow/.cli-history/history.db-wal +0 -0
- package/ccw/src/cli.ts +244 -0
- package/ccw/src/commands/cli.ts +740 -0
- package/ccw/src/commands/core-memory.ts +770 -0
- package/ccw/src/commands/hook.ts +315 -0
- package/ccw/src/commands/install.ts +519 -0
- package/ccw/src/commands/{list.js → list.ts} +1 -1
- package/ccw/src/commands/memory.ts +1090 -0
- package/ccw/src/commands/{serve.js → serve.ts} +14 -5
- package/ccw/src/commands/session-path-resolver.ts +372 -0
- package/ccw/src/commands/session.ts +1141 -0
- package/ccw/src/commands/{stop.js → stop.ts} +16 -6
- package/ccw/src/commands/tool.ts +201 -0
- package/ccw/src/commands/{uninstall.js → uninstall.ts} +89 -40
- package/ccw/src/commands/{upgrade.js → upgrade.ts} +68 -23
- package/ccw/src/commands/{view.js → view.ts} +22 -8
- package/ccw/src/config/storage-paths.ts +670 -0
- package/ccw/src/core/cache-manager.ts +294 -0
- package/ccw/src/core/claude-freshness.ts +319 -0
- package/ccw/src/core/core-memory-store.ts +1528 -0
- package/ccw/src/core/{dashboard-generator-patch.js → dashboard-generator-patch.ts} +18 -0
- package/ccw/src/core/{dashboard-generator.js → dashboard-generator.ts} +69 -12
- package/ccw/src/core/data-aggregator.ts +584 -0
- package/ccw/src/core/history-importer.ts +625 -0
- package/ccw/src/core/{lite-scanner.js → lite-scanner-complete.ts} +162 -66
- package/ccw/src/core/lite-scanner.ts +469 -0
- package/ccw/src/core/{manifest.js → manifest.ts} +104 -34
- package/ccw/src/core/memory-embedder-bridge.ts +262 -0
- package/ccw/src/core/memory-store.ts +978 -0
- package/ccw/src/core/routes/ccw-routes.ts +96 -0
- package/ccw/src/core/routes/claude-routes.ts +1183 -0
- package/ccw/src/core/routes/cli-routes.ts +561 -0
- package/ccw/src/core/routes/codexlens-routes.ts +806 -0
- package/ccw/src/core/routes/core-memory-routes.ts +605 -0
- package/ccw/src/core/routes/files-routes.ts +428 -0
- package/ccw/src/core/routes/graph-routes.md +164 -0
- package/ccw/src/core/routes/graph-routes.ts +626 -0
- package/ccw/src/core/routes/help-routes.ts +308 -0
- package/ccw/src/core/routes/hooks-routes.ts +405 -0
- package/ccw/src/core/routes/mcp-routes.ts +1271 -0
- package/ccw/src/core/routes/mcp-routes.ts.backup +550 -0
- package/ccw/src/core/routes/mcp-templates-db.ts +268 -0
- package/ccw/src/core/routes/memory-routes.ts +1206 -0
- package/ccw/src/core/routes/rules-routes.ts +526 -0
- package/ccw/src/core/routes/session-routes.ts +467 -0
- package/ccw/src/core/routes/skills-routes.ts +599 -0
- package/ccw/src/core/routes/status-routes.ts +57 -0
- package/ccw/src/core/routes/system-routes.ts +427 -0
- package/ccw/src/core/server.ts +431 -0
- package/ccw/src/core/session-clustering-service.ts +1258 -0
- package/ccw/src/core/session-scanner.ts +283 -0
- package/ccw/src/core/websocket.ts +190 -0
- package/ccw/src/{index.js → index.ts} +1 -0
- package/ccw/src/mcp-server/index.ts +186 -0
- package/ccw/src/templates/assets/css/github-dark.min.css +10 -0
- package/ccw/src/templates/assets/css/github.min.css +10 -0
- package/ccw/src/templates/assets/js/cytoscape.min.js +32 -0
- package/ccw/src/templates/assets/js/d3.min.js +2 -0
- package/ccw/src/templates/assets/js/highlight.min.js +1244 -0
- package/ccw/src/templates/assets/js/lucide.min.js +12 -0
- package/ccw/src/templates/assets/js/marked.min.js +69 -0
- package/ccw/src/templates/assets/js/tailwind.js +83 -0
- package/ccw/src/templates/dashboard-css/01-base.css +11 -0
- package/ccw/src/templates/dashboard-css/02-session.css +22 -0
- package/ccw/src/templates/dashboard-css/04-lite-tasks.css +10 -0
- package/ccw/src/templates/dashboard-css/06-cards.css +10 -4
- package/ccw/src/templates/dashboard-css/07-managers.css +1178 -7
- package/ccw/src/templates/dashboard-css/09-explorer.css +23 -12
- package/ccw/src/templates/dashboard-css/10-cli-status.css +337 -0
- package/ccw/src/templates/dashboard-css/11-cli-history.css +271 -0
- package/ccw/src/templates/dashboard-css/12-cli-legacy.css +796 -0
- package/ccw/src/templates/dashboard-css/13-cli-ccw.css +199 -0
- package/ccw/src/templates/dashboard-css/14-cli-modals.css +258 -0
- package/ccw/src/templates/dashboard-css/15-cli-endpoints.css +305 -0
- package/ccw/src/templates/dashboard-css/16-cli-session.css +241 -0
- package/ccw/src/templates/dashboard-css/17-cli-conversation.css +283 -0
- package/ccw/src/templates/dashboard-css/18-cli-settings.css +160 -0
- package/ccw/src/templates/dashboard-css/19-cli-native-session.css +496 -0
- package/ccw/src/templates/dashboard-css/20-cli-taskqueue.css +188 -0
- package/ccw/src/templates/dashboard-css/21-cli-toolmgmt.css +310 -0
- package/ccw/src/templates/dashboard-css/22-cli-semantic.css +240 -0
- package/ccw/src/templates/dashboard-css/23-memory.css +2390 -0
- package/ccw/src/templates/dashboard-css/24-prompt-history.css +1089 -0
- package/ccw/src/templates/dashboard-css/25-skills-rules.css +326 -0
- package/ccw/src/templates/dashboard-css/26-claude-manager.css +908 -0
- package/ccw/src/templates/dashboard-css/27-graph-explorer.css +1678 -0
- package/ccw/src/templates/dashboard-css/28-mcp-manager.css +748 -0
- package/ccw/src/templates/dashboard-css/29-help.css +264 -0
- package/ccw/src/templates/dashboard-css/30-core-memory.css +1700 -0
- package/ccw/src/templates/dashboard-js/api.js +162 -142
- package/ccw/src/templates/dashboard-js/components/carousel.js +4 -4
- package/ccw/src/templates/dashboard-js/components/cli-history.js +876 -0
- package/ccw/src/templates/dashboard-js/components/cli-status.js +978 -0
- package/ccw/src/templates/dashboard-js/components/global-notifications.js +508 -219
- package/ccw/src/templates/dashboard-js/components/hook-manager.js +1277 -282
- package/ccw/src/templates/dashboard-js/components/index-manager.js +302 -0
- package/ccw/src/templates/dashboard-js/components/mcp-manager.js +718 -27
- package/ccw/src/templates/dashboard-js/components/modals.js +66 -0
- package/ccw/src/templates/dashboard-js/components/navigation.js +80 -12
- package/ccw/src/templates/dashboard-js/components/notifications.js +758 -194
- package/ccw/src/templates/dashboard-js/components/storage-manager.js +478 -0
- package/ccw/src/templates/dashboard-js/components/tabs-other.js +157 -6
- package/ccw/src/templates/dashboard-js/components/task-queue-sidebar.js +716 -0
- package/ccw/src/templates/dashboard-js/help-i18n.js +272 -0
- package/ccw/src/templates/dashboard-js/i18n.js +2807 -0
- package/ccw/src/templates/dashboard-js/main.js +15 -0
- package/ccw/src/templates/dashboard-js/state.js +243 -42
- package/ccw/src/templates/dashboard-js/utils.js +47 -1
- package/ccw/src/templates/dashboard-js/views/claude-manager.js +912 -0
- package/ccw/src/templates/dashboard-js/views/cli-manager.js +2272 -0
- package/ccw/src/templates/dashboard-js/views/codexlens-manager.js +964 -0
- package/ccw/src/templates/dashboard-js/views/core-memory-clusters.js +503 -0
- package/ccw/src/templates/dashboard-js/views/core-memory.js +782 -0
- package/ccw/src/templates/dashboard-js/views/explorer.js +888 -852
- package/ccw/src/templates/dashboard-js/views/graph-explorer.js +1157 -0
- package/ccw/src/templates/dashboard-js/views/help.js +856 -0
- package/ccw/src/templates/dashboard-js/views/history.js +337 -0
- package/ccw/src/templates/dashboard-js/views/home.js +61 -15
- package/ccw/src/templates/dashboard-js/views/hook-manager.js +311 -43
- package/ccw/src/templates/dashboard-js/views/lite-tasks.js +204 -28
- package/ccw/src/templates/dashboard-js/views/mcp-manager.js +2187 -411
- package/ccw/src/templates/dashboard-js/views/mcp-manager.js.backup +1729 -0
- package/ccw/src/templates/dashboard-js/views/mcp-manager.js.new +928 -0
- package/ccw/src/templates/dashboard-js/views/memory.js +1221 -0
- package/ccw/src/templates/dashboard-js/views/prompt-history.js +713 -0
- package/ccw/src/templates/dashboard-js/views/rules-manager.js +828 -0
- package/ccw/src/templates/dashboard-js/views/session-detail.js +54 -53
- package/ccw/src/templates/dashboard-js/views/skills-manager.js +819 -0
- package/ccw/src/templates/dashboard.html +185 -85
- package/ccw/src/templates/hooks-config-example.json +60 -0
- package/ccw/src/tools/classify-folders.ts +245 -0
- package/ccw/src/tools/cli-config-manager.ts +268 -0
- package/ccw/src/tools/cli-executor.ts +2014 -0
- package/ccw/src/tools/cli-history-store.ts +1195 -0
- package/ccw/src/tools/codex-lens.ts +1141 -0
- package/ccw/src/tools/{convert-tokens-to-css.js → convert-tokens-to-css.ts} +73 -23
- package/ccw/src/tools/core-memory.ts +444 -0
- package/ccw/src/tools/detect-changed-modules.ts +325 -0
- package/ccw/src/tools/{discover-design-files.js → discover-design-files.ts} +74 -24
- package/ccw/src/tools/edit-file.ts +568 -0
- package/ccw/src/tools/{generate-module-docs.js → generate-module-docs.ts} +207 -185
- package/ccw/src/tools/{get-modules-by-depth.js → get-modules-by-depth.ts} +120 -79
- package/ccw/src/tools/index.ts +370 -0
- package/ccw/src/tools/native-session-discovery.ts +795 -0
- package/ccw/src/tools/notifier.ts +129 -0
- package/ccw/src/tools/read-file.ts +410 -0
- package/ccw/src/tools/resume-strategy.ts +345 -0
- package/ccw/src/tools/session-content-parser.ts +619 -0
- package/ccw/src/tools/session-manager.ts +1026 -0
- package/ccw/src/tools/smart-context.ts +228 -0
- package/ccw/src/tools/smart-search.ts +2065 -0
- package/ccw/src/tools/smart-search.ts.backup +1233 -0
- package/ccw/src/tools/storage-manager.ts +455 -0
- package/ccw/src/tools/write-file.ts +222 -0
- package/ccw/src/types/config.ts +11 -0
- package/ccw/src/types/index.ts +3 -0
- package/ccw/src/types/session.ts +25 -0
- package/ccw/src/types/tool.ts +41 -0
- package/ccw/src/utils/{browser-launcher.js → browser-launcher.ts} +10 -8
- package/ccw/src/utils/file-utils.ts +48 -0
- package/ccw/src/utils/{path-resolver.js → path-resolver.ts} +114 -78
- package/ccw/src/utils/path-validator.ts +153 -0
- package/ccw/src/utils/{ui.js → ui.ts} +32 -25
- 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 +4 -1
- package/.claude/commands/memory/tech-research.md +0 -477
- package/.claude/scripts/classify-folders.sh +0 -39
- package/.claude/scripts/convert_tokens_to_css.sh +0 -229
- package/.claude/scripts/detect_changed_modules.sh +0 -161
- package/.claude/scripts/discover-design-files.sh +0 -87
- package/.claude/scripts/extract-animations.js +0 -243
- package/.claude/scripts/extract-computed-styles.js +0 -118
- package/.claude/scripts/extract-layout-structure.js +0 -411
- package/.claude/scripts/generate_module_docs.sh +0 -717
- package/.claude/scripts/get_modules_by_depth.sh +0 -170
- package/.claude/scripts/ui-generate-preview.sh +0 -395
- package/.claude/scripts/ui-instantiate-prototypes.sh +0 -815
- package/.claude/scripts/update_module_claude.sh +0 -337
- package/.claude/workflows/context-search-strategy.md +0 -77
- package/.claude/workflows/intelligent-tools-strategy.md +0 -662
- package/ccw/src/cli.js +0 -119
- package/ccw/src/commands/install.js +0 -324
- package/ccw/src/commands/tool.js +0 -138
- package/ccw/src/core/data-aggregator.js +0 -409
- package/ccw/src/core/server.js +0 -2063
- package/ccw/src/core/session-scanner.js +0 -235
- package/ccw/src/tools/classify-folders.js +0 -204
- package/ccw/src/tools/detect-changed-modules.js +0 -288
- package/ccw/src/tools/edit-file.js +0 -266
- package/ccw/src/tools/index.js +0 -176
- package/ccw/src/utils/file-utils.js +0 -48
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
"""Smart code extraction for complete code blocks."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import List, Optional, Tuple
|
|
7
|
+
|
|
8
|
+
from codexlens.entities import SearchResult, Symbol
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def extract_complete_code_block(
|
|
12
|
+
result: SearchResult,
|
|
13
|
+
source_file_path: Optional[str] = None,
|
|
14
|
+
context_lines: int = 0,
|
|
15
|
+
) -> str:
|
|
16
|
+
"""Extract complete code block from a search result.
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
result: SearchResult from semantic search.
|
|
20
|
+
source_file_path: Optional path to source file for re-reading.
|
|
21
|
+
context_lines: Additional lines of context to include above/below.
|
|
22
|
+
|
|
23
|
+
Returns:
|
|
24
|
+
Complete code block as string.
|
|
25
|
+
"""
|
|
26
|
+
# If we have full content stored, use it
|
|
27
|
+
if result.content:
|
|
28
|
+
if context_lines == 0:
|
|
29
|
+
return result.content
|
|
30
|
+
# Need to add context, read from file
|
|
31
|
+
|
|
32
|
+
# Try to read from source file
|
|
33
|
+
file_path = source_file_path or result.path
|
|
34
|
+
if not file_path or not Path(file_path).exists():
|
|
35
|
+
# Fall back to excerpt
|
|
36
|
+
return result.excerpt or ""
|
|
37
|
+
|
|
38
|
+
try:
|
|
39
|
+
content = Path(file_path).read_text(encoding="utf-8", errors="ignore")
|
|
40
|
+
lines = content.splitlines()
|
|
41
|
+
|
|
42
|
+
# Get line range
|
|
43
|
+
start_line = result.start_line or 1
|
|
44
|
+
end_line = result.end_line or len(lines)
|
|
45
|
+
|
|
46
|
+
# Add context
|
|
47
|
+
start_idx = max(0, start_line - 1 - context_lines)
|
|
48
|
+
end_idx = min(len(lines), end_line + context_lines)
|
|
49
|
+
|
|
50
|
+
return "\n".join(lines[start_idx:end_idx])
|
|
51
|
+
except Exception:
|
|
52
|
+
return result.excerpt or result.content or ""
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def extract_symbol_with_context(
|
|
56
|
+
file_path: str,
|
|
57
|
+
symbol: Symbol,
|
|
58
|
+
include_docstring: bool = True,
|
|
59
|
+
include_decorators: bool = True,
|
|
60
|
+
) -> str:
|
|
61
|
+
"""Extract a symbol (function/class) with its docstring and decorators.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
file_path: Path to source file.
|
|
65
|
+
symbol: Symbol to extract.
|
|
66
|
+
include_docstring: Include docstring if present.
|
|
67
|
+
include_decorators: Include decorators/annotations above symbol.
|
|
68
|
+
|
|
69
|
+
Returns:
|
|
70
|
+
Complete symbol code with context.
|
|
71
|
+
"""
|
|
72
|
+
try:
|
|
73
|
+
content = Path(file_path).read_text(encoding="utf-8", errors="ignore")
|
|
74
|
+
lines = content.splitlines()
|
|
75
|
+
|
|
76
|
+
start_line, end_line = symbol.range
|
|
77
|
+
start_idx = start_line - 1
|
|
78
|
+
end_idx = end_line
|
|
79
|
+
|
|
80
|
+
# Look for decorators above the symbol
|
|
81
|
+
if include_decorators and start_idx > 0:
|
|
82
|
+
decorator_start = start_idx
|
|
83
|
+
# Search backwards for decorators
|
|
84
|
+
i = start_idx - 1
|
|
85
|
+
while i >= 0 and i >= start_idx - 20: # Look up to 20 lines back
|
|
86
|
+
line = lines[i].strip()
|
|
87
|
+
if line.startswith("@"):
|
|
88
|
+
decorator_start = i
|
|
89
|
+
i -= 1
|
|
90
|
+
elif line == "" or line.startswith("#"):
|
|
91
|
+
# Skip empty lines and comments, continue looking
|
|
92
|
+
i -= 1
|
|
93
|
+
elif line.startswith("//") or line.startswith("/*") or line.startswith("*"):
|
|
94
|
+
# JavaScript/Java style comments
|
|
95
|
+
decorator_start = i
|
|
96
|
+
i -= 1
|
|
97
|
+
else:
|
|
98
|
+
# Found non-decorator, non-comment line, stop
|
|
99
|
+
break
|
|
100
|
+
start_idx = decorator_start
|
|
101
|
+
|
|
102
|
+
return "\n".join(lines[start_idx:end_idx])
|
|
103
|
+
except Exception:
|
|
104
|
+
return ""
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def format_search_result_code(
|
|
108
|
+
result: SearchResult,
|
|
109
|
+
max_lines: Optional[int] = None,
|
|
110
|
+
show_line_numbers: bool = True,
|
|
111
|
+
highlight_match: bool = False,
|
|
112
|
+
) -> str:
|
|
113
|
+
"""Format search result code for display.
|
|
114
|
+
|
|
115
|
+
Args:
|
|
116
|
+
result: SearchResult to format.
|
|
117
|
+
max_lines: Maximum lines to show (None for all).
|
|
118
|
+
show_line_numbers: Include line numbers in output.
|
|
119
|
+
highlight_match: Add markers for matched region.
|
|
120
|
+
|
|
121
|
+
Returns:
|
|
122
|
+
Formatted code string.
|
|
123
|
+
"""
|
|
124
|
+
content = result.content or result.excerpt or ""
|
|
125
|
+
if not content:
|
|
126
|
+
return ""
|
|
127
|
+
|
|
128
|
+
lines = content.splitlines()
|
|
129
|
+
|
|
130
|
+
# Truncate if needed
|
|
131
|
+
truncated = False
|
|
132
|
+
if max_lines and len(lines) > max_lines:
|
|
133
|
+
lines = lines[:max_lines]
|
|
134
|
+
truncated = True
|
|
135
|
+
|
|
136
|
+
# Format with line numbers
|
|
137
|
+
if show_line_numbers:
|
|
138
|
+
start = result.start_line or 1
|
|
139
|
+
formatted_lines = []
|
|
140
|
+
for i, line in enumerate(lines):
|
|
141
|
+
line_num = start + i
|
|
142
|
+
formatted_lines.append(f"{line_num:4d} | {line}")
|
|
143
|
+
output = "\n".join(formatted_lines)
|
|
144
|
+
else:
|
|
145
|
+
output = "\n".join(lines)
|
|
146
|
+
|
|
147
|
+
if truncated:
|
|
148
|
+
output += "\n... (truncated)"
|
|
149
|
+
|
|
150
|
+
return output
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def get_code_block_summary(result: SearchResult) -> str:
|
|
154
|
+
"""Get a concise summary of a code block.
|
|
155
|
+
|
|
156
|
+
Args:
|
|
157
|
+
result: SearchResult to summarize.
|
|
158
|
+
|
|
159
|
+
Returns:
|
|
160
|
+
Summary string like "function hello_world (lines 10-25)"
|
|
161
|
+
"""
|
|
162
|
+
parts = []
|
|
163
|
+
|
|
164
|
+
if result.symbol_kind:
|
|
165
|
+
parts.append(result.symbol_kind)
|
|
166
|
+
|
|
167
|
+
if result.symbol_name:
|
|
168
|
+
parts.append(f"`{result.symbol_name}`")
|
|
169
|
+
elif result.excerpt:
|
|
170
|
+
# Extract first meaningful identifier
|
|
171
|
+
first_line = result.excerpt.split("\n")[0][:50]
|
|
172
|
+
parts.append(f'"{first_line}..."')
|
|
173
|
+
|
|
174
|
+
if result.start_line and result.end_line:
|
|
175
|
+
if result.start_line == result.end_line:
|
|
176
|
+
parts.append(f"(line {result.start_line})")
|
|
177
|
+
else:
|
|
178
|
+
parts.append(f"(lines {result.start_line}-{result.end_line})")
|
|
179
|
+
|
|
180
|
+
if result.path:
|
|
181
|
+
file_name = Path(result.path).name
|
|
182
|
+
parts.append(f"in {file_name}")
|
|
183
|
+
|
|
184
|
+
return " ".join(parts) if parts else "unknown code block"
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
class CodeBlockResult:
|
|
188
|
+
"""Enhanced search result with complete code block."""
|
|
189
|
+
|
|
190
|
+
def __init__(self, result: SearchResult, source_path: Optional[str] = None):
|
|
191
|
+
self.result = result
|
|
192
|
+
self.source_path = source_path or result.path
|
|
193
|
+
self._full_code: Optional[str] = None
|
|
194
|
+
|
|
195
|
+
@property
|
|
196
|
+
def score(self) -> float:
|
|
197
|
+
return self.result.score
|
|
198
|
+
|
|
199
|
+
@property
|
|
200
|
+
def path(self) -> str:
|
|
201
|
+
return self.result.path
|
|
202
|
+
|
|
203
|
+
@property
|
|
204
|
+
def file_name(self) -> str:
|
|
205
|
+
return Path(self.result.path).name
|
|
206
|
+
|
|
207
|
+
@property
|
|
208
|
+
def symbol_name(self) -> Optional[str]:
|
|
209
|
+
return self.result.symbol_name
|
|
210
|
+
|
|
211
|
+
@property
|
|
212
|
+
def symbol_kind(self) -> Optional[str]:
|
|
213
|
+
return self.result.symbol_kind
|
|
214
|
+
|
|
215
|
+
@property
|
|
216
|
+
def line_range(self) -> Tuple[int, int]:
|
|
217
|
+
return (
|
|
218
|
+
self.result.start_line or 1,
|
|
219
|
+
self.result.end_line or 1
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
@property
|
|
223
|
+
def full_code(self) -> str:
|
|
224
|
+
"""Get full code block content."""
|
|
225
|
+
if self._full_code is None:
|
|
226
|
+
self._full_code = extract_complete_code_block(self.result, self.source_path)
|
|
227
|
+
return self._full_code
|
|
228
|
+
|
|
229
|
+
@property
|
|
230
|
+
def excerpt(self) -> str:
|
|
231
|
+
"""Get short excerpt."""
|
|
232
|
+
return self.result.excerpt or ""
|
|
233
|
+
|
|
234
|
+
@property
|
|
235
|
+
def summary(self) -> str:
|
|
236
|
+
"""Get code block summary."""
|
|
237
|
+
return get_code_block_summary(self.result)
|
|
238
|
+
|
|
239
|
+
def format(
|
|
240
|
+
self,
|
|
241
|
+
max_lines: Optional[int] = None,
|
|
242
|
+
show_line_numbers: bool = True,
|
|
243
|
+
) -> str:
|
|
244
|
+
"""Format code for display."""
|
|
245
|
+
# Use full code if available
|
|
246
|
+
display_result = SearchResult(
|
|
247
|
+
path=self.result.path,
|
|
248
|
+
score=self.result.score,
|
|
249
|
+
content=self.full_code,
|
|
250
|
+
start_line=self.result.start_line,
|
|
251
|
+
end_line=self.result.end_line,
|
|
252
|
+
)
|
|
253
|
+
return format_search_result_code(
|
|
254
|
+
display_result,
|
|
255
|
+
max_lines=max_lines,
|
|
256
|
+
show_line_numbers=show_line_numbers
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
def __repr__(self) -> str:
|
|
260
|
+
return f"<CodeBlockResult {self.summary} score={self.score:.3f}>"
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
def enhance_search_results(
|
|
264
|
+
results: List[SearchResult],
|
|
265
|
+
) -> List[CodeBlockResult]:
|
|
266
|
+
"""Enhance search results with complete code block access.
|
|
267
|
+
|
|
268
|
+
Args:
|
|
269
|
+
results: List of SearchResult from semantic search.
|
|
270
|
+
|
|
271
|
+
Returns:
|
|
272
|
+
List of CodeBlockResult with full code access.
|
|
273
|
+
"""
|
|
274
|
+
return [CodeBlockResult(r) for r in results]
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"""Embedder for semantic code search using fastembed."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import gc
|
|
6
|
+
import threading
|
|
7
|
+
from typing import Dict, Iterable, List, Optional
|
|
8
|
+
|
|
9
|
+
import numpy as np
|
|
10
|
+
|
|
11
|
+
from . import SEMANTIC_AVAILABLE
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
# Global embedder cache for singleton pattern
|
|
15
|
+
_embedder_cache: Dict[str, "Embedder"] = {}
|
|
16
|
+
_cache_lock = threading.Lock()
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def get_embedder(profile: str = "code") -> "Embedder":
|
|
20
|
+
"""Get or create a cached Embedder instance (thread-safe singleton).
|
|
21
|
+
|
|
22
|
+
This function provides significant performance improvement by reusing
|
|
23
|
+
Embedder instances across multiple searches, avoiding repeated model
|
|
24
|
+
loading overhead (~0.8s per load).
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
profile: Model profile ("fast", "code", "multilingual", "balanced")
|
|
28
|
+
|
|
29
|
+
Returns:
|
|
30
|
+
Cached Embedder instance for the given profile
|
|
31
|
+
"""
|
|
32
|
+
global _embedder_cache
|
|
33
|
+
|
|
34
|
+
# Fast path: check cache without lock
|
|
35
|
+
if profile in _embedder_cache:
|
|
36
|
+
return _embedder_cache[profile]
|
|
37
|
+
|
|
38
|
+
# Slow path: acquire lock for initialization
|
|
39
|
+
with _cache_lock:
|
|
40
|
+
# Double-check after acquiring lock
|
|
41
|
+
if profile in _embedder_cache:
|
|
42
|
+
return _embedder_cache[profile]
|
|
43
|
+
|
|
44
|
+
# Create new embedder and cache it
|
|
45
|
+
embedder = Embedder(profile=profile)
|
|
46
|
+
# Pre-load model to ensure it's ready
|
|
47
|
+
embedder._load_model()
|
|
48
|
+
_embedder_cache[profile] = embedder
|
|
49
|
+
return embedder
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def clear_embedder_cache() -> None:
|
|
53
|
+
"""Clear the embedder cache and release ONNX resources.
|
|
54
|
+
|
|
55
|
+
This method ensures proper cleanup of ONNX model resources to prevent
|
|
56
|
+
memory leaks when embedders are no longer needed.
|
|
57
|
+
"""
|
|
58
|
+
global _embedder_cache
|
|
59
|
+
with _cache_lock:
|
|
60
|
+
# Release ONNX resources before clearing cache
|
|
61
|
+
for embedder in _embedder_cache.values():
|
|
62
|
+
if embedder._model is not None:
|
|
63
|
+
del embedder._model
|
|
64
|
+
embedder._model = None
|
|
65
|
+
_embedder_cache.clear()
|
|
66
|
+
gc.collect()
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class Embedder:
|
|
70
|
+
"""Generate embeddings for code chunks using fastembed (ONNX-based).
|
|
71
|
+
|
|
72
|
+
Supported Model Profiles:
|
|
73
|
+
- fast: BAAI/bge-small-en-v1.5 (384 dim) - Fast, lightweight, English-optimized
|
|
74
|
+
- code: jinaai/jina-embeddings-v2-base-code (768 dim) - Code-optimized, best for programming languages
|
|
75
|
+
- multilingual: intfloat/multilingual-e5-large (1024 dim) - Multilingual + code support
|
|
76
|
+
- balanced: mixedbread-ai/mxbai-embed-large-v1 (1024 dim) - High accuracy, general purpose
|
|
77
|
+
"""
|
|
78
|
+
|
|
79
|
+
# Model profiles for different use cases
|
|
80
|
+
MODELS = {
|
|
81
|
+
"fast": "BAAI/bge-small-en-v1.5", # 384 dim - Fast, lightweight
|
|
82
|
+
"code": "jinaai/jina-embeddings-v2-base-code", # 768 dim - Code-optimized
|
|
83
|
+
"multilingual": "intfloat/multilingual-e5-large", # 1024 dim - Multilingual
|
|
84
|
+
"balanced": "mixedbread-ai/mxbai-embed-large-v1", # 1024 dim - High accuracy
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
# Dimension mapping for each model
|
|
88
|
+
MODEL_DIMS = {
|
|
89
|
+
"BAAI/bge-small-en-v1.5": 384,
|
|
90
|
+
"jinaai/jina-embeddings-v2-base-code": 768,
|
|
91
|
+
"intfloat/multilingual-e5-large": 1024,
|
|
92
|
+
"mixedbread-ai/mxbai-embed-large-v1": 1024,
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
# Default model (fast profile)
|
|
96
|
+
DEFAULT_MODEL = "BAAI/bge-small-en-v1.5"
|
|
97
|
+
DEFAULT_PROFILE = "fast"
|
|
98
|
+
|
|
99
|
+
def __init__(self, model_name: str | None = None, profile: str | None = None) -> None:
|
|
100
|
+
"""Initialize embedder with model or profile.
|
|
101
|
+
|
|
102
|
+
Args:
|
|
103
|
+
model_name: Explicit model name (e.g., "jinaai/jina-embeddings-v2-base-code")
|
|
104
|
+
profile: Model profile shortcut ("fast", "code", "multilingual", "balanced")
|
|
105
|
+
If both provided, model_name takes precedence.
|
|
106
|
+
"""
|
|
107
|
+
if not SEMANTIC_AVAILABLE:
|
|
108
|
+
raise ImportError(
|
|
109
|
+
"Semantic search dependencies not available. "
|
|
110
|
+
"Install with: pip install codexlens[semantic]"
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
# Resolve model name from profile or use explicit name
|
|
114
|
+
if model_name:
|
|
115
|
+
self.model_name = model_name
|
|
116
|
+
elif profile and profile in self.MODELS:
|
|
117
|
+
self.model_name = self.MODELS[profile]
|
|
118
|
+
else:
|
|
119
|
+
self.model_name = self.DEFAULT_MODEL
|
|
120
|
+
|
|
121
|
+
self._model = None
|
|
122
|
+
|
|
123
|
+
@property
|
|
124
|
+
def embedding_dim(self) -> int:
|
|
125
|
+
"""Get embedding dimension for current model."""
|
|
126
|
+
return self.MODEL_DIMS.get(self.model_name, 768) # Default to 768 if unknown
|
|
127
|
+
|
|
128
|
+
def _load_model(self) -> None:
|
|
129
|
+
"""Lazy load the embedding model."""
|
|
130
|
+
if self._model is not None:
|
|
131
|
+
return
|
|
132
|
+
|
|
133
|
+
from fastembed import TextEmbedding
|
|
134
|
+
self._model = TextEmbedding(model_name=self.model_name)
|
|
135
|
+
|
|
136
|
+
def embed(self, texts: str | Iterable[str]) -> List[List[float]]:
|
|
137
|
+
"""Generate embeddings for one or more texts.
|
|
138
|
+
|
|
139
|
+
Args:
|
|
140
|
+
texts: Single text or iterable of texts to embed.
|
|
141
|
+
|
|
142
|
+
Returns:
|
|
143
|
+
List of embedding vectors (each is a list of floats).
|
|
144
|
+
|
|
145
|
+
Note:
|
|
146
|
+
This method converts numpy arrays to Python lists for backward compatibility.
|
|
147
|
+
For memory-efficient processing, use embed_to_numpy() instead.
|
|
148
|
+
"""
|
|
149
|
+
self._load_model()
|
|
150
|
+
|
|
151
|
+
if isinstance(texts, str):
|
|
152
|
+
texts = [texts]
|
|
153
|
+
else:
|
|
154
|
+
texts = list(texts)
|
|
155
|
+
|
|
156
|
+
embeddings = list(self._model.embed(texts))
|
|
157
|
+
return [emb.tolist() for emb in embeddings]
|
|
158
|
+
|
|
159
|
+
def embed_to_numpy(self, texts: str | Iterable[str]) -> np.ndarray:
|
|
160
|
+
"""Generate embeddings for one or more texts (returns numpy arrays).
|
|
161
|
+
|
|
162
|
+
This method is more memory-efficient than embed() as it avoids converting
|
|
163
|
+
numpy arrays to Python lists, which can significantly reduce memory usage
|
|
164
|
+
during batch processing.
|
|
165
|
+
|
|
166
|
+
Args:
|
|
167
|
+
texts: Single text or iterable of texts to embed.
|
|
168
|
+
|
|
169
|
+
Returns:
|
|
170
|
+
numpy.ndarray of shape (n_texts, embedding_dim) containing embeddings.
|
|
171
|
+
"""
|
|
172
|
+
self._load_model()
|
|
173
|
+
|
|
174
|
+
if isinstance(texts, str):
|
|
175
|
+
texts = [texts]
|
|
176
|
+
else:
|
|
177
|
+
texts = list(texts)
|
|
178
|
+
|
|
179
|
+
# Return embeddings as numpy array directly (no .tolist() conversion)
|
|
180
|
+
embeddings = list(self._model.embed(texts))
|
|
181
|
+
return np.array(embeddings)
|
|
182
|
+
|
|
183
|
+
def embed_single(self, text: str) -> List[float]:
|
|
184
|
+
"""Generate embedding for a single text."""
|
|
185
|
+
return self.embed(text)[0]
|