From 9ec29c165d5e511587d59a6b731da3740b37d650 Mon Sep 17 00:00:00 2001 From: 0thernet Date: Wed, 30 Sep 2026 22:55:43 -0400 Subject: [PATCH] Prepare GhostGet 0.18.64 studio release retry --- CHANGELOG.md | 6 ++++++ README.md | 10 +++++----- dist/apple-photos-client.js | 2 +- dist/beeper-client.js | 2 +- dist/{index-adtr3kqc.js => index-rayqxqrk.js} | 2 +- docs/contracts.md | 4 ++-- docs/publishing.md | 4 ++-- kb/launch/social-kit.md | 14 +++++++------- package.json | 2 +- scripts/npm-release-workflow.test.ts | 16 ++++++++-------- scripts/package-budget.ts | 14 ++++++++++---- skills/ghostget/references/install.md | 10 +++++----- 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 +- 19 files changed, 56 insertions(+), 44 deletions(-) rename dist/{index-adtr3kqc.js => index-rayqxqrk.js} (62%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 87c77b28..688fa865 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,8 +7,14 @@ Historical entries retain their original delivery coordinates. ## Unreleased +## 0.18.64 + +Publish the studio design update with a lightweight tag. + ## 0.18.63 +Annotated tag rejected before publication; tag unchanged. + Present GhostGet with the shared studio design conventions. - Group related studio tools by purpose, shorten the opening copy, and keep installation within reach. diff --git a/README.md b/README.md index 652a69b0..53de8d9d 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.63/hraness-ghostget-0.18.63.tgz +bun add --global https://github.com/hraness/ghostget/releases/download/v0.18.64/hraness-ghostget-0.18.64.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.63 +npx skills add hraness/ghostget#v0.18.64 # With Bun instead: -bunx skills add hraness/ghostget#v0.18.63 +bunx skills add hraness/ghostget#v0.18.64 ``` Start a new agent session, then ask: “Use GhostGet to read https://example.com @@ -164,7 +164,7 @@ firewall. ## Built-in provider catalog -This v0.18.63 source tree supports executable actions for 21 services: Beeper, +This v0.18.64 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 @@ -248,7 +248,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.63/hraness-ghostget-0.18.63.tgz +bun add https://github.com/hraness/ghostget/releases/download/v0.18.64/hraness-ghostget-0.18.64.tgz ``` ```ts diff --git a/dist/apple-photos-client.js b/dist/apple-photos-client.js index 6cddcb34..285d306b 100644 --- a/dist/apple-photos-client.js +++ b/dist/apple-photos-client.js @@ -1,7 +1,7 @@ // @bun import { GHOSTGET_VERSION -} from "./index-adtr3kqc.js"; +} from "./index-rayqxqrk.js"; import { canonicalJson, sha256 diff --git a/dist/beeper-client.js b/dist/beeper-client.js index bcd2815e..9ffb8b60 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-adtr3kqc.js"; +} from "./index-rayqxqrk.js"; import { canonicalJson, canonicalJsonSha256Matches, diff --git a/dist/index-adtr3kqc.js b/dist/index-rayqxqrk.js similarity index 62% rename from dist/index-adtr3kqc.js rename to dist/index-rayqxqrk.js index 4d27f729..c96cb4a8 100644 --- a/dist/index-adtr3kqc.js +++ b/dist/index-rayqxqrk.js @@ -1,5 +1,5 @@ // @bun // src/version.ts -var GHOSTGET_VERSION = "0.18.63"; +var GHOSTGET_VERSION = "0.18.64"; export { GHOSTGET_VERSION }; diff --git a/docs/contracts.md b/docs/contracts.md index 5005bbb3..48bd1fa0 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.63" }, + "ghostget": { "version": "0.18.64" }, "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.63" }, + "ghostget": { "version": "0.18.64" }, "plan": { "collectionKey": "hraness-social-profile-statistics", "reads": 15 }, "reads": [ { "index": 0, "accountKey": "x-hraness", "adapter": "x-web", "operation": "profiles.read", diff --git a/docs/publishing.md b/docs/publishing.md index 77c7353e..c4f94a5e 100644 --- a/docs/publishing.md +++ b/docs/publishing.md @@ -242,12 +242,12 @@ delivery proceeds through a new source-qualified version. ## Install the canonical release -These commands require the matching published immutable v0.18.63 release. +These commands require the matching published immutable v0.18.64 release. For the CLI: ```sh -bun add --global https://github.com/hraness/ghostget/releases/download/v0.18.63/hraness-ghostget-0.18.63.tgz +bun add --global https://github.com/hraness/ghostget/releases/download/v0.18.64/hraness-ghostget-0.18.64.tgz ghostget --version ghostget doctor --json ``` diff --git a/kb/launch/social-kit.md b/kb/launch/social-kit.md index 0b56a6bd..cf3c5a98 100644 --- a/kb/launch/social-kit.md +++ b/kb/launch/social-kit.md @@ -57,7 +57,7 @@ The plan is for GhostGet to stay small. Your agent does the thinking, and GhostG Post 9 of 9, 192 characters ```text -GhostGet is free, MIT licensed, and runs on macOS and Linux. The first step reads a public page and needs no account. Latest release: v0.18.63. +GhostGet is free, MIT licensed, and runs on macOS and Linux. The first step reads a public page and needs no account. Latest release: v0.18.64. https://ghostget.com/blog/introducing-ghostget/ ``` @@ -115,7 +115,7 @@ The plan is for GhostGet to stay small. Your agent does the thinking, and GhostG Post 9 of 9, 192 characters ```text -GhostGet is free, MIT licensed, and runs on macOS and Linux. The first step reads a public page and needs no account. Latest release: v0.18.63. +GhostGet is free, MIT licensed, and runs on macOS and Linux. The first step reads a public page and needs no account. Latest release: v0.18.64. https://ghostget.com/blog/introducing-ghostget/ ``` @@ -173,7 +173,7 @@ The plan is for GhostGet to stay small. Your agent does the thinking, and GhostG Post 9 of 9, 192 characters ```text -GhostGet is free, MIT licensed, and runs on macOS and Linux. The first step reads a public page and needs no account. Latest release: v0.18.63. +GhostGet is free, MIT licensed, and runs on macOS and Linux. The first step reads a public page and needs no account. Latest release: v0.18.64. https://ghostget.com/blog/introducing-ghostget/ ``` @@ -197,7 +197,7 @@ GhostGet is for Claude Code, Codex, Cursor, and other agents that run commands o The plan is for GhostGet to stay small. Your agent does the thinking, and GhostGet runs only actions someone has reviewed. Each new service arrives as reviewed actions with their own previews. -GhostGet is free, MIT licensed, and runs on macOS and Linux. The first step reads a public page and needs no account. Latest release: v0.18.63. +GhostGet is free, MIT licensed, and runs on macOS and Linux. The first step reads a public page and needs no account. Latest release: v0.18.64. https://ghostget.com/blog/introducing-ghostget/ ``` @@ -224,8 +224,8 @@ Topics: Developer Tools, Artificial Intelligence, Open Source - Sometimes a post goes through but the answer gets lost on the way back. GhostGet writes down every send before it leaves and never sends it again on its own until it knows what happened. - Anything beyond a read starts as a preview that shows the service, the account, and exactly what will be sent. Your agent can prepare it. Nothing is sent until someone confirms that exact preview. - GhostGet is for Claude Code, Codex, Cursor, and other agents that run commands on your Mac or Linux machine and need to read the web and use the accounts you already have. -- GhostGet is free, MIT licensed, and runs on macOS and Linux. The first step reads a public page and needs no account. Latest release: v0.18.63. -- Latest release: v0.18.63. https://ghostget.com/blog/introducing-ghostget/ +- GhostGet is free, MIT licensed, and runs on macOS and Linux. The first step reads a public page and needs no account. Latest release: v0.18.64. +- Latest release: v0.18.64. https://ghostget.com/blog/introducing-ghostget/ ## Beats @@ -251,4 +251,4 @@ Topics: Developer Tools, Artificial Intelligence, Open Source - claimsTotal: 247. verification/claims.json, every claim - claimsEvidenced: 228. verification/claims.json, status evidenced - claimsConfigReadback: 15. verification/claims.json, layer configuration-readback -- status: Latest release: v0.18.63. package.json version +- status: Latest release: v0.18.64. package.json version diff --git a/package.json b/package.json index c1638012..e859045f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hraness/ghostget", - "version": "0.18.63", + "version": "0.18.64", "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 09d29cb1..f0ad7351 100644 --- a/scripts/npm-release-workflow.test.ts +++ b/scripts/npm-release-workflow.test.ts @@ -1430,8 +1430,8 @@ describe("npm publication contract", () => { expect(budget).toContain("785b8fa60c329d7ac46bc8fcf4d959b5fa9d96455bba9e7cdea63f6a3827c4f6"); expect(Object.isFrozen(repairPackageMeasurement)).toBeTrue(); expect(repairPackageMeasurement).toMatchObject({ - archiveSha256: "9f6ff0fac3c7bd70ecb5f94c11e0b3ee5a7e5bb48cb77a24129f0af4e7538a39", - packedBytes: 12_140_613, unpackedBytes: 24_047_027, entryCount: 624, + archiveSha256: "c7473c8d224d01213a6acde1e09dcfb8a0a4c602f48af2ab60f2ba4e00457b85", + packedBytes: 12_152_868, unpackedBytes: 24_047_156, entryCount: 624, packedPlatformProjection: 12_387, packedPortabilityAllowance: 4_096, payloadPlatformProjection: 353, payloadAllowance: 65, }); @@ -1447,8 +1447,8 @@ describe("npm publication contract", () => { expect(budget).toContain("24,024,705 + 353 + 65 = 24,025,123 unpacked"); expect(budget).toContain("12,152,562 + 12,387 + 4,096 = 12,169,045 packed"); expect(budget).toContain("24,093,786 + 353 + 65 = 24,094,204 unpacked"); - expect(MAX_PACKED_BYTES).toBe(12_157_096); - expect(MAX_PACKED_BYTES).toBe(12_140_613 + 12_387 + 4_096); + expect(MAX_PACKED_BYTES).toBe(12_169_351); + expect(MAX_PACKED_BYTES).toBe(12_152_868 + 12_387 + 4_096); expect(budget).toContain("aa127b3193c9bb3b0cb5deece5927be60ccb7111a50169320d322ffdeaa13f39"); expect(budget).toContain("0c331bab3ab3df69a108e18f5f29845b0db90c281cbd6455c0d90fa0b24081e2"); expect(budget).toContain("873cad8139fda303e2d19c6afd61cf549cf9b4d1d76b2a1d6d632a6afe6bd0d1"); @@ -1569,7 +1569,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(24_047_445); + expect(MAX_UNPACKED_BYTES).toBe(24_047_574); expect(budget).toContain("23,037,873 + 65 = 23,037,938"); expect(budget).toContain("f9f3ab38a682690ceaa2699a7309997512030f0fa500a9dc29dcd108123dc41f"); expect(budget).toContain("23,038,557 + 65 = 23,038,622"); @@ -1602,7 +1602,7 @@ describe("npm publication contract", () => { expect(budget).toContain("01875f12ab73a49d6c7d6bf520dc3d318db816addee2fa7981889f35c958cf7c"); expect(budget).toContain("b12909f08f7c19460ced56e30619f4860a1183f4b0106170c07837dae577a937"); expect(budget).toContain("0b212ac291218528dcf979370110a36f10850e046ca90a536057d9a44e807d1d"); - expect(MAX_UNPACKED_BYTES).toBe(24_047_027 + 353 + 65); + expect(MAX_UNPACKED_BYTES).toBe(24_047_156 + 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"); @@ -1638,8 +1638,8 @@ describe("npm publication contract", () => { expect(packageArtifactBudget).toEqual({ entryCount: { min: 624, max: 624 }, fileCount: { min: 624, max: 624 }, - packedBytes: { min: 1_600_000, max: 12_157_096 }, - unpackedBytes: { min: 9_000_000, max: 24_047_445 }, + packedBytes: { min: 1_600_000, max: 12_169_351 }, + unpackedBytes: { min: 9_000_000, max: 24_047_574 }, }); }); diff --git a/scripts/package-budget.ts b/scripts/package-budget.ts index 32ab2e01..896706a7 100644 --- a/scripts/package-budget.ts +++ b/scripts/package-budget.ts @@ -2359,14 +2359,20 @@ // Preserve the reviewed platform projections and portability allowances: // 12,140,613 + 12,387 + 4,096 = 12,157,096 packed; // 24,047,027 + 353 + 65 = 24,047,445 unpacked. +// The 0.18.64 retry preserves the rejected 0.18.63 tag and changes only the +// version, release notes, current pins and rebuilt dist. Two official Node +// 24.20.0 / npm 11.19.0 packs on darwin arm64 are byte-identical at +// c7473c8d224d01213a6acde1e09dcfb8a0a4c602f48af2ab60f2ba4e00457b85: +// 12,152,868 packed bytes, 24,047,156 unpacked bytes and the same 624 entries. +// Keep the existing platform and portability allowances unchanged. export const repairPackageMeasurement = Object.freeze({ - scope: "Ghostget 0.18.63 studio design release over reviewed main 20c1f999", + scope: "Ghostget 0.18.64 studio design release retry over reviewed main 773c537e", command: "npm pack --ignore-scripts", npmVersion: "11.19.0", platform: "darwin-arm64", - archiveSha256: "9f6ff0fac3c7bd70ecb5f94c11e0b3ee5a7e5bb48cb77a24129f0af4e7538a39", - packedBytes: 12_140_613, - unpackedBytes: 24_047_027, + archiveSha256: "c7473c8d224d01213a6acde1e09dcfb8a0a4c602f48af2ab60f2ba4e00457b85", + packedBytes: 12_152_868, + unpackedBytes: 24_047_156, entryCount: 624, packedPlatformProjection: 12_387, packedPortabilityAllowance: 4_096, diff --git a/skills/ghostget/references/install.md b/skills/ghostget/references/install.md index e33bbac0..65a8f842 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.63 release coordinate. Use it +This reference is authored for the exact v0.18.64 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.63/hraness-ghostget-0.18.63.tgz +bun add --global https://github.com/hraness/ghostget/releases/download/v0.18.64/hraness-ghostget-0.18.64.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.63` is an optional npm +The package is `@hraness/ghostget`; `@hraness/ghostget@0.18.64` 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.63/docs/ghostget-migration.md) +The [migration guide](https://github.com/hraness/ghostget/blob/v0.18.64/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.63/hraness-ghostget-0.18.63.tgz +bun add https://github.com/hraness/ghostget/releases/download/v0.18.64/hraness-ghostget-0.18.64.tgz ``` `ghostget adapter sync-bundled` upgrades exact bundled baselines, including an diff --git a/src/beeper-client-types.ts b/src/beeper-client-types.ts index c2631067..21a822e1 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.63"; + version: "0.18.64"; }>; officialCli: Readonly<{ implementation: "github.com/beeper/cli"; diff --git a/src/cli.ts b/src/cli.ts index 7953cc7b..96661cfd 100755 --- a/src/cli.ts +++ b/src/cli.ts @@ -114,7 +114,7 @@ export function isImmediateGhostgetVersionRequest( && (second === undefined || second === "--json"); } -/** `ghostget 0.18.63`, or `{"name":"ghostget","version":"0.18.63"}` with `--json`. */ +/** `ghostget 0.18.64`, or `{"name":"ghostget","version":"0.18.64"}` 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 26fea4ce..9d1c5f9c 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.63" }); + expect(check.ghostget).toEqual({ version: "0.18.64" }); 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 91343f45..52f35f32 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.63" }, + ghostget: { version: "0.18.64" }, 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 3b8ec23c..96ab50ec 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.63"); + expect(GHOSTGET_MEDIA_VERSION).toBe("0.18.64"); expect(localTranscriptVariantSegments(localIdentity)).toEqual([ "transcript", "local", diff --git a/src/version.ts b/src/version.ts index 6c4f1376..e37f2737 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.63" as const; +export const GHOSTGET_VERSION = "0.18.64" as const; diff --git a/website/build.ts b/website/build.ts index 105149d1..a76c5651 100644 --- a/website/build.ts +++ b/website/build.ts @@ -134,7 +134,7 @@ export const HRANESS_LOGO_URL = "https://hraness.com/icon.png" as const; export const HRANESS_LINKEDIN_URL = "https://www.linkedin.com/company/hraness" as const; export const NPM_PACKAGE_URL = "https://www.npmjs.com/package/@hraness/ghostget" as const; export const SKILL_REPOSITORY = "hraness/ghostget" as const; -export const CONTENT_REVIEWED_RELEASE = "v0.18.63" as const; +export const CONTENT_REVIEWED_RELEASE = "v0.18.64" as const; export const DEFAULT_POSTHOG_HOST = "https://us.i.posthog.com" as const; export const DEMO_PUBLIC_FILES = [ "wrench-first-capture.gif",