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.
- package/.claude/CLAUDE.md +6 -8
- package/.claude/agents/action-planning-agent.md +28 -45
- package/.claude/agents/cli-lite-planning-agent.md +93 -1
- package/.claude/agents/code-developer.md +144 -27
- package/.claude/commands/ccw-coordinator.md +175 -21
- package/.claude/commands/ccw-debug.md +832 -0
- package/.claude/commands/ccw.md +90 -9
- package/.claude/commands/cli/cli-init.md +1 -0
- package/.claude/commands/issue/convert-to-plan.md +718 -0
- package/.claude/commands/issue/from-brainstorm.md +382 -0
- package/.claude/commands/memory/tips.md +332 -0
- package/.claude/commands/workflow/analyze-with-file.md +804 -0
- package/.claude/commands/workflow/brainstorm/auto-parallel.md +18 -43
- package/.claude/commands/workflow/brainstorm/role-analysis.md +705 -0
- package/.claude/commands/workflow/brainstorm-with-file.md +1153 -0
- package/.claude/commands/workflow/debug-with-file.md +7 -5
- package/.claude/commands/workflow/execute.md +6 -4
- package/.claude/commands/workflow/lite-plan.md +2 -2
- package/.claude/commands/workflow/plan-verify.md +162 -327
- package/.claude/commands/workflow/plan.md +162 -26
- package/.claude/commands/workflow/replan.md +78 -2
- package/.claude/commands/workflow/{review-fix.md → review-cycle-fix.md} +6 -6
- package/.claude/commands/workflow/review-module-cycle.md +2 -2
- package/.claude/commands/workflow/review-session-cycle.md +2 -2
- package/.claude/commands/workflow/tools/conflict-resolution.md +16 -26
- package/.claude/commands/workflow/tools/context-gather.md +81 -118
- package/.claude/commands/workflow/tools/task-generate-agent.md +94 -10
- package/.claude/skills/ccw-help/command.json +4 -4
- package/.claude/skills/lite-skill-generator/SKILL.md +650 -0
- package/.claude/skills/lite-skill-generator/templates/simple-skill.md +68 -0
- package/.claude/skills/lite-skill-generator/templates/style-guide.md +64 -0
- package/.claude/skills/skill-generator/SKILL.md +277 -85
- package/.claude/skills/skill-generator/phases/01-requirements-discovery.md +4 -15
- package/.claude/skills/skill-generator/phases/02-structure-generation.md +72 -17
- package/.claude/skills/skill-generator/phases/03-phase-generation.md +218 -51
- package/.claude/skills/skill-generator/phases/04-specs-templates.md +111 -41
- package/.claude/skills/skill-generator/phases/05-validation.md +139 -56
- package/.claude/skills/skill-generator/templates/autonomous-action.md +78 -268
- package/.claude/skills/skill-generator/templates/autonomous-orchestrator.md +14 -0
- package/.claude/skills/skill-generator/templates/code-analysis-action.md +12 -0
- package/.claude/skills/skill-generator/templates/llm-action.md +12 -0
- package/.claude/skills/skill-generator/templates/script-template.md +368 -0
- package/.claude/skills/skill-generator/templates/sequential-phase.md +14 -0
- package/.claude/skills/skill-generator/templates/skill-md.md +14 -0
- package/.claude/skills/skill-tuning/SKILL.md +130 -266
- package/.claude/skills/skill-tuning/phases/orchestrator.md +95 -283
- package/.claude/skills/skill-tuning/specs/problem-taxonomy.md +90 -198
- package/.claude/skills/skill-tuning/specs/tuning-strategies.md +193 -1345
- package/.claude/workflows/cli-templates/schemas/plan-verify-agent-schema.json +47 -0
- package/.claude/workflows/cli-templates/schemas/verify-json-schema.json +158 -0
- package/.claude/workflows/cli-tools-usage.md +1 -1
- package/.codex/AGENTS.md +1 -3
- package/.codex/prompts/analyze-with-file.md +607 -0
- package/.codex/prompts/brainstorm-to-cycle.md +455 -0
- package/.codex/prompts/brainstorm-with-file.md +933 -0
- package/.codex/prompts/debug-with-file.md +15 -20
- package/.codex/skills/ccw-cli-tools/SKILL.md +559 -0
- package/ccw/dist/commands/cli.d.ts.map +1 -1
- package/ccw/dist/commands/cli.js +29 -5
- package/ccw/dist/commands/cli.js.map +1 -1
- package/ccw/dist/commands/issue.d.ts +2 -0
- package/ccw/dist/commands/issue.d.ts.map +1 -1
- package/ccw/dist/commands/issue.js +62 -20
- package/ccw/dist/commands/issue.js.map +1 -1
- package/ccw/dist/config/litellm-api-config-manager.d.ts.map +1 -1
- package/ccw/dist/config/litellm-api-config-manager.js +5 -3
- package/ccw/dist/config/litellm-api-config-manager.js.map +1 -1
- package/ccw/dist/config/litellm-provider-models.d.ts +73 -0
- package/ccw/dist/config/litellm-provider-models.d.ts.map +1 -0
- package/ccw/dist/config/litellm-provider-models.js +172 -0
- package/ccw/dist/config/litellm-provider-models.js.map +1 -0
- package/ccw/dist/config/provider-models.d.ts +25 -51
- package/ccw/dist/config/provider-models.d.ts.map +1 -1
- package/ccw/dist/config/provider-models.js +84 -149
- package/ccw/dist/config/provider-models.js.map +1 -1
- package/ccw/dist/config/storage-paths.d.ts.map +1 -1
- package/ccw/dist/config/storage-paths.js +23 -5
- package/ccw/dist/config/storage-paths.js.map +1 -1
- package/ccw/dist/core/auth/csrf-middleware.js +3 -3
- package/ccw/dist/core/auth/csrf-middleware.js.map +1 -1
- package/ccw/dist/core/dashboard-generator.d.ts.map +1 -1
- package/ccw/dist/core/dashboard-generator.js +3 -1
- package/ccw/dist/core/dashboard-generator.js.map +1 -1
- package/ccw/dist/core/routes/claude-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/claude-routes.js +206 -14
- package/ccw/dist/core/routes/claude-routes.js.map +1 -1
- package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/cli-routes.js.map +1 -1
- package/ccw/dist/core/routes/commands-routes.d.ts +7 -0
- package/ccw/dist/core/routes/commands-routes.d.ts.map +1 -0
- package/ccw/dist/core/routes/commands-routes.js +480 -0
- package/ccw/dist/core/routes/commands-routes.js.map +1 -0
- package/ccw/dist/core/routes/model-routes.d.ts +11 -0
- package/ccw/dist/core/routes/model-routes.d.ts.map +1 -0
- package/ccw/dist/core/routes/model-routes.js +112 -0
- package/ccw/dist/core/routes/model-routes.js.map +1 -0
- package/ccw/dist/core/routes/nav-status-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/nav-status-routes.js +84 -1
- package/ccw/dist/core/routes/nav-status-routes.js.map +1 -1
- package/ccw/dist/core/routes/provider-routes.d.ts +11 -0
- package/ccw/dist/core/routes/provider-routes.d.ts.map +1 -0
- package/ccw/dist/core/routes/provider-routes.js +67 -0
- package/ccw/dist/core/routes/provider-routes.js.map +1 -0
- package/ccw/dist/core/routes/skills-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/skills-routes.js +219 -7
- package/ccw/dist/core/routes/skills-routes.js.map +1 -1
- package/ccw/dist/core/routes/system-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/system-routes.js +58 -6
- package/ccw/dist/core/routes/system-routes.js.map +1 -1
- package/ccw/dist/core/server.d.ts.map +1 -1
- package/ccw/dist/core/server.js +13 -0
- package/ccw/dist/core/server.js.map +1 -1
- package/ccw/dist/mcp-server/index.js +2 -2
- package/ccw/dist/mcp-server/index.js.map +1 -1
- package/ccw/dist/tools/claude-cli-tools.d.ts +48 -11
- package/ccw/dist/tools/claude-cli-tools.d.ts.map +1 -1
- package/ccw/dist/tools/claude-cli-tools.js +146 -50
- package/ccw/dist/tools/claude-cli-tools.js.map +1 -1
- package/ccw/dist/tools/cli-config-manager.d.ts +1 -13
- package/ccw/dist/tools/cli-config-manager.d.ts.map +1 -1
- package/ccw/dist/tools/cli-config-manager.js +3 -27
- package/ccw/dist/tools/cli-config-manager.js.map +1 -1
- package/ccw/dist/tools/cli-executor-core.d.ts.map +1 -1
- package/ccw/dist/tools/cli-executor-core.js +7 -2
- package/ccw/dist/tools/cli-executor-core.js.map +1 -1
- package/ccw/dist/tools/cli-executor-state.d.ts.map +1 -1
- package/ccw/dist/tools/cli-history-store.d.ts +11 -0
- package/ccw/dist/tools/cli-history-store.d.ts.map +1 -1
- package/ccw/dist/tools/cli-history-store.js +82 -2
- package/ccw/dist/tools/cli-history-store.js.map +1 -1
- package/ccw/dist/tools/command-registry.d.ts +7 -0
- package/ccw/dist/tools/command-registry.d.ts.map +1 -1
- package/ccw/dist/tools/command-registry.js +14 -1
- package/ccw/dist/tools/command-registry.js.map +1 -1
- package/ccw/dist/tools/generate-module-docs.d.ts.map +1 -1
- package/ccw/dist/tools/generate-module-docs.js +11 -7
- package/ccw/dist/tools/generate-module-docs.js.map +1 -1
- package/ccw/dist/tools/litellm-executor.d.ts +1 -0
- package/ccw/dist/tools/litellm-executor.d.ts.map +1 -1
- package/ccw/dist/tools/litellm-executor.js +11 -9
- package/ccw/dist/tools/litellm-executor.js.map +1 -1
- package/ccw/dist/types/skill-types.d.ts +97 -0
- package/ccw/dist/types/skill-types.d.ts.map +1 -0
- package/ccw/dist/types/skill-types.js +6 -0
- package/ccw/dist/types/skill-types.js.map +1 -0
- package/ccw/src/commands/cli.ts +36 -5
- package/ccw/src/commands/issue.ts +81 -26
- package/ccw/src/config/litellm-api-config-manager.ts +5 -3
- package/ccw/src/config/litellm-provider-models.ts +222 -0
- package/ccw/src/config/provider-models.ts +91 -190
- package/ccw/src/config/storage-paths.ts +20 -5
- package/ccw/src/core/auth/csrf-middleware.ts +3 -3
- package/ccw/src/core/dashboard-generator.ts +3 -1
- package/ccw/src/core/routes/claude-routes.ts +233 -15
- package/ccw/src/core/routes/cli-routes.ts +2 -3
- package/ccw/src/core/routes/commands-routes.ts +620 -0
- package/ccw/src/core/routes/nav-status-routes.ts +95 -1
- package/ccw/src/core/routes/provider-routes.ts +78 -0
- package/ccw/src/core/routes/skills-routes.ts +266 -45
- package/ccw/src/core/routes/system-routes.ts +102 -50
- package/ccw/src/core/server.ts +13 -0
- package/ccw/src/mcp-server/index.ts +2 -2
- package/ccw/src/templates/dashboard-css/18-cli-settings.css +35 -0
- package/ccw/src/templates/dashboard-css/37-commands.css +193 -0
- package/ccw/src/templates/dashboard-js/components/navigation.js +4 -0
- package/ccw/src/templates/dashboard-js/i18n.js +116 -0
- package/ccw/src/templates/dashboard-js/views/cli-manager.js +249 -4
- package/ccw/src/templates/dashboard-js/views/commands-manager.js +503 -0
- package/ccw/src/templates/dashboard-js/views/issue-manager.js +7 -7
- package/ccw/src/templates/dashboard-js/views/mcp-manager.js +2 -7
- package/ccw/src/templates/dashboard-js/views/skills-manager.js +164 -23
- package/ccw/src/templates/dashboard.html +7 -0
- package/ccw/src/tools/claude-cli-tools.ts +170 -56
- package/ccw/src/tools/cli-config-manager.ts +2 -33
- package/ccw/src/tools/cli-executor-core.ts +8 -2
- package/ccw/src/tools/cli-history-store.ts +92 -2
- package/ccw/src/tools/command-registry.ts +16 -1
- package/ccw/src/tools/generate-module-docs.ts +11 -7
- package/ccw/src/tools/litellm-executor.ts +13 -9
- package/ccw/src/types/skill-types.ts +99 -0
- package/package.json +1 -1
- package/.claude/commands/enhance-prompt.md +0 -93
- package/.claude/commands/memory/code-map-memory.md +0 -687
- package/.claude/commands/memory/docs.md +0 -615
- package/.claude/commands/memory/load-skill-memory.md +0 -182
- package/.claude/commands/memory/skill-memory.md +0 -525
- package/.claude/commands/memory/swagger-docs.md +0 -773
- package/.claude/commands/memory/tech-research-rules.md +0 -310
- package/.claude/commands/memory/workflow-skill-memory.md +0 -517
- package/.claude/commands/task/breakdown.md +0 -208
- package/.claude/commands/task/create.md +0 -152
- package/.claude/commands/task/execute.md +0 -270
- package/.claude/commands/task/replan.md +0 -441
- package/.claude/commands/version.md +0 -254
- package/.claude/commands/workflow/action-plan-verify.md +0 -485
- package/.claude/commands/workflow/brainstorm/api-designer.md +0 -587
- 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/system-architect.md +0 -389
- package/.claude/commands/workflow/brainstorm/ui-designer.md +0 -221
- package/.claude/commands/workflow/brainstorm/ux-expert.md +0 -221
- package/.claude/commands/workflow/debug.md +0 -331
- package/.claude/commands/workflow/develop-with-file.md +0 -1044
- package/.claude/skills/ccw-loop/README.md +0 -303
- package/.claude/skills/skill-generator/templates/script-bash.md +0 -277
- package/.claude/skills/skill-generator/templates/script-python.md +0 -198
- package/.codex/prompts/debug.md +0 -318
- 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) + '">×</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) + '">×</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
|
-
|
|
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
|
-
|
|
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') +
|
|
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;
|