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
|
@@ -17,6 +17,13 @@ import { join, dirname } from 'path';
|
|
|
17
17
|
import { homedir } from 'os';
|
|
18
18
|
import { fileURLToPath } from 'url';
|
|
19
19
|
import { getSystemPython } from '../utils/python-utils.js';
|
|
20
|
+
import { EXEC_TIMEOUTS } from '../utils/exec-constants.js';
|
|
21
|
+
import {
|
|
22
|
+
UvManager,
|
|
23
|
+
ensureUvInstalled,
|
|
24
|
+
isUvAvailable,
|
|
25
|
+
createCodexLensUvManager,
|
|
26
|
+
} from '../utils/uv-manager.js';
|
|
20
27
|
|
|
21
28
|
// Get directory of this module
|
|
22
29
|
const __filename = fileURLToPath(import.meta.url);
|
|
@@ -322,33 +329,71 @@ async function ensureLiteLLMEmbedderReady(): Promise<BootstrapResult> {
|
|
|
322
329
|
return { success: true };
|
|
323
330
|
}
|
|
324
331
|
|
|
325
|
-
|
|
326
|
-
process.platform === 'win32'
|
|
327
|
-
? join(CODEXLENS_VENV, 'Scripts', 'pip.exe')
|
|
328
|
-
: join(CODEXLENS_VENV, 'bin', 'pip');
|
|
332
|
+
console.log('[CodexLens] Installing ccw-litellm for LiteLLM embedding backend...');
|
|
329
333
|
|
|
330
|
-
|
|
331
|
-
|
|
334
|
+
// Find local ccw-litellm package path
|
|
335
|
+
const possiblePaths = [
|
|
336
|
+
join(process.cwd(), 'ccw-litellm'),
|
|
337
|
+
join(__dirname, '..', '..', '..', 'ccw-litellm'), // ccw/src/tools -> project root
|
|
338
|
+
join(homedir(), 'ccw-litellm'),
|
|
339
|
+
];
|
|
332
340
|
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
341
|
+
let localPath: string | null = null;
|
|
342
|
+
for (const p of possiblePaths) {
|
|
343
|
+
if (existsSync(join(p, 'pyproject.toml'))) {
|
|
344
|
+
localPath = p;
|
|
345
|
+
break;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
338
348
|
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
349
|
+
// Priority: Use UV if available (faster, better dependency resolution)
|
|
350
|
+
if (await isUvAvailable()) {
|
|
351
|
+
console.log('[CodexLens] Using UV for ccw-litellm installation...');
|
|
352
|
+
try {
|
|
353
|
+
const uv = createCodexLensUvManager();
|
|
354
|
+
|
|
355
|
+
// Ensure venv exists
|
|
356
|
+
if (!uv.isVenvValid()) {
|
|
357
|
+
const venvResult = await uv.createVenv();
|
|
358
|
+
if (!venvResult.success) {
|
|
359
|
+
console.log('[CodexLens] UV venv creation failed, falling back to pip:', venvResult.error);
|
|
360
|
+
// Fall through to pip fallback
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
if (uv.isVenvValid()) {
|
|
365
|
+
let uvResult;
|
|
366
|
+
if (localPath) {
|
|
367
|
+
console.log(`[CodexLens] Installing ccw-litellm from local path with UV: ${localPath}`);
|
|
368
|
+
uvResult = await uv.installFromProject(localPath);
|
|
369
|
+
} else {
|
|
370
|
+
console.log('[CodexLens] Installing ccw-litellm from PyPI with UV...');
|
|
371
|
+
uvResult = await uv.install(['ccw-litellm']);
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
if (uvResult.success) {
|
|
375
|
+
return { success: true };
|
|
376
|
+
}
|
|
377
|
+
console.log('[CodexLens] UV install failed, falling back to pip:', uvResult.error);
|
|
346
378
|
}
|
|
379
|
+
} catch (uvErr) {
|
|
380
|
+
console.log('[CodexLens] UV error, falling back to pip:', (uvErr as Error).message);
|
|
347
381
|
}
|
|
382
|
+
}
|
|
348
383
|
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
384
|
+
// Fallback: Use pip for installation
|
|
385
|
+
const pipPath =
|
|
386
|
+
process.platform === 'win32'
|
|
387
|
+
? join(CODEXLENS_VENV, 'Scripts', 'pip.exe')
|
|
388
|
+
: join(CODEXLENS_VENV, 'bin', 'pip');
|
|
389
|
+
|
|
390
|
+
try {
|
|
391
|
+
if (localPath) {
|
|
392
|
+
console.log(`[CodexLens] Installing ccw-litellm from local path with pip: ${localPath}`);
|
|
393
|
+
execSync(`"${pipPath}" install -e "${localPath}"`, { stdio: 'inherit', timeout: EXEC_TIMEOUTS.PACKAGE_INSTALL });
|
|
394
|
+
} else {
|
|
395
|
+
console.log('[CodexLens] Installing ccw-litellm from PyPI with pip...');
|
|
396
|
+
execSync(`"${pipPath}" install ccw-litellm`, { stdio: 'inherit', timeout: EXEC_TIMEOUTS.PACKAGE_INSTALL });
|
|
352
397
|
}
|
|
353
398
|
|
|
354
399
|
return { success: true };
|
|
@@ -362,6 +407,15 @@ async function ensureLiteLLMEmbedderReady(): Promise<BootstrapResult> {
|
|
|
362
407
|
*/
|
|
363
408
|
type GpuMode = 'cpu' | 'cuda' | 'directml';
|
|
364
409
|
|
|
410
|
+
/**
|
|
411
|
+
* Mapping from GPU mode to codexlens extras for UV installation
|
|
412
|
+
*/
|
|
413
|
+
const GPU_MODE_EXTRAS: Record<GpuMode, string[]> = {
|
|
414
|
+
cpu: ['semantic'],
|
|
415
|
+
cuda: ['semantic-gpu'],
|
|
416
|
+
directml: ['semantic-directml'],
|
|
417
|
+
};
|
|
418
|
+
|
|
365
419
|
/**
|
|
366
420
|
* Python environment info for compatibility checks
|
|
367
421
|
*/
|
|
@@ -389,7 +443,8 @@ async function checkPythonEnvForDirectML(): Promise<PythonEnvInfo> {
|
|
|
389
443
|
|
|
390
444
|
try {
|
|
391
445
|
// Get Python version and architecture in one call
|
|
392
|
-
|
|
446
|
+
// Use % formatting instead of f-string to avoid Windows shell escaping issues with curly braces
|
|
447
|
+
const checkScript = `import sys, struct; print('%d.%d.%d|%d' % (sys.version_info.major, sys.version_info.minor, sys.version_info.micro, struct.calcsize('P') * 8))`;
|
|
393
448
|
const result = execSync(`"${pythonPath}" -c "${checkScript}"`, { encoding: 'utf-8', timeout: 10000 }).trim();
|
|
394
449
|
const [version, archStr] = result.split('|');
|
|
395
450
|
const architecture = parseInt(archStr, 10);
|
|
@@ -425,11 +480,11 @@ async function detectGpuSupport(): Promise<{ mode: GpuMode; available: GpuMode[]
|
|
|
425
480
|
// Check for NVIDIA GPU (CUDA)
|
|
426
481
|
try {
|
|
427
482
|
if (process.platform === 'win32') {
|
|
428
|
-
execSync('nvidia-smi', { stdio: 'pipe' });
|
|
483
|
+
execSync('nvidia-smi', { stdio: 'pipe', timeout: EXEC_TIMEOUTS.SYSTEM_INFO });
|
|
429
484
|
available.push('cuda');
|
|
430
485
|
detectedInfo = 'NVIDIA GPU detected (CUDA available)';
|
|
431
486
|
} else {
|
|
432
|
-
execSync('which nvidia-smi', { stdio: 'pipe' });
|
|
487
|
+
execSync('which nvidia-smi', { stdio: 'pipe', timeout: EXEC_TIMEOUTS.SYSTEM_INFO });
|
|
433
488
|
available.push('cuda');
|
|
434
489
|
detectedInfo = 'NVIDIA GPU detected (CUDA available)';
|
|
435
490
|
}
|
|
@@ -465,12 +520,165 @@ async function detectGpuSupport(): Promise<{ mode: GpuMode; available: GpuMode[]
|
|
|
465
520
|
return { mode: recommendedMode, available, info: detectedInfo, pythonEnv };
|
|
466
521
|
}
|
|
467
522
|
|
|
523
|
+
/**
|
|
524
|
+
* Bootstrap CodexLens venv using UV (fast package manager)
|
|
525
|
+
* @param gpuMode - GPU acceleration mode for semantic search
|
|
526
|
+
* @returns Bootstrap result
|
|
527
|
+
*/
|
|
528
|
+
async function bootstrapWithUv(gpuMode: GpuMode = 'cpu'): Promise<BootstrapResult> {
|
|
529
|
+
console.log('[CodexLens] Bootstrapping with UV package manager...');
|
|
530
|
+
|
|
531
|
+
// Ensure UV is installed
|
|
532
|
+
const uvInstalled = await ensureUvInstalled();
|
|
533
|
+
if (!uvInstalled) {
|
|
534
|
+
return { success: false, error: 'Failed to install UV package manager' };
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
// Create UV manager for CodexLens
|
|
538
|
+
const uv = createCodexLensUvManager();
|
|
539
|
+
|
|
540
|
+
// Create venv if not exists
|
|
541
|
+
if (!uv.isVenvValid()) {
|
|
542
|
+
console.log('[CodexLens] Creating virtual environment with UV...');
|
|
543
|
+
const createResult = await uv.createVenv();
|
|
544
|
+
if (!createResult.success) {
|
|
545
|
+
return { success: false, error: `Failed to create venv: ${createResult.error}` };
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
// Find local codex-lens package
|
|
550
|
+
const possiblePaths = [
|
|
551
|
+
join(process.cwd(), 'codex-lens'),
|
|
552
|
+
join(__dirname, '..', '..', '..', 'codex-lens'), // ccw/src/tools -> project root
|
|
553
|
+
join(homedir(), 'codex-lens'),
|
|
554
|
+
];
|
|
555
|
+
|
|
556
|
+
let codexLensPath: string | null = null;
|
|
557
|
+
for (const localPath of possiblePaths) {
|
|
558
|
+
if (existsSync(join(localPath, 'pyproject.toml'))) {
|
|
559
|
+
codexLensPath = localPath;
|
|
560
|
+
break;
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
// Determine extras based on GPU mode
|
|
565
|
+
const extras = GPU_MODE_EXTRAS[gpuMode];
|
|
566
|
+
|
|
567
|
+
if (codexLensPath) {
|
|
568
|
+
console.log(`[CodexLens] Installing from local path with UV: ${codexLensPath}`);
|
|
569
|
+
console.log(`[CodexLens] Extras: ${extras.join(', ')}`);
|
|
570
|
+
const installResult = await uv.installFromProject(codexLensPath, extras);
|
|
571
|
+
if (!installResult.success) {
|
|
572
|
+
return { success: false, error: `Failed to install codexlens: ${installResult.error}` };
|
|
573
|
+
}
|
|
574
|
+
} else {
|
|
575
|
+
// Install from PyPI with extras
|
|
576
|
+
console.log('[CodexLens] Installing from PyPI with UV...');
|
|
577
|
+
const packageSpec = `codexlens[${extras.join(',')}]`;
|
|
578
|
+
const installResult = await uv.install([packageSpec]);
|
|
579
|
+
if (!installResult.success) {
|
|
580
|
+
return { success: false, error: `Failed to install codexlens: ${installResult.error}` };
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
// Clear cache after successful installation
|
|
585
|
+
clearVenvStatusCache();
|
|
586
|
+
console.log(`[CodexLens] Bootstrap with UV complete (${gpuMode} mode)`);
|
|
587
|
+
return { success: true, message: `Installed with UV (${gpuMode} mode)` };
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
/**
|
|
591
|
+
* Install semantic search dependencies using UV (fast package manager)
|
|
592
|
+
* UV automatically handles ONNX Runtime conflicts
|
|
593
|
+
* @param gpuMode - GPU acceleration mode: 'cpu', 'cuda', or 'directml'
|
|
594
|
+
* @returns Bootstrap result
|
|
595
|
+
*/
|
|
596
|
+
async function installSemanticWithUv(gpuMode: GpuMode = 'cpu'): Promise<BootstrapResult> {
|
|
597
|
+
console.log('[CodexLens] Installing semantic dependencies with UV...');
|
|
598
|
+
|
|
599
|
+
// First check if CodexLens is installed
|
|
600
|
+
const venvStatus = await checkVenvStatus();
|
|
601
|
+
if (!venvStatus.ready) {
|
|
602
|
+
return { success: false, error: 'CodexLens not installed. Install CodexLens first.' };
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
// Check Python environment compatibility for DirectML
|
|
606
|
+
if (gpuMode === 'directml') {
|
|
607
|
+
const pythonEnv = await checkPythonEnvForDirectML();
|
|
608
|
+
if (!pythonEnv.compatible) {
|
|
609
|
+
const errorDetails = pythonEnv.error || 'Unknown compatibility issue';
|
|
610
|
+
return {
|
|
611
|
+
success: false,
|
|
612
|
+
error: `DirectML installation failed: ${errorDetails}\n\nTo fix this:\n1. Uninstall current Python\n2. Install 64-bit Python 3.10, 3.11, or 3.12 from python.org\n3. Delete ~/.codexlens/venv folder\n4. Reinstall CodexLens`,
|
|
613
|
+
};
|
|
614
|
+
}
|
|
615
|
+
console.log(`[CodexLens] Python ${pythonEnv.version} (${pythonEnv.architecture}-bit) - DirectML compatible`);
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
// Create UV manager
|
|
619
|
+
const uv = createCodexLensUvManager();
|
|
620
|
+
|
|
621
|
+
// Find local codex-lens package
|
|
622
|
+
const possiblePaths = [
|
|
623
|
+
join(process.cwd(), 'codex-lens'),
|
|
624
|
+
join(__dirname, '..', '..', '..', 'codex-lens'),
|
|
625
|
+
join(homedir(), 'codex-lens'),
|
|
626
|
+
];
|
|
627
|
+
|
|
628
|
+
let codexLensPath: string | null = null;
|
|
629
|
+
for (const localPath of possiblePaths) {
|
|
630
|
+
if (existsSync(join(localPath, 'pyproject.toml'))) {
|
|
631
|
+
codexLensPath = localPath;
|
|
632
|
+
break;
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
// Determine extras based on GPU mode
|
|
637
|
+
const extras = GPU_MODE_EXTRAS[gpuMode];
|
|
638
|
+
const modeDescription =
|
|
639
|
+
gpuMode === 'cuda'
|
|
640
|
+
? 'NVIDIA CUDA GPU acceleration'
|
|
641
|
+
: gpuMode === 'directml'
|
|
642
|
+
? 'Windows DirectML GPU acceleration'
|
|
643
|
+
: 'CPU (ONNX Runtime)';
|
|
644
|
+
|
|
645
|
+
console.log(`[CodexLens] Mode: ${modeDescription}`);
|
|
646
|
+
console.log(`[CodexLens] Extras: ${extras.join(', ')}`);
|
|
647
|
+
|
|
648
|
+
// Install with extras - UV handles dependency conflicts automatically
|
|
649
|
+
if (codexLensPath) {
|
|
650
|
+
console.log(`[CodexLens] Reinstalling from local path with semantic extras...`);
|
|
651
|
+
const installResult = await uv.installFromProject(codexLensPath, extras);
|
|
652
|
+
if (!installResult.success) {
|
|
653
|
+
return { success: false, error: `Installation failed: ${installResult.error}` };
|
|
654
|
+
}
|
|
655
|
+
} else {
|
|
656
|
+
// Install from PyPI
|
|
657
|
+
const packageSpec = `codexlens[${extras.join(',')}]`;
|
|
658
|
+
console.log(`[CodexLens] Installing ${packageSpec} from PyPI...`);
|
|
659
|
+
const installResult = await uv.install([packageSpec]);
|
|
660
|
+
if (!installResult.success) {
|
|
661
|
+
return { success: false, error: `Installation failed: ${installResult.error}` };
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
console.log(`[CodexLens] Semantic dependencies installed successfully (${gpuMode} mode)`);
|
|
666
|
+
return { success: true, message: `Installed with ${modeDescription}` };
|
|
667
|
+
}
|
|
668
|
+
|
|
468
669
|
/**
|
|
469
670
|
* Install semantic search dependencies with optional GPU acceleration
|
|
470
671
|
* @param gpuMode - GPU acceleration mode: 'cpu', 'cuda', or 'directml'
|
|
471
672
|
* @returns Bootstrap result
|
|
472
673
|
*/
|
|
473
674
|
async function installSemantic(gpuMode: GpuMode = 'cpu'): Promise<BootstrapResult> {
|
|
675
|
+
// Prefer UV if available
|
|
676
|
+
if (await isUvAvailable()) {
|
|
677
|
+
console.log('[CodexLens] Using UV for semantic installation...');
|
|
678
|
+
return installSemanticWithUv(gpuMode);
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
// Fall back to pip logic...
|
|
474
682
|
// First ensure CodexLens is installed
|
|
475
683
|
const venvStatus = await checkVenvStatus();
|
|
476
684
|
if (!venvStatus.ready) {
|
|
@@ -502,7 +710,7 @@ async function installSemantic(gpuMode: GpuMode = 'cpu'): Promise<BootstrapResul
|
|
|
502
710
|
|
|
503
711
|
for (const pkg of onnxVariants) {
|
|
504
712
|
try {
|
|
505
|
-
execSync(`"${pipPath}" uninstall ${pkg} -y`, { stdio: 'pipe' });
|
|
713
|
+
execSync(`"${pipPath}" uninstall ${pkg} -y`, { stdio: 'pipe', timeout: EXEC_TIMEOUTS.PACKAGE_INSTALL });
|
|
506
714
|
console.log(`[CodexLens] Removed ${pkg}`);
|
|
507
715
|
} catch {
|
|
508
716
|
// Package not installed, ignore
|
|
@@ -586,7 +794,7 @@ async function installSemantic(gpuMode: GpuMode = 'cpu'): Promise<BootstrapResul
|
|
|
586
794
|
if (gpuMode !== 'cpu') {
|
|
587
795
|
try {
|
|
588
796
|
console.log(`[CodexLens] Reinstalling ${onnxPackage} to ensure GPU provider works...`);
|
|
589
|
-
execSync(`"${pipPath}" install --force-reinstall ${onnxPackage}`, { stdio: 'pipe', timeout:
|
|
797
|
+
execSync(`"${pipPath}" install --force-reinstall ${onnxPackage}`, { stdio: 'pipe', timeout: EXEC_TIMEOUTS.PACKAGE_INSTALL });
|
|
590
798
|
console.log(`[CodexLens] ${onnxPackage} reinstalled successfully`);
|
|
591
799
|
} catch (e) {
|
|
592
800
|
console.warn(`[CodexLens] Warning: Failed to reinstall ${onnxPackage}: ${(e as Error).message}`);
|
|
@@ -615,6 +823,13 @@ async function installSemantic(gpuMode: GpuMode = 'cpu'): Promise<BootstrapResul
|
|
|
615
823
|
* @returns Bootstrap result
|
|
616
824
|
*/
|
|
617
825
|
async function bootstrapVenv(): Promise<BootstrapResult> {
|
|
826
|
+
// Prefer UV if available (faster package resolution and installation)
|
|
827
|
+
if (await isUvAvailable()) {
|
|
828
|
+
console.log('[CodexLens] Using UV for bootstrap...');
|
|
829
|
+
return bootstrapWithUv();
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
// Fall back to pip logic...
|
|
618
833
|
// Ensure data directory exists
|
|
619
834
|
if (!existsSync(CODEXLENS_DATA_DIR)) {
|
|
620
835
|
mkdirSync(CODEXLENS_DATA_DIR, { recursive: true });
|
|
@@ -625,7 +840,7 @@ async function bootstrapVenv(): Promise<BootstrapResult> {
|
|
|
625
840
|
try {
|
|
626
841
|
console.log('[CodexLens] Creating virtual environment...');
|
|
627
842
|
const pythonCmd = getSystemPython();
|
|
628
|
-
execSync(`${pythonCmd} -m venv "${CODEXLENS_VENV}"`, { stdio: 'inherit' });
|
|
843
|
+
execSync(`${pythonCmd} -m venv "${CODEXLENS_VENV}"`, { stdio: 'inherit', timeout: EXEC_TIMEOUTS.PROCESS_SPAWN });
|
|
629
844
|
} catch (err) {
|
|
630
845
|
return { success: false, error: `Failed to create venv: ${(err as Error).message}` };
|
|
631
846
|
}
|
|
@@ -650,7 +865,7 @@ async function bootstrapVenv(): Promise<BootstrapResult> {
|
|
|
650
865
|
for (const localPath of possiblePaths) {
|
|
651
866
|
if (existsSync(join(localPath, 'pyproject.toml'))) {
|
|
652
867
|
console.log(`[CodexLens] Installing from local path: ${localPath}`);
|
|
653
|
-
execSync(`"${pipPath}" install -e "${localPath}"`, { stdio: 'inherit' });
|
|
868
|
+
execSync(`"${pipPath}" install -e "${localPath}"`, { stdio: 'inherit', timeout: EXEC_TIMEOUTS.PACKAGE_INSTALL });
|
|
654
869
|
installed = true;
|
|
655
870
|
break;
|
|
656
871
|
}
|
|
@@ -658,7 +873,7 @@ async function bootstrapVenv(): Promise<BootstrapResult> {
|
|
|
658
873
|
|
|
659
874
|
if (!installed) {
|
|
660
875
|
console.log('[CodexLens] Installing from PyPI...');
|
|
661
|
-
execSync(`"${pipPath}" install codexlens`, { stdio: 'inherit' });
|
|
876
|
+
execSync(`"${pipPath}" install codexlens`, { stdio: 'inherit', timeout: EXEC_TIMEOUTS.PACKAGE_INSTALL });
|
|
662
877
|
}
|
|
663
878
|
|
|
664
879
|
// Clear cache after successful installation
|
|
@@ -807,31 +1022,17 @@ async function executeCodexLens(args: string[], options: ExecuteOptions = {}): P
|
|
|
807
1022
|
}
|
|
808
1023
|
|
|
809
1024
|
return new Promise((resolve) => {
|
|
810
|
-
//
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
});
|
|
819
|
-
|
|
820
|
-
// Build full command - on Windows, prepend cd to handle different drives
|
|
821
|
-
let fullCmd: string;
|
|
822
|
-
if (process.platform === 'win32' && cwd) {
|
|
823
|
-
// Use cd /d to change drive and directory, then run command
|
|
824
|
-
fullCmd = `cd /d "${cwd}" && ${quotedPython} -m codexlens ${cmdArgs.join(' ')}`;
|
|
825
|
-
} else {
|
|
826
|
-
fullCmd = `${quotedPython} -m codexlens ${cmdArgs.join(' ')}`;
|
|
827
|
-
}
|
|
828
|
-
|
|
829
|
-
// Use spawn with shell for real-time progress updates
|
|
830
|
-
// spawn streams output in real-time, unlike exec which buffers until completion
|
|
831
|
-
const child = spawn(fullCmd, [], {
|
|
832
|
-
cwd: process.platform === 'win32' ? undefined : cwd,
|
|
833
|
-
shell: process.platform === 'win32' ? process.env.ComSpec || true : true,
|
|
1025
|
+
// SECURITY: Use spawn without shell to prevent command injection
|
|
1026
|
+
// Pass arguments directly - no manual quoting needed
|
|
1027
|
+
// spawn's cwd option handles drive changes correctly on Windows
|
|
1028
|
+
const spawnArgs = ['-m', 'codexlens', ...args];
|
|
1029
|
+
|
|
1030
|
+
const child = spawn(VENV_PYTHON, spawnArgs, {
|
|
1031
|
+
cwd,
|
|
1032
|
+
shell: false, // CRITICAL: Prevent command injection
|
|
834
1033
|
timeout,
|
|
1034
|
+
// Ensure proper encoding on Windows
|
|
1035
|
+
env: { ...process.env, PYTHONIOENCODING: 'utf-8' },
|
|
835
1036
|
});
|
|
836
1037
|
|
|
837
1038
|
// Track indexing process for cancellation (only for init commands)
|
|
@@ -953,9 +1154,10 @@ async function executeCodexLens(args: string[], options: ExecuteOptions = {}): P
|
|
|
953
1154
|
async function initIndex(params: Params): Promise<ExecuteResult> {
|
|
954
1155
|
const { path = '.', languages } = params;
|
|
955
1156
|
|
|
956
|
-
|
|
1157
|
+
// Use 'index init' subcommand (new CLI structure)
|
|
1158
|
+
const args = ['index', 'init', path];
|
|
957
1159
|
if (languages && languages.length > 0) {
|
|
958
|
-
args.push('--
|
|
1160
|
+
args.push('--language', languages.join(','));
|
|
959
1161
|
}
|
|
960
1162
|
|
|
961
1163
|
return executeCodexLens(args, { cwd: path });
|
|
@@ -1373,11 +1575,57 @@ async function uninstallCodexLens(): Promise<BootstrapResult> {
|
|
|
1373
1575
|
}
|
|
1374
1576
|
|
|
1375
1577
|
console.log('[CodexLens] Uninstalling CodexLens...');
|
|
1578
|
+
|
|
1579
|
+
// On Windows, kill any Python processes that might be holding locks on .db files
|
|
1580
|
+
if (process.platform === 'win32') {
|
|
1581
|
+
console.log('[CodexLens] Killing any CodexLens Python processes...');
|
|
1582
|
+
const { execSync } = await import('child_process');
|
|
1583
|
+
try {
|
|
1584
|
+
// Kill any python processes from our venv that might be holding file locks
|
|
1585
|
+
execSync(`taskkill /F /IM python.exe /FI "MODULES eq sqlite3" 2>nul`, { stdio: 'ignore', timeout: EXEC_TIMEOUTS.SYSTEM_INFO });
|
|
1586
|
+
} catch {
|
|
1587
|
+
// Ignore errors - no processes to kill
|
|
1588
|
+
}
|
|
1589
|
+
// Small delay to allow file handles to be released
|
|
1590
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
1591
|
+
}
|
|
1592
|
+
|
|
1376
1593
|
console.log(`[CodexLens] Removing directory: ${CODEXLENS_DATA_DIR}`);
|
|
1377
1594
|
|
|
1378
|
-
// Remove the entire .codexlens directory
|
|
1595
|
+
// Remove the entire .codexlens directory with retry logic for locked files
|
|
1379
1596
|
const fs = await import('fs');
|
|
1380
|
-
|
|
1597
|
+
const path = await import('path');
|
|
1598
|
+
|
|
1599
|
+
// Helper function to remove directory with retries (Windows EBUSY workaround)
|
|
1600
|
+
const removeWithRetry = async (dirPath: string, maxRetries = 3, delay = 1000): Promise<void> => {
|
|
1601
|
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
1602
|
+
try {
|
|
1603
|
+
fs.rmSync(dirPath, { recursive: true, force: true, maxRetries: 3, retryDelay: 500 });
|
|
1604
|
+
return;
|
|
1605
|
+
} catch (err: any) {
|
|
1606
|
+
if (err.code === 'EBUSY' || err.code === 'EPERM' || err.code === 'ENOTEMPTY') {
|
|
1607
|
+
console.log(`[CodexLens] Retry ${attempt}/${maxRetries} - file locked, waiting...`);
|
|
1608
|
+
if (attempt < maxRetries) {
|
|
1609
|
+
// On Windows, try to forcefully release file handles
|
|
1610
|
+
if (process.platform === 'win32' && err.path) {
|
|
1611
|
+
try {
|
|
1612
|
+
const { execSync } = await import('child_process');
|
|
1613
|
+
// Try to close handles on the specific file
|
|
1614
|
+
execSync(`handle -c ${err.path} -y 2>nul`, { stdio: 'ignore', timeout: EXEC_TIMEOUTS.SYSTEM_INFO });
|
|
1615
|
+
} catch {
|
|
1616
|
+
// handle.exe may not be installed, ignore
|
|
1617
|
+
}
|
|
1618
|
+
}
|
|
1619
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
1620
|
+
continue;
|
|
1621
|
+
}
|
|
1622
|
+
}
|
|
1623
|
+
throw err;
|
|
1624
|
+
}
|
|
1625
|
+
}
|
|
1626
|
+
};
|
|
1627
|
+
|
|
1628
|
+
await removeWithRetry(CODEXLENS_DATA_DIR);
|
|
1381
1629
|
|
|
1382
1630
|
// Reset bootstrap cache
|
|
1383
1631
|
bootstrapChecked = false;
|
|
@@ -1387,7 +1635,15 @@ async function uninstallCodexLens(): Promise<BootstrapResult> {
|
|
|
1387
1635
|
console.log('[CodexLens] CodexLens uninstalled successfully');
|
|
1388
1636
|
return { success: true, message: 'CodexLens uninstalled successfully' };
|
|
1389
1637
|
} catch (err) {
|
|
1390
|
-
|
|
1638
|
+
const errorMsg = (err as Error).message;
|
|
1639
|
+
// Provide helpful message for Windows users with locked files
|
|
1640
|
+
if (errorMsg.includes('EBUSY') || errorMsg.includes('resource busy')) {
|
|
1641
|
+
return {
|
|
1642
|
+
success: false,
|
|
1643
|
+
error: `Failed to uninstall CodexLens: Files are locked. Please close any applications using CodexLens indexes (e.g., Claude Code, VS Code) and try again. Details: ${errorMsg}`
|
|
1644
|
+
};
|
|
1645
|
+
}
|
|
1646
|
+
return { success: false, error: `Failed to uninstall CodexLens: ${errorMsg}` };
|
|
1391
1647
|
}
|
|
1392
1648
|
}
|
|
1393
1649
|
|
|
@@ -1412,7 +1668,7 @@ function cancelIndexing(): { success: boolean; message?: string; error?: string
|
|
|
1412
1668
|
// On Windows, use taskkill to kill the process tree
|
|
1413
1669
|
const { execSync } = require('child_process');
|
|
1414
1670
|
try {
|
|
1415
|
-
execSync(`taskkill /pid ${currentIndexingProcess.pid} /T /F`, { stdio: 'ignore' });
|
|
1671
|
+
execSync(`taskkill /pid ${currentIndexingProcess.pid} /T /F`, { stdio: 'ignore', timeout: EXEC_TIMEOUTS.SYSTEM_INFO });
|
|
1416
1672
|
} catch {
|
|
1417
1673
|
// Process may have already exited
|
|
1418
1674
|
}
|
|
@@ -1459,7 +1715,16 @@ export {
|
|
|
1459
1715
|
uninstallCodexLens,
|
|
1460
1716
|
cancelIndexing,
|
|
1461
1717
|
isIndexingInProgress,
|
|
1718
|
+
// UV-based installation functions
|
|
1719
|
+
bootstrapWithUv,
|
|
1720
|
+
installSemanticWithUv,
|
|
1462
1721
|
};
|
|
1722
|
+
|
|
1723
|
+
// Export Python path for direct spawn usage (e.g., watcher)
|
|
1724
|
+
export function getVenvPythonPath(): string {
|
|
1725
|
+
return VENV_PYTHON;
|
|
1726
|
+
}
|
|
1727
|
+
|
|
1463
1728
|
export type { GpuMode, PythonEnvInfo };
|
|
1464
1729
|
|
|
1465
1730
|
// Backward-compatible export for tests
|
|
@@ -8,6 +8,15 @@ import type { ToolSchema, ToolResult } from '../types/tool.js';
|
|
|
8
8
|
import { readdirSync, statSync, existsSync } from 'fs';
|
|
9
9
|
import { join, resolve, dirname, extname, relative } from 'path';
|
|
10
10
|
import { execSync } from 'child_process';
|
|
11
|
+
import { EXEC_TIMEOUTS } from '../utils/exec-constants.js';
|
|
12
|
+
|
|
13
|
+
function isExecTimeoutError(error: unknown): boolean {
|
|
14
|
+
const err = error as { code?: unknown; errno?: unknown; message?: unknown } | null;
|
|
15
|
+
const code = err?.code ?? err?.errno;
|
|
16
|
+
if (code === 'ETIMEDOUT') return true;
|
|
17
|
+
const message = typeof err?.message === 'string' ? err.message : '';
|
|
18
|
+
return message.includes('ETIMEDOUT');
|
|
19
|
+
}
|
|
11
20
|
|
|
12
21
|
// Source file extensions to track
|
|
13
22
|
const SOURCE_EXTENSIONS = [
|
|
@@ -53,9 +62,12 @@ interface ToolOutput {
|
|
|
53
62
|
*/
|
|
54
63
|
function isGitRepo(basePath: string): boolean {
|
|
55
64
|
try {
|
|
56
|
-
execSync('git rev-parse --git-dir', { cwd: basePath, stdio: 'pipe' });
|
|
65
|
+
execSync('git rev-parse --git-dir', { cwd: basePath, stdio: 'pipe', timeout: EXEC_TIMEOUTS.GIT_QUICK });
|
|
57
66
|
return true;
|
|
58
|
-
} catch (e) {
|
|
67
|
+
} catch (e: unknown) {
|
|
68
|
+
if (isExecTimeoutError(e)) {
|
|
69
|
+
console.warn(`[detect_changed_modules] git rev-parse timed out after ${EXEC_TIMEOUTS.GIT_QUICK}ms`);
|
|
70
|
+
}
|
|
59
71
|
return false;
|
|
60
72
|
}
|
|
61
73
|
}
|
|
@@ -69,13 +81,15 @@ function getGitChangedFiles(basePath: string): string[] {
|
|
|
69
81
|
let output = execSync('git diff --name-only HEAD 2>/dev/null', {
|
|
70
82
|
cwd: basePath,
|
|
71
83
|
encoding: 'utf8',
|
|
72
|
-
stdio: ['pipe', 'pipe', 'pipe']
|
|
84
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
85
|
+
timeout: EXEC_TIMEOUTS.GIT_DIFF,
|
|
73
86
|
}).trim();
|
|
74
87
|
|
|
75
88
|
const cachedOutput = execSync('git diff --name-only --cached 2>/dev/null', {
|
|
76
89
|
cwd: basePath,
|
|
77
90
|
encoding: 'utf8',
|
|
78
|
-
stdio: ['pipe', 'pipe', 'pipe']
|
|
91
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
92
|
+
timeout: EXEC_TIMEOUTS.GIT_DIFF,
|
|
79
93
|
}).trim();
|
|
80
94
|
|
|
81
95
|
if (cachedOutput) {
|
|
@@ -87,12 +101,16 @@ function getGitChangedFiles(basePath: string): string[] {
|
|
|
87
101
|
output = execSync('git diff --name-only HEAD~1 HEAD 2>/dev/null', {
|
|
88
102
|
cwd: basePath,
|
|
89
103
|
encoding: 'utf8',
|
|
90
|
-
stdio: ['pipe', 'pipe', 'pipe']
|
|
104
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
105
|
+
timeout: EXEC_TIMEOUTS.GIT_DIFF,
|
|
91
106
|
}).trim();
|
|
92
107
|
}
|
|
93
108
|
|
|
94
109
|
return output ? output.split('\n').filter(f => f.trim()) : [];
|
|
95
|
-
} catch (e) {
|
|
110
|
+
} catch (e: unknown) {
|
|
111
|
+
if (isExecTimeoutError(e)) {
|
|
112
|
+
console.warn(`[detect_changed_modules] git diff timed out after ${EXEC_TIMEOUTS.GIT_DIFF}ms`);
|
|
113
|
+
}
|
|
96
114
|
return [];
|
|
97
115
|
}
|
|
98
116
|
}
|
package/ccw/src/tools/index.ts
CHANGED
|
@@ -23,6 +23,7 @@ import { executeInitWithProgress } from './smart-search.js';
|
|
|
23
23
|
import * as readFileMod from './read-file.js';
|
|
24
24
|
import * as coreMemoryMod from './core-memory.js';
|
|
25
25
|
import * as contextCacheMod from './context-cache.js';
|
|
26
|
+
import * as skillContextLoaderMod from './skill-context-loader.js';
|
|
26
27
|
import type { ProgressInfo } from './codex-lens.js';
|
|
27
28
|
|
|
28
29
|
// Import legacy JS tools
|
|
@@ -359,6 +360,7 @@ registerTool(toLegacyTool(smartSearchMod));
|
|
|
359
360
|
registerTool(toLegacyTool(readFileMod));
|
|
360
361
|
registerTool(toLegacyTool(coreMemoryMod));
|
|
361
362
|
registerTool(toLegacyTool(contextCacheMod));
|
|
363
|
+
registerTool(toLegacyTool(skillContextLoaderMod));
|
|
362
364
|
|
|
363
365
|
// Register legacy JS tools
|
|
364
366
|
registerTool(uiGeneratePreviewTool);
|
|
@@ -114,7 +114,8 @@ export class LiteLLMClient {
|
|
|
114
114
|
*/
|
|
115
115
|
async isAvailable(): Promise<boolean> {
|
|
116
116
|
try {
|
|
117
|
-
|
|
117
|
+
// Increased timeout to 15s for Python cold start
|
|
118
|
+
await this.executePython(['version'], { timeout: 15000 });
|
|
118
119
|
return true;
|
|
119
120
|
} catch {
|
|
120
121
|
return false;
|
|
@@ -126,10 +127,14 @@ export class LiteLLMClient {
|
|
|
126
127
|
*/
|
|
127
128
|
async getStatus(): Promise<LiteLLMStatus> {
|
|
128
129
|
try {
|
|
129
|
-
|
|
130
|
+
// Increased timeout to 15s for Python cold start
|
|
131
|
+
const output = await this.executePython(['version'], { timeout: 15000 });
|
|
132
|
+
// Parse "ccw-litellm 0.1.0" format
|
|
133
|
+
const versionMatch = output.trim().match(/ccw-litellm\s+([\d.]+)/);
|
|
134
|
+
const version = versionMatch ? versionMatch[1] : output.trim();
|
|
130
135
|
return {
|
|
131
136
|
available: true,
|
|
132
|
-
version
|
|
137
|
+
version
|
|
133
138
|
};
|
|
134
139
|
} catch (error: any) {
|
|
135
140
|
return {
|
|
@@ -143,7 +148,8 @@ export class LiteLLMClient {
|
|
|
143
148
|
* Get current configuration
|
|
144
149
|
*/
|
|
145
150
|
async getConfig(): Promise<any> {
|
|
146
|
-
|
|
151
|
+
// config command outputs JSON by default, no --json flag needed
|
|
152
|
+
const output = await this.executePython(['config']);
|
|
147
153
|
return JSON.parse(output);
|
|
148
154
|
}
|
|
149
155
|
|