Skip to content

Claude Code Plugin Reference


Installation

CommandDescription
/plugin marketplace add Qualflare/qualflare-claude-codeRegister the plugin from the Qualflare marketplace
/plugin install qualflare@qualflareInstall the plugin into the current session
/plugin update qualflareUpgrade to the latest version

Plugin name: qualflare · Version: 0.18.0


Slash Commands

CommandArgumentDescription
/qf-initFirst-time project setup: detect frameworks, write .qualflare/test-state.md, configure authentication and the optional Stop hook, update CLAUDE.md.
/qf-cover[--all] [path or glob]Generate tests for source files changed in the current session. Reads .qualflare/test-state.md for framework context. Proposes test cases and writes them after approval. Pass --all to cover a whole file or directory instead of only session changes.
/qf-run[framework-slug or results-file]Run the project's test suite and upload results to Qualflare via qf collect. Reads .qualflare/test-state.md for the framework list.
/qf-fix[framework-slug or package/path]Analyze failing tests from the last /qf-run and patch source code until they pass. Reads result files from .qualflare/results/.
/qf-doctorHealth check: verifies CLI installation, authentication, config validity, .qualflare/test-state.md freshness, file-count drift, and framework tooling. Reports ✅/⚠️/❌ per check.
/qf-update[framework-slug or package/path]Refresh file counts in .qualflare/test-state.md by re-globbing each framework row. Faster than a full re-init.
/qf-stateShow detected frameworks, file counts, hook setting, and which CLI identifiers are configured locally.
/qf-hookon|offToggle the end-of-session coverage nudge on or off. No argument prints the current status.

The Stop Hook

The Stop hook fires at the end of a Claude Code session. When enabled, it prints a one-line nudge if source files were changed without any corresponding test edits:

🔍 Qualflare: 3 source file(s) changed without test updates. Run /qf-cover to add coverage.

Trigger conditions (all must be true)

  • At least one source file was edited (.js, .ts, .go, .py, .rb, .php, .rs, .java, .kt, and their JSX and module variants (.jsx, .tsx, .mjs, .cjs, .mts, .cts)).
  • No test files were edited in the same session.
  • At least one of those edits was substantive — a single-line change of 40 characters or fewer counts as trivial and is ignored.

What the hook ignores

Excluded categoryExamples
Test files*.test.ts, *.spec.js, *_test.go, test_*.py, *_spec.rb, files under __tests__/, e2e/, cypress/, playwright/
Config files*.config.ts, *.config.json, vite.config.*, .*rc.json, tsconfig*.json
Type-only files*.d.ts, *.d.mts, types.ts, *.types.ts
Build artifactsnode_modules/, vendor/, .git/, dist/, build/, .next/, __pycache__/, .cache/

Toggling

/qf-hook on     — enable the nudge
/qf-hook off    — disable the nudge
/qf-hook        — print current status

State Files

/qf-init creates a .qualflare/ directory in the project root:

.qualflare/
├── test-state.md    — framework + file-count context (commit this)
├── config.json      — hook preference (commit this)
└── results/         — raw test-runner output uploaded by qf collect (gitignore this)

Add .qualflare/results/ to your .gitignore. The other two files should be committed — they give every session the context it needs without re-running setup.

test-state.md structure

Generated by /qf-init, updated by /qf-update. Contains:

  • Project — name, languages, generation timestamp, plugin version
  • Packages — path and CLI identifier for each package (one row per package; (root) for single-package projects)
  • Frameworks in use — slug, language, file count, and top-level paths per (package, framework) pair
  • Frameworks suggested — frameworks detected as possible but not yet installed
  • Conventions — test naming pattern and coverage threshold
  • Notes — free-text notes from setup

config.json fields

FieldTypeDescription
versionnumberSchema version (currently 1)
stopHookEnabledbooleanWhether the end-of-session coverage nudge is active

Authentication

The plugin uses the same identifier-based auth as the Qualflare CLI. After /qf-init prints your identifiers, register each one:

bash
qf login <identifier> <token>

In a monorepo, each package gets its own identifier — run qf login once per package. Tokens are stored in ~/.config/qualflare/config.toml. Get tokens at https://app.qualflare.com/project/<identifier>/settings/access-tokens.

Run qf projects to list currently registered identifiers. For the full CLI authentication reference, see Configuration.


Supported Frameworks

The 23 frameworks the plugin can collect results for via qf collect:

CategoryFrameworks
Generic (JUnit-compatible)junit
Unit Testingpython (pytest), golang, jest (also Vitest), mocha, rspec, phpunit, testng
BDDcucumber, karate
UI / E2E / Mobileplaywright, cypress, selenium, testcafe, maestro, xctest, espresso
API Testingnewman, k6
Security Testingzap, trivy, snyk, sonarqube

Vitest results upload via the jest slug. Multi-framework monorepos are supported — /qf-init detects each workspace and tracks them separately.


See Also