{"id":"src_0uwnRqqX0fCk-Cnj3PCdL","slug":"releases-cli","name":"Releases CLI","type":"github","url":"https://github.com/buildinternet/releases-cli","orgId":"org_qqq_XrrnbtEKOZADN-2Fz","productId":"prod_1EzCUYE7jVdukK8kOaWJb","productSlug":"cli","org":{"id":"org_qqq_XrrnbtEKOZADN-2Fz","slug":"releases-sh","name":"Releases"},"isPrimary":false,"isHidden":false,"discovery":"curated","metadata":"{\"wellKnownSweptAt\":\"2026-08-12T06:00:46.955Z\",\"sourceActor\":{\"nextAlarmAt\":\"2026-08-15T19:00:27.355Z\",\"lastAlarmAt\":\"2026-08-15T15:00:29.320Z\",\"managed\":true},\"declared\":{},\"selfDeclared\":{\"fields\":[\"declared\"],\"source\":\"github\",\"configHash\":\"348e922e\",\"syncedAt\":\"2026-07-12T06:00:58.239Z\"}}","notice":null,"kind":null,"stars":3,"starsFetchedAt":"2026-08-15T15:05:06.280Z","releaseCount":117,"releasesLast30Days":1,"avgReleasesPerWeek":3.5,"latestVersion":"v0.73.1","latestDate":"2026-07-28T22:23:17.000Z","changelogUrl":null,"hasChangelogFile":true,"lastFetchedAt":"2026-08-15T15:05:06.280Z","lastPolledAt":"2026-08-15T15:04:56.309Z","changeDetectedAt":null,"trackingSince":"2026-04-20T00:37:04.000Z","releases":[{"id":"rel_Vo3mrE55QUIlzz2D9Op27","version":"v0.73.1","type":"feature","title":"v0.73.1","summary":"getApiUrl() no longer memoizes the API base URL process-wide, fixing a test isolation bug that caused 22 failing tests under bun test. The releases stats command now reads the server's real values instead of returning zeroed-out fields, and source backfill --dry-run reports how much history is not yet stored.","titleGenerated":"Releases CLI v0.73.1 fixes test isolation bug and stats reporting","titleShort":"Test isolation bug fixed; stats now shows real ingestion health","breaking":"none","importance":2,"content":"\n### Patch Changes\n\n- 7fe55de: `source backfill --dry-run` now reports how much of the extracted history the source doesn't already have, as `N not yet stored`. Previously the dry-run line reported only how many entries were on the page, which said nothing about whether any of them were missing — during the 2026-07-23 ingest outage that gap let a run over a source missing its entire recent history read as uneventful. Requires an API worker carrying the new `notStored` field; against an older server the clause is omitted rather than guessed. The report type also catches up with the server: `inserted` is `null` on a dry run (nothing was written, no count computed) rather than a fabricated `0`.\n- b124608: Fix `getApiUrl()` memoizing the API base URL process-wide on first call. Under `bun test`, every test file shares one process, so whichever file called it first locked the base URL for the rest of the run — files that set `RELEASES_API_URL` afterward got the stale (production) URL instead and their assertions failed. This was silently CI-red on `main` (22 tests failing) because CI's clean environment produces a call order that trips the memoization, while a developer machine with real credentials hits a different, unrelated set of failures. `getApiUrl()` now re-resolves from the environment on every call instead of caching.\n- f7a1b54: Fix `releases stats` reporting every source as never-fetched with zero recent releases. The command composed its summary from the legacy flat fields of `/v1/stats` and hardcoded source health, `releasesInPeriod`, and every `lastFetchedAt` to `0`/`null` — a stale workaround from before the endpoint returned the full `StatsSummary` shape. It now reads the server's real values, so the output reflects actual ingestion health instead of implying the index is dead.","publishedAt":"2026-07-28T22:23:17.000Z","fetchedAt":"2026-07-28T23:19:39.687Z","url":"https://github.com/buildinternet/releases-cli/releases/tag/v0.73.1","media":[],"coverageCount":0},{"id":"rel_e06ByboKrcKQZeND0GTIB","version":"v0.73.0","type":"feature","title":"v0.73.0","summary":"Search results now include an AI-scored importance field (1–5) in JSON output, with the TTY table marking high-importance hits. Added a TLS certificate verification hint and custom-CA documentation for proxy environments.","titleGenerated":"Releases CLI v0.73.0 adds importance field to search results and TLS certificate hints","titleShort":"Search results now include AI-scored importance; TLS cert hints added","breaking":"none","importance":2,"content":"\n### Minor Changes\n\n- 88999c9: `releases search --json` now passes AI-scored `importance` (1–5) through in the slim search-hit shape, normalized to `null` when unscored — same norm as `get` / `tail` / `latest`. The TTY search table also marks importance ≥ 4 with the quiet glyph. Bumps `@buildinternet/releases-api-types` to `^0.48.0` for the search/related/digest wire field (monorepo #2135).\n\n### Patch Changes\n\n- e97462a: Surface a NODE_EXTRA_CA_CERTS / SSL_CERT_FILE hint on TLS certificate verification failures, and document custom-CA support (TLS-intercepting proxies) in the README.","publishedAt":"2026-07-13T19:51:41.000Z","fetchedAt":"2026-07-13T20:37:02.613Z","url":"https://github.com/buildinternet/releases-cli/releases/tag/v0.73.0","media":[],"coverageCount":0},{"id":"rel_XLUGlY7yn5quRyRlxHqIA","version":"v0.72.0","type":"feature","title":"v0.72.0","summary":"Removed the deprecated `get_source_changelog` MCP tool, replaced by `get_catalog_entry` with changelog params. Search now supports `--category` and `--collection` filters, and the release importance score is surfaced in tail/latest output.","titleGenerated":"Releases CLI v0.72.0 removes deprecated get_source_changelog MCP tool","titleShort":"Deprecated get_source_changelog removed; search gains category/collection filters","breaking":"major","importance":3,"content":"\n### Minor Changes\n\n- 0b1a45e: Remove the deprecated `get_source_changelog` tool from the local stdio MCP bridge. It was deprecated in 0.71.0 in favor of `get_catalog_entry` with the `changelog_*` params (`include_changelog` / `changelog_path` / `changelog_offset` / `changelog_limit` / `changelog_tokens`); calling `get_source_changelog` by name now returns MCP's standard unknown-tool error. The REST helper `sourceChangelog()` is unchanged — `get_catalog_entry` and the `admin source changelog` CLI command still use it.\n- e7d50b4: `releases search` gains `--category <slug>` and `--collection <slug>` filters. `--category` scopes hits to organizations in a category (the API validates and resolves curator aliases like `e-commerce` → `commerce`, so the value is forwarded as-is); `--collection` scopes to a curated collection's member orgs (unknown slugs report \"no collection matching …\", mirroring `--domain`). Both forward to the new `/v1/search` params and compose with the existing `--domain` / `--product` / `--kind` / `--since` / `--until` scopes.\n- 2d4b707: Surface the registry's AI-scored release `importance` (1–5, `null` when unscored). `tail`/`latest` gains `--min-importance <1-5>` (forwarded as `?minImportance=`); the human table marks importance ≥4 with a quiet glyph (outline at 4, solid at 5), mirroring the web's render threshold, while `--json` output (`get`/`tail`/`latest`) passes the raw score through verbatim, including `null`. Bumps the `@buildinternet/releases-api-types` and `@buildinternet/releases-core` pins to the versions that carry the `importance` field.","publishedAt":"2026-07-11T04:48:35.000Z","fetchedAt":"2026-07-11T07:22:55.490Z","url":"https://github.com/buildinternet/releases-cli/releases/tag/v0.72.0","media":[],"coverageCount":0},{"id":"rel_hgYBWhqGAC4fb-feUlnCZ","version":"v0.71.0","type":"feature","title":"v0.71.0","summary":"Local stdio MCP bridge's `get_catalog_entry` tool now accepts changelog parameters to inline a source entry's CHANGELOG in the same call, matching the hosted server. The standalone `get_source_changelog` tool is deprecated. Also added `releases admin release refetch` command and consolidated agent skills by moving operator skills to the backend monorepo.","titleGenerated":"Releases CLI v0.71.0 adds changelog inlining to MCP bridge and deprecates standalone tool","titleShort":"MCP bridge inlines changelogs; agent skills consolidated","breaking":"minor","importance":3,"content":"\n### Minor Changes\n\n- 735ba8a: The local stdio MCP bridge's `get_catalog_entry` tool now accepts `include_changelog`, `changelog_path`, `changelog_offset`, `changelog_limit`, and `changelog_tokens` — matching the hosted server at mcp.releases.sh — so a source entry's tracked CHANGELOG can be inlined or sliced in the same call, without a separate lookup. `changelog_tokens` takes precedence over `changelog_limit`, and any `changelog_*` param implies `include_changelog`; the params are ignored (with a clear message) for product entries. The standalone `get_source_changelog` tool is now deprecated in favor of these params — it remains registered and functional for this release, but agents should migrate.\n- 7ba0ebd: `releases org get` now renders stub-tier orgs (#1947): a `stub · not yet tracked` marker on the header and a `Declared locations` section listing each declared locator (kind, target, `canonical` flag), plus a hint to promote. Previously a stub printed as a bare identity block with no indication it was a declared-but-untracked listing. `--json` output is unchanged.\n\n### Patch Changes\n\n- 64951a6: Add `releases admin release refetch <releaseId>` to re-fetch a single release's live page and heal it in place (title/content/publishedAt, same `rel_` id). Supports `--url` for releases whose stored URL is a synthesized `#fragment` index anchor, defaults to a dry-run preview, and writes with `--apply`.\n- abeab6e: Consolidate agent skills by audience: this repo now ships only the three user-facing skills (`releases-mcp`, `releases-cli`, `analyzing-releases`). The `releases-admin` plugin, its five mirrored operator skills, and the `discovery`/`worker` agent definitions are removed — the canonical operator skills live in the backend monorepo's `.claude/skills/` tree. The `@buildinternet/releases-skills` npm wrapper is retired (removed from the workspace and the changesets fixed group; deprecated on npm). `npx skills add buildinternet/releases-cli` and `releases skills install` continue to work unchanged.","publishedAt":"2026-07-10T12:26:56.000Z","fetchedAt":"2026-07-10T15:04:58.424Z","url":"https://github.com/buildinternet/releases-cli/releases/tag/v0.71.0","media":[],"coverageCount":0},{"id":"rel_WNEONG_TIFQvTxTjyEpOl","version":"v0.70.1","type":"feature","title":"v0.70.1","summary":"Fixed overview stale warning to use content write time (updatedAt) instead of original generation time, so amended overviews no longer appear months-old when recently rewritten.","titleGenerated":"Releases CLI v0.70.1 fixes stale overview warning timestamp","titleShort":"Overview staleness now uses rewrite time, not original generation","breaking":"none","importance":2,"content":"\n### Patch Changes\n\n- cee0540: Fix overview stale warning to use content write time (`updatedAt`) instead of original generation time. Amended overviews no longer show as months-old when recently rewritten.","publishedAt":"2026-07-09T02:30:48.000Z","fetchedAt":"2026-07-09T06:29:05.482Z","url":"https://github.com/buildinternet/releases-cli/releases/tag/v0.70.1","media":[],"coverageCount":0},{"id":"rel_6qcsvCUOWTpWMaEmbGTwj","version":"v0.70.0","type":"feature","title":"v0.70.0","summary":"New `releases json export <org>` command generates a releases.json v2 domain manifest from a tracked org by reconstructing it from the registry via the backend GET /v1/orgs/:slug/manifest endpoint. Output prints to stdout (pipeable into `releases json validate -`) or writes to a file with -o/--output. Bumps @buildinternet/releases-api-types to ^0.41.0 to support product-level tags in manifests.","titleGenerated":"Releases CLI v0.70.0 adds json export command for releases.json manifests","titleShort":"json export generates releases.json v2 manifests","breaking":"none","importance":3,"content":"\n### Minor Changes\n\n- eaa4ad1: Add `releases json export <org>` — generate a `releases.json` v2 domain manifest from an already-tracked org. Reconstructs the manifest from what the registry knows about the org (products + release sources) by calling the backend `GET /v1/orgs/:slug/manifest` endpoint, so an owner can host the result at `/.well-known/releases.json` and take ownership of their listing. Prints to stdout by default (pipeable into `releases json validate -`) or writes to a file with `-o/--output`. Completes the owner round-trip alongside `releases json validate`. Re-ingest enriches missing fields only (fill-if-empty), never overwriting existing values.\n\n  Bumps `@buildinternet/releases-api-types` to `^0.41.0` for the product-level `tags` field, so `releases json validate` accepts manifests that declare product tags. `json export` itself trusts the backend and does not strict-validate the API response against the pinned schema (the deployed API can run ahead of the published types), so it only guards for a `version: 2` shape.","publishedAt":"2026-07-09T00:14:03.000Z","fetchedAt":"2026-07-09T02:24:36.721Z","url":"https://github.com/buildinternet/releases-cli/releases/tag/v0.70.0","media":[],"coverageCount":0},{"id":"rel_4k_LksEH-_sWXJCtXyPLo","version":"v0.69.0","type":"feature","title":"v0.69.0","summary":"The `releases json validate <domain>` command now validates live against the registry's listing endpoint and returns the materialization plan (identity, products, release locators with classification). Exit code 0 for valid, 1 for invalid or check failed. Added `--url` flag to `releases admin release update` to set or clear a release's canonical URL, and new stub-tier org verbs: `create-stub`, `create-stub-from-domain`, and `promote` with `--dry-run` support.","titleGenerated":"Releases CLI v0.69.0 adds live validation and stub org management","titleShort":"Live domain validation; stub org verbs ship","breaking":"minor","importance":2,"content":"\n### Minor Changes\n\n- f1f11ae: `releases json validate <domain>` now validates live against the registry's listing endpoint (previously deferred). The domain form POSTs the public `/v1/listing/validate` endpoint and renders the verdict plus the materialization plan — identity, products, and each release locator with its classification (\"goes live\" / \"reviewed first\") — ending with an activation pointer for unlisted domains. Exit codes: 0 valid, 1 invalid or check failed (the old unconditional exit 2 is gone). `--json` emits the raw `ListingValidationResult` merged with `{ target }`. Bumps `@buildinternet/releases-api-types` to ^0.39.0 for the listing wire types.\n- af88692: `releases admin release update` (and its deprecated `release edit` alias) now accept a `--url <url>` flag to set a release's canonical URL. Passing a non-empty value sets the URL; passing an empty string (`--url \"\"`) clears it. The backend `PATCH /v1/releases/:id` route already accepted the `url` field — this wires it through the CLI.\n- 042efbd: Add stub-tier org verbs (buildinternet/releases#1947): `releases admin org create-stub` (curator-authored stub org with repeatable `--location` JSON locators and/or `--from-file`), `releases admin org create-stub-from-domain <domain>` (stub from a domain's `/.well-known/releases.json` manifest, `--dry-run` supported), and `releases admin org promote <slug>` (materialize declared locations into sources and flip the org to tracked, `--dry-run` supported). Bumps `@buildinternet/releases-api-types` to ^0.38.0 for the stub-tier wire types.","publishedAt":"2026-07-08T20:21:32.000Z","fetchedAt":"2026-07-08T22:13:11.859Z","url":"https://github.com/buildinternet/releases-cli/releases/tag/v0.69.0","media":[],"coverageCount":0},{"id":"rel_FL3KVAINO7s4x0E7K0p0N","version":"v0.68.0","type":"feature","title":"v0.68.0","summary":"Added `releases json validate <path>` to validate a releases.json v2 owner manifest against the published schema before publishing, with support for file paths, stdin, and machine-readable JSON output. Upgraded to @buildinternet/releases-api-types 0.37.0 and migrated the repo-root releases.json to v2 manifest format.","titleGenerated":"Releases CLI v0.68.0 adds releases.json validation command","titleShort":"releases json validate command ships","breaking":"none","importance":2,"content":"\n### Minor Changes\n\n- c1e5ee6: Add `releases json validate <path>` — validate a `releases.json` v2 owner manifest against the published schema (`ReleasesJsonConfigSchema`) before publishing it. Accepts a file path or `-` for stdin, detects the hosting scope (domain vs repo) for readable path-anchored errors, and supports `--json` for machine output (exit 0 valid / 1 invalid). The `domain` form (live fetch + materialization plan) is deferred until the public dry-run endpoint lands (buildinternet/releases#1910) so web and CLI share one verdict.\n\n### Patch Changes\n\n- cf95da6: Adopt `@buildinternet/releases-api-types` 0.37.0 (releases.json v2 schema) and migrate the repo-root `releases.json` to the v2 manifest format (product binding + `github: \"self\"` release locator).","publishedAt":"2026-07-05T18:02:58.000Z","fetchedAt":"2026-07-05T20:52:39.281Z","url":"https://github.com/buildinternet/releases-cli/releases/tag/v0.68.0","media":[],"coverageCount":0},{"id":"rel_tKjadz_IFapxfxppkJI4L","version":"v0.67.3","type":"feature","title":"v0.67.3","summary":"Removed the `releases admin overview batch` command whose API route was retired. Added `releases admin org update --overview-cadence` to pin an org's automated overview-regen cadence (1–90 days) or clear back to the velocity-tiered automatic default; `releases admin org get` now shows the override when set.","titleGenerated":"Releases CLI v0.67.3 removes batch overview command and adds cadence control","titleShort":"Batch overview command removed; org cadence override added","breaking":"major","importance":3,"content":"\n### Patch Changes\n\n- 9fae093: `releases admin org update --overview-cadence <days|auto>` — pin an org's automated overview-regen cadence (1–90 days) or clear back to the velocity-tiered automatic default; `releases admin org get` shows the override when set (buildinternet/releases#1895).\n- cb01cc2: Removed `releases admin overview batch` — its API route was retired in buildinternet/releases#1902; use the automated overview regen (per-org cadence) or `--overview-cadence` instead.","publishedAt":"2026-07-04T19:02:52.000Z","fetchedAt":"2026-07-04T20:25:50.911Z","url":"https://github.com/buildinternet/releases-cli/releases/tag/v0.67.3","media":[],"coverageCount":0},{"id":"rel_yQmbTJ4nwqf-odKQoZ1O7","version":"v0.67.2","type":"feature","title":"v0.67.2","summary":"API error messages are now decoded through the published `decodeApiError` function from api-types instead of a hand-rolled reader, standardizing wire-shape handling across the SDK. Behavior is unchanged for nested, legacy flat, and malformed payloads.","titleGenerated":"Releases CLI v0.67.2 standardizes API error decoding","titleShort":"API error decoding uses shared decoder","breaking":"none","importance":1,"content":"\n### Patch Changes\n\n- b8d7f2f: Read API error messages through api-types' canonical `decodeApiError` instead of a hand-rolled envelope reader. Behavior is unchanged — the nested `{ error: { code, type, message } }` envelope, a legacy flat `{ message }` body, and malformed payloads (which fall back to the HTTP status text) all resolve exactly as before — but the CLI now shares the published wire-shape decoder rather than duplicating it. Bumps `@buildinternet/releases-api-types` to `^0.35.0` and `@buildinternet/releases-core` to `^0.25.0` (the versions that first export the errors module).","publishedAt":"2026-07-04T15:41:47.000Z","fetchedAt":"2026-07-04T16:21:24.376Z","url":"https://github.com/buildinternet/releases-cli/releases/tag/v0.67.2","media":[],"coverageCount":0},{"id":"rel_CPPeD0MPUJJZ5KyX-wK76","version":"v0.67.1","type":"feature","title":"v0.67.1","summary":"Fixed a bug where non-2xx API responses surfaced generic status text instead of the server's actual error message. The CLI now reads from the standardized nested error envelope with fallback to the legacy flat body format.","titleGenerated":"Releases CLI v0.67.1 reads API errors from standardized error envelope","titleShort":"API errors now surface server message instead of generic status text","breaking":"none","importance":null,"content":"\n### Patch Changes\n\n- 9a286fa: Read API error messages from the standardized nested error envelope. The API now\n  returns `{ error: { code, type, message } }`; the CLI was still reading a\n  top-level `body.message`, so non-2xx responses surfaced a generic status text\n  (e.g. \"Bad Request\") instead of the server's actual message. A new\n  `apiErrorMessage()` reader pulls `error.message` (tolerating the legacy flat\n  `{ message }` body), restoring precise error output.","publishedAt":"2026-07-02T20:41:17.000Z","fetchedAt":"2026-07-02T23:36:11.008Z","url":"https://github.com/buildinternet/releases-cli/releases/tag/v0.67.1","media":[],"coverageCount":0},{"id":"rel_m4Tug5HfwW9-lMYH3PAuB","version":"v0.67.0","type":"feature","title":"v0.67.0","summary":"Added --auto-generate-content / --no-auto-generate-content to `releases admin org update`, replacing the raw API call previously needed to toggle AI overviews and per-release summaries. Also surfaces current value in `releases admin org get` and shows an `opted_out` action in `releases admin overview plan` for orgs the batch skips.","titleGenerated":"Releases CLI v0.67.0 adds --auto-generate-content flag to admin org update","titleShort":"Auto-generate content flag now manageable via CLI","breaking":"none","importance":null,"content":"\n### Minor Changes\n\n- bf51f1b: Add `--auto-generate-content` / `--no-auto-generate-content` to `releases admin org update` — the single backend gate that decides whether an org gets AI overviews and per-release summaries. Previously the only way to toggle it was a raw `curl` PATCH. `releases admin org get` now shows the current value, and `releases admin overview plan` surfaces an `opted_out` action for orgs the batch skips because the flag is off.","publishedAt":"2026-07-01T14:38:00.000Z","fetchedAt":"2026-07-01T15:00:05.757Z","url":"https://github.com/buildinternet/releases-cli/releases/tag/v0.67.0","media":[],"coverageCount":0},{"id":"rel_DcabIlaPZF6_dLjQFk-tH","version":"v0.66.0","type":"feature","title":"v0.66.0","summary":"The `releases webhook add` and `edit` commands now support `--format slack` to deliver releases as formatted Slack messages via a Slack incoming webhook URL.","titleGenerated":"Releases CLI v0.66.0 adds Slack-formatted webhook delivery","titleShort":"Releases webhook now supports Slack message formatting","breaking":"minor","importance":null,"content":"\n### Minor Changes\n\n- 26e14ad: Add `--format slack` to `releases webhook add`/`edit` to deliver releases as formatted Slack messages via a Slack incoming webhook URL.","publishedAt":"2026-06-24T20:03:35.000Z","fetchedAt":"2026-06-24T23:05:30.596Z","url":"https://github.com/buildinternet/releases-cli/releases/tag/v0.66.0","media":[],"coverageCount":0},{"id":"rel_fEE6rIGDrwIerofFHZYAb","version":"v0.65.0","type":"feature","title":"v0.65.0","summary":"All dry-run `--json` outputs now carry a uniform `dryRun: true` marker, and `--fields` projections mask `--json` output down to a dot-notation field list for token savings. `--page-all` streams list readers as NDJSON, and `--input` accepts raw JSON payloads for source mutations. Plus structured `--json` errors and a fix for streaming output hanging when piping to `head`.","titleGenerated":"Releases CLI v0.65.0 adds agent-friendly dry-run markers and field projections","titleShort":"Uniform dryRun marker; agent-friendly field projections, pagination","breaking":"none","importance":null,"content":"\n### Minor Changes\n\n- 5d70021: Agent-DX: uniform `dryRun: true` marker on every dry-run output, and `--dry-run` for the mutations that lacked it.\n  - Every `--json` dry-run payload now carries a uniform `dryRun: true` marker (via the new `markDryRun` helper in `src/lib/dry-run.ts`), additively — each command keeps its existing preview fields (`status: \"would-add\"`, `wouldUpdate`, `wouldRemove`, `wouldPost`, …). An agent can now detect \"this was a preview, not a write\" without per-command knowledge.\n  - Added `--dry-run` to the mutations that previously had none: `follow`/`unfollow`, `keys create`/`keys revoke`, `admin webhook add`/`edit`/`remove`/`test`/`rotate-secret`, and `admin onboard apply` (per-source would-action preview, no writes).\n  - `admin release delete --source` and `import` gained a `--json` dry-run body where they previously printed only text.\n\n- e806807: Agent-DX: `--fields` projection mask on the reader commands.\n\n  `--fields id,version,source.slug` post-filters `--json` output down to a comma-separated mask (dot-notation for nested keys), so an agent can pull exactly the leaves it needs and spend fewer tokens.\n  - Available on `get` (release/source/org/product), `search`, and `tail`/`latest`.\n  - It's a post-projection over whatever shape the reader produced, so it **composes with `--full`** (mask the full payload) and reuses the slim vocabulary by default — no new field names to learn.\n  - Dot-notation walks plain objects only (request an array-valued field like `media` whole). A field that resolves nowhere is dropped with one stderr warning; `--fields` without `--json` warns and is ignored, matching `--full`.\n  - Generic backend in `src/lib/fields.ts` (`projectFields`/`applyFieldMask`), reusable for future readers.\n\n- 292b1c8: Agent-DX: `--page-all` streams every page of a list reader as NDJSON.\n\n  `releases list --json --page-all` (and `org list` / `admin product list`) walks every page itself and emits one source/org/product per line as newline-delimited JSON, instead of returning a single `{ items, pagination }` page the caller has to paginate by hand.\n  - One agent command consumes a whole result set — no `--page`/`--limit` bookkeeping, no truncation warning to react to.\n  - NDJSON keeps memory flat and lets a consumer (`jq -c`, a stream parser) process rows as they arrive rather than buffering one giant array.\n  - `--json`-only, like `--full`/`--fields`: without `--json` it warns and falls through to the normal table. `--page-all` together with `--page` is rejected (they contradict). `--limit` still sets the per-request page size as a round-trip tuning knob.\n  - Shared backend in `src/lib/paginate.ts` (`streamAllPages`), reusable for future page-based readers.\n\n- 403738a: Agent-DX: raw JSON payloads for source mutations via `--input`.\n\n  `releases admin source create` and `releases admin source update` now accept a `--input <json>` body, so an agent can send the request shape directly instead of reverse-mapping it onto a dozen bespoke flags. Pass a literal JSON string, `@<path>` for a file, or `-` for stdin.\n  - The body maps to the **CLI input shape**, not the raw API — dedup, org-resolution, metadata-packing, and validation still run. `create --input` mirrors a `--batch` element (`name`/`url`/`type`/`org`/`metadataSet`/…); `update --input` maps to the update fields plus a convenience `metadata` object (each key set directly, a JSON `null` value deletes it).\n  - `--strict`/`--dry-run`/`--json` remain execution modifiers from the flags (the body never sets them). On `create`, `--input` is mutually exclusive with `--batch`.\n  - Invalid JSON and shape errors throw `CliError`, so they serialize to the structured `{ error }` payload under `--json`.\n\n### Patch Changes\n\n- 624370c: Agent-DX hardening: structured `--json` errors and input validation.\n  - When `--json` is set, thrown errors now emit a parseable `{ error: { kind, message, status?, method?, path?, field? } }` payload on stdout (with a non-zero exit) instead of an unstructured stderr dump. Without `--json`, known error types (API + invalid-input) print a clean one-line message rather than a stack trace.\n  - User-supplied identifiers are validated before any network call — control characters, `..` traversal, `%` percent-encoding, embedded `?`/`#`, whitespace, and backslashes are rejected at the entity resolvers (`findOrg`/`findProduct`/`findSource`/`getRelease`). `apiFetch` gains a control-character backstop, and file-reading flags reject `..` traversal.\n\n- c0c91f1: Fix: streaming output (`--page-all`, `tail -f --json`) now exits cleanly when a reader closes the pipe early (`… | head`).\n\n  Piping NDJSON streaming output into a consumer that closes stdout before EOF — e.g. `releases list --json --page-all | head` or `… | jq | head` — caused the CLI to hang indefinitely. On the early close the next stdout write raises EPIPE, which Bun surfaces as an `'error'` event (rather than crashing); with no handler, the writer was left awaiting a `'drain'` that can never fire. A startup `process.stdout.on(\"error\", …)` handler now treats a broken pipe as a clean `exit(0)`, so `| head` terminates immediately. Full consumption (to EOF, to a file, `| wc -l`) is unaffected.","publishedAt":"2026-06-24T00:39:18.000Z","fetchedAt":"2026-06-24T03:04:43.626Z","url":"https://github.com/buildinternet/releases-cli/releases/tag/v0.65.0","media":[],"coverageCount":0},{"id":"rel_NQ1vUyHiwOxCm2hefNf61","version":"v0.64.0","type":"feature","title":"v0.64.0","summary":"New user-facing `releases webhook` commands let users manage webhooks directly via CLI, including list, add, show, edit, remove, test, rotate-secret, and deliveries. Patch adds --product, --type, and --clear-* filter flags to webhook add and edit commands for per-event filtering.","titleGenerated":"Releases CLI v0.64.0 adds self-serve webhook management commands","titleShort":"Self-serve webhook list, add, edit, remove, test, rotate-secret, deliveries","breaking":"unknown","importance":null,"content":"\n### Minor Changes\n\n- f874edd: Add user-facing `releases webhook` commands for self-serve `/v1/me/webhooks`: `list`, `add`, `show`, `edit`, `remove`, `test`, `rotate-secret`, and `deliveries`. Requires `releases login` (or `RELEASES_API_KEY`). Supports org-scoped (`--org`, optional `--source`) and follows-scoped (`--scope follows`) subscriptions. `webhook verify` remains a local, no-auth signature check. Closes buildinternet/releases-cli#320.\n\n### Patch Changes\n\n- 1dfac19: Add `--product`, `--type`, and `--clear-*` filter flags to `releases webhook add` and `webhook edit`, matching per-event filters on `POST/PATCH /v1/me/webhooks`. Companion to buildinternet/releases#1683.","publishedAt":"2026-06-19T17:06:07.000Z","fetchedAt":"2026-06-19T18:04:57.624Z","url":"https://github.com/buildinternet/releases-cli/releases/tag/v0.64.0","media":[],"coverageCount":0},{"id":"rel_zHf0KXRHa-_q5rot87o0X","version":"v0.63.0","type":"feature","title":"v0.63.0","summary":"Bulk release delete and suppress are now available via `releases admin release` with multiple IDs or file input. Trace IDs are constrained to safe path segments, credential file ACLs are restricted on Windows, and transport errors include endpoint context. A one-line account nudge appears on the bare landing screen when no credential is configured.","titleGenerated":"Releases CLI v0.63.0 adds bulk release admin commands and hardens credential security","titleShort":"Bulk release delete/suppress; credential ACLs restricted on Windows","breaking":"unknown","importance":null,"content":"\n### Minor Changes\n\n- 767f32f: Add bulk release delete and suppress to `releases admin release`. Multiple positional `rel_…` IDs or `--file` (one ID per line, `-` for stdin) route through `DELETE /v1/releases/batch` and `POST /v1/releases/batch-suppress`; a single ID keeps the existing per-row endpoints. `scripts/bulk-suppress.ts` now uses the batch API grouped by reason instead of one HTTP call per release. Pairs with buildinternet/releases#1654.\n\n### Patch Changes\n\n- 728f826: Wrap `apiFetch` transport errors (DNS failure, connection refused, abort) with endpoint context. The thrown message now includes the HTTP verb and path (`API request failed on GET /v1/…: ECONNREFUSED`), matching the existing HTTP-error message shape. The original error is preserved via `cause`.\n- 728f826: Return `undefined` from `getMonthlySummary` on a GET 404 instead of throwing `TypeError: Cannot read properties of null`. The function's declared return type is `Promise<ReleaseSummary | undefined>`; the null guard (`rows?.[0]`) now honors that contract.\n- 88192e9: Show a one-line account nudge (\"Create a free account for personalized feeds and higher rate limits — run `releases login`\") on the bare `releases` landing screen when no credential is configured. TTY-only and self-resolving once signed in, mirroring the completion notice.\n- 728f826: Constrain API-derived trace IDs (`session.sessionId`, workflow `instanceId`) to a single safe path segment before writing trace files, so a malicious or tampered API response can't traverse out of the trace directory (`../`, separators, absolute paths). Fails closed: an unusable id throws rather than writing to an unexpected location.\n- 61afcc3: Internal refactor: split `src/api/client.ts` into per-domain modules (admin, collections, follows, orgs, products, releases, sources, webhooks) behind a re-export barrel. No user-visible changes.\n- 728f826: Restrict credential file ACLs on Windows using `icacls` after write so the token file is readable only by the current user. Soft-fails silently if `icacls` is unavailable, leaving login functional. Unix behavior unchanged.","publishedAt":"2026-06-19T01:01:17.000Z","fetchedAt":"2026-06-19T03:05:18.339Z","url":"https://github.com/buildinternet/releases-cli/releases/tag/v0.63.0","media":[],"coverageCount":0},{"id":"rel_kstoQtvXpQd3pIiu-KqYE","version":"v0.62.1","type":"feature","title":"v0.62.1","summary":"Fixed releases admin source fetch to no longer silently drop a source identifier when combined with --org, matching the behavior of releases latest. Releases import now dedups org accounts on the exact (platform, handle) pair instead of platform alone. Added releases admin source show to inspect a single source's config.","titleGenerated":"CLI v0.62.1 fixes releases admin source fetch and import deduping","titleShort":"Admin source fetch and import deduping fixed","breaking":"unknown","importance":null,"content":"\n### Patch Changes\n\n- 09aec58: `releases admin source fetch` no longer silently drops a source identifier when combined with `--org` (#307). Previously `source fetch <identifier> --org <org>` ignored the identifier and dispatched a managed-agent session over every active source in the org; it now errors out on the conflict, matching `releases latest`'s `--product`/`--org` rejection. Passing both the positional identifier and `--source` is also rejected instead of silently preferring the positional. The `--org` fan-out additionally skips push-only `agent` sources — they have no fetch adapter, so dispatching a session over one was a wasted no-op — and reports how many were skipped.\n- ec76928: `releases import` now dedups org accounts on the exact `(platform, handle)` pair instead of platform alone (#283). `org_accounts` is one-to-many — the server's unique index is on the pair — so an org can hold a second handle on a platform it's already linked to (e.g. Cloudflare's `x/Cloudflare` plus `x/cfchangelog`). Previously, importing a manifest that added a second handle on an already-linked platform was silently skipped, logging \"already linked\" for a handle that was never linked. The import now fetches the org's full account list and links any pair it doesn't already hold; an exact already-linked pair still reports \"already linked\" and is not re-created. The `--dry-run` preview mirrors the same dedup so it no longer over-reports accounts it would link.\n- 4c3f42f: Add `releases admin source show <src_…|org/slug|slug>` (alias `get`) to inspect a single source's config — type, fetch method, priority/paused state, last-fetch, and the metadata flags operators care about (render/crawl, feed URL, parse instructions, etc.). `--json` returns the source with parsed metadata instead of the raw JSON-in-JSON string. Previously the only way to read a source's config was to dump the whole org and filter the `sources` array by hand (#295).\n\n  Fix `source update <src_…> --json`: the JSON-refresh step re-resolved the source by its bare slug, so updating a source whose slug collides across orgs (e.g. `release-notes`) threw `AmbiguousSourceError` _after_ the update had already applied — even though the source was addressed by an unambiguous `src_…` id. The refresh now resolves through the typed id (#294).","publishedAt":"2026-06-12T01:00:20.000Z","fetchedAt":"2026-06-12T01:05:00.407Z","url":"https://github.com/buildinternet/releases-cli/releases/tag/v0.62.1","media":[],"coverageCount":0},{"id":"rel_SXuPJ4F_Nr3weyPgNIFfC","version":"v0.62.0","type":"feature","title":"v0.62.0","summary":"The release reader ergonomics for get, latest/tail, and list commands have been improved. The README has been trimmed to a leaner npm landing page.","titleGenerated":"Releases CLI v0.62.0 improves release reader ergonomics and trims README","titleShort":"Release reader ergonomics improved; README trimmed","breaking":"unknown","importance":null,"content":"\n### Minor Changes\n\n- ca636fa: Improve the release-reader ergonomics for `get`, `latest`/`tail`, and `list` (#303, #304):\n  - `get <id> --json` now surfaces `media[]` (with the R2-mirrored `r2Url`) when a release has media, plus a `contentTruncated: true` hint so callers know the body was projected to an excerpt and `--full` exists. Previously the slim shape dropped media entirely with no signal it existed, forcing a round-trip to `--full` or the raw API to verify media presence. `--full` is unchanged.\n  - `latest`/`tail` gain `--limit` (an alias for the existing `--count`) so the absence of `--limit` — which works on other commands — no longer errors with \"unknown option\". Both clamp to the server's `[1, 100]` window, and a one-shot listing that fills the requested window now prints a truncation hint to stderr (raise `--limit`, narrow with `--since`/`--until`/`--source`/`--org`, or for `--product` feeds, page with the surfaced `--cursor`).\n  - `latest --product` is cursor-paginated; a new `--cursor` flag pages through it deterministically (the global latest feed has no cursor — it is count-capped — so `--cursor` errors there).\n  - `releases list` now shows a `Releases` per-source count column in the text table, so \"how many releases does this source have?\" is answerable without dropping to `--json` (which already carried `releaseCount`) or the raw API.\n\n### Patch Changes\n\n- e045fe0: Trim the README to a leaner npm landing page (291 → ~130 lines): merge the install paths, condense the shell-completion and output-format prose into pointers to `--help`, drop the closed-beta admin-triage detail, and consolidate the auth sections. Reframe sign-in messaging around its present-day value — following orgs/products and a personalized feed — with read-only keys explicitly non-write/non-admin (and a path to higher rate limits), rather than leading with the closed-beta write/admin caveat.","publishedAt":"2026-06-09T18:05:07.000Z","fetchedAt":"2026-06-11T19:52:26.941Z","url":"https://github.com/buildinternet/releases-cli/releases/tag/v0.62.0","media":[],"coverageCount":0},{"id":"rel_j3H7xs7BWVXE6VG9YadW-","version":"v0.61.0","type":"feature","title":"v0.61.0","summary":"New commands allow users to follow organizations and products to personalize their release feed timeline. Also added `releases source fetch --dry-run` to probe a single source without writing to D1 or dispatching the managed agent.","titleGenerated":"Releases CLI v0.61.0 adds personalized follows and feed timeline","titleShort":"Personalized follows and feed timeline added","breaking":"unknown","importance":null,"content":"\n### Minor Changes\n\n- 695039d: Add personalized follows + feed verbs: `releases follow <org|product>`, `releases unfollow <org|product>`, `releases following` (list), and `releases feed` (your personalized release timeline). They act on the signed-in user's account via the API's `/v1/me/*` routes — sign in with `releases login` (or set `RELEASES_API_KEY`) first. `follow`/`unfollow` accept an org slug, an `org/product` coordinate, or an `org_…`/`prod_…` id; `feed` reuses the same renderer as `releases tail` and is page-paginated (`--page` / `--limit`, `--json`). Requires `@buildinternet/releases-api-types` ≥ 0.32.0 for the follows wire types.\n- de9ce26: Add `releases source fetch <source> --dry-run`: probe a single source without writing to D1 or dispatching (billing) the managed agent. For a client-rendered scrape source (`crawlEnabled`/`renderRequired`) it renders the index once via Browser Rendering and reports how many candidate release links were found — the cheap \"can the steady-state cron render actually see releases here, or is it hitting an empty JS shell?\" check that onboarding previously had no way to answer. For a feed/GitHub source it reports candidate releases parsed. Single source only; `--json` supported.","publishedAt":"2026-06-09T13:07:53.000Z","fetchedAt":"2026-06-11T19:52:26.941Z","url":"https://github.com/buildinternet/releases-cli/releases/tag/v0.61.0","media":[],"coverageCount":0},{"id":"rel_Bumq0fr2VYA2mnzor-2Fa","version":"v0.60.0","type":"feature","title":"v0.60.0","summary":"Adds `releases admin webhook` commands for managing outbound webhook subscriptions, wrapping the `/v1/webhooks` API routes. Renames local stdio MCP server tools to mirror hosted server names: `search_releases` to `search`, and `list_sources` + `list_products` to `list_catalog`.","titleGenerated":"Releases CLI v0.60.0 adds admin webhook commands and renames MCP tools","titleShort":"Admin webhook commands added; MCP tools renamed","breaking":"unknown","importance":null,"content":"\n### Minor Changes\n\n- 5d191ea: Add `releases admin webhook` commands for managing outbound webhook subscriptions: `add`, `list`, `show`, `edit`, `remove`, `test`, `rotate-secret`, and `deliveries`. These wrap the existing root-key-gated `/v1/webhooks` API routes so Phase-A operators can manage subscriptions without raw API calls.\n\n  The subscriber-facing `webhook verify` (local signature check, no auth) moves from `admin webhook verify` to top-level `webhook verify`.\n\n- 313ffb0: Rename the local stdio MCP server's tools (`releases admin mcp serve`) to mirror the canonical names served by the hosted server at `mcp.releases.sh`: `search_releases` → `search` (now returns the full unified result — orgs, catalog, and releases — with an optional `type` section filter), `list_sources` + `list_products` → `list_catalog` (org-scoped via `GET /v1/orgs/:slug/catalog`; global path folds products + standalone sources), and `get_product` → `get_catalog_entry` (dispatches product vs. source on the identifier prefix). `get_source` / `get_source_changelog` are unchanged.","publishedAt":"2026-06-09T00:35:52.000Z","fetchedAt":"2026-06-11T19:52:26.941Z","url":"https://github.com/buildinternet/releases-cli/releases/tag/v0.60.0","media":[],"coverageCount":0}],"pagination":{"nextCursor":"2026-06-09T00:35:52.000Z|2026-06-11T19:52:26.941Z|rel_Bumq0fr2VYA2mnzor-2Fa","limit":20},"summaries":{"rolling":null,"monthly":[]}}