{"_id":"@analizza-ai/testspec","_rev":"4-adf1f163d5540314356382db06eeeed2","name":"@analizza-ai/testspec","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.1":{"name":"@analizza-ai/testspec","version":"0.1.1","keywords":["sdd","spec-driven","test-generation","testspec","openspec","claude","ai-testing"],"author":{"name":"Diego Lirio","email":"diegolirio.dl@gmail.com"},"license":"MIT","_id":"@analizza-ai/testspec@0.1.1","maintainers":[{"name":"analizza","email":"ai.analizza@gmail.com"},{"name":"diegolirio","email":"diegolirio.dl@gmail.com"}],"homepage":"https://github.com/analizza-ai/testspec#readme","bugs":{"url":"https://github.com/analizza-ai/testspec/issues"},"bin":{"testspec":"bin/cli.js"},"dist":{"shasum":"d5f955b71bb628ba1f9c34a74fe3400e8e5e0a53","tarball":"https://registry.npmjs.org/@analizza-ai/testspec/-/testspec-0.1.1.tgz","fileCount":39,"integrity":"sha512-8OfAlK798JC7+za63id2PwlzPXMDyHuJIaH3gqvXHvZAAjyHPcSYUoO2Xd6Ji4kNzLg9qVWqxz3dfJEOtRyGIw==","signatures":[{"sig":"MEQCICs9OM8RNXO18slK7lQCtniU13Us2eWD1qqfq5fumBR0AiB7RIwsbFUB+eXwIKwf6oW9/HVjv1ob7xOO1uZl6bDZJw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@analizza-ai%2ftestspec@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":109049},"main":"./src/index.js","type":"module","engines":{"node":">=20.19.0"},"exports":{".":"./src/index.js"},"gitHead":"4229300736185b418682d9c1258647a1207d708b","scripts":{"lint":"eslint src bin tests","test":"vitest run","lint:fix":"eslint src bin tests --fix","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"analizza","email":"ai.analizza@gmail.com"},"repository":{"url":"git+https://github.com/analizza-ai/testspec.git","type":"git"},"_npmVersion":"10.9.8","description":"Spec Driven Test — the test layer for SDD","directories":{},"_nodeVersion":"22.22.3","dependencies":{"glob":"^11.0.0","chalk":"^5.3.0","js-yaml":"^4.1.0","commander":"^12.0.0","gray-matter":"^4.0.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.0.0","vitest":"^1.6.0","@anthropic-ai/sdk":"^0.30.0"},"optionalDependencies":{"@anthropic-ai/sdk":"^0.30.0"},"_npmOperationalInternal":{"tmp":"tmp/testspec_0.1.1_1779772854494_0.9798369375482208","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@analizza-ai/testspec","version":"0.1.2","keywords":["sdd","spec-driven","test-generation","testspec","openspec","claude","ai-testing"],"author":{"name":"Diego Lirio","email":"diegolirio.dl@gmail.com"},"license":"MIT","_id":"@analizza-ai/testspec@0.1.2","maintainers":[{"name":"analizza","email":"ai.analizza@gmail.com"},{"name":"diegolirio","email":"diegolirio.dl@gmail.com"}],"homepage":"https://github.com/analizza-ai/testspec#readme","bugs":{"url":"https://github.com/analizza-ai/testspec/issues"},"bin":{"testspec":"bin/cli.js"},"dist":{"shasum":"3cd87e1804653c5061a7b501621c44c656526d12","tarball":"https://registry.npmjs.org/@analizza-ai/testspec/-/testspec-0.1.2.tgz","fileCount":39,"integrity":"sha512-O6aDf+Xf4teuH2lH/1VMzX8b4rdzpr4hJC7xs6ZxyJW+6D8UTjanmu284HRwiIF0gS4EmthrnvrFycrYgv5ELQ==","signatures":[{"sig":"MEYCIQC3SCGP0OBpvroDVXbSkWp4aykrSOo6hZTYorK2GJ2+iwIhALuB/Cf8xB93DCzsjm9f+DBx13K+NP1hNRlVdUZSjcu/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@analizza-ai%2ftestspec@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":116109},"main":"./src/index.js","type":"module","engines":{"node":">=20.19.0"},"exports":{".":"./src/index.js"},"gitHead":"3d79fa048fec187e9b8aaacd79d022cca74d4ed5","scripts":{"lint":"eslint src bin tests","test":"vitest run","lint:fix":"eslint src bin tests --fix","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"analizza","email":"ai.analizza@gmail.com"},"repository":{"url":"git+https://github.com/analizza-ai/testspec.git","type":"git"},"_npmVersion":"10.9.8","description":"Spec Driven Test — the test layer for SDD","directories":{},"_nodeVersion":"22.22.3","dependencies":{"glob":"^11.0.0","chalk":"^5.3.0","js-yaml":"^4.1.0","commander":"^12.0.0","gray-matter":"^4.0.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.0.0","vitest":"^1.6.0","@anthropic-ai/sdk":"^0.30.0"},"optionalDependencies":{"@anthropic-ai/sdk":"^0.30.0"},"_npmOperationalInternal":{"tmp":"tmp/testspec_0.1.2_1779774271949_0.5953497201636841","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@analizza-ai/testspec","version":"0.1.3","keywords":["sdd","spec-driven","test-generation","testspec","openspec","claude","ai-testing"],"author":{"name":"Diego Lirio","email":"diegolirio.dl@gmail.com"},"license":"MIT","_id":"@analizza-ai/testspec@0.1.3","maintainers":[{"name":"analizza","email":"ai.analizza@gmail.com"},{"name":"diegolirio","email":"diegolirio.dl@gmail.com"}],"homepage":"https://github.com/analizza-ai/testspec#readme","bugs":{"url":"https://github.com/analizza-ai/testspec/issues"},"bin":{"testspec":"bin/cli.js"},"dist":{"shasum":"4b46e912adb00a518928a7de164b8b1c0df37b38","tarball":"https://registry.npmjs.org/@analizza-ai/testspec/-/testspec-0.1.3.tgz","fileCount":47,"integrity":"sha512-GJLeK0p9zCAwEjtwcalhq3u3T4Po/c+wdNmzj0s4A8NhEudcrapZz9zc7l5v+rL/tOhA4fKtrYw9TLLVx0BvrA==","signatures":[{"sig":"MEUCIDUN6K8878VVRm+0AE+aB/BVCsoEODgJdpScD/bS0jlNAiEAjGo3uyJefK3VAinUwxk5kCyGFfPpHvURlEahVYkdi7A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@analizza-ai%2ftestspec@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":171942},"main":"./src/index.js","type":"module","engines":{"node":">=20.19.0"},"exports":{".":"./src/index.js"},"gitHead":"6a884027cd894206be331022f551be62e1f37ff1","scripts":{"lint":"eslint src bin tests","test":"vitest run","lint:fix":"eslint src bin tests --fix","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"analizza","email":"ai.analizza@gmail.com"},"repository":{"url":"git+https://github.com/analizza-ai/testspec.git","type":"git"},"_npmVersion":"10.9.8","description":"Spec Driven Test — the test layer for SDD","directories":{},"_nodeVersion":"22.22.3","dependencies":{"glob":"^11.0.0","chalk":"^5.3.0","js-yaml":"^4.1.0","commander":"^12.0.0","gray-matter":"^4.0.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.0.0","vitest":"^1.6.0","@anthropic-ai/sdk":"^0.30.0"},"optionalDependencies":{"@anthropic-ai/sdk":"^0.30.0"},"_npmOperationalInternal":{"tmp":"tmp/testspec_0.1.3_1779911493517_0.6600577180081726","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@analizza-ai/testspec","version":"0.2.0","description":"Spec Driven Test — the test layer for SDD","type":"module","bin":{"testspec":"bin/cli.js"},"main":"./src/index.js","exports":{".":"./src/index.js"},"engines":{"node":">=20.19.0"},"scripts":{"test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage","lint":"eslint src bin tests","lint:fix":"eslint src bin tests --fix"},"keywords":["sdd","spec-driven","test-generation","testspec","openspec","claude","ai-testing"],"author":{"name":"Diego Lirio","email":"diegolirio.dl@gmail.com"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/analizza-ai/testspec.git"},"bugs":{"url":"https://github.com/analizza-ai/testspec/issues"},"homepage":"https://github.com/analizza-ai/testspec#readme","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"dependencies":{"commander":"^12.0.0","gray-matter":"^4.0.3","chalk":"^5.3.0","glob":"^11.0.0","js-yaml":"^4.1.0"},"devDependencies":{"vitest":"^1.6.0","eslint":"^9.0.0","@anthropic-ai/sdk":"^0.30.0"},"optionalDependencies":{"@anthropic-ai/sdk":"^0.30.0"},"_id":"@analizza-ai/testspec@0.2.0","gitHead":"80baa1dc9ce18ea43470aabb58156165080b2a93","_nodeVersion":"22.23.1","_npmVersion":"10.9.8","dist":{"integrity":"sha512-ILnPfqSJZ0FRFBW4yuFBQQ9vkvhrl8j/nFN7Q728VnkCPYISsGR10fdSeLNAyoMm/u5cp1lyNXyNKeezQ3h6cg==","shasum":"883185c0191094f53659369c763f1f2613d17219","tarball":"https://registry.npmjs.org/@analizza-ai/testspec/-/testspec-0.2.0.tgz","fileCount":49,"unpackedSize":176900,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@analizza-ai%2ftestspec@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIBQb5wHfAUBcw8ddPQrmskZWdATyWoNlmCTMFAN/HMFvAiEAgsPUMkVeUwZCIEs0yMMkMtzhsW/6XTklTWYBDXRpCSc="}]},"_npmUser":{"name":"analizza","email":"ai.analizza@gmail.com"},"directories":{},"maintainers":[{"name":"analizza","email":"ai.analizza@gmail.com"},{"name":"diegolirio","email":"diegolirio.dl@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/testspec_0.2.0_1784905909068_0.7998842020459562"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-26T05:20:54.311Z","modified":"2026-07-24T15:11:49.594Z","0.1.1":"2026-05-26T05:20:54.658Z","0.1.2":"2026-05-26T05:44:32.113Z","0.1.3":"2026-05-27T19:51:33.662Z","0.2.0":"2026-07-24T15:11:49.233Z"},"bugs":{"url":"https://github.com/analizza-ai/testspec/issues"},"author":{"name":"Diego Lirio","email":"diegolirio.dl@gmail.com"},"license":"MIT","homepage":"https://github.com/analizza-ai/testspec#readme","keywords":["sdd","spec-driven","test-generation","testspec","openspec","claude","ai-testing"],"repository":{"type":"git","url":"git+https://github.com/analizza-ai/testspec.git"},"description":"Spec Driven Test — the test layer for SDD","maintainers":[{"name":"analizza","email":"ai.analizza@gmail.com"},{"name":"diegolirio","email":"diegolirio.dl@gmail.com"}],"readme":"# @analizza-ai/testspec\n\n[![npm](https://img.shields.io/npm/v/@analizza-ai/testspec)](https://www.npmjs.com/package/@analizza-ai/testspec)\n[![CI](https://github.com/analizza-ai/testspec/actions/workflows/ci.yml/badge.svg)](https://github.com/analizza-ai/testspec/actions/workflows/ci.yml)\n[![license](https://img.shields.io/npm/l/@analizza-ai/testspec)](./LICENSE)\n[![node](https://img.shields.io/node/v/@analizza-ai/testspec)](./package.json)\n\n**Spec Driven Testing — the test layer for SDD**\n\n> `Spec Driven Development` — Unit tests · Integration tests · Testcontainers\n> `Spec Driven Testing` — End-to-end · Load · Chaos Engineering · UI · Exploratory\n\ntestspec installs 4 AI agent slash commands that cover the full SDT lifecycle — from developer tests to QA automation. Specs are the single source of truth. Tests are derived, never invented.\n\n---\n\n## Quick start\n\n```bash\n# install globally\nnpm install -g @analizza-ai/testspec\n\n# in your project root (must have openspec/ or similar)\ntestspec init       # detects SDD framework, selects AI agent, writes config\n``` \n\n---\n\n## Test pyramid\n\n<img width=\"521\" height=\"478\" alt=\"image\" src=\"https://github.com/user-attachments/assets/a07d3ab0-8cd9-4746-b59a-bb8ea2773f63\" />\n\n```\n┌─────────────────────────────────────────────────┐\n│              CHAOS ENGINEERING                  │  ← /testspec-run-qa\n│         (resilience · DR · fault injection)     │\n├─────────────────────────────────────────────────┤\n│               QA LAYER                          │  ← /testspec-specify-qa → /testspec-apply-qa\n│     end-to-end tests · load tests (k6/Gatling)  │\n├─────────────────────────────────────────────────┤\n│             DEVELOPER LAYER                     │  ← /testspec-generate\n│   unit tests · integration tests (Testcontainers│\n│   PostgreSQL · Kafka · etc.)                    │\n└─────────────────────────────────────────────────┘\n         All layers driven by: tests.md\n         tests.md driven by: spec.md + proposal.md + design.md\n```\n\n---\n\n## Full development + test flow\n\n```mermaid\nflowchart TD\n    IDEA[\"💡 Idea / Demand\"]\n\n    IDEA --> PROPOSE\n\n    subgraph OPENSPEC[\"OpenSpec — Spec-Driven Development (app repo)\"]\n        PROPOSE[\"/opsx propose - Describes what will be built\"]\n\n        PROPOSE --> PROPOSAL[\"proposal.md - Intent, Goals, Non-goals\"]\n        PROPOSE --> SPECS[\"specs/feature/spec.md - What the system must do\"]\n        PROPOSE --> DESIGN[\"design.md - Architecture, Contracts, Decisions\"]\n\n        PROPOSAL --> TESTS_CMD\n        SPECS    --> TESTS_CMD\n        DESIGN   --> TESTS_CMD\n\n        TESTS_CMD[\"/testspec-generate - Consolidates specs and generates test cases\"]\n        TESTS_CMD --> TESTS_MD[\"tests.md - CT-01..N, Happy path, Business rules, DB\"]\n\n        TESTS_MD --> TASKS[\"tasks.md - Tasks in chunks of up to 2h\"]\n    end\n\n    TASKS --> APPLY\n\n    subgraph IMPL[\"Implementation (app repo)\"]\n        APPLY[\"/opsx apply - Executes tasks from the change\"]\n        APPLY --> CODE[\"Code, Migrations, Integration tests\"]\n        CODE --> VERIFY[\"Testcontainers - PostgreSQL + Kafka\"]\n    end\n\n    VERIFY --> ARCHIVE[\"/opsx archive - Change archived as complete\"]\n\n    ARCHIVE --> SPECIFY_QA\n\n    subgraph QA[\"Autonomous QA (separate QA repo)\"]\n        SPECIFY_QA[\"/testspec-specify-qa - Questionnaire: tool, types, technical contract\"]\n        SPECIFY_QA --> SPEC_MD[\"spec.qa.md - CT to k6/Gatling script mapping\"]\n        SPECIFY_QA --> TASKS_MD[\"tasks.qa.md - Checklist of scripts to implement\"]\n\n        TASKS_MD --> APPLY_QA\n        SPEC_MD  --> APPLY_QA\n\n        APPLY_QA[\"/testspec-apply-qa - Generates scripts and run plans\"]\n        APPLY_QA --> E2E[\"e2e/ - k6-e2e-action-scenario.js + .md\"]\n        APPLY_QA --> LOAD[\"load/ - k6-load-action-scenario-rps.js + .md\"]\n        APPLY_QA --> CHAOS[\"chaos-engineering/ - k6-dr-action-scenario-type.js + .md\"]\n\n        E2E   --> RUN_QA\n        LOAD  --> RUN_QA\n        CHAOS --> RUN_QA\n\n        RUN_QA[\"/testspec-run-qa - AI execution agent\"]\n        RUN_QA --> EXEC[\"Runs script - Captures stdout, p95/p99/RPS metrics\"]\n        EXEC   --> LOGS[\"Collects logs - kubectl + Splunk via MCP\"]\n        LOGS   --> DB[\"Analyzes DB - SELECT via MCP DB\"]\n        DB     --> REPORT[\"Generates Markdown report - Summary, Metrics, Criteria\"]\n        REPORT --> CONFLUENCE[\"Publishes to Confluence via MCP\"]\n    end\n\n    style OPENSPEC     fill:#1e1e2e,stroke:#cba6f7,color:#cdd6f4\n    style IMPL         fill:#1e1e2e,stroke:#89b4fa,color:#cdd6f4\n    style QA           fill:#1e1e2e,stroke:#a6e3a1,color:#cdd6f4\n    style IDEA         fill:#313244,stroke:#f38ba8,color:#cdd6f4\n    style ARCHIVE      fill:#313244,stroke:#a6e3a1,color:#cdd6f4\n    style TESTS_CMD    fill:#45475a,stroke:#f9e2af,color:#cdd6f4\n    style SPECIFY_QA   fill:#45475a,stroke:#f9e2af,color:#cdd6f4\n    style APPLY_QA     fill:#45475a,stroke:#89b4fa,color:#cdd6f4\n    style RUN_QA       fill:#45475a,stroke:#a6e3a1,color:#cdd6f4\n    style CONFLUENCE   fill:#313244,stroke:#a6e3a1,color:#cdd6f4\n```\n\n---\n\n## Quick start\n\n```bash\n# install globally\nnpm install -g @analizza-ai/testspec\n\n# in your project root (must have openspec/ or similar)\ntestspec init       # detects SDD framework, selects AI agent, writes config\ntestspec generate   # reads specs → writes tests.md + stubs\ntestspec validate --results test-results.json\ntestspec report\n```\n\n---\n\n## Skills\n\n`testspec init` installs these 4 slash commands into your project's agent configuration (`.claude/commands/` for Claude Code, `.github/prompts/` for GitHub Copilot, `.kiro/steering/` for Kiro):\n\n| # | Skill | Layer | What it does |\n|---|-------|-------|--------------|\n| 1 | `/testspec-generate` | Developer | Consolidates all `spec.md` files for the feature and generates `tests.md` — a technology-agnostic document with numbered test cases (CT-01..N), acceptance criteria, DB validations, and out-of-scope boundaries |\n| 2 | `/testspec-specify-qa` | QA | Creates `testspec/` and `instructions.md` automatically if missing. Reads `tests.md` via GitHub MCP, runs a questionnaire (tool, test types, technical contract JSON) and generates `spec.qa.md` + `tasks.qa.md` + folder structure |\n| 3 | `/testspec-apply-qa` | QA | Implements k6/Gatling scripts from `tasks.qa.md` using `spec.qa.md` as the contract. Auto-generates a `.md` run plan alongside each script. Marks tasks `[x]` immediately after each pair is created |\n| 4 | `/testspec-run-qa` | QA / Chaos | AI agent: reads the run plan `.md`, executes the script, collects logs (kubectl + Splunk via MCP), queries the DB via MCP, generates a Markdown report, and publishes to Confluence. Never cancels the suite on failure — reports everything and continues |\n\n---\n\n## How it works\n\n```\nSpec artifacts (proposal.md · design.md · specs/**/*.md · tasks.md)\n    ↓\ntestspec generate  (/testspec-generate)\n    ↓\nSpecContext (scenarios, rules, contracts, dbAssertions)\n    ↓\nAgent prompt (printed to chat or sent via --api)\n    ↓\ntests.md  (CT-01..N)\n    ↓\nUnit stubs + Integration stubs (Testcontainers)\n    ↓\nQA repo reads tests.md via GitHub MCP\n    ↓  /testspec-specify-qa\nspec.qa.md + tasks.qa.md\n    ↓  /testspec-apply-qa\nk6 / Gatling scripts  ·  run plans .md\n    ↓  /testspec-run-qa\nExecution · Metrics · Logs · Report → Confluence\n```\n\n---\n\n## OpenSpec structure (app repo)\n\n```\nopenspec/\n├── config.yaml                          # stack, conventions and global rules\n├── specs/                               # reusable specs (global)\n└── changes/\n    ├── archive/                         # completed changes (/opsx:archive)\n    └── {change-name}/\n        ├── proposal.md                  # context, goals, non-goals\n        ├── design.md                    # architecture, contracts, decisions\n        ├── specs/\n        │   └── {feature}/\n        │       └── spec.md              # behaviour specification\n        ├── tests.md                     # test cases generated by /testspec-generate\n        └── tasks.md                     # tasks ready for /opsx:apply\n```\n\n## QA repo structure\n\n```\ntestspec/\n├── instructions.md              # app_repo (GitHub owner/repo), MCPs, QA project standards\n├── current-feature.md           # feature in focus for the current session (written by skills)\n└── {feature-name}/\n    ├── spec.qa.md               # technical contract: request · response · rules · CT → script mapping\n    └── tasks.qa.md              # checklist [ ] / [x] of scripts to implement\n\nsrc/test/features/\n└── {feature-name}/\n    ├── e2e/\n    │   ├── {tool}-e2e-{action}-{scenario}.js    # functional script — 1 per CT\n    │   └── {tool}-e2e-{action}-{scenario}.md    # run plan — read by /testspec-run-qa\n    ├── load/\n    │   ├── {tool}-load-{action}-{scenario}-{rps}-rps-{dur}.js\n    │   └── {tool}-load-{action}-{scenario}-{rps}-rps-{dur}.md\n    └── chaos-engineering/\n        ├── {tool}-dr-{action}-{scenario}-{type}.js\n        └── {tool}-dr-{action}-{scenario}-{type}.md\n\nreports/\n└── {feature-name}/\n    └── {script}-{YYYY-MM-DD-HHmm}.md   # report generated by /testspec-run-qa\n                                          # (fallback when Confluence unavailable)\n```\n\n---\n\n## tests.md format\n\n```yaml\n---\nfeature: Item Creation\nchange: item-creation\ngenerated: 2026-05-25T10:00:00.000Z\nsdd: openspec\nsdt: 0.1.0\nstack: { lang: node, db: postgresql }\nqa-repo: analizza-ai/qa\n---\n\n# Tests — Item Creation\n\n## Scope\n## Out of scope\n\n## Test cases\n\n### CT-01 — Create item with valid payload\n\n| Field               | Value                              |\n|---------------------|------------------------------------|\n| Type                | integration                        |\n| Layer               | developer                          |\n| Precondition        | User is authenticated              |\n| Input               | POST /api/items { name: \"x\" }      |\n| Expected output     | 201 Created { id: 1 }              |\n| DB validation       | SELECT id FROM items WHERE id = 1  |\n| Acceptance criteria | · item persisted · id returned     |\n\n## Load profile hints\n## Chaos scenarios\n```\n\n---\n\n## Supported SDD frameworks\n\n| Framework | Status |\n|-----------|--------|\n| OpenSpec (`@fission-ai/openspec`) | ✅ v1 |\n| SpecKit | planned |\n| BMAD | planned |\n| Kiro (AWS) | planned |\n| Custom | planned |\n\n## Supported AI agents\n\n| Agent | Status |\n|-------|--------|\n| Claude Code | ✅ print-to-chat + `--api` |\n| GitHub Copilot | ✅ print-to-chat |\n| Kiro | ✅ skills + slash commands |\n\n## Supported unit test frameworks\n\n| Framework | Status |\n|-----------|--------|\n| Vitest | ✅ |\n| Jest | ✅ |\n| Pytest | ✅ |\n| JUnit | ✅ |\n\n## Supported integration runtimes\n\n| Runtime | Status |\n|---------|--------|\n| Testcontainers + PostgreSQL | ✅ |\n| Testcontainers + PostgreSQL + Kafka | ✅ |\n| Testcontainers + Spring Boot + Kafka | ✅ |\n\n---\n\n## Configuration\n\n`testspec.config.json` in your project root:\n\n```json\n{\n  \"sdd\": \"openspec\",\n  \"agent\": \"claude\",\n  \"unitFramework\": \"vitest\",\n  \"stubs\": { \"unit\": true, \"integration\": true },\n  \"loadHints\": true,\n  \"chaosHints\": true,\n  \"qaRepo\": \"your-org/qa-repo\"\n}\n```\n\n---\n\n## CI/CD\n\nThis package is published to npmjs automatically via GitHub Actions on every `v*` tag.\n\n| Workflow | Trigger | What it does |\n|----------|---------|--------------|\n| `ci.yml` | Push / PR to `main` | Lint + test on Node 20 and 22 |\n| `release.yml` | Manual (`workflow_dispatch`) | Bumps version, commits, pushes tag |\n| `publish.yml` | Tag `v*` push or manual | Publishes to npmjs with provenance |\n\nTo release a new version: **GitHub → Actions → Release → Run workflow → pick `patch` / `minor` / `major`**.\n\n---\n\n## Adapter extension guide\n\nSee [docs/adapters-sdd.md](docs/adapters-sdd.md) to add a custom SDD framework adapter.\n\n---\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md). Issues and PRs welcome.\n\n---\n\n## License\n\nMIT © Diego Lirio\n","readmeFilename":"README.md"}