claude-code-workflow 6.2.4 → 6.2.6

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.
Files changed (62) hide show
  1. package/ccw/dist/core/lite-scanner-complete.d.ts.map +1 -1
  2. package/ccw/dist/core/lite-scanner-complete.js +4 -1
  3. package/ccw/dist/core/lite-scanner-complete.js.map +1 -1
  4. package/ccw/dist/core/lite-scanner.d.ts.map +1 -1
  5. package/ccw/dist/core/lite-scanner.js +4 -1
  6. package/ccw/dist/core/lite-scanner.js.map +1 -1
  7. package/ccw/dist/core/routes/claude-routes.d.ts.map +1 -1
  8. package/ccw/dist/core/routes/claude-routes.js +3 -5
  9. package/ccw/dist/core/routes/claude-routes.js.map +1 -1
  10. package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -1
  11. package/ccw/dist/core/routes/cli-routes.js +2 -1
  12. package/ccw/dist/core/routes/cli-routes.js.map +1 -1
  13. package/ccw/dist/core/routes/codexlens-routes.d.ts.map +1 -1
  14. package/ccw/dist/core/routes/codexlens-routes.js +31 -6
  15. package/ccw/dist/core/routes/codexlens-routes.js.map +1 -1
  16. package/ccw/dist/core/routes/rules-routes.d.ts.map +1 -1
  17. package/ccw/dist/core/routes/rules-routes.js +4 -3
  18. package/ccw/dist/core/routes/rules-routes.js.map +1 -1
  19. package/ccw/dist/core/routes/skills-routes.d.ts.map +1 -1
  20. package/ccw/dist/core/routes/skills-routes.js +124 -6
  21. package/ccw/dist/core/routes/skills-routes.js.map +1 -1
  22. package/ccw/dist/tools/cli-executor.d.ts +4 -1
  23. package/ccw/dist/tools/cli-executor.d.ts.map +1 -1
  24. package/ccw/dist/tools/cli-executor.js +54 -2
  25. package/ccw/dist/tools/cli-executor.js.map +1 -1
  26. package/ccw/dist/tools/codex-lens.d.ts +20 -3
  27. package/ccw/dist/tools/codex-lens.d.ts.map +1 -1
  28. package/ccw/dist/tools/codex-lens.js +166 -37
  29. package/ccw/dist/tools/codex-lens.js.map +1 -1
  30. package/ccw/package.json +1 -1
  31. package/ccw/src/core/lite-scanner-complete.ts +5 -1
  32. package/ccw/src/core/lite-scanner.ts +5 -1
  33. package/ccw/src/core/routes/claude-routes.ts +3 -5
  34. package/ccw/src/core/routes/cli-routes.ts +2 -1
  35. package/ccw/src/core/routes/codexlens-routes.ts +34 -6
  36. package/ccw/src/core/routes/rules-routes.ts +4 -3
  37. package/ccw/src/core/routes/skills-routes.ts +144 -6
  38. package/ccw/src/templates/dashboard-js/components/mcp-manager.js +7 -12
  39. package/ccw/src/templates/dashboard-js/i18n.js +167 -5
  40. package/ccw/src/templates/dashboard-js/views/claude-manager.js +18 -4
  41. package/ccw/src/templates/dashboard-js/views/cli-manager.js +5 -3
  42. package/ccw/src/templates/dashboard-js/views/codexlens-manager.js +790 -25
  43. package/ccw/src/templates/dashboard-js/views/rules-manager.js +35 -6
  44. package/ccw/src/templates/dashboard-js/views/skills-manager.js +385 -21
  45. package/ccw/src/tools/cli-executor.ts +70 -2
  46. package/ccw/src/tools/codex-lens.ts +183 -35
  47. package/codex-lens/pyproject.toml +66 -48
  48. package/codex-lens/src/codexlens/__pycache__/config.cpython-313.pyc +0 -0
  49. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-313.pyc +0 -0
  50. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-313.pyc +0 -0
  51. package/codex-lens/src/codexlens/cli/embedding_manager.py +3 -3
  52. package/codex-lens/src/codexlens/cli/model_manager.py +24 -2
  53. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-313.pyc +0 -0
  54. package/codex-lens/src/codexlens/search/hybrid_search.py +313 -313
  55. package/codex-lens/src/codexlens/semantic/__init__.py +76 -39
  56. package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-313.pyc +0 -0
  57. package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-313.pyc +0 -0
  58. package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-313.pyc +0 -0
  59. package/codex-lens/src/codexlens/semantic/__pycache__/ollama_backend.cpython-313.pyc +0 -0
  60. package/codex-lens/src/codexlens/semantic/embedder.py +244 -185
  61. package/codex-lens/src/codexlens/semantic/gpu_support.py +192 -0
  62. package/package.json +1 -1
@@ -23,6 +23,9 @@ const i18n = {
23
23
  'common.loading': 'Loading...',
24
24
  'common.error': 'Error',
25
25
  'common.success': 'Success',
26
+ 'common.retry': 'Retry',
27
+ 'common.refresh': 'Refresh',
28
+ 'common.minutes': 'minutes',
26
29
 
27
30
  // Header
28
31
  'header.project': 'Project:',
@@ -277,8 +280,17 @@ const i18n = {
277
280
  'codexlens.installDeps': 'Install Dependencies',
278
281
  'codexlens.installDepsPrompt': 'Would you like to install them now? (This may take a few minutes)\n\nClick "Cancel" to create FTS index only.',
279
282
  'codexlens.installingDeps': 'Installing dependencies...',
283
+ 'codexlens.installingMode': 'Installing with',
280
284
  'codexlens.depsInstalled': 'Dependencies installed successfully',
281
285
  'codexlens.depsInstallFailed': 'Failed to install dependencies',
286
+
287
+ // GPU Mode Selection
288
+ 'codexlens.selectGpuMode': 'Select acceleration mode',
289
+ 'codexlens.cpuModeDesc': 'Standard CPU processing',
290
+ 'codexlens.directmlModeDesc': 'Windows GPU (NVIDIA/AMD/Intel)',
291
+ 'codexlens.cudaModeDesc': 'NVIDIA GPU (requires CUDA Toolkit)',
292
+ 'common.recommended': 'Recommended',
293
+ 'common.unavailable': 'Unavailable',
282
294
  'codexlens.modelManagement': 'Model Management',
283
295
  'codexlens.loadingModels': 'Loading models...',
284
296
  'codexlens.downloadModel': 'Download',
@@ -293,6 +305,35 @@ const i18n = {
293
305
  'codexlens.modelListError': 'Failed to load models',
294
306
  'codexlens.noModelsAvailable': 'No models available',
295
307
 
308
+ // Model Download Progress
309
+ 'codexlens.downloadingModel': 'Downloading',
310
+ 'codexlens.connectingToHuggingFace': 'Connecting to Hugging Face...',
311
+ 'codexlens.downloadTimeEstimate': 'Estimated time',
312
+ 'codexlens.manualDownloadHint': 'Manual download',
313
+ 'codexlens.downloadingModelFiles': 'Downloading model files...',
314
+ 'codexlens.downloadingWeights': 'Downloading model weights...',
315
+ 'codexlens.downloadingTokenizer': 'Downloading tokenizer...',
316
+ 'codexlens.verifyingModel': 'Verifying model...',
317
+ 'codexlens.finalizingDownload': 'Finalizing...',
318
+ 'codexlens.downloadComplete': 'Download complete!',
319
+ 'codexlens.downloadFailed': 'Download failed',
320
+ 'codexlens.manualDownloadOptions': 'Manual download options',
321
+ 'codexlens.cliDownload': 'CLI',
322
+ 'codexlens.huggingfaceDownload': 'Hugging Face',
323
+ 'codexlens.downloadCanceled': 'Download canceled',
324
+
325
+ // Manual Download Guide
326
+ 'codexlens.manualDownloadGuide': 'Manual Download Guide',
327
+ 'codexlens.cliMethod': 'Command Line (Recommended)',
328
+ 'codexlens.cliMethodDesc': 'Run in terminal with progress display:',
329
+ 'codexlens.pythonMethod': 'Python Script',
330
+ 'codexlens.pythonMethodDesc': 'Pre-download model using Python:',
331
+ 'codexlens.hfHubMethod': 'Hugging Face Hub CLI',
332
+ 'codexlens.hfHubMethodDesc': 'Download using huggingface-cli with resume support:',
333
+ 'codexlens.modelLinks': 'Direct Model Links',
334
+ 'codexlens.cacheLocation': 'Model Storage Location',
335
+ 'common.copied': 'Copied to clipboard',
336
+
296
337
  // CodexLens Indexing Progress
297
338
  'codexlens.indexing': 'Indexing',
298
339
  'codexlens.indexingDesc': 'Building code index for workspace',
@@ -302,6 +343,43 @@ const i18n = {
302
343
  'codexlens.indexSuccess': 'Index created successfully',
303
344
  'codexlens.indexFailed': 'Indexing failed',
304
345
 
346
+ // CodexLens Install
347
+ 'codexlens.installDesc': 'Python-based code indexing engine',
348
+ 'codexlens.whatWillBeInstalled': 'What will be installed:',
349
+ 'codexlens.pythonVenv': 'Python virtual environment',
350
+ 'codexlens.pythonVenvDesc': 'Isolated Python environment',
351
+ 'codexlens.codexlensPackage': 'CodexLens package',
352
+ 'codexlens.codexlensPackageDesc': 'Code indexing and search engine',
353
+ 'codexlens.sqliteFtsDesc': 'Full-text search database',
354
+ 'codexlens.installLocation': 'Installation Location',
355
+ 'codexlens.installTime': 'First installation may take 2-3 minutes to download and setup Python packages.',
356
+ 'codexlens.startingInstall': 'Starting installation...',
357
+ 'codexlens.installing': 'Installing...',
358
+ 'codexlens.creatingVenv': 'Creating virtual environment...',
359
+ 'codexlens.installingPip': 'Installing pip packages...',
360
+ 'codexlens.installingPackage': 'Installing CodexLens package...',
361
+ 'codexlens.settingUpDeps': 'Setting up Python dependencies...',
362
+ 'codexlens.installComplete': 'Installation complete!',
363
+ 'codexlens.installSuccess': 'CodexLens installed successfully!',
364
+ 'codexlens.installNow': 'Install Now',
365
+ 'codexlens.accelerator': 'Accelerator',
366
+
367
+ // CodexLens Uninstall
368
+ 'codexlens.uninstall': 'Uninstall',
369
+ 'codexlens.uninstallDesc': 'Remove CodexLens and all data',
370
+ 'codexlens.whatWillBeRemoved': 'What will be removed:',
371
+ 'codexlens.removeVenv': 'Virtual environment at ~/.codexlens/venv',
372
+ 'codexlens.removeData': 'All CodexLens indexed data and databases',
373
+ 'codexlens.removeConfig': 'Configuration and semantic search models',
374
+ 'codexlens.removing': 'Removing files...',
375
+ 'codexlens.uninstalling': 'Uninstalling...',
376
+ 'codexlens.removingVenv': 'Removing virtual environment...',
377
+ 'codexlens.removingData': 'Deleting indexed data...',
378
+ 'codexlens.removingConfig': 'Cleaning up configuration...',
379
+ 'codexlens.finalizing': 'Finalizing removal...',
380
+ 'codexlens.uninstallComplete': 'Uninstallation complete!',
381
+ 'codexlens.uninstallSuccess': 'CodexLens uninstalled successfully!',
382
+
305
383
  // Index Manager
306
384
  'index.manager': 'Index Manager',
307
385
  'index.projects': 'Projects',
@@ -333,9 +411,12 @@ const i18n = {
333
411
  'index.fullDesc': 'FTS + Semantic search (recommended)',
334
412
  'index.selectModel': 'Select embedding model',
335
413
  'index.modelCode': 'Code (768d)',
414
+ 'index.modelBase': 'Base (768d)',
336
415
  'index.modelFast': 'Fast (384d)',
337
- 'index.modelMultilingual': 'Multilingual (1024d)',
338
- 'index.modelBalanced': 'Balanced (1024d)',
416
+ 'index.modelMinilm': 'MiniLM (384d)',
417
+ 'index.modelMultilingual': 'Multilingual (1024d) ⚠️',
418
+ 'index.modelBalanced': 'Balanced (1024d) ⚠️',
419
+ 'index.dimensionWarning': '1024d models require more resources',
339
420
 
340
421
  // Semantic Search Configuration
341
422
  'semantic.settings': 'Semantic Search Settings',
@@ -1358,7 +1439,10 @@ const i18n = {
1358
1439
  'common.loading': '加载中...',
1359
1440
  'common.error': '错误',
1360
1441
  'common.success': '成功',
1361
-
1442
+ 'common.retry': '重试',
1443
+ 'common.refresh': '刷新',
1444
+ 'common.minutes': '分钟',
1445
+
1362
1446
  // Header
1363
1447
  'header.project': '项目:',
1364
1448
  'header.recentProjects': '最近项目',
@@ -1612,8 +1696,17 @@ const i18n = {
1612
1696
  'codexlens.installDeps': '安装依赖',
1613
1697
  'codexlens.installDepsPrompt': '是否立即安装?(可能需要几分钟)\n\n点击"取消"将只创建 FTS 索引。',
1614
1698
  'codexlens.installingDeps': '安装依赖中...',
1699
+ 'codexlens.installingMode': '正在安装',
1615
1700
  'codexlens.depsInstalled': '依赖安装成功',
1616
1701
  'codexlens.depsInstallFailed': '依赖安装失败',
1702
+
1703
+ // GPU 模式选择
1704
+ 'codexlens.selectGpuMode': '选择加速模式',
1705
+ 'codexlens.cpuModeDesc': '标准 CPU 处理',
1706
+ 'codexlens.directmlModeDesc': 'Windows GPU(NVIDIA/AMD/Intel)',
1707
+ 'codexlens.cudaModeDesc': 'NVIDIA GPU(需要 CUDA Toolkit)',
1708
+ 'common.recommended': '推荐',
1709
+ 'common.unavailable': '不可用',
1617
1710
  'codexlens.modelManagement': '模型管理',
1618
1711
  'codexlens.loadingModels': '加载模型中...',
1619
1712
  'codexlens.downloadModel': '下载',
@@ -1628,6 +1721,35 @@ const i18n = {
1628
1721
  'codexlens.modelListError': '加载模型列表失败',
1629
1722
  'codexlens.noModelsAvailable': '没有可用模型',
1630
1723
 
1724
+ // 模型下载进度
1725
+ 'codexlens.downloadingModel': '正在下载',
1726
+ 'codexlens.connectingToHuggingFace': '正在连接 Hugging Face...',
1727
+ 'codexlens.downloadTimeEstimate': '预计时间',
1728
+ 'codexlens.manualDownloadHint': '手动下载',
1729
+ 'codexlens.downloadingModelFiles': '正在下载模型文件...',
1730
+ 'codexlens.downloadingWeights': '正在下载模型权重...',
1731
+ 'codexlens.downloadingTokenizer': '正在下载分词器...',
1732
+ 'codexlens.verifyingModel': '正在验证模型...',
1733
+ 'codexlens.finalizingDownload': '正在完成...',
1734
+ 'codexlens.downloadComplete': '下载完成!',
1735
+ 'codexlens.downloadFailed': '下载失败',
1736
+ 'codexlens.manualDownloadOptions': '手动下载选项',
1737
+ 'codexlens.cliDownload': '命令行',
1738
+ 'codexlens.huggingfaceDownload': 'Hugging Face',
1739
+ 'codexlens.downloadCanceled': '下载已取消',
1740
+
1741
+ // 手动下载指南
1742
+ 'codexlens.manualDownloadGuide': '手动下载指南',
1743
+ 'codexlens.cliMethod': '命令行(推荐)',
1744
+ 'codexlens.cliMethodDesc': '在终端运行,显示下载进度:',
1745
+ 'codexlens.pythonMethod': 'Python 脚本',
1746
+ 'codexlens.pythonMethodDesc': '使用 Python 预下载模型:',
1747
+ 'codexlens.hfHubMethod': 'Hugging Face Hub CLI',
1748
+ 'codexlens.hfHubMethodDesc': '使用 huggingface-cli 下载,支持断点续传:',
1749
+ 'codexlens.modelLinks': '模型直链',
1750
+ 'codexlens.cacheLocation': '模型存储位置',
1751
+ 'common.copied': '已复制到剪贴板',
1752
+
1631
1753
  // CodexLens 索引进度
1632
1754
  'codexlens.indexing': '索引中',
1633
1755
  'codexlens.indexingDesc': '正在为工作区构建代码索引',
@@ -1637,6 +1759,43 @@ const i18n = {
1637
1759
  'codexlens.indexSuccess': '索引创建成功',
1638
1760
  'codexlens.indexFailed': '索引失败',
1639
1761
 
1762
+ // CodexLens 安装
1763
+ 'codexlens.installDesc': '基于 Python 的代码索引引擎',
1764
+ 'codexlens.whatWillBeInstalled': '将安装的内容:',
1765
+ 'codexlens.pythonVenv': 'Python 虚拟环境',
1766
+ 'codexlens.pythonVenvDesc': '隔离的 Python 环境',
1767
+ 'codexlens.codexlensPackage': 'CodexLens 包',
1768
+ 'codexlens.codexlensPackageDesc': '代码索引和搜索引擎',
1769
+ 'codexlens.sqliteFtsDesc': '全文搜索数据库',
1770
+ 'codexlens.installLocation': '安装位置',
1771
+ 'codexlens.installTime': '首次安装可能需要 2-3 分钟下载和配置 Python 包。',
1772
+ 'codexlens.startingInstall': '正在启动安装...',
1773
+ 'codexlens.installing': '安装中...',
1774
+ 'codexlens.creatingVenv': '正在创建虚拟环境...',
1775
+ 'codexlens.installingPip': '正在安装 pip 包...',
1776
+ 'codexlens.installingPackage': '正在安装 CodexLens 包...',
1777
+ 'codexlens.settingUpDeps': '正在配置 Python 依赖...',
1778
+ 'codexlens.installComplete': '安装完成!',
1779
+ 'codexlens.installSuccess': 'CodexLens 安装成功!',
1780
+ 'codexlens.installNow': '立即安装',
1781
+ 'codexlens.accelerator': '加速器',
1782
+
1783
+ // CodexLens 卸载
1784
+ 'codexlens.uninstall': '卸载',
1785
+ 'codexlens.uninstallDesc': '移除 CodexLens 及所有数据',
1786
+ 'codexlens.whatWillBeRemoved': '将被移除的内容:',
1787
+ 'codexlens.removeVenv': '虚拟环境 ~/.codexlens/venv',
1788
+ 'codexlens.removeData': '所有 CodexLens 索引数据和数据库',
1789
+ 'codexlens.removeConfig': '配置文件和语义搜索模型',
1790
+ 'codexlens.removing': '正在删除文件...',
1791
+ 'codexlens.uninstalling': '正在卸载...',
1792
+ 'codexlens.removingVenv': '正在删除虚拟环境...',
1793
+ 'codexlens.removingData': '正在删除索引数据...',
1794
+ 'codexlens.removingConfig': '正在清理配置文件...',
1795
+ 'codexlens.finalizing': '正在完成卸载...',
1796
+ 'codexlens.uninstallComplete': '卸载完成!',
1797
+ 'codexlens.uninstallSuccess': 'CodexLens 卸载成功!',
1798
+
1640
1799
  // 索引管理器
1641
1800
  'index.manager': '索引管理器',
1642
1801
  'index.projects': '项目数',
@@ -1668,9 +1827,12 @@ const i18n = {
1668
1827
  'index.fullDesc': 'FTS + 语义搜索(推荐)',
1669
1828
  'index.selectModel': '选择嵌入模型',
1670
1829
  'index.modelCode': '代码优化 (768维)',
1830
+ 'index.modelBase': '通用基础 (768维)',
1671
1831
  'index.modelFast': '快速轻量 (384维)',
1672
- 'index.modelMultilingual': '多语言 (1024维)',
1673
- 'index.modelBalanced': '高精度 (1024维)',
1832
+ 'index.modelMinilm': 'MiniLM (384维)',
1833
+ 'index.modelMultilingual': '多语言 (1024维) ⚠️',
1834
+ 'index.modelBalanced': '高精度 (1024维) ⚠️',
1835
+ 'index.dimensionWarning': '1024维模型需要更多资源',
1674
1836
 
1675
1837
  // Semantic Search 配置
1676
1838
  'semantic.settings': '语义搜索设置',
@@ -102,6 +102,7 @@ async function loadClaudeFiles() {
102
102
  updateClaudeBadge(); // Update navigation badge
103
103
  } catch (error) {
104
104
  console.error('Error loading CLAUDE.md files:', error);
105
+ showRefreshToast(t('claudeManager.loadError') || 'Failed to load files', 'error');
105
106
  addGlobalNotification('error', t('claudeManager.loadError'), null, 'CLAUDE.md');
106
107
  }
107
108
  }
@@ -113,6 +114,7 @@ async function refreshClaudeFiles() {
113
114
  renderFileViewer();
114
115
  renderFileMetadata();
115
116
  if (window.lucide) lucide.createIcons();
117
+ showRefreshToast(t('claudeManager.refreshed') || 'Files refreshed', 'success');
116
118
  addGlobalNotification('success', t('claudeManager.refreshed'), null, 'CLAUDE.md');
117
119
  // Load freshness data in background
118
120
  loadFreshnessDataAsync();
@@ -155,6 +157,7 @@ async function markFileAsUpdated() {
155
157
 
156
158
  if (!res.ok) throw new Error('Failed to mark file as updated');
157
159
 
160
+ showRefreshToast(t('claudeManager.markedAsUpdated') || 'Marked as updated', 'success');
158
161
  addGlobalNotification('success', t('claudeManager.markedAsUpdated') || 'Marked as updated', null, 'CLAUDE.md');
159
162
 
160
163
  // Reload freshness data
@@ -163,6 +166,7 @@ async function markFileAsUpdated() {
163
166
  renderFileMetadata();
164
167
  } catch (error) {
165
168
  console.error('Error marking file as updated:', error);
169
+ showRefreshToast(t('claudeManager.markUpdateError') || 'Failed to mark as updated', 'error');
166
170
  addGlobalNotification('error', t('claudeManager.markUpdateError') || 'Failed to mark as updated', null, 'CLAUDE.md');
167
171
  }
168
172
  }
@@ -481,10 +485,12 @@ async function saveClaudeFile() {
481
485
  selectedFile.stats = calculateFileStats(newContent);
482
486
  isDirty = false;
483
487
 
488
+ showRefreshToast(t('claudeManager.saved') || 'File saved', 'success');
484
489
  addGlobalNotification('success', t('claudeManager.saved'), null, 'CLAUDE.md');
485
490
  renderFileMetadata();
486
491
  } catch (error) {
487
492
  console.error('Error saving file:', error);
493
+ showRefreshToast(t('claudeManager.saveError') || 'Save failed', 'error');
488
494
  addGlobalNotification('error', t('claudeManager.saveError'), null, 'CLAUDE.md');
489
495
  }
490
496
  }
@@ -733,12 +739,13 @@ async function loadFileContent(filePath) {
733
739
  }
734
740
 
735
741
  function showClaudeNotification(type, message) {
736
- // Use global notification system if available
742
+ // Show toast for immediate feedback
743
+ if (typeof showRefreshToast === 'function') {
744
+ showRefreshToast(message, type);
745
+ }
746
+ // Also add to global notification system if available
737
747
  if (typeof addGlobalNotification === 'function') {
738
748
  addGlobalNotification(type, message, null, 'CLAUDE.md');
739
- } else {
740
- // Fallback to simple alert
741
- alert(message);
742
749
  }
743
750
  }
744
751
 
@@ -822,6 +829,7 @@ async function createNewFile() {
822
829
  var modulePath = document.getElementById('modulePath').value;
823
830
 
824
831
  if (level === 'module' && !modulePath) {
832
+ showRefreshToast(t('claude.modulePathRequired') || 'Module path is required', 'error');
825
833
  addGlobalNotification('error', t('claude.modulePathRequired') || 'Module path is required', null, 'CLAUDE.md');
826
834
  return;
827
835
  }
@@ -841,12 +849,14 @@ async function createNewFile() {
841
849
 
842
850
  var result = await res.json();
843
851
  closeCreateDialog();
852
+ showRefreshToast(t('claude.fileCreated') || 'File created successfully', 'success');
844
853
  addGlobalNotification('success', t('claude.fileCreated') || 'File created successfully', null, 'CLAUDE.md');
845
854
 
846
855
  // Refresh file tree
847
856
  await refreshClaudeFiles();
848
857
  } catch (error) {
849
858
  console.error('Error creating file:', error);
859
+ showRefreshToast(t('claude.createFileError') || 'Failed to create file', 'error');
850
860
  addGlobalNotification('error', t('claude.createFileError') || 'Failed to create file', null, 'CLAUDE.md');
851
861
  }
852
862
  }
@@ -870,6 +880,7 @@ async function confirmDeleteFile() {
870
880
 
871
881
  if (!res.ok) throw new Error('Failed to delete file');
872
882
 
883
+ showRefreshToast(t('claude.fileDeleted') || 'File deleted successfully', 'success');
873
884
  addGlobalNotification('success', t('claude.fileDeleted') || 'File deleted successfully', null, 'CLAUDE.md');
874
885
  selectedFile = null;
875
886
 
@@ -877,6 +888,7 @@ async function confirmDeleteFile() {
877
888
  await refreshClaudeFiles();
878
889
  } catch (error) {
879
890
  console.error('Error deleting file:', error);
891
+ showRefreshToast(t('claude.deleteFileError') || 'Failed to delete file', 'error');
880
892
  addGlobalNotification('error', t('claude.deleteFileError') || 'Failed to delete file', null, 'CLAUDE.md');
881
893
  }
882
894
  }
@@ -886,9 +898,11 @@ function copyFileContent() {
886
898
  if (!selectedFile || !selectedFile.content) return;
887
899
 
888
900
  navigator.clipboard.writeText(selectedFile.content).then(function() {
901
+ showRefreshToast(t('claude.contentCopied') || 'Content copied to clipboard', 'success');
889
902
  addGlobalNotification('success', t('claude.contentCopied') || 'Content copied to clipboard', null, 'CLAUDE.md');
890
903
  }).catch(function(error) {
891
904
  console.error('Error copying content:', error);
905
+ showRefreshToast(t('claude.copyError') || 'Failed to copy content', 'error');
892
906
  addGlobalNotification('error', t('claude.copyError') || 'Failed to copy content', null, 'CLAUDE.md');
893
907
  });
894
908
  }
@@ -404,10 +404,12 @@ function renderToolsSection() {
404
404
  (codexLensStatus.ready
405
405
  ? '<span class="tool-status-text success"><i data-lucide="check-circle" class="w-3.5 h-3.5"></i> v' + (codexLensStatus.version || 'installed') + '</span>' +
406
406
  '<select id="codexlensModelSelect" class="btn-sm bg-muted border border-border rounded text-xs" onclick="event.stopPropagation()" title="' + (t('index.selectModel') || 'Select embedding model') + '">' +
407
- '<option value="code">' + (t('index.modelCode') || 'Code (768d)') + '</option>' +
407
+ '<option value="code">' + (t('index.modelCode') || 'Code (768d)') + ' ⭐</option>' +
408
+ '<option value="base">' + (t('index.modelBase') || 'Base (768d)') + '</option>' +
408
409
  '<option value="fast">' + (t('index.modelFast') || 'Fast (384d)') + '</option>' +
409
- '<option value="multilingual">' + (t('index.modelMultilingual') || 'Multilingual (1024d)') + '</option>' +
410
- '<option value="balanced">' + (t('index.modelBalanced') || 'Balanced (1024d)') + '</option>' +
410
+ '<option value="minilm">' + (t('index.modelMinilm') || 'MiniLM (384d)') + '</option>' +
411
+ '<option value="multilingual" style="color: var(--muted-foreground)">' + (t('index.modelMultilingual') || 'Multilingual (1024d)') + ' ⚠️</option>' +
412
+ '<option value="balanced" style="color: var(--muted-foreground)">' + (t('index.modelBalanced') || 'Balanced (1024d)') + ' ⚠️</option>' +
411
413
  '</select>' +
412
414
  '<button class="btn-sm btn-primary" onclick="event.stopPropagation(); initCodexLensIndex(\'full\', getSelectedModel())" title="' + (t('index.fullDesc') || 'FTS + Semantic search (recommended)') + '"><i data-lucide="layers" class="w-3 h-3"></i> ' + (t('index.fullIndex') || '全部索引') + '</button>' +
413
415
  '<button class="btn-sm btn-outline" onclick="event.stopPropagation(); initCodexLensIndex(\'vector\', getSelectedModel())" title="' + (t('index.vectorDesc') || 'Semantic search with embeddings') + '"><i data-lucide="sparkles" class="w-3 h-3"></i> ' + (t('index.vectorIndex') || '向量索引') + '</button>' +