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,21 +2,25 @@
|
|
|
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
|
import { z } from 'zod';
|
|
17
20
|
import { spawn, execSync } from 'child_process';
|
|
18
21
|
import { ensureReady as ensureCodexLensReady, executeCodexLens, } from './codex-lens.js';
|
|
19
22
|
import { getProjectRoot } from '../utils/path-validator.js';
|
|
23
|
+
import { EXEC_TIMEOUTS } from '../utils/exec-constants.js';
|
|
20
24
|
// Timing utilities for performance analysis
|
|
21
25
|
const TIMING_ENABLED = process.env.SMART_SEARCH_TIMING === '1' || process.env.DEBUG?.includes('timing');
|
|
22
26
|
function createTimer() {
|
|
@@ -45,12 +49,13 @@ function createTimer() {
|
|
|
45
49
|
}
|
|
46
50
|
// Define Zod schema for validation
|
|
47
51
|
const ParamsSchema = z.object({
|
|
48
|
-
// Action: search (content), find_files (path/name pattern), init, status
|
|
52
|
+
// Action: search (content), find_files (path/name pattern), init, init_force, status, update (incremental), watch
|
|
49
53
|
// Note: search_files is deprecated, use search with output_mode='files_only'
|
|
50
|
-
|
|
54
|
+
// init: incremental index (skip existing), init_force: force full rebuild (delete and recreate)
|
|
55
|
+
action: z.enum(['init', 'init_force', 'search', 'search_files', 'find_files', 'status', 'update', 'watch']).default('search'),
|
|
51
56
|
query: z.string().optional().describe('Content search query (for action="search")'),
|
|
52
57
|
pattern: z.string().optional().describe('Glob pattern for path matching (for action="find_files")'),
|
|
53
|
-
mode: z.enum(['
|
|
58
|
+
mode: z.enum(['fuzzy', 'semantic']).default('fuzzy'),
|
|
54
59
|
output_mode: z.enum(['full', 'files_only', 'count']).default('full'),
|
|
55
60
|
path: z.string().optional(),
|
|
56
61
|
paths: z.array(z.string()).default([]),
|
|
@@ -67,13 +72,16 @@ const ParamsSchema = z.object({
|
|
|
67
72
|
regex: z.boolean().default(true), // Use regex pattern matching (default: enabled)
|
|
68
73
|
caseSensitive: z.boolean().default(true), // Case sensitivity (default: case-sensitive)
|
|
69
74
|
tokenize: z.boolean().default(true), // Tokenize multi-word queries for OR matching (default: enabled)
|
|
70
|
-
// File type filtering
|
|
75
|
+
// File type filtering (default: code only)
|
|
71
76
|
excludeExtensions: z.array(z.string()).optional().describe('File extensions to exclude from results (e.g., ["md", "txt"])'),
|
|
72
|
-
codeOnly: z.boolean().default(
|
|
77
|
+
codeOnly: z.boolean().default(true).describe('Only return code files (excludes md, txt, json, yaml, xml, etc.). Default: true'),
|
|
78
|
+
withDoc: z.boolean().default(false).describe('Include documentation files (md, txt, rst, etc.). Overrides codeOnly when true'),
|
|
79
|
+
// Watcher options
|
|
80
|
+
debounce: z.number().default(1000).describe('Debounce interval in ms for watch action'),
|
|
73
81
|
// Fuzzy matching is implicit in hybrid mode (RRF fusion)
|
|
74
82
|
});
|
|
75
83
|
// Search mode constants
|
|
76
|
-
const SEARCH_MODES = ['
|
|
84
|
+
const SEARCH_MODES = ['fuzzy', 'semantic'];
|
|
77
85
|
// Classification confidence threshold
|
|
78
86
|
const CONFIDENCE_THRESHOLD = 0.7;
|
|
79
87
|
// File filtering configuration (ported from code-index)
|
|
@@ -230,18 +238,45 @@ function splitResultsWithExtraFiles(allResults, fullContentLimit = 5, extraFiles
|
|
|
230
238
|
*/
|
|
231
239
|
async function checkIndexStatus(path = '.') {
|
|
232
240
|
try {
|
|
233
|
-
|
|
234
|
-
|
|
241
|
+
// Fetch both status and config in parallel
|
|
242
|
+
const [statusResult, configResult] = await Promise.all([
|
|
243
|
+
executeCodexLens(['status', '--json'], { cwd: path }),
|
|
244
|
+
executeCodexLens(['config', 'show', '--json'], { cwd: path }),
|
|
245
|
+
]);
|
|
246
|
+
// Parse config
|
|
247
|
+
let config = null;
|
|
248
|
+
if (configResult.success && configResult.output) {
|
|
249
|
+
try {
|
|
250
|
+
const cleanConfigOutput = stripAnsi(configResult.output);
|
|
251
|
+
const parsedConfig = JSON.parse(cleanConfigOutput);
|
|
252
|
+
const configData = parsedConfig.result || parsedConfig;
|
|
253
|
+
config = {
|
|
254
|
+
config_file: configData.config_file,
|
|
255
|
+
index_dir: configData.index_dir,
|
|
256
|
+
embedding_backend: configData.embedding_backend,
|
|
257
|
+
embedding_model: configData.embedding_model,
|
|
258
|
+
reranker_enabled: configData.reranker_enabled,
|
|
259
|
+
reranker_backend: configData.reranker_backend,
|
|
260
|
+
reranker_model: configData.reranker_model,
|
|
261
|
+
reranker_top_k: configData.reranker_top_k,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
catch {
|
|
265
|
+
// Config parse failed, continue without it
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
if (!statusResult.success) {
|
|
235
269
|
return {
|
|
236
270
|
indexed: false,
|
|
237
271
|
has_embeddings: false,
|
|
272
|
+
config,
|
|
238
273
|
warning: 'No CodexLens index found. Run smart_search(action="init") to create index for better search results.',
|
|
239
274
|
};
|
|
240
275
|
}
|
|
241
276
|
// Parse status output
|
|
242
277
|
try {
|
|
243
278
|
// Strip ANSI color codes from JSON output
|
|
244
|
-
const cleanOutput = stripAnsi(
|
|
279
|
+
const cleanOutput = stripAnsi(statusResult.output || '{}');
|
|
245
280
|
const parsed = JSON.parse(cleanOutput);
|
|
246
281
|
// Handle both direct and nested response formats (status returns {success, result: {...}})
|
|
247
282
|
const status = parsed.result || parsed;
|
|
@@ -279,6 +314,7 @@ async function checkIndexStatus(path = '.') {
|
|
|
279
314
|
total_chunks: totalChunks,
|
|
280
315
|
// Ensure model_info is null instead of undefined so it's included in JSON
|
|
281
316
|
model_info: modelInfo ?? null,
|
|
317
|
+
config,
|
|
282
318
|
warning,
|
|
283
319
|
};
|
|
284
320
|
}
|
|
@@ -286,6 +322,7 @@ async function checkIndexStatus(path = '.') {
|
|
|
286
322
|
return {
|
|
287
323
|
indexed: false,
|
|
288
324
|
has_embeddings: false,
|
|
325
|
+
config,
|
|
289
326
|
warning: 'Failed to parse index status',
|
|
290
327
|
};
|
|
291
328
|
}
|
|
@@ -397,7 +434,7 @@ function checkToolAvailability(toolName) {
|
|
|
397
434
|
try {
|
|
398
435
|
const isWindows = process.platform === 'win32';
|
|
399
436
|
const command = isWindows ? 'where' : 'which';
|
|
400
|
-
execSync(`${command} ${toolName}`, { stdio: 'ignore' });
|
|
437
|
+
execSync(`${command} ${toolName}`, { stdio: 'ignore', timeout: EXEC_TIMEOUTS.SYSTEM_INFO });
|
|
401
438
|
return true;
|
|
402
439
|
}
|
|
403
440
|
catch {
|
|
@@ -465,8 +502,10 @@ function buildRipgrepCommand(params) {
|
|
|
465
502
|
/**
|
|
466
503
|
* Action: init - Initialize CodexLens index (FTS only, no embeddings)
|
|
467
504
|
* For semantic/vector search, use ccw view dashboard or codexlens CLI directly
|
|
505
|
+
* @param params - Search parameters
|
|
506
|
+
* @param force - If true, force full rebuild (delete existing index first)
|
|
468
507
|
*/
|
|
469
|
-
async function executeInitAction(params) {
|
|
508
|
+
async function executeInitAction(params, force = false) {
|
|
470
509
|
const { path = '.', languages } = params;
|
|
471
510
|
// Check CodexLens availability
|
|
472
511
|
const readyStatus = await ensureCodexLensReady();
|
|
@@ -477,9 +516,13 @@ async function executeInitAction(params) {
|
|
|
477
516
|
};
|
|
478
517
|
}
|
|
479
518
|
// Build args with --no-embeddings for FTS-only index (faster)
|
|
480
|
-
|
|
519
|
+
// Use 'index init' subcommand (new CLI structure)
|
|
520
|
+
const args = ['index', 'init', path, '--no-embeddings'];
|
|
521
|
+
if (force) {
|
|
522
|
+
args.push('--force'); // Force full rebuild
|
|
523
|
+
}
|
|
481
524
|
if (languages && languages.length > 0) {
|
|
482
|
-
args.push('--
|
|
525
|
+
args.push('--language', languages.join(','));
|
|
483
526
|
}
|
|
484
527
|
// Track progress updates
|
|
485
528
|
const progressUpdates = [];
|
|
@@ -494,7 +537,7 @@ async function executeInitAction(params) {
|
|
|
494
537
|
});
|
|
495
538
|
// Build metadata with progress info
|
|
496
539
|
const metadata = {
|
|
497
|
-
action: 'init',
|
|
540
|
+
action: force ? 'init_force' : 'init',
|
|
498
541
|
path,
|
|
499
542
|
};
|
|
500
543
|
if (lastProgress !== null) {
|
|
@@ -510,8 +553,9 @@ async function executeInitAction(params) {
|
|
|
510
553
|
if (progressUpdates.length > 0) {
|
|
511
554
|
metadata.progressHistory = progressUpdates.slice(-5); // Keep last 5 progress updates
|
|
512
555
|
}
|
|
556
|
+
const actionLabel = force ? 'rebuilt (force)' : 'created';
|
|
513
557
|
const successMessage = result.success
|
|
514
|
-
? `FTS index
|
|
558
|
+
? `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).`
|
|
515
559
|
: undefined;
|
|
516
560
|
return {
|
|
517
561
|
success: result.success,
|
|
@@ -526,10 +570,228 @@ async function executeInitAction(params) {
|
|
|
526
570
|
async function executeStatusAction(params) {
|
|
527
571
|
const { path = '.' } = params;
|
|
528
572
|
const indexStatus = await checkIndexStatus(path);
|
|
573
|
+
// Build detailed status message
|
|
574
|
+
const statusParts = [];
|
|
575
|
+
// Index status
|
|
576
|
+
statusParts.push(`Index: ${indexStatus.indexed ? 'indexed' : 'not indexed'}`);
|
|
577
|
+
if (indexStatus.file_count) {
|
|
578
|
+
statusParts.push(`Files: ${indexStatus.file_count}`);
|
|
579
|
+
}
|
|
580
|
+
// Embeddings status
|
|
581
|
+
if (indexStatus.embeddings_coverage_percent !== undefined) {
|
|
582
|
+
statusParts.push(`Embeddings: ${indexStatus.embeddings_coverage_percent.toFixed(1)}%`);
|
|
583
|
+
}
|
|
584
|
+
if (indexStatus.total_chunks) {
|
|
585
|
+
statusParts.push(`Chunks: ${indexStatus.total_chunks}`);
|
|
586
|
+
}
|
|
587
|
+
// Config summary
|
|
588
|
+
if (indexStatus.config) {
|
|
589
|
+
const cfg = indexStatus.config;
|
|
590
|
+
// Embedding backend info
|
|
591
|
+
const embeddingType = cfg.embedding_backend === 'litellm' ? 'API' : 'Local';
|
|
592
|
+
statusParts.push(`Embedding: ${embeddingType} (${cfg.embedding_model || 'default'})`);
|
|
593
|
+
// Reranker info
|
|
594
|
+
if (cfg.reranker_enabled) {
|
|
595
|
+
const rerankerType = cfg.reranker_backend === 'onnx' ? 'Local' : 'API';
|
|
596
|
+
statusParts.push(`Reranker: ${rerankerType} (${cfg.reranker_model || 'default'})`);
|
|
597
|
+
}
|
|
598
|
+
else {
|
|
599
|
+
statusParts.push('Reranker: disabled');
|
|
600
|
+
}
|
|
601
|
+
}
|
|
529
602
|
return {
|
|
530
603
|
success: true,
|
|
531
604
|
status: indexStatus,
|
|
532
|
-
message: indexStatus.warning ||
|
|
605
|
+
message: indexStatus.warning || statusParts.join(' | '),
|
|
606
|
+
};
|
|
607
|
+
}
|
|
608
|
+
/**
|
|
609
|
+
* Action: update - Incremental index update
|
|
610
|
+
* Updates index for changed files without full rebuild
|
|
611
|
+
*/
|
|
612
|
+
async function executeUpdateAction(params) {
|
|
613
|
+
const { path = '.', languages } = params;
|
|
614
|
+
// Check CodexLens availability
|
|
615
|
+
const readyStatus = await ensureCodexLensReady();
|
|
616
|
+
if (!readyStatus.ready) {
|
|
617
|
+
return {
|
|
618
|
+
success: false,
|
|
619
|
+
error: `CodexLens not available: ${readyStatus.error}`,
|
|
620
|
+
};
|
|
621
|
+
}
|
|
622
|
+
// Check if index exists first
|
|
623
|
+
const indexStatus = await checkIndexStatus(path);
|
|
624
|
+
if (!indexStatus.indexed) {
|
|
625
|
+
return {
|
|
626
|
+
success: false,
|
|
627
|
+
error: `Directory not indexed. Run smart_search(action="init") first.`,
|
|
628
|
+
};
|
|
629
|
+
}
|
|
630
|
+
// Build args for incremental init (without --force)
|
|
631
|
+
// Use 'index init' subcommand (new CLI structure)
|
|
632
|
+
const args = ['index', 'init', path];
|
|
633
|
+
if (languages && languages.length > 0) {
|
|
634
|
+
args.push('--language', languages.join(','));
|
|
635
|
+
}
|
|
636
|
+
// Track progress updates
|
|
637
|
+
const progressUpdates = [];
|
|
638
|
+
let lastProgress = null;
|
|
639
|
+
const result = await executeCodexLens(args, {
|
|
640
|
+
cwd: path,
|
|
641
|
+
timeout: 600000, // 10 minutes for incremental updates
|
|
642
|
+
onProgress: (progress) => {
|
|
643
|
+
progressUpdates.push(progress);
|
|
644
|
+
lastProgress = progress;
|
|
645
|
+
},
|
|
646
|
+
});
|
|
647
|
+
// Build metadata with progress info
|
|
648
|
+
const metadata = {
|
|
649
|
+
action: 'update',
|
|
650
|
+
path,
|
|
651
|
+
};
|
|
652
|
+
if (lastProgress !== null) {
|
|
653
|
+
const p = lastProgress;
|
|
654
|
+
metadata.progress = {
|
|
655
|
+
stage: p.stage,
|
|
656
|
+
message: p.message,
|
|
657
|
+
percent: p.percent,
|
|
658
|
+
filesProcessed: p.filesProcessed,
|
|
659
|
+
totalFiles: p.totalFiles,
|
|
660
|
+
};
|
|
661
|
+
}
|
|
662
|
+
if (progressUpdates.length > 0) {
|
|
663
|
+
metadata.progressHistory = progressUpdates.slice(-5);
|
|
664
|
+
}
|
|
665
|
+
return {
|
|
666
|
+
success: result.success,
|
|
667
|
+
error: result.error,
|
|
668
|
+
message: result.success
|
|
669
|
+
? `Incremental update completed for ${path}`
|
|
670
|
+
: undefined,
|
|
671
|
+
metadata,
|
|
672
|
+
};
|
|
673
|
+
}
|
|
674
|
+
/**
|
|
675
|
+
* Action: watch - Start file watcher for automatic incremental updates
|
|
676
|
+
* Note: This starts a background process, returns immediately with status
|
|
677
|
+
*/
|
|
678
|
+
async function executeWatchAction(params) {
|
|
679
|
+
const { path = '.', languages, debounce = 1000 } = params;
|
|
680
|
+
// Check CodexLens availability
|
|
681
|
+
const readyStatus = await ensureCodexLensReady();
|
|
682
|
+
if (!readyStatus.ready) {
|
|
683
|
+
return {
|
|
684
|
+
success: false,
|
|
685
|
+
error: `CodexLens not available: ${readyStatus.error}`,
|
|
686
|
+
};
|
|
687
|
+
}
|
|
688
|
+
// Check if index exists first
|
|
689
|
+
const indexStatus = await checkIndexStatus(path);
|
|
690
|
+
if (!indexStatus.indexed) {
|
|
691
|
+
return {
|
|
692
|
+
success: false,
|
|
693
|
+
error: `Directory not indexed. Run smart_search(action="init") first.`,
|
|
694
|
+
};
|
|
695
|
+
}
|
|
696
|
+
// Build args for watch command
|
|
697
|
+
const args = ['watch', path, '--debounce', debounce.toString()];
|
|
698
|
+
if (languages && languages.length > 0) {
|
|
699
|
+
args.push('--language', languages.join(','));
|
|
700
|
+
}
|
|
701
|
+
// Start watcher in background (non-blocking)
|
|
702
|
+
// Note: The watcher runs until manually stopped
|
|
703
|
+
const result = await executeCodexLens(args, {
|
|
704
|
+
cwd: path,
|
|
705
|
+
timeout: 5000, // Short timeout for initial startup check
|
|
706
|
+
});
|
|
707
|
+
return {
|
|
708
|
+
success: true,
|
|
709
|
+
message: `File watcher started for ${path}. Use Ctrl+C or kill the process to stop.`,
|
|
710
|
+
metadata: {
|
|
711
|
+
action: 'watch',
|
|
712
|
+
path,
|
|
713
|
+
note: 'Watcher runs in background. Changes are indexed automatically with debounce.',
|
|
714
|
+
},
|
|
715
|
+
};
|
|
716
|
+
}
|
|
717
|
+
/**
|
|
718
|
+
* Mode: fuzzy - FTS + ripgrep fusion with RRF ranking
|
|
719
|
+
* Runs both exact (FTS) and ripgrep searches in parallel, merges and ranks results
|
|
720
|
+
*/
|
|
721
|
+
async function executeFuzzyMode(params) {
|
|
722
|
+
const { query, path = '.', maxResults = 5, extraFilesCount = 10, codeOnly = true, withDoc = false, excludeExtensions } = params;
|
|
723
|
+
// withDoc overrides codeOnly
|
|
724
|
+
const effectiveCodeOnly = withDoc ? false : codeOnly;
|
|
725
|
+
if (!query) {
|
|
726
|
+
return {
|
|
727
|
+
success: false,
|
|
728
|
+
error: 'Query is required for search',
|
|
729
|
+
};
|
|
730
|
+
}
|
|
731
|
+
const timer = createTimer();
|
|
732
|
+
// Run both searches in parallel
|
|
733
|
+
const [ftsResult, ripgrepResult] = await Promise.allSettled([
|
|
734
|
+
executeCodexLensExactMode(params),
|
|
735
|
+
executeRipgrepMode(params),
|
|
736
|
+
]);
|
|
737
|
+
timer.mark('parallel_search');
|
|
738
|
+
// Collect results from both sources
|
|
739
|
+
const resultsMap = new Map();
|
|
740
|
+
// Add FTS results if successful
|
|
741
|
+
if (ftsResult.status === 'fulfilled' && ftsResult.value.success && ftsResult.value.results) {
|
|
742
|
+
resultsMap.set('exact', ftsResult.value.results);
|
|
743
|
+
}
|
|
744
|
+
// Add ripgrep results if successful
|
|
745
|
+
if (ripgrepResult.status === 'fulfilled' && ripgrepResult.value.success && ripgrepResult.value.results) {
|
|
746
|
+
resultsMap.set('ripgrep', ripgrepResult.value.results);
|
|
747
|
+
}
|
|
748
|
+
// If both failed, return error
|
|
749
|
+
if (resultsMap.size === 0) {
|
|
750
|
+
const errors = [];
|
|
751
|
+
if (ftsResult.status === 'rejected')
|
|
752
|
+
errors.push(`FTS: ${ftsResult.reason}`);
|
|
753
|
+
if (ripgrepResult.status === 'rejected')
|
|
754
|
+
errors.push(`Ripgrep: ${ripgrepResult.reason}`);
|
|
755
|
+
return {
|
|
756
|
+
success: false,
|
|
757
|
+
error: `Both search backends failed: ${errors.join('; ')}`,
|
|
758
|
+
};
|
|
759
|
+
}
|
|
760
|
+
// Apply RRF fusion with fuzzy-optimized weights
|
|
761
|
+
// Fuzzy mode: balanced between exact and ripgrep
|
|
762
|
+
const fusionWeights = { exact: 0.5, ripgrep: 0.5 };
|
|
763
|
+
const totalToFetch = maxResults + extraFilesCount;
|
|
764
|
+
const fusedResults = applyRRFFusion(resultsMap, fusionWeights, totalToFetch);
|
|
765
|
+
timer.mark('rrf_fusion');
|
|
766
|
+
// Apply code-only and extension filtering after fusion
|
|
767
|
+
const filteredFusedResults = filterNoisyFiles(fusedResults, { codeOnly: effectiveCodeOnly, excludeExtensions });
|
|
768
|
+
// Normalize results format
|
|
769
|
+
const normalizedResults = filteredFusedResults.map((item) => ({
|
|
770
|
+
file: item.file || item.path,
|
|
771
|
+
line: item.line || 0,
|
|
772
|
+
column: item.column || 0,
|
|
773
|
+
content: item.content || '',
|
|
774
|
+
score: item.fusion_score || 0,
|
|
775
|
+
matchCount: item.matchCount,
|
|
776
|
+
matchScore: item.matchScore,
|
|
777
|
+
}));
|
|
778
|
+
// Split results: first N with full content, rest as file paths only
|
|
779
|
+
const { results, extra_files } = splitResultsWithExtraFiles(normalizedResults, maxResults, extraFilesCount);
|
|
780
|
+
// Log timing
|
|
781
|
+
timer.log();
|
|
782
|
+
const timings = timer.getTimings();
|
|
783
|
+
return {
|
|
784
|
+
success: true,
|
|
785
|
+
results,
|
|
786
|
+
extra_files: extra_files.length > 0 ? extra_files : undefined,
|
|
787
|
+
metadata: {
|
|
788
|
+
mode: 'fuzzy',
|
|
789
|
+
backend: 'fts+ripgrep',
|
|
790
|
+
count: results.length,
|
|
791
|
+
query,
|
|
792
|
+
note: `Fuzzy search using RRF fusion of FTS and ripgrep (weights: exact=${fusionWeights.exact}, ripgrep=${fusionWeights.ripgrep})`,
|
|
793
|
+
timing: TIMING_ENABLED ? timings : undefined,
|
|
794
|
+
},
|
|
533
795
|
};
|
|
534
796
|
}
|
|
535
797
|
/**
|
|
@@ -588,7 +850,9 @@ async function executeAutoMode(params) {
|
|
|
588
850
|
* Supports tokenized multi-word queries with OR matching and result ranking
|
|
589
851
|
*/
|
|
590
852
|
async function executeRipgrepMode(params) {
|
|
591
|
-
const { query, paths = [], contextLines = 0, maxResults = 5, extraFilesCount = 10, maxContentLength = 200, includeHidden = false, path = '.', regex = true, caseSensitive = true, tokenize = true } = params;
|
|
853
|
+
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;
|
|
854
|
+
// withDoc overrides codeOnly
|
|
855
|
+
const effectiveCodeOnly = withDoc ? false : codeOnly;
|
|
592
856
|
if (!query) {
|
|
593
857
|
return {
|
|
594
858
|
success: false,
|
|
@@ -608,8 +872,8 @@ async function executeRipgrepMode(params) {
|
|
|
608
872
|
error: 'Neither ripgrep nor CodexLens available. Install ripgrep (rg) or CodexLens for search functionality.',
|
|
609
873
|
};
|
|
610
874
|
}
|
|
611
|
-
// Use CodexLens
|
|
612
|
-
const args = ['search', query, '--limit', totalToFetch.toString(), '--
|
|
875
|
+
// Use CodexLens fts mode as fallback
|
|
876
|
+
const args = ['search', query, '--limit', totalToFetch.toString(), '--method', 'fts', '--json'];
|
|
613
877
|
const result = await executeCodexLens(args, { cwd: path });
|
|
614
878
|
if (!result.success) {
|
|
615
879
|
return {
|
|
@@ -713,9 +977,11 @@ async function executeRipgrepMode(params) {
|
|
|
713
977
|
// Apply token-based scoring and sorting for multi-word queries
|
|
714
978
|
// Results matching more tokens are ranked higher (exact matches first)
|
|
715
979
|
const scoredResults = tokens.length > 1 ? scoreByTokenMatch(allResults, tokens) : allResults;
|
|
716
|
-
|
|
980
|
+
// Apply code-only and extension filtering
|
|
981
|
+
const filteredResults = filterNoisyFiles(scoredResults, { codeOnly: effectiveCodeOnly, excludeExtensions });
|
|
982
|
+
if (code === 0 || code === 1 || (isWindowsDeviceError && filteredResults.length > 0)) {
|
|
717
983
|
// Split results: first N with full content, rest as file paths only
|
|
718
|
-
const { results, extra_files } = splitResultsWithExtraFiles(
|
|
984
|
+
const { results, extra_files } = splitResultsWithExtraFiles(filteredResults, maxResults, extraFilesCount);
|
|
719
985
|
// Build warning message for various conditions
|
|
720
986
|
const warnings = [];
|
|
721
987
|
if (resultLimitReached) {
|
|
@@ -775,7 +1041,9 @@ async function executeRipgrepMode(params) {
|
|
|
775
1041
|
* Requires index
|
|
776
1042
|
*/
|
|
777
1043
|
async function executeCodexLensExactMode(params) {
|
|
778
|
-
const { query, path = '.', maxResults = 5, extraFilesCount = 10, maxContentLength = 200, enrich = false } = params;
|
|
1044
|
+
const { query, path = '.', maxResults = 5, extraFilesCount = 10, maxContentLength = 200, enrich = false, excludeExtensions, codeOnly = true, withDoc = false, offset = 0 } = params;
|
|
1045
|
+
// withDoc overrides codeOnly
|
|
1046
|
+
const effectiveCodeOnly = withDoc ? false : codeOnly;
|
|
779
1047
|
if (!query) {
|
|
780
1048
|
return {
|
|
781
1049
|
success: false,
|
|
@@ -794,10 +1062,18 @@ async function executeCodexLensExactMode(params) {
|
|
|
794
1062
|
const indexStatus = await checkIndexStatus(path);
|
|
795
1063
|
// Request more results to support split (full content + extra files)
|
|
796
1064
|
const totalToFetch = maxResults + extraFilesCount;
|
|
797
|
-
const args = ['search', query, '--limit', totalToFetch.toString(), '--
|
|
1065
|
+
const args = ['search', query, '--limit', totalToFetch.toString(), '--offset', offset.toString(), '--method', 'fts', '--json'];
|
|
798
1066
|
if (enrich) {
|
|
799
1067
|
args.push('--enrich');
|
|
800
1068
|
}
|
|
1069
|
+
// Add code_only filter if requested (default: true)
|
|
1070
|
+
if (effectiveCodeOnly) {
|
|
1071
|
+
args.push('--code-only');
|
|
1072
|
+
}
|
|
1073
|
+
// Add exclude_extensions filter if provided
|
|
1074
|
+
if (excludeExtensions && excludeExtensions.length > 0) {
|
|
1075
|
+
args.push('--exclude-extensions', excludeExtensions.join(','));
|
|
1076
|
+
}
|
|
801
1077
|
const result = await executeCodexLens(args, { cwd: path });
|
|
802
1078
|
if (!result.success) {
|
|
803
1079
|
return {
|
|
@@ -829,10 +1105,18 @@ async function executeCodexLensExactMode(params) {
|
|
|
829
1105
|
}
|
|
830
1106
|
// Fallback to fuzzy mode if exact returns no results
|
|
831
1107
|
if (allResults.length === 0) {
|
|
832
|
-
const fuzzyArgs = ['search', query, '--limit', totalToFetch.toString(), '--
|
|
1108
|
+
const fuzzyArgs = ['search', query, '--limit', totalToFetch.toString(), '--offset', offset.toString(), '--method', 'fts', '--use-fuzzy', '--json'];
|
|
833
1109
|
if (enrich) {
|
|
834
1110
|
fuzzyArgs.push('--enrich');
|
|
835
1111
|
}
|
|
1112
|
+
// Add code_only filter if requested (default: true)
|
|
1113
|
+
if (effectiveCodeOnly) {
|
|
1114
|
+
fuzzyArgs.push('--code-only');
|
|
1115
|
+
}
|
|
1116
|
+
// Add exclude_extensions filter if provided
|
|
1117
|
+
if (excludeExtensions && excludeExtensions.length > 0) {
|
|
1118
|
+
fuzzyArgs.push('--exclude-extensions', excludeExtensions.join(','));
|
|
1119
|
+
}
|
|
836
1120
|
const fuzzyResult = await executeCodexLens(fuzzyArgs, { cwd: path });
|
|
837
1121
|
if (fuzzyResult.success) {
|
|
838
1122
|
try {
|
|
@@ -884,13 +1168,15 @@ async function executeCodexLensExactMode(params) {
|
|
|
884
1168
|
};
|
|
885
1169
|
}
|
|
886
1170
|
/**
|
|
887
|
-
* Mode: hybrid - Best quality search
|
|
888
|
-
* Uses CodexLens
|
|
1171
|
+
* Mode: hybrid - Best quality semantic search
|
|
1172
|
+
* Uses CodexLens dense_rerank method (dense coarse + cross-encoder rerank)
|
|
889
1173
|
* Requires index with embeddings
|
|
890
1174
|
*/
|
|
891
1175
|
async function executeHybridMode(params) {
|
|
892
1176
|
const timer = createTimer();
|
|
893
|
-
const { query, path = '.', maxResults = 5, extraFilesCount = 10, maxContentLength = 200, enrich = false, excludeExtensions, codeOnly = false } = params;
|
|
1177
|
+
const { query, path = '.', maxResults = 5, extraFilesCount = 10, maxContentLength = 200, enrich = false, excludeExtensions, codeOnly = true, withDoc = false, offset = 0 } = params;
|
|
1178
|
+
// withDoc overrides codeOnly
|
|
1179
|
+
const effectiveCodeOnly = withDoc ? false : codeOnly;
|
|
894
1180
|
if (!query) {
|
|
895
1181
|
return {
|
|
896
1182
|
success: false,
|
|
@@ -911,10 +1197,18 @@ async function executeHybridMode(params) {
|
|
|
911
1197
|
timer.mark('index_status_check');
|
|
912
1198
|
// Request more results to support split (full content + extra files)
|
|
913
1199
|
const totalToFetch = maxResults + extraFilesCount;
|
|
914
|
-
const args = ['search', query, '--limit', totalToFetch.toString(), '--
|
|
1200
|
+
const args = ['search', query, '--limit', totalToFetch.toString(), '--offset', offset.toString(), '--method', 'dense_rerank', '--json'];
|
|
915
1201
|
if (enrich) {
|
|
916
1202
|
args.push('--enrich');
|
|
917
1203
|
}
|
|
1204
|
+
// Add code_only filter if requested (default: true)
|
|
1205
|
+
if (effectiveCodeOnly) {
|
|
1206
|
+
args.push('--code-only');
|
|
1207
|
+
}
|
|
1208
|
+
// Add exclude_extensions filter if provided
|
|
1209
|
+
if (excludeExtensions && excludeExtensions.length > 0) {
|
|
1210
|
+
args.push('--exclude-extensions', excludeExtensions.join(','));
|
|
1211
|
+
}
|
|
918
1212
|
const result = await executeCodexLens(args, { cwd: path });
|
|
919
1213
|
timer.mark('codexlens_search');
|
|
920
1214
|
if (!result.success) {
|
|
@@ -958,8 +1252,9 @@ async function executeHybridMode(params) {
|
|
|
958
1252
|
const baselineResult = filterDominantBaselineScores(allResults);
|
|
959
1253
|
allResults = baselineResult.filteredResults;
|
|
960
1254
|
baselineInfo = baselineResult.baselineInfo;
|
|
961
|
-
// 1. Filter noisy
|
|
962
|
-
|
|
1255
|
+
// 1. Filter noisy directories (node_modules, etc.)
|
|
1256
|
+
// NOTE: Extension filtering is now done engine-side via --code-only and --exclude-extensions
|
|
1257
|
+
allResults = filterNoisyFiles(allResults, {});
|
|
963
1258
|
// 2. Boost results containing query keywords
|
|
964
1259
|
allResults = applyKeywordBoosting(allResults, query);
|
|
965
1260
|
// 3. Enforce score diversity (penalize identical scores)
|
|
@@ -986,7 +1281,7 @@ async function executeHybridMode(params) {
|
|
|
986
1281
|
const { results, extra_files } = splitResultsWithExtraFiles(allResults, maxResults, extraFilesCount);
|
|
987
1282
|
timer.mark('split_results');
|
|
988
1283
|
// Build metadata with baseline info if detected
|
|
989
|
-
let note = '
|
|
1284
|
+
let note = 'Using dense_rerank (dense coarse + cross-encoder rerank) for semantic search';
|
|
990
1285
|
if (baselineInfo) {
|
|
991
1286
|
note += ` | Filtered ${initialCount - allResults.length} hot-spot results with baseline score ~${baselineInfo.score.toFixed(4)}`;
|
|
992
1287
|
}
|
|
@@ -1087,12 +1382,13 @@ function filterNoisyFiles(results, options = {}) {
|
|
|
1087
1382
|
NON_CODE_EXTENSIONS.forEach(ext => excludedExtSet.add(ext));
|
|
1088
1383
|
}
|
|
1089
1384
|
return results.filter(r => {
|
|
1090
|
-
|
|
1385
|
+
// Support both 'file' and 'path' field names (different backends use different names)
|
|
1386
|
+
const filePath = r.file || r.path || '';
|
|
1091
1387
|
if (!filePath)
|
|
1092
1388
|
return true;
|
|
1093
1389
|
const segments = filePath.split(/[/\\]/);
|
|
1094
1390
|
// Accurate directory check: segment must exactly match excluded directory
|
|
1095
|
-
if (segments.some(segment => FILTER_CONFIG.exclude_directories.has(segment))) {
|
|
1391
|
+
if (segments.some((segment) => FILTER_CONFIG.exclude_directories.has(segment))) {
|
|
1096
1392
|
return false;
|
|
1097
1393
|
}
|
|
1098
1394
|
// Accurate file check: pattern matches filename only (not full path)
|
|
@@ -1378,14 +1674,16 @@ export const schema = {
|
|
|
1378
1674
|
**Actions:**
|
|
1379
1675
|
- search: Search file content (default)
|
|
1380
1676
|
- find_files: Find files by path/name pattern (glob matching)
|
|
1381
|
-
- init: Create FTS index
|
|
1677
|
+
- init: Create FTS index (incremental - skips existing)
|
|
1678
|
+
- init_force: Force full rebuild (delete and recreate index)
|
|
1382
1679
|
- status: Check index status
|
|
1680
|
+
- update: Incremental index update (for changed files)
|
|
1681
|
+
- watch: Start file watcher for automatic updates
|
|
1383
1682
|
|
|
1384
1683
|
**Content Search (action="search"):**
|
|
1385
|
-
smart_search(query="authentication logic") #
|
|
1386
|
-
smart_search(query="MyClass", mode="
|
|
1387
|
-
smart_search(query="auth", mode="
|
|
1388
|
-
smart_search(query="how to auth", mode="hybrid") # hybrid mode - semantic + fuzzy search
|
|
1684
|
+
smart_search(query="authentication logic") # fuzzy mode (default) - FTS + ripgrep fusion
|
|
1685
|
+
smart_search(query="MyClass", mode="fuzzy") # fuzzy mode - fast hybrid search
|
|
1686
|
+
smart_search(query="how to auth", mode="semantic") # semantic mode - dense + reranker
|
|
1389
1687
|
|
|
1390
1688
|
**File Discovery (action="find_files"):**
|
|
1391
1689
|
smart_search(action="find_files", pattern="*.ts") # find all TypeScript files
|
|
@@ -1393,28 +1691,23 @@ export const schema = {
|
|
|
1393
1691
|
smart_search(action="find_files", pattern="test_*.py") # find test files
|
|
1394
1692
|
smart_search(action="find_files", pattern="*.tsx", offset=20, limit=10) # pagination
|
|
1395
1693
|
|
|
1694
|
+
**Index Maintenance:**
|
|
1695
|
+
smart_search(action="update", path="/project") # incremental index update
|
|
1696
|
+
smart_search(action="watch", path="/project") # start file watcher
|
|
1697
|
+
smart_search(action="watch", debounce=2000) # custom debounce interval
|
|
1698
|
+
|
|
1396
1699
|
**Pagination:** All actions support offset/limit for paginated results:
|
|
1397
1700
|
smart_search(query="auth", limit=10, offset=0) # first page
|
|
1398
1701
|
smart_search(query="auth", limit=10, offset=10) # second page
|
|
1399
1702
|
|
|
1400
|
-
**
|
|
1401
|
-
smart_search(query="CCW_PROJECT_ROOT CCW_ALLOWED_DIRS", mode="ripgrep") # tokenized OR matching
|
|
1402
|
-
smart_search(query="auth login user", mode="ripgrep") # matches any token, ranks by match count
|
|
1403
|
-
smart_search(query="exact phrase", mode="ripgrep", tokenize=false) # disable tokenization
|
|
1404
|
-
|
|
1405
|
-
**Regex Search (ripgrep mode):**
|
|
1406
|
-
smart_search(query="class.*Builder") # auto-detects regex pattern
|
|
1407
|
-
smart_search(query="def.*\\(.*\\):") # find function definitions
|
|
1408
|
-
smart_search(query="import.*from", caseSensitive=false) # case-insensitive
|
|
1409
|
-
|
|
1410
|
-
**Modes:** auto (intelligent routing), hybrid (semantic+fuzzy), exact (FTS), ripgrep (fast with tokenization), priority (fallback chain)`,
|
|
1703
|
+
**Modes:** fuzzy (FTS + ripgrep fusion, default), semantic (dense + reranker)`,
|
|
1411
1704
|
inputSchema: {
|
|
1412
1705
|
type: 'object',
|
|
1413
1706
|
properties: {
|
|
1414
1707
|
action: {
|
|
1415
1708
|
type: 'string',
|
|
1416
|
-
enum: ['init', 'search', 'find_files', 'status', 'search_files'],
|
|
1417
|
-
description: 'Action: search (content search), find_files (path pattern matching), init (create index), status (check index). Note: search_files is deprecated.',
|
|
1709
|
+
enum: ['init', 'init_force', 'search', 'find_files', 'status', 'update', 'watch', 'search_files'],
|
|
1710
|
+
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.',
|
|
1418
1711
|
default: 'search',
|
|
1419
1712
|
},
|
|
1420
1713
|
query: {
|
|
@@ -1428,8 +1721,8 @@ export const schema = {
|
|
|
1428
1721
|
mode: {
|
|
1429
1722
|
type: 'string',
|
|
1430
1723
|
enum: SEARCH_MODES,
|
|
1431
|
-
description: 'Search mode:
|
|
1432
|
-
default: '
|
|
1724
|
+
description: 'Search mode: fuzzy (FTS + ripgrep fusion, default), semantic (dense + reranker for natural language queries)',
|
|
1725
|
+
default: 'fuzzy',
|
|
1433
1726
|
},
|
|
1434
1727
|
output_mode: {
|
|
1435
1728
|
type: 'string',
|
|
@@ -1800,7 +2093,10 @@ export async function handler(params) {
|
|
|
1800
2093
|
// Handle actions
|
|
1801
2094
|
switch (action) {
|
|
1802
2095
|
case 'init':
|
|
1803
|
-
result = await executeInitAction(parsed.data);
|
|
2096
|
+
result = await executeInitAction(parsed.data, false);
|
|
2097
|
+
break;
|
|
2098
|
+
case 'init_force':
|
|
2099
|
+
result = await executeInitAction(parsed.data, true);
|
|
1804
2100
|
break;
|
|
1805
2101
|
case 'status':
|
|
1806
2102
|
result = await executeStatusAction(parsed.data);
|
|
@@ -1809,6 +2105,14 @@ export async function handler(params) {
|
|
|
1809
2105
|
// NEW: File path/name pattern matching (glob-based)
|
|
1810
2106
|
result = await executeFindFilesAction(parsed.data);
|
|
1811
2107
|
break;
|
|
2108
|
+
case 'update':
|
|
2109
|
+
// Incremental index update
|
|
2110
|
+
result = await executeUpdateAction(parsed.data);
|
|
2111
|
+
break;
|
|
2112
|
+
case 'watch':
|
|
2113
|
+
// Start file watcher (returns status, watcher runs in background)
|
|
2114
|
+
result = await executeWatchAction(parsed.data);
|
|
2115
|
+
break;
|
|
1812
2116
|
case 'search_files':
|
|
1813
2117
|
// DEPRECATED: Redirect to search with files_only output
|
|
1814
2118
|
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.';
|
|
@@ -1816,25 +2120,16 @@ export async function handler(params) {
|
|
|
1816
2120
|
// Fall through to search
|
|
1817
2121
|
case 'search':
|
|
1818
2122
|
default:
|
|
1819
|
-
// Handle search modes:
|
|
2123
|
+
// Handle search modes: fuzzy | semantic
|
|
1820
2124
|
switch (mode) {
|
|
1821
|
-
case '
|
|
1822
|
-
result = await
|
|
2125
|
+
case 'fuzzy':
|
|
2126
|
+
result = await executeFuzzyMode(parsed.data);
|
|
1823
2127
|
break;
|
|
1824
|
-
case '
|
|
2128
|
+
case 'semantic':
|
|
1825
2129
|
result = await executeHybridMode(parsed.data);
|
|
1826
2130
|
break;
|
|
1827
|
-
case 'exact':
|
|
1828
|
-
result = await executeCodexLensExactMode(parsed.data);
|
|
1829
|
-
break;
|
|
1830
|
-
case 'ripgrep':
|
|
1831
|
-
result = await executeRipgrepMode(parsed.data);
|
|
1832
|
-
break;
|
|
1833
|
-
case 'priority':
|
|
1834
|
-
result = await executePriorityFallbackMode(parsed.data);
|
|
1835
|
-
break;
|
|
1836
2131
|
default:
|
|
1837
|
-
throw new Error(`Unsupported mode: ${mode}. Use:
|
|
2132
|
+
throw new Error(`Unsupported mode: ${mode}. Use: fuzzy or semantic`);
|
|
1838
2133
|
}
|
|
1839
2134
|
break;
|
|
1840
2135
|
}
|
|
@@ -1872,10 +2167,13 @@ export async function handler(params) {
|
|
|
1872
2167
|
/**
|
|
1873
2168
|
* Execute init action with external progress callback
|
|
1874
2169
|
* Used by MCP server for streaming progress
|
|
2170
|
+
* @param params - Search parameters (path, languages, force)
|
|
2171
|
+
* @param onProgress - Optional callback for progress updates
|
|
1875
2172
|
*/
|
|
1876
2173
|
export async function executeInitWithProgress(params, onProgress) {
|
|
1877
2174
|
const path = params.path || '.';
|
|
1878
2175
|
const languages = params.languages;
|
|
2176
|
+
const force = params.force || false;
|
|
1879
2177
|
// Check CodexLens availability
|
|
1880
2178
|
const readyStatus = await ensureCodexLensReady();
|
|
1881
2179
|
if (!readyStatus.ready) {
|
|
@@ -1884,9 +2182,13 @@ export async function executeInitWithProgress(params, onProgress) {
|
|
|
1884
2182
|
error: `CodexLens not available: ${readyStatus.error}. CodexLens will be auto-installed on first use.`,
|
|
1885
2183
|
};
|
|
1886
2184
|
}
|
|
1887
|
-
|
|
2185
|
+
// Use 'index init' subcommand (new CLI structure)
|
|
2186
|
+
const args = ['index', 'init', path];
|
|
2187
|
+
if (force) {
|
|
2188
|
+
args.push('--force'); // Force full rebuild
|
|
2189
|
+
}
|
|
1888
2190
|
if (languages && languages.length > 0) {
|
|
1889
|
-
args.push('--
|
|
2191
|
+
args.push('--language', languages.join(','));
|
|
1890
2192
|
}
|
|
1891
2193
|
// Track progress updates
|
|
1892
2194
|
const progressUpdates = [];
|
|
@@ -1905,7 +2207,7 @@ export async function executeInitWithProgress(params, onProgress) {
|
|
|
1905
2207
|
});
|
|
1906
2208
|
// Build metadata with progress info
|
|
1907
2209
|
const metadata = {
|
|
1908
|
-
action: 'init',
|
|
2210
|
+
action: force ? 'init_force' : 'init',
|
|
1909
2211
|
path,
|
|
1910
2212
|
};
|
|
1911
2213
|
if (lastProgress !== null) {
|
|
@@ -1921,11 +2223,12 @@ export async function executeInitWithProgress(params, onProgress) {
|
|
|
1921
2223
|
if (progressUpdates.length > 0) {
|
|
1922
2224
|
metadata.progressHistory = progressUpdates.slice(-5);
|
|
1923
2225
|
}
|
|
2226
|
+
const actionLabel = force ? 'rebuilt (force)' : 'created';
|
|
1924
2227
|
return {
|
|
1925
2228
|
success: result.success,
|
|
1926
2229
|
error: result.error,
|
|
1927
2230
|
message: result.success
|
|
1928
|
-
? `CodexLens index
|
|
2231
|
+
? `CodexLens index ${actionLabel} successfully for ${path}`
|
|
1929
2232
|
: undefined,
|
|
1930
2233
|
metadata,
|
|
1931
2234
|
};
|