claude-code-workflow 6.1.4 → 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 +32 -34
- 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 -462
- 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 -373
- 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 -1171
- 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 -685
- 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,1219 @@
|
|
|
1
|
+
// MCP Manager Component
|
|
2
|
+
// Manages MCP server configuration from multiple sources:
|
|
3
|
+
// - Enterprise: managed-mcp.json (highest priority)
|
|
4
|
+
// - User: ~/.claude.json mcpServers
|
|
5
|
+
// - Project: .mcp.json in project root
|
|
6
|
+
// - Local: ~/.claude.json projects[path].mcpServers
|
|
7
|
+
|
|
8
|
+
// ========== MCP State ==========
|
|
9
|
+
let mcpConfig = null;
|
|
10
|
+
let mcpAllProjects = {};
|
|
11
|
+
let mcpGlobalServers = {};
|
|
12
|
+
let mcpUserServers = {};
|
|
13
|
+
let mcpEnterpriseServers = {};
|
|
14
|
+
let mcpCurrentProjectServers = {};
|
|
15
|
+
let mcpConfigSources = [];
|
|
16
|
+
let mcpCreateMode = 'form'; // 'form' or 'json'
|
|
17
|
+
|
|
18
|
+
// ========== CLI Toggle State (Claude / Codex) ==========
|
|
19
|
+
let currentCliMode = 'claude'; // 'claude' or 'codex'
|
|
20
|
+
let codexMcpConfig = null;
|
|
21
|
+
let codexMcpServers = {};
|
|
22
|
+
|
|
23
|
+
// ========== Project Config Type Preference ==========
|
|
24
|
+
// 'mcp' = .mcp.json (project root file, recommended)
|
|
25
|
+
// 'claude' = claude.json projects[path].mcpServers (shared config)
|
|
26
|
+
let preferredProjectConfigType = 'mcp';
|
|
27
|
+
|
|
28
|
+
// ========== Initialization ==========
|
|
29
|
+
function initMcpManager() {
|
|
30
|
+
// Initialize MCP navigation
|
|
31
|
+
document.querySelectorAll('.nav-item[data-view="mcp-manager"]').forEach(item => {
|
|
32
|
+
item.addEventListener('click', () => {
|
|
33
|
+
setActiveNavItem(item);
|
|
34
|
+
currentView = 'mcp-manager';
|
|
35
|
+
currentFilter = null;
|
|
36
|
+
currentLiteType = null;
|
|
37
|
+
currentSessionDetailKey = null;
|
|
38
|
+
updateContentTitle();
|
|
39
|
+
renderMcpManager();
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// ========== Data Loading ==========
|
|
45
|
+
async function loadMcpConfig() {
|
|
46
|
+
try {
|
|
47
|
+
const response = await fetch('/api/mcp-config');
|
|
48
|
+
if (!response.ok) throw new Error('Failed to load MCP config');
|
|
49
|
+
const data = await response.json();
|
|
50
|
+
mcpConfig = data;
|
|
51
|
+
mcpAllProjects = data.projects || {};
|
|
52
|
+
mcpGlobalServers = data.globalServers || {};
|
|
53
|
+
mcpUserServers = data.userServers || {};
|
|
54
|
+
mcpEnterpriseServers = data.enterpriseServers || {};
|
|
55
|
+
mcpConfigSources = data.configSources || [];
|
|
56
|
+
|
|
57
|
+
// Load Codex MCP config
|
|
58
|
+
if (data.codex) {
|
|
59
|
+
codexMcpConfig = data.codex;
|
|
60
|
+
codexMcpServers = data.codex.servers || {};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Get current project servers
|
|
64
|
+
const currentPath = projectPath.replace(/\//g, '\\');
|
|
65
|
+
mcpCurrentProjectServers = mcpAllProjects[currentPath]?.mcpServers || {};
|
|
66
|
+
|
|
67
|
+
// Update badge count
|
|
68
|
+
updateMcpBadge();
|
|
69
|
+
|
|
70
|
+
return data;
|
|
71
|
+
} catch (err) {
|
|
72
|
+
console.error('Failed to load MCP config:', err);
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// ========== CLI Mode Toggle ==========
|
|
78
|
+
function setCliMode(mode) {
|
|
79
|
+
currentCliMode = mode;
|
|
80
|
+
renderMcpManager();
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function getCliMode() {
|
|
84
|
+
return currentCliMode;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// ========== Codex MCP Functions ==========
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Add MCP server to Codex config.toml
|
|
91
|
+
*/
|
|
92
|
+
async function addCodexMcpServer(serverName, serverConfig) {
|
|
93
|
+
try {
|
|
94
|
+
const response = await fetch('/api/codex-mcp-add', {
|
|
95
|
+
method: 'POST',
|
|
96
|
+
headers: { 'Content-Type': 'application/json' },
|
|
97
|
+
body: JSON.stringify({
|
|
98
|
+
serverName: serverName,
|
|
99
|
+
serverConfig: serverConfig
|
|
100
|
+
})
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
if (!response.ok) throw new Error('Failed to add Codex MCP server');
|
|
104
|
+
|
|
105
|
+
const result = await response.json();
|
|
106
|
+
if (result.success) {
|
|
107
|
+
await loadMcpConfig();
|
|
108
|
+
renderMcpManager();
|
|
109
|
+
showRefreshToast(t('mcp.codex.serverAdded', { name: serverName }), 'success');
|
|
110
|
+
} else {
|
|
111
|
+
showRefreshToast(result.error || t('mcp.codex.addFailed'), 'error');
|
|
112
|
+
}
|
|
113
|
+
return result;
|
|
114
|
+
} catch (err) {
|
|
115
|
+
console.error('Failed to add Codex MCP server:', err);
|
|
116
|
+
showRefreshToast(t('mcp.codex.addFailed') + ': ' + err.message, 'error');
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Remove MCP server from Codex config.toml
|
|
123
|
+
*/
|
|
124
|
+
async function removeCodexMcpServer(serverName) {
|
|
125
|
+
try {
|
|
126
|
+
const response = await fetch('/api/codex-mcp-remove', {
|
|
127
|
+
method: 'POST',
|
|
128
|
+
headers: { 'Content-Type': 'application/json' },
|
|
129
|
+
body: JSON.stringify({ serverName })
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
if (!response.ok) throw new Error('Failed to remove Codex MCP server');
|
|
133
|
+
|
|
134
|
+
const result = await response.json();
|
|
135
|
+
if (result.success) {
|
|
136
|
+
await loadMcpConfig();
|
|
137
|
+
renderMcpManager();
|
|
138
|
+
showRefreshToast(t('mcp.codex.serverRemoved', { name: serverName }), 'success');
|
|
139
|
+
} else {
|
|
140
|
+
showRefreshToast(result.error || t('mcp.codex.removeFailed'), 'error');
|
|
141
|
+
}
|
|
142
|
+
return result;
|
|
143
|
+
} catch (err) {
|
|
144
|
+
console.error('Failed to remove Codex MCP server:', err);
|
|
145
|
+
showRefreshToast(t('mcp.codex.removeFailed') + ': ' + err.message, 'error');
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Toggle Codex MCP server enabled state
|
|
152
|
+
*/
|
|
153
|
+
async function toggleCodexMcpServer(serverName, enabled) {
|
|
154
|
+
try {
|
|
155
|
+
const response = await fetch('/api/codex-mcp-toggle', {
|
|
156
|
+
method: 'POST',
|
|
157
|
+
headers: { 'Content-Type': 'application/json' },
|
|
158
|
+
body: JSON.stringify({ serverName, enabled })
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
if (!response.ok) throw new Error('Failed to toggle Codex MCP server');
|
|
162
|
+
|
|
163
|
+
const result = await response.json();
|
|
164
|
+
if (result.success) {
|
|
165
|
+
await loadMcpConfig();
|
|
166
|
+
renderMcpManager();
|
|
167
|
+
showRefreshToast(t('mcp.codex.serverToggled', { name: serverName, state: enabled ? 'enabled' : 'disabled' }), 'success');
|
|
168
|
+
}
|
|
169
|
+
return result;
|
|
170
|
+
} catch (err) {
|
|
171
|
+
console.error('Failed to toggle Codex MCP server:', err);
|
|
172
|
+
showRefreshToast(t('mcp.codex.toggleFailed') + ': ' + err.message, 'error');
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Copy Claude MCP server to Codex
|
|
179
|
+
*/
|
|
180
|
+
async function copyClaudeServerToCodex(serverName, serverConfig) {
|
|
181
|
+
return await addCodexMcpServer(serverName, serverConfig);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Copy Codex MCP server to Claude (global)
|
|
186
|
+
*/
|
|
187
|
+
async function copyCodexServerToClaude(serverName, serverConfig) {
|
|
188
|
+
// Convert Codex format to Claude format
|
|
189
|
+
const claudeConfig = {
|
|
190
|
+
command: serverConfig.command,
|
|
191
|
+
args: serverConfig.args || [],
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
if (serverConfig.env) {
|
|
195
|
+
claudeConfig.env = serverConfig.env;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// If it's an HTTP server
|
|
199
|
+
if (serverConfig.url) {
|
|
200
|
+
claudeConfig.url = serverConfig.url;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
return await addGlobalMcpServer(serverName, claudeConfig);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
async function toggleMcpServer(serverName, enable) {
|
|
207
|
+
try {
|
|
208
|
+
const response = await fetch('/api/mcp-toggle', {
|
|
209
|
+
method: 'POST',
|
|
210
|
+
headers: { 'Content-Type': 'application/json' },
|
|
211
|
+
body: JSON.stringify({
|
|
212
|
+
projectPath: projectPath,
|
|
213
|
+
serverName: serverName,
|
|
214
|
+
enable: enable
|
|
215
|
+
})
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
if (!response.ok) throw new Error('Failed to toggle MCP server');
|
|
219
|
+
|
|
220
|
+
const result = await response.json();
|
|
221
|
+
if (result.success) {
|
|
222
|
+
// Reload config and re-render
|
|
223
|
+
await loadMcpConfig();
|
|
224
|
+
renderMcpManager();
|
|
225
|
+
showRefreshToast(`MCP server "${serverName}" ${enable ? 'enabled' : 'disabled'}`, 'success');
|
|
226
|
+
}
|
|
227
|
+
return result;
|
|
228
|
+
} catch (err) {
|
|
229
|
+
console.error('Failed to toggle MCP server:', err);
|
|
230
|
+
showRefreshToast(`Failed to toggle MCP server: ${err.message}`, 'error');
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
async function copyMcpServerToProject(serverName, serverConfig, configType = null) {
|
|
236
|
+
try {
|
|
237
|
+
// If configType not specified, use the preferred config type (toggle setting)
|
|
238
|
+
if (!configType) {
|
|
239
|
+
configType = preferredProjectConfigType;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
const response = await fetch('/api/mcp-copy-server', {
|
|
243
|
+
method: 'POST',
|
|
244
|
+
headers: { 'Content-Type': 'application/json' },
|
|
245
|
+
body: JSON.stringify({
|
|
246
|
+
projectPath: projectPath,
|
|
247
|
+
serverName: serverName,
|
|
248
|
+
serverConfig: serverConfig,
|
|
249
|
+
configType: configType // 'claude' for .claude.json, 'mcp' for .mcp.json
|
|
250
|
+
})
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
if (!response.ok) throw new Error('Failed to copy MCP server');
|
|
254
|
+
|
|
255
|
+
const result = await response.json();
|
|
256
|
+
if (result.success) {
|
|
257
|
+
await loadMcpConfig();
|
|
258
|
+
renderMcpManager();
|
|
259
|
+
const location = configType === 'mcp' ? '.mcp.json' : '.claude.json';
|
|
260
|
+
showRefreshToast(`MCP server "${serverName}" added to project (${location})`, 'success');
|
|
261
|
+
}
|
|
262
|
+
return result;
|
|
263
|
+
} catch (err) {
|
|
264
|
+
console.error('Failed to copy MCP server:', err);
|
|
265
|
+
showRefreshToast(`Failed to add MCP server: ${err.message}`, 'error');
|
|
266
|
+
return null;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// Show dialog to let user choose config type
|
|
271
|
+
function showConfigTypeDialog() {
|
|
272
|
+
return new Promise((resolve) => {
|
|
273
|
+
const dialog = document.createElement('div');
|
|
274
|
+
dialog.className = 'fixed inset-0 bg-black/50 flex items-center justify-center z-50';
|
|
275
|
+
dialog.innerHTML = `
|
|
276
|
+
<div class="bg-card border border-border rounded-lg shadow-lg p-6 max-w-md w-full mx-4">
|
|
277
|
+
<h3 class="text-lg font-semibold mb-4">${t('mcp.chooseInstallLocation')}</h3>
|
|
278
|
+
<div class="space-y-3 mb-6">
|
|
279
|
+
<button class="config-type-option w-full text-left px-4 py-3 border border-border rounded-lg hover:bg-accent hover:border-primary transition-all" data-type="claude">
|
|
280
|
+
<div class="font-medium">${t('mcp.installToClaudeJson')}</div>
|
|
281
|
+
<div class="text-sm text-muted-foreground mt-1">${t('mcp.claudeJsonDesc')}</div>
|
|
282
|
+
</button>
|
|
283
|
+
<button class="config-type-option w-full text-left px-4 py-3 border border-border rounded-lg hover:bg-accent hover:border-primary transition-all" data-type="mcp">
|
|
284
|
+
<div class="font-medium">${t('mcp.installToMcpJson')}</div>
|
|
285
|
+
<div class="text-sm text-muted-foreground mt-1">${t('mcp.mcpJsonDesc')}</div>
|
|
286
|
+
</button>
|
|
287
|
+
</div>
|
|
288
|
+
<button class="cancel-btn w-full px-4 py-2 border border-border rounded-lg hover:bg-accent transition-colors">${t('common.cancel')}</button>
|
|
289
|
+
</div>
|
|
290
|
+
`;
|
|
291
|
+
document.body.appendChild(dialog);
|
|
292
|
+
|
|
293
|
+
const options = dialog.querySelectorAll('.config-type-option');
|
|
294
|
+
options.forEach(btn => {
|
|
295
|
+
btn.addEventListener('click', () => {
|
|
296
|
+
resolve(btn.dataset.type);
|
|
297
|
+
document.body.removeChild(dialog);
|
|
298
|
+
});
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
const cancelBtn = dialog.querySelector('.cancel-btn');
|
|
302
|
+
cancelBtn.addEventListener('click', () => {
|
|
303
|
+
resolve(null);
|
|
304
|
+
document.body.removeChild(dialog);
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
// Close on backdrop click
|
|
308
|
+
dialog.addEventListener('click', (e) => {
|
|
309
|
+
if (e.target === dialog) {
|
|
310
|
+
resolve(null);
|
|
311
|
+
document.body.removeChild(dialog);
|
|
312
|
+
}
|
|
313
|
+
});
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
async function removeMcpServerFromProject(serverName) {
|
|
318
|
+
try {
|
|
319
|
+
const response = await fetch('/api/mcp-remove-server', {
|
|
320
|
+
method: 'POST',
|
|
321
|
+
headers: { 'Content-Type': 'application/json' },
|
|
322
|
+
body: JSON.stringify({
|
|
323
|
+
projectPath: projectPath,
|
|
324
|
+
serverName: serverName
|
|
325
|
+
})
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
if (!response.ok) throw new Error('Failed to remove MCP server');
|
|
329
|
+
|
|
330
|
+
const result = await response.json();
|
|
331
|
+
if (result.success) {
|
|
332
|
+
await loadMcpConfig();
|
|
333
|
+
renderMcpManager();
|
|
334
|
+
showRefreshToast(`MCP server "${serverName}" removed from project`, 'success');
|
|
335
|
+
}
|
|
336
|
+
return result;
|
|
337
|
+
} catch (err) {
|
|
338
|
+
console.error('Failed to remove MCP server:', err);
|
|
339
|
+
showRefreshToast(`Failed to remove MCP server: ${err.message}`, 'error');
|
|
340
|
+
return null;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
async function addGlobalMcpServer(serverName, serverConfig) {
|
|
345
|
+
try {
|
|
346
|
+
const response = await fetch('/api/mcp-add-global-server', {
|
|
347
|
+
method: 'POST',
|
|
348
|
+
headers: { 'Content-Type': 'application/json' },
|
|
349
|
+
body: JSON.stringify({
|
|
350
|
+
serverName: serverName,
|
|
351
|
+
serverConfig: serverConfig
|
|
352
|
+
})
|
|
353
|
+
});
|
|
354
|
+
|
|
355
|
+
if (!response.ok) throw new Error('Failed to add global MCP server');
|
|
356
|
+
|
|
357
|
+
const result = await response.json();
|
|
358
|
+
if (result.success) {
|
|
359
|
+
await loadMcpConfig();
|
|
360
|
+
renderMcpManager();
|
|
361
|
+
showRefreshToast(`Global MCP server "${serverName}" added`, 'success');
|
|
362
|
+
}
|
|
363
|
+
return result;
|
|
364
|
+
} catch (err) {
|
|
365
|
+
console.error('Failed to add global MCP server:', err);
|
|
366
|
+
showRefreshToast(`Failed to add global MCP server: ${err.message}`, 'error');
|
|
367
|
+
return null;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
async function removeGlobalMcpServer(serverName) {
|
|
372
|
+
try {
|
|
373
|
+
const response = await fetch('/api/mcp-remove-global-server', {
|
|
374
|
+
method: 'POST',
|
|
375
|
+
headers: { 'Content-Type': 'application/json' },
|
|
376
|
+
body: JSON.stringify({
|
|
377
|
+
serverName: serverName
|
|
378
|
+
})
|
|
379
|
+
});
|
|
380
|
+
|
|
381
|
+
if (!response.ok) throw new Error('Failed to remove global MCP server');
|
|
382
|
+
|
|
383
|
+
const result = await response.json();
|
|
384
|
+
if (result.success) {
|
|
385
|
+
await loadMcpConfig();
|
|
386
|
+
renderMcpManager();
|
|
387
|
+
showRefreshToast(`Global MCP server "${serverName}" removed`, 'success');
|
|
388
|
+
}
|
|
389
|
+
return result;
|
|
390
|
+
} catch (err) {
|
|
391
|
+
console.error('Failed to remove global MCP server:', err);
|
|
392
|
+
showRefreshToast(`Failed to remove global MCP server: ${err.message}`, 'error');
|
|
393
|
+
return null;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
// ========== Badge Update ==========
|
|
398
|
+
function updateMcpBadge() {
|
|
399
|
+
const badge = document.getElementById('badgeMcpServers');
|
|
400
|
+
if (badge) {
|
|
401
|
+
// Try both path formats to find the matching key
|
|
402
|
+
const forwardSlashPath = projectPath.replace(/\\/g, '/');
|
|
403
|
+
const backSlashPath = projectPath.replace(/\//g, '\\');
|
|
404
|
+
|
|
405
|
+
// Find matching project data using either path format
|
|
406
|
+
const projectData = mcpAllProjects[forwardSlashPath] || mcpAllProjects[backSlashPath] || mcpAllProjects[projectPath];
|
|
407
|
+
const servers = projectData?.mcpServers || {};
|
|
408
|
+
const disabledServers = projectData?.disabledMcpServers || [];
|
|
409
|
+
|
|
410
|
+
const totalServers = Object.keys(servers).length;
|
|
411
|
+
const enabledServers = totalServers - disabledServers.length;
|
|
412
|
+
|
|
413
|
+
console.log('[MCP Badge]', { projectPath, forwardSlashPath, backSlashPath, totalServers, enabledServers });
|
|
414
|
+
badge.textContent = `${enabledServers}/${totalServers}`;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
// ========== Helpers ==========
|
|
419
|
+
|
|
420
|
+
/**
|
|
421
|
+
* Generate a unique key for MCP server config comparison
|
|
422
|
+
* Used to distinguish servers with same name but different configurations
|
|
423
|
+
*/
|
|
424
|
+
function getMcpConfigHash(config) {
|
|
425
|
+
const cmd = config.command || '';
|
|
426
|
+
const args = (config.args || []).join('|');
|
|
427
|
+
const envKeys = Object.keys(config.env || {}).sort().join(',');
|
|
428
|
+
return `${cmd}::${args}::${envKeys}`;
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
/**
|
|
432
|
+
* Get all available MCP servers from all sources
|
|
433
|
+
* Supports servers with same name but different configurations from different projects
|
|
434
|
+
*/
|
|
435
|
+
function getAllAvailableMcpServers() {
|
|
436
|
+
const allServers = {};
|
|
437
|
+
const configHashes = {}; // Track unique configs per server name
|
|
438
|
+
|
|
439
|
+
// Collect global servers first
|
|
440
|
+
for (const [name, serverConfig] of Object.entries(mcpGlobalServers)) {
|
|
441
|
+
const hash = getMcpConfigHash(serverConfig);
|
|
442
|
+
allServers[name] = {
|
|
443
|
+
config: serverConfig,
|
|
444
|
+
usedIn: [],
|
|
445
|
+
isGlobal: true,
|
|
446
|
+
configHash: hash
|
|
447
|
+
};
|
|
448
|
+
configHashes[name] = { [hash]: name };
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
// Collect servers from all projects - handle same name with different configs
|
|
452
|
+
for (const [path, config] of Object.entries(mcpAllProjects)) {
|
|
453
|
+
const servers = config.mcpServers || {};
|
|
454
|
+
for (const [name, serverConfig] of Object.entries(servers)) {
|
|
455
|
+
const hash = getMcpConfigHash(serverConfig);
|
|
456
|
+
|
|
457
|
+
if (!configHashes[name]) {
|
|
458
|
+
// First occurrence of this server name
|
|
459
|
+
configHashes[name] = {};
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
if (!configHashes[name][hash]) {
|
|
463
|
+
// New unique configuration for this server name
|
|
464
|
+
// Use suffixed key if name already exists with different config
|
|
465
|
+
let serverKey = name;
|
|
466
|
+
if (allServers[name] && allServers[name].configHash !== hash) {
|
|
467
|
+
// Generate unique key: name@project-folder
|
|
468
|
+
const projectFolder = path.split('\\').pop() || path.split('/').pop() || 'unknown';
|
|
469
|
+
serverKey = `${name}@${projectFolder}`;
|
|
470
|
+
// Avoid collisions
|
|
471
|
+
let suffix = 1;
|
|
472
|
+
while (allServers[serverKey]) {
|
|
473
|
+
serverKey = `${name}@${projectFolder}-${suffix++}`;
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
configHashes[name][hash] = serverKey;
|
|
478
|
+
|
|
479
|
+
if (!allServers[serverKey]) {
|
|
480
|
+
allServers[serverKey] = {
|
|
481
|
+
config: serverConfig,
|
|
482
|
+
usedIn: [],
|
|
483
|
+
isGlobal: false,
|
|
484
|
+
configHash: hash,
|
|
485
|
+
originalName: name, // Store original name for installation
|
|
486
|
+
sourceProject: path // Store source project for reference
|
|
487
|
+
};
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
// Track which projects use this config
|
|
492
|
+
const serverKey = configHashes[name][hash];
|
|
493
|
+
if (allServers[serverKey]) {
|
|
494
|
+
allServers[serverKey].usedIn.push(path);
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
return allServers;
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
function isServerEnabledInCurrentProject(serverName) {
|
|
503
|
+
const currentPath = projectPath.replace(/\//g, '\\');
|
|
504
|
+
const projectData = mcpAllProjects[currentPath];
|
|
505
|
+
if (!projectData) return false;
|
|
506
|
+
|
|
507
|
+
const disabledServers = projectData.disabledMcpServers || [];
|
|
508
|
+
return !disabledServers.includes(serverName);
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
function isServerInCurrentProject(serverName) {
|
|
512
|
+
const currentPath = projectPath.replace(/\//g, '\\');
|
|
513
|
+
const projectData = mcpAllProjects[currentPath];
|
|
514
|
+
if (!projectData) return false;
|
|
515
|
+
|
|
516
|
+
const servers = projectData.mcpServers || {};
|
|
517
|
+
return serverName in servers;
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
// Generate install command for MCP server
|
|
521
|
+
function generateMcpInstallCommand(serverName, serverConfig, scope = 'project') {
|
|
522
|
+
const command = serverConfig.command || '';
|
|
523
|
+
const args = serverConfig.args || [];
|
|
524
|
+
|
|
525
|
+
// Check if it's an npx-based package
|
|
526
|
+
if (command === 'npx' && args.length > 0) {
|
|
527
|
+
const packageName = args[0];
|
|
528
|
+
// Check if it's a scoped package or standard package
|
|
529
|
+
if (packageName.startsWith('@') || packageName.includes('/')) {
|
|
530
|
+
const scopeFlag = scope === 'global' ? ' --global' : '';
|
|
531
|
+
return `claude mcp add ${packageName}${scopeFlag}`;
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
// For custom servers, return JSON configuration
|
|
536
|
+
const scopeFlag = scope === 'global' ? ' --global' : '';
|
|
537
|
+
return `claude mcp add ${serverName}${scopeFlag}`;
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
// Copy install command to clipboard
|
|
541
|
+
async function copyMcpInstallCommand(serverName, serverConfig, scope = 'project') {
|
|
542
|
+
try {
|
|
543
|
+
const command = generateMcpInstallCommand(serverName, serverConfig, scope);
|
|
544
|
+
await navigator.clipboard.writeText(command);
|
|
545
|
+
showRefreshToast(t('mcp.installCmdCopied'), 'success');
|
|
546
|
+
} catch (error) {
|
|
547
|
+
console.error('Failed to copy install command:', error);
|
|
548
|
+
showRefreshToast(t('mcp.installCmdFailed'), 'error');
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
// ========== MCP Create Modal ==========
|
|
553
|
+
function openMcpCreateModal(scope = 'project') {
|
|
554
|
+
const modal = document.getElementById('mcpCreateModal');
|
|
555
|
+
if (modal) {
|
|
556
|
+
modal.classList.remove('hidden');
|
|
557
|
+
// Reset to form mode
|
|
558
|
+
mcpCreateMode = 'form';
|
|
559
|
+
switchMcpCreateTab('form');
|
|
560
|
+
// Clear form
|
|
561
|
+
document.getElementById('mcpServerName').value = '';
|
|
562
|
+
document.getElementById('mcpServerCommand').value = '';
|
|
563
|
+
document.getElementById('mcpServerArgs').value = '';
|
|
564
|
+
document.getElementById('mcpServerEnv').value = '';
|
|
565
|
+
// Clear JSON input
|
|
566
|
+
document.getElementById('mcpServerJson').value = '';
|
|
567
|
+
document.getElementById('mcpJsonPreview').classList.add('hidden');
|
|
568
|
+
// Set scope (global or project)
|
|
569
|
+
const scopeSelect = document.getElementById('mcpServerScope');
|
|
570
|
+
if (scopeSelect) {
|
|
571
|
+
scopeSelect.value = scope;
|
|
572
|
+
}
|
|
573
|
+
// Focus on name input
|
|
574
|
+
document.getElementById('mcpServerName').focus();
|
|
575
|
+
// Setup JSON input listener
|
|
576
|
+
setupMcpJsonListener();
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
function closeMcpCreateModal() {
|
|
581
|
+
const modal = document.getElementById('mcpCreateModal');
|
|
582
|
+
if (modal) {
|
|
583
|
+
modal.classList.add('hidden');
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
function switchMcpCreateTab(tab) {
|
|
588
|
+
mcpCreateMode = tab;
|
|
589
|
+
const formMode = document.getElementById('mcpFormMode');
|
|
590
|
+
const jsonMode = document.getElementById('mcpJsonMode');
|
|
591
|
+
const tabForm = document.getElementById('mcpTabForm');
|
|
592
|
+
const tabJson = document.getElementById('mcpTabJson');
|
|
593
|
+
|
|
594
|
+
if (tab === 'form') {
|
|
595
|
+
formMode.classList.remove('hidden');
|
|
596
|
+
jsonMode.classList.add('hidden');
|
|
597
|
+
tabForm.classList.add('active');
|
|
598
|
+
tabJson.classList.remove('active');
|
|
599
|
+
} else {
|
|
600
|
+
formMode.classList.add('hidden');
|
|
601
|
+
jsonMode.classList.remove('hidden');
|
|
602
|
+
tabForm.classList.remove('active');
|
|
603
|
+
tabJson.classList.add('active');
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
function setupMcpJsonListener() {
|
|
608
|
+
const jsonInput = document.getElementById('mcpServerJson');
|
|
609
|
+
if (jsonInput && !jsonInput.hasAttribute('data-listener-attached')) {
|
|
610
|
+
jsonInput.setAttribute('data-listener-attached', 'true');
|
|
611
|
+
jsonInput.addEventListener('input', () => {
|
|
612
|
+
updateMcpJsonPreview();
|
|
613
|
+
});
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
function parseMcpJsonConfig(jsonText) {
|
|
618
|
+
if (!jsonText.trim()) {
|
|
619
|
+
return { servers: {}, error: null };
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
try {
|
|
623
|
+
const parsed = JSON.parse(jsonText);
|
|
624
|
+
let servers = {};
|
|
625
|
+
|
|
626
|
+
// Support multiple formats:
|
|
627
|
+
// 1. {"servers": {...}} format (claude desktop style)
|
|
628
|
+
// 2. {"mcpServers": {...}} format (claude.json style)
|
|
629
|
+
// 3. {"serverName": {command, args}} format (direct server config)
|
|
630
|
+
// 4. {command, args} format (single server without name)
|
|
631
|
+
|
|
632
|
+
if (parsed.servers && typeof parsed.servers === 'object') {
|
|
633
|
+
servers = parsed.servers;
|
|
634
|
+
} else if (parsed.mcpServers && typeof parsed.mcpServers === 'object') {
|
|
635
|
+
servers = parsed.mcpServers;
|
|
636
|
+
} else if (parsed.command && typeof parsed.command === 'string') {
|
|
637
|
+
// Single server without name - will prompt for name
|
|
638
|
+
servers = { '__unnamed__': parsed };
|
|
639
|
+
} else {
|
|
640
|
+
// Check if all values are server configs (have 'command' property)
|
|
641
|
+
const isDirectServerConfig = Object.values(parsed).every(
|
|
642
|
+
v => v && typeof v === 'object' && v.command
|
|
643
|
+
);
|
|
644
|
+
if (isDirectServerConfig && Object.keys(parsed).length > 0) {
|
|
645
|
+
servers = parsed;
|
|
646
|
+
} else {
|
|
647
|
+
return { servers: {}, error: 'Invalid MCP server JSON format' };
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
// Validate each server config
|
|
652
|
+
for (const [name, config] of Object.entries(servers)) {
|
|
653
|
+
if (!config.command || typeof config.command !== 'string') {
|
|
654
|
+
return { servers: {}, error: `Server "${name}" missing required "command" field` };
|
|
655
|
+
}
|
|
656
|
+
if (config.args && !Array.isArray(config.args)) {
|
|
657
|
+
return { servers: {}, error: `Server "${name}" has invalid "args" (must be array)` };
|
|
658
|
+
}
|
|
659
|
+
if (config.env && typeof config.env !== 'object') {
|
|
660
|
+
return { servers: {}, error: `Server "${name}" has invalid "env" (must be object)` };
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
return { servers, error: null };
|
|
665
|
+
} catch (e) {
|
|
666
|
+
return { servers: {}, error: 'Invalid JSON: ' + e.message };
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
function updateMcpJsonPreview() {
|
|
671
|
+
const jsonInput = document.getElementById('mcpServerJson');
|
|
672
|
+
const previewContainer = document.getElementById('mcpJsonPreview');
|
|
673
|
+
const previewContent = document.getElementById('mcpJsonPreviewContent');
|
|
674
|
+
|
|
675
|
+
const jsonText = jsonInput.value;
|
|
676
|
+
const { servers, error } = parseMcpJsonConfig(jsonText);
|
|
677
|
+
|
|
678
|
+
if (!jsonText.trim()) {
|
|
679
|
+
previewContainer.classList.add('hidden');
|
|
680
|
+
return;
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
previewContainer.classList.remove('hidden');
|
|
684
|
+
|
|
685
|
+
if (error) {
|
|
686
|
+
previewContent.innerHTML = `<div class="text-destructive">${escapeHtml(error)}</div>`;
|
|
687
|
+
return;
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
const serverCount = Object.keys(servers).length;
|
|
691
|
+
if (serverCount === 0) {
|
|
692
|
+
previewContent.innerHTML = `<div class="text-muted-foreground">No servers found</div>`;
|
|
693
|
+
return;
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
const previewHtml = Object.entries(servers).map(([name, config]) => {
|
|
697
|
+
const displayName = name === '__unnamed__' ? '(will prompt for name)' : name;
|
|
698
|
+
const argsPreview = config.args ? config.args.slice(0, 2).join(' ') + (config.args.length > 2 ? '...' : '') : '';
|
|
699
|
+
return `
|
|
700
|
+
<div class="flex items-center gap-2 p-2 bg-background rounded">
|
|
701
|
+
<span class="text-success">+</span>
|
|
702
|
+
<span class="font-medium">${escapeHtml(displayName)}</span>
|
|
703
|
+
<span class="text-muted-foreground text-xs">${escapeHtml(config.command)} ${escapeHtml(argsPreview)}</span>
|
|
704
|
+
</div>
|
|
705
|
+
`;
|
|
706
|
+
}).join('');
|
|
707
|
+
|
|
708
|
+
previewContent.innerHTML = previewHtml;
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
async function submitMcpCreate() {
|
|
712
|
+
if (mcpCreateMode === 'json') {
|
|
713
|
+
await submitMcpCreateFromJson();
|
|
714
|
+
} else {
|
|
715
|
+
await submitMcpCreateFromForm();
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
async function submitMcpCreateFromForm() {
|
|
720
|
+
const name = document.getElementById('mcpServerName').value.trim();
|
|
721
|
+
const command = document.getElementById('mcpServerCommand').value.trim();
|
|
722
|
+
const argsText = document.getElementById('mcpServerArgs').value.trim();
|
|
723
|
+
const envText = document.getElementById('mcpServerEnv').value.trim();
|
|
724
|
+
const scopeSelect = document.getElementById('mcpServerScope');
|
|
725
|
+
const scope = scopeSelect ? scopeSelect.value : 'project';
|
|
726
|
+
|
|
727
|
+
// Validate required fields
|
|
728
|
+
if (!name) {
|
|
729
|
+
showRefreshToast('Server name is required', 'error');
|
|
730
|
+
document.getElementById('mcpServerName').focus();
|
|
731
|
+
return;
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
if (!command) {
|
|
735
|
+
showRefreshToast('Command is required', 'error');
|
|
736
|
+
document.getElementById('mcpServerCommand').focus();
|
|
737
|
+
return;
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
// Parse args (one per line)
|
|
741
|
+
const args = argsText ? argsText.split('\n').map(a => a.trim()).filter(a => a) : [];
|
|
742
|
+
|
|
743
|
+
// Parse env vars (KEY=VALUE per line)
|
|
744
|
+
const env = {};
|
|
745
|
+
if (envText) {
|
|
746
|
+
envText.split('\n').forEach(line => {
|
|
747
|
+
const trimmed = line.trim();
|
|
748
|
+
if (trimmed && trimmed.includes('=')) {
|
|
749
|
+
const eqIndex = trimmed.indexOf('=');
|
|
750
|
+
const key = trimmed.substring(0, eqIndex).trim();
|
|
751
|
+
const value = trimmed.substring(eqIndex + 1).trim();
|
|
752
|
+
if (key) {
|
|
753
|
+
env[key] = value;
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
});
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
// Build server config
|
|
760
|
+
const serverConfig = {
|
|
761
|
+
command: command,
|
|
762
|
+
args: args
|
|
763
|
+
};
|
|
764
|
+
|
|
765
|
+
// Only add env if there are values
|
|
766
|
+
if (Object.keys(env).length > 0) {
|
|
767
|
+
serverConfig.env = env;
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
await createMcpServerWithConfig(name, serverConfig, scope);
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
async function submitMcpCreateFromJson() {
|
|
774
|
+
const jsonText = document.getElementById('mcpServerJson').value.trim();
|
|
775
|
+
|
|
776
|
+
if (!jsonText) {
|
|
777
|
+
showRefreshToast('Please enter JSON configuration', 'error');
|
|
778
|
+
document.getElementById('mcpServerJson').focus();
|
|
779
|
+
return;
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
const { servers, error } = parseMcpJsonConfig(jsonText);
|
|
783
|
+
|
|
784
|
+
if (error) {
|
|
785
|
+
showRefreshToast(error, 'error');
|
|
786
|
+
return;
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
if (Object.keys(servers).length === 0) {
|
|
790
|
+
showRefreshToast('No valid servers found in JSON', 'error');
|
|
791
|
+
return;
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
// Handle unnamed server case
|
|
795
|
+
if (servers['__unnamed__']) {
|
|
796
|
+
const serverName = prompt('Enter a name for this MCP server:');
|
|
797
|
+
if (!serverName || !serverName.trim()) {
|
|
798
|
+
showRefreshToast('Server name is required', 'error');
|
|
799
|
+
return;
|
|
800
|
+
}
|
|
801
|
+
servers[serverName.trim()] = servers['__unnamed__'];
|
|
802
|
+
delete servers['__unnamed__'];
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
// Add all servers
|
|
806
|
+
let successCount = 0;
|
|
807
|
+
let failCount = 0;
|
|
808
|
+
const serverNames = Object.keys(servers);
|
|
809
|
+
|
|
810
|
+
for (const [name, config] of Object.entries(servers)) {
|
|
811
|
+
try {
|
|
812
|
+
const response = await fetch('/api/mcp-copy-server', {
|
|
813
|
+
method: 'POST',
|
|
814
|
+
headers: { 'Content-Type': 'application/json' },
|
|
815
|
+
body: JSON.stringify({
|
|
816
|
+
projectPath: projectPath,
|
|
817
|
+
serverName: name,
|
|
818
|
+
serverConfig: config
|
|
819
|
+
})
|
|
820
|
+
});
|
|
821
|
+
|
|
822
|
+
if (!response.ok) throw new Error('Failed to create MCP server');
|
|
823
|
+
|
|
824
|
+
const result = await response.json();
|
|
825
|
+
if (result.success) {
|
|
826
|
+
successCount++;
|
|
827
|
+
} else {
|
|
828
|
+
failCount++;
|
|
829
|
+
}
|
|
830
|
+
} catch (err) {
|
|
831
|
+
console.error(`Failed to create MCP server "${name}":`, err);
|
|
832
|
+
failCount++;
|
|
833
|
+
}
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
closeMcpCreateModal();
|
|
837
|
+
await loadMcpConfig();
|
|
838
|
+
renderMcpManager();
|
|
839
|
+
|
|
840
|
+
if (failCount === 0) {
|
|
841
|
+
showRefreshToast(`${successCount} MCP server${successCount > 1 ? 's' : ''} created successfully`, 'success');
|
|
842
|
+
} else if (successCount > 0) {
|
|
843
|
+
showRefreshToast(`${successCount} created, ${failCount} failed`, 'warning');
|
|
844
|
+
} else {
|
|
845
|
+
showRefreshToast('Failed to create MCP servers', 'error');
|
|
846
|
+
}
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
async function createMcpServerWithConfig(name, serverConfig, scope = 'project') {
|
|
850
|
+
// Submit to API
|
|
851
|
+
try {
|
|
852
|
+
let response;
|
|
853
|
+
let scopeLabel;
|
|
854
|
+
|
|
855
|
+
if (scope === 'codex') {
|
|
856
|
+
// Create in Codex config.toml
|
|
857
|
+
response = await fetch('/api/codex-mcp-add', {
|
|
858
|
+
method: 'POST',
|
|
859
|
+
headers: { 'Content-Type': 'application/json' },
|
|
860
|
+
body: JSON.stringify({
|
|
861
|
+
serverName: name,
|
|
862
|
+
serverConfig: serverConfig
|
|
863
|
+
})
|
|
864
|
+
});
|
|
865
|
+
scopeLabel = 'Codex';
|
|
866
|
+
} else if (scope === 'global') {
|
|
867
|
+
response = await fetch('/api/mcp-add-global-server', {
|
|
868
|
+
method: 'POST',
|
|
869
|
+
headers: { 'Content-Type': 'application/json' },
|
|
870
|
+
body: JSON.stringify({
|
|
871
|
+
serverName: name,
|
|
872
|
+
serverConfig: serverConfig
|
|
873
|
+
})
|
|
874
|
+
});
|
|
875
|
+
scopeLabel = 'global';
|
|
876
|
+
} else {
|
|
877
|
+
response = await fetch('/api/mcp-copy-server', {
|
|
878
|
+
method: 'POST',
|
|
879
|
+
headers: { 'Content-Type': 'application/json' },
|
|
880
|
+
body: JSON.stringify({
|
|
881
|
+
projectPath: projectPath,
|
|
882
|
+
serverName: name,
|
|
883
|
+
serverConfig: serverConfig
|
|
884
|
+
})
|
|
885
|
+
});
|
|
886
|
+
scopeLabel = 'project';
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
if (!response.ok) throw new Error('Failed to create MCP server');
|
|
890
|
+
|
|
891
|
+
const result = await response.json();
|
|
892
|
+
if (result.success) {
|
|
893
|
+
closeMcpCreateModal();
|
|
894
|
+
await loadMcpConfig();
|
|
895
|
+
renderMcpManager();
|
|
896
|
+
showRefreshToast(`MCP server "${name}" created in ${scopeLabel} scope`, 'success');
|
|
897
|
+
} else {
|
|
898
|
+
showRefreshToast(result.error || 'Failed to create MCP server', 'error');
|
|
899
|
+
}
|
|
900
|
+
} catch (err) {
|
|
901
|
+
console.error('Failed to create MCP server:', err);
|
|
902
|
+
showRefreshToast(`Failed to create MCP server: ${err.message}`, 'error');
|
|
903
|
+
}
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
// ========== CCW Tools MCP Installation ==========
|
|
907
|
+
|
|
908
|
+
// Get selected tools from checkboxes
|
|
909
|
+
function getSelectedCcwTools() {
|
|
910
|
+
const checkboxes = document.querySelectorAll('.ccw-tool-checkbox:checked');
|
|
911
|
+
return Array.from(checkboxes).map(cb => cb.dataset.tool);
|
|
912
|
+
}
|
|
913
|
+
|
|
914
|
+
// Select tools by category
|
|
915
|
+
function selectCcwTools(type) {
|
|
916
|
+
const checkboxes = document.querySelectorAll('.ccw-tool-checkbox');
|
|
917
|
+
const coreTools = ['write_file', 'edit_file', 'codex_lens', 'smart_search'];
|
|
918
|
+
|
|
919
|
+
checkboxes.forEach(cb => {
|
|
920
|
+
if (type === 'all') {
|
|
921
|
+
cb.checked = true;
|
|
922
|
+
} else if (type === 'none') {
|
|
923
|
+
cb.checked = false;
|
|
924
|
+
} else if (type === 'core') {
|
|
925
|
+
cb.checked = coreTools.includes(cb.dataset.tool);
|
|
926
|
+
}
|
|
927
|
+
});
|
|
928
|
+
}
|
|
929
|
+
|
|
930
|
+
// Get CCW path settings from input fields
|
|
931
|
+
function getCcwPathConfig() {
|
|
932
|
+
const projectRootInput = document.querySelector('.ccw-project-root-input');
|
|
933
|
+
const allowedDirsInput = document.querySelector('.ccw-allowed-dirs-input');
|
|
934
|
+
return {
|
|
935
|
+
projectRoot: projectRootInput?.value || '',
|
|
936
|
+
allowedDirs: allowedDirsInput?.value || ''
|
|
937
|
+
};
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
// Set CCW_PROJECT_ROOT to current project path
|
|
941
|
+
function setCcwProjectRootToCurrent() {
|
|
942
|
+
const input = document.querySelector('.ccw-project-root-input');
|
|
943
|
+
if (input && projectPath) {
|
|
944
|
+
input.value = projectPath;
|
|
945
|
+
}
|
|
946
|
+
}
|
|
947
|
+
|
|
948
|
+
// Build CCW Tools config with selected tools
|
|
949
|
+
// Uses isWindowsPlatform from state.js to generate platform-appropriate commands
|
|
950
|
+
function buildCcwToolsConfig(selectedTools, pathConfig = {}) {
|
|
951
|
+
const { projectRoot, allowedDirs } = pathConfig;
|
|
952
|
+
// Windows requires 'cmd /c' wrapper to execute npx
|
|
953
|
+
// Other platforms (macOS, Linux) can run npx directly
|
|
954
|
+
const config = isWindowsPlatform
|
|
955
|
+
? {
|
|
956
|
+
command: "cmd",
|
|
957
|
+
args: ["/c", "npx", "-y", "ccw-mcp"]
|
|
958
|
+
}
|
|
959
|
+
: {
|
|
960
|
+
command: "npx",
|
|
961
|
+
args: ["-y", "ccw-mcp"]
|
|
962
|
+
};
|
|
963
|
+
|
|
964
|
+
// Add env if not all tools or not default 4 core tools
|
|
965
|
+
const coreTools = ['write_file', 'edit_file', 'codex_lens', 'smart_search'];
|
|
966
|
+
const isDefault = selectedTools.length === 4 &&
|
|
967
|
+
coreTools.every(t => selectedTools.includes(t)) &&
|
|
968
|
+
selectedTools.every(t => coreTools.includes(t));
|
|
969
|
+
|
|
970
|
+
// Initialize env if needed
|
|
971
|
+
if (selectedTools.length === 15) {
|
|
972
|
+
config.env = { CCW_ENABLED_TOOLS: 'all' };
|
|
973
|
+
} else if (!isDefault && selectedTools.length > 0) {
|
|
974
|
+
config.env = { CCW_ENABLED_TOOLS: selectedTools.join(',') };
|
|
975
|
+
}
|
|
976
|
+
|
|
977
|
+
// Add path settings if provided
|
|
978
|
+
if (!config.env) {
|
|
979
|
+
config.env = {};
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
if (projectRoot && projectRoot.trim()) {
|
|
983
|
+
config.env.CCW_PROJECT_ROOT = projectRoot.trim();
|
|
984
|
+
}
|
|
985
|
+
if (allowedDirs && allowedDirs.trim()) {
|
|
986
|
+
config.env.CCW_ALLOWED_DIRS = allowedDirs.trim();
|
|
987
|
+
}
|
|
988
|
+
|
|
989
|
+
// Remove env object if empty
|
|
990
|
+
if (config.env && Object.keys(config.env).length === 0) {
|
|
991
|
+
delete config.env;
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
return config;
|
|
995
|
+
}
|
|
996
|
+
|
|
997
|
+
async function installCcwToolsMcp(scope = 'workspace') {
|
|
998
|
+
const selectedTools = getSelectedCcwTools();
|
|
999
|
+
|
|
1000
|
+
if (selectedTools.length === 0) {
|
|
1001
|
+
showRefreshToast('Please select at least one tool', 'warning');
|
|
1002
|
+
return;
|
|
1003
|
+
}
|
|
1004
|
+
|
|
1005
|
+
const pathConfig = getCcwPathConfig();
|
|
1006
|
+
const ccwToolsConfig = buildCcwToolsConfig(selectedTools, pathConfig);
|
|
1007
|
+
|
|
1008
|
+
try {
|
|
1009
|
+
const scopeLabel = scope === 'global' ? 'globally' : 'to workspace';
|
|
1010
|
+
showRefreshToast(`Installing CCW Tools MCP ${scopeLabel}...`, 'info');
|
|
1011
|
+
|
|
1012
|
+
if (scope === 'global') {
|
|
1013
|
+
// Install to global (~/.claude.json mcpServers)
|
|
1014
|
+
const response = await fetch('/api/mcp-add-global-server', {
|
|
1015
|
+
method: 'POST',
|
|
1016
|
+
headers: { 'Content-Type': 'application/json' },
|
|
1017
|
+
body: JSON.stringify({
|
|
1018
|
+
serverName: 'ccw-tools',
|
|
1019
|
+
serverConfig: ccwToolsConfig
|
|
1020
|
+
})
|
|
1021
|
+
});
|
|
1022
|
+
|
|
1023
|
+
if (!response.ok) throw new Error('Failed to install CCW Tools MCP globally');
|
|
1024
|
+
|
|
1025
|
+
const result = await response.json();
|
|
1026
|
+
if (result.success) {
|
|
1027
|
+
await loadMcpConfig();
|
|
1028
|
+
renderMcpManager();
|
|
1029
|
+
showRefreshToast(`CCW Tools installed globally (${selectedTools.length} tools)`, 'success');
|
|
1030
|
+
} else {
|
|
1031
|
+
showRefreshToast(result.error || 'Failed to install CCW Tools MCP globally', 'error');
|
|
1032
|
+
}
|
|
1033
|
+
} else {
|
|
1034
|
+
// Install to workspace (use preferredProjectConfigType)
|
|
1035
|
+
const configType = preferredProjectConfigType;
|
|
1036
|
+
const response = await fetch('/api/mcp-copy-server', {
|
|
1037
|
+
method: 'POST',
|
|
1038
|
+
headers: { 'Content-Type': 'application/json' },
|
|
1039
|
+
body: JSON.stringify({
|
|
1040
|
+
projectPath: projectPath,
|
|
1041
|
+
serverName: 'ccw-tools',
|
|
1042
|
+
serverConfig: ccwToolsConfig,
|
|
1043
|
+
configType: configType
|
|
1044
|
+
})
|
|
1045
|
+
});
|
|
1046
|
+
|
|
1047
|
+
if (!response.ok) throw new Error('Failed to install CCW Tools MCP to workspace');
|
|
1048
|
+
|
|
1049
|
+
const result = await response.json();
|
|
1050
|
+
if (result.success) {
|
|
1051
|
+
await loadMcpConfig();
|
|
1052
|
+
renderMcpManager();
|
|
1053
|
+
const location = configType === 'mcp' ? '.mcp.json' : 'claude.json';
|
|
1054
|
+
showRefreshToast(`CCW Tools installed to ${location} (${selectedTools.length} tools)`, 'success');
|
|
1055
|
+
} else {
|
|
1056
|
+
showRefreshToast(result.error || 'Failed to install CCW Tools MCP to workspace', 'error');
|
|
1057
|
+
}
|
|
1058
|
+
}
|
|
1059
|
+
} catch (err) {
|
|
1060
|
+
console.error('Failed to install CCW Tools MCP:', err);
|
|
1061
|
+
showRefreshToast(`Failed to install CCW Tools MCP: ${err.message}`, 'error');
|
|
1062
|
+
}
|
|
1063
|
+
}
|
|
1064
|
+
|
|
1065
|
+
async function updateCcwToolsMcp(scope = 'workspace') {
|
|
1066
|
+
const selectedTools = getSelectedCcwTools();
|
|
1067
|
+
|
|
1068
|
+
if (selectedTools.length === 0) {
|
|
1069
|
+
showRefreshToast('Please select at least one tool', 'warning');
|
|
1070
|
+
return;
|
|
1071
|
+
}
|
|
1072
|
+
|
|
1073
|
+
const pathConfig = getCcwPathConfig();
|
|
1074
|
+
const ccwToolsConfig = buildCcwToolsConfig(selectedTools, pathConfig);
|
|
1075
|
+
|
|
1076
|
+
try {
|
|
1077
|
+
const scopeLabel = scope === 'global' ? 'globally' : 'in workspace';
|
|
1078
|
+
showRefreshToast(`Updating CCW Tools MCP ${scopeLabel}...`, 'info');
|
|
1079
|
+
|
|
1080
|
+
if (scope === 'global') {
|
|
1081
|
+
// Update global (~/.claude.json mcpServers)
|
|
1082
|
+
const response = await fetch('/api/mcp-add-global-server', {
|
|
1083
|
+
method: 'POST',
|
|
1084
|
+
headers: { 'Content-Type': 'application/json' },
|
|
1085
|
+
body: JSON.stringify({
|
|
1086
|
+
serverName: 'ccw-tools',
|
|
1087
|
+
serverConfig: ccwToolsConfig
|
|
1088
|
+
})
|
|
1089
|
+
});
|
|
1090
|
+
|
|
1091
|
+
if (!response.ok) throw new Error('Failed to update CCW Tools MCP globally');
|
|
1092
|
+
|
|
1093
|
+
const result = await response.json();
|
|
1094
|
+
if (result.success) {
|
|
1095
|
+
await loadMcpConfig();
|
|
1096
|
+
renderMcpManager();
|
|
1097
|
+
showRefreshToast(`CCW Tools updated globally (${selectedTools.length} tools)`, 'success');
|
|
1098
|
+
} else {
|
|
1099
|
+
showRefreshToast(result.error || 'Failed to update CCW Tools MCP globally', 'error');
|
|
1100
|
+
}
|
|
1101
|
+
} else {
|
|
1102
|
+
// Update workspace (use preferredProjectConfigType)
|
|
1103
|
+
const configType = preferredProjectConfigType;
|
|
1104
|
+
const response = await fetch('/api/mcp-copy-server', {
|
|
1105
|
+
method: 'POST',
|
|
1106
|
+
headers: { 'Content-Type': 'application/json' },
|
|
1107
|
+
body: JSON.stringify({
|
|
1108
|
+
projectPath: projectPath,
|
|
1109
|
+
serverName: 'ccw-tools',
|
|
1110
|
+
serverConfig: ccwToolsConfig,
|
|
1111
|
+
configType: configType
|
|
1112
|
+
})
|
|
1113
|
+
});
|
|
1114
|
+
|
|
1115
|
+
if (!response.ok) throw new Error('Failed to update CCW Tools MCP in workspace');
|
|
1116
|
+
|
|
1117
|
+
const result = await response.json();
|
|
1118
|
+
if (result.success) {
|
|
1119
|
+
await loadMcpConfig();
|
|
1120
|
+
renderMcpManager();
|
|
1121
|
+
const location = configType === 'mcp' ? '.mcp.json' : 'claude.json';
|
|
1122
|
+
showRefreshToast(`CCW Tools updated in ${location} (${selectedTools.length} tools)`, 'success');
|
|
1123
|
+
} else {
|
|
1124
|
+
showRefreshToast(result.error || 'Failed to update CCW Tools MCP in workspace', 'error');
|
|
1125
|
+
}
|
|
1126
|
+
}
|
|
1127
|
+
} catch (err) {
|
|
1128
|
+
console.error('Failed to update CCW Tools MCP:', err);
|
|
1129
|
+
showRefreshToast(`Failed to update CCW Tools MCP: ${err.message}`, 'error');
|
|
1130
|
+
}
|
|
1131
|
+
}
|
|
1132
|
+
|
|
1133
|
+
// ========================================
|
|
1134
|
+
// CCW Tools MCP for Codex
|
|
1135
|
+
// ========================================
|
|
1136
|
+
|
|
1137
|
+
// Get selected tools from Codex checkboxes
|
|
1138
|
+
function getSelectedCcwToolsCodex() {
|
|
1139
|
+
const checkboxes = document.querySelectorAll('.ccw-tool-checkbox-codex:checked');
|
|
1140
|
+
return Array.from(checkboxes).map(cb => cb.dataset.tool);
|
|
1141
|
+
}
|
|
1142
|
+
|
|
1143
|
+
// Select tools by category for Codex
|
|
1144
|
+
function selectCcwToolsCodex(type) {
|
|
1145
|
+
const checkboxes = document.querySelectorAll('.ccw-tool-checkbox-codex');
|
|
1146
|
+
const coreTools = ['write_file', 'edit_file', 'codex_lens', 'smart_search'];
|
|
1147
|
+
|
|
1148
|
+
checkboxes.forEach(cb => {
|
|
1149
|
+
if (type === 'all') {
|
|
1150
|
+
cb.checked = true;
|
|
1151
|
+
} else if (type === 'none') {
|
|
1152
|
+
cb.checked = false;
|
|
1153
|
+
} else if (type === 'core') {
|
|
1154
|
+
cb.checked = coreTools.includes(cb.dataset.tool);
|
|
1155
|
+
}
|
|
1156
|
+
});
|
|
1157
|
+
}
|
|
1158
|
+
|
|
1159
|
+
// Install/Update CCW Tools MCP to Codex
|
|
1160
|
+
async function installCcwToolsMcpToCodex() {
|
|
1161
|
+
const selectedTools = getSelectedCcwToolsCodex();
|
|
1162
|
+
|
|
1163
|
+
if (selectedTools.length === 0) {
|
|
1164
|
+
showRefreshToast('Please select at least one tool', 'warning');
|
|
1165
|
+
return;
|
|
1166
|
+
}
|
|
1167
|
+
|
|
1168
|
+
const pathConfig = getCcwPathConfig();
|
|
1169
|
+
const ccwToolsConfig = buildCcwToolsConfig(selectedTools, pathConfig);
|
|
1170
|
+
|
|
1171
|
+
try {
|
|
1172
|
+
const isUpdate = codexMcpServers && codexMcpServers['ccw-tools'];
|
|
1173
|
+
const actionLabel = isUpdate ? 'Updating' : 'Installing';
|
|
1174
|
+
showRefreshToast(`${actionLabel} CCW Tools MCP to Codex...`, 'info');
|
|
1175
|
+
|
|
1176
|
+
await addCodexMcpServer('ccw-tools', ccwToolsConfig);
|
|
1177
|
+
|
|
1178
|
+
// Reload MCP configuration and refresh the view
|
|
1179
|
+
await loadMcpConfig();
|
|
1180
|
+
renderMcpManager();
|
|
1181
|
+
|
|
1182
|
+
const resultLabel = isUpdate ? 'updated in' : 'installed to';
|
|
1183
|
+
showRefreshToast(`CCW Tools ${resultLabel} Codex (${selectedTools.length} tools)`, 'success');
|
|
1184
|
+
} catch (err) {
|
|
1185
|
+
console.error('Failed to install CCW Tools MCP to Codex:', err);
|
|
1186
|
+
showRefreshToast(`Failed to install CCW Tools MCP to Codex: ${err.message}`, 'error');
|
|
1187
|
+
}
|
|
1188
|
+
}
|
|
1189
|
+
|
|
1190
|
+
// ========== Project Config Type Toggle ==========
|
|
1191
|
+
function toggleProjectConfigType() {
|
|
1192
|
+
preferredProjectConfigType = preferredProjectConfigType === 'mcp' ? 'claude' : 'mcp';
|
|
1193
|
+
console.log('[MCP] Preferred project config type changed to:', preferredProjectConfigType);
|
|
1194
|
+
// Re-render to update toggle display
|
|
1195
|
+
renderMcpManager();
|
|
1196
|
+
}
|
|
1197
|
+
|
|
1198
|
+
function getPreferredProjectConfigType() {
|
|
1199
|
+
return preferredProjectConfigType;
|
|
1200
|
+
}
|
|
1201
|
+
|
|
1202
|
+
function setPreferredProjectConfigType(type) {
|
|
1203
|
+
if (type === 'mcp' || type === 'claude') {
|
|
1204
|
+
preferredProjectConfigType = type;
|
|
1205
|
+
console.log('[MCP] Preferred project config type set to:', preferredProjectConfigType);
|
|
1206
|
+
}
|
|
1207
|
+
}
|
|
1208
|
+
|
|
1209
|
+
// ========== Global Exports for onclick handlers ==========
|
|
1210
|
+
// Expose functions to global scope to support inline onclick handlers
|
|
1211
|
+
window.setCliMode = setCliMode;
|
|
1212
|
+
window.getCliMode = getCliMode;
|
|
1213
|
+
window.selectCcwTools = selectCcwTools;
|
|
1214
|
+
window.selectCcwToolsCodex = selectCcwToolsCodex;
|
|
1215
|
+
window.openMcpCreateModal = openMcpCreateModal;
|
|
1216
|
+
window.toggleProjectConfigType = toggleProjectConfigType;
|
|
1217
|
+
window.getPreferredProjectConfigType = getPreferredProjectConfigType;
|
|
1218
|
+
window.setPreferredProjectConfigType = setPreferredProjectConfigType;
|
|
1219
|
+
window.setCcwProjectRootToCurrent = setCcwProjectRootToCurrent;
|