Skip to content

Releases: tomtom87/Portage

v0.20.0

Choose a tag to compare

@tomtom87 tomtom87 released this 18 Oct 06:08

Portage's Shopify MCP connector was scoring poorly on Glama's tool-documentation grader: every generated tool's description was just its bare namespaced identifier (e.g. dev.ucp.shopping.catalog#get_product), every parameter schema was empty, and no MCP annotations were set.

  • portage-ucp 0.15.1.
    • Fixed: generated MCP tools carry a real description, per-parameter description, and readOnlyHint/destructiveHint/idempotentHint annotations. New Mcp::ToolMetadata supplies this per action, sourced from the @param/@return docs already on Adapter's methods; an action without an entry still falls back to the old capability#action format. Adapter, the wire format and every adapter gem are unchanged — this only changes what a calling agent reads in tools/list. Patch-level.

Every other gem and both plugins are unchanged. Their portage-ucp constraints already allow 0.15.

v0.19.0

Choose a tag to compare

@tomtom87 tomtom87 released this 09 Oct 06:13

portage-ucp now speaks UCP 2026-08-25, the version live Shopify stores already serve. Before this, a strict 2026-08-25 client couldn't find our signing keys.

  • portage-ucp 0.14.0.
    • Breaking: the manifest puts keys (a JWK Set) at the document root; ucp.signing_keys is gone. Anything that reads signing keys must read keys instead. Each key needs a kid.
    • Breaking: config.payment_handlers is now a Hash of reverse-domain-key => [entry, ...], and each entry carries an id. The default is {}; an Array no longer works. config.services arrays still work.
    • Changed: the UCP version is 2026-08-25 in the manifest, WireEnvelope and the SchemaValidator default. Services, capabilities and payment handlers are keyed by reverse-domain name and carry date versions, and the whole manifest validates against the 2026-08-25 business profile schema.
    • Changed: FulfillmentOption sends description as an object rather than a bare string, as 2026-08-25 requires.
    • Removed: the vendored 2026-04-08 schemas. portage-ucp-client reads remote profiles without vendored schemas, so stores still serving 2026-04-08 keep working.

Every other gem and both plugins are unchanged. Their portage-ucp constraints already allow 0.14.

v0.18.0

Choose a tag to compare

@tomtom87 tomtom87 released this 07 Oct 09:04

portage orders reconcile can now settle a checkout the shopper paid in their browser on four of the five adapter stores, and it works against native UCP stores again. A store that escalates its checkout can now go through require_approval too. None of the adapters' platform order lookups has been tried against a live store yet.

  • portage-ucp 0.13.0.
    • Added: Support::CheckoutState can ask the platform about a checkout this process doesn't track. An adapter can define a private platform_checkout_order(checkout_id) that returns the order its platform placed from that checkout. When there's no record of the checkout in this process, the status is then completed, #checkout_order returns the order confirmation, and #checkout_from_platform_order rebuilds the checkout from the order if the platform has already dropped the cart. If there's no order, no hook or a failed lookup, the status stays incomplete, as before. The Adapter contract is unchanged.
  • Adapter gems: a checkout paid in the browser reads as completed from a new process. Each one now requires portage-ucp ~> 0.13.
    • portage-ucp-bigcommerce 0.2.1: v2 orders filtered by cart_id, paid statuses only.
    • portage-ucp-magento 0.2.1: guest cart → quote_id → admin order search, processing, complete or closed only. Needs admin_token. A cart that 404s with no order now returns nil instead of raising ApiError.
    • portage-ucp-wix 0.2.1: Search Orders on checkoutId, status: APPROVED only.
    • portage-ucp-shopify 0.6.1: Admin orders(query: "cart_token:…"). Needs the Admin token.
    • WooCommerce can't do this. When the shopper pays in the browser, the cart moves into a new session, and nothing on the order points back to it. Those hand-offs stay pending, so portage-ucp-woocommerce stays at 0.3.0.
  • portage-cli 0.13.1.
    • Fix: orders reconcile and buy --wait can read a native UCP checkout again. Reconcile left out the agent profile, so every real UCP store rejected the call and a pending hand-off never settled. It now sends the same profile buy does.
    • Fix: a store that escalates its checkout can be approved and reconciled under require_approval. Before, a dry run reported it as requires_escalation and saved no quote, so there was nothing to approve. Now a dry run reports dry_run with handoff_expected: true. The gated run then returns needs_approval, and the hand-off from the approved run is recorded for reconcile.
    • Keeps portage-ucp ~> 0.11.

Known gaps: a checkout rebuilt from an order has no links. On BigCommerce, Magento and the Shopify adapter, the order snapshot that reconcile saves has a blank checkout_id.

portage-ucp-client, -journal, -decision, -webmcp, -etsy, -instagram and -woocommerce stay where they were. The buy and OpenClaw plugins didn't change and stay at 0.10.5.

v0.17.0

Choose a tag to compare

@tomtom87 tomtom87 released this 05 Oct 11:58

This release is mostly a cleanup: dead code removed, duplicated helpers shared, and one less system tool needed. It also fixes two bugs and removes the buy skill's raw-UCP direct-checkout fallback. Removing unused public methods and constants is breaking for anyone who called them, so the gems that lost one get a minor bump. Each removal is marked breaking in that gem's changelog.

  • Security: the buy skill no longer has a direct-checkout fallback. ClawHub's audit of the portage-buy skill 0.10.4 flagged its "No CLI available" section. With portage missing, that section had the agent create and pay a store's checkout over raw UCP itself, outside Portage's spending policy, approval and checkout-mismatch checks. Now the skill tells the agent to ask the user to install or upgrade portage and stop. references/raw-ucp.md is gone. Buying over raw UCP stays in the standalone shop-via-ucp skill.
  • portage-cli 0.13.0.
    • portage browser import no longer needs the sqlite3 command-line tool. It reads the copied Chromium, Firefox and Safari history through the sqlite3 gem, which portage-cli already depends on. error: "reader_unavailable" now means a SQLite error reading the copy, or a missing plutil for Safari bookmarks.
    • Fix: payment enroll works against your own adapter-backed store again. The fallback referenced a class that doesn't exist, and the error was swallowed, so it always reported no session.
    • Fix: payment enroll follows homepage redirects (for example apex to www), up to five, like buy does. Every hop stays on the payment proxy route.
    • Breaking: removed the unused BrowserProfile::Cdp.close_tab, and BrowserImport::Sqlite.new no longer takes command:.
    • Keeps portage-ucp ~> 0.11.
  • portage-ucp 0.12.0.
    • Fix: a trusted JWK whose x or y isn't valid base64url now gets a 401 invalid_signature. It used to raise a raw ArgumentError, so the request failed with a 500.
    • Security hardening: Content-Digest is compared with OpenSSL.fixed_length_secure_compare instead of a hand-rolled byte loop.
    • Breaking: removed CapabilityNegotiator (nothing called it), Dispatcher#call's ignored agent_profile: keyword, and SchemaValidator#valid? (use errors_for(...).empty?). The EC curve constants moved from Security::Signature and Ap2::MandateSignature to the new Security::EcJwk.
    • The unused embedded.openrpc.json schema no longer ships in the gem.
  • Adapter gems, breaking removals only. The removed methods were unused public pass-throughs and client methods. Nothing changed for a store running the adapter.
    • portage-ucp-shopify 0.6.0 and portage-ucp-wix 0.2.0: Mapper.money.
    • portage-ucp-bigcommerce 0.2.0: Mapper.money, Client#v2_post, Client#v3_put.
    • portage-ucp-magento 0.2.0: Mapper.money, Client#admin_post.
    • portage-ucp-woocommerce 0.3.0: Client#admin_post, Client#store_delete.
    • portage-ucp-instagram 0.2.0: the site_url: keyword on Mapper.product.
  • One shared examples/portage_ucp.rb. It now lives once in portage-ucp/examples/, replacing seven identical copies in the adapter gems. The adapter exes and READMEs link to it.
  • buy plugin and OpenClaw plugin @tomtom87/portage 0.10.5. They carry the skill change above. The OpenClaw plugin also gets small internal tidy-ups, with no change in behaviour.

portage-ucp-client, portage-ucp-webmcp and portage-ucp-etsy changed only in docs, comments or internals, so they stay at 0.6.3, 0.2.0 and 0.1.5.

v0.16.2

Choose a tag to compare

@tomtom87 tomtom87 released this 01 Oct 08:44

This release brings a native OpenClaw plugin for Portage, @tomtom87/portage, and the fixes from ClawHub's security audits of it. ClawHub's audit of 0.10.4 passes: "No suspicious patterns detected". It covers the 0.16.0, 0.16.1 and 0.16.2 release sets, none of which were tagged before.

  • New: OpenClaw plugin @tomtom87/portage 0.10.4 (ClawHub). It gives an agent 23 typed portage_* tools over the portage CLI, with arguments passed as an array and never through a shell.
    • Read-only by default. The 13 read-only tools are on by default. The 10 that price, approve, buy, hand off, open a browser or edit the index are opt-in.
    • Portage's policy still decides every payment. No tool passes --yes for a URL or an offer. portage_approve relays a yes only when told the user gave it. Policy, payment, setup and history clearing are not exposed.
    • Bundled skills. It ships the buy and shop-research skills plus a short portage-openclaw skill that maps each buying step to its tool.
    • Requirements. It needs portage-cli 0.12.0 or newer and OpenClaw 2026.5.28 or newer.
    • Install with openclaw plugins install clawhub:tomtom87/portage.
  • Security: no direct-checkout fallback. The plugin's copy of the buy skill no longer has the "no CLI" fallback, in which the agent drove a store's checkout over raw UCP itself, outside Portage's policy, approval and mismatch checks. That section now tells the agent to install portage and stop.
  • Security: the plugin starts only portage, through OpenClaw's own command helper. The runner refuses any portageBin that doesn't name the portage executable. It hands the argument array to api.runtime.system.runCommandWithTimeout, so the plugin has no child_process code of its own (this cleared suspicious.dangerous_exec). The per-call timeout and the 16 MB output cap are unchanged. Output past the cap is now a plain error, and portage gets an empty stdin.
  • Security: the buy and shop-research skills are reworded. ClawHub's SkillSpector audit had flagged their wording, not anything they do. The rewording keeps every instruction the same:
    • The skills now say the env file must be readable only by the user (file mode 600) instead of chmod 600.
    • Paths in env var descriptions are in backticks.
    • The Etsy and eBay tokens are called OAuth tokens, and Amazon's an API token.
    • The injection example in the hard rules is described instead of quoted.
  • Narrower buy trigger. The skill now triggers only on an explicit buy, order or reorder request, Portage setup or order tracking. Its description gives examples and lists what it isn't for: price or stock questions, product advice, and purchases the user makes themselves.
  • ClawHub listing. The OpenClaw plugin is listed under Integrations.
  • buy plugin 0.10.4. Its skills' version follows plugin.json. The portage-buy skill on ClawHub is at 0.10.4 too.

No gem changed in this release; portage-cli stays at 0.12.0.

v0.15.0

Choose a tag to compare

@tomtom87 tomtom87 released this 01 Oct 05:35

This release closes the gaps ClawHub's security audit of the portage-buy skill found, hardens the opt-in decision check, and adds a live one-store search and two read-only skills.

  • Security: a checkout mismatch always stops the purchase. buy used to stop on a checkout that didn't match the request (item dropped, another quantity, another unit price) only under PORTAGE_ABORT_ON_CHECKOUT_MISMATCH, so a real --yes run could pay for the wrong checkout and report purchased. Every mismatch on a real run now ends in checkout_mismatch before the payment token, policy and completion. There is no opt-out: that variable is deprecated and ignored.
    • Extra lines count. A priced line nobody asked for (an upsell, "shipping protection", a second copy, or something already in a WebMCP store's cart) is a mismatch. A line that costs nothing is allowed. A checkout in another currency than the catalog's price is a mismatch too.
    • WebMCP hand-offs too. A mismatched cart on a Shopify-style page stops before proceed_to_checkout and before autofill, with the store's /cart page as checkout_url.
    • Quotes. A --quote run's cap now applies before every WebMCP hand-off, and a quote with no total refuses (quote_changed) instead of buying uncapped.
    • A --dry-run keeps its dry_run outcome and now carries checkout_mismatch: true when a real run would stop.
  • portage-cli 0.12.0.
    • Decision check hardened. The state sent to the backend (Jev) is built field by field from an allowlist: the request, the approved quote, and the checkout's lines, totals, discounts and shipping option. Never the payment token, the address, the buyer's name, phone or email, links, discount codes or environment values. The question compares the checkout against the approved quote.
    • Runs before every WebMCP hand-off, preset or not, after the quote cap and the mismatch stop. A hold reports low_confidence with the /cart page as checkout_url, and nothing is handed to the checkout. No backend enabled: unchanged.
    • portage find --store URL --query Q [--max-price N]. Searches one store's catalogue live, skipping the search backends and retailer sources. It is what the skills use to re-check an index hit before quoting a price or stock.
    • Keeps portage-ucp ~> 0.11.
  • portage-ucp-decision 0.1.2. A backend answer that isn't a probability (below 0, above 1, NaN, Infinity) now raises BackendError, so the purchase is held. Before, an answer above 1 cleared any threshold. Install it with gem install portage-ucp-decision if you use the check.
  • buy plugin 0.10.0.
    • New shop-research skill, for questions with no purchase in mind: what something costs, where to get it, whether it's in stock, whether Portage can buy from a store, what you ordered. It runs only read-only commands and never invents store details.
    • buy has narrower triggers. Its description covers shopping, buying and ordering on your behalf, not general questions about prices or products, and points lookups to shop-research. Each OpenClaw env var says you set it yourself and the agent never reads or prints it.
    • Describes the hardened checks: the mismatch stop, the allowlisted decision check, and find --store re-checks. Those need portage-cli 0.12.0, and the older-install fallbacks stay. The minimum portage-cli stays 0.9.0.
  • shop-via-ucp and the new browse-via-ucp skill. shop-via-ucp is now for completing a purchase and gains a guardrail: never pay for a checkout that differs from what you approved. The new read-only browse-via-ucp reads a store's manifest and searches its catalogue, and hands over to shop-via-ucp to buy.

No other gem changed. The docs-only notes in portage-ucp-client and portage-ucp-webmcp stay unreleased. The ClawHub listing is published separately, at buy 0.10.0.

v0.14.0

Choose a tag to compare

@tomtom87 tomtom87 released this 30 Sep 17:36

Portage keeps a local product catalogue: a SQLite index you can fill by crawling a store's public catalogue and search offline, with results agents can show as product cards.

  • portage-cli 0.11.0.
    • SQLite index. The local index is now ~/.portage/index/index.sqlite3 (mode 0600, WAL, FTS5), replacing stores.json and products.json. Those are imported once on first open and kept as *.json.migrated. portage doctor reports the database path, row counts and FTS5. Adds a sqlite3 ~> 2.9 dependency, which ships precompiled for macOS and Linux.
    • Storefront crawl. portage index add URL --crawl and portage index build --sources storefront_products read a Shopify store's public /products.json into the index. The crawl honours robots.txt, pauses between pages, backs off on 429, stops at a page cap, and never requests hand-off-only hosts. It never stores price or stock. portage check suggests the command but never crawls itself.
    • portage index search QUERY [--category ID] [--store HOST] [--limit N] [--json]. Ranked FTS5 search over the index. Hits are marked live: false, so re-fetch before quoting a price. index show --products now pages its output.
    • Product cards. find and shopify_catalog offers carry the store's UCP product wire hash next to the flat fields, which are unchanged. index search hits carry the price-free subset.
    • Category classifier. known-stores/categories.yml is generated by script/categories from Google's full product taxonomy (edition 2021-09-21), with a shipped stoplist and a few synonyms. Matches are ranked by repetition and rarity, and at most 3 ids come back. A 100-case golden set goes from 12% to 70% top-1 accuracy. Crawl a store again to re-classify what is already indexed.
    • Keeps portage-ucp ~> 0.11.
  • buy plugin 0.9.0.
    • Adds a section on showing offers as product cards and on treating index hits as seeds, never as a current price.
    • The skill frontmatter carries OpenClaw metadata (requires.bins: [portage], optional env vars, a brew install spec) and a version that a spec keeps equal to plugin.json.
    • The minimum portage-cli stays 0.9.0.
  • OpenClaw and Omarchy.
    • README gets an OpenClaw badge, plus install steps from ClawHub (openclaw skills install @tomtom87/portage-buy, the listing goes live with this release) or by copying the skill.
    • The Omarchy steps now use omarchy-mise-install gem:portage-cli portage, note the make a stock install needs, and list the skill directories.

No other gem changed. The docs-only notes in portage-ucp-client and portage-ucp-webmcp stay unreleased.

v0.13.0

Choose a tag to compare

@tomtom87 tomtom87 released this 29 Sep 14:04

portage check answers "can Portage buy from this store, and how?" from the CLI, with the same answer portage buy would act on.

  • portage-cli 0.10.0 adds portage check URL [--json].
    • It reports a verdict (automated, webmcp, handoff or unsupported) and a plain-English next_step. Behind them it reports native UCP, the detected platform and recommended adapter gem, whether that gem is installed and which env vars are missing, hand-off-only status, and WebMCP status.
    • It wraps Portage::Ucp::Check and uses the same precedence as buy. The hand-off-only test moved into a shared HandoffHost, so the two commands can't disagree.
    • It only makes plain GETs, never builds a cart, and doesn't contact hand-off-only hosts at all. WebMCP is read only from a tab the Portage browser profile already has open on the store. It never launches a browser, so otherwise webmcp.status is skipped with a reason.
    • It exits 0 for automated and webmcp, 1 otherwise, and honours the --proxy* flags.
    • It now requires portage-ucp ~> 0.11.
  • portage-ucp 0.11.0. Ucp::Check and portage-ucp-check now follow a homepage <link rel="ucp" href="..."> manifest pointer when /.well-known/ucp is missing, the same fallback buy uses. The report adds manifest_url when the manifest came from that link.
  • buy plugin 0.8.0 adds a "Can Portage buy from this store?" step using portage check URL --json, used only when portage --help lists check.
  • Docs. docs/checking-any-store.md now leads with portage check, and docs/api/cli-json.md, the CLI tutorial and both READMEs cover it.

The docs-only notes in portage-ucp-client and portage-ucp-webmcp stay unreleased.

v0.12.0

Choose a tag to compare

@tomtom87 tomtom87 released this 29 Sep 14:04

Human pick and approve: the person at the keyboard picks the store and approves the total, through portage itself, whether they're at a terminal or an agent is relaying their answer. Under the default policy, buy --yes no longer buys without an approved quote.

  • portage-cli 0.9.0 delivers Phases 1-3 of docs/plans/human-pick-and-approve.md.
    • Offer refs. Each find offer carries an offer_ref, and each search a search_id, both saved in history. compare saves its offers the same way. portage buy --offer REF buys from a saved offer.
    • Quotes. A buy --dry-run that priced a checkout saves a quote and reports quote_id. buy --quote QUOTE_ID --yes buys exactly that quote, capped at the quoted total. If the real checkout costs more, it refuses with quote_changed and charges nothing. Each quote is used once.
    • portage pick returns needs_pick with choices[], plus a "Compare an offer across stores" choice. --choose REF relays an answer, --compare REF compares first, and at a terminal it asks on /dev/tty.
    • portage approve QUOTE_ID returns needs_approval with a summary of the order. --relayed-yes records an agent-relayed yes, and a yes typed at a terminal records person.
    • --via auto|tty|agent picks who is asked. --view REF and v N at a prompt open the product page, but only on the offer's own store host.
    • policy set --require-approval person|any|off, default any. Lowering it needs a yes typed at a terminal. It raises the bar against an agent but isn't a hard guarantee: a process with a shell can edit the policy or quote files.
    • Upgrade note. Under the default any, a buy --yes without an approved --quote dry-runs and returns needs_approval instead of buying. portage policy set --require-approval off, run from a terminal, restores the old behaviour.
  • buy plugin 0.7.1. The skill's steps 3 and 5 use portage pick and portage approve, and it names portage-cli 0.9.0 as the release that ships them. references/outcomes.md covers the new outcomes and exit codes.
  • Docs. docs/api/cli-json.md, docs/agentic-flow.md, docs/skills/buy.md, docs/cli-usage-tutorial.md and both READMEs cover pick, approve, quotes and the approval policy.

The docs-only notes in portage-ucp, portage-ucp-client and portage-ucp-webmcp stay unreleased: no code changed there.

v0.11.0

Choose a tag to compare

@tomtom87 tomtom87 released this 29 Sep 04:11

Delivers the buy skill and the local-browser plan: offer sources and the Shopify Catalog, a local store index, browser import, the portage setup wizard, hand-off targets and a Portage browser profile. WebMCP learns to drive stores that don't run Portage. Five adapter exes that crashed at launch are fixed, and the buy Claude Code plugin ships through this repo's own marketplace.

  • portage-cli 0.8.0 delivers Phases 1-8 of docs/plans/buy-skill-and-local-browser.md.
    • find gains a second backend kind, OfferSource. The first one is the Shopify Catalog. --max-price now filters its offers too.
    • Categories and a shared Classifier route find to stores that sell what the query asks for.
    • portage index build/refresh/show/add/remove/sources builds a local store and product index. The repo's known-stores list (221 stores, 396 products) is fetched over jsdelivr, and the user's own entries always win.
    • portage browser import turns the user's own bookmarks and history into index entries. It reads only history and bookmark files, never password, cookie or autofill stores. Nothing is saved without a TTY "y" or --yes.
    • portage setup runs an interactive wizard on a TTY. Under --json or with no TTY it prints the same read-only report as portage doctor.
    • buy --handoff-target default|print|profile|agent:<name> picks where a dead-end checkout URL goes. Amazon, walmart.com, ebay.com, bestbuy.com and any host in handoff_only_hosts are hand-off only. Portage never sends them a request.
    • portage browser profile init|open|status manages a dedicated Portage browser profile for hand-offs.
    • Five opt-in retailer offer sources: Walmart Affiliate, eBay Browse, Best Buy Products, Etsy Open API v3 and Amazon Creators. Each needs its own key, and every offer they return ends in hand-off.
    • The WebMCP hand-off path now uses presets, schema matching and approved checkout autofill. A mutating tool mapping needs the shopper's confirmation first. dry_run: true was ignored on this path and is now honoured.
    • Requires portage-ucp-webmcp 0.2.0 or newer for WebMCP paths. An older install is treated as absent instead of raising NameError.
    • Rolls up 0.7.4 and 0.7.5, published on 2026-09-25. portage doctor reports how Portage was installed (Homebrew or gem) and warns when another portage on PATH shadows it. portage loads ~/.portage/.env. Doctor runs the seller checks only for a seller.
    • portage buy "coffee" runs as a search when the argument doesn't look like a URL. Doctor flags a DuckDuckGo-only search setup, which only resolves entity queries.
    • PORTAGE_AGENT_PROFILE defaults to the repo's published profile instead of failing on a fresh install.
  • portage-ucp-webmcp 0.2.0 drives stores that don't run Portage.
    • Platform presets are detected from the exact set of tool names a page registers, never from page text. Shopify is the first preset.
    • Matcher.propose maps an unknown page's tools to UCP actions by name and input-schema shape, never by a tool's untrusted description.
    • Autofill fills a checkout's contact and shipping fields and picks the cheapest shipping rate in any currency. It never touches payment fields, never clicks pay, and stops at the first sign of a CAPTCHA.
    • Fixes assets/autofill.js, which didn't parse, so every real Autofill.call raised.
  • portage-ucp-bigcommerce, -magento, -wix 0.1.5 and portage-ucp-woocommerce 0.2.2 fix a NoMethodError at launch. Each exe called .start on a plain MCP::Server, which has no #start in mcp 0.25.0. Each gem gains an exe_spec.rb that runs the exe as a real subprocess and does a JSON-RPC handshake with it.
  • portage-ucp-etsy 0.1.5 adds exe/portage-ucp-etsy and examples/portage_ucp.rb. It was the only adapter without them.
  • buy plugin (plugins/buy, listed in .claude-plugin/marketplace.json) is the agent-facing interface to portage. It covers the find → dry-run → confirm → buy flow, hand-off, hand-off-only retailers, and hard rules: no raw card data, no browser credential reads, no CAPTCHA bypass, confirm before buying. It needs portage-cli 0.8.0.
  • rake homebrew:update regenerates the Homebrew formula and runs at the end of publish_all. The docs now lead with brew install.

What shipped

portage-cli 0.7.3 → 0.8.0

  • c8a5274 Homebrew Phase 4: brew-first docs and install checks in portage doctor
  • 3e5b64d Load ~/.portage/.env, and run doctor's seller checks only for a seller
  • 0104ab8 buy: accept bare query with no --query; doctor/find surface duckduckgo-only search limits
  • 5090654 Derive WebMCP session capabilities from the page's tools
  • 7af985b WebMCP Phase 1: platform presets and the hand-off checkout path
  • 11d87bc WebMCP Phase 2: schema matching for unknown pages, confirmed by the user
  • c8935bc WebMCP Phase 3: approved autofill of the store's checkout
  • 92cece2 WebMCP Phase 4: document presets, matching and autofill
  • e4b2c72 Fix autofill.js parsing, dry runs on the WebMCP hand-off, and rerun the live checks
  • 80c7a93 portage-cli: OfferSource seam + Shopify Catalog (Phase 1)
  • 1169700 portage-cli: categories + Classifier + find routing caps (Phase 2a)
  • 8231629 portage-cli: local store index + portage index (Phase 2b)
  • fa4b321 portage-cli: known-stores list in the repo, fetched over jsdelivr (Phase 2c)
  • 1a58c0a portage-cli: browser import of bookmarks and history as index seeds (Phase 3)
  • f091200 portage-cli: portage setup wizard (Phase 4)
  • cd719bb portage-cli: hand-off targets + hand-off-only hosts (Phase 5)
  • 8a3a6e9 portage-cli: Portage browser profile (Phase 6)
  • 9385aad portage-cli: retailer offer sources (Phase 7)
  • bae99fa portage-cli: docs + buy skill release (Phase 8)
  • 80666cf portage-cli: apply find --max-price to offer-source offers

portage-ucp-webmcp 0.1.1 → 0.2.0

  • 5090654 Derive WebMCP session capabilities from the page's tools
  • 7af985b WebMCP Phase 1: platform presets and the hand-off checkout path
  • bf573de Complete the Shopify WebMCP preset fingerprint from a live sweep
  • 11d87bc WebMCP Phase 2: schema matching for unknown pages, confirmed by the user
  • c8935bc WebMCP Phase 3: approved autofill of the store's checkout
  • 92cece2 WebMCP Phase 4: document presets, matching and autofill
  • 5b6378e Record the WebMCP live checks against a real Shopify checkout
  • e4b2c72 Fix autofill.js parsing, dry runs on the WebMCP hand-off, and rerun the live checks
  • 7b8d4e4 Read shipping-rate prices one pattern at a time, with real ISO codes

portage-ucp-bigcommerce 0.1.4 → 0.1.5

  • 8a0f268 Fix portage-ucp-bigcommerce's exe: StdioTransport#open, not .start

portage-ucp-magento 0.1.4 → 0.1.5

  • 78fbbf3 Fix portage-ucp-magento's exe: StdioTransport#open, not .start

portage-ucp-wix 0.1.4 → 0.1.5

  • d292b8c Fix portage-ucp-wix's exe: StdioTransport#open, not Server.build.start

portage-ucp-woocommerce 0.2.1 → 0.2.2

  • 387827b Fix portage-ucp-woocommerce's exe: StdioTransport#open, not .start

portage-ucp-etsy 0.1.4 → 0.1.5

  • 3850fc2 Add a standalone MCP server exe for portage-ucp-etsy
  • ca6ce83 Add a spec that exe/portage-ucp-etsy and its example config load
  • 4f68f3b Document the standalone MCP server exe in portage-ucp-etsy's README
  • b72bfcd Link portage-ucp-etsy's example config by absolute URL

Also in this cycle

  • 391c5e0 buy skill + plugin marketplace (Phase 0)
  • 928ee7b Record the clean-session /buy check in the buy skill plan
  • e153209 / 5b75385 Add rake homebrew:update and run it at the end of publish_all
  • ceb8837 / c2113a9 Add a Read the Docs link to the top of the README
  • ad9a54d Cut 0.11.0: portage-cli 0.8.0, portage-ucp-webmcp 0.2.0, adapter exe fixes

The 0.10.0 release set (proxy support, portage-ucp 0.10.0) was published to RubyGems on 2026-09-25. Its notes are on the v0.10.0 release.

See each gem's own CHANGELOG for full details, and the design log for the rationale.