From 15fcb634cdbe851efc64c4604219f84d5f5fad03 Mon Sep 17 00:00:00 2001 From: 0thernet <894119+0thernet@users.noreply.github.com> Date: Mon, 28 Sep 2026 07:33:35 -0400 Subject: [PATCH] Release Ghostget 0.18.45 Release 0.18.45: version pins, the ## 0.18.45 changelog section, rebuilt dist (only the version chunk renamed), and a remeasured archive over merged main 2ed33bb. Carries #447 (packaged type sources compile under strict consumer flags: the last constructor parameter property is an explicit field, the persistent-helper environment keeps NODE_ENV literal for narrowed ProcessEnv unions, request bodies omit explicit undefined, and the package smoke now typechecks the public entrypoints under erasableSyntaxOnly + exactOptionalPropertyTypes) and the earlier Wordcell 0.24.0 adoption. @hraness/local-custody is pinned to the released 0.9.1 tarball. Archive measurement (after bun run build, npm 11.19.0 pack --ignore-scripts, Node 24.18.1, darwin arm64): 618 entries, 12,125,761 packed / 23,940,938 unpacked bytes, SHA-256 0d6a1de00fd825d700b1ed0505b6fa34992f11d1deb42a5c255f7cfc295eedbc. Budgets keep the same projections and allowances: 12,142,244 packed, 23,941,356 unpacked, 24,574,976 tar bytes. --- CHANGELOG.md | 6 ++++++ README.md | 10 +++++----- dist/apple-photos-client.js | 2 +- dist/beeper-client.js | 2 +- dist/{index-p8gqwqtd.js => index-4sy438tg.js} | 2 +- docs/contracts.md | 4 ++-- docs/microsoft-graph-qualification.md | 2 +- docs/publishing.md | 4 ++-- package.json | 2 +- scripts/npm-release-workflow.test.ts | 19 ++++++++++--------- scripts/package-budget.ts | 19 +++++++++++++++---- skills/ghostget/references/install.md | 10 +++++----- skills/ghostget/references/microsoft-graph.md | 2 +- src/beeper-client-types.ts | 2 +- src/cli.ts | 2 +- src/contracts-check.test.ts | 2 +- src/contracts.test-support.ts | 2 +- src/media/manifest.test.ts | 2 +- src/version.ts | 2 +- website/build.ts | 2 +- 20 files changed, 58 insertions(+), 40 deletions(-) rename dist/{index-p8gqwqtd.js => index-4sy438tg.js} (62%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0274e44b..1bf307cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ Historical entries retain their original delivery coordinates. ## Unreleased +## 0.18.45 + +This release keeps the shipped type sources compiling under a consumer's +strict compiler flags and moves the knowledge-base runtime to the +immutable Wordcell release. + - The packaged type sources compile again under a consumer's strict compiler flags. Consumers that set `erasableSyntaxOnly` and narrow `ProcessEnv.NODE_ENV` to its literal union, as Next.js does, can now diff --git a/README.md b/README.md index 57f4f8d6..441ad248 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ Install [Bun 1.3.14](https://bun.sh/docs/installation) if needed, then install Ghostget and read a public page: ```sh -bun add --global https://github.com/hraness/ghostget/releases/download/v0.18.44/hraness-ghostget-0.18.44.tgz +bun add --global https://github.com/hraness/ghostget/releases/download/v0.18.45/hraness-ghostget-0.18.45.tgz ghostget read https://example.com ``` @@ -49,9 +49,9 @@ which always names the latest published release. Upgrading from Wrench? Read the The optional Agent Skill teaches your agent when and how to use Ghostget: ```sh -npx skills add hraness/ghostget#v0.18.44 +npx skills add hraness/ghostget#v0.18.45 # With Bun instead: -bunx skills add hraness/ghostget#v0.18.44 +bunx skills add hraness/ghostget#v0.18.45 ``` Start a new agent session, then ask: “Use Ghostget to read https://example.com @@ -150,7 +150,7 @@ firewall. ## Built-in provider catalog -This v0.18.44 source tree supports executable actions for 21 services: Beeper, +This v0.18.45 source tree supports executable actions for 21 services: Beeper, Bluesky, ClasificadosOnline, Facebook, Facebook Groups, Facebook Marketplace, GitHub, Gmail, Hacker News, Instagram, iMessage, LinkedIn, Reddit, Substack, Threads, TikTok, Twitch, WebMCP Registry, WhatsApp, X, and YouTube. LinkedIn @@ -234,7 +234,7 @@ For that same released coordinate, install Ghostget in an agent or application that owns its own model, planning, tool loop, approvals, and interface: ```sh -bun add https://github.com/hraness/ghostget/releases/download/v0.18.44/hraness-ghostget-0.18.44.tgz +bun add https://github.com/hraness/ghostget/releases/download/v0.18.45/hraness-ghostget-0.18.45.tgz ``` ```ts diff --git a/dist/apple-photos-client.js b/dist/apple-photos-client.js index 0a95ddf0..e1327b13 100644 --- a/dist/apple-photos-client.js +++ b/dist/apple-photos-client.js @@ -1,7 +1,7 @@ // @bun import { GHOSTGET_VERSION -} from "./index-p8gqwqtd.js"; +} from "./index-4sy438tg.js"; import { canonicalJson, sha256 diff --git a/dist/beeper-client.js b/dist/beeper-client.js index 7fea42c0..3d615ef0 100644 --- a/dist/beeper-client.js +++ b/dist/beeper-client.js @@ -4,7 +4,7 @@ import { } from "./index-26yq8q16.js"; import { GHOSTGET_VERSION -} from "./index-p8gqwqtd.js"; +} from "./index-4sy438tg.js"; import { canonicalJson, canonicalJsonSha256Matches, diff --git a/dist/index-p8gqwqtd.js b/dist/index-4sy438tg.js similarity index 62% rename from dist/index-p8gqwqtd.js rename to dist/index-4sy438tg.js index 73301d3e..b51a001f 100644 --- a/dist/index-p8gqwqtd.js +++ b/dist/index-4sy438tg.js @@ -1,5 +1,5 @@ // @bun // src/version.ts -var GHOSTGET_VERSION = "0.18.44"; +var GHOSTGET_VERSION = "0.18.45"; export { GHOSTGET_VERSION }; diff --git a/docs/contracts.md b/docs/contracts.md index 44bc6399..58ca9e67 100644 --- a/docs/contracts.md +++ b/docs/contracts.md @@ -128,7 +128,7 @@ matches some IDs lists the installed ones and exits 0. { "ok": true, "contract": "ghostget.contract-catalog.v1", - "ghostget": { "version": "0.18.44" }, + "ghostget": { "version": "0.18.45" }, "generatedAt": "2026-09-21T20:00:00.000Z", "vocabulary": { "risks": ["R1", "R2", "R3", "R4"], @@ -186,7 +186,7 @@ does not parse is an error (exit 3) and no catalog is read. { "ok": false, "contract": "ghostget.contract-check.v1", - "ghostget": { "version": "0.18.44" }, + "ghostget": { "version": "0.18.45" }, "plan": { "collectionKey": "hraness-social-profile-statistics", "reads": 15 }, "reads": [ { "index": 0, "accountKey": "x-hraness", "adapter": "x-web", "operation": "profiles.read", diff --git a/docs/microsoft-graph-qualification.md b/docs/microsoft-graph-qualification.md index c7903181..385f4d02 100644 --- a/docs/microsoft-graph-qualification.md +++ b/docs/microsoft-graph-qualification.md @@ -1,7 +1,7 @@ # Microsoft Graph activation evidence The Microsoft Graph plugin ships as a disabled candidate starting with -0.18.44. Source, parser, HTTP-fixture, +0.18.45. Source, parser, HTTP-fixture, package, and registry tests can admit the artifact without activating it. Neither operation may be marked `observed` from those tests alone. diff --git a/docs/publishing.md b/docs/publishing.md index b6f045a9..5c17d2a6 100644 --- a/docs/publishing.md +++ b/docs/publishing.md @@ -222,12 +222,12 @@ delivery proceeds through a new source-qualified version. ## Install the canonical release -These commands require the matching published immutable v0.18.44 release. +These commands require the matching published immutable v0.18.45 release. For the CLI: ```sh -bun add --global https://github.com/hraness/ghostget/releases/download/v0.18.44/hraness-ghostget-0.18.44.tgz +bun add --global https://github.com/hraness/ghostget/releases/download/v0.18.45/hraness-ghostget-0.18.45.tgz ghostget --version ghostget doctor --json ``` diff --git a/package.json b/package.json index e109d66c..b3c8cf34 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hraness/ghostget", - "version": "0.18.44", + "version": "0.18.45", "description": "Ghostget gives your AI agent named web actions: read a page, archive one media item, or use a connected account, without credentials or a browser to steer.", "license": "MIT", "type": "module", diff --git a/scripts/npm-release-workflow.test.ts b/scripts/npm-release-workflow.test.ts index 18c13bb0..68129819 100644 --- a/scripts/npm-release-workflow.test.ts +++ b/scripts/npm-release-workflow.test.ts @@ -1220,7 +1220,7 @@ describe("npm publication contract", () => { (MAX_UNPACKED_BYTES + MAX_PACKED_ENTRIES * 1_023 + 1_024) / 512, ) * 512, ); - expect(MAX_PACKAGE_TAR_BYTES).toBe(24_574_464); + expect(MAX_PACKAGE_TAR_BYTES).toBe(24_574_976); expect(MAX_PACKAGE_TAR_BYTES % 512).toBe(0); expect(artifact).toContain("maxOutputLength: MAX_PACKAGE_TAR_BYTES"); expect(artifact).not.toContain("const maximumTarBytes"); @@ -1425,10 +1425,11 @@ describe("npm publication contract", () => { expect(budget).toContain("00ead58f3e0268855e0face59da2460faa723c68c18e19542c37fd891cd4431f"); expect(budget).toContain("81b82626d55fcc0ef960ac59c3dfc0e90ed6417756d614b00796d5c4122b5072"); expect(budget).toContain("d5681ab13f0bc005bcd4bbf4b18152de887c062e7e8be3d0ecc28f14e11177d5"); + expect(budget).toContain("0d6a1de00fd825d700b1ed0505b6fa34992f11d1deb42a5c255f7cfc295eedbc"); expect(Object.isFrozen(repairPackageMeasurement)).toBeTrue(); expect(repairPackageMeasurement).toMatchObject({ - archiveSha256: "d5681ab13f0bc005bcd4bbf4b18152de887c062e7e8be3d0ecc28f14e11177d5", - packedBytes: 12_125_748, unpackedBytes: 23_940_758, entryCount: 618, + archiveSha256: "0d6a1de00fd825d700b1ed0505b6fa34992f11d1deb42a5c255f7cfc295eedbc", + packedBytes: 12_125_761, unpackedBytes: 23_940_938, entryCount: 618, packedPlatformProjection: 12_387, packedPortabilityAllowance: 4_096, payloadPlatformProjection: 353, payloadAllowance: 65, }); @@ -1438,8 +1439,8 @@ describe("npm publication contract", () => { expect(budget).toContain("12,141,169 packed; 23,937,025 + 353 + 65 = 23,937,443 unpacked"); expect(budget).toContain("23,930,250 + 353 + 65 = 23,930,668 unpacked"); expect(budget).toContain("12,141,373 packed; 23,937,545 + 353 + 65 = 23,937,963 unpacked"); - expect(MAX_PACKED_BYTES).toBe(12_142_231); - expect(MAX_PACKED_BYTES).toBe(12_125_748 + 12_387 + 4_096); + expect(MAX_PACKED_BYTES).toBe(12_142_244); + expect(MAX_PACKED_BYTES).toBe(12_125_761 + 12_387 + 4_096); expect(budget).toContain("aa127b3193c9bb3b0cb5deece5927be60ccb7111a50169320d322ffdeaa13f39"); expect(budget).toContain("0c331bab3ab3df69a108e18f5f29845b0db90c281cbd6455c0d90fa0b24081e2"); expect(budget).toContain("873cad8139fda303e2d19c6afd61cf549cf9b4d1d76b2a1d6d632a6afe6bd0d1"); @@ -1560,7 +1561,7 @@ describe("npm publication contract", () => { expect(budget).toContain("47684b3e2eb5cf3ed07fbb520aade8c7251d993f75262fbf1af627d9081a1a5f"); expect(budget).toContain("23,688,277 + 353 + 65 = 23,688,695"); expect(budget).toContain("23,759,283 + 353 + 65 = 23,759,701"); - expect(MAX_UNPACKED_BYTES).toBe(23_941_176); + expect(MAX_UNPACKED_BYTES).toBe(23_941_356); expect(budget).toContain("23,037,873 + 65 = 23,037,938"); expect(budget).toContain("f9f3ab38a682690ceaa2699a7309997512030f0fa500a9dc29dcd108123dc41f"); expect(budget).toContain("23,038,557 + 65 = 23,038,622"); @@ -1593,7 +1594,7 @@ describe("npm publication contract", () => { expect(budget).toContain("01875f12ab73a49d6c7d6bf520dc3d318db816addee2fa7981889f35c958cf7c"); expect(budget).toContain("b12909f08f7c19460ced56e30619f4860a1183f4b0106170c07837dae577a937"); expect(budget).toContain("0b212ac291218528dcf979370110a36f10850e046ca90a536057d9a44e807d1d"); - expect(MAX_UNPACKED_BYTES).toBe(23_940_758 + 353 + 65); + expect(MAX_UNPACKED_BYTES).toBe(23_940_938 + 353 + 65); expect(budget).toContain("22,794,052 + 65 = 22,794,117"); expect(budget).toContain("c482efe748f880e3717727d6d39fd92a68953e6eea766642b329ba47ae772d80"); expect(budget).toContain("22,759,423 + 65 = 22,759,488"); @@ -1629,8 +1630,8 @@ describe("npm publication contract", () => { expect(packageArtifactBudget).toEqual({ entryCount: { min: 618, max: 618 }, fileCount: { min: 618, max: 618 }, - packedBytes: { min: 1_600_000, max: 12_142_231 }, - unpackedBytes: { min: 9_000_000, max: 23_941_176 }, + packedBytes: { min: 1_600_000, max: 12_142_244 }, + unpackedBytes: { min: 9_000_000, max: 23_941_356 }, }); }); diff --git a/scripts/package-budget.ts b/scripts/package-budget.ts index ecbce43b..9f0f3476 100644 --- a/scripts/package-budget.ts +++ b/scripts/package-budget.ts @@ -2083,14 +2083,25 @@ // Retain the same platform projections and allowances: // 12,125,748 + 12,387 + 4,096 = 12,142,231 packed; // 23,940,758 + 353 + 65 = 23,941,176 unpacked. +// +// The 0.18.45 release bumps the version pins, adds its changelog section +// over merged main 2ed33bb, and rebuilds the version chunk; no other +// source or adapter file changes. After `bun run build`, a clean +// npm 11.19.0 pack --ignore-scripts with Node 24.18.1 on darwin arm64 +// measured 618 entries, 12,125,761 packed bytes, and 23,940,938 +// unpacked bytes; archive SHA-256 +// 0d6a1de00fd825d700b1ed0505b6fa34992f11d1deb42a5c255f7cfc295eedbc. +// Retain the same platform projections and allowances: +// 12,125,761 + 12,387 + 4,096 = 12,142,244 packed; +// 23,940,938 + 353 + 65 = 23,941,356 unpacked. export const repairPackageMeasurement = Object.freeze({ - scope: "erasableSyntaxOnly packaged-source compatibility and @hraness/local-custody 0.9.1 pin", + scope: "Ghostget 0.18.45 release over merged main 2ed33bb", command: "npm pack --ignore-scripts", npmVersion: "11.19.0", platform: "darwin-arm64", - archiveSha256: "d5681ab13f0bc005bcd4bbf4b18152de887c062e7e8be3d0ecc28f14e11177d5", - packedBytes: 12_125_748, - unpackedBytes: 23_940_758, + archiveSha256: "0d6a1de00fd825d700b1ed0505b6fa34992f11d1deb42a5c255f7cfc295eedbc", + packedBytes: 12_125_761, + unpackedBytes: 23_940_938, entryCount: 618, packedPlatformProjection: 12_387, packedPortabilityAllowance: 4_096, diff --git a/skills/ghostget/references/install.md b/skills/ghostget/references/install.md index 27ffb104..156ff6d1 100644 --- a/skills/ghostget/references/install.md +++ b/skills/ghostget/references/install.md @@ -17,14 +17,14 @@ If Bun is missing, stop and direct the user to the official [Bun installation guide](https://bun.sh/docs/installation). Do not switch package managers or pipe an unreviewed installer into a shell. -This reference is authored for the exact v0.18.44 release coordinate. Use it +This reference is authored for the exact v0.18.45 release coordinate. Use it only from the matching release-bound Agent Skill after its canonical archive and immutable GitHub Release exist. If the coordinate is not public, stop instead of substituting `main`, another tag, or a different package version. Install that exact release and verify a public-page read: ```sh -bun add --global https://github.com/hraness/ghostget/releases/download/v0.18.44/hraness-ghostget-0.18.44.tgz +bun add --global https://github.com/hraness/ghostget/releases/download/v0.18.45/hraness-ghostget-0.18.45.tgz ghostget read https://example.com ``` @@ -47,21 +47,21 @@ for the requested workflow; an unconnected provider or missing media tool does not prevent a public-page read, and overall provider readiness can be false on a fresh installation. -The package is `@hraness/ghostget`; `@hraness/ghostget@0.18.44` is an optional npm +The package is `@hraness/ghostget`; `@hraness/ghostget@0.18.45` is an optional npm mirror only after verified registry publication. Canonical installation does not wait for registry publication. When upgrading from Wrench, use `ghostget` for new commands and `GHOSTGET_STATE_HOME` for an explicit state root. Existing state is selected in place; do not rename, copy, or delete a state directory as part of the upgrade. -The [migration guide](https://github.com/hraness/ghostget/blob/v0.18.44/docs/ghostget-migration.md) +The [migration guide](https://github.com/hraness/ghostget/blob/v0.18.45/docs/ghostget-migration.md) explains the retained state aliases and durable protocol names. Do not clone the repository merely to run the CLI. Importing the SDK is a separate project dependency and does not install a global command: ```sh -bun add https://github.com/hraness/ghostget/releases/download/v0.18.44/hraness-ghostget-0.18.44.tgz +bun add https://github.com/hraness/ghostget/releases/download/v0.18.45/hraness-ghostget-0.18.45.tgz ``` `ghostget adapter sync-bundled` upgrades exact bundled baselines, including an diff --git a/skills/ghostget/references/microsoft-graph.md b/skills/ghostget/references/microsoft-graph.md index 32295a39..a40e63c6 100644 --- a/skills/ghostget/references/microsoft-graph.md +++ b/skills/ghostget/references/microsoft-graph.md @@ -1,6 +1,6 @@ # Microsoft Graph contacts and calendar -This disabled candidate ships starting with 0.18.44. +This disabled candidate ships starting with 0.18.45. The `microsoft-graph-official` plugin reserves two read operations. Both are `capture-required`: Ghostget rejects them before reading credentials or making a network request. The implementation has synthetic tests; an authorized diff --git a/src/beeper-client-types.ts b/src/beeper-client-types.ts index ed3df7a8..0521bf96 100644 --- a/src/beeper-client-types.ts +++ b/src/beeper-client-types.ts @@ -96,7 +96,7 @@ export type BeeperContactInteractionExportReceipt = Readonly<{ implementation: Readonly<{ producer: Readonly<{ package: "@hraness/ghostget"; - version: "0.18.44"; + version: "0.18.45"; }>; officialCli: Readonly<{ implementation: "github.com/beeper/cli"; diff --git a/src/cli.ts b/src/cli.ts index 5783290e..b47f0f6b 100755 --- a/src/cli.ts +++ b/src/cli.ts @@ -114,7 +114,7 @@ export function isImmediateGhostgetVersionRequest( && (second === undefined || second === "--json"); } -/** `ghostget 0.18.44`, or `{"name":"ghostget","version":"0.18.44"}` with `--json`. */ +/** `ghostget 0.18.45`, or `{"name":"ghostget","version":"0.18.45"}` with `--json`. */ export function ghostgetVersionText(rawArguments: readonly string[]): string { return rawArguments.includes("--json") ? `${JSON.stringify({ name: "ghostget", version: GHOSTGET_VERSION })}\n` diff --git a/src/contracts-check.test.ts b/src/contracts-check.test.ts index 4974485b..2162d107 100644 --- a/src/contracts-check.test.ts +++ b/src/contracts-check.test.ts @@ -35,7 +35,7 @@ describe("checkCollectionPlan", () => { const check = checkCollectionPlan(examplePlan(), exampleCatalog()); expect(check.ok).toBeTrue(); expect(check.contract).toBe("ghostget.contract-check.v1"); - expect(check.ghostget).toEqual({ version: "0.18.44" }); + expect(check.ghostget).toEqual({ version: "0.18.45" }); expect(check.plan).toEqual({ collectionKey: "example-social-statistics", reads: 3 }); expect(check.reads[0]).toEqual({ index: 0, diff --git a/src/contracts.test-support.ts b/src/contracts.test-support.ts index 05cfa5b8..2f549030 100644 --- a/src/contracts.test-support.ts +++ b/src/contracts.test-support.ts @@ -95,7 +95,7 @@ export function exampleCatalog(): ContractCatalogV1 { return { ok: true, contract: CONTRACT_CATALOG_V1, - ghostget: { version: "0.18.44" }, + ghostget: { version: "0.18.45" }, generatedAt: "2026-09-21T20:00:00.000Z", vocabulary: catalogVocabularyValue, adapters: [ diff --git a/src/media/manifest.test.ts b/src/media/manifest.test.ts index 3a88b9f7..b300ea01 100644 --- a/src/media/manifest.test.ts +++ b/src/media/manifest.test.ts @@ -465,7 +465,7 @@ function trackedYtDlpManifest( describe("Ghostget media manifest", () => { test("uses one Ghostget-owned schema and transcriber identity", () => { expect(GHOSTGET_MEDIA_SCHEMA_VERSION).toBe(1); - expect(GHOSTGET_MEDIA_VERSION).toBe("0.18.44"); + expect(GHOSTGET_MEDIA_VERSION).toBe("0.18.45"); expect(localTranscriptVariantSegments(localIdentity)).toEqual([ "transcript", "local", diff --git a/src/version.ts b/src/version.ts index 034b5d31..81fec6b6 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1,2 +1,2 @@ /** Canonical immutable Ghostget package release identity. */ -export const GHOSTGET_VERSION = "0.18.44" as const; +export const GHOSTGET_VERSION = "0.18.45" as const; diff --git a/website/build.ts b/website/build.ts index 52fd6b3a..8c6551e3 100644 --- a/website/build.ts +++ b/website/build.ts @@ -107,7 +107,7 @@ export const PUBLISHER_URL = "https://github.com/hraness" as const; export const HRANESS_URL = "https://hraness.com/" as const; export const HRANESS_ORGANIZATION_ID = `${HRANESS_URL}#organization` as const; export const SKILL_REPOSITORY = "hraness/ghostget" as const; -export const CONTENT_REVIEWED_RELEASE = "v0.18.44" as const; +export const CONTENT_REVIEWED_RELEASE = "v0.18.45" as const; export const DEFAULT_POSTHOG_HOST = "https://us.i.posthog.com" as const; export const DEMO_PUBLIC_FILES = [ "wrench-first-capture.gif",