claude-code-workflow 6.3.18 → 6.3.19
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 +8 -5
- package/.claude/agents/action-planning-agent.md +26 -2
- package/.claude/agents/code-developer.md +132 -43
- package/.claude/agents/debug-explore-agent.md +434 -0
- package/.claude/agents/test-fix-agent.md +14 -0
- package/.claude/commands/issue/discover.md +41 -0
- package/.claude/commands/issue/execute.md +200 -19
- package/.claude/commands/issue/new.md +1 -1
- package/.claude/commands/issue/plan.md +6 -1
- package/.claude/commands/issue/queue.md +94 -39
- package/.claude/commands/memory/swagger-docs.md +773 -0
- package/.claude/commands/workflow/brainstorm/auto-parallel.md +21 -21
- package/.claude/commands/workflow/execute.md +54 -34
- package/.claude/commands/workflow/lite-execute.md +48 -164
- package/.claude/commands/workflow/lite-fix.md +4 -4
- package/.claude/commands/workflow/lite-plan.md +5 -5
- package/.claude/commands/workflow/plan.md +27 -27
- package/.claude/commands/workflow/review.md +42 -17
- package/.claude/commands/workflow/tdd-plan.md +25 -25
- package/.claude/commands/workflow/test-fix-gen.md +10 -10
- package/.claude/commands/workflow/test-gen.md +14 -14
- package/.claude/commands/workflow/ui-design/explore-auto.md +21 -21
- package/.claude/commands/workflow/ui-design/imitate-auto.md +24 -24
- package/.claude/skills/_shared/SKILL-DESIGN-SPEC.md +693 -0
- package/.claude/skills/ccw/SKILL.md +462 -0
- package/.claude/skills/ccw/index/command-capabilities.json +127 -0
- package/.claude/skills/ccw/index/intent-rules.json +136 -0
- package/.claude/skills/ccw/index/workflow-chains.json +451 -0
- package/.claude/skills/ccw/phases/actions/bugfix.md +218 -0
- package/.claude/skills/ccw/phases/actions/coupled.md +194 -0
- package/.claude/skills/ccw/phases/actions/docs.md +93 -0
- package/.claude/skills/ccw/phases/actions/full.md +154 -0
- package/.claude/skills/ccw/phases/actions/issue.md +201 -0
- package/.claude/skills/ccw/phases/actions/rapid.md +104 -0
- package/.claude/skills/ccw/phases/actions/review-fix.md +84 -0
- package/.claude/skills/ccw/phases/actions/tdd.md +66 -0
- package/.claude/skills/ccw/phases/actions/ui.md +79 -0
- package/.claude/skills/ccw/phases/orchestrator.md +435 -0
- package/.claude/skills/ccw/specs/intent-classification.md +336 -0
- package/.claude/skills/ccw-help/SKILL.md +177 -0
- package/.claude/skills/ccw-help/index/all-agents.json +82 -0
- package/.claude/skills/{command-guide → ccw-help}/index/all-commands.json +183 -73
- package/.claude/skills/{command-guide → ccw-help}/index/by-category.json +187 -73
- package/.claude/skills/{command-guide → ccw-help}/index/by-use-case.json +295 -185
- package/.claude/skills/{command-guide → ccw-help}/index/command-relationships.json +19 -166
- package/.claude/skills/{command-guide → ccw-help}/index/essential-commands.json +10 -10
- package/.claude/skills/ccw-help/scripts/analyze_commands.py +337 -0
- package/.claude/skills/code-reviewer/README.md +340 -0
- package/.claude/skills/code-reviewer/SKILL.md +308 -0
- package/.claude/skills/code-reviewer/phases/01-code-discovery.md +246 -0
- package/.claude/skills/code-reviewer/phases/02-security-analysis.md +442 -0
- package/.claude/skills/code-reviewer/phases/03-best-practices-review.md +36 -0
- package/.claude/skills/code-reviewer/phases/04-report-generation.md +278 -0
- package/.claude/skills/code-reviewer/specs/best-practices-requirements.md +346 -0
- package/.claude/skills/code-reviewer/specs/quality-standards.md +252 -0
- package/.claude/skills/code-reviewer/specs/security-requirements.md +243 -0
- package/.claude/skills/code-reviewer/templates/best-practice-finding.md +234 -0
- package/.claude/skills/code-reviewer/templates/report-template.md +316 -0
- package/.claude/skills/code-reviewer/templates/security-finding.md +161 -0
- package/.claude/skills/skill-generator/SKILL.md +187 -0
- package/.claude/skills/skill-generator/phases/01-requirements-discovery.md +239 -0
- package/.claude/skills/skill-generator/phases/02-structure-generation.md +207 -0
- package/.claude/skills/skill-generator/phases/03-phase-generation.md +802 -0
- package/.claude/skills/skill-generator/phases/04-specs-templates.md +328 -0
- package/.claude/skills/skill-generator/phases/05-validation.md +334 -0
- package/.claude/skills/skill-generator/specs/cli-integration.md +448 -0
- package/.claude/skills/skill-generator/specs/execution-modes.md +396 -0
- package/.claude/skills/skill-generator/specs/scripting-integration.md +265 -0
- package/.claude/skills/skill-generator/specs/skill-requirements.md +466 -0
- package/.claude/skills/skill-generator/templates/autonomous-action.md +517 -0
- package/.claude/skills/skill-generator/templates/autonomous-orchestrator.md +276 -0
- package/.claude/skills/skill-generator/templates/code-analysis-action.md +503 -0
- package/.claude/skills/skill-generator/templates/llm-action.md +355 -0
- package/.claude/skills/skill-generator/templates/script-bash.md +277 -0
- package/.claude/skills/skill-generator/templates/script-python.md +198 -0
- package/.claude/skills/skill-generator/templates/sequential-phase.md +441 -0
- package/.claude/skills/skill-generator/templates/skill-md.md +156 -0
- package/.claude/workflows/chinese-response.md +15 -28
- package/.claude/workflows/cli-templates/prompts/documentation/swagger-api.txt +266 -0
- package/.claude/workflows/cli-tools-usage.md +221 -177
- package/.claude/workflows/windows-platform.md +13 -10
- package/.codex/prompts/issue-execute.md +305 -82
- package/.codex/prompts/issue-queue.md +22 -0
- package/.codex/prompts/lite-execute.md +36 -11
- package/README.md +309 -305
- package/ccw/README.md +10 -4
- package/ccw/dist/cli.d.ts.map +1 -1
- package/ccw/dist/cli.js +4 -1
- package/ccw/dist/cli.js.map +1 -1
- package/ccw/dist/commands/cli.d.ts.map +1 -1
- package/ccw/dist/commands/cli.js +131 -34
- package/ccw/dist/commands/cli.js.map +1 -1
- package/ccw/dist/commands/issue.d.ts +152 -0
- package/ccw/dist/commands/issue.d.ts.map +1 -1
- package/ccw/dist/commands/issue.js +550 -85
- package/ccw/dist/commands/issue.js.map +1 -1
- package/ccw/dist/commands/serve.d.ts +1 -0
- package/ccw/dist/commands/serve.d.ts.map +1 -1
- package/ccw/dist/commands/serve.js +12 -5
- package/ccw/dist/commands/serve.js.map +1 -1
- package/ccw/dist/commands/stop.d.ts.map +1 -1
- package/ccw/dist/commands/stop.js +29 -5
- package/ccw/dist/commands/stop.js.map +1 -1
- package/ccw/dist/commands/tool.d.ts.map +1 -1
- package/ccw/dist/commands/tool.js +19 -2
- package/ccw/dist/commands/tool.js.map +1 -1
- package/ccw/dist/commands/view.d.ts +1 -0
- package/ccw/dist/commands/view.d.ts.map +1 -1
- package/ccw/dist/commands/view.js +10 -3
- package/ccw/dist/commands/view.js.map +1 -1
- package/ccw/dist/config/cli-settings-manager.d.ts +86 -0
- package/ccw/dist/config/cli-settings-manager.d.ts.map +1 -0
- package/ccw/dist/config/cli-settings-manager.js +392 -0
- package/ccw/dist/config/cli-settings-manager.js.map +1 -0
- package/ccw/dist/config/litellm-api-config-manager.d.ts +71 -5
- package/ccw/dist/config/litellm-api-config-manager.d.ts.map +1 -1
- package/ccw/dist/config/litellm-api-config-manager.js +290 -20
- package/ccw/dist/config/litellm-api-config-manager.js.map +1 -1
- package/ccw/dist/core/auth/csrf-manager.d.ts +18 -0
- package/ccw/dist/core/auth/csrf-manager.d.ts.map +1 -0
- package/ccw/dist/core/auth/csrf-manager.js +80 -0
- package/ccw/dist/core/auth/csrf-manager.js.map +1 -0
- package/ccw/dist/core/auth/csrf-middleware.d.ts +8 -0
- package/ccw/dist/core/auth/csrf-middleware.d.ts.map +1 -0
- package/ccw/dist/core/auth/csrf-middleware.js +141 -0
- package/ccw/dist/core/auth/csrf-middleware.js.map +1 -0
- package/ccw/dist/core/auth/middleware.d.ts +15 -0
- package/ccw/dist/core/auth/middleware.d.ts.map +1 -0
- package/ccw/dist/core/auth/middleware.js +76 -0
- package/ccw/dist/core/auth/middleware.js.map +1 -0
- package/ccw/dist/core/auth/token-manager.d.ts +41 -0
- package/ccw/dist/core/auth/token-manager.d.ts.map +1 -0
- package/ccw/dist/core/auth/token-manager.js +171 -0
- package/ccw/dist/core/auth/token-manager.js.map +1 -0
- package/ccw/dist/core/cache-manager.d.ts +6 -6
- package/ccw/dist/core/cache-manager.d.ts.map +1 -1
- package/ccw/dist/core/cache-manager.js +70 -48
- package/ccw/dist/core/cache-manager.js.map +1 -1
- package/ccw/dist/core/claude-freshness.d.ts.map +1 -1
- package/ccw/dist/core/claude-freshness.js +23 -3
- package/ccw/dist/core/claude-freshness.js.map +1 -1
- package/ccw/dist/core/core-memory-store.d.ts.map +1 -1
- package/ccw/dist/core/core-memory-store.js +2 -1
- package/ccw/dist/core/core-memory-store.js.map +1 -1
- package/ccw/dist/core/cors.d.ts +3 -0
- package/ccw/dist/core/cors.d.ts.map +1 -0
- package/ccw/dist/core/cors.js +10 -0
- package/ccw/dist/core/cors.js.map +1 -0
- package/ccw/dist/core/dashboard-generator-patch.js +0 -1
- package/ccw/dist/core/dashboard-generator-patch.js.map +1 -1
- package/ccw/dist/core/dashboard-generator.d.ts.map +1 -1
- package/ccw/dist/core/dashboard-generator.js +417 -416
- package/ccw/dist/core/dashboard-generator.js.map +1 -1
- package/ccw/dist/core/data-aggregator.js +2 -2
- package/ccw/dist/core/data-aggregator.js.map +1 -1
- package/ccw/dist/core/lite-scanner.d.ts +1 -1
- package/ccw/dist/core/lite-scanner.d.ts.map +1 -1
- package/ccw/dist/core/lite-scanner.js +130 -127
- package/ccw/dist/core/lite-scanner.js.map +1 -1
- package/ccw/dist/core/routes/auth-routes.d.ts +12 -0
- package/ccw/dist/core/routes/auth-routes.d.ts.map +1 -0
- package/ccw/dist/core/routes/auth-routes.js +80 -0
- package/ccw/dist/core/routes/auth-routes.js.map +1 -0
- package/ccw/dist/core/routes/ccw-routes.d.ts +1 -14
- package/ccw/dist/core/routes/ccw-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/ccw-routes.js +9 -4
- package/ccw/dist/core/routes/ccw-routes.js.map +1 -1
- package/ccw/dist/core/routes/claude-routes.d.ts +1 -14
- package/ccw/dist/core/routes/claude-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/claude-routes.js +98 -39
- package/ccw/dist/core/routes/claude-routes.js.map +1 -1
- package/ccw/dist/core/routes/cli-routes.d.ts +14 -12
- package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/cli-routes.js +122 -43
- package/ccw/dist/core/routes/cli-routes.js.map +1 -1
- package/ccw/dist/core/routes/cli-settings-routes.d.ts +11 -0
- package/ccw/dist/core/routes/cli-settings-routes.d.ts.map +1 -0
- package/ccw/dist/core/routes/cli-settings-routes.js +204 -0
- package/ccw/dist/core/routes/cli-settings-routes.js.map +1 -0
- package/ccw/dist/core/routes/codexlens/config-handlers.d.ts +6 -0
- package/ccw/dist/core/routes/codexlens/config-handlers.d.ts.map +1 -0
- package/ccw/dist/core/routes/codexlens/config-handlers.js +1195 -0
- package/ccw/dist/core/routes/codexlens/config-handlers.js.map +1 -0
- package/ccw/dist/core/routes/codexlens/index-handlers.d.ts +10 -0
- package/ccw/dist/core/routes/codexlens/index-handlers.d.ts.map +1 -0
- package/ccw/dist/core/routes/codexlens/index-handlers.js +322 -0
- package/ccw/dist/core/routes/codexlens/index-handlers.js.map +1 -0
- package/ccw/dist/core/routes/codexlens/semantic-handlers.d.ts +6 -0
- package/ccw/dist/core/routes/codexlens/semantic-handlers.d.ts.map +1 -0
- package/ccw/dist/core/routes/codexlens/semantic-handlers.js +865 -0
- package/ccw/dist/core/routes/codexlens/semantic-handlers.js.map +1 -0
- package/ccw/dist/core/routes/codexlens/utils.d.ts +23 -0
- package/ccw/dist/core/routes/codexlens/utils.d.ts.map +1 -0
- package/ccw/dist/core/routes/codexlens/utils.js +85 -0
- package/ccw/dist/core/routes/codexlens/utils.js.map +1 -0
- package/ccw/dist/core/routes/codexlens/watcher-handlers.d.ts +13 -0
- package/ccw/dist/core/routes/codexlens/watcher-handlers.d.ts.map +1 -0
- package/ccw/dist/core/routes/codexlens/watcher-handlers.js +235 -0
- package/ccw/dist/core/routes/codexlens/watcher-handlers.js.map +1 -0
- package/ccw/dist/core/routes/codexlens-routes.d.ts +2 -11
- package/ccw/dist/core/routes/codexlens-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/codexlens-routes.js +10 -981
- package/ccw/dist/core/routes/codexlens-routes.js.map +1 -1
- package/ccw/dist/core/routes/discovery-routes.d.ts +1 -35
- package/ccw/dist/core/routes/discovery-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/discovery-routes.js +25 -0
- package/ccw/dist/core/routes/discovery-routes.js.map +1 -1
- package/ccw/dist/core/routes/files-routes.d.ts +1 -14
- package/ccw/dist/core/routes/files-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/files-routes.js +57 -14
- package/ccw/dist/core/routes/files-routes.js.map +1 -1
- package/ccw/dist/core/routes/graph-routes.d.ts +1 -14
- package/ccw/dist/core/routes/graph-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/graph-routes.js +36 -37
- package/ccw/dist/core/routes/graph-routes.js.map +1 -1
- package/ccw/dist/core/routes/help-routes.d.ts +1 -14
- package/ccw/dist/core/routes/help-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/help-routes.js +5 -0
- package/ccw/dist/core/routes/help-routes.js.map +1 -1
- package/ccw/dist/core/routes/hooks-routes.d.ts +4 -14
- package/ccw/dist/core/routes/hooks-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/hooks-routes.js +43 -21
- package/ccw/dist/core/routes/hooks-routes.js.map +1 -1
- package/ccw/dist/core/routes/issue-routes.d.ts +1 -34
- package/ccw/dist/core/routes/issue-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/issue-routes.js +24 -0
- package/ccw/dist/core/routes/issue-routes.js.map +1 -1
- package/ccw/dist/core/routes/litellm-api-routes.d.ts +1 -14
- package/ccw/dist/core/routes/litellm-api-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/litellm-api-routes.js +505 -48
- package/ccw/dist/core/routes/litellm-api-routes.js.map +1 -1
- package/ccw/dist/core/routes/litellm-routes.d.ts +1 -14
- package/ccw/dist/core/routes/litellm-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/litellm-routes.js +28 -11
- package/ccw/dist/core/routes/litellm-routes.js.map +1 -1
- package/ccw/dist/core/routes/mcp-routes.d.ts +1 -14
- package/ccw/dist/core/routes/mcp-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/mcp-routes.js +99 -30
- package/ccw/dist/core/routes/mcp-routes.js.map +1 -1
- package/ccw/dist/core/routes/mcp-templates-db.d.ts.map +1 -1
- package/ccw/dist/core/routes/mcp-templates-db.js +30 -31
- package/ccw/dist/core/routes/mcp-templates-db.js.map +1 -1
- package/ccw/dist/core/routes/memory-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/memory-routes.js +74 -24
- package/ccw/dist/core/routes/memory-routes.js.map +1 -1
- package/ccw/dist/core/routes/nav-status-routes.d.ts +3 -0
- package/ccw/dist/core/routes/nav-status-routes.d.ts.map +1 -0
- package/ccw/dist/core/routes/nav-status-routes.js +217 -0
- package/ccw/dist/core/routes/nav-status-routes.js.map +1 -0
- package/ccw/dist/core/routes/rules-routes.d.ts +1 -14
- package/ccw/dist/core/routes/rules-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/rules-routes.js +481 -58
- package/ccw/dist/core/routes/rules-routes.js.map +1 -1
- package/ccw/dist/core/routes/session-routes.d.ts +1 -14
- package/ccw/dist/core/routes/session-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/session-routes.js +15 -3
- package/ccw/dist/core/routes/session-routes.js.map +1 -1
- package/ccw/dist/core/routes/skills-routes.d.ts +1 -14
- package/ccw/dist/core/routes/skills-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/skills-routes.js +394 -112
- package/ccw/dist/core/routes/skills-routes.js.map +1 -1
- package/ccw/dist/core/routes/status-routes.d.ts +1 -14
- package/ccw/dist/core/routes/status-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/status-routes.js +4 -0
- package/ccw/dist/core/routes/status-routes.js.map +1 -1
- package/ccw/dist/core/routes/system-routes.d.ts +4 -10
- package/ccw/dist/core/routes/system-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/system-routes.js +6 -4
- package/ccw/dist/core/routes/system-routes.js.map +1 -1
- package/ccw/dist/core/routes/types.d.ts +19 -0
- package/ccw/dist/core/routes/types.d.ts.map +1 -0
- package/ccw/dist/core/routes/types.js +2 -0
- package/ccw/dist/core/routes/types.js.map +1 -0
- package/ccw/dist/core/server.d.ts.map +1 -1
- package/ccw/dist/core/server.js +201 -29
- package/ccw/dist/core/server.js.map +1 -1
- package/ccw/dist/core/services/api-key-tester.d.ts +31 -0
- package/ccw/dist/core/services/api-key-tester.d.ts.map +1 -0
- package/ccw/dist/core/services/api-key-tester.js +106 -0
- package/ccw/dist/core/services/api-key-tester.js.map +1 -0
- package/ccw/dist/core/services/health-check-service.d.ts +82 -0
- package/ccw/dist/core/services/health-check-service.d.ts.map +1 -0
- package/ccw/dist/core/services/health-check-service.js +271 -0
- package/ccw/dist/core/services/health-check-service.js.map +1 -0
- package/ccw/dist/core/websocket.d.ts +9 -7
- package/ccw/dist/core/websocket.d.ts.map +1 -1
- package/ccw/dist/core/websocket.js +9 -4
- package/ccw/dist/core/websocket.js.map +1 -1
- package/ccw/dist/tools/claude-cli-tools.d.ts +152 -28
- package/ccw/dist/tools/claude-cli-tools.d.ts.map +1 -1
- package/ccw/dist/tools/claude-cli-tools.js +490 -100
- package/ccw/dist/tools/claude-cli-tools.js.map +1 -1
- package/ccw/dist/tools/cli-config-manager.d.ts +24 -8
- package/ccw/dist/tools/cli-config-manager.d.ts.map +1 -1
- package/ccw/dist/tools/cli-config-manager.js +76 -156
- package/ccw/dist/tools/cli-config-manager.js.map +1 -1
- package/ccw/dist/tools/cli-executor-core.d.ts +85 -0
- package/ccw/dist/tools/cli-executor-core.d.ts.map +1 -0
- package/ccw/dist/tools/cli-executor-core.js +1310 -0
- package/ccw/dist/tools/cli-executor-core.js.map +1 -0
- package/ccw/dist/tools/cli-executor-state.d.ts +241 -0
- package/ccw/dist/tools/cli-executor-state.d.ts.map +1 -0
- package/ccw/dist/tools/cli-executor-state.js +392 -0
- package/ccw/dist/tools/cli-executor-state.js.map +1 -0
- package/ccw/dist/tools/cli-executor-utils.d.ts +36 -0
- package/ccw/dist/tools/cli-executor-utils.d.ts.map +1 -0
- package/ccw/dist/tools/cli-executor-utils.js +298 -0
- package/ccw/dist/tools/cli-executor-utils.js.map +1 -0
- package/ccw/dist/tools/cli-executor.d.ts +3 -377
- package/ccw/dist/tools/cli-executor.d.ts.map +1 -1
- package/ccw/dist/tools/cli-executor.js +3 -1884
- package/ccw/dist/tools/cli-executor.js.map +1 -1
- package/ccw/dist/tools/cli-history-store.d.ts +2 -0
- package/ccw/dist/tools/cli-history-store.d.ts.map +1 -1
- package/ccw/dist/tools/cli-history-store.js.map +1 -1
- package/ccw/dist/tools/cli-output-converter.d.ts +192 -0
- package/ccw/dist/tools/cli-output-converter.d.ts.map +1 -0
- package/ccw/dist/tools/cli-output-converter.js +1047 -0
- package/ccw/dist/tools/cli-output-converter.js.map +1 -0
- package/ccw/dist/tools/cli-prompt-builder.d.ts +113 -0
- package/ccw/dist/tools/cli-prompt-builder.d.ts.map +1 -0
- package/ccw/dist/tools/cli-prompt-builder.js +363 -0
- package/ccw/dist/tools/cli-prompt-builder.js.map +1 -0
- package/ccw/dist/tools/codex-lens.d.ts +15 -1
- package/ccw/dist/tools/codex-lens.d.ts.map +1 -1
- package/ccw/dist/tools/codex-lens.js +289 -55
- package/ccw/dist/tools/codex-lens.js.map +1 -1
- package/ccw/dist/tools/detect-changed-modules.d.ts.map +1 -1
- package/ccw/dist/tools/detect-changed-modules.js +22 -4
- package/ccw/dist/tools/detect-changed-modules.js.map +1 -1
- package/ccw/dist/tools/index.d.ts.map +1 -1
- package/ccw/dist/tools/index.js +2 -0
- package/ccw/dist/tools/index.js.map +1 -1
- package/ccw/dist/tools/litellm-client.d.ts.map +1 -1
- package/ccw/dist/tools/litellm-client.js +10 -4
- package/ccw/dist/tools/litellm-client.js.map +1 -1
- package/ccw/dist/tools/litellm-executor.d.ts +2 -4
- package/ccw/dist/tools/litellm-executor.d.ts.map +1 -1
- package/ccw/dist/tools/litellm-executor.js +39 -8
- package/ccw/dist/tools/litellm-executor.js.map +1 -1
- package/ccw/dist/tools/native-session-discovery.d.ts +2 -0
- package/ccw/dist/tools/native-session-discovery.d.ts.map +1 -1
- package/ccw/dist/tools/native-session-discovery.js +197 -1
- package/ccw/dist/tools/native-session-discovery.js.map +1 -1
- package/ccw/dist/tools/session-manager.d.ts.map +1 -1
- package/ccw/dist/tools/session-manager.js +79 -0
- package/ccw/dist/tools/session-manager.js.map +1 -1
- package/ccw/dist/tools/skill-context-loader.d.ts +15 -0
- package/ccw/dist/tools/skill-context-loader.d.ts.map +1 -0
- package/ccw/dist/tools/skill-context-loader.js +198 -0
- package/ccw/dist/tools/skill-context-loader.js.map +1 -0
- package/ccw/dist/tools/smart-search.d.ts +8 -3
- package/ccw/dist/tools/smart-search.d.ts.map +1 -1
- package/ccw/dist/tools/smart-search.js +378 -75
- package/ccw/dist/tools/smart-search.js.map +1 -1
- package/ccw/dist/types/cli-settings.d.ts +86 -0
- package/ccw/dist/types/cli-settings.d.ts.map +1 -0
- package/ccw/dist/types/cli-settings.js +54 -0
- package/ccw/dist/types/cli-settings.js.map +1 -0
- package/ccw/dist/types/litellm-api-config.d.ts +40 -1
- package/ccw/dist/types/litellm-api-config.d.ts.map +1 -1
- package/ccw/dist/utils/exec-constants.d.ts +25 -0
- package/ccw/dist/utils/exec-constants.d.ts.map +1 -0
- package/ccw/dist/utils/exec-constants.js +25 -0
- package/ccw/dist/utils/exec-constants.js.map +1 -0
- package/ccw/dist/utils/path-resolver.d.ts +1 -0
- package/ccw/dist/utils/path-resolver.d.ts.map +1 -1
- package/ccw/dist/utils/path-resolver.js +48 -3
- package/ccw/dist/utils/path-resolver.js.map +1 -1
- package/ccw/dist/utils/path-validator.d.ts.map +1 -1
- package/ccw/dist/utils/path-validator.js +25 -6
- package/ccw/dist/utils/path-validator.js.map +1 -1
- package/ccw/dist/utils/python-utils.d.ts.map +1 -1
- package/ccw/dist/utils/python-utils.js +27 -7
- package/ccw/dist/utils/python-utils.js.map +1 -1
- package/ccw/dist/utils/shell-escape.d.ts +8 -0
- package/ccw/dist/utils/shell-escape.d.ts.map +1 -0
- package/ccw/dist/utils/shell-escape.js +24 -0
- package/ccw/dist/utils/shell-escape.js.map +1 -0
- package/ccw/dist/utils/uv-manager.d.ts +167 -0
- package/ccw/dist/utils/uv-manager.d.ts.map +1 -0
- package/ccw/dist/utils/uv-manager.js +644 -0
- package/ccw/dist/utils/uv-manager.js.map +1 -0
- package/ccw/src/cli.ts +4 -1
- package/ccw/src/commands/cli.ts +132 -34
- package/ccw/src/commands/issue.ts +605 -91
- package/ccw/src/commands/serve.ts +15 -5
- package/ccw/src/commands/stop.ts +32 -5
- package/ccw/src/commands/tool.ts +17 -2
- package/ccw/src/commands/view.ts +13 -3
- package/ccw/src/config/cli-settings-manager.ts +460 -0
- package/ccw/src/config/litellm-api-config-manager.ts +392 -57
- package/ccw/src/core/auth/csrf-manager.ts +104 -0
- package/ccw/src/core/auth/csrf-middleware.ts +159 -0
- package/ccw/src/core/auth/middleware.ts +94 -0
- package/ccw/src/core/auth/token-manager.ts +219 -0
- package/ccw/src/core/cache-manager.ts +64 -52
- package/ccw/src/core/claude-freshness.ts +26 -6
- package/ccw/src/core/core-memory-store.ts +2 -1
- package/ccw/src/core/cors.ts +10 -0
- package/ccw/src/core/dashboard-generator-patch.ts +47 -48
- package/ccw/src/core/dashboard-generator.ts +797 -744
- package/ccw/src/core/data-aggregator.ts +667 -667
- package/ccw/src/core/lite-scanner.ts +156 -140
- package/ccw/src/core/routes/auth-routes.ts +98 -0
- package/ccw/src/core/routes/ccw-routes.ts +10 -20
- package/ccw/src/core/routes/claude-routes.ts +101 -51
- package/ccw/src/core/routes/cli-routes.ts +152 -55
- package/ccw/src/core/routes/cli-settings-routes.ts +232 -0
- package/ccw/src/core/routes/codexlens/README.md +37 -0
- package/ccw/src/core/routes/codexlens/config-handlers.ts +1269 -0
- package/ccw/src/core/routes/codexlens/index-handlers.ts +354 -0
- package/ccw/src/core/routes/codexlens/semantic-handlers.ts +931 -0
- package/ccw/src/core/routes/codexlens/utils.ts +96 -0
- package/ccw/src/core/routes/codexlens/watcher-handlers.ts +265 -0
- package/ccw/src/core/routes/codexlens-routes.ts +11 -1044
- package/ccw/src/core/routes/discovery-routes.ts +1 -12
- package/ccw/src/core/routes/files-routes.ts +112 -40
- package/ccw/src/core/routes/graph-routes.ts +39 -46
- package/ccw/src/core/routes/help-routes.ts +2 -12
- package/ccw/src/core/routes/hooks-routes.ts +83 -44
- package/ccw/src/core/routes/issue-routes.ts +1 -12
- package/ccw/src/core/routes/litellm-api-routes.ts +566 -60
- package/ccw/src/core/routes/litellm-routes.ts +35 -27
- package/ccw/src/core/routes/mcp-routes.ts +157 -60
- package/ccw/src/core/routes/mcp-routes.ts.backup +549 -550
- package/ccw/src/core/routes/mcp-templates-db.ts +267 -268
- package/ccw/src/core/routes/memory-routes.ts +76 -22
- package/ccw/src/core/routes/nav-status-routes.ts +231 -0
- package/ccw/src/core/routes/rules-routes.ts +600 -81
- package/ccw/src/core/routes/session-routes.ts +28 -22
- package/ccw/src/core/routes/skills-routes.ts +452 -132
- package/ccw/src/core/routes/status-routes.ts +1 -12
- package/ccw/src/core/routes/system-routes.ts +15 -22
- package/ccw/src/core/routes/types.ts +25 -0
- package/ccw/src/core/server.ts +651 -468
- package/ccw/src/core/services/api-key-tester.ts +137 -0
- package/ccw/src/core/services/health-check-service.ts +340 -0
- package/ccw/src/core/websocket.ts +20 -12
- package/ccw/src/templates/dashboard-css/01-base.css +109 -0
- package/ccw/src/templates/dashboard-css/10-cli-status.css +202 -0
- package/ccw/src/templates/dashboard-css/21-cli-toolmgmt.css +308 -0
- package/ccw/src/templates/dashboard-css/30-core-memory.css +20 -0
- package/ccw/src/templates/dashboard-css/31-api-settings.css +751 -14
- package/ccw/src/templates/dashboard-css/33-cli-stream-viewer.css +230 -2
- package/ccw/src/templates/dashboard-js/api.js +5 -0
- package/ccw/src/templates/dashboard-js/components/cli-status.js +279 -107
- package/ccw/src/templates/dashboard-js/components/cli-stream-viewer.js +262 -20
- package/ccw/src/templates/dashboard-js/components/hook-manager.js +105 -5
- package/ccw/src/templates/dashboard-js/components/mcp-manager.js +317 -0
- package/ccw/src/templates/dashboard-js/components/navigation.js +45 -0
- package/ccw/src/templates/dashboard-js/components/notifications.js +128 -0
- package/ccw/src/templates/dashboard-js/i18n.js +4438 -3983
- package/ccw/src/templates/dashboard-js/main.js +71 -0
- package/ccw/src/templates/dashboard-js/services.js +289 -0
- package/ccw/src/templates/dashboard-js/views/api-settings.js +5613 -3361
- package/ccw/src/templates/dashboard-js/views/claude-manager.js +1 -7
- package/ccw/src/templates/dashboard-js/views/cli-manager.js +581 -87
- package/ccw/src/templates/dashboard-js/views/codexlens-manager.js +6091 -1965
- package/ccw/src/templates/dashboard-js/views/core-memory.js +129 -20
- package/ccw/src/templates/dashboard-js/views/hook-manager.js +17 -3
- package/ccw/src/templates/dashboard-js/views/mcp-manager.js +63 -0
- package/ccw/src/templates/dashboard-js/views/project-overview.js +182 -37
- package/ccw/src/templates/dashboard-js/views/rules-manager.js +26 -3
- package/ccw/src/templates/dashboard-js/views/skills-manager.js +2 -42
- package/ccw/src/templates/dashboard.html +6 -0
- package/ccw/src/tools/README.md +29 -0
- package/ccw/src/tools/claude-cli-tools.ts +640 -125
- package/ccw/src/tools/cli-config-manager.ts +102 -172
- package/ccw/src/tools/cli-executor-core.ts +1533 -0
- package/ccw/src/tools/cli-executor-state.ts +560 -0
- package/ccw/src/tools/cli-executor-utils.ts +349 -0
- package/ccw/src/tools/cli-executor.ts +3 -2309
- package/ccw/src/tools/cli-history-store.ts +2 -0
- package/ccw/src/tools/cli-output-converter.ts +1237 -0
- package/ccw/src/tools/cli-prompt-builder.ts +487 -0
- package/ccw/src/tools/codex-lens.ts +324 -59
- package/ccw/src/tools/detect-changed-modules.ts +24 -6
- package/ccw/src/tools/index.ts +2 -0
- package/ccw/src/tools/litellm-client.ts +10 -4
- package/ccw/src/tools/litellm-executor.ts +146 -114
- package/ccw/src/tools/native-session-discovery.ts +209 -1
- package/ccw/src/tools/session-manager.ts +88 -0
- package/ccw/src/tools/skill-context-loader.ts +213 -0
- package/ccw/src/tools/smart-search.ts +427 -76
- package/ccw/src/types/cli-settings.ts +137 -0
- package/ccw/src/types/litellm-api-config.ts +55 -1
- package/ccw/src/utils/exec-constants.ts +24 -0
- package/ccw/src/utils/path-resolver.ts +49 -3
- package/ccw/src/utils/path-validator.ts +28 -6
- package/ccw/src/utils/python-utils.ts +140 -121
- package/ccw/src/utils/shell-escape.ts +30 -0
- package/ccw/src/utils/uv-manager.ts +796 -0
- package/ccw-litellm/src/ccw_litellm/__pycache__/__init__.cpython-310.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/__pycache__/__init__.cpython-312.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/clients/__pycache__/__init__.cpython-310.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/clients/__pycache__/__init__.cpython-312.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-310.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-312.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-313.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-310.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-312.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-313.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/clients/litellm_embedder.py +270 -251
- package/ccw-litellm/src/ccw_litellm/clients/litellm_llm.py +33 -0
- package/ccw-litellm/src/ccw_litellm/config/__pycache__/__init__.cpython-310.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/config/__pycache__/__init__.cpython-312.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-310.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-312.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-313.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-310.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-312.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-313.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/config/loader.py +343 -316
- package/ccw-litellm/src/ccw_litellm/config/models.py +162 -130
- package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/__init__.cpython-310.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/__init__.cpython-312.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/embedder.cpython-310.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/embedder.cpython-312.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/llm.cpython-310.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/llm.cpython-312.pyc +0 -0
- package/codex-lens/pyproject.toml +43 -0
- package/codex-lens/src/codexlens/__pycache__/__init__.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/__init__.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/__main__.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/__main__.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/config.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/config.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/config.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/entities.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/entities.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/entities.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/env_config.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/env_config.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/env_config.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/errors.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/errors.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/__init__.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/__init__.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-312.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-310.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-312.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-310.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-312.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-310.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/output.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/cli/commands.py +4416 -2295
- package/codex-lens/src/codexlens/cli/embedding_manager.py +767 -14
- package/codex-lens/src/codexlens/cli/model_manager.py +676 -0
- package/codex-lens/src/codexlens/config.py +321 -12
- package/codex-lens/src/codexlens/entities.py +4 -1
- package/codex-lens/src/codexlens/env_config.py +298 -0
- package/codex-lens/src/codexlens/indexing/__init__.py +23 -1
- package/codex-lens/src/codexlens/indexing/__pycache__/__init__.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/indexing/__pycache__/embedding.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/embedding.py +582 -0
- package/codex-lens/src/codexlens/indexing/symbol_extractor.py +62 -28
- package/codex-lens/src/codexlens/parsers/__pycache__/__init__.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/__pycache__/__init__.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-312.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-310.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/__pycache__/tokenizer.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/factory.py +139 -10
- package/codex-lens/src/codexlens/parsers/treesitter_parser.py +487 -13
- package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/binary_searcher.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-312.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__/graph_expander.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/search/binary_searcher.py +277 -0
- package/codex-lens/src/codexlens/search/chain_search.py +1642 -8
- package/codex-lens/src/codexlens/search/enrichment.py +21 -0
- package/codex-lens/src/codexlens/search/graph_expander.py +264 -0
- package/codex-lens/src/codexlens/search/hybrid_search.py +772 -37
- package/codex-lens/src/codexlens/search/ranking.py +347 -8
- package/codex-lens/src/codexlens/semantic/SPLADE_IMPLEMENTATION.md +225 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/base.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/base.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/reranker.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-312.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 +654 -0
- package/codex-lens/src/codexlens/semantic/factory.py +63 -3
- package/codex-lens/src/codexlens/semantic/gpu_support.py +19 -2
- package/codex-lens/src/codexlens/semantic/litellm_embedder.py +144 -144
- package/codex-lens/src/codexlens/semantic/reranker/__init__.py +25 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/__init__.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/__init__.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/api_reranker.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/api_reranker.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/base.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/base.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/factory.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/factory.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/fastembed_reranker.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/fastembed_reranker.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/legacy.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/legacy.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/litellm_reranker.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/onnx_reranker.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/onnx_reranker.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/api_reranker.py +403 -0
- package/codex-lens/src/codexlens/semantic/reranker/base.py +46 -0
- package/codex-lens/src/codexlens/semantic/reranker/factory.py +159 -0
- package/codex-lens/src/codexlens/semantic/reranker/fastembed_reranker.py +257 -0
- package/codex-lens/src/codexlens/semantic/reranker/legacy.py +91 -0
- package/codex-lens/src/codexlens/semantic/reranker/litellm_reranker.py +214 -0
- package/codex-lens/src/codexlens/semantic/reranker/onnx_reranker.py +268 -0
- package/codex-lens/src/codexlens/semantic/splade_encoder.py +567 -0
- package/codex-lens/src/codexlens/semantic/vector_store.py +472 -352
- package/codex-lens/src/codexlens/storage/__init__.py +3 -0
- package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/global_index.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/global_index.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/merkle_tree.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-312.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-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/sqlite_utils.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/dir_index.py +310 -12
- package/codex-lens/src/codexlens/storage/index_tree.py +194 -23
- package/codex-lens/src/codexlens/storage/merkle_tree.py +136 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_006_enhance_relationships.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_008_add_merkle_hashes.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_009_add_splade.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_010_add_multi_vector_chunks.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/migration_006_enhance_relationships.py +37 -0
- package/codex-lens/src/codexlens/storage/migrations/migration_007_add_graph_neighbors.py +47 -0
- package/codex-lens/src/codexlens/storage/migrations/migration_008_add_merkle_hashes.py +81 -0
- package/codex-lens/src/codexlens/storage/migrations/migration_009_add_splade.py +103 -0
- package/codex-lens/src/codexlens/storage/migrations/migration_010_add_multi_vector_chunks.py +162 -0
- package/codex-lens/src/codexlens/storage/splade_index.py +578 -0
- package/codex-lens/src/codexlens/storage/sqlite_store.py +508 -184
- package/codex-lens/src/codexlens/storage/vector_meta_store.py +415 -0
- package/codex-lens/src/codexlens/watcher/__init__.py +17 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/events.py +82 -0
- package/codex-lens/src/codexlens/watcher/file_watcher.py +347 -0
- package/codex-lens/src/codexlens/watcher/incremental_indexer.py +369 -0
- package/codex-lens/src/codexlens/watcher/manager.py +255 -0
- package/package.json +4 -1
- package/.claude/commands/workflow/docs/analyze.md +0 -1467
- package/.claude/commands/workflow/docs/copyright.md +0 -1265
- package/.claude/skills/command-guide/SKILL.md +0 -388
- package/.claude/skills/command-guide/UPDATE-GUIDELINE.md +0 -592
- package/.claude/skills/command-guide/guides/cli-tools-guide.md +0 -410
- package/.claude/skills/command-guide/guides/examples.md +0 -537
- package/.claude/skills/command-guide/guides/getting-started.md +0 -242
- package/.claude/skills/command-guide/guides/implementation-details.md +0 -1010
- package/.claude/skills/command-guide/guides/index-structure.md +0 -326
- package/.claude/skills/command-guide/guides/troubleshooting.md +0 -92
- package/.claude/skills/command-guide/guides/ui-design-workflow-guide.md +0 -316
- package/.claude/skills/command-guide/guides/workflow-patterns.md +0 -662
- package/.claude/skills/command-guide/reference/agents/action-planning-agent.md +0 -855
- package/.claude/skills/command-guide/reference/agents/cli-execution-agent.md +0 -267
- package/.claude/skills/command-guide/reference/agents/cli-explore-agent.md +0 -182
- package/.claude/skills/command-guide/reference/agents/cli-lite-planning-agent.md +0 -446
- package/.claude/skills/command-guide/reference/agents/cli-planning-agent.md +0 -558
- package/.claude/skills/command-guide/reference/agents/code-developer.md +0 -311
- package/.claude/skills/command-guide/reference/agents/conceptual-planning-agent.md +0 -308
- package/.claude/skills/command-guide/reference/agents/context-search-agent.md +0 -581
- package/.claude/skills/command-guide/reference/agents/doc-generator.md +0 -330
- package/.claude/skills/command-guide/reference/agents/memory-bridge.md +0 -94
- package/.claude/skills/command-guide/reference/agents/test-context-search-agent.md +0 -400
- package/.claude/skills/command-guide/reference/agents/test-fix-agent.md +0 -344
- package/.claude/skills/command-guide/reference/agents/ui-design-agent.md +0 -593
- package/.claude/skills/command-guide/reference/agents/universal-executor.md +0 -131
- package/.claude/skills/command-guide/reference/commands/cli/cli-init.md +0 -440
- package/.claude/skills/command-guide/reference/commands/enhance-prompt.md +0 -93
- package/.claude/skills/command-guide/reference/commands/memory/code-map-memory.md +0 -687
- package/.claude/skills/command-guide/reference/commands/memory/docs-full-cli.md +0 -471
- package/.claude/skills/command-guide/reference/commands/memory/docs-related-cli.md +0 -386
- package/.claude/skills/command-guide/reference/commands/memory/docs.md +0 -616
- package/.claude/skills/command-guide/reference/commands/memory/load-skill-memory.md +0 -182
- package/.claude/skills/command-guide/reference/commands/memory/load.md +0 -240
- package/.claude/skills/command-guide/reference/commands/memory/skill-memory.md +0 -525
- package/.claude/skills/command-guide/reference/commands/memory/style-skill-memory.md +0 -396
- package/.claude/skills/command-guide/reference/commands/memory/tech-research.md +0 -314
- package/.claude/skills/command-guide/reference/commands/memory/update-full.md +0 -332
- package/.claude/skills/command-guide/reference/commands/memory/update-related.md +0 -332
- package/.claude/skills/command-guide/reference/commands/memory/workflow-skill-memory.md +0 -517
- package/.claude/skills/command-guide/reference/commands/task/breakdown.md +0 -204
- package/.claude/skills/command-guide/reference/commands/task/create.md +0 -152
- package/.claude/skills/command-guide/reference/commands/task/execute.md +0 -270
- package/.claude/skills/command-guide/reference/commands/task/replan.md +0 -437
- package/.claude/skills/command-guide/reference/commands/version.md +0 -254
- package/.claude/skills/command-guide/reference/commands/workflow/action-plan-verify.md +0 -447
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/api-designer.md +0 -585
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/artifacts.md +0 -452
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/auto-parallel.md +0 -443
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/data-architect.md +0 -220
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-manager.md +0 -200
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-owner.md +0 -200
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/scrum-master.md +0 -200
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/subject-matter-expert.md +0 -200
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/synthesis.md +0 -398
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/system-architect.md +0 -387
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ui-designer.md +0 -221
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ux-expert.md +0 -221
- package/.claude/skills/command-guide/reference/commands/workflow/execute.md +0 -465
- package/.claude/skills/command-guide/reference/commands/workflow/init.md +0 -164
- package/.claude/skills/command-guide/reference/commands/workflow/lite-execute.md +0 -748
- package/.claude/skills/command-guide/reference/commands/workflow/lite-fix.md +0 -664
- package/.claude/skills/command-guide/reference/commands/workflow/lite-plan.md +0 -645
- package/.claude/skills/command-guide/reference/commands/workflow/plan.md +0 -551
- package/.claude/skills/command-guide/reference/commands/workflow/replan.md +0 -515
- package/.claude/skills/command-guide/reference/commands/workflow/review-fix.md +0 -606
- package/.claude/skills/command-guide/reference/commands/workflow/review-module-cycle.md +0 -765
- package/.claude/skills/command-guide/reference/commands/workflow/review-session-cycle.md +0 -776
- package/.claude/skills/command-guide/reference/commands/workflow/review.md +0 -298
- package/.claude/skills/command-guide/reference/commands/workflow/session/complete.md +0 -547
- package/.claude/skills/command-guide/reference/commands/workflow/session/list.md +0 -114
- package/.claude/skills/command-guide/reference/commands/workflow/session/resume.md +0 -77
- package/.claude/skills/command-guide/reference/commands/workflow/session/start.md +0 -257
- package/.claude/skills/command-guide/reference/commands/workflow/tdd-plan.md +0 -460
- package/.claude/skills/command-guide/reference/commands/workflow/tdd-verify.md +0 -400
- package/.claude/skills/command-guide/reference/commands/workflow/test-cycle-execute.md +0 -498
- package/.claude/skills/command-guide/reference/commands/workflow/test-fix-gen.md +0 -699
- package/.claude/skills/command-guide/reference/commands/workflow/test-gen.md +0 -529
- package/.claude/skills/command-guide/reference/commands/workflow/tools/conflict-resolution.md +0 -766
- package/.claude/skills/command-guide/reference/commands/workflow/tools/context-gather.md +0 -433
- package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-agent.md +0 -487
- package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-tdd.md +0 -518
- package/.claude/skills/command-guide/reference/commands/workflow/tools/tdd-coverage-analysis.md +0 -309
- package/.claude/skills/command-guide/reference/commands/workflow/tools/test-concept-enhanced.md +0 -163
- package/.claude/skills/command-guide/reference/commands/workflow/tools/test-context-gather.md +0 -232
- package/.claude/skills/command-guide/reference/commands/workflow/tools/test-task-generate.md +0 -254
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/animation-extract.md +0 -1150
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/codify-style.md +0 -652
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/design-sync.md +0 -454
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/explore-auto.md +0 -678
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/generate.md +0 -504
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/imitate-auto.md +0 -745
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/import-from-code.md +0 -537
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/layout-extract.md +0 -788
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/reference-page-generator.md +0 -356
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/style-extract.md +0 -773
- package/.claude/skills/command-guide/scripts/analyze_commands.py +0 -502
- package/.claude/skills/command-guide/scripts/update-index.sh +0 -130
- package/.claude/skills/command-guide/templates/issue-bug.md +0 -104
- package/.claude/skills/command-guide/templates/issue-diagnosis.md +0 -275
- package/.claude/skills/command-guide/templates/issue-feature.md +0 -97
- package/.claude/skills/command-guide/templates/issue-question.md +0 -141
|
@@ -2,16 +2,19 @@
|
|
|
2
2
|
* Smart Search Tool - Unified intelligent search with CodexLens integration
|
|
3
3
|
*
|
|
4
4
|
* Features:
|
|
5
|
-
* -
|
|
6
|
-
* -
|
|
5
|
+
* - Fuzzy mode: FTS + ripgrep fusion with RRF ranking (default)
|
|
6
|
+
* - Semantic mode: Dense coarse retrieval + cross-encoder reranking
|
|
7
|
+
* - CodexLens integration (init, dense_rerank, fts)
|
|
7
8
|
* - Ripgrep fallback for exact mode
|
|
8
9
|
* - Index status checking and warnings
|
|
9
10
|
* - Multi-backend search routing with RRF ranking
|
|
10
11
|
*
|
|
11
12
|
* Actions:
|
|
12
13
|
* - init: Initialize CodexLens index
|
|
13
|
-
* - search: Intelligent search with
|
|
14
|
+
* - search: Intelligent search with fuzzy (default) or semantic mode
|
|
14
15
|
* - status: Check index status
|
|
16
|
+
* - update: Incremental index update for changed files
|
|
17
|
+
* - watch: Start file watcher for automatic updates
|
|
15
18
|
*/
|
|
16
19
|
|
|
17
20
|
import { z } from 'zod';
|
|
@@ -23,6 +26,7 @@ import {
|
|
|
23
26
|
} from './codex-lens.js';
|
|
24
27
|
import type { ProgressInfo } from './codex-lens.js';
|
|
25
28
|
import { getProjectRoot } from '../utils/path-validator.js';
|
|
29
|
+
import { EXEC_TIMEOUTS } from '../utils/exec-constants.js';
|
|
26
30
|
|
|
27
31
|
// Timing utilities for performance analysis
|
|
28
32
|
const TIMING_ENABLED = process.env.SMART_SEARCH_TIMING === '1' || process.env.DEBUG?.includes('timing');
|
|
@@ -59,12 +63,13 @@ function createTimer(): { mark: (name: string) => void; getTimings: () => Timing
|
|
|
59
63
|
|
|
60
64
|
// Define Zod schema for validation
|
|
61
65
|
const ParamsSchema = z.object({
|
|
62
|
-
// Action: search (content), find_files (path/name pattern), init, status
|
|
66
|
+
// Action: search (content), find_files (path/name pattern), init, init_force, status, update (incremental), watch
|
|
63
67
|
// Note: search_files is deprecated, use search with output_mode='files_only'
|
|
64
|
-
|
|
68
|
+
// init: incremental index (skip existing), init_force: force full rebuild (delete and recreate)
|
|
69
|
+
action: z.enum(['init', 'init_force', 'search', 'search_files', 'find_files', 'status', 'update', 'watch']).default('search'),
|
|
65
70
|
query: z.string().optional().describe('Content search query (for action="search")'),
|
|
66
71
|
pattern: z.string().optional().describe('Glob pattern for path matching (for action="find_files")'),
|
|
67
|
-
mode: z.enum(['
|
|
72
|
+
mode: z.enum(['fuzzy', 'semantic']).default('fuzzy'),
|
|
68
73
|
output_mode: z.enum(['full', 'files_only', 'count']).default('full'),
|
|
69
74
|
path: z.string().optional(),
|
|
70
75
|
paths: z.array(z.string()).default([]),
|
|
@@ -81,16 +86,19 @@ const ParamsSchema = z.object({
|
|
|
81
86
|
regex: z.boolean().default(true), // Use regex pattern matching (default: enabled)
|
|
82
87
|
caseSensitive: z.boolean().default(true), // Case sensitivity (default: case-sensitive)
|
|
83
88
|
tokenize: z.boolean().default(true), // Tokenize multi-word queries for OR matching (default: enabled)
|
|
84
|
-
// File type filtering
|
|
89
|
+
// File type filtering (default: code only)
|
|
85
90
|
excludeExtensions: z.array(z.string()).optional().describe('File extensions to exclude from results (e.g., ["md", "txt"])'),
|
|
86
|
-
codeOnly: z.boolean().default(
|
|
91
|
+
codeOnly: z.boolean().default(true).describe('Only return code files (excludes md, txt, json, yaml, xml, etc.). Default: true'),
|
|
92
|
+
withDoc: z.boolean().default(false).describe('Include documentation files (md, txt, rst, etc.). Overrides codeOnly when true'),
|
|
93
|
+
// Watcher options
|
|
94
|
+
debounce: z.number().default(1000).describe('Debounce interval in ms for watch action'),
|
|
87
95
|
// Fuzzy matching is implicit in hybrid mode (RRF fusion)
|
|
88
96
|
});
|
|
89
97
|
|
|
90
98
|
type Params = z.infer<typeof ParamsSchema>;
|
|
91
99
|
|
|
92
100
|
// Search mode constants
|
|
93
|
-
const SEARCH_MODES = ['
|
|
101
|
+
const SEARCH_MODES = ['fuzzy', 'semantic'] as const;
|
|
94
102
|
|
|
95
103
|
// Classification confidence threshold
|
|
96
104
|
const CONFIDENCE_THRESHOLD = 0.7;
|
|
@@ -325,6 +333,17 @@ interface ModelInfo {
|
|
|
325
333
|
updated_at?: string;
|
|
326
334
|
}
|
|
327
335
|
|
|
336
|
+
interface CodexLensConfig {
|
|
337
|
+
config_file?: string;
|
|
338
|
+
index_dir?: string;
|
|
339
|
+
embedding_backend?: string; // 'fastembed' (local) or 'litellm' (api)
|
|
340
|
+
embedding_model?: string;
|
|
341
|
+
reranker_enabled?: boolean;
|
|
342
|
+
reranker_backend?: string; // 'onnx' (local) or 'api'
|
|
343
|
+
reranker_model?: string;
|
|
344
|
+
reranker_top_k?: number;
|
|
345
|
+
}
|
|
346
|
+
|
|
328
347
|
interface IndexStatus {
|
|
329
348
|
indexed: boolean;
|
|
330
349
|
has_embeddings: boolean;
|
|
@@ -332,6 +351,7 @@ interface IndexStatus {
|
|
|
332
351
|
embeddings_coverage_percent?: number;
|
|
333
352
|
total_chunks?: number;
|
|
334
353
|
model_info?: ModelInfo | null;
|
|
354
|
+
config?: CodexLensConfig | null;
|
|
335
355
|
warning?: string;
|
|
336
356
|
}
|
|
337
357
|
|
|
@@ -385,12 +405,39 @@ function splitResultsWithExtraFiles<T extends { file: string }>(
|
|
|
385
405
|
*/
|
|
386
406
|
async function checkIndexStatus(path: string = '.'): Promise<IndexStatus> {
|
|
387
407
|
try {
|
|
388
|
-
|
|
408
|
+
// Fetch both status and config in parallel
|
|
409
|
+
const [statusResult, configResult] = await Promise.all([
|
|
410
|
+
executeCodexLens(['status', '--json'], { cwd: path }),
|
|
411
|
+
executeCodexLens(['config', 'show', '--json'], { cwd: path }),
|
|
412
|
+
]);
|
|
413
|
+
|
|
414
|
+
// Parse config
|
|
415
|
+
let config: CodexLensConfig | null = null;
|
|
416
|
+
if (configResult.success && configResult.output) {
|
|
417
|
+
try {
|
|
418
|
+
const cleanConfigOutput = stripAnsi(configResult.output);
|
|
419
|
+
const parsedConfig = JSON.parse(cleanConfigOutput);
|
|
420
|
+
const configData = parsedConfig.result || parsedConfig;
|
|
421
|
+
config = {
|
|
422
|
+
config_file: configData.config_file,
|
|
423
|
+
index_dir: configData.index_dir,
|
|
424
|
+
embedding_backend: configData.embedding_backend,
|
|
425
|
+
embedding_model: configData.embedding_model,
|
|
426
|
+
reranker_enabled: configData.reranker_enabled,
|
|
427
|
+
reranker_backend: configData.reranker_backend,
|
|
428
|
+
reranker_model: configData.reranker_model,
|
|
429
|
+
reranker_top_k: configData.reranker_top_k,
|
|
430
|
+
};
|
|
431
|
+
} catch {
|
|
432
|
+
// Config parse failed, continue without it
|
|
433
|
+
}
|
|
434
|
+
}
|
|
389
435
|
|
|
390
|
-
if (!
|
|
436
|
+
if (!statusResult.success) {
|
|
391
437
|
return {
|
|
392
438
|
indexed: false,
|
|
393
439
|
has_embeddings: false,
|
|
440
|
+
config,
|
|
394
441
|
warning: 'No CodexLens index found. Run smart_search(action="init") to create index for better search results.',
|
|
395
442
|
};
|
|
396
443
|
}
|
|
@@ -398,7 +445,7 @@ async function checkIndexStatus(path: string = '.'): Promise<IndexStatus> {
|
|
|
398
445
|
// Parse status output
|
|
399
446
|
try {
|
|
400
447
|
// Strip ANSI color codes from JSON output
|
|
401
|
-
const cleanOutput = stripAnsi(
|
|
448
|
+
const cleanOutput = stripAnsi(statusResult.output || '{}');
|
|
402
449
|
const parsed = JSON.parse(cleanOutput);
|
|
403
450
|
// Handle both direct and nested response formats (status returns {success, result: {...}})
|
|
404
451
|
const status = parsed.result || parsed;
|
|
@@ -438,12 +485,14 @@ async function checkIndexStatus(path: string = '.'): Promise<IndexStatus> {
|
|
|
438
485
|
total_chunks: totalChunks,
|
|
439
486
|
// Ensure model_info is null instead of undefined so it's included in JSON
|
|
440
487
|
model_info: modelInfo ?? null,
|
|
488
|
+
config,
|
|
441
489
|
warning,
|
|
442
490
|
};
|
|
443
491
|
} catch {
|
|
444
492
|
return {
|
|
445
493
|
indexed: false,
|
|
446
494
|
has_embeddings: false,
|
|
495
|
+
config,
|
|
447
496
|
warning: 'Failed to parse index status',
|
|
448
497
|
};
|
|
449
498
|
}
|
|
@@ -555,7 +604,7 @@ function checkToolAvailability(toolName: string): boolean {
|
|
|
555
604
|
try {
|
|
556
605
|
const isWindows = process.platform === 'win32';
|
|
557
606
|
const command = isWindows ? 'where' : 'which';
|
|
558
|
-
execSync(`${command} ${toolName}`, { stdio: 'ignore' });
|
|
607
|
+
execSync(`${command} ${toolName}`, { stdio: 'ignore', timeout: EXEC_TIMEOUTS.SYSTEM_INFO });
|
|
559
608
|
return true;
|
|
560
609
|
} catch {
|
|
561
610
|
return false;
|
|
@@ -640,8 +689,10 @@ function buildRipgrepCommand(params: {
|
|
|
640
689
|
/**
|
|
641
690
|
* Action: init - Initialize CodexLens index (FTS only, no embeddings)
|
|
642
691
|
* For semantic/vector search, use ccw view dashboard or codexlens CLI directly
|
|
692
|
+
* @param params - Search parameters
|
|
693
|
+
* @param force - If true, force full rebuild (delete existing index first)
|
|
643
694
|
*/
|
|
644
|
-
async function executeInitAction(params: Params): Promise<SearchResult> {
|
|
695
|
+
async function executeInitAction(params: Params, force: boolean = false): Promise<SearchResult> {
|
|
645
696
|
const { path = '.', languages } = params;
|
|
646
697
|
|
|
647
698
|
// Check CodexLens availability
|
|
@@ -654,9 +705,13 @@ async function executeInitAction(params: Params): Promise<SearchResult> {
|
|
|
654
705
|
}
|
|
655
706
|
|
|
656
707
|
// Build args with --no-embeddings for FTS-only index (faster)
|
|
657
|
-
|
|
708
|
+
// Use 'index init' subcommand (new CLI structure)
|
|
709
|
+
const args = ['index', 'init', path, '--no-embeddings'];
|
|
710
|
+
if (force) {
|
|
711
|
+
args.push('--force'); // Force full rebuild
|
|
712
|
+
}
|
|
658
713
|
if (languages && languages.length > 0) {
|
|
659
|
-
args.push('--
|
|
714
|
+
args.push('--language', languages.join(','));
|
|
660
715
|
}
|
|
661
716
|
|
|
662
717
|
// Track progress updates
|
|
@@ -674,7 +729,7 @@ async function executeInitAction(params: Params): Promise<SearchResult> {
|
|
|
674
729
|
|
|
675
730
|
// Build metadata with progress info
|
|
676
731
|
const metadata: SearchMetadata = {
|
|
677
|
-
action: 'init',
|
|
732
|
+
action: force ? 'init_force' : 'init',
|
|
678
733
|
path,
|
|
679
734
|
};
|
|
680
735
|
|
|
@@ -693,8 +748,9 @@ async function executeInitAction(params: Params): Promise<SearchResult> {
|
|
|
693
748
|
metadata.progressHistory = progressUpdates.slice(-5); // Keep last 5 progress updates
|
|
694
749
|
}
|
|
695
750
|
|
|
751
|
+
const actionLabel = force ? 'rebuilt (force)' : 'created';
|
|
696
752
|
const successMessage = result.success
|
|
697
|
-
? `FTS index
|
|
753
|
+
? `FTS index ${actionLabel} for ${path}. Note: For semantic/vector search, create vector index via "ccw view" dashboard or run "codexlens init ${path}" (without --no-embeddings).`
|
|
698
754
|
: undefined;
|
|
699
755
|
|
|
700
756
|
return {
|
|
@@ -713,10 +769,260 @@ async function executeStatusAction(params: Params): Promise<SearchResult> {
|
|
|
713
769
|
|
|
714
770
|
const indexStatus = await checkIndexStatus(path);
|
|
715
771
|
|
|
772
|
+
// Build detailed status message
|
|
773
|
+
const statusParts: string[] = [];
|
|
774
|
+
|
|
775
|
+
// Index status
|
|
776
|
+
statusParts.push(`Index: ${indexStatus.indexed ? 'indexed' : 'not indexed'}`);
|
|
777
|
+
if (indexStatus.file_count) {
|
|
778
|
+
statusParts.push(`Files: ${indexStatus.file_count}`);
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
// Embeddings status
|
|
782
|
+
if (indexStatus.embeddings_coverage_percent !== undefined) {
|
|
783
|
+
statusParts.push(`Embeddings: ${indexStatus.embeddings_coverage_percent.toFixed(1)}%`);
|
|
784
|
+
}
|
|
785
|
+
if (indexStatus.total_chunks) {
|
|
786
|
+
statusParts.push(`Chunks: ${indexStatus.total_chunks}`);
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
// Config summary
|
|
790
|
+
if (indexStatus.config) {
|
|
791
|
+
const cfg = indexStatus.config;
|
|
792
|
+
// Embedding backend info
|
|
793
|
+
const embeddingType = cfg.embedding_backend === 'litellm' ? 'API' : 'Local';
|
|
794
|
+
statusParts.push(`Embedding: ${embeddingType} (${cfg.embedding_model || 'default'})`);
|
|
795
|
+
|
|
796
|
+
// Reranker info
|
|
797
|
+
if (cfg.reranker_enabled) {
|
|
798
|
+
const rerankerType = cfg.reranker_backend === 'onnx' ? 'Local' : 'API';
|
|
799
|
+
statusParts.push(`Reranker: ${rerankerType} (${cfg.reranker_model || 'default'})`);
|
|
800
|
+
} else {
|
|
801
|
+
statusParts.push('Reranker: disabled');
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
|
|
716
805
|
return {
|
|
717
806
|
success: true,
|
|
718
807
|
status: indexStatus,
|
|
719
|
-
message: indexStatus.warning ||
|
|
808
|
+
message: indexStatus.warning || statusParts.join(' | '),
|
|
809
|
+
};
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
/**
|
|
813
|
+
* Action: update - Incremental index update
|
|
814
|
+
* Updates index for changed files without full rebuild
|
|
815
|
+
*/
|
|
816
|
+
async function executeUpdateAction(params: Params): Promise<SearchResult> {
|
|
817
|
+
const { path = '.', languages } = params;
|
|
818
|
+
|
|
819
|
+
// Check CodexLens availability
|
|
820
|
+
const readyStatus = await ensureCodexLensReady();
|
|
821
|
+
if (!readyStatus.ready) {
|
|
822
|
+
return {
|
|
823
|
+
success: false,
|
|
824
|
+
error: `CodexLens not available: ${readyStatus.error}`,
|
|
825
|
+
};
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
// Check if index exists first
|
|
829
|
+
const indexStatus = await checkIndexStatus(path);
|
|
830
|
+
if (!indexStatus.indexed) {
|
|
831
|
+
return {
|
|
832
|
+
success: false,
|
|
833
|
+
error: `Directory not indexed. Run smart_search(action="init") first.`,
|
|
834
|
+
};
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
// Build args for incremental init (without --force)
|
|
838
|
+
// Use 'index init' subcommand (new CLI structure)
|
|
839
|
+
const args = ['index', 'init', path];
|
|
840
|
+
if (languages && languages.length > 0) {
|
|
841
|
+
args.push('--language', languages.join(','));
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
// Track progress updates
|
|
845
|
+
const progressUpdates: ProgressInfo[] = [];
|
|
846
|
+
let lastProgress: ProgressInfo | null = null;
|
|
847
|
+
|
|
848
|
+
const result = await executeCodexLens(args, {
|
|
849
|
+
cwd: path,
|
|
850
|
+
timeout: 600000, // 10 minutes for incremental updates
|
|
851
|
+
onProgress: (progress: ProgressInfo) => {
|
|
852
|
+
progressUpdates.push(progress);
|
|
853
|
+
lastProgress = progress;
|
|
854
|
+
},
|
|
855
|
+
});
|
|
856
|
+
|
|
857
|
+
// Build metadata with progress info
|
|
858
|
+
const metadata: SearchMetadata = {
|
|
859
|
+
action: 'update',
|
|
860
|
+
path,
|
|
861
|
+
};
|
|
862
|
+
|
|
863
|
+
if (lastProgress !== null) {
|
|
864
|
+
const p = lastProgress as ProgressInfo;
|
|
865
|
+
metadata.progress = {
|
|
866
|
+
stage: p.stage,
|
|
867
|
+
message: p.message,
|
|
868
|
+
percent: p.percent,
|
|
869
|
+
filesProcessed: p.filesProcessed,
|
|
870
|
+
totalFiles: p.totalFiles,
|
|
871
|
+
};
|
|
872
|
+
}
|
|
873
|
+
|
|
874
|
+
if (progressUpdates.length > 0) {
|
|
875
|
+
metadata.progressHistory = progressUpdates.slice(-5);
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
return {
|
|
879
|
+
success: result.success,
|
|
880
|
+
error: result.error,
|
|
881
|
+
message: result.success
|
|
882
|
+
? `Incremental update completed for ${path}`
|
|
883
|
+
: undefined,
|
|
884
|
+
metadata,
|
|
885
|
+
};
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
/**
|
|
889
|
+
* Action: watch - Start file watcher for automatic incremental updates
|
|
890
|
+
* Note: This starts a background process, returns immediately with status
|
|
891
|
+
*/
|
|
892
|
+
async function executeWatchAction(params: Params): Promise<SearchResult> {
|
|
893
|
+
const { path = '.', languages, debounce = 1000 } = params;
|
|
894
|
+
|
|
895
|
+
// Check CodexLens availability
|
|
896
|
+
const readyStatus = await ensureCodexLensReady();
|
|
897
|
+
if (!readyStatus.ready) {
|
|
898
|
+
return {
|
|
899
|
+
success: false,
|
|
900
|
+
error: `CodexLens not available: ${readyStatus.error}`,
|
|
901
|
+
};
|
|
902
|
+
}
|
|
903
|
+
|
|
904
|
+
// Check if index exists first
|
|
905
|
+
const indexStatus = await checkIndexStatus(path);
|
|
906
|
+
if (!indexStatus.indexed) {
|
|
907
|
+
return {
|
|
908
|
+
success: false,
|
|
909
|
+
error: `Directory not indexed. Run smart_search(action="init") first.`,
|
|
910
|
+
};
|
|
911
|
+
}
|
|
912
|
+
|
|
913
|
+
// Build args for watch command
|
|
914
|
+
const args = ['watch', path, '--debounce', debounce.toString()];
|
|
915
|
+
if (languages && languages.length > 0) {
|
|
916
|
+
args.push('--language', languages.join(','));
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
// Start watcher in background (non-blocking)
|
|
920
|
+
// Note: The watcher runs until manually stopped
|
|
921
|
+
const result = await executeCodexLens(args, {
|
|
922
|
+
cwd: path,
|
|
923
|
+
timeout: 5000, // Short timeout for initial startup check
|
|
924
|
+
});
|
|
925
|
+
|
|
926
|
+
return {
|
|
927
|
+
success: true,
|
|
928
|
+
message: `File watcher started for ${path}. Use Ctrl+C or kill the process to stop.`,
|
|
929
|
+
metadata: {
|
|
930
|
+
action: 'watch',
|
|
931
|
+
path,
|
|
932
|
+
note: 'Watcher runs in background. Changes are indexed automatically with debounce.',
|
|
933
|
+
},
|
|
934
|
+
};
|
|
935
|
+
}
|
|
936
|
+
|
|
937
|
+
/**
|
|
938
|
+
* Mode: fuzzy - FTS + ripgrep fusion with RRF ranking
|
|
939
|
+
* Runs both exact (FTS) and ripgrep searches in parallel, merges and ranks results
|
|
940
|
+
*/
|
|
941
|
+
async function executeFuzzyMode(params: Params): Promise<SearchResult> {
|
|
942
|
+
const { query, path = '.', maxResults = 5, extraFilesCount = 10, codeOnly = true, withDoc = false, excludeExtensions } = params;
|
|
943
|
+
// withDoc overrides codeOnly
|
|
944
|
+
const effectiveCodeOnly = withDoc ? false : codeOnly;
|
|
945
|
+
|
|
946
|
+
if (!query) {
|
|
947
|
+
return {
|
|
948
|
+
success: false,
|
|
949
|
+
error: 'Query is required for search',
|
|
950
|
+
};
|
|
951
|
+
}
|
|
952
|
+
|
|
953
|
+
const timer = createTimer();
|
|
954
|
+
|
|
955
|
+
// Run both searches in parallel
|
|
956
|
+
const [ftsResult, ripgrepResult] = await Promise.allSettled([
|
|
957
|
+
executeCodexLensExactMode(params),
|
|
958
|
+
executeRipgrepMode(params),
|
|
959
|
+
]);
|
|
960
|
+
timer.mark('parallel_search');
|
|
961
|
+
|
|
962
|
+
// Collect results from both sources
|
|
963
|
+
const resultsMap = new Map<string, any[]>();
|
|
964
|
+
|
|
965
|
+
// Add FTS results if successful
|
|
966
|
+
if (ftsResult.status === 'fulfilled' && ftsResult.value.success && ftsResult.value.results) {
|
|
967
|
+
resultsMap.set('exact', ftsResult.value.results as any[]);
|
|
968
|
+
}
|
|
969
|
+
|
|
970
|
+
// Add ripgrep results if successful
|
|
971
|
+
if (ripgrepResult.status === 'fulfilled' && ripgrepResult.value.success && ripgrepResult.value.results) {
|
|
972
|
+
resultsMap.set('ripgrep', ripgrepResult.value.results as any[]);
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
// If both failed, return error
|
|
976
|
+
if (resultsMap.size === 0) {
|
|
977
|
+
const errors: string[] = [];
|
|
978
|
+
if (ftsResult.status === 'rejected') errors.push(`FTS: ${ftsResult.reason}`);
|
|
979
|
+
if (ripgrepResult.status === 'rejected') errors.push(`Ripgrep: ${ripgrepResult.reason}`);
|
|
980
|
+
return {
|
|
981
|
+
success: false,
|
|
982
|
+
error: `Both search backends failed: ${errors.join('; ')}`,
|
|
983
|
+
};
|
|
984
|
+
}
|
|
985
|
+
|
|
986
|
+
// Apply RRF fusion with fuzzy-optimized weights
|
|
987
|
+
// Fuzzy mode: balanced between exact and ripgrep
|
|
988
|
+
const fusionWeights = { exact: 0.5, ripgrep: 0.5 };
|
|
989
|
+
const totalToFetch = maxResults + extraFilesCount;
|
|
990
|
+
const fusedResults = applyRRFFusion(resultsMap, fusionWeights, totalToFetch);
|
|
991
|
+
timer.mark('rrf_fusion');
|
|
992
|
+
|
|
993
|
+
// Apply code-only and extension filtering after fusion
|
|
994
|
+
const filteredFusedResults = filterNoisyFiles(fusedResults as any[], { codeOnly: effectiveCodeOnly, excludeExtensions });
|
|
995
|
+
|
|
996
|
+
// Normalize results format
|
|
997
|
+
const normalizedResults = filteredFusedResults.map((item: any) => ({
|
|
998
|
+
file: item.file || item.path,
|
|
999
|
+
line: item.line || 0,
|
|
1000
|
+
column: item.column || 0,
|
|
1001
|
+
content: item.content || '',
|
|
1002
|
+
score: item.fusion_score || 0,
|
|
1003
|
+
matchCount: item.matchCount,
|
|
1004
|
+
matchScore: item.matchScore,
|
|
1005
|
+
}));
|
|
1006
|
+
|
|
1007
|
+
// Split results: first N with full content, rest as file paths only
|
|
1008
|
+
const { results, extra_files } = splitResultsWithExtraFiles(normalizedResults, maxResults, extraFilesCount);
|
|
1009
|
+
|
|
1010
|
+
// Log timing
|
|
1011
|
+
timer.log();
|
|
1012
|
+
const timings = timer.getTimings();
|
|
1013
|
+
|
|
1014
|
+
return {
|
|
1015
|
+
success: true,
|
|
1016
|
+
results,
|
|
1017
|
+
extra_files: extra_files.length > 0 ? extra_files : undefined,
|
|
1018
|
+
metadata: {
|
|
1019
|
+
mode: 'fuzzy',
|
|
1020
|
+
backend: 'fts+ripgrep',
|
|
1021
|
+
count: results.length,
|
|
1022
|
+
query,
|
|
1023
|
+
note: `Fuzzy search using RRF fusion of FTS and ripgrep (weights: exact=${fusionWeights.exact}, ripgrep=${fusionWeights.ripgrep})`,
|
|
1024
|
+
timing: TIMING_ENABLED ? timings : undefined,
|
|
1025
|
+
},
|
|
720
1026
|
};
|
|
721
1027
|
}
|
|
722
1028
|
|
|
@@ -791,7 +1097,9 @@ async function executeAutoMode(params: Params): Promise<SearchResult> {
|
|
|
791
1097
|
* Supports tokenized multi-word queries with OR matching and result ranking
|
|
792
1098
|
*/
|
|
793
1099
|
async function executeRipgrepMode(params: Params): Promise<SearchResult> {
|
|
794
|
-
const { query, paths = [], contextLines = 0, maxResults = 5, extraFilesCount = 10, maxContentLength = 200, includeHidden = false, path = '.', regex = true, caseSensitive = true, tokenize = true } = params;
|
|
1100
|
+
const { query, paths = [], contextLines = 0, maxResults = 5, extraFilesCount = 10, maxContentLength = 200, includeHidden = false, path = '.', regex = true, caseSensitive = true, tokenize = true, codeOnly = true, withDoc = false, excludeExtensions } = params;
|
|
1101
|
+
// withDoc overrides codeOnly
|
|
1102
|
+
const effectiveCodeOnly = withDoc ? false : codeOnly;
|
|
795
1103
|
|
|
796
1104
|
if (!query) {
|
|
797
1105
|
return {
|
|
@@ -816,8 +1124,8 @@ async function executeRipgrepMode(params: Params): Promise<SearchResult> {
|
|
|
816
1124
|
};
|
|
817
1125
|
}
|
|
818
1126
|
|
|
819
|
-
// Use CodexLens
|
|
820
|
-
const args = ['search', query, '--limit', totalToFetch.toString(), '--
|
|
1127
|
+
// Use CodexLens fts mode as fallback
|
|
1128
|
+
const args = ['search', query, '--limit', totalToFetch.toString(), '--method', 'fts', '--json'];
|
|
821
1129
|
const result = await executeCodexLens(args, { cwd: path });
|
|
822
1130
|
|
|
823
1131
|
if (!result.success) {
|
|
@@ -936,9 +1244,12 @@ async function executeRipgrepMode(params: Params): Promise<SearchResult> {
|
|
|
936
1244
|
// Results matching more tokens are ranked higher (exact matches first)
|
|
937
1245
|
const scoredResults = tokens.length > 1 ? scoreByTokenMatch(allResults, tokens) : allResults;
|
|
938
1246
|
|
|
939
|
-
|
|
1247
|
+
// Apply code-only and extension filtering
|
|
1248
|
+
const filteredResults = filterNoisyFiles(scoredResults as any[], { codeOnly: effectiveCodeOnly, excludeExtensions });
|
|
1249
|
+
|
|
1250
|
+
if (code === 0 || code === 1 || (isWindowsDeviceError && filteredResults.length > 0)) {
|
|
940
1251
|
// Split results: first N with full content, rest as file paths only
|
|
941
|
-
const { results, extra_files } = splitResultsWithExtraFiles(
|
|
1252
|
+
const { results, extra_files } = splitResultsWithExtraFiles(filteredResults, maxResults, extraFilesCount);
|
|
942
1253
|
|
|
943
1254
|
// Build warning message for various conditions
|
|
944
1255
|
const warnings: string[] = [];
|
|
@@ -1000,7 +1311,9 @@ async function executeRipgrepMode(params: Params): Promise<SearchResult> {
|
|
|
1000
1311
|
* Requires index
|
|
1001
1312
|
*/
|
|
1002
1313
|
async function executeCodexLensExactMode(params: Params): Promise<SearchResult> {
|
|
1003
|
-
const { query, path = '.', maxResults = 5, extraFilesCount = 10, maxContentLength = 200, enrich = false } = params;
|
|
1314
|
+
const { query, path = '.', maxResults = 5, extraFilesCount = 10, maxContentLength = 200, enrich = false, excludeExtensions, codeOnly = true, withDoc = false, offset = 0 } = params;
|
|
1315
|
+
// withDoc overrides codeOnly
|
|
1316
|
+
const effectiveCodeOnly = withDoc ? false : codeOnly;
|
|
1004
1317
|
|
|
1005
1318
|
if (!query) {
|
|
1006
1319
|
return {
|
|
@@ -1023,10 +1336,18 @@ async function executeCodexLensExactMode(params: Params): Promise<SearchResult>
|
|
|
1023
1336
|
|
|
1024
1337
|
// Request more results to support split (full content + extra files)
|
|
1025
1338
|
const totalToFetch = maxResults + extraFilesCount;
|
|
1026
|
-
const args = ['search', query, '--limit', totalToFetch.toString(), '--
|
|
1339
|
+
const args = ['search', query, '--limit', totalToFetch.toString(), '--offset', offset.toString(), '--method', 'fts', '--json'];
|
|
1027
1340
|
if (enrich) {
|
|
1028
1341
|
args.push('--enrich');
|
|
1029
1342
|
}
|
|
1343
|
+
// Add code_only filter if requested (default: true)
|
|
1344
|
+
if (effectiveCodeOnly) {
|
|
1345
|
+
args.push('--code-only');
|
|
1346
|
+
}
|
|
1347
|
+
// Add exclude_extensions filter if provided
|
|
1348
|
+
if (excludeExtensions && excludeExtensions.length > 0) {
|
|
1349
|
+
args.push('--exclude-extensions', excludeExtensions.join(','));
|
|
1350
|
+
}
|
|
1030
1351
|
const result = await executeCodexLens(args, { cwd: path });
|
|
1031
1352
|
|
|
1032
1353
|
if (!result.success) {
|
|
@@ -1060,10 +1381,18 @@ async function executeCodexLensExactMode(params: Params): Promise<SearchResult>
|
|
|
1060
1381
|
|
|
1061
1382
|
// Fallback to fuzzy mode if exact returns no results
|
|
1062
1383
|
if (allResults.length === 0) {
|
|
1063
|
-
const fuzzyArgs = ['search', query, '--limit', totalToFetch.toString(), '--
|
|
1384
|
+
const fuzzyArgs = ['search', query, '--limit', totalToFetch.toString(), '--offset', offset.toString(), '--method', 'fts', '--use-fuzzy', '--json'];
|
|
1064
1385
|
if (enrich) {
|
|
1065
1386
|
fuzzyArgs.push('--enrich');
|
|
1066
1387
|
}
|
|
1388
|
+
// Add code_only filter if requested (default: true)
|
|
1389
|
+
if (effectiveCodeOnly) {
|
|
1390
|
+
fuzzyArgs.push('--code-only');
|
|
1391
|
+
}
|
|
1392
|
+
// Add exclude_extensions filter if provided
|
|
1393
|
+
if (excludeExtensions && excludeExtensions.length > 0) {
|
|
1394
|
+
fuzzyArgs.push('--exclude-extensions', excludeExtensions.join(','));
|
|
1395
|
+
}
|
|
1067
1396
|
const fuzzyResult = await executeCodexLens(fuzzyArgs, { cwd: path });
|
|
1068
1397
|
|
|
1069
1398
|
if (fuzzyResult.success) {
|
|
@@ -1119,13 +1448,15 @@ async function executeCodexLensExactMode(params: Params): Promise<SearchResult>
|
|
|
1119
1448
|
}
|
|
1120
1449
|
|
|
1121
1450
|
/**
|
|
1122
|
-
* Mode: hybrid - Best quality search
|
|
1123
|
-
* Uses CodexLens
|
|
1451
|
+
* Mode: hybrid - Best quality semantic search
|
|
1452
|
+
* Uses CodexLens dense_rerank method (dense coarse + cross-encoder rerank)
|
|
1124
1453
|
* Requires index with embeddings
|
|
1125
1454
|
*/
|
|
1126
1455
|
async function executeHybridMode(params: Params): Promise<SearchResult> {
|
|
1127
1456
|
const timer = createTimer();
|
|
1128
|
-
const { query, path = '.', maxResults = 5, extraFilesCount = 10, maxContentLength = 200, enrich = false, excludeExtensions, codeOnly = false } = params;
|
|
1457
|
+
const { query, path = '.', maxResults = 5, extraFilesCount = 10, maxContentLength = 200, enrich = false, excludeExtensions, codeOnly = true, withDoc = false, offset = 0 } = params;
|
|
1458
|
+
// withDoc overrides codeOnly
|
|
1459
|
+
const effectiveCodeOnly = withDoc ? false : codeOnly;
|
|
1129
1460
|
|
|
1130
1461
|
if (!query) {
|
|
1131
1462
|
return {
|
|
@@ -1150,10 +1481,18 @@ async function executeHybridMode(params: Params): Promise<SearchResult> {
|
|
|
1150
1481
|
|
|
1151
1482
|
// Request more results to support split (full content + extra files)
|
|
1152
1483
|
const totalToFetch = maxResults + extraFilesCount;
|
|
1153
|
-
const args = ['search', query, '--limit', totalToFetch.toString(), '--
|
|
1484
|
+
const args = ['search', query, '--limit', totalToFetch.toString(), '--offset', offset.toString(), '--method', 'dense_rerank', '--json'];
|
|
1154
1485
|
if (enrich) {
|
|
1155
1486
|
args.push('--enrich');
|
|
1156
1487
|
}
|
|
1488
|
+
// Add code_only filter if requested (default: true)
|
|
1489
|
+
if (effectiveCodeOnly) {
|
|
1490
|
+
args.push('--code-only');
|
|
1491
|
+
}
|
|
1492
|
+
// Add exclude_extensions filter if provided
|
|
1493
|
+
if (excludeExtensions && excludeExtensions.length > 0) {
|
|
1494
|
+
args.push('--exclude-extensions', excludeExtensions.join(','));
|
|
1495
|
+
}
|
|
1157
1496
|
const result = await executeCodexLens(args, { cwd: path });
|
|
1158
1497
|
timer.mark('codexlens_search');
|
|
1159
1498
|
|
|
@@ -1203,8 +1542,9 @@ async function executeHybridMode(params: Params): Promise<SearchResult> {
|
|
|
1203
1542
|
allResults = baselineResult.filteredResults;
|
|
1204
1543
|
baselineInfo = baselineResult.baselineInfo;
|
|
1205
1544
|
|
|
1206
|
-
// 1. Filter noisy
|
|
1207
|
-
|
|
1545
|
+
// 1. Filter noisy directories (node_modules, etc.)
|
|
1546
|
+
// NOTE: Extension filtering is now done engine-side via --code-only and --exclude-extensions
|
|
1547
|
+
allResults = filterNoisyFiles(allResults, {});
|
|
1208
1548
|
// 2. Boost results containing query keywords
|
|
1209
1549
|
allResults = applyKeywordBoosting(allResults, query);
|
|
1210
1550
|
// 3. Enforce score diversity (penalize identical scores)
|
|
@@ -1232,7 +1572,7 @@ async function executeHybridMode(params: Params): Promise<SearchResult> {
|
|
|
1232
1572
|
timer.mark('split_results');
|
|
1233
1573
|
|
|
1234
1574
|
// Build metadata with baseline info if detected
|
|
1235
|
-
let note = '
|
|
1575
|
+
let note = 'Using dense_rerank (dense coarse + cross-encoder rerank) for semantic search';
|
|
1236
1576
|
if (baselineInfo) {
|
|
1237
1577
|
note += ` | Filtered ${initialCount - allResults.length} hot-spot results with baseline score ~${baselineInfo.score.toFixed(4)}`;
|
|
1238
1578
|
}
|
|
@@ -1365,13 +1705,14 @@ function filterNoisyFiles(results: SemanticMatch[], options: FilterOptions = {})
|
|
|
1365
1705
|
}
|
|
1366
1706
|
|
|
1367
1707
|
return results.filter(r => {
|
|
1368
|
-
|
|
1708
|
+
// Support both 'file' and 'path' field names (different backends use different names)
|
|
1709
|
+
const filePath = r.file || (r as any).path || '';
|
|
1369
1710
|
if (!filePath) return true;
|
|
1370
1711
|
|
|
1371
|
-
const segments = filePath.split(/[/\\]/);
|
|
1712
|
+
const segments: string[] = filePath.split(/[/\\]/);
|
|
1372
1713
|
|
|
1373
1714
|
// Accurate directory check: segment must exactly match excluded directory
|
|
1374
|
-
if (segments.some(segment => FILTER_CONFIG.exclude_directories.has(segment))) {
|
|
1715
|
+
if (segments.some((segment: string) => FILTER_CONFIG.exclude_directories.has(segment))) {
|
|
1375
1716
|
return false;
|
|
1376
1717
|
}
|
|
1377
1718
|
|
|
@@ -1696,14 +2037,16 @@ export const schema: ToolSchema = {
|
|
|
1696
2037
|
**Actions:**
|
|
1697
2038
|
- search: Search file content (default)
|
|
1698
2039
|
- find_files: Find files by path/name pattern (glob matching)
|
|
1699
|
-
- init: Create FTS index
|
|
2040
|
+
- init: Create FTS index (incremental - skips existing)
|
|
2041
|
+
- init_force: Force full rebuild (delete and recreate index)
|
|
1700
2042
|
- status: Check index status
|
|
2043
|
+
- update: Incremental index update (for changed files)
|
|
2044
|
+
- watch: Start file watcher for automatic updates
|
|
1701
2045
|
|
|
1702
2046
|
**Content Search (action="search"):**
|
|
1703
|
-
smart_search(query="authentication logic") #
|
|
1704
|
-
smart_search(query="MyClass", mode="
|
|
1705
|
-
smart_search(query="auth", mode="
|
|
1706
|
-
smart_search(query="how to auth", mode="hybrid") # hybrid mode - semantic + fuzzy search
|
|
2047
|
+
smart_search(query="authentication logic") # fuzzy mode (default) - FTS + ripgrep fusion
|
|
2048
|
+
smart_search(query="MyClass", mode="fuzzy") # fuzzy mode - fast hybrid search
|
|
2049
|
+
smart_search(query="how to auth", mode="semantic") # semantic mode - dense + reranker
|
|
1707
2050
|
|
|
1708
2051
|
**File Discovery (action="find_files"):**
|
|
1709
2052
|
smart_search(action="find_files", pattern="*.ts") # find all TypeScript files
|
|
@@ -1711,28 +2054,23 @@ export const schema: ToolSchema = {
|
|
|
1711
2054
|
smart_search(action="find_files", pattern="test_*.py") # find test files
|
|
1712
2055
|
smart_search(action="find_files", pattern="*.tsx", offset=20, limit=10) # pagination
|
|
1713
2056
|
|
|
2057
|
+
**Index Maintenance:**
|
|
2058
|
+
smart_search(action="update", path="/project") # incremental index update
|
|
2059
|
+
smart_search(action="watch", path="/project") # start file watcher
|
|
2060
|
+
smart_search(action="watch", debounce=2000) # custom debounce interval
|
|
2061
|
+
|
|
1714
2062
|
**Pagination:** All actions support offset/limit for paginated results:
|
|
1715
2063
|
smart_search(query="auth", limit=10, offset=0) # first page
|
|
1716
2064
|
smart_search(query="auth", limit=10, offset=10) # second page
|
|
1717
2065
|
|
|
1718
|
-
**
|
|
1719
|
-
smart_search(query="CCW_PROJECT_ROOT CCW_ALLOWED_DIRS", mode="ripgrep") # tokenized OR matching
|
|
1720
|
-
smart_search(query="auth login user", mode="ripgrep") # matches any token, ranks by match count
|
|
1721
|
-
smart_search(query="exact phrase", mode="ripgrep", tokenize=false) # disable tokenization
|
|
1722
|
-
|
|
1723
|
-
**Regex Search (ripgrep mode):**
|
|
1724
|
-
smart_search(query="class.*Builder") # auto-detects regex pattern
|
|
1725
|
-
smart_search(query="def.*\\(.*\\):") # find function definitions
|
|
1726
|
-
smart_search(query="import.*from", caseSensitive=false) # case-insensitive
|
|
1727
|
-
|
|
1728
|
-
**Modes:** auto (intelligent routing), hybrid (semantic+fuzzy), exact (FTS), ripgrep (fast with tokenization), priority (fallback chain)`,
|
|
2066
|
+
**Modes:** fuzzy (FTS + ripgrep fusion, default), semantic (dense + reranker)`,
|
|
1729
2067
|
inputSchema: {
|
|
1730
2068
|
type: 'object',
|
|
1731
2069
|
properties: {
|
|
1732
2070
|
action: {
|
|
1733
2071
|
type: 'string',
|
|
1734
|
-
enum: ['init', 'search', 'find_files', 'status', 'search_files'],
|
|
1735
|
-
description: 'Action: search (content search), find_files (path pattern matching), init (create index), status (check index). Note: search_files is deprecated.',
|
|
2072
|
+
enum: ['init', 'init_force', 'search', 'find_files', 'status', 'update', 'watch', 'search_files'],
|
|
2073
|
+
description: 'Action: search (content search), find_files (path pattern matching), init (create index, incremental), init_force (force full rebuild), status (check index), update (incremental update), watch (auto-update). Note: search_files is deprecated.',
|
|
1736
2074
|
default: 'search',
|
|
1737
2075
|
},
|
|
1738
2076
|
query: {
|
|
@@ -1746,8 +2084,8 @@ export const schema: ToolSchema = {
|
|
|
1746
2084
|
mode: {
|
|
1747
2085
|
type: 'string',
|
|
1748
2086
|
enum: SEARCH_MODES,
|
|
1749
|
-
description: 'Search mode:
|
|
1750
|
-
default: '
|
|
2087
|
+
description: 'Search mode: fuzzy (FTS + ripgrep fusion, default), semantic (dense + reranker for natural language queries)',
|
|
2088
|
+
default: 'fuzzy',
|
|
1751
2089
|
},
|
|
1752
2090
|
output_mode: {
|
|
1753
2091
|
type: 'string',
|
|
@@ -2156,7 +2494,11 @@ export async function handler(params: Record<string, unknown>): Promise<ToolResu
|
|
|
2156
2494
|
// Handle actions
|
|
2157
2495
|
switch (action) {
|
|
2158
2496
|
case 'init':
|
|
2159
|
-
result = await executeInitAction(parsed.data);
|
|
2497
|
+
result = await executeInitAction(parsed.data, false);
|
|
2498
|
+
break;
|
|
2499
|
+
|
|
2500
|
+
case 'init_force':
|
|
2501
|
+
result = await executeInitAction(parsed.data, true);
|
|
2160
2502
|
break;
|
|
2161
2503
|
|
|
2162
2504
|
case 'status':
|
|
@@ -2168,6 +2510,16 @@ export async function handler(params: Record<string, unknown>): Promise<ToolResu
|
|
|
2168
2510
|
result = await executeFindFilesAction(parsed.data);
|
|
2169
2511
|
break;
|
|
2170
2512
|
|
|
2513
|
+
case 'update':
|
|
2514
|
+
// Incremental index update
|
|
2515
|
+
result = await executeUpdateAction(parsed.data);
|
|
2516
|
+
break;
|
|
2517
|
+
|
|
2518
|
+
case 'watch':
|
|
2519
|
+
// Start file watcher (returns status, watcher runs in background)
|
|
2520
|
+
result = await executeWatchAction(parsed.data);
|
|
2521
|
+
break;
|
|
2522
|
+
|
|
2171
2523
|
case 'search_files':
|
|
2172
2524
|
// DEPRECATED: Redirect to search with files_only output
|
|
2173
2525
|
deprecationWarning = 'action="search_files" is deprecated. Use action="search" with output_mode="files_only" for content-to-files search, or action="find_files" for path pattern matching.';
|
|
@@ -2176,25 +2528,16 @@ export async function handler(params: Record<string, unknown>): Promise<ToolResu
|
|
|
2176
2528
|
|
|
2177
2529
|
case 'search':
|
|
2178
2530
|
default:
|
|
2179
|
-
// Handle search modes:
|
|
2531
|
+
// Handle search modes: fuzzy | semantic
|
|
2180
2532
|
switch (mode) {
|
|
2181
|
-
case '
|
|
2182
|
-
result = await
|
|
2533
|
+
case 'fuzzy':
|
|
2534
|
+
result = await executeFuzzyMode(parsed.data);
|
|
2183
2535
|
break;
|
|
2184
|
-
case '
|
|
2536
|
+
case 'semantic':
|
|
2185
2537
|
result = await executeHybridMode(parsed.data);
|
|
2186
2538
|
break;
|
|
2187
|
-
case 'exact':
|
|
2188
|
-
result = await executeCodexLensExactMode(parsed.data);
|
|
2189
|
-
break;
|
|
2190
|
-
case 'ripgrep':
|
|
2191
|
-
result = await executeRipgrepMode(parsed.data);
|
|
2192
|
-
break;
|
|
2193
|
-
case 'priority':
|
|
2194
|
-
result = await executePriorityFallbackMode(parsed.data);
|
|
2195
|
-
break;
|
|
2196
2539
|
default:
|
|
2197
|
-
throw new Error(`Unsupported mode: ${mode}. Use:
|
|
2540
|
+
throw new Error(`Unsupported mode: ${mode}. Use: fuzzy or semantic`);
|
|
2198
2541
|
}
|
|
2199
2542
|
break;
|
|
2200
2543
|
}
|
|
@@ -2236,6 +2579,8 @@ export async function handler(params: Record<string, unknown>): Promise<ToolResu
|
|
|
2236
2579
|
/**
|
|
2237
2580
|
* Execute init action with external progress callback
|
|
2238
2581
|
* Used by MCP server for streaming progress
|
|
2582
|
+
* @param params - Search parameters (path, languages, force)
|
|
2583
|
+
* @param onProgress - Optional callback for progress updates
|
|
2239
2584
|
*/
|
|
2240
2585
|
export async function executeInitWithProgress(
|
|
2241
2586
|
params: Record<string, unknown>,
|
|
@@ -2243,6 +2588,7 @@ export async function executeInitWithProgress(
|
|
|
2243
2588
|
): Promise<SearchResult> {
|
|
2244
2589
|
const path = (params.path as string) || '.';
|
|
2245
2590
|
const languages = params.languages as string[] | undefined;
|
|
2591
|
+
const force = params.force as boolean || false;
|
|
2246
2592
|
|
|
2247
2593
|
// Check CodexLens availability
|
|
2248
2594
|
const readyStatus = await ensureCodexLensReady();
|
|
@@ -2253,9 +2599,13 @@ export async function executeInitWithProgress(
|
|
|
2253
2599
|
};
|
|
2254
2600
|
}
|
|
2255
2601
|
|
|
2256
|
-
|
|
2602
|
+
// Use 'index init' subcommand (new CLI structure)
|
|
2603
|
+
const args = ['index', 'init', path];
|
|
2604
|
+
if (force) {
|
|
2605
|
+
args.push('--force'); // Force full rebuild
|
|
2606
|
+
}
|
|
2257
2607
|
if (languages && languages.length > 0) {
|
|
2258
|
-
args.push('--
|
|
2608
|
+
args.push('--language', languages.join(','));
|
|
2259
2609
|
}
|
|
2260
2610
|
|
|
2261
2611
|
// Track progress updates
|
|
@@ -2277,7 +2627,7 @@ export async function executeInitWithProgress(
|
|
|
2277
2627
|
|
|
2278
2628
|
// Build metadata with progress info
|
|
2279
2629
|
const metadata: SearchMetadata = {
|
|
2280
|
-
action: 'init',
|
|
2630
|
+
action: force ? 'init_force' : 'init',
|
|
2281
2631
|
path,
|
|
2282
2632
|
};
|
|
2283
2633
|
|
|
@@ -2296,11 +2646,12 @@ export async function executeInitWithProgress(
|
|
|
2296
2646
|
metadata.progressHistory = progressUpdates.slice(-5);
|
|
2297
2647
|
}
|
|
2298
2648
|
|
|
2649
|
+
const actionLabel = force ? 'rebuilt (force)' : 'created';
|
|
2299
2650
|
return {
|
|
2300
2651
|
success: result.success,
|
|
2301
2652
|
error: result.error,
|
|
2302
2653
|
message: result.success
|
|
2303
|
-
? `CodexLens index
|
|
2654
|
+
? `CodexLens index ${actionLabel} successfully for ${path}`
|
|
2304
2655
|
: undefined,
|
|
2305
2656
|
metadata,
|
|
2306
2657
|
};
|