Skip to content

v0.10.0

Choose a tag to compare

@tomtom87 tomtom87 released this 29 Sep 04:11
· 221 commits to main since this release

Proxy support across every gem that makes a network call, plus reconciliation of checkouts the shopper finishes in their own browser. Every gem that calls the new core APIs now requires portage-ucp ~> 0.10. Their old floors let them resolve against published gems that lacked those APIs.

  • portage-ucp 0.10.0 adds Support::Connection, which replaces every raw Net::HTTP.start call site. It resolves HTTPS_PROXY/https_proxy for https targets (Net::HTTP's own :ENV mode never read them) and honors NO_PROXY. It also supports ProxyConfig routes and named chains: forward proxies, gateway mode, CONNECT tunnels, ca_file and timeout overrides. A hop failure raises ProxyError naming the hop and the redacted proxy host.
    • Rack::ForwardedRequest trusts X-Forwarded-*/Forwarded only from a configured trusted_proxies list and fails closed. Support::PassthroughContext carries an inbound request's allowlisted headers onto the outbound calls made while serving it.
    • Support::HttpClient#json_request now defaults to a 5s open / 30s read timeout instead of Net::HTTP's 60s on both. Support::Retry treats Net::OpenTimeout/Net::ReadTimeout as retryable.
    • Support::TransactionLog accepts a fixed allowlist of optional attributes, used to record and settle a shopper-completed hand-off.
  • portage-cli 0.7.3 routes every network command (buy, find, compare, doctor, payment enroll) through a proxy set by --proxy* flags, PORTAGE_PROXY* env vars or the proxy section of ~/.portage/config.json. The payment route stays direct unless a proxy is named for it, so payment traffic no longer inherits a bare $https_proxy. portage doctor probes each configured proxy.
    • New portage orders reconcile settles checkouts handed to the shopper's browser. It marks one complete only on a store-reported completed status and never infers success from a vanished checkout or a timeout.
    • New portage buy --wait polls until the handed-off checkout settles. Also adds handoff_spend_mode and reconcile_notify (webhook, macos, terminal).
    • buy <url> --max-price was silently ignored. It now filters the store's catalog to the cap.
    • Every store-facing request sends Portage's own User-Agent, configurable with PORTAGE_USER_AGENT.
    • Adds portage --version. portage-console starts on Ruby 4.0 again (irb is now a declared dependency).
    • Opt-in WebMCP outbound (Buy.new(webmcp_bridge:)), express_stop mode only.
  • portage-ucp-client 0.6.3 takes a proxy: option on Client.connect/Client.discover and sends Client::USER_AGENT on the manifest GET and every transport call.
  • portage-ucp-webmcp 0.1.1 resolves the caller through Rack::ForwardedRequest, so X-Forwarded-Host never widens allowed_origins. It retries a tool that answers the page isn't ready yet, seen live on Shopify storefronts after their own add_to_cart. Rack::CallEndpoint gains max_body_bytes: and call_timeout: and no longer raises on non-object params. registrar.js no longer races a Turbo/SPA reload against itself.
  • portage-ucp-decision 0.1.1 sends its own User-Agent from the Jev backend.
  • portage-ucp-shopify 0.5.1 sends Admin API calls through Support::Connection. It also fixes a NoMethodError at launch: the exe called .start on a plain MCP::Server, which has no #start in mcp 0.25.0.
  • portage-ucp-instagram 0.1.5 adds a standalone exe/portage-ucp-instagram. The Graph client now retries 429/5xx and Meta's throttling codes, and fails fast on an expired token with TokenExpiredError. search_catalog follows paging.next, and the mapper degrades on malformed prices and orders instead of raising. Adapter#get_order warns ahead of Meta's 2026-10-27 checkout sunset.

What shipped

portage-ucp 0.9.0 → 0.10.0

  • 4729f3c Give HttpClient a default open/read timeout
  • 767aaf8 Treat Net::OpenTimeout/Net::ReadTimeout as retryable
  • 240a74d Add changelog entry for the HTTP timeout hardening
  • 757170e Reconcile shopper-completed checkout hand-offs (Phases 1-2)
  • 833c267 Proxy support Phase 1: Support::Connection, ProxyConfig, and the migration of all nine raw Net::HTTP.start call sites
  • d7bafa2 Proxy support Phase 3: inbound trust, client IP, and passthrough headers
  • b4e6ec7 Fix the same Server.build.start bug in portage-ucp's README
  • 91aba1b Bump portage-ucp to 0.10.0 and raise dependency floors for the proxy release

portage-cli 0.7.0 → 0.7.3

  • 51c9a0b Send Portage's own User-Agent on every store call
  • 37f342a Make buy respect --max-price against the store's catalog
  • 626e07f Make portage-cli's outbound User-Agent configurable, checked by doctor
  • 757170e Reconcile shopper-completed checkout hand-offs (Phases 1-2)
  • 80f0a37 Add handoff-reconcile Phases 3-4: portage buy --wait and opt-in WebMCP checkout
  • b6c8a4d Proxy support Phase 0: confirm and lock in env-proxy behavior
  • d3ac72c Proxy support Phase 2: CLI config, flags, and doctor checks
  • 2ad0903 Add Homebrew formula generator (Phase 1), portage --version spec, and irb dependency
  • caa33cd Proxy support Phase 4: docs/proxy.md and CLI reference

portage-ucp-client 0.6.2 → 0.6.3

  • 51c9a0b Send Portage's own User-Agent on every store call
  • 833c267 Proxy support Phase 1: Support::Connection, ProxyConfig, and the migration of all nine raw Net::HTTP.start call sites

portage-ucp-webmcp 0.1.0 → 0.1.1

  • 890cf10 Guard WebMCP's CallEndpoint against malformed params and unbounded calls
  • 96a6452 Await the previous generation before WebMCP's registrar re-registers
  • fdade8c Stop a superseded WebMCP registrar generation from deleting a name the new one owns
  • 1258181 Add a real-browser Ferrum spec for WebMCP's registrar
  • d99f4a3 Document WebMCP's request limits, CSP and CSRF posture
  • 4f33c05 Retry a WebMCP call the page answers isn't ready yet
  • d7bafa2 Proxy support Phase 3: inbound trust, client IP, and passthrough headers

portage-ucp-decision 0.1.0 → 0.1.1

  • 51c9a0b Send Portage's own User-Agent on every store call

portage-ucp-shopify 0.5.0 → 0.5.1

  • c29771d Fix portage-ucp-shopify's exe: StdioTransport#open, not Server.build.start
  • 833c267 Proxy support Phase 1: Support::Connection, ProxyConfig, and the migration of all nine raw Net::HTTP.start call sites

portage-ucp-instagram 0.1.4 → 0.1.5

  • f776bf5 Retry Instagram's Graph client and stop retrying an expired token
  • 5f5fdda Follow paging.next in Instagram's search_catalog
  • 87c6b00 Rescue a malformed token-exchange body in AccessTokenFetcher
  • 6728af7 Degrade the Instagram mapper on malformed prices and order payloads
  • c9bcb16 Add exe/portage-ucp-instagram standalone MCP server
  • cf94c6d Guard against non-Hash elements in Instagram order items.data
  • 459f6fd Fix exe/portage-ucp-instagram's NoMethodError on mcp 0.25.0
  • 8dab14a Deprecate Adapter#get_order ahead of Meta's 2026-10-27 sunset
  • bed71ab Link portage-ucp-instagram's example config by absolute URL
  • 833c267 Proxy support Phase 1: Support::Connection, ProxyConfig, and the migration of all nine raw Net::HTTP.start call sites

Also in this cycle

  • 85cd360 / 59a6cb7 Add a Read the Docs site (MkDocs Material)
  • bb0fb2f / 68ef7ad / 111f34c / deebc94 / 00fd0e7 Slim the root README to a quickstart and move its sections to the docs site
  • f7f21f6 Fix the same Server.build.start bug in the root README
  • 8a0f268 / 78fbbf3 / d292b8c / 387827b / 3850fc2 Fix the BigCommerce, Magento, Wix and WooCommerce exes and add an Etsy exe. These were committed here but first published in 0.11.0.
  • 4bba1b3 Bump versions and add CHANGELOG entries for the max-price/UA/retry fixes; fix buy_spec.rb test-order flake
  • 73f9278 Use a brand query the keyless quickstart backend actually resolves

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