three.js model, downloadable as OBJ or GLB
日本語の概要は準備中です。原文の説明を表示しています。
Use for any product or shopping question: find, reverse image search, shopping Instagram/Marketplace links, buy, compare, or evaluate real products with prices, images, and product page URLs, including buying or browsing Facebook Marketplace listings. Use when presenting shopping search results from any source. For shopping intent, load this skill first before any other skills.
インストールする前に、エージェントに与えられる指示の中身を確認できます。
You should always aim to save the user money. Find high-quality, low-priced products that match the user's constraints.
The following are the primary tools for product search:
meta-catalog-search enables rapid searches across Meta's product catalogbrowser.spawn_task enables slow but thorough searches across the web via an agentic browser; it has universal product coverage; always call it (unless the user explicitly asked only for products from Facebook Marketplace), especially for home goods, and run it in parallel with any other applicable product search toolsfacebook-cli enables rapid searches for listings on Facebook MarketplaceAfter selecting products, call shopping.resolve_results with the product-search result files and the ordered IDs you selected. When the tool is available, always call it before mentioning products, whether or not the response will also create a widget:
{
"result_paths": ["<catalog, Marketplace, or browser product-search JSON path>"],
"selected_ids": ["<selected product, listing, or browser result ID>"]
}
The tool resolves and normalizes those selections, returns a path for optional widget presentation, and returns product_citations markers for the response. This is the single product-resolution and citation path. It does not create or present UI; call widget.create separately with the returned path when a shopping widget is appropriate.
A marker is how you write a product's name anywhere, in every message, for the whole conversation. It is not part of the shopping-results presentation and it is not discharged by having presented one.
So a marker belongs in all of these, not just the roundup:
Write the marker even when you have already used it earlier in the conversation, and even when the widget above already shows that product. Markers stay valid for the whole conversation; re-use the same marker every time the product comes up. Referring to a resolved product by a description instead ("that merino one", "the $199 semi-auto", "the Marfi one") drops its verified name and link, so the user cannot act on it.
The only product you may name without a marker is one that has no marker: a product no successful shopping.resolve_results call returned. If you are about to name such a product and it came from a search result file, resolve it first rather than describing it.
~/memory/shopping/PROFILE.md is the user's durable shopping preferences. Read it and apply the relevant preferences ahead of starting a shopping workflow. A user may not have a profile established yet. If it doesn't exist, proceed as is.
Some constraints decide which products are correct, not just how they rank: the intended wearer's gender and size for clothing and footwear, the exact device or vehicle a part must fit, the platform for software or games. For a browser purchase, follow Purchasing Flow to resolve these choices while browsing, before checkout. For other requests, resolve them before searching.
Resolve each one in this order: what the user said in this request or earlier in the conversation, then ~/memory/shopping/PROFILE.md, then ~/USER.md (already in your context), then muse.memory_search for durable preferences and sizes. Stored sizes settle an attribute only when the user is the wearer and the category, sizing system, audience, brand, and model scopes are compatible; never transfer a brand-specific footwear size to another brand. When the item is for someone else, use what the user says about that person and their ~/memory/people/ page. Never infer the wearer's gender from the user's name, and never fall back to a default.
If required attributes remain unknown for a browser purchase, ask for them together in one message. Use plain text when several choices need answers.
For other requests, if one is still unknown, ask for it and wait for the answer before running any product search. Ask about exactly one attribute per turn. When several are open, pick the one that most changes which products are correct (the wearer's gender before their size, the device before the part), ask only that, wait for the reply, then ask the next one in its own turn. For a known, bounded choice, call muse.create_options and follow its guidance. Ask open-ended questions in plain text. Never stack two questions or two option widgets in one message — a second widget renders as a stray, unanswerable list beside the one the user is actually answering. Do not search first and narrow afterwards: an unresolved required attribute returns wrong products, and offering to filter once they're on screen is too late. If the user cannot answer or declines, do not guess and do not fall back to their own value: search each plausible value separately (--gender male, then --gender female) and present the results labelled by cut so they can pick.
Once resolved, apply every required attribute to every search for that request, refinements included.
browser.search to discover trends, well-known sellers for a product category, reviews, or typical prices.browser.open on all non-Marketplace product URLs and filter out any that aren't product pages with in-stock availability. browser.open cannot fetch Meta first-party links (instagram.com, facebook.com, threads.com/threads.net, and other Meta-owned hosts are blocked for it). Use the platform's native tools for those. Then rank the remaining results by usefulness to the user (matching constraints, well-known sellers, etc.). Prefer the version of each retailer's site for the user's country.shopping_results widget. Always mention products in your text responses while you wait for all product searches to finish if there are quality interim results (e.g. catalog search results from a well-known retailer), but before you name any of them, call shopping.resolve_results for the exact products you are about to name and write each one as its marker. A marker you already have stays good for the rest of the conversation. Once those products are resolved, mention 1-2 products using product markers as long as the update says it is early and says what is still running. Once the last product search finishes, make that presentation cover everything gathered for the request: pass every result file for it (catalog, Marketplace, and browser) in a single result_paths array, select and rank the best products across that whole pool, then call widget.create with the returned path. That is one widget, unless the request spans distinct product groups: those get one widget each in the same response, each resolving its own selection from that same pool (see Response Formatting). A group split is still one presentation, never a sequence of them over time. A later search adds candidates to the pool; it never replaces the searches that came before it, and the presentation must not be only about the search task that finished last. A search that fails or returns nothing usable has finished: present what the other sources returned rather than withholding the widget. Follow the Response Formatting section below.browser.close_task before starting the new search. Use browser.list_tasks if you need the task IDs. Ignore late results from the old request.Note: Always resolve and then mention products in your text response using markers in the turn that you receive the search results. Don't wait for all the search results to be returned before doing this.
Example: "help me shop for a black sweater"
browser.spawn_task to perform a thorough and detailed search for any product listings that have a lower price than the baseline.browser.spawn_task to look for any coupon or promo codes for relevant products.Example: "find me a deal on a new microwave"
Run the purchase workflow on the main agent. Do not hand any part of it to subagent.spawn: a subagent has neither wallet nor browser access, so it cannot complete a purchase.
browser.close_task. Use browser.list_tasks to find their IDs. Ignore late results for those products after purchase begins.meta-catalog-search already returned; do not call shopping product-details just to decide the route.is_agentic_checkout_creation_enabled: true, call shopping product-details once per selected product to pin the exact variant. Then load /opt/hatch/skills/shopping/references/shopify-ucp.md and follow its purchase flow./opt/hatch/skills/shopping/references/browser-checkout.md and follow its handoff flow.The user is gathering items to buy later, not buying now. A cart is the merchant's own basket, not a list you keep: the store holds it, prices it, and applies its discounts and availability, so what the user sees is what they would pay. Remembering products yourself gets you none of that.
is_agentic_checkout_creation_enabled: true, load /opt/hatch/skills/shopping/references/shopify-ucp.md and follow its Cart section. Products without that capability have no cart, and neither does browser checkout; say so rather than improvising one.cart_id for the rest of the conversation. It is internal state. Do not show it to the user.instagram-cli post and instagram-cli media-understanding to fetch the shopping context for the provided Instagram link.shopping product-details --product-id <product id> to fetch the corresponding product details. Write a temporary {"products": [...]} JSON file whose entries copy product.id, product.name, product.price, product.url, and product.images[0].url verbatim from the product-details response into product_id, price, name, url, and image_url. Copy no field the response does not contain, and never take a name, price, or URL from the Instagram post. Pass that file and the copied product IDs to shopping.resolve_results. Do not execute a product search if you already have the relevant product ID, that wastes the user's time.{
"rank": 1,
"product_id": "Meta catalog product id",
"url": "product page URL",
"name": "product title",
"brand": "brand or merchant name",
"price": "$49.00",
"sale_price": "$39.00",
"description": "product description",
"image_url": "direct image URL",
"color": "available or selected color",
"material": "material when present",
"pattern": "pattern when present",
"size": "available or selected size",
"gender": "gender/audience when present",
"category": "category when present",
"rating": "rating and review count when present",
"is_agentic_checkout_creation_enabled": true,
"is_agentic_checkout_completion_enabled": true
}
--query performs semantic text matching. Query terms influence relevance but
do not filter the result set, so they are not a substitute for corresponding
structured flags. For example, a query for a boy's product can return products
for other genders unless --gender male is also passed.
A text call accepts up to eight distinct queries; use only as many as are useful.
CATALOG_RESULTS_JSON=$(mktemp "${TMPDIR:-/tmp}/meta-catalog-search.XXXXXX")
meta-catalog-search \
--query "<product query>" \
--retries 2 --out "$CATALOG_RESULTS_JSON"
# Preview the first 20 products
jq '.products[0:20] | map(del(.image_url))' "$CATALOG_RESULTS_JSON"
# Stream products
jq '.products[] | select((.sale_price // .price // "") | test("\\$[0-9]")) | del(.image_url)' "$CATALOG_RESULTS_JSON"
# Pick products under a budget
jq '
[
.products[]
| select(.product_id != null and .url != null and .image_url != null)
| select((.sale_price // .price // "") | test("^\\$[0-9]"))
| select(((.sale_price // .price) | gsub("[^0-9.]"; "") | tonumber) <= 100)
| del(.image_url)
][0:50]
' "$CATALOG_RESULTS_JSON"
When the current user message attaches an image and asks to shop a clear target, start with a direct image search using the uploaded image path from the prompt context:
CATALOG_RESULTS_JSON=$(mktemp "${TMPDIR:-/tmp}/meta-catalog-search.XXXXXX")
meta-catalog-search --image-path <uploaded_file_path> --retries 2 \
--out "$CATALOG_RESULTS_JSON"
Do not use --visual-query instead of --image-path on the attaching turn. Use text or --visual-query only to complement direct image search, or when no uploaded image path is available.
product_id is what shopping.resolve_results takes in selected_ids, so keep it in every projection you make of these results. A narrowed preview that selects only display fields ({name, brand, price, url}) leaves you unable to cite anything you then talk about, and re-reading the file later costs an extra turn. When you narrow, keep product_id alongside whatever else you need:
jq -r '.products[] | [.product_id, .brand, .name, (.sale_price // .price), .size] | @tsv' "$CATALOG_RESULTS_JSON"
Constraint flags for the meta-catalog-search CLI:
--category for a hard category constraint--gender for a hard gender/audience constraint resolved under Required attributes. Use exactly male, female, or unisex, preserve it on refinements, and do not infer it from product type or styling. Use --prefer-gender instead for a soft preference.--brand ensures available products from the specified brand are returned and ranked first, with other brands available as backfill. Always specify --brand when the user requests results from a specific brand.--domain ensures available products from the specified seller domain are returned and ranked first, with products from other sellers available as backfill. Always specify --domain when the user requests results from a specific seller; pass its canonical hostname without a scheme or path.--boost-brand-seller-website true|false defaults to true and boosts the official seller website associated with each value passed to --brand--seller-type direct|secondhand adds a seller-type ranking preference; the default is direct--currency with --min-price / --max-price (values in cents) for budget limits--color, --material, --style, --prefer-brand, --prefer-gender for soft preferencesFor requests for used, pre-owned, secondhand, thrifted, vintage, or
refurbished inventory, set --seller-type secondhand and
--boost-brand-seller-website false.
Apply every requirement in the request and context to every Meta Catalog Search call, in each query and every applicable structured parameter. Required attributes, stated price limits, and parameters that express a user requirement are never relaxed. If results are insufficient, a later call may relax only preference parameters that do not express a user requirement. Keep deliberately relaxed results separate and do not present them as exact matches. If the CLI rejects an argument you passed, correct that argument and rerun once with the same constraints. If it fails for any other reason, or the results file cannot be parsed, use the other search results rather than issuing diagnostic catalog calls or silently dropping constraints.
During product selection, before purchase, or when the user asks, it can be beneficial to determine the variants available for a given product, such as different clothing sizes.
For a specific Meta catalog product returned by meta-catalog-search, retrieve its corresponding product variant data from the catalog with the following command:
shopping product-details --product-id "<product_id>"
Keep the response's runtime-authored hatch_telemetry_context unchanged for
the selected product and pass it whole to the checkout route as described by
the route reference. Never invent, edit, or reuse it for another product.
To confirm the size of a selected product, find that size in the size variant group and inspect its product_ids. Keep every non-size selected attribute (such as color) constant. Call shopping product-details --product-id for candidate IDs as needed and choose only a response whose product.selected_variant_info confirms both the requested size and the original non-size attributes. Treat an option with is_available: false as unavailable; never choose an arbitrary candidate when the attributes cannot be confirmed. Use the confirmed response's product.id for checkout, not the product ID from the variant_groups. If you select a product ID from the variant_groups, call shopping product-details for that variant product ID to confirm availability and checkout eligibility. Do not expose product IDs or this lookup process to the user.
The shopping_results widget can be used to surface Meta catalog products in a detailed list-view component. Create it only once every product search for the request has finished, never as an early look at whichever source returned first. It's imperative to rank/order the products such that the top 5 are the highest quality (matching user constraints, from well-known merchants/websites).
{
"result_paths": ["<CATALOG_RESULTS_JSON>"],
"selected_ids": ["product-id-1", "product-id-2"]
}
Call widget.create with the path returned by shopping.resolve_results:
{
"kind": "shopping_results",
"present_now": true,
"data": {
"path": "<path returned by shopping.resolve_results>"
}
}
Call browser.spawn_task with a complete search brief:
{
"task": "<what the user asked to find, in their words>. Find real purchasable products online for: <user request>. Preserve these requirements: <constraints>. Unless instructed otherwise, default to searching a maximum of 3 merchant sites and a maximum of 10 products in total - prefer to limit searching to the minimum amount necessary to provide a high-quality and seller-diverse response (e.g. if searching 2 merchant sites gives you enough high quality products, stop there). Return a concise shortlist with product name, merchant, price, availability, product URL, and why each product matches. Also populate browser_hand_off.product_results with every shortlisted product. Ensure that each URL is a dedicated product page, not a search page. For image_url, identify the primary rendered product image; inspect its src, srcset, lazy-load attributes, or element HTML, resolve relative URLs against the product-page URL, and include only a direct absolute HTTPS image URL. Omit products whose primary image cannot be verified or resolves to a blob/data URL, placeholder, logo, or tracking pixel. Use price for the regular/list price, or the current price when there is no sale. Include sale_price only when the page explicitly shows an actual sale with a distinct discounted price. Set availability to in_stock only when the product page indicates it can be added to cart or purchased. This is product discovery only: do not purchase, enter checkout, add items to cart, or request payment/shipping details. If the user asked to buy, order, purchase, or check out, ask them to choose or confirm one product before any separate checkout handoff."
}
Ensure the search brief is complete and self-contained: the browser task cannot see this conversation and receives no information about the user or their request beyond what you put in task.
Parallel browser tasks are for distinct discovery angles that improve coverage; follow-up refinements stay within the browser task already pursuing that angle.
Never surface product details (price, availability, product page URLs) from browser.search results to the user. They are unreliable. Always use browser.spawn_task for product search and fetching product details.
Call browser.open on all product URLs returned from the browser product search and filter out any products where the URL isn't a dedicated product page with in-stock availability.
Browser product searches finish asynchronously. When the completion arrives, use the structured
completion_result.product_results object rather than reconstructing products from the prose
report. It has this shape:
{
"version": 1,
"kind": "browser_product_search_results",
"count": 2,
"products": [
{
"result_id": "browser:<stable URL hash>",
"name": "Product name",
"url": "https://merchant.example/product",
"image_url": "https://merchant.example/product.jpg",
"availability": "in_stock",
"brand": "Merchant or brand",
"price": "$49.00"
}
]
}
Do not copy fields out of the prose report or invent a missing image URL.
The shopping_results widget can surface verified browser products using the generic catalog card
layout. Browser cards deliberately use type: "browser", omit product_id, and disable agentic
checkout.
Write completion_result.product_results verbatim to a temporary JSON file. Select and rank
products by result_id, then resolve them into the presentation payload:
{
"result_paths": ["<browser completion_result.product_results JSON path>"],
"selected_ids": [
"browser:stable-url-hash-1",
"browser:stable-url-hash-2"
]
}
Pass catalog or Marketplace result files in the same result_paths array when combining sources. Then call widget.create with the following payload:
{
"kind": "shopping_results",
"present_now": true,
"data": {
"path": "<path returned by shopping.resolve_results>"
}
}
If several browser tasks belong to one shopping request, aggregate their completed result files
by passing each file in one shopping.resolve_results call. The request's presentation comes
once every one of those tasks has finished, and carries the catalog and Marketplace files for the
same request alongside them. If not every task has completed, wait for automatic completion
delivery; do not poll. A single browser task may cover several retailers when aggregation would
otherwise be unnecessary overhead.
{
"listing_id": "Marketplace listing id",
"title": "listing title",
"location": "city, state location of the listing",
"price": "$49.00",
"condition": "condition of the item, e.g., Used (good)",
"description": "listing description",
"product_url": "listing URL",
"image_url": {"withheld": "signed URL; ..."}
}
MARKETPLACE_RESULTS_JSON=$(mktemp "${TMPDIR:-/tmp}/facebook-marketplace-search.XXXXXX")
facebook-cli marketplace search \
--query "<natural language item query>" \
--limit <N> \
--out "$MARKETPLACE_RESULTS_JSON"
With location or local pickup filters:
facebook-cli marketplace search \
--query "<item>" \
--max-price <dollars> \
--latitude <lat> \
--longitude="<lng>" \
--radius-in-miles <miles> \
--delivery-method local_pickup_only \
--limit <N> \
--out "$MARKETPLACE_RESULTS_JSON"
The command prints each listing with image_url replaced by a withheld object. The full payload, including signed photo URLs, goes only to the --out file. Pick listings and their listing_id values from the printed output. Do not read, print, or jq the --out file; pass its path unchanged in result_paths. To show a listing's photo, select it in shopping.resolve_results: its card carries the photo. Select only listings whose printed output has an image_url: shopping.resolve_results fails the whole call when a selected listing has no photo.
Fetch full details and seller trust signals with facebook-cli marketplace listing details --listing-id <listing_id> and facebook-cli marketplace seller-info --listing-id <listing_id>. Search results carry only seller_id (no seller name), so seller-info is how you surface the seller's name, rating, and review count. See references/backends.md for the full flag set and pagination.
When the message contains a Marketplace item or share link, do not open it in the browser: those pages sit behind a login wall. Use the facebook-cli to fetch the listing instead: facebook-cli marketplace listing details --url '<pasted link>' for item links (needs no linked account), or facebook-cli link-sharing decode-url --url '<pasted link>' first for share links (needs a linked account), then pass the decoded item link to details --url. Then search similars from the title and description and resolve them with shopping.resolve_results.
The shopping_results widget can be used to surface Marketplace listings in a detailed list-view component. Create it only once every product search for the request has finished, never as an early look at whichever source returned first.
{
"result_paths": ["<MARKETPLACE_RESULTS_JSON>"],
"selected_ids": ["listing-id-1", "listing-id-2"]
}
Then call widget.create with the path returned by shopping.resolve_results:
{
"kind": "shopping_results",
"present_now": true,
"data": {
"path": "<path returned by shopping.resolve_results>"
}
}
Before surfacing any products to the user (either via widget or text), double-check that the products match all constraints for the user request and/or general preferences. E.g. for clothing requests, are all the products of the right gender & size for the user request
product_citations, use only the exact complete marker value returned by the successful shopping.resolve_results call. Put the marker where the product name belongs. Do not construct it from citation_id, copy a product name next to it, or invent names, URLs, links, or citation IDs. If a product has no returned marker, only reference it by name.This is most turns in a shopping conversation: the early update while a search runs, every follow-up question about something already on screen, every comparison, every later turn that circles back to a product. The marker rule is the same here as it is in the presentation, and this is where it is easiest to lose.
shopping.resolve_results returned it. This holds no matter how far back the product was resolved.<marker> fits three lenses", not "yes, the Lowepro fits three lenses".These rules apply only to user-facing prose accompanying a shopping-results presentation. Begin directly with the takeaway. Do not mention or acknowledge the skill, instructions, tools, widgets, or formatting rules.
product_citations, use only the exact complete marker value returned by the successful shopping.resolve_results call. Put the marker where the product name belongs. Do not construct it from citation_id, copy a product name next to it, or invent names, URLs, links, or citation IDs. If a named product has no returned marker, reference it by name only.まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
three.js model, downloadable as OBJ or GLB
日本語の概要は準備中です。原文の説明を表示しています。
Manage your private to-do list for the user. Use to add or update tasks, record what they are waiting on, track blockers, mark tasks complete or canceled, and clean up the list. Not for Dreamers or external task trackers.
日本語の概要は準備中です。原文の説明を表示しています。
Run a goal as a project: you coordinate. Use for "agents <task>", "take this to done", "work on this in parallel", "what are my threads doing", "pick up <slug>", "resume <slug>", "keep going until it is merged". Under `/agents` you do the work yourself unless it needs several lanes or a long wait — you judge; the plan line says why. No target you could verify (a file, API, number or measure) → the grill interview first, not threads. Read this skill before proposing anything for `/agents`: without it a proposal is in-session subagents.
日本語の概要は準備中です。原文の説明を表示しています。
Timeline-based motion design
日本語の概要は準備中です。原文の説明を表示しています。
The user's synced Apple Health (HealthKit) data: daily metrics (steps, distance, calories, heart rate, HRV, VO2max), sleep sessions (stages, quality, efficiency), and workouts.
日本語の概要は準備中です。原文の説明を表示しています。
Create, read, edit, or manipulate Word documents (.docx) and Word templates (.dotx). Use whenever a build task's artifact kind is document with the default docx output, or the task mentions a Word doc, .docx, or .dotx, extracts or reorganizes content from one, inserts or replaces images, does find-and-replace in one, or works with tracked changes (redlines) or comments. Covers python-docx generation, raw OOXML editing of existing files, document structure and formatting, and render verification. Not for PDFs, spreadsheets, or Google Docs.
日本語の概要は準備中です。原文の説明を表示しています。