agent/claude/code/commands/qa.md
Snider 9942ab8081 refactor: restructure as plugin monorepo
Reorganise as a marketplace with multiple focused plugins:
- claude/code: Core development (hooks, scripts, data collection)
- claude/review: Code review automation
- claude/verify: Work verification
- claude/qa: Quality assurance loops
- claude/ci: CI/CD integration

Structure:
- .claude-plugin/marketplace.json lists all plugins
- Each plugin has its own .claude-plugin/plugin.json
- Commands namespaced: /code:*, /review:*, /qa:*, etc.

Install individual plugins or all via marketplace:
  claude plugin add host-uk/core-agent
  claude plugin add host-uk/core-agent/claude/code

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 19:44:26 +00:00

155 lines
3.2 KiB
Markdown

---
name: qa
description: Run QA checks 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
---
# QA Fix Loop
Run the full QA pipeline and fix all issues.
## 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 → ask user or check current directory
## Process
1. **Run QA**: Execute `core go qa` or `core php qa`
2. **Parse issues**: Extract failures from output (see format below)
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 issues (auto-fix with `core go fmt`)
2. **lint** - static analysis (usually quick fixes)
3. **test** - failing tests (may need more investigation)
4. **build** - compilation errors (fix before tests can run)
## Output Parsing
### Go QA Output
```
=== FMT ===
FAIL: pkg/api/handler.go needs formatting
=== LINT ===
pkg/api/handler.go:42:15: undefined: ErrNotFound (typecheck)
pkg/api/handler.go:87:2: ineffectual assignment to err (ineffassign)
=== TEST ===
--- FAIL: TestCreateUser (0.02s)
handler_test.go:45: expected 200, got 500
FAIL
=== RESULT ===
fmt: FAIL
lint: FAIL (2 issues)
test: FAIL (1 failed)
```
### PHP QA Output
```
=== PINT ===
FAIL: 2 files need formatting
=== STAN ===
src/Http/Controller.php:42 - Undefined variable $user
=== TEST ===
✗ CreateUserTest::testSuccess
Expected status 200, got 500
=== RESULT ===
pint: FAIL
stan: FAIL (1 error)
test: FAIL (1 failed)
```
## 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)
**Build errors:**
- Usually missing imports or typos
- Fix before attempting other checks
## Stop Condition
Only stop when:
- All QA checks pass, OR
- User explicitly cancels, OR
- Same error repeats 3 times (stuck - ask for help)
## Example Session
```
Detecting project type... Found go.mod → Go project
Running: core go qa
## QA Issues
pkg/api/handler.go:42:15: undefined: ErrNotFound
--- FAIL: TestCreateUser (0.02s)
**Summary:** lint: FAIL (1) | test: FAIL (1)
---
Fixing lint issue: undefined ErrNotFound
Reading pkg/api/handler.go...
Adding error variable definition.
Running: core go qa
## QA Issues
--- FAIL: TestCreateUser (0.02s)
expected 200, got 404
**Summary:** lint: PASS | test: FAIL (1)
---
Fixing test issue: expected 200, got 404
Reading test setup...
Correcting test data.
Running: core go qa
✓ All checks passed!
**Summary:**
- Fixed: undefined ErrNotFound (added error variable)
- Fixed: TestCreateUser (corrected test setup)
- 2 issues resolved, all checks passing
```