Changelog
All notable changes to @hosaka-fm/crate are documented here. The format follows
Keep a Changelog, and this project adheres to
Semantic Versioning.
Stable from
1.0.0. The typed surface is regenerated fromspec/openapi.json, so type changes track the live crate API contract. Breaking API changes bump the major.
1.0.0 - 2026-06-30
Section titled “1.0.0 - 2026-06-30”First stable release. Targets crate’s cluster-first /api/v2 (OpenAPI 2.0.0). The catalogue
is now keyed on cluster_id — the artist is the root, and master/bandcamp are dimensions of
the artist dossier rather than top-level resources. This is a breaking change from the 0.x line
(which targeted /api/v1); see Migrating from v1 in the README.
crate.label(key, opts?)→LabelDossierContract. Labels are first-class in v2.?fields=sparse fieldsets onartist()anddossier.artist()via{ fields: [...] }— the response is default-rich (one round-trip); passfieldsonly to trim it. An unknown field name returns400 invalid_fields(added toCRATE_ERROR_CODES).- RFC 8594 deprecation surfacing:
Deprecation/Sunsetresponse headers emit a one-timeconsole.warn. The transport follows308redirects preserving method + body (the two POST beacon endpoints survive a redirect). - World-class documentation suite: README (cluster-first hero, recipes, migration table), a
docs/guide set, runnableexamples/, and agent-first entrypoints (AGENTS.md,llms.txt). The README “Client surface” table + the interactive explorer are generated from method TSDoc (npm run docs:build); the explorer’s “Key concepts” come from the spec’sx-concepts— all drift-guarded in CI. - npm package metadata:
keywords,homepage,bugs;CHANGELOG.mdships in the tarball.
Changed
Section titled “Changed”- Base path is now
/api/v2(was/api/v1).crate.index()(keyless) reportsversion: v2. - The artist dossier (
ArtistDossierContract) is the cluster-first hub: it carriesdiscography(a pointer index of masters:discogs_master_id+representative_name+_links.master),bandcamp_emergence, andbandcamp_tastemakerdimensions.LabelDossierContractis first-class. - Attribution is Hosaka FM; publishing target is the public npm registry under
@hosaka-fm.
Removed
Section titled “Removed”crate.master()/crate.masters()— masters have no standalone v2 resource. The artist dossier’sdiscographyis a pointer index, not per-master detail; per-master enrichment, tracklists, and batch master lookups are genuine removals (their_links.masterpoint back to the frozen v1 surface).crate.bandcamp.*(release,releases) and theBandcampRelease*types — Bandcamp is now thebandcamp_emergence/bandcamp_tastemakerdimensions of the artist dossier.crate.wayfind/crate.usage()— no v2 equivalent.- Pagination (
crate.search().pages(),bulkAll, thepaginationexport, async iterators) — removed with the bulk Bandcamp surface;crate.search()returns a single page.
0.3.0 - 2026-06-26
Section titled “0.3.0 - 2026-06-26”crate.bandcamp.release({ item | url })→BandcampRelease | null(the honest gap, HTTP 200present: false, returnsnull— not an error) andcrate.bandcamp.releases({ clusterId })→BandcampReleaseSummary[].- New exported types:
BandcampRelease,BandcampReleaseSummary,BandcampReleaseResponse,ArtworkItem, and aBandcampTrackalias.
Changed
Section titled “Changed”- Regenerated types against the live spec:
resolve()locatorsnow spans eight platform arrays; dossiers carry link-onlyartwork(ArtworkItem[]).bandcamp_item_id/cluster_idare opaque strings — pass through, never numericize.
0.2.0 - 2026-06-26
Section titled “0.2.0 - 2026-06-26”Changed
Section titled “Changed”- Key-first. Every data endpoint now requires an
apiKey(sent asX-API-Key); onlycrate.index()is keyless. Data methods throwCrateValidationError('api_key_required')before any network call. Regenerated against crate API spec1.1.0.
0.1.0 - 2026-06-26
Section titled “0.1.0 - 2026-06-26”- Initial release: typed client over crate’s public API with typed methods, automatic retries
(full-jitter backoff honouring
Retry-After), async-iterator pagination, teaching errors as typed exceptions (CrateError+ subclasses,.kind/.code/.hint/.next, JSON-safe), theCRATE_RESOURCESsurface map andCRATE_ERROR_REGISTRYerror dictionary, dual ESM + CJS, and zero runtime dependencies.