claude-code-workflow 6.0.5 → 6.1.0

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 (117) hide show
  1. package/.claude/agents/action-planning-agent.md +1 -1
  2. package/.claude/agents/cli-execution-agent.md +269 -269
  3. package/.claude/agents/cli-explore-agent.md +182 -182
  4. package/.claude/agents/context-search-agent.md +582 -582
  5. package/.claude/agents/memory-bridge.md +93 -93
  6. package/.claude/commands/cli/cli-init.md +1 -1
  7. package/.claude/commands/memory/docs-full-cli.md +471 -471
  8. package/.claude/commands/memory/docs-related-cli.md +386 -386
  9. package/.claude/commands/memory/docs.md +615 -615
  10. package/.claude/commands/memory/load.md +1 -1
  11. package/.claude/commands/memory/update-full.md +332 -332
  12. package/.claude/commands/memory/update-related.md +5 -5
  13. package/.claude/commands/workflow/init.md +1 -1
  14. package/.claude/commands/workflow/lite-fix.md +621 -621
  15. package/.claude/commands/workflow/lite-plan.md +592 -592
  16. package/.claude/commands/workflow/tools/context-gather.md +434 -434
  17. package/.claude/commands/workflow/ui-design/generate.md +504 -504
  18. package/.claude/commands/workflow/ui-design/import-from-code.md +537 -537
  19. package/.claude/scripts/classify-folders.sh +4 -0
  20. package/.claude/scripts/convert_tokens_to_css.sh +4 -0
  21. package/.claude/scripts/detect_changed_modules.sh +5 -1
  22. package/.claude/scripts/discover-design-files.sh +87 -83
  23. package/.claude/scripts/generate_module_docs.sh +717 -713
  24. package/.claude/scripts/get_modules_by_depth.sh +5 -1
  25. package/.claude/scripts/ui-generate-preview.sh +4 -0
  26. package/.claude/scripts/ui-instantiate-prototypes.sh +4 -0
  27. package/.claude/scripts/update_module_claude.sh +4 -0
  28. package/.claude/skills/command-guide/index/all-commands.json +1 -12
  29. package/.claude/skills/command-guide/index/by-category.json +1 -12
  30. package/.claude/skills/command-guide/index/by-use-case.json +1 -12
  31. package/.claude/skills/command-guide/index/essential-commands.json +1 -12
  32. package/.claude/skills/command-guide/reference/agents/action-planning-agent.md +127 -71
  33. package/.claude/skills/command-guide/reference/agents/cli-execution-agent.md +269 -269
  34. package/.claude/skills/command-guide/reference/agents/cli-explore-agent.md +182 -182
  35. package/.claude/skills/command-guide/reference/agents/conceptual-planning-agent.md +18 -38
  36. package/.claude/skills/command-guide/reference/agents/context-search-agent.md +582 -577
  37. package/.claude/skills/command-guide/reference/agents/memory-bridge.md +93 -93
  38. package/.claude/skills/command-guide/reference/commands/cli/cli-init.md +1 -1
  39. package/.claude/skills/command-guide/reference/commands/memory/docs-full-cli.md +471 -471
  40. package/.claude/skills/command-guide/reference/commands/memory/docs-related-cli.md +386 -386
  41. package/.claude/skills/command-guide/reference/commands/memory/docs.md +615 -610
  42. package/.claude/skills/command-guide/reference/commands/memory/load.md +1 -1
  43. package/.claude/skills/command-guide/reference/commands/memory/update-full.md +332 -332
  44. package/.claude/skills/command-guide/reference/commands/memory/update-related.md +5 -5
  45. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/artifacts.md +299 -451
  46. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/auto-parallel.md +14 -37
  47. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/synthesis.md +252 -350
  48. package/.claude/skills/command-guide/reference/commands/workflow/init.md +2 -2
  49. package/.claude/skills/command-guide/reference/commands/workflow/lite-execute.md +52 -0
  50. package/.claude/skills/command-guide/reference/commands/workflow/lite-fix.md +621 -602
  51. package/.claude/skills/command-guide/reference/commands/workflow/lite-plan.md +46 -36
  52. package/.claude/skills/command-guide/reference/commands/workflow/review-fix.md +18 -58
  53. package/.claude/skills/command-guide/reference/commands/workflow/review-module-cycle.md +22 -52
  54. package/.claude/skills/command-guide/reference/commands/workflow/review-session-cycle.md +19 -48
  55. package/.claude/skills/command-guide/reference/commands/workflow/session/start.md +25 -5
  56. package/.claude/skills/command-guide/reference/commands/workflow/tdd-plan.md +1 -1
  57. package/.claude/skills/command-guide/reference/commands/workflow/test-fix-gen.md +7 -7
  58. package/.claude/skills/command-guide/reference/commands/workflow/tools/context-gather.md +434 -434
  59. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-agent.md +151 -11
  60. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-tdd.md +4 -4
  61. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-task-generate.md +1 -1
  62. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/generate.md +504 -504
  63. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/import-from-code.md +537 -537
  64. package/.claude/workflows/context-search-strategy.md +77 -77
  65. package/.claude/workflows/tool-strategy.md +90 -71
  66. package/.claude/workflows/workflow-architecture.md +1 -1
  67. package/ccw/src/cli.js +7 -0
  68. package/ccw/src/commands/tool.js +181 -0
  69. package/ccw/src/core/dashboard-generator.js +18 -3
  70. package/ccw/src/core/lite-scanner.js +35 -11
  71. package/ccw/src/core/server.js +531 -46
  72. package/ccw/src/templates/dashboard-css/01-base.css +161 -0
  73. package/ccw/src/templates/dashboard-css/02-session.css +726 -0
  74. package/ccw/src/templates/dashboard-css/03-tasks.css +512 -0
  75. package/ccw/src/templates/dashboard-css/04-lite-tasks.css +843 -0
  76. package/ccw/src/templates/dashboard-css/05-context.css +2206 -0
  77. package/ccw/src/templates/dashboard-css/06-cards.css +1570 -0
  78. package/ccw/src/templates/dashboard-css/07-managers.css +936 -0
  79. package/ccw/src/templates/dashboard-css/08-review.css +1266 -0
  80. package/ccw/src/templates/dashboard-css/09-explorer.css +1397 -0
  81. package/ccw/src/templates/dashboard-js/components/global-notifications.js +219 -0
  82. package/ccw/src/templates/dashboard-js/components/hook-manager.js +10 -0
  83. package/ccw/src/templates/dashboard-js/components/mcp-manager.js +11 -1
  84. package/ccw/src/templates/dashboard-js/components/navigation.js +11 -5
  85. package/ccw/src/templates/dashboard-js/components/tabs-context.js +20 -20
  86. package/ccw/src/templates/dashboard-js/components/tabs-other.js +11 -11
  87. package/ccw/src/templates/dashboard-js/components/theme.js +29 -1
  88. package/ccw/src/templates/dashboard-js/main.js +4 -0
  89. package/ccw/src/templates/dashboard-js/state.js +5 -0
  90. package/ccw/src/templates/dashboard-js/views/explorer.js +852 -0
  91. package/ccw/src/templates/dashboard-js/views/home.js +13 -9
  92. package/ccw/src/templates/dashboard-js/views/hook-manager.js +8 -5
  93. package/ccw/src/templates/dashboard-js/views/lite-tasks.js +21 -16
  94. package/ccw/src/templates/dashboard-js/views/mcp-manager.js +90 -19
  95. package/ccw/src/templates/dashboard-js/views/project-overview.js +15 -11
  96. package/ccw/src/templates/dashboard-js/views/review-session.js +3 -3
  97. package/ccw/src/templates/dashboard-js/views/session-detail.js +38 -28
  98. package/ccw/src/templates/dashboard.html +129 -28
  99. package/ccw/src/tools/classify-folders.js +204 -0
  100. package/ccw/src/tools/convert-tokens-to-css.js +250 -0
  101. package/ccw/src/tools/detect-changed-modules.js +288 -0
  102. package/ccw/src/tools/discover-design-files.js +134 -0
  103. package/ccw/src/tools/edit-file.js +266 -0
  104. package/ccw/src/tools/generate-module-docs.js +416 -0
  105. package/ccw/src/tools/get-modules-by-depth.js +308 -0
  106. package/ccw/src/tools/index.js +176 -0
  107. package/ccw/src/tools/ui-generate-preview.js +327 -0
  108. package/ccw/src/tools/ui-instantiate-prototypes.js +301 -0
  109. package/ccw/src/tools/update-module-claude.js +380 -0
  110. package/package.json +1 -1
  111. package/.claude/skills/command-guide/reference/commands/workflow/status.md +0 -352
  112. package/ccw/src/core/server.js.bak +0 -385
  113. package/ccw/src/core/server_original.bak +0 -385
  114. package/ccw/src/templates/dashboard.css +0 -8187
  115. package/ccw/src/templates/dashboard_tailwind.html +0 -42
  116. package/ccw/src/templates/dashboard_test.html +0 -37
  117. package/ccw/src/templates/tailwind-base.css +0 -212
@@ -1,77 +1,77 @@
1
- ---
2
- name: context-search-strategy
3
- description: Strategic guidelines for context search commands
4
- type: search-guideline
5
- ---
6
-
7
- # Context Search Strategy
8
-
9
- ## ⚡ Execution Environment
10
-
11
- **CRITICAL**: All commands execute in **Bash environment** (Git Bash on Windows)
12
-
13
- **❌ Forbidden**: Windows commands (`findstr`, `dir`, `where`) - Use Bash (`grep`, `find`, `cat`)
14
-
15
- ## ⚡ Core Search Tools
16
-
17
- **Skill()**: FASTEST way to get context - use FIRST if SKILL exists. Three types: (1) `workflow-progress` for WFS sessions (2) tech SKILLs for stack docs (3) `{project-name}` for project docs
18
- **codebase-retrieval**: Semantic file discovery via Gemini CLI with all files analysis
19
- **rg (ripgrep)**: Fast content search with regex support
20
- **find**: File/directory location by name patterns
21
- **grep**: Built-in pattern matching (fallback when rg unavailable)
22
- **get_modules_by_depth.sh**: Program architecture analysis (MANDATORY before planning)
23
-
24
- ## 📋 Tool Selection Matrix
25
-
26
- | Need | Tool | Use Case |
27
- |------|------|----------|
28
- | **Workflow history** | Skill(workflow-progress) | WFS sessions lessons/conflicts - `/memory:workflow-skill-memory` |
29
- | **Tech stack docs** | Skill({tech-name}) | Stack APIs/guides - `/memory:tech-research` |
30
- | **Project docs** | Skill({project-name}) | Project modules/architecture - `/memory:skill-memory` |
31
- | **Semantic discovery** | codebase-retrieval | Find files relevant to task/feature context |
32
- | **Pattern matching** | rg | Search code content with regex |
33
- | **File name lookup** | find | Locate files by name patterns |
34
- | **Architecture** | get_modules_by_depth.sh | Understand program structure |
35
-
36
- ## 🔧 Quick Command Reference
37
-
38
- ```bash
39
- # SKILL Packages (FIRST PRIORITY - fastest context loading)
40
- Skill(command: "workflow-progress") # Workflow: WFS sessions history, lessons, conflicts
41
- Skill(command: "react-dev") # Tech: React APIs, patterns, best practices
42
- Skill(command: "claude_dms3") # Project: Project modules, architecture, examples
43
-
44
- # Semantic File Discovery (codebase-retrieval)
45
- cd [directory] && gemini -p "
46
- PURPOSE: Discover files relevant to task/feature
47
- TASK: List all files related to [task/feature description]
48
- MODE: analysis
49
- CONTEXT: @**/*
50
- EXPECTED: Relevant file paths with relevance explanation
51
- RULES: Focus on direct relevance to task requirements
52
- "
53
-
54
- # Program Architecture (MANDATORY before planning)
55
- ~/.claude/scripts/get_modules_by_depth.sh
56
-
57
- # Content Search (rg preferred)
58
- rg "pattern" --type js -n # Search JS files with line numbers
59
- rg -i "case-insensitive" # Ignore case
60
- rg -C 3 "context" # Show 3 lines before/after
61
-
62
- # File Search
63
- find . -name "*.ts" -type f # Find TypeScript files
64
- find . -path "*/node_modules" -prune -o -name "*.js" -print
65
-
66
- # Workflow Examples
67
- rg "IMPL-\d+" .workflow/ --type json # Find task IDs
68
- find .workflow/ -name "*.json" -path "*/.task/*" # Locate task files
69
- rg "status.*pending" .workflow/.task/ # Find pending tasks
70
- ```
71
-
72
- ## ⚡ Performance Tips
73
-
74
- - **rg > grep** for content search
75
- - **Use --type filters** to limit file types
76
- - **Exclude dirs**: `--glob '!node_modules'`
77
- - **Use -F** for literal strings (no regex)
1
+ ---
2
+ name: context-search-strategy
3
+ description: Strategic guidelines for context search commands
4
+ type: search-guideline
5
+ ---
6
+
7
+ # Context Search Strategy
8
+
9
+ ## ⚡ Execution Environment
10
+
11
+ **CRITICAL**: All commands execute in **Bash environment** (Git Bash on Windows)
12
+
13
+ **❌ Forbidden**: Windows commands (`findstr`, `dir`, `where`) - Use Bash (`grep`, `find`, `cat`)
14
+
15
+ ## ⚡ Core Search Tools
16
+
17
+ **Skill()**: FASTEST way to get context - use FIRST if SKILL exists. Three types: (1) `workflow-progress` for WFS sessions (2) tech SKILLs for stack docs (3) `{project-name}` for project docs
18
+ **codebase-retrieval**: Semantic file discovery via Gemini CLI with all files analysis
19
+ **rg (ripgrep)**: Fast content search with regex support
20
+ **find**: File/directory location by name patterns
21
+ **grep**: Built-in pattern matching (fallback when rg unavailable)
22
+ **get_modules_by_depth.sh**: Program architecture analysis (MANDATORY before planning)
23
+
24
+ ## 📋 Tool Selection Matrix
25
+
26
+ | Need | Tool | Use Case |
27
+ |------|------|----------|
28
+ | **Workflow history** | Skill(workflow-progress) | WFS sessions lessons/conflicts - `/memory:workflow-skill-memory` |
29
+ | **Tech stack docs** | Skill({tech-name}) | Stack APIs/guides - `/memory:tech-research` |
30
+ | **Project docs** | Skill({project-name}) | Project modules/architecture - `/memory:skill-memory` |
31
+ | **Semantic discovery** | codebase-retrieval | Find files relevant to task/feature context |
32
+ | **Pattern matching** | rg | Search code content with regex |
33
+ | **File name lookup** | find | Locate files by name patterns |
34
+ | **Architecture** | get_modules_by_depth.sh | Understand program structure |
35
+
36
+ ## 🔧 Quick Command Reference
37
+
38
+ ```bash
39
+ # SKILL Packages (FIRST PRIORITY - fastest context loading)
40
+ Skill(command: "workflow-progress") # Workflow: WFS sessions history, lessons, conflicts
41
+ Skill(command: "react-dev") # Tech: React APIs, patterns, best practices
42
+ Skill(command: "claude_dms3") # Project: Project modules, architecture, examples
43
+
44
+ # Semantic File Discovery (codebase-retrieval)
45
+ cd [directory] && gemini -p "
46
+ PURPOSE: Discover files relevant to task/feature
47
+ TASK: List all files related to [task/feature description]
48
+ MODE: analysis
49
+ CONTEXT: @**/*
50
+ EXPECTED: Relevant file paths with relevance explanation
51
+ RULES: Focus on direct relevance to task requirements
52
+ "
53
+
54
+ # Program Architecture (MANDATORY before planning)
55
+ ccw tool exec get_modules_by_depth '{}'
56
+
57
+ # Content Search (rg preferred)
58
+ rg "pattern" --type js -n # Search JS files with line numbers
59
+ rg -i "case-insensitive" # Ignore case
60
+ rg -C 3 "context" # Show 3 lines before/after
61
+
62
+ # File Search
63
+ find . -name "*.ts" -type f # Find TypeScript files
64
+ find . -path "*/node_modules" -prune -o -name "*.js" -print
65
+
66
+ # Workflow Examples
67
+ rg "IMPL-\d+" .workflow/ --type json # Find task IDs
68
+ find .workflow/ -name "*.json" -path "*/.task/*" # Locate task files
69
+ rg "status.*pending" .workflow/.task/ # Find pending tasks
70
+ ```
71
+
72
+ ## ⚡ Performance Tips
73
+
74
+ - **rg > grep** for content search
75
+ - **Use --type filters** to limit file types
76
+ - **Exclude dirs**: `--glob '!node_modules'`
77
+ - **Use -F** for literal strings (no regex)
@@ -1,71 +1,90 @@
1
- # Tool Strategy
2
-
3
- ## ⚡ Exa Triggering Mechanisms
4
-
5
- **Auto-Trigger**:
6
- - User mentions "exa-code" or code-related queries → `mcp__exa__get_code_context_exa`
7
- - Need current web information → `mcp__exa__web_search_exa`
8
-
9
- **Manual Trigger**:
10
- - Complex API research → Exa Code Context
11
- - Real-time information needs → Exa Web Search
12
-
13
- ## ⚡ Bash Text Processing (sed/awk)
14
-
15
- **When to Use**: Edit tool fails 2+ times on same file
16
-
17
- ### sed Quick Reference
18
-
19
- ```bash
20
- # Replace first occurrence per line
21
- sed 's/old/new/' file.txt
22
-
23
- # Replace all occurrences (global)
24
- sed 's/old/new/g' file.txt
25
-
26
- # In-place edit (modify file directly)
27
- sed -i 's/old/new/g' file.txt
28
-
29
- # Delete lines matching pattern
30
- sed '/pattern/d' file.txt
31
-
32
- # Insert line before match
33
- sed '/pattern/i\new line' file.txt
34
-
35
- # Insert line after match
36
- sed '/pattern/a\new line' file.txt
37
-
38
- # Replace on specific line number
39
- sed '5s/old/new/' file.txt
40
-
41
- # Multi-line replacement (escape newlines)
42
- sed ':a;N;$!ba;s/old\npattern/new\ntext/g' file.txt
43
- ```
44
-
45
- ### awk Quick Reference
46
-
47
- ```bash
48
- # Print specific column
49
- awk '{print $1}' file.txt
50
-
51
- # Print lines matching pattern
52
- awk '/pattern/' file.txt
53
-
54
- # Replace field value
55
- awk '{$2="new"; print}' file.txt
56
-
57
- # Conditional replacement
58
- awk '/pattern/{gsub(/old/,"new")}1' file.txt
59
-
60
- # Insert line after match
61
- awk '/pattern/{print; print "new line"; next}1' file.txt
62
-
63
- # Multi-field operations
64
- awk -F',' '{print $1, $3}' file.csv
65
- ```
66
-
67
- ### Fallback Strategy
68
-
69
- 1. **Edit fails 2+ times** Try sed for simple replacements
70
- 2. **sed fails** Try awk for complex patterns
71
- 3. **awk fails** Use Write to recreate file
1
+ # Tool Strategy
2
+
3
+ ## ⚡ Exa Triggering Mechanisms
4
+
5
+ **Auto-Trigger**:
6
+ - User mentions "exa-code" or code-related queries → `mcp__exa__get_code_context_exa`
7
+ - Need current web information → `mcp__exa__web_search_exa`
8
+
9
+ **Manual Trigger**:
10
+ - Complex API research → Exa Code Context
11
+ - Real-time information needs → Exa Web Search
12
+
13
+ ## ⚡ CCW edit_file Tool (AI-Powered Editing)
14
+
15
+ **When to Use**: Edit tool fails 2+ times on same file
16
+
17
+ ### update Mode (Default)
18
+
19
+ **Best for**: Code block replacements, function rewrites, multi-line changes
20
+
21
+ ```bash
22
+ ccw tool exec edit_file '{
23
+ "path": "file.py",
24
+ "oldText": "def old():\n pass",
25
+ "newText": "def new():\n return True"
26
+ }'
27
+ ```
28
+
29
+ **Features**:
30
+ - Exact text matching (precise and predictable)
31
+ - ✅ Auto line ending adaptation (CRLF/LF)
32
+ - Simple `oldText` → `newText` replacement
33
+ - No special markers needed
34
+
35
+ ### line Mode (Precise Line Operations)
36
+
37
+ **Best for**: Config files, line insertions/deletions, precise line number control
38
+
39
+ ```bash
40
+ # Insert after specific line
41
+ ccw tool exec edit_file '{
42
+ "path": "config.txt",
43
+ "mode": "line",
44
+ "operation": "insert_after",
45
+ "line": 10,
46
+ "text": "new config line"
47
+ }'
48
+
49
+ # Delete line range
50
+ ccw tool exec edit_file '{
51
+ "path": "log.txt",
52
+ "mode": "line",
53
+ "operation": "delete",
54
+ "line": 5,
55
+ "end_line": 8
56
+ }'
57
+
58
+ # Replace specific line
59
+ ccw tool exec edit_file '{
60
+ "path": "script.sh",
61
+ "mode": "line",
62
+ "operation": "replace",
63
+ "line": 3,
64
+ "text": "#!/bin/bash"
65
+ }'
66
+ ```
67
+
68
+ **Operations**:
69
+ - `insert_before`: Insert text before specified line
70
+ - `insert_after`: Insert text after specified line
71
+ - `replace`: Replace line or line range
72
+ - `delete`: Delete line or line range
73
+
74
+ ### Mode Selection Guide
75
+
76
+ | Scenario | Mode | Reason |
77
+ |----------|------|--------|
78
+ | Code refactoring | update | Content-driven replacement |
79
+ | Function rewrite | update | Simple oldText/newText |
80
+ | Config line change | line | Precise line number control |
81
+ | Insert at specific position | line | Exact line number needed |
82
+ | Delete line range | line | Line-based operation |
83
+
84
+ ### Fallback Strategy
85
+
86
+ 1. **Edit fails 1+ times** → Use `ccw tool exec edit_file` (update mode)
87
+ 2. **update mode fails** → Try line mode with precise line numbers
88
+ 3. **All fails** → Use Write to recreate file
89
+
90
+ **Default mode**: update (exact matching with line ending adaptation)
@@ -433,7 +433,7 @@ The `[FLOW_CONTROL]` marker indicates that a task or prompt contains flow contro
433
433
  "step": "load_context",
434
434
  "action": "Load project context and patterns",
435
435
  "commands": [
436
- "bash(~/.claude/scripts/get_modules_by_depth.sh)",
436
+ "bash(ccw tool exec get_modules_by_depth '{}')",
437
437
  "Read(CLAUDE.md)"
438
438
  ],
439
439
  "output_to": "project_structure",
package/ccw/src/cli.js CHANGED
@@ -6,6 +6,7 @@ import { installCommand } from './commands/install.js';
6
6
  import { uninstallCommand } from './commands/uninstall.js';
7
7
  import { upgradeCommand } from './commands/upgrade.js';
8
8
  import { listCommand } from './commands/list.js';
9
+ import { toolCommand } from './commands/tool.js';
9
10
  import { readFileSync, existsSync } from 'fs';
10
11
  import { fileURLToPath } from 'url';
11
12
  import { dirname, join } from 'path';
@@ -105,5 +106,11 @@ export function run(argv) {
105
106
  .description('List all installed Claude Code Workflow instances')
106
107
  .action(listCommand);
107
108
 
109
+ // Tool command
110
+ program
111
+ .command('tool [subcommand] [args] [json]')
112
+ .description('Execute CCW tools')
113
+ .action((subcommand, args, json) => toolCommand(subcommand, args, { json }));
114
+
108
115
  program.parse(argv);
109
116
  }
@@ -0,0 +1,181 @@
1
+ /**
2
+ * Tool Command - Execute and manage CCW tools
3
+ */
4
+
5
+ import chalk from 'chalk';
6
+ import { listTools, executeTool, getTool, getAllToolSchemas } from '../tools/index.js';
7
+
8
+ /**
9
+ * List all available tools
10
+ */
11
+ async function listAction() {
12
+ const tools = listTools();
13
+
14
+ if (tools.length === 0) {
15
+ console.log(chalk.yellow('No tools registered'));
16
+ return;
17
+ }
18
+
19
+ console.log(chalk.bold.cyan('\nAvailable Tools:\n'));
20
+
21
+ for (const tool of tools) {
22
+ console.log(chalk.bold.white(` ${tool.name}`));
23
+ console.log(chalk.gray(` ${tool.description}`));
24
+
25
+ if (tool.parameters?.properties) {
26
+ const props = tool.parameters.properties;
27
+ const required = tool.parameters.required || [];
28
+
29
+ console.log(chalk.gray(' Parameters:'));
30
+ for (const [name, schema] of Object.entries(props)) {
31
+ const req = required.includes(name) ? chalk.red('*') : '';
32
+ const defaultVal = schema.default !== undefined ? chalk.gray(` (default: ${schema.default})`) : '';
33
+ console.log(chalk.gray(` - ${name}${req}: ${schema.description}${defaultVal}`));
34
+ }
35
+ }
36
+ console.log();
37
+ }
38
+ }
39
+
40
+ /**
41
+ * Show tool schema in MCP-compatible JSON format
42
+ */
43
+ async function schemaAction(options) {
44
+ const { name } = options;
45
+
46
+ if (name) {
47
+ const tool = getTool(name);
48
+ if (!tool) {
49
+ console.error(chalk.red(`Tool not found: ${name}`));
50
+ process.exit(1);
51
+ }
52
+
53
+ const schema = {
54
+ name: tool.name,
55
+ description: tool.description,
56
+ inputSchema: {
57
+ type: 'object',
58
+ properties: tool.parameters?.properties || {},
59
+ required: tool.parameters?.required || []
60
+ }
61
+ };
62
+ console.log(JSON.stringify(schema, null, 2));
63
+ } else {
64
+ const schemas = getAllToolSchemas();
65
+ console.log(JSON.stringify({ tools: schemas }, null, 2));
66
+ }
67
+ }
68
+
69
+ /**
70
+ * Read from stdin if available
71
+ */
72
+ async function readStdin() {
73
+ // Check if stdin is a TTY (interactive terminal)
74
+ if (process.stdin.isTTY) {
75
+ return null;
76
+ }
77
+
78
+ return new Promise((resolve, reject) => {
79
+ let data = '';
80
+
81
+ process.stdin.setEncoding('utf8');
82
+
83
+ process.stdin.on('readable', () => {
84
+ let chunk;
85
+ while ((chunk = process.stdin.read()) !== null) {
86
+ data += chunk;
87
+ }
88
+ });
89
+
90
+ process.stdin.on('end', () => {
91
+ resolve(data.trim() || null);
92
+ });
93
+
94
+ process.stdin.on('error', (err) => {
95
+ reject(err);
96
+ });
97
+ });
98
+ }
99
+
100
+ /**
101
+ * Execute a tool with given parameters
102
+ */
103
+ async function execAction(toolName, jsonInput, options) {
104
+ if (!toolName) {
105
+ console.error(chalk.red('Tool name is required'));
106
+ console.error(chalk.gray('Usage: ccw tool exec <tool-name> \'{"param": "value"}\''));
107
+ process.exit(1);
108
+ }
109
+
110
+ const tool = getTool(toolName);
111
+ if (!tool) {
112
+ console.error(chalk.red(`Tool not found: ${toolName}`));
113
+ console.error(chalk.gray('Use "ccw tool list" to see available tools'));
114
+ process.exit(1);
115
+ }
116
+
117
+ // Parse JSON input (default format)
118
+ let params = {};
119
+
120
+ if (jsonInput) {
121
+ try {
122
+ params = JSON.parse(jsonInput);
123
+ } catch (error) {
124
+ console.error(chalk.red(`Invalid JSON: ${error.message}`));
125
+ process.exit(1);
126
+ }
127
+ }
128
+
129
+ // Check for stdin input (for piped commands)
130
+ const stdinData = await readStdin();
131
+ if (stdinData) {
132
+ // If tool has an 'input' parameter, use it
133
+ // Otherwise, try to parse stdin as JSON and merge with params
134
+ if (tool.parameters?.properties?.input) {
135
+ params.input = stdinData;
136
+ } else {
137
+ try {
138
+ const stdinJson = JSON.parse(stdinData);
139
+ params = { ...stdinJson, ...params };
140
+ } catch {
141
+ // If not JSON, store as 'input' anyway
142
+ params.input = stdinData;
143
+ }
144
+ }
145
+ }
146
+
147
+ // Execute tool
148
+ const result = await executeTool(toolName, params);
149
+
150
+ // Always output JSON
151
+ console.log(JSON.stringify(result, null, 2));
152
+ }
153
+
154
+ /**
155
+ * Tool command entry point
156
+ */
157
+ export async function toolCommand(subcommand, args, options) {
158
+ // Handle subcommands
159
+ switch (subcommand) {
160
+ case 'list':
161
+ await listAction();
162
+ break;
163
+ case 'schema':
164
+ await schemaAction({ name: args });
165
+ break;
166
+ case 'exec':
167
+ await execAction(args, options.json, options);
168
+ break;
169
+ default:
170
+ console.log(chalk.bold.cyan('\nCCW Tool System\n'));
171
+ console.log('Subcommands:');
172
+ console.log(chalk.gray(' list List all available tools'));
173
+ console.log(chalk.gray(' schema [name] Show tool schema (JSON)'));
174
+ console.log(chalk.gray(' exec <name> Execute a tool'));
175
+ console.log();
176
+ console.log('Examples:');
177
+ console.log(chalk.gray(' ccw tool list'));
178
+ console.log(chalk.gray(' ccw tool schema edit_file'));
179
+ console.log(chalk.gray(' ccw tool exec edit_file \'{"path":"file.txt","oldText":"old","newText":"new"}\''));
180
+ }
181
+ }
@@ -8,10 +8,22 @@ const __dirname = dirname(__filename);
8
8
  // Bundled template paths
9
9
  const UNIFIED_TEMPLATE = join(__dirname, '../templates/dashboard.html');
10
10
  const JS_FILE = join(__dirname, '../templates/dashboard.js');
11
- const CSS_FILE = join(__dirname, '../templates/dashboard.css');
11
+ const MODULE_CSS_DIR = join(__dirname, '../templates/dashboard-css');
12
12
  const WORKFLOW_TEMPLATE = join(__dirname, '../templates/workflow-dashboard.html');
13
13
  const REVIEW_TEMPLATE = join(__dirname, '../templates/review-cycle-dashboard.html');
14
14
 
15
+ // Modular CSS files in load order
16
+ const MODULE_CSS_FILES = [
17
+ '01-base.css',
18
+ '02-session.css',
19
+ '03-tasks.css',
20
+ '04-lite-tasks.css',
21
+ '05-context.css',
22
+ '06-cards.css',
23
+ '07-managers.css',
24
+ '08-review.css'
25
+ ];
26
+
15
27
  const MODULE_FILES = [
16
28
  'utils.js',
17
29
  'state.js',
@@ -63,8 +75,11 @@ export async function generateDashboard(data) {
63
75
  function generateFromUnifiedTemplate(data) {
64
76
  let html = readFileSync(UNIFIED_TEMPLATE, 'utf8');
65
77
 
66
- // Read CSS file
67
- let cssContent = existsSync(CSS_FILE) ? readFileSync(CSS_FILE, 'utf8') : '';
78
+ // Read and concatenate modular CSS files in load order
79
+ let cssContent = MODULE_CSS_FILES.map(file => {
80
+ const filePath = join(MODULE_CSS_DIR, file);
81
+ return existsSync(filePath) ? readFileSync(filePath, 'utf8') : '';
82
+ }).join('\n\n');
68
83
 
69
84
  // Read JS content
70
85
  let jsContent = '';
@@ -54,20 +54,36 @@ function scanLiteDir(dir, type) {
54
54
  }
55
55
 
56
56
  /**
57
- * Load plan.json from session directory
57
+ * Load plan.json or fix-plan.json from session directory
58
58
  * @param {string} sessionPath - Session directory path
59
59
  * @returns {Object|null} - Plan data or null
60
60
  */
61
61
  function loadPlanJson(sessionPath) {
62
+ // Try fix-plan.json first (for lite-fix), then plan.json (for lite-plan)
63
+ const fixPlanPath = join(sessionPath, 'fix-plan.json');
62
64
  const planPath = join(sessionPath, 'plan.json');
63
- if (!existsSync(planPath)) return null;
64
65
 
65
- try {
66
- const content = readFileSync(planPath, 'utf8');
67
- return JSON.parse(content);
68
- } catch {
69
- return null;
66
+ // Try fix-plan.json first
67
+ if (existsSync(fixPlanPath)) {
68
+ try {
69
+ const content = readFileSync(fixPlanPath, 'utf8');
70
+ return JSON.parse(content);
71
+ } catch {
72
+ // Continue to try plan.json
73
+ }
70
74
  }
75
+
76
+ // Fallback to plan.json
77
+ if (existsSync(planPath)) {
78
+ try {
79
+ const content = readFileSync(planPath, 'utf8');
80
+ return JSON.parse(content);
81
+ } catch {
82
+ return null;
83
+ }
84
+ }
85
+
86
+ return null;
71
87
  }
72
88
 
73
89
  /**
@@ -91,6 +107,7 @@ function loadTaskJsons(sessionPath) {
91
107
  f.startsWith('IMPL-') ||
92
108
  f.startsWith('TASK-') ||
93
109
  f.startsWith('task-') ||
110
+ f.startsWith('diagnosis-') ||
94
111
  /^T\d+\.json$/i.test(f)
95
112
  ))
96
113
  .map(f => {
@@ -109,12 +126,18 @@ function loadTaskJsons(sessionPath) {
109
126
  }
110
127
  }
111
128
 
112
- // Method 2: Check plan.json for embedded tasks array
129
+ // Method 2: Check plan.json or fix-plan.json for embedded tasks array
113
130
  if (tasks.length === 0) {
131
+ // Try fix-plan.json first (for lite-fix), then plan.json (for lite-plan)
132
+ const fixPlanPath = join(sessionPath, 'fix-plan.json');
114
133
  const planPath = join(sessionPath, 'plan.json');
115
- if (existsSync(planPath)) {
134
+
135
+ const planFile = existsSync(fixPlanPath) ? fixPlanPath :
136
+ existsSync(planPath) ? planPath : null;
137
+
138
+ if (planFile) {
116
139
  try {
117
- const plan = JSON.parse(readFileSync(planPath, 'utf8'));
140
+ const plan = JSON.parse(readFileSync(planFile, 'utf8'));
118
141
  if (Array.isArray(plan.tasks)) {
119
142
  tasks = plan.tasks.map(t => normalizeTask(t));
120
143
  }
@@ -124,13 +147,14 @@ function loadTaskJsons(sessionPath) {
124
147
  }
125
148
  }
126
149
 
127
- // Method 3: Check for task-*.json files in session root
150
+ // Method 3: Check for task-*.json and diagnosis-*.json files in session root
128
151
  if (tasks.length === 0) {
129
152
  try {
130
153
  const rootTasks = readdirSync(sessionPath)
131
154
  .filter(f => f.endsWith('.json') && (
132
155
  f.startsWith('task-') ||
133
156
  f.startsWith('TASK-') ||
157
+ f.startsWith('diagnosis-') ||
134
158
  /^T\d+\.json$/i.test(f)
135
159
  ))
136
160
  .map(f => {