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

3.2 KiB

name description hooks
qa Run QA checks and fix all issues iteratively
PostToolUse Stop
matcher hooks
Bash
type command
command ${CLAUDE_PLUGIN_ROOT}/scripts/qa-filter.sh
hooks
type command once
command ${CLAUDE_PLUGIN_ROOT}/scripts/qa-verify.sh 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