claude-code-workflow 6.1.3 → 6.2.1
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/README.md +145 -274
- package/bin/ccw-mcp.js +7 -0
- package/bin/ccw.js +10 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +219 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/cli.d.ts +32 -0
- package/dist/commands/cli.d.ts.map +1 -0
- package/dist/commands/cli.js +619 -0
- package/dist/commands/cli.js.map +1 -0
- package/dist/commands/core-memory.d.ts +32 -0
- package/dist/commands/core-memory.d.ts.map +1 -0
- package/dist/commands/core-memory.js +640 -0
- package/dist/commands/core-memory.js.map +1 -0
- package/dist/commands/hook.d.ts +16 -0
- package/dist/commands/hook.d.ts.map +1 -0
- package/dist/commands/hook.js +276 -0
- package/dist/commands/hook.js.map +1 -0
- package/dist/commands/install.d.ts +12 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +443 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/list.d.ts +5 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +32 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/memory.d.ts +57 -0
- package/dist/commands/memory.d.ts.map +1 -0
- package/dist/commands/memory.js +890 -0
- package/dist/commands/memory.js.map +1 -0
- package/dist/commands/serve.d.ts +12 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +63 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/session-path-resolver.d.ts +45 -0
- package/dist/commands/session-path-resolver.d.ts.map +1 -0
- package/dist/commands/session-path-resolver.js +302 -0
- package/dist/commands/session-path-resolver.js.map +1 -0
- package/dist/commands/session.d.ts +12 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +954 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/stop.d.ts +11 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +96 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/commands/tool.d.ts +29 -0
- package/dist/commands/tool.d.ts.map +1 -0
- package/dist/commands/tool.js +173 -0
- package/dist/commands/tool.js.map +1 -0
- package/dist/commands/uninstall.d.ts +9 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +239 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/upgrade.d.ts +10 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +288 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/commands/view.d.ts +14 -0
- package/dist/commands/view.d.ts.map +1 -0
- package/dist/commands/view.js +100 -0
- package/dist/commands/view.js.map +1 -0
- package/dist/config/storage-paths.d.ts +184 -0
- package/dist/config/storage-paths.d.ts.map +1 -0
- package/dist/config/storage-paths.js +536 -0
- package/dist/config/storage-paths.js.map +1 -0
- package/dist/core/cache-manager.d.ts +80 -0
- package/dist/core/cache-manager.d.ts.map +1 -0
- package/dist/core/cache-manager.js +260 -0
- package/dist/core/cache-manager.js.map +1 -0
- package/dist/core/claude-freshness.d.ts +53 -0
- package/dist/core/claude-freshness.d.ts.map +1 -0
- package/dist/core/claude-freshness.js +232 -0
- package/dist/core/claude-freshness.js.map +1 -0
- package/dist/core/core-memory-store.d.ts +320 -0
- package/dist/core/core-memory-store.d.ts.map +1 -0
- package/dist/core/core-memory-store.js +1177 -0
- package/dist/core/core-memory-store.js.map +1 -0
- package/dist/core/dashboard-generator-patch.d.ts +2 -0
- package/dist/core/dashboard-generator-patch.d.ts.map +1 -0
- package/dist/core/dashboard-generator-patch.js +48 -0
- package/dist/core/dashboard-generator-patch.js.map +1 -0
- package/dist/core/dashboard-generator.d.ts +8 -0
- package/dist/core/dashboard-generator.d.ts.map +1 -0
- package/dist/core/dashboard-generator.js +695 -0
- package/dist/core/dashboard-generator.js.map +1 -0
- package/dist/core/data-aggregator.d.ts +145 -0
- package/dist/core/data-aggregator.d.ts.map +1 -0
- package/dist/core/data-aggregator.js +416 -0
- package/dist/core/data-aggregator.js.map +1 -0
- package/dist/core/history-importer.d.ts +102 -0
- package/dist/core/history-importer.d.ts.map +1 -0
- package/dist/core/history-importer.js +493 -0
- package/dist/core/history-importer.js.map +1 -0
- package/dist/core/lite-scanner-complete.d.ts +81 -0
- package/dist/core/lite-scanner-complete.d.ts.map +1 -0
- package/dist/core/lite-scanner-complete.js +368 -0
- package/dist/core/lite-scanner-complete.js.map +1 -0
- package/dist/core/lite-scanner.d.ts +81 -0
- package/dist/core/lite-scanner.d.ts.map +1 -0
- package/dist/core/lite-scanner.js +368 -0
- package/dist/core/lite-scanner.js.map +1 -0
- package/dist/core/manifest.d.ts +88 -0
- package/dist/core/manifest.d.ts.map +1 -0
- package/dist/core/manifest.js +214 -0
- package/dist/core/manifest.js.map +1 -0
- package/dist/core/memory-embedder-bridge.d.ts +83 -0
- package/dist/core/memory-embedder-bridge.d.ts.map +1 -0
- package/dist/core/memory-embedder-bridge.js +181 -0
- package/dist/core/memory-embedder-bridge.js.map +1 -0
- package/dist/core/memory-store.d.ts +249 -0
- package/dist/core/memory-store.d.ts.map +1 -0
- package/dist/core/memory-store.js +781 -0
- package/dist/core/memory-store.js.map +1 -0
- package/dist/core/routes/ccw-routes.d.ts +20 -0
- package/dist/core/routes/ccw-routes.d.ts.map +1 -0
- package/dist/core/routes/ccw-routes.js +70 -0
- package/dist/core/routes/ccw-routes.js.map +1 -0
- package/dist/core/routes/claude-routes.d.ts +19 -0
- package/dist/core/routes/claude-routes.d.ts.map +1 -0
- package/dist/core/routes/claude-routes.js +1017 -0
- package/dist/core/routes/claude-routes.js.map +1 -0
- package/dist/core/routes/cli-routes.d.ts +20 -0
- package/dist/core/routes/cli-routes.d.ts.map +1 -0
- package/dist/core/routes/cli-routes.js +468 -0
- package/dist/core/routes/cli-routes.js.map +1 -0
- package/dist/core/routes/codexlens-routes.d.ts +20 -0
- package/dist/core/routes/codexlens-routes.d.ts.map +1 -0
- package/dist/core/routes/codexlens-routes.js +754 -0
- package/dist/core/routes/codexlens-routes.js.map +1 -0
- package/dist/core/routes/core-memory-routes.d.ts +21 -0
- package/dist/core/routes/core-memory-routes.d.ts.map +1 -0
- package/dist/core/routes/core-memory-routes.js +520 -0
- package/dist/core/routes/core-memory-routes.js.map +1 -0
- package/dist/core/routes/files-routes.d.ts +20 -0
- package/dist/core/routes/files-routes.d.ts.map +1 -0
- package/dist/core/routes/files-routes.js +374 -0
- package/dist/core/routes/files-routes.js.map +1 -0
- package/dist/core/routes/graph-routes.d.ts +20 -0
- package/dist/core/routes/graph-routes.d.ts.map +1 -0
- package/dist/core/routes/graph-routes.js +517 -0
- package/dist/core/routes/graph-routes.js.map +1 -0
- package/dist/core/routes/help-routes.d.ts +20 -0
- package/dist/core/routes/help-routes.d.ts.map +1 -0
- package/dist/core/routes/help-routes.js +250 -0
- package/dist/core/routes/help-routes.js.map +1 -0
- package/dist/core/routes/hooks-routes.d.ts +21 -0
- package/dist/core/routes/hooks-routes.d.ts.map +1 -0
- package/dist/core/routes/hooks-routes.js +346 -0
- package/dist/core/routes/hooks-routes.js.map +1 -0
- package/dist/core/routes/mcp-routes.d.ts +20 -0
- package/dist/core/routes/mcp-routes.d.ts.map +1 -0
- package/dist/core/routes/mcp-routes.js +1129 -0
- package/dist/core/routes/mcp-routes.js.map +1 -0
- package/dist/core/routes/mcp-templates-db.d.ts +54 -0
- package/dist/core/routes/mcp-templates-db.d.ts.map +1 -0
- package/dist/core/routes/mcp-templates-db.js +226 -0
- package/dist/core/routes/mcp-templates-db.js.map +1 -0
- package/dist/core/routes/memory-routes.d.ts +21 -0
- package/dist/core/routes/memory-routes.d.ts.map +1 -0
- package/dist/core/routes/memory-routes.js +1095 -0
- package/dist/core/routes/memory-routes.js.map +1 -0
- package/dist/core/routes/rules-routes.d.ts +20 -0
- package/dist/core/routes/rules-routes.d.ts.map +1 -0
- package/dist/core/routes/rules-routes.js +442 -0
- package/dist/core/routes/rules-routes.js.map +1 -0
- package/dist/core/routes/session-routes.d.ts +20 -0
- package/dist/core/routes/session-routes.d.ts.map +1 -0
- package/dist/core/routes/session-routes.js +423 -0
- package/dist/core/routes/session-routes.js.map +1 -0
- package/dist/core/routes/skills-routes.d.ts +20 -0
- package/dist/core/routes/skills-routes.d.ts.map +1 -0
- package/dist/core/routes/skills-routes.js +533 -0
- package/dist/core/routes/skills-routes.js.map +1 -0
- package/dist/core/routes/status-routes.d.ts +20 -0
- package/dist/core/routes/status-routes.d.ts.map +1 -0
- package/dist/core/routes/status-routes.js +38 -0
- package/dist/core/routes/status-routes.js.map +1 -0
- package/dist/core/routes/system-routes.d.ts +22 -0
- package/dist/core/routes/system-routes.d.ts.map +1 -0
- package/dist/core/routes/system-routes.js +354 -0
- package/dist/core/routes/system-routes.js.map +1 -0
- package/dist/core/server.d.ts +17 -0
- package/dist/core/server.d.ts.map +1 -0
- package/dist/core/server.js +386 -0
- package/dist/core/server.js.map +1 -0
- package/dist/core/session-clustering-service.d.ts +153 -0
- package/dist/core/session-clustering-service.d.ts.map +1 -0
- package/dist/core/session-clustering-service.js +1065 -0
- package/dist/core/session-clustering-service.js.map +1 -0
- package/dist/core/session-scanner.d.ts +32 -0
- package/dist/core/session-scanner.d.ts.map +1 -0
- package/dist/core/session-scanner.js +253 -0
- package/dist/core/session-scanner.js.map +1 -0
- package/dist/core/websocket.d.ts +23 -0
- package/dist/core/websocket.d.ts.map +1 -0
- package/dist/core/websocket.js +168 -0
- package/dist/core/websocket.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server/index.d.ts +7 -0
- package/dist/mcp-server/index.d.ts.map +1 -0
- package/dist/mcp-server/index.js +157 -0
- package/dist/mcp-server/index.js.map +1 -0
- package/dist/tools/classify-folders.d.ts +26 -0
- package/dist/tools/classify-folders.d.ts.map +1 -0
- package/dist/tools/classify-folders.js +201 -0
- package/dist/tools/classify-folders.js.map +1 -0
- package/dist/tools/cli-config-manager.d.ts +62 -0
- package/dist/tools/cli-config-manager.d.ts.map +1 -0
- package/dist/tools/cli-config-manager.js +221 -0
- package/dist/tools/cli-config-manager.js.map +1 -0
- package/dist/tools/cli-executor.d.ts +373 -0
- package/dist/tools/cli-executor.d.ts.map +1 -0
- package/dist/tools/cli-executor.js +1625 -0
- package/dist/tools/cli-executor.js.map +1 -0
- package/dist/tools/cli-history-store.d.ts +330 -0
- package/dist/tools/cli-history-store.d.ts.map +1 -0
- package/dist/tools/cli-history-store.js +916 -0
- package/dist/tools/cli-history-store.js.map +1 -0
- package/dist/tools/codex-lens.d.ts +118 -0
- package/dist/tools/codex-lens.d.ts.map +1 -0
- package/dist/tools/codex-lens.js +962 -0
- package/dist/tools/codex-lens.js.map +1 -0
- package/dist/tools/convert-tokens-to-css.d.ts +14 -0
- package/dist/tools/convert-tokens-to-css.d.ts.map +1 -0
- package/dist/tools/convert-tokens-to-css.js +244 -0
- package/dist/tools/convert-tokens-to-css.js.map +1 -0
- package/dist/tools/core-memory.d.ts +66 -0
- package/dist/tools/core-memory.d.ts.map +1 -0
- package/dist/tools/core-memory.js +324 -0
- package/dist/tools/core-memory.js.map +1 -0
- package/dist/tools/detect-changed-modules.d.ts +24 -0
- package/dist/tools/detect-changed-modules.d.ts.map +1 -0
- package/dist/tools/detect-changed-modules.js +277 -0
- package/dist/tools/detect-changed-modules.js.map +1 -0
- package/dist/tools/discover-design-files.d.ts +36 -0
- package/dist/tools/discover-design-files.d.ts.map +1 -0
- package/dist/tools/discover-design-files.js +147 -0
- package/dist/tools/discover-design-files.js.map +1 -0
- package/dist/tools/edit-file.d.ts +28 -0
- package/dist/tools/edit-file.d.ts.map +1 -0
- package/dist/tools/edit-file.js +479 -0
- package/dist/tools/edit-file.js.map +1 -0
- package/dist/tools/generate-module-docs.d.ts +22 -0
- package/dist/tools/generate-module-docs.d.ts.map +1 -0
- package/dist/tools/generate-module-docs.js +379 -0
- package/dist/tools/generate-module-docs.js.map +1 -0
- package/dist/tools/get-modules-by-depth.d.ts +15 -0
- package/dist/tools/get-modules-by-depth.d.ts.map +1 -0
- package/dist/tools/get-modules-by-depth.js +296 -0
- package/dist/tools/get-modules-by-depth.js.map +1 -0
- package/dist/tools/index.d.ts +55 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +304 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/native-session-discovery.d.ts +97 -0
- package/dist/tools/native-session-discovery.d.ts.map +1 -0
- package/dist/tools/native-session-discovery.js +700 -0
- package/dist/tools/native-session-discovery.js.map +1 -0
- package/dist/tools/notifier.d.ts +50 -0
- package/dist/tools/notifier.d.ts.map +1 -0
- package/dist/tools/notifier.js +90 -0
- package/dist/tools/notifier.js.map +1 -0
- package/dist/tools/read-file.d.ts +32 -0
- package/dist/tools/read-file.d.ts.map +1 -0
- package/dist/tools/read-file.js +329 -0
- package/dist/tools/read-file.js.map +1 -0
- package/dist/tools/resume-strategy.d.ts +48 -0
- package/dist/tools/resume-strategy.d.ts.map +1 -0
- package/dist/tools/resume-strategy.js +248 -0
- package/dist/tools/resume-strategy.js.map +1 -0
- package/dist/tools/session-content-parser.d.ts +58 -0
- package/dist/tools/session-content-parser.d.ts.map +1 -0
- package/dist/tools/session-content-parser.js +420 -0
- package/dist/tools/session-content-parser.js.map +1 -0
- package/dist/tools/session-manager.d.ts +9 -0
- package/dist/tools/session-manager.d.ts.map +1 -0
- package/dist/tools/session-manager.js +834 -0
- package/dist/tools/session-manager.js.map +1 -0
- package/dist/tools/smart-context.d.ts +35 -0
- package/dist/tools/smart-context.d.ts.map +1 -0
- package/dist/tools/smart-context.js +182 -0
- package/dist/tools/smart-context.js.map +1 -0
- package/dist/tools/smart-search.d.ts +105 -0
- package/dist/tools/smart-search.d.ts.map +1 -0
- package/dist/tools/smart-search.js +1753 -0
- package/dist/tools/smart-search.js.map +1 -0
- package/dist/tools/storage-manager.d.ts +114 -0
- package/dist/tools/storage-manager.d.ts.map +1 -0
- package/dist/tools/storage-manager.js +392 -0
- package/dist/tools/storage-manager.js.map +1 -0
- package/dist/tools/ui-generate-preview.d.ts +39 -0
- package/dist/tools/ui-generate-preview.d.ts.map +1 -0
- package/dist/tools/ui-generate-preview.js +300 -0
- package/dist/tools/ui-generate-preview.js.map +1 -0
- package/dist/tools/ui-instantiate-prototypes.d.ts +75 -0
- package/dist/tools/ui-instantiate-prototypes.d.ts.map +1 -0
- package/dist/tools/ui-instantiate-prototypes.js +256 -0
- package/dist/tools/ui-instantiate-prototypes.js.map +1 -0
- package/dist/tools/update-module-claude.d.ts +80 -0
- package/dist/tools/update-module-claude.d.ts.map +1 -0
- package/dist/tools/update-module-claude.js +351 -0
- package/dist/tools/update-module-claude.js.map +1 -0
- package/dist/tools/write-file.d.ts +19 -0
- package/dist/tools/write-file.d.ts.map +1 -0
- package/dist/tools/write-file.js +193 -0
- package/dist/tools/write-file.js.map +1 -0
- package/dist/types/config.d.ts +11 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/session.d.ts +20 -0
- package/dist/types/session.d.ts.map +1 -0
- package/dist/types/session.js +2 -0
- package/dist/types/session.js.map +1 -0
- package/dist/types/tool.d.ts +36 -0
- package/dist/types/tool.d.ts.map +1 -0
- package/dist/types/tool.js +11 -0
- package/dist/types/tool.js.map +1 -0
- package/dist/utils/browser-launcher.d.ts +13 -0
- package/dist/utils/browser-launcher.d.ts.map +1 -0
- package/dist/utils/browser-launcher.js +60 -0
- package/dist/utils/browser-launcher.js.map +1 -0
- package/dist/utils/file-utils.d.ts +25 -0
- package/dist/utils/file-utils.d.ts.map +1 -0
- package/dist/utils/file-utils.js +48 -0
- package/dist/utils/file-utils.js.map +1 -0
- package/dist/utils/path-resolver.d.ts +80 -0
- package/dist/utils/path-resolver.d.ts.map +1 -0
- package/dist/utils/path-resolver.js +260 -0
- package/dist/utils/path-resolver.js.map +1 -0
- package/dist/utils/path-validator.d.ts +49 -0
- package/dist/utils/path-validator.d.ts.map +1 -0
- package/dist/utils/path-validator.js +123 -0
- package/dist/utils/path-validator.js.map +1 -0
- package/dist/utils/ui.d.ts +62 -0
- package/dist/utils/ui.d.ts.map +1 -0
- package/dist/utils/ui.js +129 -0
- package/dist/utils/ui.js.map +1 -0
- package/package.json +65 -67
- package/src/.workflow/.cli-history/history.db +0 -0
- package/src/.workflow/.cli-history/history.db-shm +0 -0
- package/src/.workflow/.cli-history/history.db-wal +0 -0
- package/src/cli.ts +244 -0
- package/src/commands/cli.ts +740 -0
- package/src/commands/core-memory.ts +770 -0
- package/src/commands/hook.ts +315 -0
- package/src/commands/install.ts +519 -0
- package/src/commands/list.ts +37 -0
- package/src/commands/memory.ts +1090 -0
- package/src/commands/serve.ts +76 -0
- package/src/commands/session-path-resolver.ts +372 -0
- package/src/commands/session.ts +1141 -0
- package/src/commands/stop.ts +111 -0
- package/src/commands/tool.ts +201 -0
- package/src/commands/uninstall.ts +287 -0
- package/src/commands/upgrade.ts +352 -0
- package/src/commands/view.ts +119 -0
- package/src/config/storage-paths.ts +670 -0
- package/src/core/cache-manager.ts +294 -0
- package/src/core/claude-freshness.ts +319 -0
- package/src/core/core-memory-store.ts +1528 -0
- package/src/core/dashboard-generator-patch.ts +47 -0
- package/src/core/dashboard-generator.ts +739 -0
- package/src/core/data-aggregator.ts +584 -0
- package/src/core/history-importer.ts +625 -0
- package/src/core/lite-scanner-complete.ts +469 -0
- package/src/core/lite-scanner.ts +469 -0
- package/src/core/manifest.ts +271 -0
- package/src/core/memory-embedder-bridge.ts +262 -0
- package/src/core/memory-store.ts +978 -0
- package/src/core/routes/ccw-routes.ts +96 -0
- package/src/core/routes/claude-routes.ts +1183 -0
- package/src/core/routes/cli-routes.ts +561 -0
- package/src/core/routes/codexlens-routes.ts +806 -0
- package/src/core/routes/core-memory-routes.ts +605 -0
- package/src/core/routes/files-routes.ts +428 -0
- package/src/core/routes/graph-routes.md +164 -0
- package/src/core/routes/graph-routes.ts +626 -0
- package/src/core/routes/help-routes.ts +308 -0
- package/src/core/routes/hooks-routes.ts +405 -0
- package/src/core/routes/mcp-routes.ts +1271 -0
- package/src/core/routes/mcp-routes.ts.backup +550 -0
- package/src/core/routes/mcp-templates-db.ts +268 -0
- package/src/core/routes/memory-routes.ts +1206 -0
- package/src/core/routes/rules-routes.ts +526 -0
- package/src/core/routes/session-routes.ts +467 -0
- package/src/core/routes/skills-routes.ts +599 -0
- package/src/core/routes/status-routes.ts +57 -0
- package/src/core/routes/system-routes.ts +427 -0
- package/src/core/server.ts +431 -0
- package/src/core/session-clustering-service.ts +1258 -0
- package/src/core/session-scanner.ts +283 -0
- package/src/core/websocket.ts +190 -0
- package/src/index.ts +10 -0
- package/src/mcp-server/index.ts +186 -0
- package/src/templates/assets/css/github-dark.min.css +10 -0
- package/src/templates/assets/css/github.min.css +10 -0
- package/src/templates/assets/js/cytoscape.min.js +32 -0
- package/src/templates/assets/js/d3.min.js +2 -0
- package/src/templates/assets/js/highlight.min.js +1244 -0
- package/src/templates/assets/js/lucide.min.js +12 -0
- package/src/templates/assets/js/marked.min.js +69 -0
- package/src/templates/assets/js/tailwind.js +83 -0
- package/src/templates/dashboard-css/01-base.css +302 -0
- package/src/templates/dashboard-css/02-session.css +748 -0
- package/src/templates/dashboard-css/04-lite-tasks.css +1181 -0
- package/src/templates/dashboard-css/06-cards.css +1576 -0
- package/src/templates/dashboard-css/07-managers.css +2107 -0
- package/src/templates/dashboard-css/09-explorer.css +1408 -0
- package/src/templates/dashboard-css/10-cli-status.css +337 -0
- package/src/templates/dashboard-css/11-cli-history.css +271 -0
- package/src/templates/dashboard-css/12-cli-legacy.css +796 -0
- package/src/templates/dashboard-css/13-cli-ccw.css +199 -0
- package/src/templates/dashboard-css/14-cli-modals.css +258 -0
- package/src/templates/dashboard-css/15-cli-endpoints.css +305 -0
- package/src/templates/dashboard-css/16-cli-session.css +241 -0
- package/src/templates/dashboard-css/17-cli-conversation.css +283 -0
- package/src/templates/dashboard-css/18-cli-settings.css +160 -0
- package/src/templates/dashboard-css/19-cli-native-session.css +496 -0
- package/src/templates/dashboard-css/20-cli-taskqueue.css +188 -0
- package/src/templates/dashboard-css/21-cli-toolmgmt.css +310 -0
- package/src/templates/dashboard-css/22-cli-semantic.css +240 -0
- package/src/templates/dashboard-css/23-memory.css +2390 -0
- package/src/templates/dashboard-css/24-prompt-history.css +1089 -0
- package/src/templates/dashboard-css/25-skills-rules.css +326 -0
- package/src/templates/dashboard-css/26-claude-manager.css +908 -0
- package/src/templates/dashboard-css/27-graph-explorer.css +1678 -0
- package/src/templates/dashboard-css/28-mcp-manager.css +748 -0
- package/src/templates/dashboard-css/29-help.css +264 -0
- package/src/templates/dashboard-css/30-core-memory.css +1700 -0
- package/src/templates/dashboard-js/api.js +220 -0
- package/src/templates/dashboard-js/components/carousel.js +398 -0
- package/src/templates/dashboard-js/components/cli-history.js +876 -0
- package/src/templates/dashboard-js/components/cli-status.js +978 -0
- package/src/templates/dashboard-js/components/global-notifications.js +508 -0
- package/src/templates/dashboard-js/components/hook-manager.js +1278 -0
- package/src/templates/dashboard-js/components/index-manager.js +302 -0
- package/src/templates/dashboard-js/components/mcp-manager.js +1219 -0
- package/src/templates/dashboard-js/components/modals.js +326 -0
- package/src/templates/dashboard-js/components/navigation.js +313 -0
- package/src/templates/dashboard-js/components/notifications.js +758 -0
- package/src/templates/dashboard-js/components/storage-manager.js +478 -0
- package/src/templates/dashboard-js/components/tabs-other.js +424 -0
- package/src/templates/dashboard-js/components/task-queue-sidebar.js +716 -0
- package/src/templates/dashboard-js/help-i18n.js +272 -0
- package/src/templates/dashboard-js/i18n.js +2807 -0
- package/src/templates/dashboard-js/main.js +87 -0
- package/src/templates/dashboard-js/state.js +243 -0
- package/src/templates/dashboard-js/utils.js +199 -0
- package/src/templates/dashboard-js/views/claude-manager.js +912 -0
- package/src/templates/dashboard-js/views/cli-manager.js +2272 -0
- package/src/templates/dashboard-js/views/codexlens-manager.js +964 -0
- package/src/templates/dashboard-js/views/core-memory-clusters.js +503 -0
- package/src/templates/dashboard-js/views/core-memory.js +782 -0
- package/src/templates/dashboard-js/views/explorer.js +888 -0
- package/src/templates/dashboard-js/views/graph-explorer.js +1157 -0
- package/src/templates/dashboard-js/views/help.js +856 -0
- package/src/templates/dashboard-js/views/history.js +337 -0
- package/src/templates/dashboard-js/views/home.js +243 -0
- package/src/templates/dashboard-js/views/hook-manager.js +660 -0
- package/src/templates/dashboard-js/views/lite-tasks.js +861 -0
- package/src/templates/dashboard-js/views/mcp-manager.js +2187 -0
- package/src/templates/dashboard-js/views/mcp-manager.js.backup +1729 -0
- package/src/templates/dashboard-js/views/mcp-manager.js.new +928 -0
- package/src/templates/dashboard-js/views/memory.js +1221 -0
- package/src/templates/dashboard-js/views/prompt-history.js +713 -0
- package/src/templates/dashboard-js/views/rules-manager.js +828 -0
- package/src/templates/dashboard-js/views/session-detail.js +781 -0
- package/src/templates/dashboard-js/views/skills-manager.js +819 -0
- package/src/templates/dashboard.html +831 -0
- package/src/templates/hooks-config-example.json +60 -0
- package/src/tools/classify-folders.ts +245 -0
- package/src/tools/cli-config-manager.ts +268 -0
- package/src/tools/cli-executor.ts +2014 -0
- package/src/tools/cli-history-store.ts +1195 -0
- package/src/tools/codex-lens.ts +1141 -0
- package/src/tools/convert-tokens-to-css.ts +300 -0
- package/src/tools/core-memory.ts +444 -0
- package/src/tools/detect-changed-modules.ts +325 -0
- package/src/tools/discover-design-files.ts +184 -0
- package/src/tools/edit-file.ts +568 -0
- package/src/tools/generate-module-docs.ts +438 -0
- package/src/tools/get-modules-by-depth.ts +349 -0
- package/src/tools/index.ts +370 -0
- package/src/tools/native-session-discovery.ts +795 -0
- package/src/tools/notifier.ts +129 -0
- package/src/tools/read-file.ts +410 -0
- package/src/tools/resume-strategy.ts +345 -0
- package/src/tools/session-content-parser.ts +619 -0
- package/src/tools/session-manager.ts +1026 -0
- package/src/tools/smart-context.ts +228 -0
- package/src/tools/smart-search.ts +2065 -0
- package/src/tools/smart-search.ts.backup +1233 -0
- package/src/tools/storage-manager.ts +455 -0
- package/src/tools/write-file.ts +222 -0
- package/src/types/config.ts +11 -0
- package/src/types/index.ts +3 -0
- package/src/types/session.ts +25 -0
- package/src/types/tool.ts +41 -0
- package/src/utils/browser-launcher.ts +62 -0
- package/src/utils/file-utils.ts +48 -0
- package/src/utils/path-resolver.ts +315 -0
- package/src/utils/path-validator.ts +153 -0
- package/src/utils/ui.ts +155 -0
- package/.claude/agents/action-planning-agent.md +0 -778
- package/.claude/agents/cli-execution-agent.md +0 -270
- package/.claude/agents/cli-explore-agent.md +0 -182
- package/.claude/agents/cli-lite-planning-agent.md +0 -396
- package/.claude/agents/cli-planning-agent.md +0 -558
- package/.claude/agents/code-developer.md +0 -310
- package/.claude/agents/conceptual-planning-agent.md +0 -308
- package/.claude/agents/context-search-agent.md +0 -582
- package/.claude/agents/doc-generator.md +0 -330
- package/.claude/agents/memory-bridge.md +0 -94
- package/.claude/agents/test-context-search-agent.md +0 -399
- package/.claude/agents/test-fix-agent.md +0 -343
- package/.claude/agents/ui-design-agent.md +0 -593
- package/.claude/agents/universal-executor.md +0 -131
- package/.claude/commands/cli/cli-init.md +0 -440
- package/.claude/commands/enhance-prompt.md +0 -93
- package/.claude/commands/memory/code-map-memory.md +0 -687
- package/.claude/commands/memory/docs-full-cli.md +0 -471
- package/.claude/commands/memory/docs-related-cli.md +0 -386
- package/.claude/commands/memory/docs.md +0 -615
- package/.claude/commands/memory/load-skill-memory.md +0 -182
- package/.claude/commands/memory/load.md +0 -240
- package/.claude/commands/memory/skill-memory.md +0 -525
- package/.claude/commands/memory/style-skill-memory.md +0 -396
- package/.claude/commands/memory/tech-research.md +0 -477
- package/.claude/commands/memory/update-full.md +0 -332
- package/.claude/commands/memory/update-related.md +0 -332
- package/.claude/commands/memory/workflow-skill-memory.md +0 -517
- package/.claude/commands/task/breakdown.md +0 -204
- package/.claude/commands/task/create.md +0 -152
- package/.claude/commands/task/execute.md +0 -270
- package/.claude/commands/task/replan.md +0 -437
- package/.claude/commands/version.md +0 -254
- package/.claude/commands/workflow/action-plan-verify.md +0 -447
- package/.claude/commands/workflow/brainstorm/api-designer.md +0 -585
- package/.claude/commands/workflow/brainstorm/artifacts.md +0 -452
- package/.claude/commands/workflow/brainstorm/auto-parallel.md +0 -443
- package/.claude/commands/workflow/brainstorm/data-architect.md +0 -220
- package/.claude/commands/workflow/brainstorm/product-manager.md +0 -200
- package/.claude/commands/workflow/brainstorm/product-owner.md +0 -200
- package/.claude/commands/workflow/brainstorm/scrum-master.md +0 -200
- package/.claude/commands/workflow/brainstorm/subject-matter-expert.md +0 -200
- package/.claude/commands/workflow/brainstorm/synthesis.md +0 -398
- package/.claude/commands/workflow/brainstorm/system-architect.md +0 -387
- package/.claude/commands/workflow/brainstorm/ui-designer.md +0 -221
- package/.claude/commands/workflow/brainstorm/ux-expert.md +0 -221
- package/.claude/commands/workflow/execute.md +0 -460
- package/.claude/commands/workflow/init.md +0 -164
- package/.claude/commands/workflow/lite-execute.md +0 -686
- package/.claude/commands/workflow/lite-fix.md +0 -621
- package/.claude/commands/workflow/lite-plan.md +0 -592
- package/.claude/commands/workflow/plan.md +0 -551
- package/.claude/commands/workflow/replan.md +0 -515
- package/.claude/commands/workflow/review-fix.md +0 -606
- package/.claude/commands/workflow/review-module-cycle.md +0 -765
- package/.claude/commands/workflow/review-session-cycle.md +0 -776
- package/.claude/commands/workflow/review.md +0 -291
- package/.claude/commands/workflow/session/complete.md +0 -500
- package/.claude/commands/workflow/session/list.md +0 -96
- package/.claude/commands/workflow/session/resume.md +0 -61
- package/.claude/commands/workflow/session/start.md +0 -200
- package/.claude/commands/workflow/tdd-plan.md +0 -460
- package/.claude/commands/workflow/tdd-verify.md +0 -386
- package/.claude/commands/workflow/test-cycle-execute.md +0 -498
- package/.claude/commands/workflow/test-fix-gen.md +0 -699
- package/.claude/commands/workflow/test-gen.md +0 -529
- package/.claude/commands/workflow/tools/conflict-resolution.md +0 -680
- package/.claude/commands/workflow/tools/context-gather.md +0 -434
- package/.claude/commands/workflow/tools/task-generate-agent.md +0 -291
- package/.claude/commands/workflow/tools/task-generate-tdd.md +0 -518
- package/.claude/commands/workflow/tools/tdd-coverage-analysis.md +0 -309
- package/.claude/commands/workflow/tools/test-concept-enhanced.md +0 -163
- package/.claude/commands/workflow/tools/test-context-gather.md +0 -235
- package/.claude/commands/workflow/tools/test-task-generate.md +0 -256
- package/.claude/commands/workflow/ui-design/animation-extract.md +0 -1150
- package/.claude/commands/workflow/ui-design/codify-style.md +0 -652
- package/.claude/commands/workflow/ui-design/design-sync.md +0 -454
- package/.claude/commands/workflow/ui-design/explore-auto.md +0 -678
- package/.claude/commands/workflow/ui-design/generate.md +0 -504
- package/.claude/commands/workflow/ui-design/imitate-auto.md +0 -745
- package/.claude/commands/workflow/ui-design/import-from-code.md +0 -537
- package/.claude/commands/workflow/ui-design/layout-extract.md +0 -788
- package/.claude/commands/workflow/ui-design/reference-page-generator.md +0 -356
- package/.claude/commands/workflow/ui-design/style-extract.md +0 -773
- package/.claude/scripts/classify-folders.sh +0 -39
- package/.claude/scripts/convert_tokens_to_css.sh +0 -229
- package/.claude/scripts/detect_changed_modules.sh +0 -161
- package/.claude/scripts/discover-design-files.sh +0 -87
- package/.claude/scripts/extract-animations.js +0 -243
- package/.claude/scripts/extract-computed-styles.js +0 -118
- package/.claude/scripts/extract-layout-structure.js +0 -411
- package/.claude/scripts/generate_module_docs.sh +0 -717
- package/.claude/scripts/get_modules_by_depth.sh +0 -170
- package/.claude/scripts/ui-generate-preview.sh +0 -395
- package/.claude/scripts/ui-instantiate-prototypes.sh +0 -815
- package/.claude/scripts/update_module_claude.sh +0 -337
- package/.claude/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/index/all-commands.json +0 -772
- package/.claude/skills/command-guide/index/by-category.json +0 -800
- package/.claude/skills/command-guide/index/by-use-case.json +0 -786
- package/.claude/skills/command-guide/index/command-relationships.json +0 -307
- package/.claude/skills/command-guide/index/essential-commands.json +0 -112
- package/.claude/skills/command-guide/reference/agents/action-planning-agent.md +0 -778
- package/.claude/skills/command-guide/reference/agents/cli-execution-agent.md +0 -270
- 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 -396
- package/.claude/skills/command-guide/reference/agents/cli-planning-agent.md +0 -558
- package/.claude/skills/command-guide/reference/agents/code-developer.md +0 -310
- 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 -582
- 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 -399
- package/.claude/skills/command-guide/reference/agents/test-fix-agent.md +0 -343
- 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 -615
- 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 -477
- 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 -460
- package/.claude/skills/command-guide/reference/commands/workflow/init.md +0 -164
- package/.claude/skills/command-guide/reference/commands/workflow/lite-execute.md +0 -686
- package/.claude/skills/command-guide/reference/commands/workflow/lite-fix.md +0 -621
- package/.claude/skills/command-guide/reference/commands/workflow/lite-plan.md +0 -592
- 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 -291
- package/.claude/skills/command-guide/reference/commands/workflow/session/complete.md +0 -500
- package/.claude/skills/command-guide/reference/commands/workflow/session/list.md +0 -96
- package/.claude/skills/command-guide/reference/commands/workflow/session/resume.md +0 -61
- package/.claude/skills/command-guide/reference/commands/workflow/session/start.md +0 -200
- 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 -386
- 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 -680
- package/.claude/skills/command-guide/reference/commands/workflow/tools/context-gather.md +0 -434
- package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-agent.md +0 -291
- 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 -235
- package/.claude/skills/command-guide/reference/commands/workflow/tools/test-task-generate.md +0 -256
- 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
- package/.claude/skills/prompt-enhancer/SKILL.md +0 -124
- package/.claude/workflows/_template-compare-matrix.html +0 -692
- package/.claude/workflows/cli-templates/fix-plan-template.json +0 -75
- package/.claude/workflows/cli-templates/fix-progress-template.json +0 -48
- package/.claude/workflows/cli-templates/memory/style-skill-memory/skill-md-template.md +0 -299
- package/.claude/workflows/cli-templates/planning-roles/data-architect.md +0 -120
- package/.claude/workflows/cli-templates/planning-roles/product-manager.md +0 -119
- package/.claude/workflows/cli-templates/planning-roles/product-owner.md +0 -261
- package/.claude/workflows/cli-templates/planning-roles/scrum-master.md +0 -186
- package/.claude/workflows/cli-templates/planning-roles/subject-matter-expert.md +0 -281
- package/.claude/workflows/cli-templates/planning-roles/synthesis-role.md +0 -414
- package/.claude/workflows/cli-templates/planning-roles/system-architect.md +0 -106
- package/.claude/workflows/cli-templates/planning-roles/test-strategist.md +0 -124
- package/.claude/workflows/cli-templates/planning-roles/ui-designer.md +0 -379
- package/.claude/workflows/cli-templates/planning-roles/ux-expert.md +0 -240
- package/.claude/workflows/cli-templates/prompts/analysis/01-diagnose-bug-root-cause.txt +0 -127
- package/.claude/workflows/cli-templates/prompts/analysis/01-trace-code-execution.txt +0 -115
- package/.claude/workflows/cli-templates/prompts/analysis/02-analyze-code-patterns.txt +0 -37
- package/.claude/workflows/cli-templates/prompts/analysis/02-analyze-technical-document.txt +0 -33
- package/.claude/workflows/cli-templates/prompts/analysis/02-review-architecture.txt +0 -29
- package/.claude/workflows/cli-templates/prompts/analysis/02-review-code-quality.txt +0 -28
- package/.claude/workflows/cli-templates/prompts/analysis/03-analyze-performance.txt +0 -29
- package/.claude/workflows/cli-templates/prompts/analysis/03-assess-security-risks.txt +0 -29
- package/.claude/workflows/cli-templates/prompts/analysis/03-review-quality-standards.txt +0 -29
- package/.claude/workflows/cli-templates/prompts/development/02-generate-tests.txt +0 -70
- package/.claude/workflows/cli-templates/prompts/development/02-implement-component-ui.txt +0 -55
- package/.claude/workflows/cli-templates/prompts/development/02-implement-feature.txt +0 -58
- package/.claude/workflows/cli-templates/prompts/development/02-refactor-codebase.txt +0 -55
- package/.claude/workflows/cli-templates/prompts/development/03-debug-runtime-issues.txt +0 -55
- package/.claude/workflows/cli-templates/prompts/documentation/api.txt +0 -15
- package/.claude/workflows/cli-templates/prompts/documentation/folder-navigation.txt +0 -27
- package/.claude/workflows/cli-templates/prompts/documentation/module-readme.txt +0 -49
- package/.claude/workflows/cli-templates/prompts/documentation/project-architecture.txt +0 -41
- package/.claude/workflows/cli-templates/prompts/documentation/project-examples.txt +0 -35
- package/.claude/workflows/cli-templates/prompts/documentation/project-readme.txt +0 -35
- package/.claude/workflows/cli-templates/prompts/memory/02-document-module-structure.txt +0 -165
- package/.claude/workflows/cli-templates/prompts/planning/01-plan-architecture-design.txt +0 -109
- package/.claude/workflows/cli-templates/prompts/planning/02-breakdown-task-steps.txt +0 -30
- package/.claude/workflows/cli-templates/prompts/planning/02-design-component-spec.txt +0 -28
- package/.claude/workflows/cli-templates/prompts/planning/03-evaluate-concept-feasibility.txt +0 -127
- package/.claude/workflows/cli-templates/prompts/planning/03-plan-migration-strategy.txt +0 -30
- package/.claude/workflows/cli-templates/prompts/tech/tech-module-format.txt +0 -359
- package/.claude/workflows/cli-templates/prompts/tech/tech-skill-index.txt +0 -185
- package/.claude/workflows/cli-templates/prompts/test/test-concept-analysis.txt +0 -179
- package/.claude/workflows/cli-templates/prompts/universal/00-universal-creative-style.txt +0 -95
- package/.claude/workflows/cli-templates/prompts/universal/00-universal-rigorous-style.txt +0 -92
- package/.claude/workflows/cli-templates/prompts/verification/codex-technical.txt +0 -28
- package/.claude/workflows/cli-templates/prompts/verification/cross-validation.txt +0 -28
- package/.claude/workflows/cli-templates/prompts/verification/gemini-strategic.txt +0 -27
- package/.claude/workflows/cli-templates/prompts/workflow/analysis-results-structure.txt +0 -224
- package/.claude/workflows/cli-templates/prompts/workflow/codex-feasibility-validation.txt +0 -176
- package/.claude/workflows/cli-templates/prompts/workflow/gemini-solution-design.txt +0 -131
- package/.claude/workflows/cli-templates/prompts/workflow/impl-plan-template.txt +0 -286
- package/.claude/workflows/cli-templates/prompts/workflow/skill-aggregation.txt +0 -172
- package/.claude/workflows/cli-templates/prompts/workflow/skill-conflict-patterns.txt +0 -98
- package/.claude/workflows/cli-templates/prompts/workflow/skill-index.txt +0 -224
- package/.claude/workflows/cli-templates/prompts/workflow/skill-lessons-learned.txt +0 -98
- package/.claude/workflows/cli-templates/prompts/workflow/skill-sessions-timeline.txt +0 -53
- package/.claude/workflows/cli-templates/prompts/workflow/task-json-agent-mode.txt +0 -123
- package/.claude/workflows/cli-templates/prompts/workflow/task-json-cli-mode.txt +0 -182
- package/.claude/workflows/cli-templates/schemas/diagnosis-json-schema.json +0 -234
- package/.claude/workflows/cli-templates/schemas/explore-json-schema.json +0 -124
- package/.claude/workflows/cli-templates/schemas/fix-plan-json-schema.json +0 -273
- package/.claude/workflows/cli-templates/schemas/plan-json-schema.json +0 -219
- package/.claude/workflows/cli-templates/schemas/project-json-schema.json +0 -221
- package/.claude/workflows/cli-templates/schemas/review-deep-dive-results-schema.json +0 -82
- package/.claude/workflows/cli-templates/schemas/review-dimension-results-schema.json +0 -51
- package/.claude/workflows/cli-templates/tech-stacks/go-dev.md +0 -91
- package/.claude/workflows/cli-templates/tech-stacks/java-dev.md +0 -107
- package/.claude/workflows/cli-templates/tech-stacks/javascript-dev.md +0 -58
- package/.claude/workflows/cli-templates/tech-stacks/python-dev.md +0 -79
- package/.claude/workflows/cli-templates/tech-stacks/react-dev.md +0 -103
- package/.claude/workflows/cli-templates/tech-stacks/typescript-dev.md +0 -83
- package/.claude/workflows/cli-templates/ui-design/systems/animation-tokens.json +0 -247
- package/.claude/workflows/cli-templates/ui-design/systems/design-tokens.json +0 -342
- package/.claude/workflows/cli-templates/ui-design/systems/layout-templates.json +0 -145
- package/.claude/workflows/context-search-strategy.md +0 -77
- package/.claude/workflows/intelligent-tools-strategy.md +0 -662
- package/.claude/workflows/review-directory-specification.md +0 -336
- package/.claude/workflows/task-core.md +0 -214
- package/.claude/workflows/tool-strategy.md +0 -79
- package/.claude/workflows/workflow-architecture.md +0 -942
- package/.codex/AGENTS.md +0 -330
- package/.gemini/GEMINI.md +0 -164
- package/.qwen/QWEN.md +0 -164
- package/CLAUDE.md +0 -91
- package/LICENSE +0 -21
- package/ccw/README.md +0 -121
- package/ccw/bin/ccw.js +0 -10
- package/ccw/package.json +0 -47
- package/ccw/src/cli.js +0 -119
- package/ccw/src/commands/install.js +0 -324
- package/ccw/src/commands/list.js +0 -37
- package/ccw/src/commands/serve.js +0 -67
- package/ccw/src/commands/stop.js +0 -101
- package/ccw/src/commands/tool.js +0 -138
- package/ccw/src/commands/uninstall.js +0 -238
- package/ccw/src/commands/upgrade.js +0 -307
- package/ccw/src/commands/view.js +0 -105
- package/ccw/src/core/dashboard-generator-patch.js +0 -29
- package/ccw/src/core/dashboard-generator.js +0 -682
- package/ccw/src/core/data-aggregator.js +0 -409
- package/ccw/src/core/lite-scanner.js +0 -314
- package/ccw/src/core/manifest.js +0 -201
- package/ccw/src/core/server.js +0 -2063
- package/ccw/src/core/session-scanner.js +0 -235
- package/ccw/src/index.js +0 -9
- package/ccw/src/templates/dashboard-css/01-base.css +0 -291
- package/ccw/src/templates/dashboard-css/02-session.css +0 -726
- package/ccw/src/templates/dashboard-css/04-lite-tasks.css +0 -843
- package/ccw/src/templates/dashboard-css/06-cards.css +0 -1570
- package/ccw/src/templates/dashboard-css/07-managers.css +0 -936
- package/ccw/src/templates/dashboard-css/09-explorer.css +0 -1397
- package/ccw/src/templates/dashboard-js/api.js +0 -200
- package/ccw/src/templates/dashboard-js/components/carousel.js +0 -398
- package/ccw/src/templates/dashboard-js/components/global-notifications.js +0 -219
- package/ccw/src/templates/dashboard-js/components/hook-manager.js +0 -283
- package/ccw/src/templates/dashboard-js/components/mcp-manager.js +0 -528
- package/ccw/src/templates/dashboard-js/components/modals.js +0 -260
- package/ccw/src/templates/dashboard-js/components/navigation.js +0 -245
- package/ccw/src/templates/dashboard-js/components/notifications.js +0 -194
- package/ccw/src/templates/dashboard-js/components/tabs-other.js +0 -273
- package/ccw/src/templates/dashboard-js/main.js +0 -72
- package/ccw/src/templates/dashboard-js/state.js +0 -42
- package/ccw/src/templates/dashboard-js/utils.js +0 -153
- package/ccw/src/templates/dashboard-js/views/explorer.js +0 -852
- package/ccw/src/templates/dashboard-js/views/home.js +0 -197
- package/ccw/src/templates/dashboard-js/views/hook-manager.js +0 -392
- package/ccw/src/templates/dashboard-js/views/lite-tasks.js +0 -395
- package/ccw/src/templates/dashboard-js/views/mcp-manager.js +0 -411
- package/ccw/src/templates/dashboard-js/views/session-detail.js +0 -780
- package/ccw/src/templates/dashboard.html +0 -731
- package/ccw/src/tools/classify-folders.js +0 -204
- package/ccw/src/tools/convert-tokens-to-css.js +0 -250
- package/ccw/src/tools/detect-changed-modules.js +0 -288
- package/ccw/src/tools/discover-design-files.js +0 -134
- package/ccw/src/tools/edit-file.js +0 -266
- package/ccw/src/tools/generate-module-docs.js +0 -416
- package/ccw/src/tools/get-modules-by-depth.js +0 -308
- package/ccw/src/tools/index.js +0 -176
- package/ccw/src/utils/browser-launcher.js +0 -60
- package/ccw/src/utils/file-utils.js +0 -48
- package/ccw/src/utils/path-resolver.js +0 -279
- package/ccw/src/utils/ui.js +0 -148
- /package/{ccw/src → src}/templates/dashboard-css/03-tasks.css +0 -0
- /package/{ccw/src → src}/templates/dashboard-css/05-context.css +0 -0
- /package/{ccw/src → src}/templates/dashboard-css/08-review.css +0 -0
- /package/{ccw/src → src}/templates/dashboard-js/components/_conflict_tab.js +0 -0
- /package/{ccw/src → src}/templates/dashboard-js/components/_exp_helpers.js +0 -0
- /package/{ccw/src → src}/templates/dashboard-js/components/_review_tab.js +0 -0
- /package/{ccw/src → src}/templates/dashboard-js/components/flowchart.js +0 -0
- /package/{ccw/src → src}/templates/dashboard-js/components/sidebar.js +0 -0
- /package/{ccw/src → src}/templates/dashboard-js/components/tabs-context.js +0 -0
- /package/{ccw/src → src}/templates/dashboard-js/components/task-drawer-core.js +0 -0
- /package/{ccw/src → src}/templates/dashboard-js/components/task-drawer-renderers.js +0 -0
- /package/{ccw/src → src}/templates/dashboard-js/components/theme.js +0 -0
- /package/{ccw/src → src}/templates/dashboard-js/components/version-check.js +0 -0
- /package/{ccw/src → src}/templates/dashboard-js/views/fix-session.js +0 -0
- /package/{ccw/src → src}/templates/dashboard-js/views/project-overview.js +0 -0
- /package/{ccw/src → src}/templates/dashboard-js/views/review-session.js +0 -0
- /package/{ccw/src → src}/templates/review-cycle-dashboard.html +0 -0
- /package/{ccw/src → src}/templates/workflow-dashboard.html +0 -0
- /package/{ccw/src → src}/tools/ui-generate-preview.js +0 -0
- /package/{ccw/src → src}/tools/ui-instantiate-prototypes.js +0 -0
- /package/{ccw/src → src}/tools/update-module-claude.js +0 -0
|
@@ -0,0 +1,1141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CodexLens Tool - Bridge between CCW and CodexLens Python package
|
|
3
|
+
* Provides code indexing and semantic search via spawned Python process
|
|
4
|
+
*
|
|
5
|
+
* Features:
|
|
6
|
+
* - Automatic venv bootstrap at ~/.codexlens/venv
|
|
7
|
+
* - JSON protocol communication
|
|
8
|
+
* - Symbol extraction and semantic search
|
|
9
|
+
* - FTS5 full-text search
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { z } from 'zod';
|
|
13
|
+
import type { ToolSchema, ToolResult } from '../types/tool.js';
|
|
14
|
+
import { spawn, execSync, exec } from 'child_process';
|
|
15
|
+
import { existsSync, mkdirSync } from 'fs';
|
|
16
|
+
import { join, dirname } from 'path';
|
|
17
|
+
import { homedir } from 'os';
|
|
18
|
+
import { fileURLToPath } from 'url';
|
|
19
|
+
|
|
20
|
+
// Get directory of this module
|
|
21
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
22
|
+
const __dirname = dirname(__filename);
|
|
23
|
+
|
|
24
|
+
// CodexLens configuration
|
|
25
|
+
const CODEXLENS_DATA_DIR = join(homedir(), '.codexlens');
|
|
26
|
+
const CODEXLENS_VENV = join(CODEXLENS_DATA_DIR, 'venv');
|
|
27
|
+
const VENV_PYTHON =
|
|
28
|
+
process.platform === 'win32'
|
|
29
|
+
? join(CODEXLENS_VENV, 'Scripts', 'python.exe')
|
|
30
|
+
: join(CODEXLENS_VENV, 'bin', 'python');
|
|
31
|
+
|
|
32
|
+
// Bootstrap status cache
|
|
33
|
+
let bootstrapChecked = false;
|
|
34
|
+
let bootstrapReady = false;
|
|
35
|
+
|
|
36
|
+
// Track running indexing process for cancellation
|
|
37
|
+
let currentIndexingProcess: ReturnType<typeof spawn> | null = null;
|
|
38
|
+
let currentIndexingAborted = false;
|
|
39
|
+
|
|
40
|
+
// Define Zod schema for validation
|
|
41
|
+
const ParamsSchema = z.object({
|
|
42
|
+
action: z.enum([
|
|
43
|
+
'init',
|
|
44
|
+
'search',
|
|
45
|
+
'search_files',
|
|
46
|
+
'status',
|
|
47
|
+
'symbol',
|
|
48
|
+
'check',
|
|
49
|
+
'update',
|
|
50
|
+
'bootstrap',
|
|
51
|
+
]),
|
|
52
|
+
path: z.string().optional(),
|
|
53
|
+
query: z.string().optional(),
|
|
54
|
+
mode: z.enum(['auto', 'text', 'semantic', 'exact', 'fuzzy', 'hybrid', 'vector', 'pure-vector']).default('auto'),
|
|
55
|
+
format: z.enum(['json', 'text', 'pretty']).default('json'),
|
|
56
|
+
languages: z.array(z.string()).optional(),
|
|
57
|
+
limit: z.number().default(20),
|
|
58
|
+
enrich: z.boolean().default(false),
|
|
59
|
+
// Additional fields for internal functions
|
|
60
|
+
file: z.string().optional(),
|
|
61
|
+
key: z.string().optional(),
|
|
62
|
+
value: z.string().optional(),
|
|
63
|
+
newPath: z.string().optional(),
|
|
64
|
+
all: z.boolean().optional(),
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
type Params = z.infer<typeof ParamsSchema>;
|
|
68
|
+
|
|
69
|
+
interface ReadyStatus {
|
|
70
|
+
ready: boolean;
|
|
71
|
+
error?: string;
|
|
72
|
+
version?: string;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
interface SemanticStatus {
|
|
76
|
+
available: boolean;
|
|
77
|
+
backend?: string;
|
|
78
|
+
error?: string;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
interface BootstrapResult {
|
|
82
|
+
success: boolean;
|
|
83
|
+
error?: string;
|
|
84
|
+
message?: string;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
interface ExecuteResult {
|
|
88
|
+
success: boolean;
|
|
89
|
+
output?: string;
|
|
90
|
+
error?: string;
|
|
91
|
+
message?: string;
|
|
92
|
+
results?: unknown;
|
|
93
|
+
files?: unknown;
|
|
94
|
+
symbols?: unknown;
|
|
95
|
+
status?: unknown;
|
|
96
|
+
config?: unknown;
|
|
97
|
+
cleanResult?: unknown;
|
|
98
|
+
ready?: boolean;
|
|
99
|
+
version?: string;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
interface ExecuteOptions {
|
|
103
|
+
timeout?: number;
|
|
104
|
+
cwd?: string;
|
|
105
|
+
onProgress?: (progress: ProgressInfo) => void;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
interface ProgressInfo {
|
|
109
|
+
stage: string;
|
|
110
|
+
message: string;
|
|
111
|
+
percent: number;
|
|
112
|
+
filesProcessed?: number;
|
|
113
|
+
totalFiles?: number;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Detect available Python 3 executable
|
|
118
|
+
* @returns Python executable command
|
|
119
|
+
*/
|
|
120
|
+
function getSystemPython(): string {
|
|
121
|
+
const commands = process.platform === 'win32' ? ['python', 'py', 'python3'] : ['python3', 'python'];
|
|
122
|
+
|
|
123
|
+
for (const cmd of commands) {
|
|
124
|
+
try {
|
|
125
|
+
const version = execSync(`${cmd} --version 2>&1`, { encoding: 'utf8' });
|
|
126
|
+
if (version.includes('Python 3')) {
|
|
127
|
+
return cmd;
|
|
128
|
+
}
|
|
129
|
+
} catch {
|
|
130
|
+
// Try next command
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
throw new Error('Python 3 not found. Please install Python 3 and ensure it is in PATH.');
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Check if CodexLens venv exists and has required packages
|
|
138
|
+
* @returns Ready status
|
|
139
|
+
*/
|
|
140
|
+
async function checkVenvStatus(): Promise<ReadyStatus> {
|
|
141
|
+
// Check venv exists
|
|
142
|
+
if (!existsSync(CODEXLENS_VENV)) {
|
|
143
|
+
return { ready: false, error: 'Venv not found' };
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Check python executable exists
|
|
147
|
+
if (!existsSync(VENV_PYTHON)) {
|
|
148
|
+
return { ready: false, error: 'Python executable not found in venv' };
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Check codexlens is importable
|
|
152
|
+
return new Promise((resolve) => {
|
|
153
|
+
const child = spawn(VENV_PYTHON, ['-c', 'import codexlens; print(codexlens.__version__)'], {
|
|
154
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
155
|
+
timeout: 10000,
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
let stdout = '';
|
|
159
|
+
let stderr = '';
|
|
160
|
+
|
|
161
|
+
child.stdout.on('data', (data) => {
|
|
162
|
+
stdout += data.toString();
|
|
163
|
+
});
|
|
164
|
+
child.stderr.on('data', (data) => {
|
|
165
|
+
stderr += data.toString();
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
child.on('close', (code) => {
|
|
169
|
+
if (code === 0) {
|
|
170
|
+
resolve({ ready: true, version: stdout.trim() });
|
|
171
|
+
} else {
|
|
172
|
+
resolve({ ready: false, error: `CodexLens not installed: ${stderr}` });
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
child.on('error', (err) => {
|
|
177
|
+
resolve({ ready: false, error: `Failed to check venv: ${err.message}` });
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Check if semantic search dependencies are installed
|
|
184
|
+
* @returns Semantic status
|
|
185
|
+
*/
|
|
186
|
+
async function checkSemanticStatus(): Promise<SemanticStatus> {
|
|
187
|
+
// First check if CodexLens is installed
|
|
188
|
+
const venvStatus = await checkVenvStatus();
|
|
189
|
+
if (!venvStatus.ready) {
|
|
190
|
+
return { available: false, error: 'CodexLens not installed' };
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Check semantic module availability
|
|
194
|
+
return new Promise((resolve) => {
|
|
195
|
+
const checkCode = `
|
|
196
|
+
import sys
|
|
197
|
+
try:
|
|
198
|
+
from codexlens.semantic import SEMANTIC_AVAILABLE, SEMANTIC_BACKEND
|
|
199
|
+
if SEMANTIC_AVAILABLE:
|
|
200
|
+
print(f"available:{SEMANTIC_BACKEND}")
|
|
201
|
+
else:
|
|
202
|
+
print("unavailable")
|
|
203
|
+
except Exception as e:
|
|
204
|
+
print(f"error:{e}")
|
|
205
|
+
`;
|
|
206
|
+
const child = spawn(VENV_PYTHON, ['-c', checkCode], {
|
|
207
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
208
|
+
timeout: 15000,
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
let stdout = '';
|
|
212
|
+
let stderr = '';
|
|
213
|
+
|
|
214
|
+
child.stdout.on('data', (data) => {
|
|
215
|
+
stdout += data.toString();
|
|
216
|
+
});
|
|
217
|
+
child.stderr.on('data', (data) => {
|
|
218
|
+
stderr += data.toString();
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
child.on('close', (code) => {
|
|
222
|
+
const output = stdout.trim();
|
|
223
|
+
if (output.startsWith('available:')) {
|
|
224
|
+
const backend = output.split(':')[1];
|
|
225
|
+
resolve({ available: true, backend });
|
|
226
|
+
} else if (output === 'unavailable') {
|
|
227
|
+
resolve({ available: false, error: 'Semantic dependencies not installed' });
|
|
228
|
+
} else {
|
|
229
|
+
resolve({ available: false, error: output || stderr || 'Unknown error' });
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
child.on('error', (err) => {
|
|
234
|
+
resolve({ available: false, error: `Check failed: ${err.message}` });
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Install semantic search dependencies (fastembed, ONNX-based, ~200MB)
|
|
241
|
+
* @returns Bootstrap result
|
|
242
|
+
*/
|
|
243
|
+
async function installSemantic(): Promise<BootstrapResult> {
|
|
244
|
+
// First ensure CodexLens is installed
|
|
245
|
+
const venvStatus = await checkVenvStatus();
|
|
246
|
+
if (!venvStatus.ready) {
|
|
247
|
+
return { success: false, error: 'CodexLens not installed. Install CodexLens first.' };
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
const pipPath =
|
|
251
|
+
process.platform === 'win32'
|
|
252
|
+
? join(CODEXLENS_VENV, 'Scripts', 'pip.exe')
|
|
253
|
+
: join(CODEXLENS_VENV, 'bin', 'pip');
|
|
254
|
+
|
|
255
|
+
return new Promise((resolve) => {
|
|
256
|
+
console.log('[CodexLens] Installing semantic search dependencies (fastembed)...');
|
|
257
|
+
console.log('[CodexLens] Using ONNX-based fastembed backend (~200MB)');
|
|
258
|
+
|
|
259
|
+
const child = spawn(pipPath, ['install', 'numpy>=1.24', 'fastembed>=0.2'], {
|
|
260
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
261
|
+
timeout: 600000, // 10 minutes for potential model download
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
let stdout = '';
|
|
265
|
+
let stderr = '';
|
|
266
|
+
|
|
267
|
+
child.stdout.on('data', (data) => {
|
|
268
|
+
stdout += data.toString();
|
|
269
|
+
// Log progress
|
|
270
|
+
const line = data.toString().trim();
|
|
271
|
+
if (line.includes('Downloading') || line.includes('Installing') || line.includes('Collecting')) {
|
|
272
|
+
console.log(`[CodexLens] ${line}`);
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
child.stderr.on('data', (data) => {
|
|
277
|
+
stderr += data.toString();
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
child.on('close', (code) => {
|
|
281
|
+
if (code === 0) {
|
|
282
|
+
console.log('[CodexLens] Semantic dependencies installed successfully');
|
|
283
|
+
resolve({ success: true });
|
|
284
|
+
} else {
|
|
285
|
+
resolve({ success: false, error: `Installation failed: ${stderr || stdout}` });
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
child.on('error', (err) => {
|
|
290
|
+
resolve({ success: false, error: `Failed to run pip: ${err.message}` });
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Bootstrap CodexLens venv with required packages
|
|
297
|
+
* @returns Bootstrap result
|
|
298
|
+
*/
|
|
299
|
+
async function bootstrapVenv(): Promise<BootstrapResult> {
|
|
300
|
+
// Ensure data directory exists
|
|
301
|
+
if (!existsSync(CODEXLENS_DATA_DIR)) {
|
|
302
|
+
mkdirSync(CODEXLENS_DATA_DIR, { recursive: true });
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// Create venv if not exists
|
|
306
|
+
if (!existsSync(CODEXLENS_VENV)) {
|
|
307
|
+
try {
|
|
308
|
+
console.log('[CodexLens] Creating virtual environment...');
|
|
309
|
+
const pythonCmd = getSystemPython();
|
|
310
|
+
execSync(`${pythonCmd} -m venv "${CODEXLENS_VENV}"`, { stdio: 'inherit' });
|
|
311
|
+
} catch (err) {
|
|
312
|
+
return { success: false, error: `Failed to create venv: ${(err as Error).message}` };
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// Install codexlens with semantic extras
|
|
317
|
+
try {
|
|
318
|
+
console.log('[CodexLens] Installing codexlens package...');
|
|
319
|
+
const pipPath =
|
|
320
|
+
process.platform === 'win32'
|
|
321
|
+
? join(CODEXLENS_VENV, 'Scripts', 'pip.exe')
|
|
322
|
+
: join(CODEXLENS_VENV, 'bin', 'pip');
|
|
323
|
+
|
|
324
|
+
// Try multiple local paths, then fall back to PyPI
|
|
325
|
+
const possiblePaths = [
|
|
326
|
+
join(process.cwd(), 'codex-lens'),
|
|
327
|
+
join(__dirname, '..', '..', '..', 'codex-lens'), // ccw/src/tools -> project root
|
|
328
|
+
join(homedir(), 'codex-lens'),
|
|
329
|
+
];
|
|
330
|
+
|
|
331
|
+
let installed = false;
|
|
332
|
+
for (const localPath of possiblePaths) {
|
|
333
|
+
if (existsSync(join(localPath, 'pyproject.toml'))) {
|
|
334
|
+
console.log(`[CodexLens] Installing from local path: ${localPath}`);
|
|
335
|
+
execSync(`"${pipPath}" install -e "${localPath}"`, { stdio: 'inherit' });
|
|
336
|
+
installed = true;
|
|
337
|
+
break;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
if (!installed) {
|
|
342
|
+
console.log('[CodexLens] Installing from PyPI...');
|
|
343
|
+
execSync(`"${pipPath}" install codexlens`, { stdio: 'inherit' });
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
return { success: true };
|
|
347
|
+
} catch (err) {
|
|
348
|
+
return { success: false, error: `Failed to install codexlens: ${(err as Error).message}` };
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/**
|
|
353
|
+
* Ensure CodexLens is ready to use
|
|
354
|
+
* @returns Ready status
|
|
355
|
+
*/
|
|
356
|
+
async function ensureReady(): Promise<ReadyStatus> {
|
|
357
|
+
// Use cached result if already checked
|
|
358
|
+
if (bootstrapChecked && bootstrapReady) {
|
|
359
|
+
return { ready: true };
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// Check current status
|
|
363
|
+
const status = await checkVenvStatus();
|
|
364
|
+
if (status.ready) {
|
|
365
|
+
bootstrapChecked = true;
|
|
366
|
+
bootstrapReady = true;
|
|
367
|
+
return { ready: true, version: status.version };
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
// Attempt bootstrap
|
|
371
|
+
const bootstrap = await bootstrapVenv();
|
|
372
|
+
if (!bootstrap.success) {
|
|
373
|
+
return { ready: false, error: bootstrap.error };
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
// Verify after bootstrap
|
|
377
|
+
const recheck = await checkVenvStatus();
|
|
378
|
+
bootstrapChecked = true;
|
|
379
|
+
bootstrapReady = recheck.ready;
|
|
380
|
+
|
|
381
|
+
return recheck;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
/**
|
|
385
|
+
* Parse progress info from CodexLens output
|
|
386
|
+
* @param line - Output line to parse
|
|
387
|
+
* @returns Progress info or null
|
|
388
|
+
*/
|
|
389
|
+
function parseProgressLine(line: string): ProgressInfo | null {
|
|
390
|
+
// Parse file processing progress: "Processing file X/Y: path"
|
|
391
|
+
const fileMatch = line.match(/Processing file (\d+)\/(\d+):\s*(.+)/i);
|
|
392
|
+
if (fileMatch) {
|
|
393
|
+
const current = parseInt(fileMatch[1], 10);
|
|
394
|
+
const total = parseInt(fileMatch[2], 10);
|
|
395
|
+
return {
|
|
396
|
+
stage: 'indexing',
|
|
397
|
+
message: `Processing ${fileMatch[3]}`,
|
|
398
|
+
percent: Math.round((current / total) * 80) + 10, // 10-90%
|
|
399
|
+
filesProcessed: current,
|
|
400
|
+
totalFiles: total,
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
// Parse stage messages
|
|
405
|
+
if (line.includes('Discovering files')) {
|
|
406
|
+
return { stage: 'discover', message: 'Discovering files...', percent: 5 };
|
|
407
|
+
}
|
|
408
|
+
if (line.includes('Building index')) {
|
|
409
|
+
return { stage: 'build', message: 'Building index...', percent: 10 };
|
|
410
|
+
}
|
|
411
|
+
if (line.includes('Extracting symbols')) {
|
|
412
|
+
return { stage: 'symbols', message: 'Extracting symbols...', percent: 50 };
|
|
413
|
+
}
|
|
414
|
+
if (line.includes('Generating embeddings') || line.includes('Creating embeddings')) {
|
|
415
|
+
return { stage: 'embeddings', message: 'Generating embeddings...', percent: 70 };
|
|
416
|
+
}
|
|
417
|
+
// Note: "Finalizing index" and "Building ANN" are handled separately below
|
|
418
|
+
// Only match generic "Complete" here (not "Finalizing" which has specific handlers)
|
|
419
|
+
|
|
420
|
+
// Parse indexed count: "Indexed X files" - FTS complete, but embeddings may follow
|
|
421
|
+
const indexedMatch = line.match(/Indexed (\d+) files/i);
|
|
422
|
+
if (indexedMatch) {
|
|
423
|
+
return {
|
|
424
|
+
stage: 'fts_complete', // Not 'complete' - embeddings generation may still be pending
|
|
425
|
+
message: `Indexed ${indexedMatch[1]} files, generating embeddings...`,
|
|
426
|
+
percent: 60, // FTS done, embeddings starting
|
|
427
|
+
filesProcessed: parseInt(indexedMatch[1], 10),
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
// Parse embedding batch progress: "Batch X: N files, M chunks"
|
|
432
|
+
const batchMatch = line.match(/Batch (\d+):\s*(\d+) files,\s*(\d+) chunks/i);
|
|
433
|
+
if (batchMatch) {
|
|
434
|
+
return {
|
|
435
|
+
stage: 'embeddings',
|
|
436
|
+
message: `Embedding batch ${batchMatch[1]}: ${batchMatch[3]} chunks`,
|
|
437
|
+
percent: 70, // Stay at 70% during embedding batches
|
|
438
|
+
};
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
// Parse embedding progress with file count
|
|
442
|
+
const embedProgressMatch = line.match(/Processing (\d+) files/i);
|
|
443
|
+
if (embedProgressMatch && line.toLowerCase().includes('embed')) {
|
|
444
|
+
return {
|
|
445
|
+
stage: 'embeddings',
|
|
446
|
+
message: `Processing ${embedProgressMatch[1]} files for embeddings`,
|
|
447
|
+
percent: 75,
|
|
448
|
+
};
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
// Parse finalizing ANN index
|
|
452
|
+
if (line.includes('Finalizing index') || line.includes('Building ANN')) {
|
|
453
|
+
return { stage: 'finalizing', message: 'Finalizing vector index...', percent: 90 };
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
// Parse embeddings complete message
|
|
457
|
+
const embedCompleteMatch = line.match(/Embeddings complete:\s*(\d+)\s*chunks/i);
|
|
458
|
+
if (embedCompleteMatch) {
|
|
459
|
+
return {
|
|
460
|
+
stage: 'embeddings_complete',
|
|
461
|
+
message: `Embeddings complete: ${embedCompleteMatch[1]} chunks`,
|
|
462
|
+
percent: 95,
|
|
463
|
+
};
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
// Parse generic completion (but not "Embeddings complete" which is handled above)
|
|
467
|
+
if (line.includes('Complete') && !line.toLowerCase().includes('embeddings complete')) {
|
|
468
|
+
return { stage: 'complete', message: 'Complete', percent: 98 };
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
return null;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
/**
|
|
475
|
+
* Execute CodexLens CLI command with real-time progress updates
|
|
476
|
+
* @param args - CLI arguments
|
|
477
|
+
* @param options - Execution options
|
|
478
|
+
* @returns Execution result
|
|
479
|
+
*/
|
|
480
|
+
async function executeCodexLens(args: string[], options: ExecuteOptions = {}): Promise<ExecuteResult> {
|
|
481
|
+
const { timeout = 300000, cwd = process.cwd(), onProgress } = options; // Default 5 min
|
|
482
|
+
|
|
483
|
+
// Ensure ready
|
|
484
|
+
const readyStatus = await ensureReady();
|
|
485
|
+
if (!readyStatus.ready) {
|
|
486
|
+
return { success: false, error: readyStatus.error };
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
return new Promise((resolve) => {
|
|
490
|
+
// Build command string - quote paths for shell execution
|
|
491
|
+
const quotedPython = `"${VENV_PYTHON}"`;
|
|
492
|
+
const cmdArgs = args.map(arg => {
|
|
493
|
+
// Quote arguments that contain spaces or special characters
|
|
494
|
+
if (arg.includes(' ') || arg.includes('\\')) {
|
|
495
|
+
return `"${arg}"`;
|
|
496
|
+
}
|
|
497
|
+
return arg;
|
|
498
|
+
});
|
|
499
|
+
|
|
500
|
+
// Build full command - on Windows, prepend cd to handle different drives
|
|
501
|
+
let fullCmd: string;
|
|
502
|
+
if (process.platform === 'win32' && cwd) {
|
|
503
|
+
// Use cd /d to change drive and directory, then run command
|
|
504
|
+
fullCmd = `cd /d "${cwd}" && ${quotedPython} -m codexlens ${cmdArgs.join(' ')}`;
|
|
505
|
+
} else {
|
|
506
|
+
fullCmd = `${quotedPython} -m codexlens ${cmdArgs.join(' ')}`;
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
// Use spawn with shell for real-time progress updates
|
|
510
|
+
// spawn streams output in real-time, unlike exec which buffers until completion
|
|
511
|
+
const child = spawn(fullCmd, [], {
|
|
512
|
+
cwd: process.platform === 'win32' ? undefined : cwd,
|
|
513
|
+
shell: process.platform === 'win32' ? process.env.ComSpec || true : true,
|
|
514
|
+
timeout,
|
|
515
|
+
});
|
|
516
|
+
|
|
517
|
+
// Track indexing process for cancellation (only for init commands)
|
|
518
|
+
const isIndexingCommand = args.includes('init');
|
|
519
|
+
if (isIndexingCommand) {
|
|
520
|
+
currentIndexingProcess = child;
|
|
521
|
+
currentIndexingAborted = false;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
let stdout = '';
|
|
525
|
+
let stderr = '';
|
|
526
|
+
let stdoutLineBuffer = '';
|
|
527
|
+
let stderrLineBuffer = '';
|
|
528
|
+
let timeoutHandle: NodeJS.Timeout | null = null;
|
|
529
|
+
let resolved = false;
|
|
530
|
+
|
|
531
|
+
// Helper to safely resolve only once
|
|
532
|
+
const safeResolve = (result: ExecuteResult) => {
|
|
533
|
+
if (resolved) return;
|
|
534
|
+
resolved = true;
|
|
535
|
+
if (timeoutHandle) {
|
|
536
|
+
clearTimeout(timeoutHandle);
|
|
537
|
+
timeoutHandle = null;
|
|
538
|
+
}
|
|
539
|
+
// Clear indexing process tracking
|
|
540
|
+
if (isIndexingCommand) {
|
|
541
|
+
currentIndexingProcess = null;
|
|
542
|
+
}
|
|
543
|
+
resolve(result);
|
|
544
|
+
};
|
|
545
|
+
|
|
546
|
+
// Set up timeout handler
|
|
547
|
+
if (timeout > 0) {
|
|
548
|
+
timeoutHandle = setTimeout(() => {
|
|
549
|
+
if (!resolved) {
|
|
550
|
+
child.kill('SIGTERM');
|
|
551
|
+
// Give it a moment to die gracefully, then force kill
|
|
552
|
+
setTimeout(() => {
|
|
553
|
+
if (!resolved) {
|
|
554
|
+
child.kill('SIGKILL');
|
|
555
|
+
}
|
|
556
|
+
}, 5000);
|
|
557
|
+
safeResolve({ success: false, error: 'Command timed out' });
|
|
558
|
+
}
|
|
559
|
+
}, timeout);
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
// Process stdout line by line for real-time progress
|
|
563
|
+
child.stdout?.on('data', (data: Buffer) => {
|
|
564
|
+
const chunk = data.toString();
|
|
565
|
+
stdoutLineBuffer += chunk;
|
|
566
|
+
stdout += chunk;
|
|
567
|
+
|
|
568
|
+
// Process complete lines
|
|
569
|
+
const lines = stdoutLineBuffer.split('\n');
|
|
570
|
+
stdoutLineBuffer = lines.pop() || ''; // Keep incomplete line in buffer
|
|
571
|
+
|
|
572
|
+
for (const line of lines) {
|
|
573
|
+
const trimmedLine = line.trim();
|
|
574
|
+
if (trimmedLine && onProgress) {
|
|
575
|
+
const progress = parseProgressLine(trimmedLine);
|
|
576
|
+
if (progress) {
|
|
577
|
+
onProgress(progress);
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
});
|
|
582
|
+
|
|
583
|
+
// Collect stderr
|
|
584
|
+
child.stderr?.on('data', (data: Buffer) => {
|
|
585
|
+
const chunk = data.toString();
|
|
586
|
+
stderrLineBuffer += chunk;
|
|
587
|
+
stderr += chunk;
|
|
588
|
+
|
|
589
|
+
// Also check stderr for progress (some tools output progress to stderr)
|
|
590
|
+
const lines = stderrLineBuffer.split('\n');
|
|
591
|
+
stderrLineBuffer = lines.pop() || '';
|
|
592
|
+
|
|
593
|
+
for (const line of lines) {
|
|
594
|
+
const trimmedLine = line.trim();
|
|
595
|
+
if (trimmedLine && onProgress) {
|
|
596
|
+
const progress = parseProgressLine(trimmedLine);
|
|
597
|
+
if (progress) {
|
|
598
|
+
onProgress(progress);
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
});
|
|
603
|
+
|
|
604
|
+
// Handle process errors (spawn failure)
|
|
605
|
+
child.on('error', (err) => {
|
|
606
|
+
safeResolve({ success: false, error: `Failed to start process: ${err.message}` });
|
|
607
|
+
});
|
|
608
|
+
|
|
609
|
+
// Handle process completion
|
|
610
|
+
child.on('close', (code) => {
|
|
611
|
+
// Process any remaining buffered content
|
|
612
|
+
if (stdoutLineBuffer.trim() && onProgress) {
|
|
613
|
+
const progress = parseProgressLine(stdoutLineBuffer.trim());
|
|
614
|
+
if (progress) {
|
|
615
|
+
onProgress(progress);
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
if (code === 0) {
|
|
620
|
+
safeResolve({ success: true, output: stdout.trim() });
|
|
621
|
+
} else {
|
|
622
|
+
safeResolve({ success: false, error: stderr.trim() || `Process exited with code ${code}` });
|
|
623
|
+
}
|
|
624
|
+
});
|
|
625
|
+
});
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
/**
|
|
629
|
+
* Initialize CodexLens index for a directory
|
|
630
|
+
* @param params - Parameters
|
|
631
|
+
* @returns Execution result
|
|
632
|
+
*/
|
|
633
|
+
async function initIndex(params: Params): Promise<ExecuteResult> {
|
|
634
|
+
const { path = '.', languages } = params;
|
|
635
|
+
|
|
636
|
+
const args = ['init', path];
|
|
637
|
+
if (languages && languages.length > 0) {
|
|
638
|
+
args.push('--languages', languages.join(','));
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
return executeCodexLens(args, { cwd: path });
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
/**
|
|
645
|
+
* Search code using CodexLens
|
|
646
|
+
* @param params - Search parameters
|
|
647
|
+
* @returns Execution result
|
|
648
|
+
*/
|
|
649
|
+
async function searchCode(params: Params): Promise<ExecuteResult> {
|
|
650
|
+
const { query, path = '.', limit = 20, mode = 'auto', enrich = false } = params;
|
|
651
|
+
|
|
652
|
+
if (!query) {
|
|
653
|
+
return { success: false, error: 'Query is required for search action' };
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
// Map MCP mode names to CLI mode names
|
|
657
|
+
const modeMap: Record<string, string> = {
|
|
658
|
+
'text': 'exact',
|
|
659
|
+
'semantic': 'pure-vector',
|
|
660
|
+
'auto': 'auto',
|
|
661
|
+
'exact': 'exact',
|
|
662
|
+
'fuzzy': 'fuzzy',
|
|
663
|
+
'hybrid': 'hybrid',
|
|
664
|
+
'vector': 'vector',
|
|
665
|
+
'pure-vector': 'pure-vector',
|
|
666
|
+
};
|
|
667
|
+
|
|
668
|
+
const cliMode = modeMap[mode] || 'auto';
|
|
669
|
+
const args = ['search', query, '--limit', limit.toString(), '--mode', cliMode, '--json'];
|
|
670
|
+
|
|
671
|
+
if (enrich) {
|
|
672
|
+
args.push('--enrich');
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
const result = await executeCodexLens(args, { cwd: path });
|
|
676
|
+
|
|
677
|
+
if (result.success && result.output) {
|
|
678
|
+
try {
|
|
679
|
+
result.results = JSON.parse(result.output);
|
|
680
|
+
delete result.output;
|
|
681
|
+
} catch {
|
|
682
|
+
// Keep raw output if JSON parse fails
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
return result;
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
/**
|
|
690
|
+
* Search code and return only file paths
|
|
691
|
+
* @param params - Search parameters
|
|
692
|
+
* @returns Execution result
|
|
693
|
+
*/
|
|
694
|
+
async function searchFiles(params: Params): Promise<ExecuteResult> {
|
|
695
|
+
const { query, path = '.', limit = 20, mode = 'auto', enrich = false } = params;
|
|
696
|
+
|
|
697
|
+
if (!query) {
|
|
698
|
+
return { success: false, error: 'Query is required for search_files action' };
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
// Map MCP mode names to CLI mode names
|
|
702
|
+
const modeMap: Record<string, string> = {
|
|
703
|
+
'text': 'exact',
|
|
704
|
+
'semantic': 'pure-vector',
|
|
705
|
+
'auto': 'auto',
|
|
706
|
+
'exact': 'exact',
|
|
707
|
+
'fuzzy': 'fuzzy',
|
|
708
|
+
'hybrid': 'hybrid',
|
|
709
|
+
'vector': 'vector',
|
|
710
|
+
'pure-vector': 'pure-vector',
|
|
711
|
+
};
|
|
712
|
+
|
|
713
|
+
const cliMode = modeMap[mode] || 'auto';
|
|
714
|
+
const args = ['search', query, '--files-only', '--limit', limit.toString(), '--mode', cliMode, '--json'];
|
|
715
|
+
|
|
716
|
+
if (enrich) {
|
|
717
|
+
args.push('--enrich');
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
const result = await executeCodexLens(args, { cwd: path });
|
|
721
|
+
|
|
722
|
+
if (result.success && result.output) {
|
|
723
|
+
try {
|
|
724
|
+
result.files = JSON.parse(result.output);
|
|
725
|
+
delete result.output;
|
|
726
|
+
} catch {
|
|
727
|
+
// Keep raw output if JSON parse fails
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
return result;
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
/**
|
|
735
|
+
* Extract symbols from a file
|
|
736
|
+
* @param params - Parameters
|
|
737
|
+
* @returns Execution result
|
|
738
|
+
*/
|
|
739
|
+
async function extractSymbols(params: Params): Promise<ExecuteResult> {
|
|
740
|
+
const { file } = params;
|
|
741
|
+
|
|
742
|
+
if (!file) {
|
|
743
|
+
return { success: false, error: 'File is required for symbol action' };
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
const args = ['symbol', file, '--json'];
|
|
747
|
+
|
|
748
|
+
const result = await executeCodexLens(args);
|
|
749
|
+
|
|
750
|
+
if (result.success && result.output) {
|
|
751
|
+
try {
|
|
752
|
+
result.symbols = JSON.parse(result.output);
|
|
753
|
+
delete result.output;
|
|
754
|
+
} catch {
|
|
755
|
+
// Keep raw output if JSON parse fails
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
return result;
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
/**
|
|
763
|
+
* Get index status
|
|
764
|
+
* @param params - Parameters
|
|
765
|
+
* @returns Execution result
|
|
766
|
+
*/
|
|
767
|
+
async function getStatus(params: Params): Promise<ExecuteResult> {
|
|
768
|
+
const { path = '.' } = params;
|
|
769
|
+
|
|
770
|
+
const args = ['status', '--json'];
|
|
771
|
+
|
|
772
|
+
const result = await executeCodexLens(args, { cwd: path });
|
|
773
|
+
|
|
774
|
+
if (result.success && result.output) {
|
|
775
|
+
try {
|
|
776
|
+
result.status = JSON.parse(result.output);
|
|
777
|
+
delete result.output;
|
|
778
|
+
} catch {
|
|
779
|
+
// Keep raw output if JSON parse fails
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
return result;
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
/**
|
|
787
|
+
* Show configuration
|
|
788
|
+
* @param params - Parameters
|
|
789
|
+
* @returns Execution result
|
|
790
|
+
*/
|
|
791
|
+
async function configShow(): Promise<ExecuteResult> {
|
|
792
|
+
const args = ['config', 'show', '--json'];
|
|
793
|
+
const result = await executeCodexLens(args);
|
|
794
|
+
|
|
795
|
+
if (result.success && result.output) {
|
|
796
|
+
try {
|
|
797
|
+
result.config = JSON.parse(result.output);
|
|
798
|
+
delete result.output;
|
|
799
|
+
} catch {
|
|
800
|
+
// Keep raw output if JSON parse fails
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
return result;
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
/**
|
|
808
|
+
* Set configuration value
|
|
809
|
+
* @param params - Parameters
|
|
810
|
+
* @returns Execution result
|
|
811
|
+
*/
|
|
812
|
+
async function configSet(params: Params): Promise<ExecuteResult> {
|
|
813
|
+
const { key, value } = params;
|
|
814
|
+
|
|
815
|
+
if (!key) {
|
|
816
|
+
return { success: false, error: 'key is required for config_set action' };
|
|
817
|
+
}
|
|
818
|
+
if (!value) {
|
|
819
|
+
return { success: false, error: 'value is required for config_set action' };
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
const args = ['config', 'set', key, value, '--json'];
|
|
823
|
+
const result = await executeCodexLens(args);
|
|
824
|
+
|
|
825
|
+
if (result.success && result.output) {
|
|
826
|
+
try {
|
|
827
|
+
result.config = JSON.parse(result.output);
|
|
828
|
+
delete result.output;
|
|
829
|
+
} catch {
|
|
830
|
+
// Keep raw output if JSON parse fails
|
|
831
|
+
}
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
return result;
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
/**
|
|
838
|
+
* Migrate indexes to new location
|
|
839
|
+
* @param params - Parameters
|
|
840
|
+
* @returns Execution result
|
|
841
|
+
*/
|
|
842
|
+
async function configMigrate(params: Params): Promise<ExecuteResult> {
|
|
843
|
+
const { newPath } = params;
|
|
844
|
+
|
|
845
|
+
if (!newPath) {
|
|
846
|
+
return { success: false, error: 'newPath is required for config_migrate action' };
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
const args = ['config', 'migrate', newPath, '--json'];
|
|
850
|
+
const result = await executeCodexLens(args, { timeout: 300000 }); // 5 min for migration
|
|
851
|
+
|
|
852
|
+
if (result.success && result.output) {
|
|
853
|
+
try {
|
|
854
|
+
result.config = JSON.parse(result.output);
|
|
855
|
+
delete result.output;
|
|
856
|
+
} catch {
|
|
857
|
+
// Keep raw output if JSON parse fails
|
|
858
|
+
}
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
return result;
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
/**
|
|
865
|
+
* Clean indexes
|
|
866
|
+
* @param params - Parameters
|
|
867
|
+
* @returns Execution result
|
|
868
|
+
*/
|
|
869
|
+
async function cleanIndexes(params: Params): Promise<ExecuteResult> {
|
|
870
|
+
const { path, all } = params;
|
|
871
|
+
|
|
872
|
+
const args = ['clean'];
|
|
873
|
+
|
|
874
|
+
if (all) {
|
|
875
|
+
args.push('--all');
|
|
876
|
+
} else if (path) {
|
|
877
|
+
args.push(path);
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
args.push('--json');
|
|
881
|
+
const result = await executeCodexLens(args);
|
|
882
|
+
|
|
883
|
+
if (result.success && result.output) {
|
|
884
|
+
try {
|
|
885
|
+
result.cleanResult = JSON.parse(result.output);
|
|
886
|
+
delete result.output;
|
|
887
|
+
} catch {
|
|
888
|
+
// Keep raw output if JSON parse fails
|
|
889
|
+
}
|
|
890
|
+
}
|
|
891
|
+
|
|
892
|
+
return result;
|
|
893
|
+
}
|
|
894
|
+
|
|
895
|
+
// Tool schema for MCP
|
|
896
|
+
export const schema: ToolSchema = {
|
|
897
|
+
name: 'codex_lens',
|
|
898
|
+
description: `CodexLens - Code indexing and semantic search.
|
|
899
|
+
|
|
900
|
+
Usage:
|
|
901
|
+
codex_lens(action="init", path=".") # Index directory (auto-generates embeddings if available)
|
|
902
|
+
codex_lens(action="search", query="func") # Search code (auto: hybrid if embeddings exist, else exact)
|
|
903
|
+
codex_lens(action="search", query="func", mode="hybrid") # Force hybrid search
|
|
904
|
+
codex_lens(action="search_files", query="x") # Search, return paths only
|
|
905
|
+
|
|
906
|
+
Graph Enrichment:
|
|
907
|
+
codex_lens(action="search", query="func", enrich=true) # Enrich results with code relationships
|
|
908
|
+
|
|
909
|
+
Search Modes:
|
|
910
|
+
- auto: Auto-detect (hybrid if embeddings exist, exact otherwise) [default]
|
|
911
|
+
- exact/text: Exact FTS for code identifiers
|
|
912
|
+
- hybrid: Exact + Fuzzy + Vector fusion (best results, requires embeddings)
|
|
913
|
+
- fuzzy: Typo-tolerant search
|
|
914
|
+
- vector: Semantic + keyword
|
|
915
|
+
- pure-vector/semantic: Pure semantic search
|
|
916
|
+
|
|
917
|
+
Note: For advanced operations (config, status, clean), use CLI directly: codexlens --help`,
|
|
918
|
+
inputSchema: {
|
|
919
|
+
type: 'object',
|
|
920
|
+
properties: {
|
|
921
|
+
action: {
|
|
922
|
+
type: 'string',
|
|
923
|
+
enum: [
|
|
924
|
+
'init',
|
|
925
|
+
'search',
|
|
926
|
+
'search_files',
|
|
927
|
+
'status',
|
|
928
|
+
'symbol',
|
|
929
|
+
'check',
|
|
930
|
+
'update',
|
|
931
|
+
'bootstrap',
|
|
932
|
+
],
|
|
933
|
+
description: 'Action to perform: init/update (index directory), search (search code), search_files (search files only), status (index status), symbol (extract symbols), check (check if ready), bootstrap (setup venv)',
|
|
934
|
+
},
|
|
935
|
+
path: {
|
|
936
|
+
type: 'string',
|
|
937
|
+
description: 'Target directory path (for init, search, search_files). Defaults to current directory.',
|
|
938
|
+
},
|
|
939
|
+
query: {
|
|
940
|
+
type: 'string',
|
|
941
|
+
description: 'Search query (required for search and search_files actions)',
|
|
942
|
+
},
|
|
943
|
+
mode: {
|
|
944
|
+
type: 'string',
|
|
945
|
+
enum: ['auto', 'text', 'semantic', 'exact', 'fuzzy', 'hybrid', 'vector', 'pure-vector'],
|
|
946
|
+
description: 'Search mode: auto (default, hybrid if embeddings exist), text/exact (FTS), hybrid (best), fuzzy, vector, semantic/pure-vector',
|
|
947
|
+
default: 'auto',
|
|
948
|
+
},
|
|
949
|
+
format: {
|
|
950
|
+
type: 'string',
|
|
951
|
+
enum: ['json', 'text', 'pretty'],
|
|
952
|
+
description: 'Output format: json (default), text, pretty',
|
|
953
|
+
default: 'json',
|
|
954
|
+
},
|
|
955
|
+
languages: {
|
|
956
|
+
type: 'array',
|
|
957
|
+
items: { type: 'string' },
|
|
958
|
+
description: 'Languages to index (for init action). Example: ["javascript", "typescript", "python"]',
|
|
959
|
+
},
|
|
960
|
+
limit: {
|
|
961
|
+
type: 'number',
|
|
962
|
+
description: 'Maximum number of search results (for search and search_files actions)',
|
|
963
|
+
default: 20,
|
|
964
|
+
},
|
|
965
|
+
enrich: {
|
|
966
|
+
type: 'boolean',
|
|
967
|
+
description: 'Enrich search results with code graph relationships (calls, imports)',
|
|
968
|
+
default: false,
|
|
969
|
+
},
|
|
970
|
+
},
|
|
971
|
+
required: ['action'],
|
|
972
|
+
},
|
|
973
|
+
};
|
|
974
|
+
|
|
975
|
+
// Handler function
|
|
976
|
+
export async function handler(params: Record<string, unknown>): Promise<ToolResult<ExecuteResult>> {
|
|
977
|
+
const parsed = ParamsSchema.safeParse(params);
|
|
978
|
+
if (!parsed.success) {
|
|
979
|
+
return { success: false, error: `Invalid params: ${parsed.error.message}` };
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
const { action } = parsed.data;
|
|
983
|
+
|
|
984
|
+
try {
|
|
985
|
+
let result: ExecuteResult;
|
|
986
|
+
|
|
987
|
+
switch (action) {
|
|
988
|
+
case 'init':
|
|
989
|
+
result = await initIndex(parsed.data);
|
|
990
|
+
break;
|
|
991
|
+
|
|
992
|
+
case 'search':
|
|
993
|
+
result = await searchCode(parsed.data);
|
|
994
|
+
break;
|
|
995
|
+
|
|
996
|
+
case 'search_files':
|
|
997
|
+
result = await searchFiles(parsed.data);
|
|
998
|
+
break;
|
|
999
|
+
|
|
1000
|
+
case 'status':
|
|
1001
|
+
result = await getStatus(parsed.data);
|
|
1002
|
+
break;
|
|
1003
|
+
|
|
1004
|
+
case 'symbol':
|
|
1005
|
+
result = await extractSymbols(parsed.data);
|
|
1006
|
+
break;
|
|
1007
|
+
|
|
1008
|
+
case 'check':
|
|
1009
|
+
const checkStatus = await ensureReady();
|
|
1010
|
+
result = {
|
|
1011
|
+
success: checkStatus.ready,
|
|
1012
|
+
ready: checkStatus.ready,
|
|
1013
|
+
version: checkStatus.version,
|
|
1014
|
+
error: checkStatus.error,
|
|
1015
|
+
};
|
|
1016
|
+
break;
|
|
1017
|
+
|
|
1018
|
+
case 'update':
|
|
1019
|
+
// Update is an alias for init (incremental update)
|
|
1020
|
+
result = await initIndex(parsed.data);
|
|
1021
|
+
break;
|
|
1022
|
+
|
|
1023
|
+
case 'bootstrap':
|
|
1024
|
+
const bootstrapResult = await bootstrapVenv();
|
|
1025
|
+
result = {
|
|
1026
|
+
success: bootstrapResult.success,
|
|
1027
|
+
message: bootstrapResult.message,
|
|
1028
|
+
error: bootstrapResult.error,
|
|
1029
|
+
};
|
|
1030
|
+
break;
|
|
1031
|
+
|
|
1032
|
+
default:
|
|
1033
|
+
throw new Error(
|
|
1034
|
+
`Unknown action: ${action}. Valid actions: init, search, search_files, status, symbol, check, update, bootstrap`
|
|
1035
|
+
);
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
return result.success ? { success: true, result } : { success: false, error: result.error };
|
|
1039
|
+
} catch (error) {
|
|
1040
|
+
return { success: false, error: (error as Error).message };
|
|
1041
|
+
}
|
|
1042
|
+
}
|
|
1043
|
+
|
|
1044
|
+
/**
|
|
1045
|
+
* Uninstall CodexLens by removing the venv directory
|
|
1046
|
+
* @returns Uninstall result
|
|
1047
|
+
*/
|
|
1048
|
+
async function uninstallCodexLens(): Promise<BootstrapResult> {
|
|
1049
|
+
try {
|
|
1050
|
+
// Check if venv exists
|
|
1051
|
+
if (!existsSync(CODEXLENS_VENV)) {
|
|
1052
|
+
return { success: false, error: 'CodexLens not installed (venv not found)' };
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
console.log('[CodexLens] Uninstalling CodexLens...');
|
|
1056
|
+
console.log(`[CodexLens] Removing directory: ${CODEXLENS_DATA_DIR}`);
|
|
1057
|
+
|
|
1058
|
+
// Remove the entire .codexlens directory
|
|
1059
|
+
const fs = await import('fs');
|
|
1060
|
+
fs.rmSync(CODEXLENS_DATA_DIR, { recursive: true, force: true });
|
|
1061
|
+
|
|
1062
|
+
// Reset bootstrap cache
|
|
1063
|
+
bootstrapChecked = false;
|
|
1064
|
+
bootstrapReady = false;
|
|
1065
|
+
|
|
1066
|
+
console.log('[CodexLens] CodexLens uninstalled successfully');
|
|
1067
|
+
return { success: true, message: 'CodexLens uninstalled successfully' };
|
|
1068
|
+
} catch (err) {
|
|
1069
|
+
return { success: false, error: `Failed to uninstall CodexLens: ${(err as Error).message}` };
|
|
1070
|
+
}
|
|
1071
|
+
}
|
|
1072
|
+
|
|
1073
|
+
/**
|
|
1074
|
+
* Cancel the currently running indexing process
|
|
1075
|
+
* @returns Result indicating if cancellation was successful
|
|
1076
|
+
*/
|
|
1077
|
+
function cancelIndexing(): { success: boolean; message?: string; error?: string } {
|
|
1078
|
+
if (!currentIndexingProcess) {
|
|
1079
|
+
return { success: false, error: 'No indexing process is currently running' };
|
|
1080
|
+
}
|
|
1081
|
+
|
|
1082
|
+
if (currentIndexingAborted) {
|
|
1083
|
+
return { success: false, error: 'Indexing process is already being cancelled' };
|
|
1084
|
+
}
|
|
1085
|
+
|
|
1086
|
+
try {
|
|
1087
|
+
currentIndexingAborted = true;
|
|
1088
|
+
|
|
1089
|
+
// Send SIGTERM first for graceful shutdown
|
|
1090
|
+
if (process.platform === 'win32') {
|
|
1091
|
+
// On Windows, use taskkill to kill the process tree
|
|
1092
|
+
const { execSync } = require('child_process');
|
|
1093
|
+
try {
|
|
1094
|
+
execSync(`taskkill /pid ${currentIndexingProcess.pid} /T /F`, { stdio: 'ignore' });
|
|
1095
|
+
} catch {
|
|
1096
|
+
// Process may have already exited
|
|
1097
|
+
}
|
|
1098
|
+
} else {
|
|
1099
|
+
// On Unix, send SIGTERM
|
|
1100
|
+
currentIndexingProcess.kill('SIGTERM');
|
|
1101
|
+
|
|
1102
|
+
// Force kill after 3 seconds if still running
|
|
1103
|
+
setTimeout(() => {
|
|
1104
|
+
if (currentIndexingProcess) {
|
|
1105
|
+
currentIndexingProcess.kill('SIGKILL');
|
|
1106
|
+
}
|
|
1107
|
+
}, 3000);
|
|
1108
|
+
}
|
|
1109
|
+
|
|
1110
|
+
console.log('[CodexLens] Indexing process cancelled');
|
|
1111
|
+
return { success: true, message: 'Indexing cancelled successfully' };
|
|
1112
|
+
} catch (err) {
|
|
1113
|
+
return { success: false, error: `Failed to cancel indexing: ${(err as Error).message}` };
|
|
1114
|
+
}
|
|
1115
|
+
}
|
|
1116
|
+
|
|
1117
|
+
/**
|
|
1118
|
+
* Check if an indexing process is currently running
|
|
1119
|
+
* @returns True if indexing is in progress
|
|
1120
|
+
*/
|
|
1121
|
+
function isIndexingInProgress(): boolean {
|
|
1122
|
+
return currentIndexingProcess !== null && !currentIndexingAborted;
|
|
1123
|
+
}
|
|
1124
|
+
|
|
1125
|
+
// Export types
|
|
1126
|
+
export type { ProgressInfo, ExecuteOptions };
|
|
1127
|
+
|
|
1128
|
+
// Export for direct usage
|
|
1129
|
+
export { ensureReady, executeCodexLens, checkVenvStatus, bootstrapVenv, checkSemanticStatus, installSemantic, uninstallCodexLens, cancelIndexing, isIndexingInProgress };
|
|
1130
|
+
|
|
1131
|
+
// Backward-compatible export for tests
|
|
1132
|
+
export const codexLensTool = {
|
|
1133
|
+
name: schema.name,
|
|
1134
|
+
description: schema.description,
|
|
1135
|
+
parameters: schema.inputSchema,
|
|
1136
|
+
execute: async (params: Record<string, unknown>) => {
|
|
1137
|
+
const result = await handler(params);
|
|
1138
|
+
// Return the result directly - tests expect {success: boolean, ...} format
|
|
1139
|
+
return result.success ? result.result : { success: false, error: result.error };
|
|
1140
|
+
}
|
|
1141
|
+
};
|