plugins/claude/code/commands/qa.md
Snider be32fec23d
feat(plugin): Implement workspace awareness to detect the current module (#75)
Introduces a new script to detect the current module (PHP or Go) based on the presence of composer.json or go.mod files, git remote URL, or the current directory name.

This context is loaded once per session and used to dynamically adjust commands, starting with the QA command.

Refactors the QA command and verification scripts to use the new module context, removing redundant project-type detection.
2026-02-02 07:17:36 +00:00

3.1 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.

Workspace: {{env.CLAUDE_CURRENT_MODULE}} ({{env.CLAUDE_MODULE_TYPE}})

Process

  1. Run QA: Execute core {{env.CLAUDE_MODULE_TYPE}} 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