From 200812d204481aaebf8e00518d967c04459b74f0 Mon Sep 17 00:00:00 2001 From: catlog22 Date: Tue, 20 Jan 2026 22:14:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=20CLI=20=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E8=B0=83=E7=94=A8=E8=A7=A6=E5=8F=91=E5=99=A8=E5=92=8C?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E5=8E=9F=E5=88=99=EF=BC=8C=E5=A2=9E=E5=BC=BA?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .claude/CLAUDE.md | 18 ++------- .claude/workflows/cli-tools-usage.md | 37 ++++++++++++++++++- .../examples/simple_search_comparison.py | 21 +++++++++-- 3 files changed, 56 insertions(+), 20 deletions(-) diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index 747c64c0..d7b1872a 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -37,21 +37,9 @@ Available CLI endpoints are dynamically defined by the config file: - Aggregate multiple analysis results before proposing solutions ### CLI Auto-Invoke Triggers - -**Proactive CLI invocation scenarios** - Auto-invoke `ccw cli` for external analysis in these cases: - -| Trigger Condition | Recommended Mode | Description | -|-------------------|------------------|-------------| -| **Bug fix fails after 1+ attempts** | `--mode analysis --rule analysis-diagnose-bug-root-cause` | Invoke CLI for root cause analysis when self-repair attempts fail | -| **Unclear task description** | `--mode analysis --rule planning-breakdown-task-steps` | Invoke CLI for task decomposition when requirements are ambiguous | -| **Quick planning needed** | `--mode analysis --rule planning-plan-architecture-design` | Invoke CLI for architecture design on complex feature requests | -| **Uncertain code patterns** | `--mode analysis --rule analysis-analyze-code-patterns` | Invoke CLI to analyze existing code style/patterns when uncertain | -| **Security/performance critical paths** | `--mode analysis --rule analysis-assess-security-risks` | Proactively request review for security or performance-sensitive code | - -**Execution principles**: -- When trigger conditions are met, invoke CLI **without user confirmation** -- Wait for results before determining next steps -- Tool fallback chain: `gemini` → `qwen` → `codex` +- **Reference**: See `cli-tools-usage.md` → [Auto-Invoke Triggers](#auto-invoke-triggers) for full specification +- **Key scenarios**: Self-repair fails, ambiguous requirements, architecture decisions, pattern uncertainty, critical code paths +- **Principles**: Default `--mode analysis`, no confirmation needed, wait for completion, flexible rule selection ## Code Diagnostics diff --git a/.claude/workflows/cli-tools-usage.md b/.claude/workflows/cli-tools-usage.md index 46c3803c..071ab5df 100644 --- a/.claude/workflows/cli-tools-usage.md +++ b/.claude/workflows/cli-tools-usage.md @@ -5,7 +5,7 @@ 2. [Tool Selection](#tool-selection) 3. [Prompt Template](#prompt-template) 4. [CLI Execution](#cli-execution) -5. [Execution Configuration](#execution-configuration) +5. [Auto-Invoke Triggers](#auto-invoke-triggers) 6. [Best Practices](#best-practices) --- @@ -462,6 +462,41 @@ ccw cli --tool codex --mode review --commit abc123 --- +## Auto-Invoke Triggers + +**Proactive CLI invocation** - Auto-invoke `ccw cli` when encountering these scenarios: + +| Trigger Condition | Suggested Rule | When to Use | +|-------------------|----------------|-------------| +| **Self-repair fails** | `analysis-diagnose-bug-root-cause` | After 1+ failed fix attempts | +| **Ambiguous requirements** | `planning-breakdown-task-steps` | Task description lacks clarity | +| **Architecture decisions** | `planning-plan-architecture-design` | Complex feature needs design | +| **Pattern uncertainty** | `analysis-analyze-code-patterns` | Unsure of existing conventions | +| **Critical code paths** | `analysis-assess-security-risks` | Security/performance sensitive | + +### Execution Principles + +- **Default mode**: `--mode analysis` (read-only, safe for auto-execution) +- **No confirmation needed**: Invoke proactively when triggers match +- **Wait for results**: Complete analysis before next action +- **Tool selection**: Use context-appropriate tool or fallback chain (`gemini` → `qwen` → `codex`) +- **Rule flexibility**: Suggested rules are guidelines, not requirements - choose the most appropriate template for the situation + +### Example: Bug Fix with Auto-Invoke + +```bash +# After 1+ failed fix attempts, auto-invoke root cause analysis +ccw cli -p "PURPOSE: Identify root cause of [bug description]; success = actionable fix strategy +TASK: • Trace execution flow • Identify failure point • Analyze state at failure • Determine fix approach +MODE: analysis +CONTEXT: @src/module/**/* | Memory: Previous fix attempts failed at [location] +EXPECTED: Root cause analysis with: failure mechanism, stack trace interpretation, fix recommendation with code +CONSTRAINTS: Focus on [specific area] +" --tool gemini --mode analysis --rule analysis-diagnose-bug-root-cause +``` + +--- + ## Best Practices ### Core Principles diff --git a/codex-lens/examples/simple_search_comparison.py b/codex-lens/examples/simple_search_comparison.py index d55bb271..3fdbeaee 100644 --- a/codex-lens/examples/simple_search_comparison.py +++ b/codex-lens/examples/simple_search_comparison.py @@ -12,8 +12,15 @@ Usage: import subprocess import time import json +import re +import os from pathlib import Path +def strip_ansi(text: str) -> str: + """Remove ANSI color codes from text.""" + ansi_escape = re.compile(r'\x1b\[[0-9;]*m') + return ansi_escape.sub('', text) + def run_search(query: str, method: str, limit: int = 20) -> tuple[list, float]: """Run search via CLI and measure time.""" cmd = [ @@ -31,19 +38,25 @@ def run_search(query: str, method: str, limit: int = 20) -> tuple[list, float]: cwd=str(Path("D:/Claude_dms3/codex-lens/src")), capture_output=True, text=True, + env={**os.environ, "NO_COLOR": "1"}, # Try to disable colors ) elapsed = time.perf_counter() - start if result.returncode != 0: print(f"Error running {method} search:") - print(result.stderr) + print(result.stderr[:200]) return [], elapsed try: - data = json.loads(result.stdout) + # Strip ANSI codes and parse JSON + clean_output = strip_ansi(result.stdout) + data = json.loads(clean_output) + # Results are nested in "result" object + if "result" in data and "results" in data["result"]: + return data["result"]["results"], elapsed return data.get("results", []), elapsed - except json.JSONDecodeError: - print(f"Failed to parse JSON output for {method}") + except json.JSONDecodeError as e: + print(f"Failed to parse JSON output for {method}: {e}") return [], elapsed