claude-code-workflow 6.3.48 → 6.3.49

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 (211) hide show
  1. package/.claude/CLAUDE.md +6 -8
  2. package/.claude/agents/action-planning-agent.md +28 -45
  3. package/.claude/agents/cli-lite-planning-agent.md +93 -1
  4. package/.claude/agents/code-developer.md +144 -27
  5. package/.claude/commands/ccw-coordinator.md +175 -21
  6. package/.claude/commands/ccw-debug.md +832 -0
  7. package/.claude/commands/ccw.md +90 -9
  8. package/.claude/commands/cli/cli-init.md +1 -0
  9. package/.claude/commands/issue/convert-to-plan.md +718 -0
  10. package/.claude/commands/issue/from-brainstorm.md +382 -0
  11. package/.claude/commands/memory/tips.md +332 -0
  12. package/.claude/commands/workflow/analyze-with-file.md +804 -0
  13. package/.claude/commands/workflow/brainstorm/auto-parallel.md +18 -43
  14. package/.claude/commands/workflow/brainstorm/role-analysis.md +705 -0
  15. package/.claude/commands/workflow/brainstorm-with-file.md +1153 -0
  16. package/.claude/commands/workflow/debug-with-file.md +7 -5
  17. package/.claude/commands/workflow/execute.md +6 -4
  18. package/.claude/commands/workflow/lite-plan.md +2 -2
  19. package/.claude/commands/workflow/plan-verify.md +162 -327
  20. package/.claude/commands/workflow/plan.md +162 -26
  21. package/.claude/commands/workflow/replan.md +78 -2
  22. package/.claude/commands/workflow/{review-fix.md → review-cycle-fix.md} +6 -6
  23. package/.claude/commands/workflow/review-module-cycle.md +2 -2
  24. package/.claude/commands/workflow/review-session-cycle.md +2 -2
  25. package/.claude/commands/workflow/tools/conflict-resolution.md +16 -26
  26. package/.claude/commands/workflow/tools/context-gather.md +81 -118
  27. package/.claude/commands/workflow/tools/task-generate-agent.md +94 -10
  28. package/.claude/skills/ccw-help/command.json +4 -4
  29. package/.claude/skills/lite-skill-generator/SKILL.md +650 -0
  30. package/.claude/skills/lite-skill-generator/templates/simple-skill.md +68 -0
  31. package/.claude/skills/lite-skill-generator/templates/style-guide.md +64 -0
  32. package/.claude/skills/skill-generator/SKILL.md +277 -85
  33. package/.claude/skills/skill-generator/phases/01-requirements-discovery.md +4 -15
  34. package/.claude/skills/skill-generator/phases/02-structure-generation.md +72 -17
  35. package/.claude/skills/skill-generator/phases/03-phase-generation.md +218 -51
  36. package/.claude/skills/skill-generator/phases/04-specs-templates.md +111 -41
  37. package/.claude/skills/skill-generator/phases/05-validation.md +139 -56
  38. package/.claude/skills/skill-generator/templates/autonomous-action.md +78 -268
  39. package/.claude/skills/skill-generator/templates/autonomous-orchestrator.md +14 -0
  40. package/.claude/skills/skill-generator/templates/code-analysis-action.md +12 -0
  41. package/.claude/skills/skill-generator/templates/llm-action.md +12 -0
  42. package/.claude/skills/skill-generator/templates/script-template.md +368 -0
  43. package/.claude/skills/skill-generator/templates/sequential-phase.md +14 -0
  44. package/.claude/skills/skill-generator/templates/skill-md.md +14 -0
  45. package/.claude/skills/skill-tuning/SKILL.md +130 -266
  46. package/.claude/skills/skill-tuning/phases/orchestrator.md +95 -283
  47. package/.claude/skills/skill-tuning/specs/problem-taxonomy.md +90 -198
  48. package/.claude/skills/skill-tuning/specs/tuning-strategies.md +193 -1345
  49. package/.claude/workflows/cli-templates/schemas/plan-verify-agent-schema.json +47 -0
  50. package/.claude/workflows/cli-templates/schemas/verify-json-schema.json +158 -0
  51. package/.claude/workflows/cli-tools-usage.md +1 -1
  52. package/.codex/AGENTS.md +1 -3
  53. package/.codex/prompts/analyze-with-file.md +607 -0
  54. package/.codex/prompts/brainstorm-to-cycle.md +455 -0
  55. package/.codex/prompts/brainstorm-with-file.md +933 -0
  56. package/.codex/prompts/debug-with-file.md +15 -20
  57. package/.codex/skills/ccw-cli-tools/SKILL.md +559 -0
  58. package/ccw/dist/commands/cli.d.ts.map +1 -1
  59. package/ccw/dist/commands/cli.js +29 -5
  60. package/ccw/dist/commands/cli.js.map +1 -1
  61. package/ccw/dist/commands/issue.d.ts +2 -0
  62. package/ccw/dist/commands/issue.d.ts.map +1 -1
  63. package/ccw/dist/commands/issue.js +62 -20
  64. package/ccw/dist/commands/issue.js.map +1 -1
  65. package/ccw/dist/config/litellm-api-config-manager.d.ts.map +1 -1
  66. package/ccw/dist/config/litellm-api-config-manager.js +5 -3
  67. package/ccw/dist/config/litellm-api-config-manager.js.map +1 -1
  68. package/ccw/dist/config/litellm-provider-models.d.ts +73 -0
  69. package/ccw/dist/config/litellm-provider-models.d.ts.map +1 -0
  70. package/ccw/dist/config/litellm-provider-models.js +172 -0
  71. package/ccw/dist/config/litellm-provider-models.js.map +1 -0
  72. package/ccw/dist/config/provider-models.d.ts +25 -51
  73. package/ccw/dist/config/provider-models.d.ts.map +1 -1
  74. package/ccw/dist/config/provider-models.js +84 -149
  75. package/ccw/dist/config/provider-models.js.map +1 -1
  76. package/ccw/dist/config/storage-paths.d.ts.map +1 -1
  77. package/ccw/dist/config/storage-paths.js +23 -5
  78. package/ccw/dist/config/storage-paths.js.map +1 -1
  79. package/ccw/dist/core/auth/csrf-middleware.js +3 -3
  80. package/ccw/dist/core/auth/csrf-middleware.js.map +1 -1
  81. package/ccw/dist/core/dashboard-generator.d.ts.map +1 -1
  82. package/ccw/dist/core/dashboard-generator.js +3 -1
  83. package/ccw/dist/core/dashboard-generator.js.map +1 -1
  84. package/ccw/dist/core/routes/claude-routes.d.ts.map +1 -1
  85. package/ccw/dist/core/routes/claude-routes.js +206 -14
  86. package/ccw/dist/core/routes/claude-routes.js.map +1 -1
  87. package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -1
  88. package/ccw/dist/core/routes/cli-routes.js.map +1 -1
  89. package/ccw/dist/core/routes/commands-routes.d.ts +7 -0
  90. package/ccw/dist/core/routes/commands-routes.d.ts.map +1 -0
  91. package/ccw/dist/core/routes/commands-routes.js +480 -0
  92. package/ccw/dist/core/routes/commands-routes.js.map +1 -0
  93. package/ccw/dist/core/routes/model-routes.d.ts +11 -0
  94. package/ccw/dist/core/routes/model-routes.d.ts.map +1 -0
  95. package/ccw/dist/core/routes/model-routes.js +112 -0
  96. package/ccw/dist/core/routes/model-routes.js.map +1 -0
  97. package/ccw/dist/core/routes/nav-status-routes.d.ts.map +1 -1
  98. package/ccw/dist/core/routes/nav-status-routes.js +84 -1
  99. package/ccw/dist/core/routes/nav-status-routes.js.map +1 -1
  100. package/ccw/dist/core/routes/provider-routes.d.ts +11 -0
  101. package/ccw/dist/core/routes/provider-routes.d.ts.map +1 -0
  102. package/ccw/dist/core/routes/provider-routes.js +67 -0
  103. package/ccw/dist/core/routes/provider-routes.js.map +1 -0
  104. package/ccw/dist/core/routes/skills-routes.d.ts.map +1 -1
  105. package/ccw/dist/core/routes/skills-routes.js +219 -7
  106. package/ccw/dist/core/routes/skills-routes.js.map +1 -1
  107. package/ccw/dist/core/routes/system-routes.d.ts.map +1 -1
  108. package/ccw/dist/core/routes/system-routes.js +58 -6
  109. package/ccw/dist/core/routes/system-routes.js.map +1 -1
  110. package/ccw/dist/core/server.d.ts.map +1 -1
  111. package/ccw/dist/core/server.js +13 -0
  112. package/ccw/dist/core/server.js.map +1 -1
  113. package/ccw/dist/mcp-server/index.js +2 -2
  114. package/ccw/dist/mcp-server/index.js.map +1 -1
  115. package/ccw/dist/tools/claude-cli-tools.d.ts +48 -11
  116. package/ccw/dist/tools/claude-cli-tools.d.ts.map +1 -1
  117. package/ccw/dist/tools/claude-cli-tools.js +146 -50
  118. package/ccw/dist/tools/claude-cli-tools.js.map +1 -1
  119. package/ccw/dist/tools/cli-config-manager.d.ts +1 -13
  120. package/ccw/dist/tools/cli-config-manager.d.ts.map +1 -1
  121. package/ccw/dist/tools/cli-config-manager.js +3 -27
  122. package/ccw/dist/tools/cli-config-manager.js.map +1 -1
  123. package/ccw/dist/tools/cli-executor-core.d.ts.map +1 -1
  124. package/ccw/dist/tools/cli-executor-core.js +7 -2
  125. package/ccw/dist/tools/cli-executor-core.js.map +1 -1
  126. package/ccw/dist/tools/cli-executor-state.d.ts.map +1 -1
  127. package/ccw/dist/tools/cli-history-store.d.ts +11 -0
  128. package/ccw/dist/tools/cli-history-store.d.ts.map +1 -1
  129. package/ccw/dist/tools/cli-history-store.js +82 -2
  130. package/ccw/dist/tools/cli-history-store.js.map +1 -1
  131. package/ccw/dist/tools/command-registry.d.ts +7 -0
  132. package/ccw/dist/tools/command-registry.d.ts.map +1 -1
  133. package/ccw/dist/tools/command-registry.js +14 -1
  134. package/ccw/dist/tools/command-registry.js.map +1 -1
  135. package/ccw/dist/tools/generate-module-docs.d.ts.map +1 -1
  136. package/ccw/dist/tools/generate-module-docs.js +11 -7
  137. package/ccw/dist/tools/generate-module-docs.js.map +1 -1
  138. package/ccw/dist/tools/litellm-executor.d.ts +1 -0
  139. package/ccw/dist/tools/litellm-executor.d.ts.map +1 -1
  140. package/ccw/dist/tools/litellm-executor.js +11 -9
  141. package/ccw/dist/tools/litellm-executor.js.map +1 -1
  142. package/ccw/dist/types/skill-types.d.ts +97 -0
  143. package/ccw/dist/types/skill-types.d.ts.map +1 -0
  144. package/ccw/dist/types/skill-types.js +6 -0
  145. package/ccw/dist/types/skill-types.js.map +1 -0
  146. package/ccw/src/commands/cli.ts +36 -5
  147. package/ccw/src/commands/issue.ts +81 -26
  148. package/ccw/src/config/litellm-api-config-manager.ts +5 -3
  149. package/ccw/src/config/litellm-provider-models.ts +222 -0
  150. package/ccw/src/config/provider-models.ts +91 -190
  151. package/ccw/src/config/storage-paths.ts +20 -5
  152. package/ccw/src/core/auth/csrf-middleware.ts +3 -3
  153. package/ccw/src/core/dashboard-generator.ts +3 -1
  154. package/ccw/src/core/routes/claude-routes.ts +233 -15
  155. package/ccw/src/core/routes/cli-routes.ts +2 -3
  156. package/ccw/src/core/routes/commands-routes.ts +620 -0
  157. package/ccw/src/core/routes/nav-status-routes.ts +95 -1
  158. package/ccw/src/core/routes/provider-routes.ts +78 -0
  159. package/ccw/src/core/routes/skills-routes.ts +266 -45
  160. package/ccw/src/core/routes/system-routes.ts +102 -50
  161. package/ccw/src/core/server.ts +13 -0
  162. package/ccw/src/mcp-server/index.ts +2 -2
  163. package/ccw/src/templates/dashboard-css/18-cli-settings.css +35 -0
  164. package/ccw/src/templates/dashboard-css/37-commands.css +193 -0
  165. package/ccw/src/templates/dashboard-js/components/navigation.js +4 -0
  166. package/ccw/src/templates/dashboard-js/i18n.js +116 -0
  167. package/ccw/src/templates/dashboard-js/views/cli-manager.js +249 -4
  168. package/ccw/src/templates/dashboard-js/views/commands-manager.js +503 -0
  169. package/ccw/src/templates/dashboard-js/views/issue-manager.js +7 -7
  170. package/ccw/src/templates/dashboard-js/views/mcp-manager.js +2 -7
  171. package/ccw/src/templates/dashboard-js/views/skills-manager.js +164 -23
  172. package/ccw/src/templates/dashboard.html +7 -0
  173. package/ccw/src/tools/claude-cli-tools.ts +170 -56
  174. package/ccw/src/tools/cli-config-manager.ts +2 -33
  175. package/ccw/src/tools/cli-executor-core.ts +8 -2
  176. package/ccw/src/tools/cli-history-store.ts +92 -2
  177. package/ccw/src/tools/command-registry.ts +16 -1
  178. package/ccw/src/tools/generate-module-docs.ts +11 -7
  179. package/ccw/src/tools/litellm-executor.ts +13 -9
  180. package/ccw/src/types/skill-types.ts +99 -0
  181. package/package.json +1 -1
  182. package/.claude/commands/enhance-prompt.md +0 -93
  183. package/.claude/commands/memory/code-map-memory.md +0 -687
  184. package/.claude/commands/memory/docs.md +0 -615
  185. package/.claude/commands/memory/load-skill-memory.md +0 -182
  186. package/.claude/commands/memory/skill-memory.md +0 -525
  187. package/.claude/commands/memory/swagger-docs.md +0 -773
  188. package/.claude/commands/memory/tech-research-rules.md +0 -310
  189. package/.claude/commands/memory/workflow-skill-memory.md +0 -517
  190. package/.claude/commands/task/breakdown.md +0 -208
  191. package/.claude/commands/task/create.md +0 -152
  192. package/.claude/commands/task/execute.md +0 -270
  193. package/.claude/commands/task/replan.md +0 -441
  194. package/.claude/commands/version.md +0 -254
  195. package/.claude/commands/workflow/action-plan-verify.md +0 -485
  196. package/.claude/commands/workflow/brainstorm/api-designer.md +0 -587
  197. package/.claude/commands/workflow/brainstorm/data-architect.md +0 -220
  198. package/.claude/commands/workflow/brainstorm/product-manager.md +0 -200
  199. package/.claude/commands/workflow/brainstorm/product-owner.md +0 -200
  200. package/.claude/commands/workflow/brainstorm/scrum-master.md +0 -200
  201. package/.claude/commands/workflow/brainstorm/subject-matter-expert.md +0 -200
  202. package/.claude/commands/workflow/brainstorm/system-architect.md +0 -389
  203. package/.claude/commands/workflow/brainstorm/ui-designer.md +0 -221
  204. package/.claude/commands/workflow/brainstorm/ux-expert.md +0 -221
  205. package/.claude/commands/workflow/debug.md +0 -331
  206. package/.claude/commands/workflow/develop-with-file.md +0 -1044
  207. package/.claude/skills/ccw-loop/README.md +0 -303
  208. package/.claude/skills/skill-generator/templates/script-bash.md +0 -277
  209. package/.claude/skills/skill-generator/templates/script-python.md +0 -198
  210. package/.codex/prompts/debug.md +0 -318
  211. package/ccw/src/core/routes/mcp-routes.ts.backup +0 -549
@@ -482,6 +482,18 @@ function buildToolConfigModalContent(tool, config, models, status) {
482
482
  '</div>' +
483
483
  '</div>' +
484
484
 
485
+ // Available Models Section - Unified input with inline models
486
+ '<div class="tool-config-section">' +
487
+ '<h4>Available Models <span class="text-muted">(shown in dropdowns below)</span></h4>' +
488
+ '<div class="tags-unified-input" id="modelsUnifiedInput">' +
489
+ (config.availableModels || models).map(function(model) {
490
+ return '<span class="tag-item tag-model">' + escapeHtml(model) + '<button type="button" class="tag-remove" data-model="' + escapeHtml(model) + '">&times;</button></span>';
491
+ }).join('') +
492
+ '<input type="text" id="modelInput" class="tag-inline-input" placeholder="Enter model name and press Enter" />' +
493
+ '</div>' +
494
+ '<p class="text-muted text-xs mt-1"><i data-lucide="info" class="w-3 h-3"></i> Click × to remove, type to add new models</p>' +
495
+ '</div>' +
496
+
485
497
  // Primary Model Section
486
498
  '<div class="tool-config-section">' +
487
499
  '<h4>Primary Model <span class="text-muted">(CLI endpoint calls)</span></h4>' +
@@ -855,6 +867,8 @@ function closeFileBrowserModal(selectedPath) {
855
867
  function initToolConfigModalEvents(tool, currentConfig, models) {
856
868
  // Local tags state (copy from config)
857
869
  var currentTags = (currentConfig.tags || []).slice();
870
+ // Local available models state (copy from config or use defaults)
871
+ var currentModels = (currentConfig.availableModels || models).slice();
858
872
 
859
873
  // Helper to render tags inline with input
860
874
  function renderTags() {
@@ -896,6 +910,58 @@ function initToolConfigModalEvents(tool, currentConfig, models) {
896
910
  });
897
911
  }
898
912
 
913
+ // Helper to render available models inline with input
914
+ function renderModels() {
915
+ var container = document.getElementById('modelsUnifiedInput');
916
+ var input = document.getElementById('modelInput');
917
+ if (!container) return;
918
+
919
+ // Remove existing model items but keep the input
920
+ container.querySelectorAll('.tag-item').forEach(function(el) { el.remove(); });
921
+
922
+ // Insert models before the input
923
+ currentModels.forEach(function(model) {
924
+ var modelEl = document.createElement('span');
925
+ modelEl.className = 'tag-item tag-model';
926
+ modelEl.innerHTML = escapeHtml(model) + '<button type="button" class="tag-remove" data-model="' + escapeHtml(model) + '">&times;</button>';
927
+ container.insertBefore(modelEl, input);
928
+ });
929
+
930
+ // Re-attach remove handlers
931
+ container.querySelectorAll('.tag-remove').forEach(function(btn) {
932
+ btn.onclick = function(e) {
933
+ e.stopPropagation();
934
+ var modelToRemove = this.getAttribute('data-model');
935
+ currentModels = currentModels.filter(function(m) { return m !== modelToRemove; });
936
+ renderModels();
937
+ updateModelSelects();
938
+ };
939
+ });
940
+ }
941
+
942
+ // Helper to update model select dropdowns with current model list
943
+ function updateModelSelects() {
944
+ var primarySelect = document.getElementById('primaryModelSelect');
945
+ var secondarySelect = document.getElementById('secondaryModelSelect');
946
+ if (!primarySelect || !secondarySelect) return;
947
+
948
+ var primaryValue = primarySelect.value;
949
+ var secondaryValue = secondarySelect.value;
950
+
951
+ // Rebuild options
952
+ var buildOptions = function(selectedValue) {
953
+ var html = '';
954
+ currentModels.forEach(function(m) {
955
+ html += '<option value="' + escapeHtml(m) + '"' + (m === selectedValue ? ' selected' : '') + '>' + escapeHtml(m) + '</option>';
956
+ });
957
+ html += '<option value="__custom__"' + (selectedValue === '__custom__' ? ' selected' : '') + '>Custom...</option>';
958
+ return html;
959
+ };
960
+
961
+ primarySelect.innerHTML = buildOptions(primaryValue);
962
+ secondarySelect.innerHTML = buildOptions(secondaryValue);
963
+ }
964
+
899
965
  // Click on unified input container focuses the input
900
966
  var unifiedInput = document.getElementById('tagsUnifiedInput');
901
967
  if (unifiedInput) {
@@ -906,6 +972,16 @@ function initToolConfigModalEvents(tool, currentConfig, models) {
906
972
  };
907
973
  }
908
974
 
975
+ // Click on models unified input container focuses the input
976
+ var modelsUnifiedInput = document.getElementById('modelsUnifiedInput');
977
+ if (modelsUnifiedInput) {
978
+ modelsUnifiedInput.onclick = function(e) {
979
+ if (e.target === this) {
980
+ document.getElementById('modelInput').focus();
981
+ }
982
+ };
983
+ }
984
+
909
985
  // Tag input handler
910
986
  var tagInput = document.getElementById('tagInput');
911
987
  if (tagInput) {
@@ -933,8 +1009,27 @@ function initToolConfigModalEvents(tool, currentConfig, models) {
933
1009
  };
934
1010
  });
935
1011
 
1012
+ // Model input handler
1013
+ var modelInput = document.getElementById('modelInput');
1014
+ if (modelInput) {
1015
+ modelInput.onkeydown = function(e) {
1016
+ if (e.key === 'Enter') {
1017
+ e.preventDefault();
1018
+ var newModel = this.value.trim();
1019
+ if (newModel && currentModels.indexOf(newModel) === -1) {
1020
+ currentModels.push(newModel);
1021
+ renderModels();
1022
+ updateModelSelects();
1023
+ }
1024
+ this.value = '';
1025
+ }
1026
+ };
1027
+ }
1028
+
936
1029
  // Initialize tags display
937
1030
  renderTags();
1031
+ // Initialize models display
1032
+ renderModels();
938
1033
  // Initialize lucide icons for predefined buttons
939
1034
  if (window.lucide) lucide.createIcons();
940
1035
 
@@ -1020,6 +1115,11 @@ function initToolConfigModalEvents(tool, currentConfig, models) {
1020
1115
  return;
1021
1116
  }
1022
1117
 
1118
+ if (currentModels.length === 0) {
1119
+ showRefreshToast('At least one available model is required', 'error');
1120
+ return;
1121
+ }
1122
+
1023
1123
  // Get envFile value (only for gemini/qwen)
1024
1124
  var envFileInput = document.getElementById('envFileInput');
1025
1125
  var envFile = envFileInput ? envFileInput.value.trim() : '';
@@ -1028,6 +1128,7 @@ function initToolConfigModalEvents(tool, currentConfig, models) {
1028
1128
  var updateData = {
1029
1129
  primaryModel: primaryModel,
1030
1130
  secondaryModel: secondaryModel,
1131
+ availableModels: currentModels,
1031
1132
  tags: currentTags
1032
1133
  };
1033
1134
 
@@ -1512,6 +1613,9 @@ var chineseResponseEnabled = false;
1512
1613
  var chineseResponseLoading = false;
1513
1614
  var codexChineseResponseEnabled = false;
1514
1615
  var codexChineseResponseLoading = false;
1616
+ var codexChineseNeedsMigration = false; // Track if Codex needs migration from old @ reference
1617
+ var codexCliEnhancementEnabled = false;
1618
+ var codexCliEnhancementLoading = false;
1515
1619
  var windowsPlatformEnabled = false;
1516
1620
  var windowsPlatformLoading = false;
1517
1621
 
@@ -1523,12 +1627,14 @@ async function loadLanguageSettings() {
1523
1627
  var data = await response.json();
1524
1628
  chineseResponseEnabled = data.claudeEnabled || data.enabled || false;
1525
1629
  codexChineseResponseEnabled = data.codexEnabled || false;
1630
+ codexChineseNeedsMigration = data.codexNeedsMigration || false; // Track migration status
1526
1631
  return data;
1527
1632
  } catch (err) {
1528
1633
  console.error('Failed to load language settings:', err);
1529
1634
  chineseResponseEnabled = false;
1530
1635
  codexChineseResponseEnabled = false;
1531
- return { claudeEnabled: false, codexEnabled: false, guidelinesExists: false };
1636
+ codexChineseNeedsMigration = false;
1637
+ return { claudeEnabled: false, codexEnabled: false, codexNeedsMigration: false, guidelinesExists: false };
1532
1638
  }
1533
1639
  }
1534
1640
 
@@ -1546,6 +1652,20 @@ async function loadWindowsPlatformSettings() {
1546
1652
  }
1547
1653
  }
1548
1654
 
1655
+ async function loadCodexCliEnhancementSettings() {
1656
+ try {
1657
+ var response = await fetch('/api/language/codex-cli-enhancement');
1658
+ if (!response.ok) throw new Error('Failed to load Codex CLI enhancement settings');
1659
+ var data = await response.json();
1660
+ codexCliEnhancementEnabled = data.enabled || false;
1661
+ return data;
1662
+ } catch (err) {
1663
+ console.error('Failed to load Codex CLI enhancement settings:', err);
1664
+ codexCliEnhancementEnabled = false;
1665
+ return { enabled: false, guidelinesExists: false };
1666
+ }
1667
+ }
1668
+
1549
1669
  async function toggleChineseResponse(enabled, target) {
1550
1670
  // target: 'claude' (default) or 'codex'
1551
1671
  target = target || 'claude';
@@ -1591,6 +1711,11 @@ async function toggleChineseResponse(enabled, target) {
1591
1711
  var data = await response.json();
1592
1712
  if (isCodex) {
1593
1713
  codexChineseResponseEnabled = data.enabled;
1714
+ // Handle migration status
1715
+ if (data.migrated) {
1716
+ codexChineseNeedsMigration = false;
1717
+ showRefreshToast('Codex: 已从 @ 引用迁移到直接文本拼接', 'success');
1718
+ }
1594
1719
  } else {
1595
1720
  chineseResponseEnabled = data.enabled;
1596
1721
  }
@@ -1598,9 +1723,11 @@ async function toggleChineseResponse(enabled, target) {
1598
1723
  // Update UI
1599
1724
  renderLanguageSettingsSection();
1600
1725
 
1601
- // Show toast
1726
+ // Show toast (skip if migration message already shown)
1602
1727
  var toolName = isCodex ? 'Codex' : 'Claude';
1603
- showRefreshToast(toolName + ': ' + (enabled ? t('lang.enableSuccess') : t('lang.disableSuccess')), 'success');
1728
+ if (!data.migrated) {
1729
+ showRefreshToast(toolName + ': ' + (enabled ? t('lang.enableSuccess') : t('lang.disableSuccess')), 'success');
1730
+ }
1604
1731
  } catch (err) {
1605
1732
  console.error('Failed to toggle Chinese response:', err);
1606
1733
  // Error already shown in the !response.ok block
@@ -1662,6 +1789,95 @@ async function toggleWindowsPlatform(enabled) {
1662
1789
  }
1663
1790
  }
1664
1791
 
1792
+ async function toggleCodexCliEnhancement(enabled) {
1793
+ if (codexCliEnhancementLoading) return;
1794
+
1795
+ // Pre-check: verify CCW workflows are installed (only when enabling)
1796
+ if (enabled && typeof ccwInstallStatus !== 'undefined' && !ccwInstallStatus.installed) {
1797
+ var missingFile = ccwInstallStatus.missingFiles.find(function(f) { return f === 'cli-tools-usage.md'; });
1798
+ if (missingFile) {
1799
+ showRefreshToast(t('lang.installRequired'), 'warning');
1800
+ return;
1801
+ }
1802
+ }
1803
+
1804
+ codexCliEnhancementLoading = true;
1805
+
1806
+ try {
1807
+ var response = await fetch('/api/language/codex-cli-enhancement', {
1808
+ method: 'POST',
1809
+ headers: { 'Content-Type': 'application/json' },
1810
+ body: JSON.stringify({ enabled: enabled, action: 'toggle' })
1811
+ });
1812
+
1813
+ if (!response.ok) {
1814
+ var errData = await response.json();
1815
+ // Show specific error message from backend
1816
+ var errorMsg = errData.error || 'Failed to update setting';
1817
+ if (errorMsg.includes('not found')) {
1818
+ showRefreshToast(t('lang.installRequired'), 'warning');
1819
+ } else {
1820
+ showRefreshToast((enabled ? t('lang.enableFailed') : t('lang.disableFailed')) + ': ' + errorMsg, 'error');
1821
+ }
1822
+ throw new Error(errorMsg);
1823
+ }
1824
+
1825
+ var data = await response.json();
1826
+ codexCliEnhancementEnabled = data.enabled;
1827
+
1828
+ // Update UI
1829
+ renderLanguageSettingsSection();
1830
+
1831
+ // Show toast
1832
+ showRefreshToast('Codex CLI Enhancement: ' + (enabled ? t('lang.enableSuccess') : t('lang.disableSuccess')), 'success');
1833
+ } catch (err) {
1834
+ console.error('Failed to toggle Codex CLI enhancement:', err);
1835
+ // Error already shown in the !response.ok block
1836
+ } finally {
1837
+ codexCliEnhancementLoading = false;
1838
+ }
1839
+ }
1840
+
1841
+ async function refreshCodexCliEnhancement() {
1842
+ if (codexCliEnhancementLoading) return;
1843
+
1844
+ codexCliEnhancementLoading = true;
1845
+
1846
+ try {
1847
+ var response = await fetch('/api/language/codex-cli-enhancement', {
1848
+ method: 'POST',
1849
+ headers: { 'Content-Type': 'application/json' },
1850
+ body: JSON.stringify({ action: 'refresh' })
1851
+ });
1852
+
1853
+ if (!response.ok) {
1854
+ var errData = await response.json();
1855
+ var errorMsg = errData.error || 'Failed to refresh setting';
1856
+ if (errorMsg.includes('not found')) {
1857
+ showRefreshToast(t('lang.installRequired'), 'warning');
1858
+ } else if (errorMsg.includes('not enabled')) {
1859
+ showRefreshToast('CLI 调用增强未启用', 'warning');
1860
+ } else {
1861
+ showRefreshToast('刷新失败: ' + errorMsg, 'error');
1862
+ }
1863
+ throw new Error(errorMsg);
1864
+ }
1865
+
1866
+ var data = await response.json();
1867
+
1868
+ // Update UI
1869
+ renderLanguageSettingsSection();
1870
+
1871
+ // Show toast
1872
+ showRefreshToast('CLI 调用增强已刷新', 'success');
1873
+ } catch (err) {
1874
+ console.error('Failed to refresh Codex CLI enhancement:', err);
1875
+ // Error already shown in the !response.ok block
1876
+ } finally {
1877
+ codexCliEnhancementLoading = false;
1878
+ }
1879
+ }
1880
+
1665
1881
  async function renderLanguageSettingsSection() {
1666
1882
  var container = document.getElementById('language-settings-section');
1667
1883
  if (!container) return;
@@ -1673,6 +1889,9 @@ async function renderLanguageSettingsSection() {
1673
1889
  if (!windowsPlatformEnabled && !windowsPlatformLoading) {
1674
1890
  await loadWindowsPlatformSettings();
1675
1891
  }
1892
+ if (!codexCliEnhancementEnabled && !codexCliEnhancementLoading) {
1893
+ await loadCodexCliEnhancementSettings();
1894
+ }
1676
1895
 
1677
1896
  var settingsHtml = '<div class="section-header">' +
1678
1897
  '<div class="section-header-left">' +
@@ -1712,7 +1931,9 @@ async function renderLanguageSettingsSection() {
1712
1931
  (codexChineseResponseEnabled ? t('lang.enabled') : t('lang.disabled')) +
1713
1932
  '</span>' +
1714
1933
  '</div>' +
1715
- '<p class="cli-setting-desc">' + t('lang.chineseDescCodex') + '</p>' +
1934
+ '<p class="cli-setting-desc">' + t('lang.chineseDescCodex') +
1935
+ (codexChineseNeedsMigration ? '<br><span style="color: #f59e0b; font-size: 0.85em;">⚠️ 检测到旧格式(@引用),请关闭后重新启用以迁移到新格式</span>' : '') +
1936
+ '</p>' +
1716
1937
  '</div>' +
1717
1938
  // Windows Platform
1718
1939
  '<div class="cli-setting-item">' +
@@ -1731,6 +1952,30 @@ async function renderLanguageSettingsSection() {
1731
1952
  '</div>' +
1732
1953
  '<p class="cli-setting-desc">' + t('lang.windowsDesc') + '</p>' +
1733
1954
  '</div>' +
1955
+ // CLI Enhancement - Codex
1956
+ '<div class="cli-setting-item">' +
1957
+ '<label class="cli-setting-label">' +
1958
+ '<i data-lucide="terminal" class="w-3 h-3"></i>' +
1959
+ 'CLI 调用增强 <span class="badge badge-sm badge-secondary">Codex</span>' +
1960
+ '</label>' +
1961
+ '<div class="cli-setting-control">' +
1962
+ '<label class="cli-toggle">' +
1963
+ '<input type="checkbox"' + (codexCliEnhancementEnabled ? ' checked' : '') + ' onchange="toggleCodexCliEnhancement(this.checked)"' + (codexCliEnhancementLoading ? ' disabled' : '') + '>' +
1964
+ '<span class="cli-toggle-slider"></span>' +
1965
+ '</label>' +
1966
+ '<span class="cli-setting-status ' + (codexCliEnhancementEnabled ? 'enabled' : 'disabled') + '">' +
1967
+ (codexCliEnhancementEnabled ? t('lang.enabled') : t('lang.disabled')) +
1968
+ '</span>' +
1969
+ (codexCliEnhancementEnabled ?
1970
+ '<button class="btn-icon-sm" onclick="refreshCodexCliEnhancement()" title="刷新 CLI 配置"' + (codexCliEnhancementLoading ? ' disabled' : '') + '>' +
1971
+ '<i data-lucide="refresh-cw" class="w-3 h-3"></i>' +
1972
+ '</button>'
1973
+ : '') +
1974
+ '</div>' +
1975
+ '<p class="cli-setting-desc">为 Codex 启用多 CLI 工具调用功能,自动拼接 cli-tools-usage.md 和 cli-tools.json 配置' +
1976
+ (codexCliEnhancementEnabled ? '<br><span style="color: var(--text-muted); font-size: 0.85em;">💡 配置文件变更后,点击刷新按钮更新内容</span>' : '') +
1977
+ '</p>' +
1978
+ '</div>' +
1734
1979
  '</div>';
1735
1980
 
1736
1981
  container.innerHTML = settingsHtml;