claude-code-workflow 6.3.26 → 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.
Files changed (129) hide show
  1. package/.claude/CLAUDE.md +7 -1
  2. package/.claude/agents/action-planning-agent.md +1 -0
  3. package/.claude/agents/cli-discuss-agent.md +391 -0
  4. package/.claude/agents/cli-execution-agent.md +2 -0
  5. package/.claude/agents/cli-explore-agent.md +2 -1
  6. package/.claude/agents/cli-lite-planning-agent.md +1 -0
  7. package/.claude/agents/cli-planning-agent.md +1 -0
  8. package/.claude/agents/code-developer.md +1 -0
  9. package/.claude/agents/conceptual-planning-agent.md +2 -0
  10. package/.claude/agents/context-search-agent.md +1 -0
  11. package/.claude/agents/debug-explore-agent.md +2 -0
  12. package/.claude/agents/doc-generator.md +1 -0
  13. package/.claude/agents/issue-plan-agent.md +2 -1
  14. package/.claude/agents/issue-queue-agent.md +2 -1
  15. package/.claude/agents/memory-bridge.md +2 -0
  16. package/.claude/agents/test-context-search-agent.md +2 -0
  17. package/.claude/agents/test-fix-agent.md +1 -0
  18. package/.claude/agents/ui-design-agent.md +2 -0
  19. package/.claude/agents/universal-executor.md +1 -0
  20. package/.claude/commands/issue/execute.md +141 -163
  21. package/.claude/commands/workflow/lite-lite-lite.md +798 -0
  22. package/.claude/commands/workflow/multi-cli-plan.md +510 -0
  23. package/.claude/skills/ccw/SKILL.md +262 -372
  24. package/.claude/skills/ccw/command.json +547 -0
  25. package/.claude/skills/ccw-help/SKILL.md +46 -107
  26. package/.claude/skills/ccw-help/command.json +511 -0
  27. package/.claude/skills/skill-tuning/SKILL.md +303 -0
  28. package/.claude/skills/skill-tuning/phases/actions/action-abort.md +164 -0
  29. package/.claude/skills/skill-tuning/phases/actions/action-analyze-requirements.md +406 -0
  30. package/.claude/skills/skill-tuning/phases/actions/action-apply-fix.md +206 -0
  31. package/.claude/skills/skill-tuning/phases/actions/action-complete.md +195 -0
  32. package/.claude/skills/skill-tuning/phases/actions/action-diagnose-agent.md +317 -0
  33. package/.claude/skills/skill-tuning/phases/actions/action-diagnose-context.md +243 -0
  34. package/.claude/skills/skill-tuning/phases/actions/action-diagnose-dataflow.md +318 -0
  35. package/.claude/skills/skill-tuning/phases/actions/action-diagnose-docs.md +299 -0
  36. package/.claude/skills/skill-tuning/phases/actions/action-diagnose-memory.md +269 -0
  37. package/.claude/skills/skill-tuning/phases/actions/action-diagnose-token-consumption.md +200 -0
  38. package/.claude/skills/skill-tuning/phases/actions/action-gemini-analysis.md +322 -0
  39. package/.claude/skills/skill-tuning/phases/actions/action-generate-report.md +228 -0
  40. package/.claude/skills/skill-tuning/phases/actions/action-init.md +149 -0
  41. package/.claude/skills/skill-tuning/phases/actions/action-propose-fixes.md +317 -0
  42. package/.claude/skills/skill-tuning/phases/actions/action-verify.md +222 -0
  43. package/.claude/skills/skill-tuning/phases/orchestrator.md +377 -0
  44. package/.claude/skills/skill-tuning/phases/state-schema.md +378 -0
  45. package/.claude/skills/skill-tuning/specs/category-mappings.json +284 -0
  46. package/.claude/skills/skill-tuning/specs/dimension-mapping.md +212 -0
  47. package/.claude/skills/skill-tuning/specs/problem-taxonomy.md +318 -0
  48. package/.claude/skills/skill-tuning/specs/quality-gates.md +263 -0
  49. package/.claude/skills/skill-tuning/specs/skill-authoring-principles.md +189 -0
  50. package/.claude/skills/skill-tuning/specs/tuning-strategies.md +1537 -0
  51. package/.claude/skills/skill-tuning/templates/diagnosis-report.md +153 -0
  52. package/.claude/skills/skill-tuning/templates/fix-proposal.md +204 -0
  53. package/.claude/workflows/cli-templates/schemas/multi-cli-discussion-schema.json +421 -0
  54. package/.claude/workflows/cli-tools-usage.md +0 -41
  55. package/ccw/dist/core/auth/csrf-middleware.d.ts.map +1 -1
  56. package/ccw/dist/core/auth/csrf-middleware.js +3 -1
  57. package/ccw/dist/core/auth/csrf-middleware.js.map +1 -1
  58. package/ccw/dist/core/data-aggregator.d.ts +2 -0
  59. package/ccw/dist/core/data-aggregator.d.ts.map +1 -1
  60. package/ccw/dist/core/data-aggregator.js +5 -2
  61. package/ccw/dist/core/data-aggregator.js.map +1 -1
  62. package/ccw/dist/core/lite-scanner.d.ts +2 -1
  63. package/ccw/dist/core/lite-scanner.d.ts.map +1 -1
  64. package/ccw/dist/core/lite-scanner.js +295 -6
  65. package/ccw/dist/core/lite-scanner.js.map +1 -1
  66. package/ccw/dist/core/routes/codexlens/config-handlers.d.ts.map +1 -1
  67. package/ccw/dist/core/routes/codexlens/config-handlers.js +5 -5
  68. package/ccw/dist/core/routes/codexlens/config-handlers.js.map +1 -1
  69. package/ccw/dist/core/routes/session-routes.d.ts.map +1 -1
  70. package/ccw/dist/core/routes/session-routes.js +166 -48
  71. package/ccw/dist/core/routes/session-routes.js.map +1 -1
  72. package/ccw/dist/core/routes/system-routes.d.ts.map +1 -1
  73. package/ccw/dist/core/routes/system-routes.js +87 -0
  74. package/ccw/dist/core/routes/system-routes.js.map +1 -1
  75. package/ccw/dist/core/server.js +2 -2
  76. package/ccw/dist/core/server.js.map +1 -1
  77. package/ccw/scripts/IMPLEMENTATION-SUMMARY.md +226 -0
  78. package/ccw/scripts/QUICK-REFERENCE.md +135 -0
  79. package/ccw/scripts/README-memory-embedder.md +157 -0
  80. package/ccw/scripts/__pycache__/memory_embedder.cpython-313.pyc +0 -0
  81. package/ccw/scripts/__pycache__/test_memory_embedder.cpython-313-pytest-8.4.2.pyc +0 -0
  82. package/ccw/scripts/memory-embedder-example.ts +184 -0
  83. package/ccw/scripts/memory_embedder.py +428 -0
  84. package/ccw/scripts/test_memory_embedder.py +245 -0
  85. package/ccw/src/core/auth/csrf-middleware.ts +3 -1
  86. package/ccw/src/core/data-aggregator.ts +7 -2
  87. package/ccw/src/core/lite-scanner.ts +440 -6
  88. package/ccw/src/core/routes/codexlens/config-handlers.ts +12 -9
  89. package/ccw/src/core/routes/session-routes.ts +201 -48
  90. package/ccw/src/core/routes/system-routes.ts +102 -0
  91. package/ccw/src/core/server.ts +2 -2
  92. package/ccw/src/templates/dashboard-css/01-base.css +8 -0
  93. package/ccw/src/templates/dashboard-css/02-session.css +81 -0
  94. package/ccw/src/templates/dashboard-css/04-lite-tasks.css +2442 -0
  95. package/ccw/src/templates/dashboard-css/21-cli-toolmgmt.css +157 -0
  96. package/ccw/src/templates/dashboard-css/32-issue-manager.css +23 -0
  97. package/ccw/src/templates/dashboard-js/components/cli-stream-viewer.js +38 -4
  98. package/ccw/src/templates/dashboard-js/components/hook-manager.js +38 -13
  99. package/ccw/src/templates/dashboard-js/components/navigation.js +24 -4
  100. package/ccw/src/templates/dashboard-js/i18n.js +194 -6
  101. package/ccw/src/templates/dashboard-js/views/api-settings.js +32 -0
  102. package/ccw/src/templates/dashboard-js/views/claude-manager.js +44 -3
  103. package/ccw/src/templates/dashboard-js/views/cli-manager.js +303 -31
  104. package/ccw/src/templates/dashboard-js/views/history.js +44 -6
  105. package/ccw/src/templates/dashboard-js/views/home.js +1 -0
  106. package/ccw/src/templates/dashboard-js/views/issue-manager.js +54 -7
  107. package/ccw/src/templates/dashboard-js/views/lite-tasks.js +1817 -4
  108. package/ccw/src/templates/dashboard.html +5 -0
  109. package/package.json +2 -1
  110. package/.claude/skills/ccw/index/command-capabilities.json +0 -127
  111. package/.claude/skills/ccw/index/intent-rules.json +0 -136
  112. package/.claude/skills/ccw/index/workflow-chains.json +0 -451
  113. package/.claude/skills/ccw/phases/actions/bugfix.md +0 -218
  114. package/.claude/skills/ccw/phases/actions/coupled.md +0 -194
  115. package/.claude/skills/ccw/phases/actions/docs.md +0 -93
  116. package/.claude/skills/ccw/phases/actions/full.md +0 -154
  117. package/.claude/skills/ccw/phases/actions/issue.md +0 -201
  118. package/.claude/skills/ccw/phases/actions/rapid.md +0 -104
  119. package/.claude/skills/ccw/phases/actions/review-fix.md +0 -84
  120. package/.claude/skills/ccw/phases/actions/tdd.md +0 -66
  121. package/.claude/skills/ccw/phases/actions/ui.md +0 -79
  122. package/.claude/skills/ccw/phases/orchestrator.md +0 -435
  123. package/.claude/skills/ccw/specs/intent-classification.md +0 -336
  124. package/.claude/skills/ccw-help/index/all-agents.json +0 -82
  125. package/.claude/skills/ccw-help/index/all-commands.json +0 -882
  126. package/.claude/skills/ccw-help/index/by-category.json +0 -914
  127. package/.claude/skills/ccw-help/index/by-use-case.json +0 -896
  128. package/.claude/skills/ccw-help/index/command-relationships.json +0 -160
  129. 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
- document.addEventListener('keydown', function(e) {
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
- content.addEventListener('scroll', handleStreamContentScroll);
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
- // Join args, properly quoting if needed
373
- const quotedArgs = hookData.args.map(arg => {
374
- if (arg.includes(' ') && !arg.startsWith('"') && !arg.startsWith("'")) {
375
- return `"${arg.replace(/"/g, '\\"')}"`;
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
- return arg;
378
- });
379
- commandStr = `${commandStr} ${quotedArgs.join(' ')}`.trim();
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.querySelector('.nav-item[data-lite="lite-plan"] .nav-count');
324
- const liteFixCount = document.querySelector('.nav-item[data-lite="lite-fix"] .nav-count');
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 ==========