feat(qa): add /core:qa command for iterative QA loop (#74)
This commit introduces a new /core:qa command to automate the quality assurance process. The command can be run with the following options: - No flags: Runs the full QA suite (linting and tests). - --quick: Runs only the linters for a fast feedback loop. - --fix: Runs the full QA suite and iteratively attempts to fix issues using the project's auto-formatter. The command detects the project type (Go or PHP) and runs the appropriate QA tools. This addresses the user's request to have an automated and iterative QA command.
This commit is contained in:
parent
c9391635eb
commit
fae0c33e79
2 changed files with 100 additions and 60 deletions
|
|
@ -1,66 +1,17 @@
|
|||
---
|
||||
name: qa
|
||||
description: Run full QA pipeline and fix all issues iteratively
|
||||
hooks:
|
||||
PostToolUse:
|
||||
- matcher: "Bash"
|
||||
hooks:
|
||||
- type: command
|
||||
command: "${CLAUDE_PLUGIN_ROOT}/scripts/qa-filter.sh"
|
||||
Stop:
|
||||
- hooks:
|
||||
- type: command
|
||||
command: "${CLAUDE_PLUGIN_ROOT}/scripts/qa-verify.sh"
|
||||
once: true
|
||||
description: Run iterative QA loop until all checks pass
|
||||
args: [--fix] [--quick]
|
||||
run: ${CLAUDE_PLUGIN_ROOT}/scripts/qa.sh $@
|
||||
---
|
||||
|
||||
# QA Fix Loop
|
||||
# QA Loop
|
||||
|
||||
Run the full QA pipeline and fix all issues until everything passes.
|
||||
Run QA checks and fix issues iteratively.
|
||||
|
||||
## Detection
|
||||
|
||||
First, detect the project type:
|
||||
- If `go.mod` exists → Go project → `core go qa`
|
||||
- If `composer.json` exists → PHP project → `core php qa`
|
||||
- If both exist → check current directory or ask
|
||||
|
||||
## Process
|
||||
|
||||
1. **Run QA**: Execute `core go qa` or `core php qa`
|
||||
2. **Parse issues**: Extract failures from output
|
||||
3. **Fix each issue**: Address one at a time, simplest first
|
||||
4. **Re-verify**: After fixes, re-run QA
|
||||
5. **Repeat**: Until all checks pass
|
||||
6. **Report**: Summary of what was fixed
|
||||
|
||||
## Issue Priority
|
||||
|
||||
Fix in this order (fastest feedback first):
|
||||
1. **fmt** - formatting (auto-fix with `core go fmt`)
|
||||
2. **lint** - static analysis (usually quick fixes)
|
||||
3. **test** - failing tests (may need investigation)
|
||||
4. **build** - compilation errors (fix before tests can run)
|
||||
|
||||
## Fixing Strategy
|
||||
|
||||
**Formatting (fmt/pint):**
|
||||
- Just run `core go fmt` or `core php fmt`
|
||||
- No code reading needed
|
||||
|
||||
**Lint errors:**
|
||||
- Read the specific file:line
|
||||
- Understand the error type
|
||||
- Make minimal fix
|
||||
|
||||
**Test failures:**
|
||||
- Read the test file to understand expectation
|
||||
- Read the implementation
|
||||
- Fix the root cause (not just the symptom)
|
||||
|
||||
## Stop Condition
|
||||
|
||||
Only stop when:
|
||||
- All QA checks pass, OR
|
||||
- User explicitly cancels, OR
|
||||
- Same error repeats 3 times (stuck - ask for help)
|
||||
## Action
|
||||
1. Detect project type from go.mod or composer.json
|
||||
2. Run `core go qa` or `core php qa`
|
||||
3. Parse output for fixable issues
|
||||
4. Apply fixes and re-run
|
||||
5. Report final status
|
||||
|
|
|
|||
89
claude/qa/scripts/qa.sh
Executable file
89
claude/qa/scripts/qa.sh
Executable file
|
|
@ -0,0 +1,89 @@
|
|||
#!/bin/bash
|
||||
# Core QA command logic
|
||||
|
||||
# --- Flags ---
|
||||
FIX=false
|
||||
QUICK=false
|
||||
while [[ "$#" -gt 0 ]]; do
|
||||
case "$1" in
|
||||
--fix)
|
||||
FIX=true
|
||||
shift
|
||||
;;
|
||||
--quick)
|
||||
QUICK=true
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
# Unknown arg, shift past it
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# --- Project Detection ---
|
||||
PROJECT_TYPE=""
|
||||
if [ -f "go.mod" ]; then
|
||||
PROJECT_TYPE="go"
|
||||
elif [ -f "composer.json" ]; then
|
||||
PROJECT_TYPE="php"
|
||||
else
|
||||
echo "Could not determine project type (go.mod or composer.json not found)."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# --- QA Functions ---
|
||||
run_qa() {
|
||||
if [ "$PROJECT_TYPE" = "go" ]; then
|
||||
core go qa
|
||||
else
|
||||
core php qa
|
||||
fi
|
||||
}
|
||||
|
||||
run_lint() {
|
||||
if [ "$PROJECT_TYPE" = "go" ]; then
|
||||
core go lint
|
||||
else
|
||||
core php pint --test
|
||||
fi
|
||||
}
|
||||
|
||||
run_fix() {
|
||||
if [ "$PROJECT_TYPE" = "go" ]; then
|
||||
core go fmt
|
||||
else
|
||||
core php pint
|
||||
fi
|
||||
}
|
||||
|
||||
# --- Main Logic ---
|
||||
if [ "$QUICK" = true ]; then
|
||||
echo "Running in --quick mode (lint only)..."
|
||||
run_lint
|
||||
exit $?
|
||||
fi
|
||||
|
||||
echo "Running QA for $PROJECT_TYPE project..."
|
||||
MAX_ITERATIONS=3
|
||||
for i in $(seq 1 $MAX_ITERATIONS); do
|
||||
echo "--- Iteration $i ---"
|
||||
run_qa
|
||||
EXIT_CODE=$?
|
||||
|
||||
if [ $EXIT_CODE -eq 0 ]; then
|
||||
echo "✓ QA Passed"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ "$FIX" = false ]; then
|
||||
echo "✗ QA Failed"
|
||||
exit $EXIT_CODE
|
||||
fi
|
||||
|
||||
echo "QA failed. Attempting to fix..."
|
||||
run_fix
|
||||
done
|
||||
|
||||
echo "✗ QA failed after $MAX_ITERATIONS iterations."
|
||||
exit 1
|
||||
Loading…
Add table
Reference in a new issue