Compare commits

..

4 Commits

Author SHA1 Message Date
catlog22
faa86eded0 docs: add changelog entries for 6.1.2 and 6.1.3
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 15:53:15 +08:00
catlog22
44fa6e0a42 chore: bump version to 6.1.3
- Update README version badge and release notes
- Published to npm with simplified edit_file CLI

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 15:52:43 +08:00
catlog22
be9a1c76d4 refactor(tool): simplify edit_file to parameter-based input only
- Remove JSON input support, use CLI parameters only
- Remove line mode, keep text replacement only
- Add sed as line operation alternative in tool-strategy.md
- Update documentation to English

Usage: ccw tool exec edit_file --path file.txt --old "old" --new "new"

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 15:50:35 +08:00
catlog22
fcc811d6a1 docs(readme): update to v6.1.2 and simplify installation
- Update version badge and release notes to v6.1.2
- Remove one-click script install section (npm only)
- Update changelog highlights for latest release

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 15:41:39 +08:00
7 changed files with 109 additions and 177 deletions

View File

@@ -14,71 +14,66 @@
**When to Use**: Edit tool fails 1+ times on same file **When to Use**: Edit tool fails 1+ times on same file
### update Mode (Default) ### Usage
**Best for**: Code block replacements, function rewrites, multi-line changes **Best for**: Code block replacements, function rewrites, multi-line changes
```bash ```bash
ccw tool exec edit_file '{ ccw tool exec edit_file --path "file.py" --old "def old():
"path": "file.py", pass" --new "def new():
"oldText": "def old():\n pass", return True"
"newText": "def new():\n return True"
}'
``` ```
### line Mode (Precise Line Operations) **Parameters**:
- `--path`: File path to edit
- `--old`: Text to find and replace
- `--new`: New text to insert
**Best for**: Config files, line insertions/deletions, precise line number control **Features**:
- ✅ Exact text matching (precise and predictable)
```bash - ✅ Auto line ending adaptation (CRLF/LF)
# Insert after specific line - ✅ No JSON escaping issues
ccw tool exec edit_file '{ - ✅ Multi-line text supported with quotes
"path": "config.txt",
"mode": "line",
"operation": "insert_after",
"line": 10,
"text": "new config line"
}'
# Delete line range
ccw tool exec edit_file '{
"path": "log.txt",
"mode": "line",
"operation": "delete",
"line": 5,
"end_line": 8
}'
# Replace specific line
ccw tool exec edit_file '{
"path": "script.sh",
"mode": "line",
"operation": "replace",
"line": 3,
"text": "#!/bin/bash"
}'
```
**Operations**:
- `insert_before`: Insert text before specified line
- `insert_after`: Insert text after specified line
- `replace`: Replace line or line range
- `delete`: Delete line or line range
### Mode Selection Guide
| Scenario | Mode | Reason |
|----------|------|--------|
| Code refactoring | update | Content-driven replacement |
| Function rewrite | update | Simple oldText/newText |
| Config line change | line | Precise line number control |
| Insert at specific position | line | Exact line number needed |
| Delete line range | line | Line-based operation |
### Fallback Strategy ### Fallback Strategy
1. **Edit fails 1+ times** → Use `ccw tool exec edit_file` (update mode) 1. **Edit fails 1+ times** → Use `ccw tool exec edit_file`
2. **update mode fails**Try line mode with precise line numbers 2. **Still fails**Use Write to recreate file
3. **All fails** → Use Write to recreate file
**Default mode**: update (exact matching with line ending adaptation) ## ⚡ sed Line Operations (Line Mode Alternative)
**When to Use**: Precise line number control (insert, delete, replace specific lines)
### Common Operations
```bash
# Insert after line 10
sed -i '10a\new line content' file.txt
# Insert before line 5
sed -i '5i\new line content' file.txt
# Delete line 3
sed -i '3d' file.txt
# Delete lines 5-8
sed -i '5,8d' file.txt
# Replace line 3 content
sed -i '3c\replacement line' file.txt
# Replace lines 3-5 content
sed -i '3,5c\single replacement line' file.txt
```
### Operation Reference
| Operation | Command | Example |
|-----------|---------|---------|
| Insert after | `Na\text` | `sed -i '10a\new' file` |
| Insert before | `Ni\text` | `sed -i '5i\new' file` |
| Delete line | `Nd` | `sed -i '3d' file` |
| Delete range | `N,Md` | `sed -i '5,8d' file` |
| Replace line | `Nc\text` | `sed -i '3c\new' file` |
**Note**: Use `sed -i` for in-place file modification (works in Git Bash on Windows)

View File

@@ -5,6 +5,33 @@ All notable changes to Claude Code Workflow (CCW) will be documented in this fil
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [6.1.3] - 2025-12-09
### 🔧 CLI Tool Simplification
This release simplifies the `ccw tool exec edit_file` command for better usability.
#### 🔄 Changed
- **Simplified edit_file**: Removed JSON input support, now uses parameter-based input only (`--path`, `--old`, `--new`)
- **Removed line mode**: Line operations now recommended via `sed` command
- **Updated tool-strategy.md**: Added sed as line operation alternative with usage examples
#### Usage
```bash
ccw tool exec edit_file --path "file.txt" --old "old text" --new "new text"
```
## [6.1.2] - 2025-12-09
### 🔔 Dashboard Update Notification & Bug Fixes
#### ✨ Added
- **Version Update Notification**: Dashboard now checks npm registry for updates and displays upgrade banner
- **Version Check API**: New `/api/version-check` endpoint with 1-hour cache
#### 🐛 Fixed
- **Hook Manager**: Fixed button click event handling for edit/delete operations (changed `e.target` to `e.currentTarget`)
## [5.9.6] - 2025-11-28 ## [5.9.6] - 2025-11-28
### 🚀 Review Cycle & Dashboard Enhancement ### 🚀 Review Cycle & Dashboard Enhancement

View File

@@ -5,7 +5,7 @@
<div align="center"> <div align="center">
[![Version](https://img.shields.io/badge/version-v6.1.0-blue.svg)](https://github.com/catlog22/Claude-Code-Workflow/releases) [![Version](https://img.shields.io/badge/version-v6.1.3-blue.svg)](https://github.com/catlog22/Claude-Code-Workflow/releases)
[![npm](https://img.shields.io/npm/v/claude-code-workflow.svg)](https://www.npmjs.com/package/claude-code-workflow) [![npm](https://img.shields.io/npm/v/claude-code-workflow.svg)](https://www.npmjs.com/package/claude-code-workflow)
[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE) [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
[![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20Linux%20%7C%20macOS-lightgrey.svg)]() [![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20Linux%20%7C%20macOS-lightgrey.svg)]()
@@ -18,13 +18,11 @@
**Claude Code Workflow (CCW)** is a JSON-driven multi-agent development framework with intelligent CLI orchestration (Gemini/Qwen/Codex), context-first architecture, and automated workflow execution. It transforms AI development from simple prompt chaining into a powerful orchestration system. **Claude Code Workflow (CCW)** is a JSON-driven multi-agent development framework with intelligent CLI orchestration (Gemini/Qwen/Codex), context-first architecture, and automated workflow execution. It transforms AI development from simple prompt chaining into a powerful orchestration system.
> **🎉 Version 6.1.0: Dashboard Icon Unification & CCW Tool System** > **🎉 Version 6.1.3: CLI Tool Simplification**
> >
> **Core Improvements**: > **Core Improvements**:
> - 🎨 **Dashboard Icon Unification**: Complete migration to Lucide Icons library across all views > - 🔧 **Simplified edit_file**: Parameter-based input only (`--path`, `--old`, `--new`)
> - 🛠️ **CCW Tool Exec System**: New `ccw tool exec` command for executing tools with JSON parameters > - 📝 **Updated tool-strategy.md**: Added sed as line operation alternative
> - 🚀 **Explorer Enhancements**: Async task execution, CLI selector improvements, WebSocket frame handling
> - ✨ **Smart Server Recognition**: Intelligent workspace switching and MCP multi-source configuration
> >
> See [CHANGELOG.md](CHANGELOG.md) for complete details. > See [CHANGELOG.md](CHANGELOG.md) for complete details.
@@ -66,18 +64,6 @@ ccw install -m Global
ccw install -m Path -p /path/to/project ccw install -m Path -p /path/to/project
``` ```
### **🚀 Alternative: One-Click Script Install**
**Windows (PowerShell):**
```powershell
Invoke-Expression (Invoke-WebRequest -Uri "https://raw.githubusercontent.com/catlog22/Claude-Code-Workflow/main/install-remote.ps1" -UseBasicParsing).Content
```
**Linux/macOS (Bash/Zsh):**
```bash
bash <(curl -fsSL https://raw.githubusercontent.com/catlog22/Claude-Code-Workflow/main/install-remote.sh)
```
### **✅ Verify Installation** ### **✅ Verify Installation**
After installation, open **Claude Code** and verify that workflow commands are available by running: After installation, open **Claude Code** and verify that workflow commands are available by running:
```bash ```bash

View File

@@ -108,9 +108,12 @@ export function run(argv) {
// Tool command // Tool command
program program
.command('tool [subcommand] [args] [json]') .command('tool [subcommand] [args]')
.description('Execute CCW tools') .description('Execute CCW tools')
.action((subcommand, args, json) => toolCommand(subcommand, args, { json })); .option('--path <path>', 'File path (for edit_file)')
.option('--old <text>', 'Old text to replace (for edit_file)')
.option('--new <text>', 'New text (for edit_file)')
.action((subcommand, args, options) => toolCommand(subcommand, args, options));
program.parse(argv); program.parse(argv);
} }

View File

@@ -66,80 +66,13 @@ async function schemaAction(options) {
} }
} }
/**
* Read from stdin if available
*/
async function readStdin() {
// Check if stdin is a TTY (interactive terminal)
if (process.stdin.isTTY) {
return null;
}
return new Promise((resolve, reject) => {
let data = '';
process.stdin.setEncoding('utf8');
process.stdin.on('readable', () => {
let chunk;
while ((chunk = process.stdin.read()) !== null) {
data += chunk;
}
});
process.stdin.on('end', () => {
resolve(data.trim() || null);
});
process.stdin.on('error', (err) => {
reject(err);
});
});
}
/**
* Smart JSON parser with Windows path handling
*/
function parseJsonWithPathFix(jsonString) {
try {
// Try normal parse first
return JSON.parse(jsonString);
} catch (firstError) {
// If parsing fails, try to fix Windows paths
try {
// Pattern: "path": "X:\..." or "path":"X:\..."
const fixedJson = jsonString.replace(
/("(?:path|file|target|source|dest|destination)":\s*")([A-Za-z]:[^"]+)"/g,
(match, prefix, path) => {
// Convert backslashes to forward slashes (universal)
const fixedPath = path.replace(/\\/g, '/');
return `${prefix}${fixedPath}"`;
}
);
return JSON.parse(fixedJson);
} catch (secondError) {
// If still fails, throw original error with helpful message
const errorMsg = firstError.message;
const hint = errorMsg.includes('escaped character') || errorMsg.includes('position')
? '\n\n' + chalk.yellow('Hint: Windows paths in JSON need forward slashes or double backslashes:') +
'\n ' + chalk.green('✓ "D:/Claude_dms3/file.md"') +
'\n ' + chalk.green('✓ "D:\\\\Claude_dms3\\\\file.md"') +
'\n ' + chalk.red('✗ "D:\\Claude_dms3\\file.md"')
: '';
throw new Error(errorMsg + hint);
}
}
}
/** /**
* Execute a tool with given parameters * Execute a tool with given parameters
*/ */
async function execAction(toolName, jsonInput, options) { async function execAction(toolName, options) {
if (!toolName) { if (!toolName) {
console.error(chalk.red('Tool name is required')); console.error(chalk.red('Tool name is required'));
console.error(chalk.gray('Usage: ccw tool exec <tool-name> \'{"param": "value"}\'')); console.error(chalk.gray('Usage: ccw tool exec edit_file --path file.txt --old "old" --new "new"'));
process.exit(1); process.exit(1);
} }
@@ -150,34 +83,22 @@ async function execAction(toolName, jsonInput, options) {
process.exit(1); process.exit(1);
} }
// Parse JSON input (default format) // Build params from CLI options
let params = {}; const params = {};
if (jsonInput) { if (toolName === 'edit_file') {
try { if (!options.path || !options.old || !options.new) {
params = parseJsonWithPathFix(jsonInput); console.error(chalk.red('edit_file requires --path, --old, and --new parameters'));
} catch (error) { console.error(chalk.gray('Usage: ccw tool exec edit_file --path file.txt --old "old text" --new "new text"'));
console.error(chalk.red(`Invalid JSON: ${error.message}`));
process.exit(1); process.exit(1);
} }
} params.path = options.path;
params.oldText = options.old;
// Check for stdin input (for piped commands) params.newText = options.new;
const stdinData = await readStdin(); } else {
if (stdinData) { console.error(chalk.red(`Tool "${toolName}" is not supported via CLI parameters`));
// If tool has an 'input' parameter, use it console.error(chalk.gray('Currently only edit_file is supported'));
// Otherwise, try to parse stdin as JSON and merge with params process.exit(1);
if (tool.parameters?.properties?.input) {
params.input = stdinData;
} else {
try {
const stdinJson = JSON.parse(stdinData);
params = { ...stdinJson, ...params };
} catch {
// If not JSON, store as 'input' anyway
params.input = stdinData;
}
}
} }
// Execute tool // Execute tool
@@ -200,7 +121,7 @@ export async function toolCommand(subcommand, args, options) {
await schemaAction({ name: args }); await schemaAction({ name: args });
break; break;
case 'exec': case 'exec':
await execAction(args, options.json, options); await execAction(args, options);
break; break;
default: default:
console.log(chalk.bold.cyan('\nCCW Tool System\n')); console.log(chalk.bold.cyan('\nCCW Tool System\n'));
@@ -209,9 +130,9 @@ export async function toolCommand(subcommand, args, options) {
console.log(chalk.gray(' schema [name] Show tool schema (JSON)')); console.log(chalk.gray(' schema [name] Show tool schema (JSON)'));
console.log(chalk.gray(' exec <name> Execute a tool')); console.log(chalk.gray(' exec <name> Execute a tool'));
console.log(); console.log();
console.log('Examples:'); console.log('Usage:');
console.log(chalk.gray(' ccw tool list')); console.log(chalk.gray(' ccw tool list'));
console.log(chalk.gray(' ccw tool schema edit_file')); console.log(chalk.gray(' ccw tool schema edit_file'));
console.log(chalk.gray(' ccw tool exec edit_file \'{"path":"file.txt","oldText":"old","newText":"new"}\'')); console.log(chalk.gray(' ccw tool exec edit_file --path file.txt --old "old text" --new "new text"'));
} }
} }

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{ {
"name": "claude-code-workflow", "name": "claude-code-workflow",
"version": "6.0.5", "version": "6.1.3",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "claude-code-workflow", "name": "claude-code-workflow",
"version": "6.0.5", "version": "6.1.3",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"boxen": "^7.1.0", "boxen": "^7.1.0",

View File

@@ -1,6 +1,6 @@
{ {
"name": "claude-code-workflow", "name": "claude-code-workflow",
"version": "6.1.2", "version": "6.1.3",
"description": "JSON-driven multi-agent development framework with intelligent CLI orchestration (Gemini/Qwen/Codex), context-first architecture, and automated workflow execution", "description": "JSON-driven multi-agent development framework with intelligent CLI orchestration (Gemini/Qwen/Codex), context-first architecture, and automated workflow execution",
"type": "module", "type": "module",
"main": "ccw/src/index.js", "main": "ccw/src/index.js",