claude-code-workflow 6.3.27 → 6.3.28
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 +7 -1
- package/.claude/agents/action-planning-agent.md +1 -0
- package/.claude/agents/cli-discuss-agent.md +391 -0
- package/.claude/agents/cli-execution-agent.md +2 -0
- package/.claude/agents/cli-explore-agent.md +2 -1
- package/.claude/agents/cli-lite-planning-agent.md +1 -0
- package/.claude/agents/cli-planning-agent.md +1 -0
- package/.claude/agents/code-developer.md +1 -0
- package/.claude/agents/conceptual-planning-agent.md +2 -0
- package/.claude/agents/context-search-agent.md +1 -0
- package/.claude/agents/debug-explore-agent.md +2 -0
- package/.claude/agents/doc-generator.md +1 -0
- package/.claude/agents/issue-plan-agent.md +2 -1
- package/.claude/agents/issue-queue-agent.md +2 -1
- package/.claude/agents/memory-bridge.md +2 -0
- package/.claude/agents/test-context-search-agent.md +2 -0
- package/.claude/agents/test-fix-agent.md +1 -0
- package/.claude/agents/ui-design-agent.md +2 -0
- package/.claude/agents/universal-executor.md +1 -0
- package/.claude/commands/issue/execute.md +141 -163
- package/.claude/commands/workflow/lite-lite-lite.md +798 -0
- package/.claude/commands/workflow/multi-cli-plan.md +510 -0
- package/.claude/skills/ccw/SKILL.md +262 -372
- package/.claude/skills/ccw/command.json +547 -0
- package/.claude/skills/ccw-help/SKILL.md +46 -107
- package/.claude/skills/ccw-help/command.json +511 -0
- package/.claude/skills/skill-tuning/SKILL.md +303 -0
- package/.claude/skills/skill-tuning/phases/actions/action-abort.md +164 -0
- package/.claude/skills/skill-tuning/phases/actions/action-analyze-requirements.md +406 -0
- package/.claude/skills/skill-tuning/phases/actions/action-apply-fix.md +206 -0
- package/.claude/skills/skill-tuning/phases/actions/action-complete.md +195 -0
- package/.claude/skills/skill-tuning/phases/actions/action-diagnose-agent.md +317 -0
- package/.claude/skills/skill-tuning/phases/actions/action-diagnose-context.md +243 -0
- package/.claude/skills/skill-tuning/phases/actions/action-diagnose-dataflow.md +318 -0
- package/.claude/skills/skill-tuning/phases/actions/action-diagnose-docs.md +299 -0
- package/.claude/skills/skill-tuning/phases/actions/action-diagnose-memory.md +269 -0
- package/.claude/skills/skill-tuning/phases/actions/action-diagnose-token-consumption.md +200 -0
- package/.claude/skills/skill-tuning/phases/actions/action-gemini-analysis.md +322 -0
- package/.claude/skills/skill-tuning/phases/actions/action-generate-report.md +228 -0
- package/.claude/skills/skill-tuning/phases/actions/action-init.md +149 -0
- package/.claude/skills/skill-tuning/phases/actions/action-propose-fixes.md +317 -0
- package/.claude/skills/skill-tuning/phases/actions/action-verify.md +222 -0
- package/.claude/skills/skill-tuning/phases/orchestrator.md +377 -0
- package/.claude/skills/skill-tuning/phases/state-schema.md +378 -0
- package/.claude/skills/skill-tuning/specs/category-mappings.json +284 -0
- package/.claude/skills/skill-tuning/specs/dimension-mapping.md +212 -0
- package/.claude/skills/skill-tuning/specs/problem-taxonomy.md +318 -0
- package/.claude/skills/skill-tuning/specs/quality-gates.md +263 -0
- package/.claude/skills/skill-tuning/specs/skill-authoring-principles.md +189 -0
- package/.claude/skills/skill-tuning/specs/tuning-strategies.md +1537 -0
- package/.claude/skills/skill-tuning/templates/diagnosis-report.md +153 -0
- package/.claude/skills/skill-tuning/templates/fix-proposal.md +204 -0
- package/.claude/workflows/cli-templates/schemas/multi-cli-discussion-schema.json +421 -0
- package/.claude/workflows/cli-tools-usage.md +0 -41
- package/ccw/dist/core/data-aggregator.d.ts +2 -0
- package/ccw/dist/core/data-aggregator.d.ts.map +1 -1
- package/ccw/dist/core/data-aggregator.js +5 -2
- package/ccw/dist/core/data-aggregator.js.map +1 -1
- package/ccw/dist/core/lite-scanner.d.ts +2 -1
- package/ccw/dist/core/lite-scanner.d.ts.map +1 -1
- package/ccw/dist/core/lite-scanner.js +295 -6
- package/ccw/dist/core/lite-scanner.js.map +1 -1
- package/ccw/dist/core/routes/session-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/session-routes.js +166 -48
- package/ccw/dist/core/routes/session-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 +87 -0
- package/ccw/dist/core/routes/system-routes.js.map +1 -1
- package/ccw/dist/core/server.js +2 -2
- package/ccw/dist/core/server.js.map +1 -1
- package/ccw/scripts/IMPLEMENTATION-SUMMARY.md +226 -0
- package/ccw/scripts/QUICK-REFERENCE.md +135 -0
- package/ccw/scripts/README-memory-embedder.md +157 -0
- package/ccw/scripts/__pycache__/memory_embedder.cpython-313.pyc +0 -0
- package/ccw/scripts/__pycache__/test_memory_embedder.cpython-313-pytest-8.4.2.pyc +0 -0
- package/ccw/scripts/memory-embedder-example.ts +184 -0
- package/ccw/scripts/memory_embedder.py +428 -0
- package/ccw/scripts/test_memory_embedder.py +245 -0
- package/ccw/src/core/data-aggregator.ts +7 -2
- package/ccw/src/core/lite-scanner.ts +440 -6
- package/ccw/src/core/routes/session-routes.ts +201 -48
- package/ccw/src/core/routes/system-routes.ts +102 -0
- package/ccw/src/core/server.ts +2 -2
- package/ccw/src/templates/dashboard-css/01-base.css +8 -0
- package/ccw/src/templates/dashboard-css/02-session.css +81 -0
- package/ccw/src/templates/dashboard-css/04-lite-tasks.css +2442 -0
- package/ccw/src/templates/dashboard-css/21-cli-toolmgmt.css +157 -0
- package/ccw/src/templates/dashboard-css/32-issue-manager.css +23 -0
- package/ccw/src/templates/dashboard-js/components/cli-stream-viewer.js +38 -4
- package/ccw/src/templates/dashboard-js/components/hook-manager.js +38 -13
- package/ccw/src/templates/dashboard-js/components/navigation.js +24 -4
- package/ccw/src/templates/dashboard-js/i18n.js +178 -4
- package/ccw/src/templates/dashboard-js/views/api-settings.js +32 -0
- package/ccw/src/templates/dashboard-js/views/claude-manager.js +44 -3
- package/ccw/src/templates/dashboard-js/views/cli-manager.js +303 -31
- package/ccw/src/templates/dashboard-js/views/history.js +44 -6
- package/ccw/src/templates/dashboard-js/views/home.js +1 -0
- package/ccw/src/templates/dashboard-js/views/issue-manager.js +54 -7
- package/ccw/src/templates/dashboard-js/views/lite-tasks.js +1817 -4
- package/ccw/src/templates/dashboard.html +5 -0
- package/package.json +2 -1
- package/.claude/skills/ccw/index/command-capabilities.json +0 -127
- package/.claude/skills/ccw/index/intent-rules.json +0 -136
- package/.claude/skills/ccw/index/workflow-chains.json +0 -451
- package/.claude/skills/ccw/phases/actions/bugfix.md +0 -218
- package/.claude/skills/ccw/phases/actions/coupled.md +0 -194
- package/.claude/skills/ccw/phases/actions/docs.md +0 -93
- package/.claude/skills/ccw/phases/actions/full.md +0 -154
- package/.claude/skills/ccw/phases/actions/issue.md +0 -201
- package/.claude/skills/ccw/phases/actions/rapid.md +0 -104
- package/.claude/skills/ccw/phases/actions/review-fix.md +0 -84
- package/.claude/skills/ccw/phases/actions/tdd.md +0 -66
- package/.claude/skills/ccw/phases/actions/ui.md +0 -79
- package/.claude/skills/ccw/phases/orchestrator.md +0 -435
- package/.claude/skills/ccw/specs/intent-classification.md +0 -336
- package/.claude/skills/ccw-help/index/all-agents.json +0 -82
- package/.claude/skills/ccw-help/index/all-commands.json +0 -882
- package/.claude/skills/ccw-help/index/by-category.json +0 -914
- package/.claude/skills/ccw-help/index/by-use-case.json +0 -896
- package/.claude/skills/ccw-help/index/command-relationships.json +0 -160
- package/.claude/skills/ccw-help/index/essential-commands.json +0 -112
|
@@ -661,3 +661,160 @@
|
|
|
661
661
|
color: hsl(var(--success));
|
|
662
662
|
}
|
|
663
663
|
|
|
664
|
+
/* ========================================
|
|
665
|
+
* File Browser Modal
|
|
666
|
+
* ======================================== */
|
|
667
|
+
|
|
668
|
+
.file-browser-modal {
|
|
669
|
+
width: 600px;
|
|
670
|
+
max-width: 90vw;
|
|
671
|
+
max-height: 80vh;
|
|
672
|
+
display: flex;
|
|
673
|
+
flex-direction: column;
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
.file-browser-toolbar {
|
|
677
|
+
display: flex;
|
|
678
|
+
align-items: center;
|
|
679
|
+
gap: 0.5rem;
|
|
680
|
+
padding: 0.5rem;
|
|
681
|
+
background: hsl(var(--muted) / 0.3);
|
|
682
|
+
border-radius: 0.375rem;
|
|
683
|
+
margin-bottom: 0.75rem;
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
.file-browser-toolbar .btn-sm {
|
|
687
|
+
flex-shrink: 0;
|
|
688
|
+
padding: 0.375rem;
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
.file-browser-path {
|
|
692
|
+
flex: 1;
|
|
693
|
+
padding: 0.375rem 0.5rem;
|
|
694
|
+
font-family: monospace;
|
|
695
|
+
font-size: 0.75rem;
|
|
696
|
+
background: hsl(var(--background));
|
|
697
|
+
border: 1px solid hsl(var(--border));
|
|
698
|
+
border-radius: 0.25rem;
|
|
699
|
+
color: hsl(var(--foreground));
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
.file-browser-path:focus {
|
|
703
|
+
outline: none;
|
|
704
|
+
border-color: hsl(var(--primary));
|
|
705
|
+
box-shadow: 0 0 0 2px hsl(var(--primary) / 0.2);
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
.file-browser-drives {
|
|
709
|
+
display: flex;
|
|
710
|
+
gap: 0.25rem;
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
.btn-xs {
|
|
714
|
+
padding: 0.25rem 0.5rem;
|
|
715
|
+
font-size: 0.6875rem;
|
|
716
|
+
border-radius: 0.25rem;
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
.drive-btn {
|
|
720
|
+
font-family: monospace;
|
|
721
|
+
font-weight: 600;
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
.file-browser-hidden-toggle {
|
|
725
|
+
display: flex;
|
|
726
|
+
align-items: center;
|
|
727
|
+
gap: 0.375rem;
|
|
728
|
+
font-size: 0.75rem;
|
|
729
|
+
color: hsl(var(--muted-foreground));
|
|
730
|
+
cursor: pointer;
|
|
731
|
+
white-space: nowrap;
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
.file-browser-hidden-toggle input {
|
|
735
|
+
cursor: pointer;
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
.file-browser-list {
|
|
739
|
+
flex: 1;
|
|
740
|
+
min-height: 300px;
|
|
741
|
+
max-height: 400px;
|
|
742
|
+
overflow-y: auto;
|
|
743
|
+
border: 1px solid hsl(var(--border));
|
|
744
|
+
border-radius: 0.375rem;
|
|
745
|
+
background: hsl(var(--background));
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
.file-browser-loading,
|
|
749
|
+
.file-browser-empty {
|
|
750
|
+
display: flex;
|
|
751
|
+
align-items: center;
|
|
752
|
+
justify-content: center;
|
|
753
|
+
height: 100%;
|
|
754
|
+
min-height: 200px;
|
|
755
|
+
color: hsl(var(--muted-foreground));
|
|
756
|
+
font-size: 0.875rem;
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
.file-browser-error {
|
|
760
|
+
display: flex;
|
|
761
|
+
flex-direction: column;
|
|
762
|
+
align-items: center;
|
|
763
|
+
justify-content: center;
|
|
764
|
+
height: 100%;
|
|
765
|
+
min-height: 200px;
|
|
766
|
+
font-size: 0.875rem;
|
|
767
|
+
text-align: center;
|
|
768
|
+
padding: 1rem;
|
|
769
|
+
gap: 0.5rem;
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
.file-browser-error p {
|
|
773
|
+
margin: 0;
|
|
774
|
+
color: hsl(var(--destructive));
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
.file-browser-hint {
|
|
778
|
+
color: hsl(var(--muted-foreground));
|
|
779
|
+
font-size: 0.8rem;
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
.file-browser-item {
|
|
783
|
+
display: flex;
|
|
784
|
+
align-items: center;
|
|
785
|
+
gap: 0.5rem;
|
|
786
|
+
padding: 0.5rem 0.75rem;
|
|
787
|
+
cursor: pointer;
|
|
788
|
+
border-bottom: 1px solid hsl(var(--border) / 0.5);
|
|
789
|
+
transition: background-color 0.15s;
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
.file-browser-item:last-child {
|
|
793
|
+
border-bottom: none;
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
.file-browser-item:hover {
|
|
797
|
+
background: hsl(var(--muted) / 0.5);
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
.file-browser-item.selected {
|
|
801
|
+
background: hsl(var(--primary) / 0.15);
|
|
802
|
+
border-color: hsl(var(--primary) / 0.3);
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
.file-browser-item.is-directory {
|
|
806
|
+
color: hsl(var(--primary));
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
.file-browser-item.is-file {
|
|
810
|
+
color: hsl(var(--foreground));
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
.file-browser-item-name {
|
|
814
|
+
flex: 1;
|
|
815
|
+
font-size: 0.8125rem;
|
|
816
|
+
overflow: hidden;
|
|
817
|
+
text-overflow: ellipsis;
|
|
818
|
+
white-space: nowrap;
|
|
819
|
+
}
|
|
820
|
+
|
|
@@ -128,6 +128,29 @@
|
|
|
128
128
|
box-shadow: 0 4px 12px hsl(var(--foreground) / 0.08);
|
|
129
129
|
}
|
|
130
130
|
|
|
131
|
+
/* Archived Issue Card */
|
|
132
|
+
.issue-card.archived {
|
|
133
|
+
opacity: 0.85;
|
|
134
|
+
background: hsl(var(--muted) / 0.3);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.issue-card.archived:hover {
|
|
138
|
+
opacity: 1;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
.issue-archived-badge {
|
|
142
|
+
display: inline-flex;
|
|
143
|
+
align-items: center;
|
|
144
|
+
padding: 0.125rem 0.375rem;
|
|
145
|
+
background: hsl(var(--muted));
|
|
146
|
+
color: hsl(var(--muted-foreground));
|
|
147
|
+
font-size: 0.625rem;
|
|
148
|
+
font-weight: 500;
|
|
149
|
+
border-radius: 0.25rem;
|
|
150
|
+
text-transform: uppercase;
|
|
151
|
+
letter-spacing: 0.025em;
|
|
152
|
+
}
|
|
153
|
+
|
|
131
154
|
.issue-card-header {
|
|
132
155
|
display: flex;
|
|
133
156
|
align-items: flex-start;
|
|
@@ -3,6 +3,12 @@
|
|
|
3
3
|
* Real-time streaming output viewer for CLI executions
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
+
// ===== Lifecycle Management =====
|
|
7
|
+
let cliStreamViewerDestroy = null;
|
|
8
|
+
let streamKeyboardHandler = null;
|
|
9
|
+
let streamScrollHandler = null; // Track scroll listener
|
|
10
|
+
let streamStatusTimers = []; // Track status update timers
|
|
11
|
+
|
|
6
12
|
// ===== State Management =====
|
|
7
13
|
let cliStreamExecutions = {}; // { executionId: { tool, mode, output, status, startTime, endTime } }
|
|
8
14
|
let activeStreamTab = null;
|
|
@@ -91,7 +97,7 @@ async function syncActiveExecutions() {
|
|
|
91
97
|
// ===== Initialization =====
|
|
92
98
|
function initCliStreamViewer() {
|
|
93
99
|
// Initialize keyboard shortcuts
|
|
94
|
-
|
|
100
|
+
streamKeyboardHandler = function(e) {
|
|
95
101
|
if (e.key === 'Escape' && isCliStreamViewerOpen) {
|
|
96
102
|
if (searchFilter) {
|
|
97
103
|
clearSearch();
|
|
@@ -108,12 +114,14 @@ function initCliStreamViewer() {
|
|
|
108
114
|
searchInput.select();
|
|
109
115
|
}
|
|
110
116
|
}
|
|
111
|
-
}
|
|
117
|
+
};
|
|
118
|
+
document.addEventListener('keydown', streamKeyboardHandler);
|
|
112
119
|
|
|
113
120
|
// Initialize scroll detection for auto-scroll
|
|
114
121
|
const content = document.getElementById('cliStreamContent');
|
|
115
122
|
if (content) {
|
|
116
|
-
|
|
123
|
+
streamScrollHandler = handleStreamContentScroll;
|
|
124
|
+
content.addEventListener('scroll', streamScrollHandler);
|
|
117
125
|
}
|
|
118
126
|
|
|
119
127
|
// Sync active executions from server (recover state for mid-execution joins)
|
|
@@ -592,11 +600,12 @@ function renderStreamStatus(executionId) {
|
|
|
592
600
|
|
|
593
601
|
// Update duration periodically for running executions
|
|
594
602
|
if (exec.status === 'running') {
|
|
595
|
-
setTimeout(() => {
|
|
603
|
+
const timerId = setTimeout(() => {
|
|
596
604
|
if (activeStreamTab === executionId && cliStreamExecutions[executionId]?.status === 'running') {
|
|
597
605
|
renderStreamStatus(executionId);
|
|
598
606
|
}
|
|
599
607
|
}, 1000);
|
|
608
|
+
streamStatusTimers.push(timerId);
|
|
600
609
|
}
|
|
601
610
|
}
|
|
602
611
|
|
|
@@ -760,6 +769,31 @@ if (document.readyState === 'loading') {
|
|
|
760
769
|
initCliStreamViewer();
|
|
761
770
|
}
|
|
762
771
|
|
|
772
|
+
// ===== Lifecycle Functions =====
|
|
773
|
+
function destroyCliStreamViewer() {
|
|
774
|
+
// Remove keyboard event listener if exists
|
|
775
|
+
if (streamKeyboardHandler) {
|
|
776
|
+
document.removeEventListener('keydown', streamKeyboardHandler);
|
|
777
|
+
streamKeyboardHandler = null;
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
// Remove scroll event listener if exists
|
|
781
|
+
if (streamScrollHandler) {
|
|
782
|
+
const content = document.getElementById('cliStreamContent');
|
|
783
|
+
if (content) {
|
|
784
|
+
content.removeEventListener('scroll', streamScrollHandler);
|
|
785
|
+
}
|
|
786
|
+
streamScrollHandler = null;
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
// Clear all pending status update timers
|
|
790
|
+
streamStatusTimers.forEach(timerId => clearTimeout(timerId));
|
|
791
|
+
streamStatusTimers = [];
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
// Export lifecycle functions
|
|
795
|
+
window.destroyCliStreamViewer = destroyCliStreamViewer;
|
|
796
|
+
|
|
763
797
|
// ===== Global Exposure =====
|
|
764
798
|
window.toggleCliStreamViewer = toggleCliStreamViewer;
|
|
765
799
|
window.handleCliStreamStarted = handleCliStreamStarted;
|
|
@@ -359,48 +359,73 @@ async function loadAvailableSkills() {
|
|
|
359
359
|
* Convert internal hook format to Claude Code format
|
|
360
360
|
* Internal: { command, args, matcher, timeout }
|
|
361
361
|
* Claude Code: { matcher, hooks: [{ type: "command", command: "...", timeout }] }
|
|
362
|
+
*
|
|
363
|
+
* IMPORTANT: For bash -c commands, use single quotes to wrap the script argument
|
|
364
|
+
* to avoid complex escaping issues with jq commands inside.
|
|
365
|
+
* See: https://github.com/catlog22/Claude-Code-Workflow/issues/73
|
|
362
366
|
*/
|
|
363
367
|
function convertToClaudeCodeFormat(hookData) {
|
|
364
368
|
// If already in correct format, return as-is
|
|
365
369
|
if (hookData.hooks && Array.isArray(hookData.hooks)) {
|
|
366
370
|
return hookData;
|
|
367
371
|
}
|
|
368
|
-
|
|
372
|
+
|
|
369
373
|
// Build command string from command + args
|
|
370
374
|
let commandStr = hookData.command || '';
|
|
371
375
|
if (hookData.args && Array.isArray(hookData.args)) {
|
|
372
|
-
//
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
+
// Special handling for bash -c commands: use single quotes for the script
|
|
377
|
+
// This avoids complex escaping issues with jq and other shell commands
|
|
378
|
+
if (commandStr === 'bash' && hookData.args.length >= 2 && hookData.args[0] === '-c') {
|
|
379
|
+
// Use single quotes for bash -c script argument
|
|
380
|
+
// Single quotes prevent shell expansion, so internal double quotes work naturally
|
|
381
|
+
const script = hookData.args[1];
|
|
382
|
+
// Escape single quotes within the script: ' -> '\''
|
|
383
|
+
const escapedScript = script.replace(/'/g, "'\\''");
|
|
384
|
+
commandStr = `bash -c '${escapedScript}'`;
|
|
385
|
+
// Handle any additional args after the script
|
|
386
|
+
if (hookData.args.length > 2) {
|
|
387
|
+
const additionalArgs = hookData.args.slice(2).map(arg => {
|
|
388
|
+
if (arg.includes(' ') && !arg.startsWith('"') && !arg.startsWith("'")) {
|
|
389
|
+
return `"${arg.replace(/"/g, '\\"')}"`;
|
|
390
|
+
}
|
|
391
|
+
return arg;
|
|
392
|
+
});
|
|
393
|
+
commandStr += ' ' + additionalArgs.join(' ');
|
|
376
394
|
}
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
395
|
+
} else {
|
|
396
|
+
// Default handling for other commands
|
|
397
|
+
const quotedArgs = hookData.args.map(arg => {
|
|
398
|
+
if (arg.includes(' ') && !arg.startsWith('"') && !arg.startsWith("'")) {
|
|
399
|
+
return `"${arg.replace(/"/g, '\\"')}"`;
|
|
400
|
+
}
|
|
401
|
+
return arg;
|
|
402
|
+
});
|
|
403
|
+
commandStr = `${commandStr} ${quotedArgs.join(' ')}`.trim();
|
|
404
|
+
}
|
|
380
405
|
}
|
|
381
|
-
|
|
406
|
+
|
|
382
407
|
const converted = {
|
|
383
408
|
hooks: [{
|
|
384
409
|
type: 'command',
|
|
385
410
|
command: commandStr
|
|
386
411
|
}]
|
|
387
412
|
};
|
|
388
|
-
|
|
413
|
+
|
|
389
414
|
// Add matcher if present (not needed for UserPromptSubmit, Stop, etc.)
|
|
390
415
|
if (hookData.matcher) {
|
|
391
416
|
converted.matcher = hookData.matcher;
|
|
392
417
|
}
|
|
393
|
-
|
|
418
|
+
|
|
394
419
|
// Add timeout if present (in seconds for Claude Code)
|
|
395
420
|
if (hookData.timeout) {
|
|
396
421
|
converted.hooks[0].timeout = Math.ceil(hookData.timeout / 1000);
|
|
397
422
|
}
|
|
398
|
-
|
|
423
|
+
|
|
399
424
|
// Preserve replaceIndex for updates
|
|
400
425
|
if (hookData.replaceIndex !== undefined) {
|
|
401
426
|
converted.replaceIndex = hookData.replaceIndex;
|
|
402
427
|
}
|
|
403
|
-
|
|
428
|
+
|
|
404
429
|
return converted;
|
|
405
430
|
}
|
|
406
431
|
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
// Navigation and Routing
|
|
2
2
|
// Manages navigation events, active state, content title updates, search, and path selector
|
|
3
3
|
|
|
4
|
+
// View lifecycle management
|
|
5
|
+
var currentViewDestroy = null;
|
|
6
|
+
|
|
4
7
|
// Path Selector
|
|
5
8
|
function initPathSelector() {
|
|
6
9
|
const btn = document.getElementById('pathButton');
|
|
@@ -54,6 +57,11 @@ function initPathSelector() {
|
|
|
54
57
|
|
|
55
58
|
// Cleanup function for view transitions
|
|
56
59
|
function cleanupPreviousView() {
|
|
60
|
+
// Call current view's destroy function if exists
|
|
61
|
+
if (currentViewDestroy) {
|
|
62
|
+
currentViewDestroy();
|
|
63
|
+
currentViewDestroy = null;
|
|
64
|
+
}
|
|
57
65
|
// Cleanup graph explorer
|
|
58
66
|
if (currentView === 'graph-explorer' && typeof window.cleanupGraphExplorer === 'function') {
|
|
59
67
|
window.cleanupGraphExplorer();
|
|
@@ -121,6 +129,10 @@ function initNavigation() {
|
|
|
121
129
|
renderCliManager();
|
|
122
130
|
} else if (currentView === 'cli-history') {
|
|
123
131
|
renderCliHistoryView();
|
|
132
|
+
// Register destroy function for cli-history view
|
|
133
|
+
if (typeof window.destroyCliHistoryView === 'function') {
|
|
134
|
+
currentViewDestroy = window.destroyCliHistoryView;
|
|
135
|
+
}
|
|
124
136
|
} else if (currentView === 'hook-manager') {
|
|
125
137
|
renderHookManager();
|
|
126
138
|
} else if (currentView === 'memory') {
|
|
@@ -133,6 +145,10 @@ function initNavigation() {
|
|
|
133
145
|
renderRulesManager();
|
|
134
146
|
} else if (currentView === 'claude-manager') {
|
|
135
147
|
renderClaudeManager();
|
|
148
|
+
// Register destroy function for claude-manager view
|
|
149
|
+
if (typeof window.initClaudeManager === 'function') {
|
|
150
|
+
window.initClaudeManager();
|
|
151
|
+
}
|
|
136
152
|
} else if (currentView === 'graph-explorer') {
|
|
137
153
|
renderGraphExplorer();
|
|
138
154
|
} else if (currentView === 'help') {
|
|
@@ -216,8 +232,10 @@ function updateContentTitle() {
|
|
|
216
232
|
} else if (currentView === 'issue-discovery') {
|
|
217
233
|
titleEl.textContent = t('title.issueDiscovery');
|
|
218
234
|
} else if (currentView === 'liteTasks') {
|
|
219
|
-
const names = { 'lite-plan': t('title.litePlanSessions'), 'lite-fix': t('title.liteFixSessions') };
|
|
235
|
+
const names = { 'lite-plan': t('title.litePlanSessions'), 'lite-fix': t('title.liteFixSessions'), 'multi-cli-plan': t('title.multiCliPlanSessions') || 'Multi-CLI Plan Sessions' };
|
|
220
236
|
titleEl.textContent = names[currentLiteType] || t('title.liteTasks');
|
|
237
|
+
} else if (currentView === 'multiCliDetail') {
|
|
238
|
+
titleEl.textContent = t('title.multiCliDetail') || 'Multi-CLI Discussion Detail';
|
|
221
239
|
} else if (currentView === 'sessionDetail') {
|
|
222
240
|
titleEl.textContent = t('title.sessionDetail');
|
|
223
241
|
} else if (currentView === 'liteTaskDetail') {
|
|
@@ -319,12 +337,14 @@ function updateSidebarCounts(data) {
|
|
|
319
337
|
if (archivedCount) archivedCount.textContent = data.archivedSessions?.length || 0;
|
|
320
338
|
if (allCount) allCount.textContent = (data.activeSessions?.length || 0) + (data.archivedSessions?.length || 0);
|
|
321
339
|
|
|
322
|
-
// Update lite task counts
|
|
323
|
-
const litePlanCount = document.
|
|
324
|
-
const liteFixCount = document.
|
|
340
|
+
// Update lite task counts (using ID selectors to match dashboard.html structure)
|
|
341
|
+
const litePlanCount = document.getElementById('badgeLitePlan');
|
|
342
|
+
const liteFixCount = document.getElementById('badgeLiteFix');
|
|
343
|
+
const multiCliPlanCount = document.getElementById('badgeMultiCliPlan');
|
|
325
344
|
|
|
326
345
|
if (litePlanCount) litePlanCount.textContent = data.liteTasks?.litePlan?.length || 0;
|
|
327
346
|
if (liteFixCount) liteFixCount.textContent = data.liteTasks?.liteFix?.length || 0;
|
|
347
|
+
if (multiCliPlanCount) multiCliPlanCount.textContent = data.liteTasks?.multiCliPlan?.length || 0;
|
|
328
348
|
}
|
|
329
349
|
|
|
330
350
|
// ========== Navigation Badge Aggregation ==========
|
|
@@ -83,7 +83,8 @@ const i18n = {
|
|
|
83
83
|
'nav.liteTasks': 'Lite Tasks',
|
|
84
84
|
'nav.litePlan': 'Lite Plan',
|
|
85
85
|
'nav.liteFix': 'Lite Fix',
|
|
86
|
-
|
|
86
|
+
'nav.multiCliPlan': 'Multi-CLI Plan',
|
|
87
|
+
|
|
87
88
|
// Sidebar - MCP section
|
|
88
89
|
'nav.mcpServers': 'MCP Servers',
|
|
89
90
|
'nav.manage': 'Manage',
|
|
@@ -119,9 +120,11 @@ const i18n = {
|
|
|
119
120
|
'title.cliHistory': 'CLI Execution History',
|
|
120
121
|
'title.litePlanSessions': 'Lite Plan Sessions',
|
|
121
122
|
'title.liteFixSessions': 'Lite Fix Sessions',
|
|
123
|
+
'title.multiCliPlanSessions': 'Multi-CLI Plan Sessions',
|
|
122
124
|
'title.liteTasks': 'Lite Tasks',
|
|
123
125
|
'title.sessionDetail': 'Session Detail',
|
|
124
126
|
'title.liteTaskDetail': 'Lite Task Detail',
|
|
127
|
+
'title.multiCliDetail': 'Multi-CLI Discussion Detail',
|
|
125
128
|
'title.hookManager': 'Hook Manager',
|
|
126
129
|
'title.memoryModule': 'Memory Module',
|
|
127
130
|
'title.promptHistory': 'Prompt History',
|
|
@@ -268,6 +271,15 @@ const i18n = {
|
|
|
268
271
|
'cli.envFilePlaceholder': 'Path to .env file (e.g., ~/.gemini-env or C:/Users/xxx/.env)',
|
|
269
272
|
'cli.envFileHint': 'Load environment variables (e.g., API keys) before CLI execution. Supports ~ for home directory.',
|
|
270
273
|
'cli.envFileBrowse': 'Browse',
|
|
274
|
+
'cli.envFilePathHint': 'Please verify or complete the file path (e.g., ~/.gemini-env)',
|
|
275
|
+
'cli.fileBrowser': 'File Browser',
|
|
276
|
+
'cli.fileBrowserSelect': 'Select',
|
|
277
|
+
'cli.fileBrowserCancel': 'Cancel',
|
|
278
|
+
'cli.fileBrowserUp': 'Parent Directory',
|
|
279
|
+
'cli.fileBrowserHome': 'Home',
|
|
280
|
+
'cli.fileBrowserShowHidden': 'Show hidden files',
|
|
281
|
+
'cli.fileBrowserApiError': 'Server restart required to enable file browser',
|
|
282
|
+
'cli.fileBrowserManualHint': 'Type the full path above and click Select (e.g., C:\\Users\\name\\.gemini)',
|
|
271
283
|
|
|
272
284
|
// CodexLens Configuration
|
|
273
285
|
'codexlens.config': 'CodexLens Configuration',
|
|
@@ -1195,7 +1207,82 @@ const i18n = {
|
|
|
1195
1207
|
'lite.diagnosisDetails': 'Diagnosis Details',
|
|
1196
1208
|
'lite.totalDiagnoses': 'Total Diagnoses:',
|
|
1197
1209
|
'lite.angles': 'Angles:',
|
|
1198
|
-
|
|
1210
|
+
'lite.multiCli': 'Multi-CLI',
|
|
1211
|
+
|
|
1212
|
+
// Multi-CLI Plan
|
|
1213
|
+
'multiCli.rounds': 'rounds',
|
|
1214
|
+
'multiCli.backToList': 'Back to Multi-CLI Plan',
|
|
1215
|
+
'multiCli.roundCount': 'Rounds',
|
|
1216
|
+
'multiCli.topic': 'Topic',
|
|
1217
|
+
'multiCli.tab.topic': 'Discussion Topic',
|
|
1218
|
+
'multiCli.tab.files': 'Related Files',
|
|
1219
|
+
'multiCli.tab.planning': 'Planning',
|
|
1220
|
+
'multiCli.tab.decision': 'Decision',
|
|
1221
|
+
'multiCli.tab.timeline': 'Timeline',
|
|
1222
|
+
'multiCli.tab.rounds': 'Rounds',
|
|
1223
|
+
'multiCli.tab.discussion': 'Discussion',
|
|
1224
|
+
'multiCli.tab.association': 'Association',
|
|
1225
|
+
'multiCli.scope': 'Scope',
|
|
1226
|
+
'multiCli.scope.included': 'Included',
|
|
1227
|
+
'multiCli.scope.excluded': 'Excluded',
|
|
1228
|
+
'multiCli.keyQuestions': 'Key Questions',
|
|
1229
|
+
'multiCli.fileTree': 'File Tree',
|
|
1230
|
+
'multiCli.impactSummary': 'Impact Summary',
|
|
1231
|
+
'multiCli.dependencies': 'Dependencies',
|
|
1232
|
+
'multiCli.functional': 'Functional Requirements',
|
|
1233
|
+
'multiCli.nonFunctional': 'Non-Functional Requirements',
|
|
1234
|
+
'multiCli.acceptanceCriteria': 'Acceptance Criteria',
|
|
1235
|
+
'multiCli.source': 'Source',
|
|
1236
|
+
'multiCli.confidence': 'Confidence',
|
|
1237
|
+
'multiCli.selectedSolution': 'Selected Solution',
|
|
1238
|
+
'multiCli.rejectedAlternatives': 'Rejected Alternatives',
|
|
1239
|
+
'multiCli.rejectionReason': 'Reason',
|
|
1240
|
+
'multiCli.pros': 'Pros',
|
|
1241
|
+
'multiCli.cons': 'Cons',
|
|
1242
|
+
'multiCli.effort': 'Effort',
|
|
1243
|
+
'multiCli.sources': 'Sources',
|
|
1244
|
+
'multiCli.currentRound': 'Current',
|
|
1245
|
+
'multiCli.singleRoundInfo': 'This is a single-round discussion. View other tabs for details.',
|
|
1246
|
+
'multiCli.noRoundData': 'No data for this round.',
|
|
1247
|
+
'multiCli.roundId': 'Round',
|
|
1248
|
+
'multiCli.timestamp': 'Time',
|
|
1249
|
+
'multiCli.duration': 'Duration',
|
|
1250
|
+
'multiCli.contributors': 'Contributors',
|
|
1251
|
+
'multiCli.convergence': 'Convergence',
|
|
1252
|
+
'multiCli.newInsights': 'New Insights',
|
|
1253
|
+
'multiCli.crossVerification': 'Cross-Verification',
|
|
1254
|
+
'multiCli.agreements': 'Agreements',
|
|
1255
|
+
'multiCli.disagreements': 'Disagreements',
|
|
1256
|
+
'multiCli.resolution': 'Resolution',
|
|
1257
|
+
'multiCli.empty.topic': 'No Discussion Topic',
|
|
1258
|
+
'multiCli.empty.topicText': 'No discussion topic data available for this session.',
|
|
1259
|
+
'multiCli.empty.files': 'No Related Files',
|
|
1260
|
+
'multiCli.empty.filesText': 'No file analysis data available for this session.',
|
|
1261
|
+
'multiCli.empty.planning': 'No Planning Data',
|
|
1262
|
+
'multiCli.empty.planningText': 'No planning requirements available for this session.',
|
|
1263
|
+
'multiCli.empty.decision': 'No Decision Yet',
|
|
1264
|
+
'multiCli.empty.decisionText': 'No decision has been made for this discussion yet.',
|
|
1265
|
+
'multiCli.empty.timeline': 'No Timeline Events',
|
|
1266
|
+
'multiCli.empty.timelineText': 'No decision timeline available for this session.',
|
|
1267
|
+
'multiCli.empty.association': 'No Association Data',
|
|
1268
|
+
'multiCli.empty.associationText': 'No context package or related files available for this session.',
|
|
1269
|
+
'multiCli.round': 'Round',
|
|
1270
|
+
'multiCli.solutionSummary': 'Solution Summary',
|
|
1271
|
+
'multiCli.feasibility': 'Feasibility',
|
|
1272
|
+
'multiCli.effort': 'Effort',
|
|
1273
|
+
'multiCli.risk': 'Risk',
|
|
1274
|
+
'multiCli.consensus': 'Consensus',
|
|
1275
|
+
'multiCli.resolvedConflicts': 'Resolved Conflicts',
|
|
1276
|
+
|
|
1277
|
+
// Toolbar
|
|
1278
|
+
'multiCli.toolbar.title': 'Task Navigator',
|
|
1279
|
+
'multiCli.toolbar.tasks': 'Tasks',
|
|
1280
|
+
'multiCli.toolbar.refresh': 'Refresh',
|
|
1281
|
+
'multiCli.toolbar.exportJson': 'Export JSON',
|
|
1282
|
+
'multiCli.toolbar.viewRaw': 'View Raw Data',
|
|
1283
|
+
'multiCli.toolbar.noTasks': 'No tasks available',
|
|
1284
|
+
'multiCli.toolbar.scrollToTask': 'Click to scroll to task',
|
|
1285
|
+
|
|
1199
1286
|
// Modals
|
|
1200
1287
|
'modal.contentPreview': 'Content Preview',
|
|
1201
1288
|
'modal.raw': 'Raw',
|
|
@@ -2257,7 +2344,8 @@ const i18n = {
|
|
|
2257
2344
|
'nav.liteTasks': '轻量任务',
|
|
2258
2345
|
'nav.litePlan': '轻量规划',
|
|
2259
2346
|
'nav.liteFix': '轻量修复',
|
|
2260
|
-
|
|
2347
|
+
'nav.multiCliPlan': '多CLI规划',
|
|
2348
|
+
|
|
2261
2349
|
// Sidebar - MCP section
|
|
2262
2350
|
'nav.mcpServers': 'MCP 服务器',
|
|
2263
2351
|
'nav.manage': '管理',
|
|
@@ -2293,9 +2381,11 @@ const i18n = {
|
|
|
2293
2381
|
'title.cliHistory': 'CLI 执行历史',
|
|
2294
2382
|
'title.litePlanSessions': '轻量规划会话',
|
|
2295
2383
|
'title.liteFixSessions': '轻量修复会话',
|
|
2384
|
+
'title.multiCliPlanSessions': '多CLI规划会话',
|
|
2296
2385
|
'title.liteTasks': '轻量任务',
|
|
2297
2386
|
'title.sessionDetail': '会话详情',
|
|
2298
2387
|
'title.liteTaskDetail': '轻量任务详情',
|
|
2388
|
+
'title.multiCliDetail': '多CLI讨论详情',
|
|
2299
2389
|
'title.hookManager': '钩子管理',
|
|
2300
2390
|
'title.memoryModule': '记忆模块',
|
|
2301
2391
|
'title.promptHistory': '提示历史',
|
|
@@ -2442,6 +2532,15 @@ const i18n = {
|
|
|
2442
2532
|
'cli.envFilePlaceholder': '.env 文件路径(如 ~/.gemini-env 或 C:/Users/xxx/.env)',
|
|
2443
2533
|
'cli.envFileHint': '在 CLI 执行前加载环境变量(如 API 密钥)。支持 ~ 表示用户目录。',
|
|
2444
2534
|
'cli.envFileBrowse': '浏览',
|
|
2535
|
+
'cli.envFilePathHint': '请确认或补全文件路径(如 ~/.gemini-env)',
|
|
2536
|
+
'cli.fileBrowser': '文件浏览器',
|
|
2537
|
+
'cli.fileBrowserSelect': '选择',
|
|
2538
|
+
'cli.fileBrowserCancel': '取消',
|
|
2539
|
+
'cli.fileBrowserUp': '上级目录',
|
|
2540
|
+
'cli.fileBrowserHome': '主目录',
|
|
2541
|
+
'cli.fileBrowserShowHidden': '显示隐藏文件',
|
|
2542
|
+
'cli.fileBrowserApiError': '需要重启服务器以启用文件浏览器',
|
|
2543
|
+
'cli.fileBrowserManualHint': '请在上方输入完整路径后点击选择(如 C:\\Users\\用户名\\.gemini)',
|
|
2445
2544
|
|
|
2446
2545
|
// CodexLens 配置
|
|
2447
2546
|
'codexlens.config': 'CodexLens 配置',
|
|
@@ -3348,7 +3447,82 @@ const i18n = {
|
|
|
3348
3447
|
'lite.diagnosisDetails': '诊断详情',
|
|
3349
3448
|
'lite.totalDiagnoses': '总诊断数:',
|
|
3350
3449
|
'lite.angles': '分析角度:',
|
|
3351
|
-
|
|
3450
|
+
'lite.multiCli': '多CLI',
|
|
3451
|
+
|
|
3452
|
+
// Multi-CLI Plan
|
|
3453
|
+
'multiCli.rounds': '轮',
|
|
3454
|
+
'multiCli.backToList': '返回多CLI计划',
|
|
3455
|
+
'multiCli.roundCount': '轮数',
|
|
3456
|
+
'multiCli.topic': '主题',
|
|
3457
|
+
'multiCli.tab.topic': '讨论主题',
|
|
3458
|
+
'multiCli.tab.files': '相关文件',
|
|
3459
|
+
'multiCli.tab.planning': '规划',
|
|
3460
|
+
'multiCli.tab.decision': '决策',
|
|
3461
|
+
'multiCli.tab.timeline': '时间线',
|
|
3462
|
+
'multiCli.tab.rounds': '轮次',
|
|
3463
|
+
'multiCli.tab.discussion': '讨论',
|
|
3464
|
+
'multiCli.tab.association': '关联',
|
|
3465
|
+
'multiCli.scope': '范围',
|
|
3466
|
+
'multiCli.scope.included': '包含',
|
|
3467
|
+
'multiCli.scope.excluded': '排除',
|
|
3468
|
+
'multiCli.keyQuestions': '关键问题',
|
|
3469
|
+
'multiCli.fileTree': '文件树',
|
|
3470
|
+
'multiCli.impactSummary': '影响摘要',
|
|
3471
|
+
'multiCli.dependencies': '依赖关系',
|
|
3472
|
+
'multiCli.functional': '功能需求',
|
|
3473
|
+
'multiCli.nonFunctional': '非功能需求',
|
|
3474
|
+
'multiCli.acceptanceCriteria': '验收标准',
|
|
3475
|
+
'multiCli.source': '来源',
|
|
3476
|
+
'multiCli.confidence': '置信度',
|
|
3477
|
+
'multiCli.selectedSolution': '选定方案',
|
|
3478
|
+
'multiCli.rejectedAlternatives': '被拒绝的备选方案',
|
|
3479
|
+
'multiCli.rejectionReason': '原因',
|
|
3480
|
+
'multiCli.pros': '优点',
|
|
3481
|
+
'multiCli.cons': '缺点',
|
|
3482
|
+
'multiCli.effort': '工作量',
|
|
3483
|
+
'multiCli.sources': '来源',
|
|
3484
|
+
'multiCli.currentRound': '当前',
|
|
3485
|
+
'multiCli.singleRoundInfo': '这是单轮讨论。查看其他标签页获取详情。',
|
|
3486
|
+
'multiCli.noRoundData': '此轮无数据。',
|
|
3487
|
+
'multiCli.roundId': '轮次',
|
|
3488
|
+
'multiCli.timestamp': '时间',
|
|
3489
|
+
'multiCli.duration': '持续时间',
|
|
3490
|
+
'multiCli.contributors': '贡献者',
|
|
3491
|
+
'multiCli.convergence': '收敛度',
|
|
3492
|
+
'multiCli.newInsights': '新发现',
|
|
3493
|
+
'multiCli.crossVerification': '交叉验证',
|
|
3494
|
+
'multiCli.agreements': '一致意见',
|
|
3495
|
+
'multiCli.disagreements': '分歧',
|
|
3496
|
+
'multiCli.resolution': '决议',
|
|
3497
|
+
'multiCli.empty.topic': '无讨论主题',
|
|
3498
|
+
'multiCli.empty.topicText': '此会话无可用的讨论主题数据。',
|
|
3499
|
+
'multiCli.empty.files': '无相关文件',
|
|
3500
|
+
'multiCli.empty.filesText': '此会话无可用的文件分析数据。',
|
|
3501
|
+
'multiCli.empty.planning': '无规划数据',
|
|
3502
|
+
'multiCli.empty.planningText': '此会话无可用的规划需求。',
|
|
3503
|
+
'multiCli.empty.decision': '暂无决策',
|
|
3504
|
+
'multiCli.empty.decisionText': '此讨论尚未做出决策。',
|
|
3505
|
+
'multiCli.empty.timeline': '无时间线事件',
|
|
3506
|
+
'multiCli.empty.timelineText': '此会话无可用的决策时间线。',
|
|
3507
|
+
'multiCli.empty.association': '无关联数据',
|
|
3508
|
+
'multiCli.empty.associationText': '此会话无可用的上下文包或相关文件。',
|
|
3509
|
+
'multiCli.round': '轮次',
|
|
3510
|
+
'multiCli.solutionSummary': '方案摘要',
|
|
3511
|
+
'multiCli.feasibility': '可行性',
|
|
3512
|
+
'multiCli.effort': '工作量',
|
|
3513
|
+
'multiCli.risk': '风险',
|
|
3514
|
+
'multiCli.consensus': '共识',
|
|
3515
|
+
'multiCli.resolvedConflicts': '已解决冲突',
|
|
3516
|
+
|
|
3517
|
+
// Toolbar
|
|
3518
|
+
'multiCli.toolbar.title': '任务导航',
|
|
3519
|
+
'multiCli.toolbar.tasks': '任务列表',
|
|
3520
|
+
'multiCli.toolbar.refresh': '刷新',
|
|
3521
|
+
'multiCli.toolbar.exportJson': '导出JSON',
|
|
3522
|
+
'multiCli.toolbar.viewRaw': '查看原始数据',
|
|
3523
|
+
'multiCli.toolbar.noTasks': '暂无任务',
|
|
3524
|
+
'multiCli.toolbar.scrollToTask': '点击定位到任务',
|
|
3525
|
+
|
|
3352
3526
|
// Modals
|
|
3353
3527
|
'modal.contentPreview': '内容预览',
|
|
3354
3528
|
'modal.raw': '原始',
|