{"id":50761877,"url":"https://github.com/shibukazu/ccqa","last_synced_at":"2026-06-11T10:31:55.327Z","repository":{"id":347822454,"uuid":"1195397020","full_name":"shibukazu/ccqa","owner":"shibukazu","description":"Turn your Claude subscription into a browser test agent","archived":false,"fork":false,"pushed_at":"2026-05-25T03:24:30.000Z","size":308,"stargazers_count":3,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-25T03:25:30.663Z","etag":null,"topics":["agent","automation","claude","claude-code","qa"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/shibukazu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-29T16:15:02.000Z","updated_at":"2026-05-25T03:24:32.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/shibukazu/ccqa","commit_stats":null,"previous_names":["shibukazu/veriq","shibukazu/ccqa"],"tags_count":20,"template":false,"template_full_name":null,"purl":"pkg:github/shibukazu/ccqa","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shibukazu%2Fccqa","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shibukazu%2Fccqa/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shibukazu%2Fccqa/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shibukazu%2Fccqa/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/shibukazu","download_url":"https://codeload.github.com/shibukazu/ccqa/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shibukazu%2Fccqa/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34195113,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-11T02:00:06.485Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agent","automation","claude","claude-code","qa"],"created_at":"2026-06-11T10:31:55.249Z","updated_at":"2026-06-11T10:31:55.317Z","avatar_url":"https://github.com/shibukazu.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ccqa\n\n**Your Claude subscription already includes a QA engineer.**\n\nccqa turns Claude Code into a browser test recorder. Write a spec in YAML, run `ccqa trace`, and Claude drives your app via [agent-browser](https://github.com/vercel-labs/agent-browser). Every action is recorded and compiled into a deterministic test script you can run in CI. No extra API key. Just `claude`.\n\n[日本語版 README](./docs/README.ja.md)\n\n## How it works\n\n```mermaid\nflowchart LR\n    A[\"Write spec\\n(spec.yaml)\"] --\u003e B[\"ccqa trace\\n(Claude drives browser)\"]\n    B --\u003e C[\"ccqa generate\\n(LLM → test script)\"]\n    C --\u003e D[\"ccqa run\\n(deterministic replay)\"]\n```\n\n`trace` invokes Claude Code with your spec. Claude drives the browser step by step, recording every action as structured data. `generate` compiles that data into a vitest-compatible script. `run` replays it deterministically — no LLM involved.\n\n## Install\n\n```bash\npnpm add -D ccqa vitest agent-browser\n```\n\nRequires Node.js **20+**. [agent-browser](https://github.com/vercel-labs/agent-browser) is a peer dependency.\n\n## Quick start\n\n**1. Write a spec** — by hand, or interactively with [`ccqa draft`](./docs/draft.md)\n\n```yaml\n# .ccqa/features/tasks/test-cases/create-and-complete/spec.yaml\ntitle: Create a task and mark it complete\n\nsteps:\n  - instruction: |\n      Open ${APP_URL}/login. Fill in email and password, submit the form.\n    expected: Redirected to /dashboard, user avatar visible in the header\n\n  - instruction: |\n      Click \"New Task\", fill in the title \"Fix login bug\", set priority to High, save.\n    expected: Task appears in the task list with status \"Open\"\n```\n\nURLs live inside `instruction` strings — either verbatim or via `${ENV_VAR}` references for environment-specific values.\n\n**2. Trace** — Claude drives the browser and records every action\n\n```bash\nccqa trace tasks/create-and-complete\n```\n\n**3. Generate** — convert recorded actions into a replayable test\n\n```bash\nccqa generate tasks/create-and-complete\n```\n\n**4. Run** — replay deterministically, no LLM involved\n\n```bash\nccqa run tasks/create-and-complete\n```\n\nIn CI you can opt in to drift analysis on test failures by passing `--drift` — Claude will explain the failure by comparing the spec against the current codebase. Requires `ANTHROPIC_API_KEY` or a local Claude login.\n\n```bash\nccqa run tasks/create-and-complete --drift --format github\n```\n\n## Features\n\n| Feature | Docs |\n|---|---|\n| Write specs interactively with Claude | [Draft](./docs/draft.md) |\n| Reuse login and other shared step sequences | [Blocks](./docs/blocks.md) |\n| Assertion helper functions | [Assertions](./docs/assertions.md) |\n| Auto-fix failing tests | [Auto-fix](./docs/auto-fix.md) |\n| Detect spec/code drift in CI | [Drift](./docs/drift.md) |\n| Inventory existing test coverage | [Perspectives](./docs/perspectives.md) |\n\n## Commands\n\n```\nccqa draft [feature/spec]          Co-author a test spec with Claude\nccqa trace \u003cfeature/spec\u003e          Record browser actions for a spec (inlines any included blocks)\nccqa generate \u003cfeature/spec\u003e       Generate test script from recorded actions\nccqa run [feature/spec]            Execute generated test scripts (add --drift to analyze failures)\nccqa drift [feature/spec]          Standalone spec ↔ codebase drift audit (for scheduled jobs)\nccqa perspectives                  Inventory existing test coverage into .ccqa/perspectives.yaml\n```\n\nAll Claude-driven commands accept `-m, --model \u003cname\u003e` (alias `sonnet` | `opus` | `haiku`, or a full model ID). The flag overrides `CCQA_MODEL`; when both are unset, the Claude Code CLI default is used. They also accept `--language \u003cbcp47\u003e` (e.g. `ja`, `en`) to set the language of human-readable output; the default `auto` follows the language of the spec/codebase. Interactive commands authenticate via your local Claude Code login; commands that talk to Claude in CI (`ccqa run --drift`, `ccqa drift`) additionally honor `ANTHROPIC_API_KEY`.\n\n`\u003cfeature/spec\u003e` is a 2-segment alias for the on-disk path `.ccqa/features/\u003cfeature\u003e/test-cases/\u003cspec\u003e/`.\n\n## File structure\n\n```\n.ccqa/\n  perspectives.yaml              # Inventory of existing coverage (machine-readable, canonical)\n  perspectives.md                # Category index, regenerated from the YAML\n  blocks/\n    login/\n      spec.yaml                  # Reusable block (params + steps)\n  features/\n    tasks/\n      perspectives.md            # Per-category detail tables (one per case)\n      test-cases/\n        create-and-complete/\n          spec.yaml              # Test definition\n          actions.json           # Recorded actions from trace\n          test.spec.ts           # Generated test script\n```\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshibukazu%2Fccqa","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshibukazu%2Fccqa","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshibukazu%2Fccqa/lists"}