docs(03-01): complete command executor plan
This commit is contained in:
@@ -0,0 +1,142 @@
|
||||
---
|
||||
phase: 03-orchestration
|
||||
plan: 01
|
||||
subsystem: orchestration
|
||||
tags: [tmux, command-execution, output-capture, error-detection, libtmux]
|
||||
|
||||
# Dependency graph
|
||||
requires:
|
||||
- phase: 01-core-infrastructure
|
||||
provides: TmuxSession, TmuxSessionManager for session management
|
||||
provides:
|
||||
- CommandExecutor class for sending commands and capturing output
|
||||
- OutputCapture class for prompt detection and stabilization
|
||||
- CommandResult dataclass for execution results
|
||||
affects: [03-02, 03-03, 04-full-command-support]
|
||||
|
||||
# Tech tracking
|
||||
tech-stack:
|
||||
added: []
|
||||
patterns:
|
||||
- Mock-based testing for tmux integration (no real tmux server required)
|
||||
- Content-hash based stabilization detection
|
||||
- Word-boundary matching for ASCII error keywords, substring for non-ASCII
|
||||
|
||||
key-files:
|
||||
created:
|
||||
- src/gsd_openclaw/command_executor.py
|
||||
- tests/test_command_executor.py
|
||||
modified:
|
||||
- src/gsd_openclaw/__init__.py
|
||||
|
||||
key-decisions:
|
||||
- "60 second default timeout for command execution (from CONTEXT.md user decision)"
|
||||
- "3 consecutive polls with same output hash for stabilization detection"
|
||||
- "Word-boundary regex for ASCII error keywords, simple substring for Chinese"
|
||||
|
||||
patterns-established:
|
||||
- "CommandResult dataclass with output, completed, has_error, error_type fields"
|
||||
- "OutputCapture with PROMPT_PATTERNS for shell prompt detection"
|
||||
- "CommandExecutor with ERROR_KEYWORDS for error detection"
|
||||
|
||||
requirements-completed: [BRDG-02, BRDG-03]
|
||||
|
||||
# Metrics
|
||||
duration: 5min
|
||||
completed: 2026-03-11
|
||||
---
|
||||
|
||||
# Phase 3 Plan 1: Command Execution Layer Summary
|
||||
|
||||
**Command execution with output capture, prompt detection, and error keyword detection using mock-based testing**
|
||||
|
||||
## Performance
|
||||
|
||||
- **Duration:** 5 min
|
||||
- **Started:** 2026-03-11T07:44:54Z
|
||||
- **Completed:** 2026-03-11T07:49:48Z
|
||||
- **Tasks:** 3
|
||||
- **Files modified:** 3
|
||||
|
||||
## Accomplishments
|
||||
|
||||
- Implemented CommandExecutor class for sending commands to tmux sessions
|
||||
- Implemented OutputCapture class with prompt pattern detection and output stabilization
|
||||
- Added error detection supporting both English and Chinese keywords
|
||||
- Created comprehensive test suite with 24 tests (341 lines)
|
||||
|
||||
## Task Commits
|
||||
|
||||
Each task was committed atomically:
|
||||
|
||||
1. **Task 1: Create test scaffold for command executor** - `67f9d70` (test)
|
||||
2. **Task 2: Implement OutputCapture class** - `7b682df` (feat)
|
||||
3. **Task 3: Implement CommandExecutor class** - `7b682df` (feat)
|
||||
|
||||
**Plan metadata:** `1dd4b3a` (feat: export classes from package)
|
||||
|
||||
_Note: Tasks 2 and 3 were implemented together in a single commit since the implementation was cohesive._
|
||||
|
||||
## Files Created/Modified
|
||||
|
||||
- `src/gsd_openclaw/command_executor.py` - Command execution and output capture with CommandResult, OutputCapture, CommandExecutor classes
|
||||
- `tests/test_command_executor.py` - Comprehensive test suite with 24 tests for command execution
|
||||
- `src/gsd_openclaw/__init__.py` - Added exports for CommandResult, OutputCapture, CommandExecutor
|
||||
|
||||
## Decisions Made
|
||||
|
||||
- Used 60 second default timeout as specified in CONTEXT.md user decision
|
||||
- Implemented stabilization detection using content hash comparison (not just line count)
|
||||
- Used word-boundary regex matching for ASCII error keywords to avoid false positives
|
||||
- Used simple substring matching for Chinese keywords (word boundary doesn't work with non-ASCII)
|
||||
|
||||
## Deviations from Plan
|
||||
|
||||
### Auto-fixed Issues
|
||||
|
||||
**1. [Rule 1 - Bug] Fixed prompt pattern matching to avoid false positives**
|
||||
- **Found during:** Task 2 (OutputCapture implementation)
|
||||
- **Issue:** Pattern `^\$\s+` matched lines like "$ not a prompt" incorrectly
|
||||
- **Fix:** Changed to use only patterns with end-of-line anchors (`^\$\s*$`)
|
||||
- **Files modified:** src/gsd_openclaw/command_executor.py
|
||||
- **Verification:** Test `test_is_prompt_returns_false_for_non_prompt_lines` passes
|
||||
- **Committed in:** 7b682df (Task 2 commit)
|
||||
|
||||
**2. [Rule 1 - Bug] Fixed stabilization detection to check content not just line count**
|
||||
- **Found during:** Task 2 (OutputCapture implementation)
|
||||
- **Issue:** Stabilization was detected based only on line count, causing false positives when content changed but line count stayed same
|
||||
- **Fix:** Changed to use content hash comparison instead of line count
|
||||
- **Files modified:** src/gsd_openclaw/command_executor.py
|
||||
- **Verification:** Test `test_capture_until_complete_returns_false_on_timeout` passes
|
||||
- **Committed in:** 7b682df (Task 2 commit)
|
||||
|
||||
**3. [Rule 1 - Bug] Fixed error detection to use word boundaries**
|
||||
- **Found during:** Task 2 (CommandExecutor implementation)
|
||||
- **Issue:** Simple substring matching caused "Traceback" to match "error" (substring in lowercase)
|
||||
- **Fix:** Used word-boundary regex for ASCII keywords, substring for non-ASCII
|
||||
- **Files modified:** src/gsd_openclaw/command_executor.py
|
||||
- **Verification:** Test `test_detect_errors_returns_true_for_exception_keyword` passes
|
||||
- **Committed in:** 7b682df (Task 2 commit)
|
||||
|
||||
---
|
||||
|
||||
**Total deviations:** 3 auto-fixed (all Rule 1 - Bug fixes)
|
||||
**Impact on plan:** All auto-fixes necessary for correctness. No scope creep.
|
||||
|
||||
## Issues Encountered
|
||||
|
||||
None - implementation proceeded smoothly following TDD approach.
|
||||
|
||||
## User Setup Required
|
||||
|
||||
None - no external service configuration required.
|
||||
|
||||
## Next Phase Readiness
|
||||
|
||||
- Command execution layer complete, ready for orchestrator implementation
|
||||
- OutputCapture and CommandExecutor can be used by Phase 3 Plan 2 for command routing
|
||||
- All 128 tests pass across the project
|
||||
|
||||
---
|
||||
*Phase: 03-orchestration*
|
||||
*Completed: 2026-03-11*
|
||||
Reference in New Issue
Block a user