Repository navigation
Releases
Releases · Durable-Quality/specproof
v0.10.0
Fixed
- Spec discovery starts at the git repository containing the current directory, so
specproof devfinds a spec that lives above the directory you started in.--repostill audits exactly the directory you pass.
Added
- A
.json,.yaml, or.ymlfile is discovered as the spec when it has a rootopenapiorswaggerversion and the repo has noopenapi*orswagger*file. The specification identifies a document by that field and allows any filename. The shallowest conventional name still wins.
Upgrading
- Running from a subdirectory now audits the whole git repo. To keep auditing only one package, pass
--repofor that package.
v0.9.4
Changed
- The test-code panel's
SOURCE ·file path now sits between the route description and the first test name, at the same size as the test name and in bold, instead of below the code blocks.
v0.9.3
Fixed
it()/test()block extraction now closes on})with or without a trailing semicolon, instead of requiring});. Audited repos that don't use semicolons were showing the rest of thedescribeblock as the proof snippet instead of just the matching test.
v0.9.2
Changed
- Split
example/tests/tasks.test.tsinto one*.integration.test.tsfile per operation, matching the existing per-operation split for auth, and renamedauth.test.tstoauth-login.integration.test.ts. - README's quick start now leads with
bun add -d specproof/bunx specproof devand listsspecproof --help's flags instead of prose. - The marketing hero's report mockup is now generated from
app/proof.generated.jsonbybun run generate:mockupinstead of being hand-written, and gained the app's own tag and route accordions: every operation opens onto its status list, minus the stamp-to-side-panel step.
Fixed
- An operation's tally now counts every status row it prints, including synthesized and undocumented ones, so the fraction matches the marks beside it (the bundled example's total goes from 10/17 to 11/24).
- The report's assertion count now shows for any verdict with assertions, not just spec-documented ones.
- The "Built by Durable Quality" link now points at the studio's current handle (
x.com/DurableQA). - The marketing footer's version tag was hardcoded and had gone stale at
v0.7.1;bun run generate:mockupnow rewrites it frompackage.json'sversionon every run, so it can't drift again.
v0.9.1
Changed
- Split this repo's own test suite into
tests/unit/andtests/integration/, withbun run test:unitandbun run test:integrationas separate scripts (bun run teststill runs both). CI'sTestjob now runs them as two steps so a log or re-run can target one without pulling in the other. - Trimmed
scripts/README.mdto cut redundant explanation while keeping every command and flag.
v0.9.0
Added
- A
NO DESCRIPTIONstamp marks an operation with nosummaryand a documented response with an emptydescription, so a missing description reads as the spec gap it is instead of as blank space. - A
MISSING FROM SPECstamp marks every response status the spec does not document, greying the status code. Statuses SpecProof expects of an operation and never finds are now listed rather than silently absent:500for every operation,404where a path parameter addresses a resource, and400where the operation declares a request body. The stamp is about the spec, so it is independent of the test verdict beside it: a status nothing asserts readsNO TEST, and one the tests do assert readsUNDOCUMENTED.
Changed
UNDOCUMENTEDis now reserved for a status the tests assert that the spec never mentions. A status with no assertions reads asNO TESTwhether the spec documents it or not.
Fixed
- A status code asserted in tests but absent from the OpenAPI spec no longer replaces the route's description with "asserted in tests, but absent from the OpenAPI spec". A description is only ever the spec's own, shown as written; SpecProof never substitutes text for it.
v0.8.0
Added
- Specs can now be developed alongside SpecProof from nothing: an empty, comment-only, or path-less OpenAPI file compiles to an empty proof and renders instead of failing, so
specproof devopens on a repo whose API is still being written. specproof devwatches the audited repo's spec and test files and rebuilds the proof as they change, so adding an operation shows up in the report without a restart. Disable with--no-watch.specproof generate --allow-emptywrites a proof with no operations even when the one it replaces had some.- The report distinguishes "no API definition found" from "a spec exists but documents no operations yet", and the second points at the next edit to make.
Changed
- The empty-proof guard is now regression-aware rather than absolute: writing a proof with no operations is refused only when it would overwrite one that had some. That case keeps its hard failure, and names both counts in the message.
- Finding no spec at all now writes an empty proof rather than keeping whatever was already on disk. Auditing a repo whose API isn't written yet could previously leave the previously audited repo's coverage on screen, relabeled with the new repo's name. A proof that already has operations is still kept, since a spec that suddenly can't be found is more often a moved file than a deleted API, and the warning now names
--allow-emptyas the override.specproof devandbuildpass that flag when refreshing their own artifact;--checkremains a hard failure. specproof devno longer refuses to start when the spec doesn't parse. It warns, serves the last good proof, and heals on the next save, since half-written YAML is the normal state of a file being edited.specproof buildstill fails hard.
Upgrading
- Proofs gain a
hasSpecfield, so a proof committed by 0.7.x is one field behind. Runspecproof generateonce and commit the result.specproof generate --checkdetects this case and says the proof came from an older SpecProof rather than reporting it as spec drift, so CI points at the upgrade instead of sending you looking for a change that didn't happen. Plainspecproof generatejust rewrites the file.
v0.7.2
Changed
- Replaced the README's static coverage report screenshot with a walkthrough GIF covering the route breakdown and test snippet detail views.
v0.7.1
Changed
- Trimmed the README to a quick start and CLI summary, since the marketing site now covers install variants, conventions, and the CI drift-guard example in more depth.
- Added a screenshot of the coverage report to the README.
v0.7.0
Added
- YAML OpenAPI specs are read directly: auto-discovery now matches
openapi*/swagger*in.json,.yaml, and.yml, and--specaccepts any of them (any other extension is sniffed). A spec and its conversion to the other format produce a byte-identical proof, so switching formats never registers as drift. specproof generatewarns when two specs sit at the same depth in the tree, naming the one it audited. The case that matters is aopenapi.yamlchecked in beside a convertedopenapi.json, where the loser is usually stale.generatenow names the spec it read in its success and--checkoutput.
Changed
- A malformed, empty, or non-object spec now fails with a one-line message instead of an uncaught stack trace, in both
generateandgenerate --check, and never overwrites an existing proof. - Tag section headers in the report no longer carry a leading sequence number.
Fixed
generaterefuses an--outpath that spec auto-discovery would read as an API definition (openapi*/swagger*), which previously let the proof overwrite the spec it was compiled from, or be audited as a spec on the next run.