You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@cosyte/eslint-config@0.0.6
Changelog
All notable changes to @cosyte/eslint-config are documented here, following Keep a Changelog. Versions are managed with Changesets;
this file is hand-maintained (Changesets' own changelog generation is disabled). The package stays on
the 0.0.x-until-first-alpha ladder.
Because the generator is disabled, [Unreleased] is promoted to a version heading BY HAND, in
the pull request that adds the changeset. Nothing does it automatically. Until 2026-08-04 nothing
did it at all, so shipped content stayed under [Unreleased] and every release republished it.
[Unreleased]
Changed
The sections below were relabelled: content that had already shipped was still sitting under [Unreleased], so each release republished it. Every section now carries the version it shipped
in. No rule, option, or behaviour change; the CHANGELOG.md inside the published tarball is the
only thing that differs.
[0.0.5] - 2026-07-31
Changed
Documentation and source comments no longer use em dashes, in line with the cosyte brand
voice. No rule, option, or behaviour change.
[0.0.4] - 2026-06-26
Added
Application mode:cosyte(rootDir, { library: false }) drops the JSDoc + @example gate and no-console while keeping every type-safety rule (no any, no unjustified casts, exhaustiveness,
strict imports). Libraries (the default, library: true) are unchanged. This makes applications,
like the pathways engine, first-class consumers of the one shared config instead of forking it:
an app has no published API surface to document and legitimately logs.
[0.0.3] - 2026-06-25
Changed
ESLint 10 baseline: @eslint/js^10, eslint-plugin-jsdoc^63, typescript-eslint^8.62, eslint-config-prettier^10.1. The eslint peer accepts ^9 || ^10 during the suite's migration
window; it will tighten to ^10 once every repo is on ESLint 10.
Added
typescript is now a declared peer dependency (the type-checked rules require it).
[0.0.2] - 2026-06-24
Added
Initial release of the ESLint 9 flat config: recommendedTypeChecked + the cosyte guardrails (no any,
no unjustified casts, JSDoc + @example gate on public exports, no-console in library code).
(0.0.1 was never published.)
@cosyte/prettier-config@0.0.4
Changelog
All notable changes to @cosyte/prettier-config are documented here, following Keep a Changelog. Versions are managed with Changesets;
this file is hand-maintained (Changesets' own changelog generation is disabled). The package stays on
the 0.0.x-until-first-alpha ladder.
Because the generator is disabled, [Unreleased] is promoted to a version heading BY HAND, in
the pull request that adds the changeset. Nothing does it automatically. Until 2026-08-04 nothing
did it at all, so shipped content stayed under [Unreleased] and every release republished it.
[Unreleased]
Changed
The sections below were relabelled: content that had already shipped was still sitting under [Unreleased], so each release republished it. Every section now carries the version it shipped
in. No setting change; the CHANGELOG.md inside the published tarball is the only thing that
differs.
[0.0.3] - 2026-07-31
Changed
Documentation no longer uses em dashes, in line with the cosyte brand voice. No setting
change.
[0.0.2] - 2026-06-25
Added
Package README.md and this CHANGELOG.md (now shipped in the published tarball).
All notable changes to @cosyte/test-utils are documented here, following Keep a Changelog. Versions are managed with Changesets;
this file is hand-maintained (Changesets' own changelog generation is disabled). The package stays on
the 0.0.x-until-first-alpha ladder.
Because the generator is disabled, [Unreleased] is promoted to a version heading BY HAND, in
the pull request that adds the changeset. Nothing does it automatically. Until 2026-08-04 nothing
did it at all, so shipped content stayed under [Unreleased] and every release republished it.
[Unreleased]
Changed
The sections below were relabelled: content that had already shipped was still sitting under [Unreleased], so each release republished it. Every section now carries the version it shipped
in. No runner or API change; the CHANGELOG.md inside the published tarball is the only thing that
differs.
[0.0.2] - 2026-07-31
Added
assertNoDiagnosticPhiLeak, a runner proving that consumer-controlled input does not echo into a
diagnostic surface. For every slot the caller declares it sweeps each diagnostic message, the
whole diagnostic rendered as JSON, as util.inspect, and by a walk of the object graph, err.message, err.stack, the thrown value itself, and every structural identifier the caller
enumerates on the model. The walk is what reaches a nested toString, raw bytes attached as
context, and entries past inspect's truncation ceilings, none of which either summary rendering
shows. Matching is case-insensitive, so a value upper-cased on conformance grounds still fails.
What it proves, stated narrowly: no verbatim echo of four or more bytes of a planted value, on
a slot that provably reached the diagnostic it names. It does not prove the absence of a
re-encoded echo, an echo shorter than four bytes, or a leak through an undeclared slot.
Each slot must name the diagnostic code it expects, and the runner asserts that code appeared in
lenient mode. Counting diagnostics is not enough: an unrelated warning can otherwise stand in for
the one the slot exists to trigger, leaving the leaking branch unentered and the suite green. The
assertion is lenient-only because a strict mode throws on the first deviation, so only one slot
could ever satisfy its own code there. Strict mode keeps its sweep.
getDiagnostics, getModelIdentifiers and parseStrict are required rather than defaulted. () => [] and null are legitimate answers; silence is not, and a silent default reading only .warnings would report green on a model it had half-read.
Opt-in checkLengthInvariance catches a re-encoded echo by comparing diagnostic sizes across a
short and a long planted value. Off by default because a diagnostic carrying an input-derived
number, such as a position column gaining digits or a byte count, grows the same way and is
correct.
Exercised by constructed positive controls, each isolating the one surface it names, and by
controls asserting the runner stays green where a correct parser would otherwise be failed.
Changed
Documentation, source comments, the npm package description, and seven assertion-failure
message strings no longer use em dashes, in line with the cosyte brand voice. No API, type, or
behaviour change: the message strings are the diagnostics a failing conformance run prints.
[0.0.1] - 2026-06-26
Added
First real release of the conformance kit: the first built (publishable) package in config.
Framework-agnostic, fast-check-powered (peer dep ^3), throws on failure so any runner catches
it. Public API:
roundTripProperty: parse(serialize(x)) equals x (deep-equal default or custom equals)
plus serialize-idempotency.
lenientNeverThrowsProperty: parse throws only on sanctioned fatals; every recovered warning
carries a registered code and (optionally) positional context.
immutabilityProperty: a mutation attempt throws or returns a new instance; the original is
never edited in place.
sortedCodeSet: sorted warning/fatal code values for a snapshot stability tripwire.
assertNoSecretLeak: the PHI-leak matrix across JSON.stringify, String(), template-literal
interpolation, and util.inspect, naming the leaking channel on failure.
Dual ESM + CJS build via @cosyte/tsup-config with per-condition types (.d.ts / .d.cts), attw as a publish gate.
@cosyte/tsconfig@0.0.4
Changelog
All notable changes to @cosyte/tsconfig are documented here, following Keep a Changelog. Versions are managed with Changesets;
this file is hand-maintained (Changesets' own changelog generation is disabled). The package stays on
the 0.0.x-until-first-alpha ladder.
Because the generator is disabled, [Unreleased] is promoted to a version heading BY HAND, in
the pull request that adds the changeset. Nothing does it automatically. Until 2026-08-04 nothing
did it at all, so shipped content stayed under [Unreleased] and every release republished it.
[Unreleased]
Changed
The sections below were relabelled: content that had already shipped was still sitting under [Unreleased], so each release republished it. Every section now carries the version it shipped
in. No compiler-option change; the CHANGELOG.md inside the published tarball is the only thing
that differs.
[0.0.3] - 2026-07-31
Changed
Documentation no longer uses em dashes, in line with the cosyte brand voice. No
compiler-option change.
[0.0.2] - 2026-06-25
Changed
target and lib raised from ES2022 to ES2023 (the suite's Node ≥ 22 floor supports it).
All notable changes to @cosyte/tsup-config are documented here, following Keep a Changelog. Versions are managed with Changesets;
this file is hand-maintained (Changesets' own changelog generation is disabled). The package stays on
the 0.0.x-until-first-alpha ladder.
Because the generator is disabled, [Unreleased] is promoted to a version heading BY HAND, in
the pull request that adds the changeset. Nothing does it automatically. Until 2026-08-04 nothing
did it at all, so shipped content stayed under [Unreleased] and every release republished it.
[Unreleased]
Changed
The sections below were relabelled: content that had already shipped was still sitting under [Unreleased], so each release republished it. Every section now carries the version it shipped
in. No build-option change; the CHANGELOG.md inside the published tarball is the only thing that
differs.
[0.0.2] - 2026-07-31
Changed
Documentation no longer uses em dashes, in line with the cosyte brand voice. No build-option
change.
[0.0.1] - 2026-06-25
Added
Initial release of cosyteTsup(overrides): the standard dual ESM + CJS, ES2023, Node-platform tsup
build config for @cosyte/* libraries.
@cosyte/vitest-config@0.0.4
Changelog
All notable changes to @cosyte/vitest-config are documented here, following Keep a Changelog. Versions are managed with Changesets;
this file is hand-maintained (Changesets' own changelog generation is disabled). The package stays on
the 0.0.x-until-first-alpha ladder.
Because the generator is disabled, [Unreleased] is promoted to a version heading BY HAND, in
the pull request that adds the changeset. Nothing does it automatically. Until 2026-08-04 nothing
did it at all, so shipped content stayed under [Unreleased] and every release republished it.
[Unreleased]
Changed
The sections below were relabelled: content that had already shipped was still sitting under [Unreleased], so each release republished it. Every section now carries the version it shipped
in. No config or behaviour change; the CHANGELOG.md inside the published tarball is the only
thing that differs.
[0.0.3] - 2026-07-31
Changed
Documentation and source comments no longer use em dashes, in line with the cosyte brand
voice. No config or behaviour change.
[0.0.2] - 2026-07-15
Added
Declared vite (^6 || ^7 || ^8) as a peer dependency. Vitest 4 requires vite >= 6, and the
resolver otherwise keeps an incompatible vite 5 (missing the ./module-runner export).
Doc/code-agreement harness on a new @cosyte/vitest-config/snippets subpath: docSnippetSuite()
plus the factored primitives (extractRunnableSnippets, rewriteAssertions, remapImports, runSnippet). It extracts every fenced ```ts runnable block from a package's docs-content/,
compiles it, executes it against the package, and asserts its inline // => value results: the
documentation analog of the conformance runners, so a green docs build can never carry a snippet
that silently disagrees with the code. devDep-only; Vitest is already a peer, so no new dependency.
[0.0.1] - 2026-06-25
Added
Initial release of cosyteVitest(opts): v8 coverage, standard excludes, and enabled, gating
per-directory thresholds at >= 90.
Do not merge this yet. release-dry-run is red on a PRE-EXISTING defect, and merging would burn five versions to publish nothing useful.
What is red
release-dry-run fails inside pnpm -r publish --dry-run, which invokes @cosyte/test-utils's prepublishOnly (clean && typecheck && lint && test && build). Seven cases in packages/test-utils/test/attw-gate.test.ts fail with:
ENOENT: no such file or directory, open 'attw-gate-fixture-unpacked-1.0.0.tgz'
This is the exact defect RELEASING.md already documents, back through a new vector
RELEASING.md § "Keep packing tools out of prepublishOnly" says it plainly: attw --pack . packs a tarball of its own, and run from inside pnpm publish's staging context that pack lands somewhere attw cannot find. f32e7dd (#40) fixed it by taking pnpm attw out of prepublishOnly.
attw-gate.test.ts arrived later, in 7461b0e (#42), and shells out to the real attw --pack from the test suite. prepublishOnly still runs pnpm test. So the same defect is back, one level down: not the prepublishOnly tail, but a test the tail runs.
Why it surfaced only now, and why it is not this PR's doing
publish --dry-runskips a version already on npm, so the whole prepublishOnly chain only runs when a version bumps. #42 landed with no changeset, so nothing bumped, so nothing ran it. This is the first version bump since, which is the only reason it is visible. 2f3e70c..89cc33f touches nothing in packages/test-utils/ except CHANGELOG.md, and attw-gate.test.ts passes under pnpm test in verify (22) and verify (24) on this very PR.
Why merging is worse than waiting
changeset publish runs prepublishOnly too, so the real publish fails the same way. @cosyte/test-utils is the only one of the six with any scripts block, so the other five would publish and it would not: five versions burned for a partial release. The Every bumped package must be published, tagged and released step added in #45 would then correctly tag those five, name @cosyte/test-utils as bumped-but-never-published, and red the run. That is the designed behaviour working, and it is still not an outcome worth causing on purpose.
What it needs
Its own slice, because the fix is a design choice on the shared toolchain rather than a typo, and every parser's prepublishOnly is minted from the same template shape. The candidates are to keep pnpm test out of prepublishOnly, or to make the attw gate's fixtures pack somewhere absolute rather than CWD-relative. The second looks right and generalises, but it is a change to a gate with its own refuter history and it should be graded on its own.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@cosyte/eslint-config@0.0.6
Changelog
All notable changes to
@cosyte/eslint-configare documented here, followingKeep a Changelog. Versions are managed with Changesets;
this file is hand-maintained (Changesets' own changelog generation is disabled). The package stays on
the
0.0.x-until-first-alpha ladder.[Unreleased]
Changed
[Unreleased], so each release republished it. Every section now carries the version it shippedin. No rule, option, or behaviour change; the
CHANGELOG.mdinside the published tarball is theonly thing that differs.
[0.0.5] - 2026-07-31
Changed
voice. No rule, option, or behaviour change.
[0.0.4] - 2026-06-26
Added
cosyte(rootDir, { library: false })drops the JSDoc +@examplegate andno-consolewhile keeping every type-safety rule (noany, no unjustified casts, exhaustiveness,strict imports). Libraries (the default,
library: true) are unchanged. This makes applications,like the
pathwaysengine, first-class consumers of the one shared config instead of forking it:an app has no published API surface to document and legitimately logs.
[0.0.3] - 2026-06-25
Changed
@eslint/js^10,eslint-plugin-jsdoc^63,typescript-eslint^8.62,eslint-config-prettier^10.1. Theeslintpeer accepts^9 || ^10during the suite's migrationwindow; it will tighten to
^10once every repo is on ESLint 10.Added
typescriptis now a declared peer dependency (the type-checked rules require it).[0.0.2] - 2026-06-24
Added
Initial release of the ESLint 9 flat config:
recommendedTypeChecked+ the cosyte guardrails (noany,no unjustified casts, JSDoc +
@examplegate on public exports,no-consolein library code).(
0.0.1was never published.)@cosyte/prettier-config@0.0.4
Changelog
All notable changes to
@cosyte/prettier-configare documented here, followingKeep a Changelog. Versions are managed with Changesets;
this file is hand-maintained (Changesets' own changelog generation is disabled). The package stays on
the
0.0.x-until-first-alpha ladder.[Unreleased]
Changed
[Unreleased], so each release republished it. Every section now carries the version it shippedin. No setting change; the
CHANGELOG.mdinside the published tarball is the only thing thatdiffers.
[0.0.3] - 2026-07-31
Changed
change.
[0.0.2] - 2026-06-25
Added
README.mdand thisCHANGELOG.md(now shipped in the published tarball).[0.0.1] - 2026-06-24
Added
printWidth100, double quotes, semicolons, trailingcommas,
arrowParens: always, LF) with*.md/ JSON / YAML overrides.@cosyte/test-utils@0.0.3
Changelog
All notable changes to
@cosyte/test-utilsare documented here, followingKeep a Changelog. Versions are managed with Changesets;
this file is hand-maintained (Changesets' own changelog generation is disabled). The package stays on
the
0.0.x-until-first-alpha ladder.[Unreleased]
Changed
[Unreleased], so each release republished it. Every section now carries the version it shippedin. No runner or API change; the
CHANGELOG.mdinside the published tarball is the only thing thatdiffers.
[0.0.2] - 2026-07-31
Added
assertNoDiagnosticPhiLeak, a runner proving that consumer-controlled input does not echo into adiagnostic surface. For every slot the caller declares it sweeps each diagnostic
message, thewhole diagnostic rendered as JSON, as
util.inspect, and by a walk of the object graph,err.message,err.stack, the thrown value itself, and every structural identifier the callerenumerates on the model. The walk is what reaches a nested
toString, raw bytes attached ascontext, and entries past
inspect's truncation ceilings, none of which either summary renderingshows. Matching is case-insensitive, so a value upper-cased on conformance grounds still fails.
What it proves, stated narrowly: no verbatim echo of four or more bytes of a planted value, on
a slot that provably reached the diagnostic it names. It does not prove the absence of a
re-encoded echo, an echo shorter than four bytes, or a leak through an undeclared slot.
lenient mode. Counting diagnostics is not enough: an unrelated warning can otherwise stand in for
the one the slot exists to trigger, leaving the leaking branch unentered and the suite green. The
assertion is lenient-only because a strict mode throws on the first deviation, so only one slot
could ever satisfy its own code there. Strict mode keeps its sweep.
getDiagnostics,getModelIdentifiersandparseStrictare required rather than defaulted.() => []andnullare legitimate answers; silence is not, and a silent default reading only.warningswould report green on a model it had half-read.checkLengthInvariancecatches a re-encoded echo by comparing diagnostic sizes across ashort and a long planted value. Off by default because a diagnostic carrying an input-derived
number, such as a position column gaining digits or a byte count, grows the same way and is
correct.
controls asserting the runner stays green where a correct parser would otherwise be failed.
Changed
message strings no longer use em dashes, in line with the cosyte brand voice. No API, type, or
behaviour change: the message strings are the diagnostics a failing conformance run prints.
[0.0.1] - 2026-06-26
Added
config.Framework-agnostic,
fast-check-powered (peer dep^3), throws on failure so any runner catchesit. Public API:
roundTripProperty:parse(serialize(x))equalsx(deep-equal default or customequals)plus serialize-idempotency.
lenientNeverThrowsProperty:parsethrows only on sanctioned fatals; every recovered warningcarries a registered code and (optionally) positional context.
immutabilityProperty: a mutation attempt throws or returns a new instance; the original isnever edited in place.
sortedCodeSet: sorted warning/fatal code values for a snapshot stability tripwire.assertNoSecretLeak: the PHI-leak matrix acrossJSON.stringify,String(), template-literalinterpolation, and
util.inspect, naming the leaking channel on failure.@cosyte/tsup-configwith per-condition types (.d.ts/.d.cts),attwas a publish gate.@cosyte/tsconfig@0.0.4
Changelog
All notable changes to
@cosyte/tsconfigare documented here, followingKeep a Changelog. Versions are managed with Changesets;
this file is hand-maintained (Changesets' own changelog generation is disabled). The package stays on
the
0.0.x-until-first-alpha ladder.[Unreleased]
Changed
[Unreleased], so each release republished it. Every section now carries the version it shippedin. No compiler-option change; the
CHANGELOG.mdinside the published tarball is the only thingthat differs.
[0.0.3] - 2026-07-31
Changed
compiler-option change.
[0.0.2] - 2026-06-25
Changed
targetandlibraised fromES2022toES2023(the suite's Node ≥ 22 floor supports it).[0.0.1] - 2026-06-24
Added
base.json(strict type-check baseline) andlibrary.json(base.json+ emit).@cosyte/tsup-config@0.0.3
Changelog
All notable changes to
@cosyte/tsup-configare documented here, followingKeep a Changelog. Versions are managed with Changesets;
this file is hand-maintained (Changesets' own changelog generation is disabled). The package stays on
the
0.0.x-until-first-alpha ladder.[Unreleased]
Changed
[Unreleased], so each release republished it. Every section now carries the version it shippedin. No build-option change; the
CHANGELOG.mdinside the published tarball is the only thing thatdiffers.
[0.0.2] - 2026-07-31
Changed
change.
[0.0.1] - 2026-06-25
Added
cosyteTsup(overrides): the standard dual ESM + CJS, ES2023, Node-platform tsupbuild config for
@cosyte/*libraries.@cosyte/vitest-config@0.0.4
Changelog
All notable changes to
@cosyte/vitest-configare documented here, followingKeep a Changelog. Versions are managed with Changesets;
this file is hand-maintained (Changesets' own changelog generation is disabled). The package stays on
the
0.0.x-until-first-alpha ladder.[Unreleased]
Changed
[Unreleased], so each release republished it. Every section now carries the version it shippedin. No config or behaviour change; the
CHANGELOG.mdinside the published tarball is the onlything that differs.
[0.0.3] - 2026-07-31
Changed
voice. No config or behaviour change.
[0.0.2] - 2026-07-15
Added
vite(^6 || ^7 || ^8) as a peer dependency. Vitest 4 requires vite >= 6, and theresolver otherwise keeps an incompatible vite 5 (missing the
./module-runnerexport).@cosyte/vitest-config/snippetssubpath:docSnippetSuite()plus the factored primitives (
extractRunnableSnippets,rewriteAssertions,remapImports,runSnippet). It extracts every fenced```ts runnableblock from a package'sdocs-content/,compiles it, executes it against the package, and asserts its inline
// => valueresults: thedocumentation analog of the conformance runners, so a green docs build can never carry a snippet
that silently disagrees with the code. devDep-only; Vitest is already a peer, so no new dependency.
[0.0.1] - 2026-06-25
Added
cosyteVitest(opts): v8 coverage, standard excludes, and enabled, gatingper-directory thresholds at >= 90.