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
@@ -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',
@@ -1092,7 +1104,14 @@ const i18n = {
1092
1104
 
1093
1105
  // Hook Wizard Templates
1094
1106
  'hook.wizard.memoryUpdate': 'Memory Update Hook',
1095
- 'hook.wizard.memoryUpdateDesc': 'Automatically update CLAUDE.md documentation based on code changes',
1107
+ 'hook.wizard.memoryUpdateDesc': 'Queue-based CLAUDE.md updates with configurable threshold and timeout',
1108
+ 'hook.wizard.queueBasedUpdate': 'Queue-Based Update',
1109
+ 'hook.wizard.queueBasedUpdateDesc': 'Batch updates when threshold reached or timeout expires',
1110
+ 'hook.wizard.thresholdPaths': 'Threshold (paths)',
1111
+ 'hook.wizard.thresholdPathsDesc': 'Number of paths to trigger batch update',
1112
+ 'hook.wizard.timeoutSeconds': 'Timeout (seconds)',
1113
+ 'hook.wizard.timeoutSecondsDesc': 'Auto-flush queue after this time',
1114
+ // Legacy keys (kept for compatibility)
1096
1115
  'hook.wizard.onSessionEnd': 'On Session End',
1097
1116
  'hook.wizard.onSessionEndDesc': 'Update documentation when Claude session ends',
1098
1117
  'hook.wizard.periodicUpdate': 'Periodic Update',
@@ -1188,7 +1207,82 @@ const i18n = {
1188
1207
  'lite.diagnosisDetails': 'Diagnosis Details',
1189
1208
  'lite.totalDiagnoses': 'Total Diagnoses:',
1190
1209
  'lite.angles': 'Angles:',
1191
-
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
+
1192
1286
  // Modals
1193
1287
  'modal.contentPreview': 'Content Preview',
1194
1288
  'modal.raw': 'Raw',
@@ -2250,7 +2344,8 @@ const i18n = {
2250
2344
  'nav.liteTasks': '轻量任务',
2251
2345
  'nav.litePlan': '轻量规划',
2252
2346
  'nav.liteFix': '轻量修复',
2253
-
2347
+ 'nav.multiCliPlan': '多CLI规划',
2348
+
2254
2349
  // Sidebar - MCP section
2255
2350
  'nav.mcpServers': 'MCP 服务器',
2256
2351
  'nav.manage': '管理',
@@ -2286,9 +2381,11 @@ const i18n = {
2286
2381
  'title.cliHistory': 'CLI 执行历史',
2287
2382
  'title.litePlanSessions': '轻量规划会话',
2288
2383
  'title.liteFixSessions': '轻量修复会话',
2384
+ 'title.multiCliPlanSessions': '多CLI规划会话',
2289
2385
  'title.liteTasks': '轻量任务',
2290
2386
  'title.sessionDetail': '会话详情',
2291
2387
  'title.liteTaskDetail': '轻量任务详情',
2388
+ 'title.multiCliDetail': '多CLI讨论详情',
2292
2389
  'title.hookManager': '钩子管理',
2293
2390
  'title.memoryModule': '记忆模块',
2294
2391
  'title.promptHistory': '提示历史',
@@ -2435,6 +2532,15 @@ const i18n = {
2435
2532
  'cli.envFilePlaceholder': '.env 文件路径(如 ~/.gemini-env 或 C:/Users/xxx/.env)',
2436
2533
  'cli.envFileHint': '在 CLI 执行前加载环境变量(如 API 密钥)。支持 ~ 表示用户目录。',
2437
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)',
2438
2544
 
2439
2545
  // CodexLens 配置
2440
2546
  'codexlens.config': 'CodexLens 配置',
@@ -3238,7 +3344,14 @@ const i18n = {
3238
3344
 
3239
3345
  // Hook Wizard Templates
3240
3346
  'hook.wizard.memoryUpdate': '记忆更新钩子',
3241
- 'hook.wizard.memoryUpdateDesc': '根据代码更改自动更新 CLAUDE.md 文档',
3347
+ 'hook.wizard.memoryUpdateDesc': '基于队列的 CLAUDE.md 更新,支持阈值和超时配置',
3348
+ 'hook.wizard.queueBasedUpdate': '队列批量更新',
3349
+ 'hook.wizard.queueBasedUpdateDesc': '达到路径数量阈值或超时时批量更新',
3350
+ 'hook.wizard.thresholdPaths': '阈值(路径数)',
3351
+ 'hook.wizard.thresholdPathsDesc': '触发批量更新的路径数量',
3352
+ 'hook.wizard.timeoutSeconds': '超时(秒)',
3353
+ 'hook.wizard.timeoutSecondsDesc': '超过此时间自动刷新队列',
3354
+ // 保留旧键以兼容
3242
3355
  'hook.wizard.onSessionEnd': '会话结束时',
3243
3356
  'hook.wizard.onSessionEndDesc': 'Claude 会话结束时更新文档',
3244
3357
  'hook.wizard.periodicUpdate': '定期更新',
@@ -3334,7 +3447,82 @@ const i18n = {
3334
3447
  'lite.diagnosisDetails': '诊断详情',
3335
3448
  'lite.totalDiagnoses': '总诊断数:',
3336
3449
  'lite.angles': '分析角度:',
3337
-
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
+
3338
3526
  // Modals
3339
3527
  'modal.contentPreview': '内容预览',
3340
3528
  'modal.raw': '原始',
@@ -216,6 +216,11 @@ async function saveCliSettingsEndpoint(data) {
216
216
  const result = await response.json();
217
217
  showRefreshToast(t('apiSettings.settingsSaved'), 'success');
218
218
 
219
+ // Invalidate cache to ensure fresh data on page refresh
220
+ if (window.cacheManager) {
221
+ window.cacheManager.invalidate('cli-wrapper-endpoints');
222
+ }
223
+
219
224
  // Refresh data and re-render
220
225
  await loadCliSettings(true);
221
226
  renderCliSettingsList();
@@ -250,6 +255,11 @@ async function deleteCliSettingsEndpoint(endpointId) {
250
255
 
251
256
  showRefreshToast(t('apiSettings.settingsDeleted'), 'success');
252
257
 
258
+ // Invalidate cache to ensure fresh data on page refresh
259
+ if (window.cacheManager) {
260
+ window.cacheManager.invalidate('cli-wrapper-endpoints');
261
+ }
262
+
253
263
  // Refresh data and re-render
254
264
  await loadCliSettings(true);
255
265
  selectedCliSettingsId = null;
@@ -635,6 +645,11 @@ async function saveProvider() {
635
645
  const result = await response.json();
636
646
  showRefreshToast(t('apiSettings.providerSaved'), 'success');
637
647
 
648
+ // Invalidate cache to ensure fresh data on page refresh
649
+ if (window.cacheManager) {
650
+ window.cacheManager.invalidate('cli-litellm-endpoints');
651
+ }
652
+
638
653
  closeProviderModal();
639
654
  // Force refresh data after saving
640
655
  apiSettingsData = null;
@@ -660,6 +675,12 @@ async function deleteProvider(providerId) {
660
675
  if (!response.ok) throw new Error('Failed to delete provider');
661
676
 
662
677
  showRefreshToast(t('apiSettings.providerDeleted'), 'success');
678
+
679
+ // Invalidate cache to ensure fresh data on page refresh
680
+ if (window.cacheManager) {
681
+ window.cacheManager.invalidate('cli-litellm-endpoints');
682
+ }
683
+
663
684
  // Force refresh data after deleting
664
685
  apiSettingsData = null;
665
686
  await renderApiSettings();
@@ -998,6 +1019,11 @@ async function saveEndpoint() {
998
1019
  const result = await response.json();
999
1020
  showRefreshToast(t('apiSettings.endpointSaved'), 'success');
1000
1021
 
1022
+ // Invalidate cache to ensure fresh data on page refresh
1023
+ if (window.cacheManager) {
1024
+ window.cacheManager.invalidate('cli-litellm-endpoints');
1025
+ }
1026
+
1001
1027
  closeEndpointModal();
1002
1028
  // Force refresh data after saving
1003
1029
  apiSettingsData = null;
@@ -1023,6 +1049,12 @@ async function deleteEndpoint(endpointId) {
1023
1049
  if (!response.ok) throw new Error('Failed to delete endpoint');
1024
1050
 
1025
1051
  showRefreshToast(t('apiSettings.endpointDeleted'), 'success');
1052
+
1053
+ // Invalidate cache to ensure fresh data on page refresh
1054
+ if (window.cacheManager) {
1055
+ window.cacheManager.invalidate('cli-litellm-endpoints');
1056
+ }
1057
+
1026
1058
  // Force refresh data after deleting
1027
1059
  apiSettingsData = null;
1028
1060
  await renderApiSettings();
@@ -1,6 +1,10 @@
1
1
  // CLAUDE.md Manager View
2
2
  // Three-column layout: File Tree | Viewer/Editor | Metadata & Actions
3
3
 
4
+ // ========== Lifecycle Management ==========
5
+ var claudeManagerDestroy = null;
6
+ var createDialogOverlay = null; // Track create dialog overlay for cleanup
7
+
4
8
  // ========== State Management ==========
5
9
  var claudeFilesData = {
6
10
  user: { main: null },
@@ -19,9 +23,15 @@ var fileTreeExpanded = {
19
23
  var searchQuery = '';
20
24
  var freshnessData = {}; // { [filePath]: FreshnessResult }
21
25
  var freshnessSummary = null;
26
+ var searchKeyboardHandlerAdded = false;
22
27
 
23
28
  // ========== Main Render Function ==========
24
29
  async function renderClaudeManager() {
30
+ // Initialize lifecycle
31
+ if (typeof initClaudeManager === 'function') {
32
+ initClaudeManager();
33
+ }
34
+
25
35
  var container = document.getElementById('mainContent');
26
36
  if (!container) return;
27
37
 
@@ -749,9 +759,11 @@ function filterFileTree(query) {
749
759
  renderFileTree();
750
760
 
751
761
  // Add keyboard shortcut handler
752
- if (query && !window.claudeSearchKeyboardHandlerAdded) {
753
- document.addEventListener('keydown', handleSearchKeyboard);
754
- window.claudeSearchKeyboardHandlerAdded = true;
762
+ if (query && !searchKeyboardHandlerAdded) {
763
+ (function() {
764
+ document.addEventListener('keydown', handleSearchKeyboard);
765
+ searchKeyboardHandlerAdded = true;
766
+ })();
755
767
  }
756
768
  }
757
769
 
@@ -796,6 +808,7 @@ function showCreateFileDialog() {
796
808
  '</div>';
797
809
 
798
810
  document.body.insertAdjacentHTML('beforeend', dialog);
811
+ createDialogOverlay = document.querySelector('.modal-overlay');
799
812
  if (window.lucide) lucide.createIcons();
800
813
  }
801
814
 
@@ -918,3 +931,31 @@ function updateClaudeBadge() {
918
931
  badge.textContent = total;
919
932
  }
920
933
  }
934
+
935
+ // ========== Lifecycle Functions ==========
936
+ function destroyClaudeManager() {
937
+ // Remove search keyboard event listener if added
938
+ if (searchKeyboardHandlerAdded) {
939
+ document.removeEventListener('keydown', handleSearchKeyboard);
940
+ searchKeyboardHandlerAdded = false;
941
+ }
942
+
943
+ // Remove create dialog overlay if exists
944
+ if (createDialogOverlay) {
945
+ createDialogOverlay.remove();
946
+ createDialogOverlay = null;
947
+ }
948
+
949
+ // Reset view-specific state
950
+ selectedFile = null;
951
+ isEditMode = false;
952
+ isDirty = false;
953
+ }
954
+
955
+ // Expose init/destroy functions for lifecycle management
956
+ window.initClaudeManager = function() {
957
+ claudeManagerDestroy = destroyClaudeManager;
958
+ };
959
+
960
+ // Make destroyClaudeManager accessible globally as well
961
+ window.destroyClaudeManager = destroyClaudeManager;