Repository navigation
v0.10.0
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 rawNet::HTTP.startcall site. It resolvesHTTPS_PROXY/https_proxyfor https targets (Net::HTTP's own:ENVmode never read them) and honorsNO_PROXY. It also supportsProxyConfigroutes and named chains: forward proxies, gateway mode, CONNECT tunnels,ca_fileand timeout overrides. A hop failure raisesProxyErrornaming the hop and the redacted proxy host.Rack::ForwardedRequesttrustsX-Forwarded-*/Forwardedonly from a configuredtrusted_proxieslist and fails closed.Support::PassthroughContextcarries an inbound request's allowlisted headers onto the outbound calls made while serving it.Support::HttpClient#json_requestnow defaults to a 5s open / 30s read timeout instead of Net::HTTP's 60s on both.Support::RetrytreatsNet::OpenTimeout/Net::ReadTimeoutas retryable.Support::TransactionLogaccepts 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 theproxysection 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 doctorprobes each configured proxy.- New
portage orders reconcilesettles checkouts handed to the shopper's browser. It marks onecompleteonly on a store-reportedcompletedstatus and never infers success from a vanished checkout or a timeout. - New
portage buy --waitpolls until the handed-off checkout settles. Also addshandoff_spend_modeandreconcile_notify(webhook,macos,terminal). buy <url> --max-pricewas 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-consolestarts on Ruby 4.0 again (irbis now a declared dependency). - Opt-in WebMCP outbound (
Buy.new(webmcp_bridge:)),express_stopmode only.
- New
- portage-ucp-client 0.6.3 takes a
proxy:option onClient.connect/Client.discoverand sendsClient::USER_AGENTon the manifest GET and every transport call. - portage-ucp-webmcp 0.1.1 resolves the caller through
Rack::ForwardedRequest, soX-Forwarded-Hostnever widensallowed_origins. It retries a tool that answers the page isn't ready yet, seen live on Shopify storefronts after their ownadd_to_cart.Rack::CallEndpointgainsmax_body_bytes:andcall_timeout:and no longer raises on non-objectparams.registrar.jsno 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 aNoMethodErrorat launch: the exe called.starton a plainMCP::Server, which has no#startin 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 withTokenExpiredError.search_catalogfollowspaging.next, and the mapper degrades on malformed prices and orders instead of raising.Adapter#get_orderwarns ahead of Meta's 2026-10-27 checkout sunset.
What shipped
portage-ucp 0.9.0 → 0.10.0
4729f3cGive HttpClient a default open/read timeout767aaf8Treat Net::OpenTimeout/Net::ReadTimeout as retryable240a74dAdd changelog entry for the HTTP timeout hardening757170eReconcile shopper-completed checkout hand-offs (Phases 1-2)833c267Proxy support Phase 1: Support::Connection, ProxyConfig, and the migration of all nine raw Net::HTTP.start call sitesd7bafa2Proxy support Phase 3: inbound trust, client IP, and passthrough headersb4e6ec7Fix the same Server.build.start bug in portage-ucp's README91aba1bBump portage-ucp to 0.10.0 and raise dependency floors for the proxy release
portage-cli 0.7.0 → 0.7.3
51c9a0bSend Portage's own User-Agent on every store call37f342aMake buy respect --max-price against the store's catalog626e07fMake portage-cli's outbound User-Agent configurable, checked by doctor757170eReconcile shopper-completed checkout hand-offs (Phases 1-2)80f0a37Add handoff-reconcile Phases 3-4: portage buy --wait and opt-in WebMCP checkoutb6c8a4dProxy support Phase 0: confirm and lock in env-proxy behaviord3ac72cProxy support Phase 2: CLI config, flags, and doctor checks2ad0903Add Homebrew formula generator (Phase 1), portage --version spec, and irb dependencycaa33cdProxy support Phase 4: docs/proxy.md and CLI reference
portage-ucp-client 0.6.2 → 0.6.3
51c9a0bSend Portage's own User-Agent on every store call833c267Proxy 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
890cf10Guard WebMCP's CallEndpoint against malformed params and unbounded calls96a6452Await the previous generation before WebMCP's registrar re-registersfdade8cStop a superseded WebMCP registrar generation from deleting a name the new one owns1258181Add a real-browser Ferrum spec for WebMCP's registrard99f4a3Document WebMCP's request limits, CSP and CSRF posture4f33c05Retry a WebMCP call the page answers isn't ready yetd7bafa2Proxy support Phase 3: inbound trust, client IP, and passthrough headers
portage-ucp-decision 0.1.0 → 0.1.1
51c9a0bSend Portage's own User-Agent on every store call
portage-ucp-shopify 0.5.0 → 0.5.1
c29771dFix portage-ucp-shopify's exe: StdioTransport#open, not Server.build.start833c267Proxy 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
f776bf5Retry Instagram's Graph client and stop retrying an expired token5f5fddaFollow paging.next in Instagram's search_catalog87c6b00Rescue a malformed token-exchange body in AccessTokenFetcher6728af7Degrade the Instagram mapper on malformed prices and order payloadsc9bcb16Add exe/portage-ucp-instagram standalone MCP servercf94c6dGuard against non-Hash elements in Instagram order items.data459f6fdFix exe/portage-ucp-instagram's NoMethodError on mcp 0.25.08dab14aDeprecate Adapter#get_order ahead of Meta's 2026-10-27 sunsetbed71abLink portage-ucp-instagram's example config by absolute URL833c267Proxy support Phase 1: Support::Connection, ProxyConfig, and the migration of all nine raw Net::HTTP.start call sites
Also in this cycle
85cd360/59a6cb7Add a Read the Docs site (MkDocs Material)bb0fb2f/68ef7ad/111f34c/deebc94/00fd0e7Slim the root README to a quickstart and move its sections to the docs sitef7f21f6Fix the same Server.build.start bug in the root README8a0f268/78fbbf3/d292b8c/387827b/3850fc2Fix the BigCommerce, Magento, Wix and WooCommerce exes and add an Etsy exe. These were committed here but first published in 0.11.0.4bba1b3Bump versions and add CHANGELOG entries for the max-price/UA/retry fixes; fix buy_spec.rb test-order flake73f9278Use 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.