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.
- package/.claude/agents/action-planning-agent.md +1 -1
- package/.claude/agents/cli-execution-agent.md +269 -269
- package/.claude/agents/cli-explore-agent.md +182 -182
- package/.claude/agents/context-search-agent.md +582 -582
- package/.claude/agents/memory-bridge.md +93 -93
- package/.claude/commands/cli/cli-init.md +1 -1
- package/.claude/commands/memory/docs-full-cli.md +471 -471
- package/.claude/commands/memory/docs-related-cli.md +386 -386
- package/.claude/commands/memory/docs.md +615 -615
- package/.claude/commands/memory/load.md +1 -1
- package/.claude/commands/memory/update-full.md +332 -332
- package/.claude/commands/memory/update-related.md +5 -5
- package/.claude/commands/workflow/init.md +1 -1
- package/.claude/commands/workflow/lite-fix.md +621 -621
- package/.claude/commands/workflow/lite-plan.md +592 -592
- package/.claude/commands/workflow/tools/context-gather.md +434 -434
- package/.claude/commands/workflow/ui-design/generate.md +504 -504
- package/.claude/commands/workflow/ui-design/import-from-code.md +537 -537
- package/.claude/scripts/classify-folders.sh +4 -0
- package/.claude/scripts/convert_tokens_to_css.sh +4 -0
- package/.claude/scripts/detect_changed_modules.sh +5 -1
- package/.claude/scripts/discover-design-files.sh +87 -83
- package/.claude/scripts/generate_module_docs.sh +717 -713
- package/.claude/scripts/get_modules_by_depth.sh +5 -1
- package/.claude/scripts/ui-generate-preview.sh +4 -0
- package/.claude/scripts/ui-instantiate-prototypes.sh +4 -0
- package/.claude/scripts/update_module_claude.sh +4 -0
- package/.claude/skills/command-guide/index/all-commands.json +1 -12
- package/.claude/skills/command-guide/index/by-category.json +1 -12
- package/.claude/skills/command-guide/index/by-use-case.json +1 -12
- package/.claude/skills/command-guide/index/essential-commands.json +1 -12
- package/.claude/skills/command-guide/reference/agents/action-planning-agent.md +127 -71
- package/.claude/skills/command-guide/reference/agents/cli-execution-agent.md +269 -269
- package/.claude/skills/command-guide/reference/agents/cli-explore-agent.md +182 -182
- package/.claude/skills/command-guide/reference/agents/conceptual-planning-agent.md +18 -38
- package/.claude/skills/command-guide/reference/agents/context-search-agent.md +582 -577
- package/.claude/skills/command-guide/reference/agents/memory-bridge.md +93 -93
- package/.claude/skills/command-guide/reference/commands/cli/cli-init.md +1 -1
- package/.claude/skills/command-guide/reference/commands/memory/docs-full-cli.md +471 -471
- package/.claude/skills/command-guide/reference/commands/memory/docs-related-cli.md +386 -386
- package/.claude/skills/command-guide/reference/commands/memory/docs.md +615 -610
- package/.claude/skills/command-guide/reference/commands/memory/load.md +1 -1
- package/.claude/skills/command-guide/reference/commands/memory/update-full.md +332 -332
- package/.claude/skills/command-guide/reference/commands/memory/update-related.md +5 -5
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/artifacts.md +299 -451
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/auto-parallel.md +14 -37
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/synthesis.md +252 -350
- package/.claude/skills/command-guide/reference/commands/workflow/init.md +2 -2
- package/.claude/skills/command-guide/reference/commands/workflow/lite-execute.md +52 -0
- package/.claude/skills/command-guide/reference/commands/workflow/lite-fix.md +621 -602
- package/.claude/skills/command-guide/reference/commands/workflow/lite-plan.md +46 -36
- package/.claude/skills/command-guide/reference/commands/workflow/review-fix.md +18 -58
- package/.claude/skills/command-guide/reference/commands/workflow/review-module-cycle.md +22 -52
- package/.claude/skills/command-guide/reference/commands/workflow/review-session-cycle.md +19 -48
- package/.claude/skills/command-guide/reference/commands/workflow/session/start.md +25 -5
- package/.claude/skills/command-guide/reference/commands/workflow/tdd-plan.md +1 -1
- package/.claude/skills/command-guide/reference/commands/workflow/test-fix-gen.md +7 -7
- package/.claude/skills/command-guide/reference/commands/workflow/tools/context-gather.md +434 -434
- package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-agent.md +151 -11
- package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-tdd.md +4 -4
- package/.claude/skills/command-guide/reference/commands/workflow/tools/test-task-generate.md +1 -1
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/generate.md +504 -504
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/import-from-code.md +537 -537
- package/.claude/workflows/context-search-strategy.md +77 -77
- package/.claude/workflows/tool-strategy.md +90 -71
- package/.claude/workflows/workflow-architecture.md +1 -1
- package/ccw/src/cli.js +7 -0
- package/ccw/src/commands/tool.js +181 -0
- package/ccw/src/core/dashboard-generator.js +18 -3
- package/ccw/src/core/lite-scanner.js +35 -11
- package/ccw/src/core/server.js +531 -46
- package/ccw/src/templates/dashboard-css/01-base.css +161 -0
- package/ccw/src/templates/dashboard-css/02-session.css +726 -0
- package/ccw/src/templates/dashboard-css/03-tasks.css +512 -0
- package/ccw/src/templates/dashboard-css/04-lite-tasks.css +843 -0
- package/ccw/src/templates/dashboard-css/05-context.css +2206 -0
- package/ccw/src/templates/dashboard-css/06-cards.css +1570 -0
- package/ccw/src/templates/dashboard-css/07-managers.css +936 -0
- package/ccw/src/templates/dashboard-css/08-review.css +1266 -0
- package/ccw/src/templates/dashboard-css/09-explorer.css +1397 -0
- package/ccw/src/templates/dashboard-js/components/global-notifications.js +219 -0
- package/ccw/src/templates/dashboard-js/components/hook-manager.js +10 -0
- package/ccw/src/templates/dashboard-js/components/mcp-manager.js +11 -1
- package/ccw/src/templates/dashboard-js/components/navigation.js +11 -5
- package/ccw/src/templates/dashboard-js/components/tabs-context.js +20 -20
- package/ccw/src/templates/dashboard-js/components/tabs-other.js +11 -11
- package/ccw/src/templates/dashboard-js/components/theme.js +29 -1
- package/ccw/src/templates/dashboard-js/main.js +4 -0
- package/ccw/src/templates/dashboard-js/state.js +5 -0
- package/ccw/src/templates/dashboard-js/views/explorer.js +852 -0
- package/ccw/src/templates/dashboard-js/views/home.js +13 -9
- package/ccw/src/templates/dashboard-js/views/hook-manager.js +8 -5
- package/ccw/src/templates/dashboard-js/views/lite-tasks.js +21 -16
- package/ccw/src/templates/dashboard-js/views/mcp-manager.js +90 -19
- package/ccw/src/templates/dashboard-js/views/project-overview.js +15 -11
- package/ccw/src/templates/dashboard-js/views/review-session.js +3 -3
- package/ccw/src/templates/dashboard-js/views/session-detail.js +38 -28
- package/ccw/src/templates/dashboard.html +129 -28
- package/ccw/src/tools/classify-folders.js +204 -0
- package/ccw/src/tools/convert-tokens-to-css.js +250 -0
- package/ccw/src/tools/detect-changed-modules.js +288 -0
- package/ccw/src/tools/discover-design-files.js +134 -0
- package/ccw/src/tools/edit-file.js +266 -0
- package/ccw/src/tools/generate-module-docs.js +416 -0
- package/ccw/src/tools/get-modules-by-depth.js +308 -0
- package/ccw/src/tools/index.js +176 -0
- package/ccw/src/tools/ui-generate-preview.js +327 -0
- package/ccw/src/tools/ui-instantiate-prototypes.js +301 -0
- package/ccw/src/tools/update-module-claude.js +380 -0
- package/package.json +1 -1
- package/.claude/skills/command-guide/reference/commands/workflow/status.md +0 -352
- package/ccw/src/core/server.js.bak +0 -385
- package/ccw/src/core/server_original.bak +0 -385
- package/ccw/src/templates/dashboard.css +0 -8187
- package/ccw/src/templates/dashboard_tailwind.html +0 -42
- package/ccw/src/templates/dashboard_test.html +0 -37
- 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
|
-
|
|
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
|
-
## ⚡
|
|
14
|
-
|
|
15
|
-
**When to Use**: Edit tool fails 2+ times on same file
|
|
16
|
-
|
|
17
|
-
###
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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(
|
|
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
|
|
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
|
|
67
|
-
let cssContent =
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
|
|
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(
|
|
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 => {
|