accept
免费Accept HQ membership invites from a magic link or raw token.
中文简介正在准备中。当前显示原文说明。
Enforce test-driven development with RED→GREEN→REFACTOR cycle and coverage validation
中文简介正在准备中。当前显示原文说明。
实测评分 未实测
查看安装方法安装前可以查看交给 AI 代理的指令内容。
Develop a feature using strict test-driven development: write failing tests first, implement minimal code, refactor, and verify coverage.
What a good test is: tests verify behavior through public interfaces, read like a specification, and survive refactors.
Task description: $ARGUMENTS
RED → GREEN → REFACTOR → REPEAT
A seam is the public boundary you test at: the interface where you observe behavior without reaching inside. Tests live at seams, never against internals.
Test only at pre-agreed seams. Before writing any test, write down the seams under test and confirm them with the user. No test is written at an unconfirmed seam. You can't test everything — agreeing the seams up front is how testing effort lands on the critical paths and complex logic instead of every edge case.
Ask: "What's the public interface, and which seams should we test?" Give each proposed seam a one-line note on what it catches and what it misses.
Auto-detect the test framework and package manager from the project:
Package managers (check in priority order):
bun.lockb → bun testpnpm-lock.yaml → pnpm testyarn.lock → yarn testpackage-lock.json → npm testCargo.lock → cargo testgo.mod → go test ./...Test frameworks (infer from project files):
package.json with jest → Jest (Node/TypeScript)package.json with vitest → Vitest (Vite-based)pyproject.toml or requirements.txt → pytest (Python)go.mod → Go's testing packageCargo.toml → Rust's built-in test frameworkIf no framework detected: Ask the user which test framework and runner to use. Do not proceed without a confirmed test runner.
Store the detected runner as {TEST_CMD} (e.g., bun test, pnpm test, pytest) and use it for all subsequent test commands in this workflow.
Report detected framework and package manager to the user before proceeding.
Create the function/class definition with empty implementation:
Example (TypeScript):
/**
* Validates an email address format.
* @param email - The email string to validate
* @returns true if email is valid, false otherwise
* @throws Error if email is null/undefined
*/
export function validateEmail(email: string): boolean {
throw new Error('Not implemented');
}
Read <repo>/GLOSSARY.md if present so test names and interface vocabulary match the project's domain language (ties into /domain-modeling).
Write comprehensive test suite BEFORE implementation:
Test types to include:
Requirements:
Example test structure (Jest/Vitest):
describe('validateEmail', () => {
describe('happy path', () => {
it('accepts valid email addresses', () => {
expect(validateEmail('user@example.com')).toBe(true);
expect(validateEmail('test.name+tag@domain.co.uk')).toBe(true);
});
});
describe('edge cases', () => {
it('rejects empty string', () => {
expect(validateEmail('')).toBe(false);
});
it('rejects email without @', () => {
expect(validateEmail('invalidemail.com')).toBe(false);
});
it('rejects email without domain', () => {
expect(validateEmail('user@')).toBe(false);
});
it('rejects email with spaces', () => {
expect(validateEmail('user @example.com')).toBe(false);
});
it('handles special characters', () => {
expect(validateEmail('user+tag@example.com')).toBe(true);
expect(validateEmail('user.name@sub.domain.com')).toBe(true);
});
});
describe('error conditions', () => {
it('throws error if email is null', () => {
expect(() => validateEmail(null as any)).toThrow();
});
it('throws error if email is undefined', () => {
expect(() => validateEmail(undefined as any)).toThrow();
});
it('rejects excessively long email', () => {
const longEmail = 'a'.repeat(255) + '@example.com';
expect(validateEmail(longEmail)).toBe(false);
});
});
});
Run tests and verify RED:
{TEST_CMD} # Use the detected test runner from Step 1
# Expected: ALL tests FAIL (red output)
# If ANY test passes, you haven't written the test correctly — fix it before proceeding
Write only the minimum code needed to pass the tests:
Example minimal implementation:
export function validateEmail(email: string): boolean {
if (email === null || email === undefined) {
throw new Error('Email cannot be null or undefined');
}
if (email.length === 0 || email.length > 254) {
return false;
}
// Basic email regex pattern
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return emailRegex.test(email);
}
Run tests and verify GREEN:
{TEST_CMD} # Use the detected test runner from Step 1
# Expected: ALL tests PASS (green output)
Improve code quality while keeping tests green:
Requirements:
/review rather than expanding this cycle.Example refactored implementation:
const EMAIL_MAX_LENGTH = 254;
const EMAIL_PATTERN = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
/**
* Validates an email address format following RFC 5321 basic rules.
* @param email - The email string to validate
* @returns true if email matches expected format, false otherwise
* @throws Error if email is null or undefined
*/
export function validateEmail(email: string): boolean {
if (email == null) {
throw new Error('Email cannot be null or undefined');
}
if (email.length === 0 || email.length > EMAIL_MAX_LENGTH) {
return false;
}
return EMAIL_PATTERN.test(email);
}
Run tests after EACH refactoring step:
{TEST_CMD} # Use the detected test runner from Step 1
# Expected: ALL tests still PASS (green output)
# Refactor one concern at a time. Stop when code is clean and readable.
Check code coverage and add tests for any uncovered paths:
Coverage requirements by code type:
| Code Type | Minimum Coverage |
|---|---|
| Standard application code | 80% |
| Financial calculations | 100% |
| Authentication/authorization | 100% |
| Security-critical code | 100% |
| Encryption/decryption | 100% |
Run coverage check:
# Jest
npm test -- --coverage
# Vitest
npx vitest run --coverage
# pytest
pytest --cov=. --cov-report=term-missing
# Go
go test -cover ./...
# Rust
cargo tarpaulin --out Html
Acceptance criteria:
If coverage is below target:
$ npm test
FAIL src/email-validator.test.ts
validateEmail
happy path
✕ accepts valid email addresses (0ms)
✕ accepts variation formats (1ms)
edge cases
✕ rejects empty string (0ms)
✕ rejects email without @ (1ms)
✕ rejects email without domain (0ms)
✕ rejects email with spaces (0ms)
✕ handles special characters (1ms)
error conditions
✕ throws error if email is null (0ms)
✕ throws error if email is undefined (0ms)
✕ rejects excessively long email (0ms)
Tests: 0 passed, 10 failed, 10 total
$ npm test
PASS src/email-validator.test.ts
validateEmail
happy path
✓ accepts valid email addresses (2ms)
✓ accepts variation formats (1ms)
edge cases
✓ rejects empty string (0ms)
✓ rejects email without @ (0ms)
✓ rejects email without domain (1ms)
✓ rejects email with spaces (0ms)
✓ handles special characters (1ms)
error conditions
✓ throws error if email is null (0ms)
✓ throws error if email is undefined (0ms)
✓ rejects excessively long email (0ms)
Tests: 10 passed, 10 total (18ms)
$ npm test -- --coverage
------------|----------|----------|----------|----------|-------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered |
------------|----------|----------|----------|----------|-------------|
All files | 100 | 100 | 100 | 100 | |
email-...ts | 100 | 100 | 100 | 100 | |
------------|----------|----------|----------|----------|-------------|
beforeAll side effects)xit() or .skip — fix the test or remove itexpect(add(a, b)).toBe(a + b), or a snapshot derived by hand the same way) — it passes by construction and can never disagree with the code. Expected values must come from an independent source of truth (a known-good literal, a worked example, the spec).# Run all tests
npm test
# Run tests in watch mode
npm test -- --watch
# Run coverage
npm test -- --coverage
# Run specific test file
npm test email-validator.test.ts
# Run all tests
npx vitest run
# Run tests in watch mode
npx vitest
# Run coverage
npx vitest run --coverage
# Run specific test file
npx vitest email-validator.test.ts
# Run all tests
pytest
# Run tests in watch mode
pytest --lf (runs last-failed)
# Run coverage
pytest --cov=. --cov-report=term-missing
# Run specific test file
pytest tests/test_email_validator.py
# Run all tests
go test ./...
# Run with verbose output
go test -v ./...
# Run coverage
go test -cover ./...
# Run specific test
go test -run TestValidateEmail ./...
# Run all tests
cargo test
# Run tests in release mode
cargo test --release
# Run with coverage (requires tarpaulin)
cargo tarpaulin --out Html
# Run specific test
cargo test validate_email
After completing the TDD workflow, verify:
Seam and anti-pattern guidance adapted from mattpocock/skills (skills/engineering/tdd), synced to upstream commit f3fc563. HQ keeps its RED, GREEN, REFACTOR cycle and coverage gates.
还没有评价。欢迎分享你的使用感受。
无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。
还没有评论。来写第一条吧。
Accept HQ membership invites from a magic link or raw token.
中文简介正在准备中。当前显示原文说明。
Capture qualifying architecture decisions as ADRs in the right HQ or repo location.
中文简介正在准备中。当前显示原文说明。
Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling forms, clicking buttons, taking screenshots, extracting data, testing web apps, or automating any browser task. Triggers include requests to "open a website", "fill out a form", "click a button", "take a screenshot", "scrape data from a page", "test this web app", "login to a site", "automate browser actions", or any task requiring programmatic web interaction.
中文简介正在准备中。当前显示原文说明。
Find shallow modules and propose deepening refactors, ranked with file refs; never edits code. Use when code is hard to change or planning a refactor.
中文简介正在准备中。当前显示原文说明。
Generate dark ASCII banner graphics for HQ and social launch assets.
中文简介正在准备中。当前显示原文说明。
Compare approaches to best-in-class prior art, merge existing work, verify cruft removal, and recommend the most durable design before PRD work.
中文简介正在准备中。当前显示原文说明。