{"server":"io.github.valetdotdev/valet","count":50,"changes":[{"tool":"set_check","kind":"added","observed_at":"2026-10-20T04:07:54.026Z","fields":[],"description_before":null,"description_after":"Add a release check to an organization, or replace the one with the same name. A check runs its checker on every publish. It informs by default: it records results and never refuses a release. effect \"block\" with block_at refuses a release that has a result at or above that severity, or that a checker could not check. list_checks shows the checkers and their settings.\n\nReplacing a check replaces its settings: pass every non-secret setting again. A secret setting you leave out keeps its stored value when the checker is unchanged. Changing a check's checker or effect releases the deploys that waited only on it.\n\nA secret passed in secrets travels through this conversation. That is the user's call to make: if they hand you the key, use it, and say that they could instead run `valet checks add`, which prompts for it without echoing, so it goes straight to Valet. The answer names the fields that were set and never their values. Requires connecting a Valet account.","description_similarity":null,"before_hash":null,"after_hash":"7ae25404e4c34cafb3ca59666f8ae5f6"},{"tool":"publish_site","kind":"changed","observed_at":"2026-10-20T04:07:54.026Z","fields":["description"],"description_before":"Publish files as a live website, served over HTTPS at its own URL. Use it when a report, essay, slide-like narrative, dashboard, marketing surface, or other static artifact reads better at a live URL than as conversation text. Honor an artifact form the user requests. Otherwise choose the artifact form and treatment from its audience, job, and material. A request for a live URL chooses delivery, not one long scrolling page.\n\nApply the governance skill before calling: get_skill with governance says what the organization expects of a published page and names the design-system skill, which supplies identity, not structure. Follow each wherever it speaks.\n\ntitle and description are required on every publish of files, and a call missing either is refused: title names the site for a person, and description says in one sentence what it holds. A site's name becomes part of its URL, so those two are what a reader has to go on wherever the site is listed. Write them for the person who will come back to this page in a month.\n\nContent is text written here: HTML, CSS, JavaScript, Markdown, JSON, SVG. Images, PDFs, video, and other binary assets are not supported in files — publish those with the Valet CLI, or with push.\n\nSend the site one of two ways. files carries the text of the pages in the call, which suits a few small pages and works from any client. push: {id, commit} publishes a commit you pushed with git: call create_push, run the recipe it returns, then pass the push_id and the commit sha it prints. Use push when you can run git with network access, when the site is large or holds binary files, or when you changed a clone of its source; it needs a site that exists and an account, not anonymous. Pass files or push, not both.\n\nPublishing uses a connected Valet account by default and changes a permanent, private site that already exists: create it first with create_service (kind: site), then publish to its name. A name that holds no site is refused. Pass anonymous: true only when the user explicitly wants a temporary public site, which needs no create_service. It is public to anyone who has the link, and it may be removed 36 hours after it is created, unless it is claimed. The result carries a claim URL that moves the site into a Valet account and makes it permanent, and a site_token that updates the same site on a later call. Give that token back to revise the site instead of publishing a second copy of it; with an account, give the site's name instead.\n\nIn an organization that checks releases, an account publish may answer with check instead of a version: the release is built and waits for its checks, and get_check follows it.","description_after":"Publish files as a live website, served over HTTPS at its own URL. Use it when a report, essay, slide-like narrative, dashboard, marketing surface, or other static artifact reads better at a live URL than as conversation text. Honor an artifact form the user requests. Otherwise choose the artifact form and treatment from its audience, job, and material. A request for a live URL chooses delivery, not one long scrolling page.\n\nApply the governance skill before calling: get_skill with governance says what the organization expects of a published page and names the design-system skill, which supplies identity, not structure. Follow each wherever it speaks.\n\ntitle and description are required on every publish of files, and a call missing either is refused: title names the site for a person, and description says in one sentence what it holds. A site's name becomes part of its URL, so those two are what a reader has to go on wherever the site is listed. Write them for the person who will come back to this page in a month.\n\nContent is text written here: HTML, CSS, JavaScript, Markdown, JSON, SVG. Images, PDFs, video, and other binary assets are not supported in files — publish those with the Valet CLI, or with push.\n\nSend the site one of two ways. files carries the text of the pages in the call, which suits a few small pages and works from any client. push: {id, commit} publishes a commit you pushed with git: call create_push, run the recipe it returns, then pass the push_id and the commit sha it prints. Use push when you can run git with network access, when the site is large or holds binary files, or when you changed a clone of its source; it needs a site that exists and an account, not anonymous. Pass files or push, not both.\n\nPublishing uses a connected Valet account by default and changes a permanent, private site that already exists: create it first with create_service (kind: site), then publish to its name. A name that holds no site is refused. Pass anonymous: true only when the user explicitly wants a temporary public site, which needs no create_service. It is public to anyone who has the link, and it may be removed 36 hours after it is created, unless it is claimed. The result carries a claim URL that moves the site into a Valet account and makes it permanent, and a site_token that updates the same site on a later call. Give that token back to revise the site instead of publishing a second copy of it; with an account, give the site's name instead.\n\nIn an organization that checks releases, an account publish may answer with check instead of a version: the release is built and waits for its checks, and get_check with wait_seconds 20 follows it.","description_similarity":0.987,"before_hash":"281ecf2930311739fe4220798fdc67e3","after_hash":"554c1ee625fb6ff79d502937e2eadcd1"},{"tool":"publish_agent","kind":"changed","observed_at":"2026-10-20T04:07:54.026Z","fields":["description"],"description_before":"Publish source as an agent: a SOUL.md describing who it is, a valet.yaml declaring the skills, connectors, channels, and configuration it runs with, and any supporting files. Use it when the work is an agent that answers on a channel or runs on a schedule, not a website or an app. Apply the governance skill before calling.\n\nSend the agent one of two ways. files carries it in the call, which works from any client. push: {id, commit} publishes a commit you pushed with git: call create_push, run the recipe it returns, then pass the push_id and the commit sha it prints. Use push when you can run git with network access or when you changed a clone of the agent's source; a push that builds on a main that has since moved is merged onto it as a deploy is. Pass files or push, not both.\n\nThe tree, in files or in the commit, must include valet.yaml and SOUL.md at the root. Unlike a website's or an app's, an agent's valet.yaml is yours: Valet validates it rather than writing it, and refuses one the agent rules reject. An organization connector or channel the manifest names is attached for you. When the manifest names one the organization does not have, or a skill that does not resolve, nothing deploys and the answer lists what is pending and the tool that sets each up; do that and call again with the same files.\n\nPublishing changes an agent that exists: create it first with create_service (kind: agent), then publish to its name. A name that holds no agent is refused. Publishing replaces the agent's source with these files, so read get_source first when the agent is not yours. An agent deploy finishes before this call returns: the answer carries the release version, and get_service reports whether the agent is running and what it holds. In an organization that checks releases, the answer may carry check instead of a version: the release is built and waits for its checks, and get_check follows it. Requires connecting a Valet account.","description_after":"Publish source as an agent: a SOUL.md describing who it is, a valet.yaml declaring the skills, connectors, channels, and configuration it runs with, and any supporting files. Use it when the work is an agent that answers on a channel or runs on a schedule, not a website or an app. Apply the governance skill before calling.\n\nSend the agent one of two ways. files carries it in the call, which works from any client. push: {id, commit} publishes a commit you pushed with git: call create_push, run the recipe it returns, then pass the push_id and the commit sha it prints. Use push when you can run git with network access or when you changed a clone of the agent's source; a push that builds on a main that has since moved is merged onto it as a deploy is. Pass files or push, not both.\n\nThe tree, in files or in the commit, must include valet.yaml and SOUL.md at the root. Unlike a website's or an app's, an agent's valet.yaml is yours: Valet validates it rather than writing it, and refuses one the agent rules reject. An organization connector or channel the manifest names is attached for you. When the manifest names one the organization does not have, or a skill that does not resolve, nothing deploys and the answer lists what is pending and the tool that sets each up; do that and call again with the same files.\n\nPublishing changes an agent that exists: create it first with create_service (kind: agent), then publish to its name. A name that holds no agent is refused. Publishing replaces the agent's source with these files, so read get_source first when the agent is not yours. An agent deploy finishes before this call returns: the answer carries the release version, and get_service reports whether the agent is running and what it holds. In an organization that checks releases, the answer may carry check instead of a version: the release is built and waits for its checks, and get_check with wait_seconds 20 follows it. Requires connecting a Valet account.","description_similarity":0.981,"before_hash":"ce79d5393acc5eb22147ae73aafd344e","after_hash":"ddbc2454dfdadeeee928151cc03a52ec"},{"tool":"list_checks","kind":"added","observed_at":"2026-10-20T04:07:54.026Z","fields":[],"description_before":null,"description_after":"List the release checks an organization runs on every publish, and the checkers it can configure. Each check shows its checker, its effect (inform, or block at a severity), its settings, and how its runs came out over the last 30 days. A secret setting shows as (set), never its value. Call it before publishing to see what will be checked, and fix what you can first. A blocking check refuses a release with a result at or above its severity; an informing check reports and never refuses. Requires connecting a Valet account.","description_similarity":null,"before_hash":null,"after_hash":"975ece75bfc0fa20df7073c175304a77"},{"tool":"get_check","kind":"changed","observed_at":"2026-10-20T04:07:54.026Z","fields":["description","inputSchema"],"description_before":"Follow the release check of a publish: its status, each check's run with its checker, effect, and status, each blocking result with the file and line or package, the rule, and how to fix it, what deploy did with the release, and what to do next. Omit check_id for the service's latest check. Call it again shortly while deploy_state is waiting: a passed check's release goes live, and a blocked or errored one's is refused, shortly after. Requires connecting a Valet account.","description_after":"Follow the release check of a publish: its status, each check's run with its checker, effect, and status, each blocking result with the file and line or package, the rule, and how to fix it, each advisory result the same way (advisory results never block), what deploy did with the release, and what to do next. Omit check_id for the service's latest check. Pass wait_seconds 20 to wait up to 20 seconds for the check or the deploy to change before answering. While the answer carries retry_after_seconds, call again with wait_seconds 20: a passed check's release goes live, and a blocked or errored one's is refused, shortly after. Requires connecting a Valet account.","description_similarity":0.74,"before_hash":"a1787a6b51a06144ec4d3dd1be0ede1b","after_hash":"9701e431ccb53c8b06bd48bb02eafc78"},{"tool":"get_build","kind":"changed","observed_at":"2026-10-20T04:07:54.026Z","fields":["description"],"description_before":"Follow a build publish_app started: its state, the log it has written so far, and, once it succeeds, the release it produced, the URL that serves it, and its deploy: deploy_state and every process with the release it targets and the release it runs. Poll every ten to fifteen seconds until deploy_state is up, crashed, or refused, or the build failed; most deploys finish within five minutes. checking means the release waits for the organization's release checks: follow check.id with get_check. refused means it will not go live; get_check says why. starting means a process is still booting the release. crashed means a process kept failing on it and was stopped: a web process that had a running release keeps serving it, so a working URL does not prove the new release is live, and other crashed processes are down until fixed. Its state_reason says why. When it is the app's own output, usually a start command that exited or a server not listening on $PORT, fix the code and publish again; when it names a platform or configuration failure, fix that or publish again. A failed build's log is where the reason is, usually a missing dependency. Requires connecting a Valet account.","description_after":"Follow a build publish_app started: its state, the log it has written so far, and, once it succeeds, the release it produced, the URL that serves it, and its deploy: deploy_state and every process with the release it targets and the release it runs. Poll every ten to fifteen seconds until deploy_state is up, crashed, or refused, or the build failed; most deploys finish within five minutes. checking means the release waits for the organization's release checks: follow check.id with get_check and wait_seconds 20. refused means it will not go live; get_check says why. starting means a process is still booting the release. crashed means a process kept failing on it and was stopped: a web process that had a running release keeps serving it, so a working URL does not prove the new release is live, and other crashed processes are down until fixed. Its state_reason says why. When it is the app's own output, usually a start command that exited or a server not listening on $PORT, fix the code and publish again; when it names a platform or configuration failure, fix that or publish again. A failed build's log is where the reason is, usually a missing dependency. Requires connecting a Valet account.","description_similarity":0.982,"before_hash":"81050256f27091da43445ee8e34592e7","after_hash":"4c5a38137da2383fe9571b8efb429229"},{"tool":"destroy_check","kind":"added","observed_at":"2026-10-20T04:07:54.026Z","fields":[],"description_before":null,"description_after":"Destroy one of an organization's release checks by name. Releases that wait only on that check go live without it, so confirm with the user first. Past runs stay on the releases they checked. Destroying a check that is already gone changes nothing. Requires connecting a Valet account.","description_similarity":null,"before_hash":null,"after_hash":"9615745b5857af3054bf203582cecf52"},{"tool":"create_skill","kind":"changed","observed_at":"2026-10-20T04:07:54.026Z","fields":["inputSchema"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"d7e68b239784dbf2e81645c70e2b55e3","after_hash":"80d8c7ed985238c1986b67fc32c9c9a4"},{"tool":"publish_skill","kind":"changed","observed_at":"2026-10-19T22:11:28.104Z","fields":["description","inputSchema"],"description_before":"Publish the next version of an organization skill that exists, from files or a Git push, like the other publish tools. A new skill starts with create_skill; a name that holds no skill is refused. files is a SKILL.md and any supporting files, each as a path and its text content, and replaces the whole skill; skill defaults to the SKILL.md frontmatter name. push is the id create_push returned and the commit you pushed, which carries any file; skill is required with it. The SKILL.md frontmatter must name the skill. Publishing under a well-known name, such as governance, security, or design-system, replaces what Valet would otherwise supply for every agent in the organization from the next read on, so do it when the user has asked to change how the organization works, and show them the content first; its first publish works without create_skill. A skill under a new name is one the default governance process finds through list_skills when its description applies.\n\nDestructive because it replaces the previous version's content for every reader. Repeating a call with identical content mints no new version and reports deduped. Requires connecting a Valet account.","description_after":"Publish the next version of an organization skill that exists. To share a skill with the team, such as one the user keeps locally, call create_skill and then this; every member's agent can then read it. Pass exactly one of edits, files, or push. Prefer edits to change some files of a skill: each replaces or adds one file and keeps every other file, binary files included. files replaces the whole skill with a SKILL.md and any supporting text files, and drops every file it leaves out, binary files included. push is the id create_push returned and the commit you pushed, which carries any file. skill is required with edits and push; with files it defaults to the SKILL.md frontmatter name. The SKILL.md frontmatter must name the skill.\n\nPass base_version, the version get_skill reported, so a teammate's publish in between is not overwritten. It is required with edits. When the skill has moved past it, nothing is published: read the skill again and redo the change. A new skill starts with create_skill; a name that holds no skill is refused.\n\nPublishing under a well-known name, such as governance, security, or design-system, replaces what Valet would otherwise supply for every agent in the organization from the next read on, so do it when the user has asked to change how the organization works, and show them the content first; its first publish works without create_skill. A skill under a new name is one the default governance process finds through list_skills when its description applies.\n\nDestructive because it replaces the previous version's content for every reader. Repeating a call with identical content mints no new version and reports deduped. Requires connecting a Valet account.","description_similarity":0.746,"before_hash":"a7c3792b8acf363056fdba1b2004489e","after_hash":"665e7afa398badd192bf9f5c41d4292c"},{"tool":"publish_site","kind":"changed","observed_at":"2026-10-19T22:11:28.104Z","fields":["description"],"description_before":"Publish files as a live website, served over HTTPS at its own URL. Use it when a report, essay, slide-like narrative, dashboard, marketing surface, or other static artifact reads better at a live URL than as conversation text. Honor an artifact form the user requests. Otherwise choose the artifact form and treatment from its audience, job, and material. A request for a live URL chooses delivery, not one long scrolling page.\n\nApply the governance skill before calling: get_skill with governance says what the organization expects of a published page and names the design-system skill, which supplies identity, not structure. Follow each wherever it speaks.\n\ntitle and description are required on every publish of files, and a call missing either is refused: title names the site for a person, and description says in one sentence what it holds. A site's name becomes part of its URL, so those two are what a reader has to go on wherever the site is listed. Write them for the person who will come back to this page in a month.\n\nContent is text written here: HTML, CSS, JavaScript, Markdown, JSON, SVG. Images, PDFs, video, and other binary assets are not supported in files — publish those with the Valet CLI, or with push.\n\nSend the site one of two ways. files carries the text of the pages in the call, which suits a few small pages and works from any client. push: {id, commit} publishes a commit you pushed with git: call create_push, run the recipe it returns, then pass the push_id and the commit sha it prints. Use push when you can run git with network access, when the site is large or holds binary files, or when you changed a clone of its source; it needs a site that exists and an account, not anonymous. Pass files or push, not both.\n\nPublishing uses a connected Valet account by default and changes a permanent, private site that already exists: create it first with create_service (kind: site), then publish to its name. A name that holds no site is refused. Pass anonymous: true only when the user explicitly wants a temporary public site, which needs no create_service. It is public to anyone who has the link, and it may be removed 36 hours after it is created, unless it is claimed. The result carries a claim URL that moves the site into a Valet account and makes it permanent, and a site_token that updates the same site on a later call. Give that token back to revise the site instead of publishing a second copy of it; with an account, give the site's name instead.","description_after":"Publish files as a live website, served over HTTPS at its own URL. Use it when a report, essay, slide-like narrative, dashboard, marketing surface, or other static artifact reads better at a live URL than as conversation text. Honor an artifact form the user requests. Otherwise choose the artifact form and treatment from its audience, job, and material. A request for a live URL chooses delivery, not one long scrolling page.\n\nApply the governance skill before calling: get_skill with governance says what the organization expects of a published page and names the design-system skill, which supplies identity, not structure. Follow each wherever it speaks.\n\ntitle and description are required on every publish of files, and a call missing either is refused: title names the site for a person, and description says in one sentence what it holds. A site's name becomes part of its URL, so those two are what a reader has to go on wherever the site is listed. Write them for the person who will come back to this page in a month.\n\nContent is text written here: HTML, CSS, JavaScript, Markdown, JSON, SVG. Images, PDFs, video, and other binary assets are not supported in files — publish those with the Valet CLI, or with push.\n\nSend the site one of two ways. files carries the text of the pages in the call, which suits a few small pages and works from any client. push: {id, commit} publishes a commit you pushed with git: call create_push, run the recipe it returns, then pass the push_id and the commit sha it prints. Use push when you can run git with network access, when the site is large or holds binary files, or when you changed a clone of its source; it needs a site that exists and an account, not anonymous. Pass files or push, not both.\n\nPublishing uses a connected Valet account by default and changes a permanent, private site that already exists: create it first with create_service (kind: site), then publish to its name. A name that holds no site is refused. Pass anonymous: true only when the user explicitly wants a temporary public site, which needs no create_service. It is public to anyone who has the link, and it may be removed 36 hours after it is created, unless it is claimed. The result carries a claim URL that moves the site into a Valet account and makes it permanent, and a site_token that updates the same site on a later call. Give that token back to revise the site instead of publishing a second copy of it; with an account, give the site's name instead.\n\nIn an organization that checks releases, an account publish may answer with check instead of a version: the release is built and waits for its checks, and get_check follows it.","description_similarity":0.96,"before_hash":"8e4e7940429a76244819f63b76e1474f","after_hash":"281ecf2930311739fe4220798fdc67e3"},{"tool":"publish_app","kind":"changed","observed_at":"2026-10-19T22:11:28.104Z","fields":["description"],"description_before":"Publish source as an app: a process Valet builds from your files and runs behind its own URL. Use it when the work needs a server, a background process, or a database. A Procfile at the root says how to start each process type; the web type serves the app's URL and must listen on $PORT, which Valet sets. Node, Python, and Go are supported. Apply the governance skill before calling.\n\ntitle and description are required with files and a call missing either is refused: Valet writes the app's valet.yaml from them, and any valet.yaml in files is replaced. Content is text: source files, lockfiles, Procfile, configuration. Images and other binary assets are not supported in files. Dependencies are installed during the build from the manifest you publish: package.json, with a lockfile only as the dependencies skill says; requirements.txt; or go.mod, where go.sum is optional and the build completes it. Do not include installed packages.\n\nSend the app one of two ways. files carries the source in the call, which works from any client. push: {id, commit} publishes a commit you pushed with git: call create_push, run the recipe it returns, then pass the push_id and the commit sha it prints. Use push when you can run git with network access, when the app is large or holds binary files, or when you changed a clone of its source; the app's own valet.yaml and Procfile come from the commit. Pass files or push, not both.\n\nPublishing changes an app that exists: create it first with create_service (kind: app), then publish to its name. A name that holds no app is refused. Publishing replaces the app's source with these files, so read get_source first when the app is not yours. The publish returns a build id. Poll get_build until deploy_state is up or crashed; the first deploy can take a few minutes. A build that succeeded is not yet live: its processes still have to start on the new release. On crashed, a web process that had a running release keeps serving it, so a working URL does not prove the new release is live; other crashed processes are down until fixed. Read each crashed process's state_reason: if it is the app's own output, fix the code and publish again; if it names a platform or configuration failure, fix that or publish again. The Set environment variables and attach resources once the app exists: set_env_vars and attach_resource each restart the app with its new variables. Write the app to start without them and serve a page saying what is missing, never exiting, and give the user the URL once its resources are attached. A new app is private: only members of the organization that owns it can open it, after signing in to Valet. Use set_service_access to make it public or password-protected. Requires connecting a Valet account.","description_after":"Publish source as an app: a process Valet builds from your files and runs behind its own URL. Use it when the work needs a server, a background process, or a database. A Procfile at the root says how to start each process type; the web type serves the app's URL and must listen on $PORT, which Valet sets. Node, Python, and Go are supported. Apply the governance skill before calling.\n\ntitle and description are required with files and a call missing either is refused: Valet writes the app's valet.yaml from them, and any valet.yaml in files is replaced. Content is text: source files, lockfiles, Procfile, configuration. Images and other binary assets are not supported in files. Dependencies are installed during the build from the manifest you publish: package.json, with a lockfile only as the dependencies skill says; requirements.txt; or go.mod, where go.sum is optional and the build completes it. Do not include installed packages.\n\nSend the app one of two ways. files carries the source in the call, which works from any client. push: {id, commit} publishes a commit you pushed with git: call create_push, run the recipe it returns, then pass the push_id and the commit sha it prints. Use push when you can run git with network access, when the app is large or holds binary files, or when you changed a clone of its source; the app's own valet.yaml and Procfile come from the commit. Pass files or push, not both.\n\nPublishing changes an app that exists: create it first with create_service (kind: app), then publish to its name. A name that holds no app is refused. Publishing replaces the app's source with these files, so read get_source first when the app is not yours. The publish returns a build id. Poll get_build until deploy_state is up, crashed, or refused; checking means the release waits for the organization's release checks. The first deploy can take a few minutes. A build that succeeded is not yet live: its processes still have to start on the new release. On crashed, a web process that had a running release keeps serving it, so a working URL does not prove the new release is live; other crashed processes are down until fixed. Read each crashed process's state_reason: if it is the app's own output, fix the code and publish again; if it names a platform or configuration failure, fix that or publish again. The Set environment variables and attach resources once the app exists: set_env_vars and attach_resource each restart the app with its new variables. Write the app to start without them and serve a page saying what is missing, never exiting, and give the user the URL once its resources are attached. A new app is private: only members of the organization that owns it can open it, after signing in to Valet. Use set_service_access to make it public or password-protected. Requires connecting a Valet account.","description_similarity":0.977,"before_hash":"52f8a01b424b5eeaa17fee00dadef6e2","after_hash":"fc19498303e762ffa31d9c1d91e8474f"},{"tool":"publish_agent","kind":"changed","observed_at":"2026-10-19T22:11:28.104Z","fields":["description"],"description_before":"Publish source as an agent: a SOUL.md describing who it is, a valet.yaml declaring the skills, connectors, channels, and configuration it runs with, and any supporting files. Use it when the work is an agent that answers on a channel or runs on a schedule, not a website or an app. Apply the governance skill before calling.\n\nSend the agent one of two ways. files carries it in the call, which works from any client. push: {id, commit} publishes a commit you pushed with git: call create_push, run the recipe it returns, then pass the push_id and the commit sha it prints. Use push when you can run git with network access or when you changed a clone of the agent's source; a push that builds on a main that has since moved is merged onto it as a deploy is. Pass files or push, not both.\n\nThe tree, in files or in the commit, must include valet.yaml and SOUL.md at the root. Unlike a website's or an app's, an agent's valet.yaml is yours: Valet validates it rather than writing it, and refuses one the agent rules reject. An organization connector or channel the manifest names is attached for you. When the manifest names one the organization does not have, or a skill that does not resolve, nothing deploys and the answer lists what is pending and the tool that sets each up; do that and call again with the same files.\n\nPublishing changes an agent that exists: create it first with create_service (kind: agent), then publish to its name. A name that holds no agent is refused. Publishing replaces the agent's source with these files, so read get_source first when the agent is not yours. An agent deploy finishes before this call returns: the answer carries the release version, and get_service reports whether the agent is running and what it holds. Requires connecting a Valet account.","description_after":"Publish source as an agent: a SOUL.md describing who it is, a valet.yaml declaring the skills, connectors, channels, and configuration it runs with, and any supporting files. Use it when the work is an agent that answers on a channel or runs on a schedule, not a website or an app. Apply the governance skill before calling.\n\nSend the agent one of two ways. files carries it in the call, which works from any client. push: {id, commit} publishes a commit you pushed with git: call create_push, run the recipe it returns, then pass the push_id and the commit sha it prints. Use push when you can run git with network access or when you changed a clone of the agent's source; a push that builds on a main that has since moved is merged onto it as a deploy is. Pass files or push, not both.\n\nThe tree, in files or in the commit, must include valet.yaml and SOUL.md at the root. Unlike a website's or an app's, an agent's valet.yaml is yours: Valet validates it rather than writing it, and refuses one the agent rules reject. An organization connector or channel the manifest names is attached for you. When the manifest names one the organization does not have, or a skill that does not resolve, nothing deploys and the answer lists what is pending and the tool that sets each up; do that and call again with the same files.\n\nPublishing changes an agent that exists: create it first with create_service (kind: agent), then publish to its name. A name that holds no agent is refused. Publishing replaces the agent's source with these files, so read get_source first when the agent is not yours. An agent deploy finishes before this call returns: the answer carries the release version, and get_service reports whether the agent is running and what it holds. In an organization that checks releases, the answer may carry check instead of a version: the release is built and waits for its checks, and get_check follows it. Requires connecting a Valet account.","description_similarity":0.943,"before_hash":"e2da2a790e0eebbb55a133457798de1f","after_hash":"ce79d5393acc5eb22147ae73aafd344e"},{"tool":"list_skills","kind":"changed","observed_at":"2026-10-19T22:11:28.104Z","fields":["description"],"description_before":"List every skill the organization has: the well-known names with whichever source currently answers for each, then every skill the organization wrote or installed from the catalog. Each row carries the skill's description, which is the sentence saying when it applies. The governance skill tells you to call this and read every skill whose description applies to the work at hand; this is how an organization's own standards reach you without anyone naming them. Names and descriptions only; get_skill reads content. Requires connecting a Valet account.","description_after":"List every skill the organization has: the well-known names with whichever source currently answers for each, then every skill the organization wrote or installed from the catalog. Each row carries the skill's description, which is the sentence saying when it applies. The organization's skills are how it shares know-how with every member's agent, for any work done for it, not only work on Valet. Call this when a task might be covered by how the organization works, and read a matching skill with get_skill before starting. The governance skill also tells you to call it before Valet work. Names and descriptions only; get_skill reads content. Requires connecting a Valet account.","description_similarity":0.631,"before_hash":"15688b41ab34d3c580a2a3bd5ee500f4","after_hash":"31254b7f39ac53082f99ef21a4c475d1"},{"tool":"get_skill","kind":"changed","observed_at":"2026-10-19T22:11:28.104Z","fields":["description","inputSchema"],"description_before":"Get one skill by name: the organization's own when it has published one under that name, otherwise the default Valet supplies for a well-known name. Call it with governance before any work and again before any publish; that skill says what the organization expects and names the other skills to read. Call it with any name list_skills reports, or any name the governance skill tells you to read.\n\nThe result says where the skill came from. source: org is the organization's own content and overrides anything Valet would have said. source: default is Valet's, returned because the organization has not written its own; for design-system it is the preset the organization selected, and reason says why a selection could not be honored when one could not. Supporting files are listed by path; read one by calling get_skill again with the same skill and that path. A skill's SKILL.md says which files to read; do not read every file on principle. Binary files are listed but not returned.\n\nPass git: true instead, when you can run git with network access, to get a read-only Git URL for the organization's skill, the commit of its latest version, and the commands to clone it and check out that commit, which main may briefly be ahead of; then change it through create_push and publish_skill with push. The URL expires in an hour and cannot push; do not share or log it. A well-known name the organization has no copy of has nothing to clone until create_skill makes one. git cannot be combined with path.\n\nBy default this requires a connected account. Pass anonymous: true only when building an explicitly anonymous site; no organization is then consulted, and only a well-known name has an answer.","description_after":"Get one skill by name: the organization's own when it has published one under that name, otherwise the default Valet supplies for a well-known name. Call it with governance before any work and again before any publish; that skill says what the organization expects and names the other skills to read. Call it with any name list_skills reports, or any name the governance skill tells you to read. Read a skill before starting any task its description covers, Valet work or not.\n\nThe result says where the skill came from and its version. Pass its version to publish_skill as base_version when you change the skill. source: org is the organization's own content and overrides anything Valet would have said. source: default is Valet's, returned because the organization has not written its own; for design-system it is the preset the organization selected, and reason says why a selection could not be honored when one could not. Supporting files are listed by path; read one by calling get_skill again with the same skill and that path. A skill's SKILL.md says which files to read; do not read every file on principle. Binary files are listed but not returned.\n\nPass git: true instead, when you can run git with network access, to get a read-only Git URL for the organization's skill, its latest version and that version's commit, and the commands to clone it and check out that commit, which main may briefly be ahead of; then change it through create_push and publish_skill with push, and pass that version to publish_skill as base_version. The URL expires in an hour and cannot push; do not share or log it. A well-known name the organization has no copy of has nothing to clone until create_skill makes one. git cannot be combined with path.\n\nBy default this requires a connected account. Pass anonymous: true only when building an explicitly anonymous site; no organization is then consulted, and only a well-known name has an answer.","description_similarity":0.959,"before_hash":"c26e4c3bf091c5d206b913cbfee3fe28","after_hash":"0485ca427caa077a8528900ba56dcecf"},{"tool":"get_check","kind":"added","observed_at":"2026-10-19T22:11:28.104Z","fields":[],"description_before":null,"description_after":"Follow the release check of a publish: its status, each check's run with its checker, effect, and status, each blocking result with the file and line or package, the rule, and how to fix it, what deploy did with the release, and what to do next. Omit check_id for the service's latest check. Call it again shortly while deploy_state is waiting: a passed check's release goes live, and a blocked or errored one's is refused, shortly after. Requires connecting a Valet account.","description_similarity":null,"before_hash":null,"after_hash":"a1787a6b51a06144ec4d3dd1be0ede1b"},{"tool":"get_build","kind":"changed","observed_at":"2026-10-19T22:11:28.104Z","fields":["description"],"description_before":"Follow a build publish_app started: its state, the log it has written so far, and, once it succeeds, the release it produced, the URL that serves it, and its deploy: deploy_state and every process with the release it targets and the release it runs. Poll every ten to fifteen seconds until deploy_state is up or crashed, or the build failed; most deploys finish within five minutes. starting means a process is still booting the release. crashed means a process kept failing on it and was stopped: a web process that had a running release keeps serving it, so a working URL does not prove the new release is live, and other crashed processes are down until fixed. Its state_reason says why. When it is the app's own output, usually a start command that exited or a server not listening on $PORT, fix the code and publish again; when it names a platform or configuration failure, fix that or publish again. A failed build's log is where the reason is, usually a missing dependency. Requires connecting a Valet account.","description_after":"Follow a build publish_app started: its state, the log it has written so far, and, once it succeeds, the release it produced, the URL that serves it, and its deploy: deploy_state and every process with the release it targets and the release it runs. Poll every ten to fifteen seconds until deploy_state is up, crashed, or refused, or the build failed; most deploys finish within five minutes. checking means the release waits for the organization's release checks: follow check.id with get_check. refused means it will not go live; get_check says why. starting means a process is still booting the release. crashed means a process kept failing on it and was stopped: a web process that had a running release keeps serving it, so a working URL does not prove the new release is live, and other crashed processes are down until fixed. Its state_reason says why. When it is the app's own output, usually a start command that exited or a server not listening on $PORT, fix the code and publish again; when it names a platform or configuration failure, fix that or publish again. A failed build's log is where the reason is, usually a missing dependency. Requires connecting a Valet account.","description_similarity":0.9,"before_hash":"566fb757f2cf5d18aac695cf7a55515e","after_hash":"81050256f27091da43445ee8e34592e7"},{"tool":"create_skill","kind":"changed","observed_at":"2026-10-19T22:11:28.104Z","fields":["description"],"description_before":"Create an empty organization skill, before publishing to it. This is the first step for a new skill: publish_skill and create_push change a skill that exists and refuse a name that does not. Its repository starts from a starter SKILL.md, or, for a well-known name such as governance or design-system, from Valet's default, so a clone or a push begins from that text. Nothing is published until publish_skill runs: agents and list_skills see no version yet. A name the organization's own skill already holds is refused. With catalog, it instead installs that skill from Valet's curated catalog: the organization gets its own copy, published as v1, that changes only when the organization publishes it. An organization that installed it before gets its copy back unchanged. Requires connecting a Valet account.","description_after":"Create an empty organization skill, before publishing to it. Use it, then publish_skill, when the user wants to share a skill with their team, such as one they keep locally: every member's agent then finds it through list_skills. This is the first step for a new skill: publish_skill and create_push change a skill that exists and refuse a name that does not. Its repository starts from a starter SKILL.md, or, for a well-known name such as governance or design-system, from Valet's default, so a clone or a push begins from that text. Nothing is published until publish_skill runs: agents and list_skills see no version yet. A name the organization's own skill already holds is refused. With catalog, it instead installs that skill from Valet's curated catalog: the organization gets its own copy, published as v1, that changes only when the organization publishes it. An organization that installed it before gets its copy back unchanged. Requires connecting a Valet account.","description_similarity":0.835,"before_hash":"7c71ea81fa49d357bb5525599d28bd8e","after_hash":"d7e68b239784dbf2e81645c70e2b55e3"},{"tool":"publish_skill","kind":"changed","observed_at":"2026-10-18T03:17:20.344Z","fields":["description","inputSchema"],"description_before":"Create or replace an organization skill from files: a SKILL.md and any supporting files, each as a path and its text content. The skill's name and description come from the SKILL.md frontmatter. Publishing under a well-known name, such as governance, security, or design-system, replaces what Valet would otherwise supply for every agent in the organization from the next read on, so do it when the user has asked to change how the organization works, and show them the content first. Publishing under a new name adds a skill the default governance process finds through list_skills when its description applies.\n\nDestructive because it replaces the previous version's content for every reader. Repeating a call with identical content mints no new version and reports deduped. Requires connecting a Valet account.","description_after":"Publish the next version of an organization skill that exists, from files or a Git push, like the other publish tools. A new skill starts with create_skill; a name that holds no skill is refused. files is a SKILL.md and any supporting files, each as a path and its text content, and replaces the whole skill; skill defaults to the SKILL.md frontmatter name. push is the id create_push returned and the commit you pushed, which carries any file; skill is required with it. The SKILL.md frontmatter must name the skill. Publishing under a well-known name, such as governance, security, or design-system, replaces what Valet would otherwise supply for every agent in the organization from the next read on, so do it when the user has asked to change how the organization works, and show them the content first; its first publish works without create_skill. A skill under a new name is one the default governance process finds through list_skills when its description applies.\n\nDestructive because it replaces the previous version's content for every reader. Repeating a call with identical content mints no new version and reports deduped. Requires connecting a Valet account.","description_similarity":0.735,"before_hash":"24b217c11e3d5dc58cddd91c90711e13","after_hash":"a7c3792b8acf363056fdba1b2004489e"},{"tool":"get_skill","kind":"changed","observed_at":"2026-10-18T03:17:20.344Z","fields":["description","inputSchema"],"description_before":"Get one skill by name: the organization's own when it has published one under that name, otherwise the default Valet supplies for a well-known name. Call it with governance before any work and again before any publish; that skill says what the organization expects and names the other skills to read. Call it with any name list_skills reports, or any name the governance skill tells you to read.\n\nThe result says where the skill came from. source: org is the organization's own content and overrides anything Valet would have said. source: default is Valet's, returned because the organization has not written its own; for design-system it is the preset the organization selected, and reason says why a selection could not be honored when one could not. Supporting files are listed by path; read one by calling get_skill again with the same skill and that path. A skill's SKILL.md says which files to read; do not read every file on principle. Binary files are listed but not returned.\n\nBy default this requires a connected account. Pass anonymous: true only when building an explicitly anonymous site; no organization is then consulted, and only a well-known name has an answer.","description_after":"Get one skill by name: the organization's own when it has published one under that name, otherwise the default Valet supplies for a well-known name. Call it with governance before any work and again before any publish; that skill says what the organization expects and names the other skills to read. Call it with any name list_skills reports, or any name the governance skill tells you to read.\n\nThe result says where the skill came from. source: org is the organization's own content and overrides anything Valet would have said. source: default is Valet's, returned because the organization has not written its own; for design-system it is the preset the organization selected, and reason says why a selection could not be honored when one could not. Supporting files are listed by path; read one by calling get_skill again with the same skill and that path. A skill's SKILL.md says which files to read; do not read every file on principle. Binary files are listed but not returned.\n\nPass git: true instead, when you can run git with network access, to get a read-only Git URL for the organization's skill, the commit of its latest version, and the commands to clone it and check out that commit, which main may briefly be ahead of; then change it through create_push and publish_skill with push. The URL expires in an hour and cannot push; do not share or log it. A well-known name the organization has no copy of has nothing to clone until create_skill makes one. git cannot be combined with path.\n\nBy default this requires a connected account. Pass anonymous: true only when building an explicitly anonymous site; no organization is then consulted, and only a well-known name has an answer.","description_similarity":0.755,"before_hash":"996d738c5d9d6ef130661173d042691c","after_hash":"c26e4c3bf091c5d206b913cbfee3fe28"},{"tool":"detach_skill","kind":"changed","observed_at":"2026-10-18T03:17:20.344Z","fields":["description"],"description_before":"Detach a skill from an agent. An organization skill stays in the organization for other agents; a catalog skill attached to this agent alone is deleted with the attachment. The agent is rebuilt so it stops carrying the skill. Detaching a skill that is not attached changes nothing. Requires connecting a Valet account.","description_after":"Detach a skill from an agent. The skill stays in the organization for other agents, including an organization copy installed from the catalog. The agent is rebuilt so it stops carrying the skill. Detaching a skill that is not attached changes nothing. Requires connecting a Valet account.","description_similarity":0.769,"before_hash":"5bdfb41807c36e272f90a11fe8c89e3a","after_hash":"2652f8f90df385f66d41ad566eda991e"},{"tool":"destroy_skill","kind":"added","observed_at":"2026-10-18T03:17:20.344Z","fields":[],"description_before":null,"description_after":"Destroy one of the organization's own skills. It leaves list_skills, and its name is free for create_skill. Agents that pinned one of its versions keep resolving that version. Refuses while any agent has the skill attached and names those agents; detach it from each with detach_skill first. Destroying a well-known name such as governance or design-system brings back Valet's default for every agent in the organization. A skill that does not exist is reported as already gone. Requires connecting a Valet account.","description_similarity":null,"before_hash":null,"after_hash":"d26748d1666a17e57327b9dc2a7600dc"},{"tool":"create_skill","kind":"added","observed_at":"2026-10-18T03:17:20.344Z","fields":[],"description_before":null,"description_after":"Create an empty organization skill, before publishing to it. This is the first step for a new skill: publish_skill and create_push change a skill that exists and refuse a name that does not. Its repository starts from a starter SKILL.md, or, for a well-known name such as governance or design-system, from Valet's default, so a clone or a push begins from that text. Nothing is published until publish_skill runs: agents and list_skills see no version yet. A name the organization's own skill already holds is refused. With catalog, it instead installs that skill from Valet's curated catalog: the organization gets its own copy, published as v1, that changes only when the organization publishes it. An organization that installed it before gets its copy back unchanged. Requires connecting a Valet account.","description_similarity":null,"before_hash":null,"after_hash":"7c71ea81fa49d357bb5525599d28bd8e"},{"tool":"create_push","kind":"changed","observed_at":"2026-10-18T03:17:20.344Z","fields":["description","inputSchema"],"description_before":"Open a Git push on a website, app, or agent that exists: a branch of its repository, writable for one hour, that you push source to before you publish. Use it when you can run git with network access; it sends only what changed, so a large service publishes without carrying its files through the conversation. Otherwise publish with files. The service must exist first: create_service makes it. The result carries a Git URL with a credential, the push's id and branch, the commit it starts from, the name and email to commit as, and two recipes with every value filled in: clone the branch and edit, or push a directory as it stands. Run a recipe, then call publish_site, publish_app, or publish_agent with push: {id, commit}, where commit is the sha the recipe prints. The URL writes only this push's branch, cannot force-push, and expires with the push; do not share or log it. A service holds ten open pushes at once. Requires connecting a Valet account.","description_after":"Open a Git push on a website, app, or agent that exists, named by name, or on an organization skill, named by skill: a branch of its repository, writable for one hour, that you push source to before you publish. Use it when you can run git with network access; it sends only what changed, so a large service or skill publishes without carrying its files through the conversation. Otherwise publish with files. The service or skill must exist first: create_service or create_skill makes it. The result carries a Git URL with a credential, the push's id and branch, the commit it starts from, the name and email to commit as, and two recipes with every value filled in: clone the branch and edit, or push a directory as it stands. The limits name the most files, the largest file, and the largest total size a publish may hold; a push over them is refused. Run a recipe, then call publish_site, publish_app, publish_agent, or publish_skill with push: {id, commit}, where commit is the sha the recipe prints. Only you can publish a push you opened. The URL writes only this push's branch, cannot force-push, and expires with the push; do not share or log it. A service or skill holds ten open pushes at once. Requires connecting a Valet account.","description_similarity":0.856,"before_hash":"e1a4ddfe3e561ca5a0434a3b55d04cfe","after_hash":"f4f333cc85aaffd112260e114003c7f1"},{"tool":"attach_skill","kind":"changed","observed_at":"2026-10-18T03:17:20.344Z","fields":["description","inputSchema"],"description_before":"Attach a skill to an agent so the agent can use it. Give skill as catalog:<name> for a skill from Valet's curated catalog, org:<name> or a bare name for a skill the organization published, and add @v<N> to pin a version; without a pin the agent follows the latest. An org skill must already exist (publish_skill creates one). The agent is rebuilt so the change takes effect. A skill that is already attached answers that nothing changed, without a rebuild; one whose name another attached skill holds is refused with nothing changed. Skills attach to agents only. Requires connecting a Valet account.","description_after":"Attach a skill to an agent so the agent can use it. Give skill as org:<name> or a bare name for a skill the organization published, adding @v<N> to pin a version; without a pin the agent follows the latest. An org skill must already exist (create_skill and publish_skill make one). Give catalog:<name> for a skill from Valet's curated catalog: it installs a copy into the organization, or reuses the copy installed before, and attaches it at its latest version. A catalog skill whose name the organization's own skill holds is refused. The agent is rebuilt so the change takes effect. A skill that is already attached answers that nothing changed, without a rebuild; one whose name another attached skill holds is refused with nothing changed. Skills attach to agents only. Requires connecting a Valet account.","description_similarity":0.8,"before_hash":"576495ca4e4d98d7082728fd514eaf0a","after_hash":"f4f52d3314bf7ab767d6f82203efa699"},{"tool":"publish_site","kind":"changed","observed_at":"2026-10-16T09:33:51.824Z","fields":["description","inputSchema"],"description_before":"Publish files as a live website, served over HTTPS at its own URL. Use it when a report, essay, slide-like narrative, dashboard, marketing surface, or other static artifact reads better at a live URL than as conversation text. Honor an artifact form the user requests. Otherwise choose the artifact form and treatment from its audience, job, and material. A request for a live URL chooses delivery, not one long scrolling page.\n\nApply the governance skill before calling: get_skill with governance says what the organization expects of a published page and names the design-system skill, which supplies identity, not structure. Follow each wherever it speaks.\n\ntitle and description are required on every publish, and a call missing either is refused: title names the site for a person, and description says in one sentence what it holds. A site's name becomes part of its URL, so those two are what a reader has to go on wherever the site is listed. Write them for the person who will come back to this page in a month.\n\nContent is text written here: HTML, CSS, JavaScript, Markdown, JSON, SVG. Images, PDFs, video, and other binary assets are not supported on this surface — publish those with the Valet CLI.\n\nPublishing uses a connected Valet account by default and creates a permanent, private site. Pass anonymous: true only when the user explicitly wants a temporary public site. It is public to anyone who has the link, and it may be removed 36 hours after it is created, unless it is claimed. The result carries a claim URL that moves the site into a Valet account and makes it permanent, and a site_token that updates the same site on a later call. Give that token back to revise the site instead of publishing a second copy of it; with an account, give the site's name instead.","description_after":"Publish files as a live website, served over HTTPS at its own URL. Use it when a report, essay, slide-like narrative, dashboard, marketing surface, or other static artifact reads better at a live URL than as conversation text. Honor an artifact form the user requests. Otherwise choose the artifact form and treatment from its audience, job, and material. A request for a live URL chooses delivery, not one long scrolling page.\n\nApply the governance skill before calling: get_skill with governance says what the organization expects of a published page and names the design-system skill, which supplies identity, not structure. Follow each wherever it speaks.\n\ntitle and description are required on every publish of files, and a call missing either is refused: title names the site for a person, and description says in one sentence what it holds. A site's name becomes part of its URL, so those two are what a reader has to go on wherever the site is listed. Write them for the person who will come back to this page in a month.\n\nContent is text written here: HTML, CSS, JavaScript, Markdown, JSON, SVG. Images, PDFs, video, and other binary assets are not supported in files — publish those with the Valet CLI, or with push.\n\nSend the site one of two ways. files carries the text of the pages in the call, which suits a few small pages and works from any client. push: {id, commit} publishes a commit you pushed with git: call create_push, run the recipe it returns, then pass the push_id and the commit sha it prints. Use push when you can run git with network access, when the site is large or holds binary files, or when you changed a clone of its source; it needs a site that exists and an account, not anonymous. Pass files or push, not both.\n\nPublishing uses a connected Valet account by default and changes a permanent, private site that already exists: create it first with create_service (kind: site), then publish to its name. A name that holds no site is refused. Pass anonymous: true only when the user explicitly wants a temporary public site, which needs no create_service. It is public to anyone who has the link, and it may be removed 36 hours after it is created, unless it is claimed. The result carries a claim URL that moves the site into a Valet account and makes it permanent, and a site_token that updates the same site on a later call. Give that token back to revise the site instead of publishing a second copy of it; with an account, give the site's name instead.","description_similarity":0.815,"before_hash":"46db2e364c989a2d2b7663f834f6c882","after_hash":"8e4e7940429a76244819f63b76e1474f"},{"tool":"publish_app","kind":"changed","observed_at":"2026-10-16T09:33:51.824Z","fields":["description","inputSchema"],"description_before":"Publish source as an app: a process Valet builds from your files and runs behind its own URL. Use it when the work needs a server, a background process, or a database. A Procfile at the root says how to start each process type; the web type serves the app's URL and must listen on $PORT, which Valet sets. Node, Python, and Go are supported. Apply the governance skill before calling.\n\ntitle and description are required and a call missing either is refused: Valet writes the app's valet.yaml from them, and any valet.yaml in files is replaced. Content is text: source files, lockfiles, Procfile, configuration. Images and other binary assets are not supported on this surface. Dependencies are installed during the build from the manifest you publish: package.json, with its lockfile when you have one; requirements.txt; or go.mod, where go.sum is optional and the build completes it. Do not include installed packages.\n\nPublishing to a name that exists replaces its source with these files, so read get_source first when the app is not yours. The publish returns a build id. Poll get_build until deploy_state is up or crashed; the first deploy can take a few minutes. A build that succeeded is not yet live: its processes still have to start on the new release. On crashed, a web process that had a running release keeps serving it, so a working URL does not prove the new release is live; other crashed processes are down until fixed. Read each crashed process's state_reason: if it is the app's own output, fix the code and publish again; if it names a platform or configuration failure, fix that or publish again. The first publish creates the app, so set environment variables and attach resources after it: set_env_vars and attach_resource each restart the app with its new variables. Write the app to start without them and serve a page saying what is missing, never exiting, and give the user the URL once its resources are attached. A new app is private: only members of the organization that owns it can open it, after signing in to Valet. Use set_service_access to make it public or password-protected. Requires connecting a Valet account.","description_after":"Publish source as an app: a process Valet builds from your files and runs behind its own URL. Use it when the work needs a server, a background process, or a database. A Procfile at the root says how to start each process type; the web type serves the app's URL and must listen on $PORT, which Valet sets. Node, Python, and Go are supported. Apply the governance skill before calling.\n\ntitle and description are required with files and a call missing either is refused: Valet writes the app's valet.yaml from them, and any valet.yaml in files is replaced. Content is text: source files, lockfiles, Procfile, configuration. Images and other binary assets are not supported in files. Dependencies are installed during the build from the manifest you publish: package.json, with a lockfile only as the dependencies skill says; requirements.txt; or go.mod, where go.sum is optional and the build completes it. Do not include installed packages.\n\nSend the app one of two ways. files carries the source in the call, which works from any client. push: {id, commit} publishes a commit you pushed with git: call create_push, run the recipe it returns, then pass the push_id and the commit sha it prints. Use push when you can run git with network access, when the app is large or holds binary files, or when you changed a clone of its source; the app's own valet.yaml and Procfile come from the commit. Pass files or push, not both.\n\nPublishing changes an app that exists: create it first with create_service (kind: app), then publish to its name. A name that holds no app is refused. Publishing replaces the app's source with these files, so read get_source first when the app is not yours. The publish returns a build id. Poll get_build until deploy_state is up or crashed; the first deploy can take a few minutes. A build that succeeded is not yet live: its processes still have to start on the new release. On crashed, a web process that had a running release keeps serving it, so a working URL does not prove the new release is live; other crashed processes are down until fixed. Read each crashed process's state_reason: if it is the app's own output, fix the code and publish again; if it names a platform or configuration failure, fix that or publish again. The Set environment variables and attach resources once the app exists: set_env_vars and attach_resource each restart the app with its new variables. Write the app to start without them and serve a page saying what is missing, never exiting, and give the user the URL once its resources are attached. A new app is private: only members of the organization that owns it can open it, after signing in to Valet. Use set_service_access to make it public or password-protected. Requires connecting a Valet account.","description_similarity":0.858,"before_hash":"266bbe45408e25a875917f389a9b016c","after_hash":"52f8a01b424b5eeaa17fee00dadef6e2"},{"tool":"publish_agent","kind":"changed","observed_at":"2026-10-16T09:33:51.824Z","fields":["description","inputSchema"],"description_before":"Publish source as an agent: a SOUL.md describing who it is, a valet.yaml declaring the skills, connectors, channels, and configuration it runs with, and any supporting files. Use it when the work is an agent that answers on a channel or runs on a schedule, not a website or an app. Apply the governance skill before calling.\n\nfiles must include valet.yaml and SOUL.md at the root. Unlike a website's or an app's, an agent's valet.yaml is yours: Valet validates it rather than writing it, and refuses one the agent rules reject. An organization connector or channel the manifest names is attached for you. When the manifest names one the organization does not have, or a skill that does not resolve, nothing deploys and the answer lists what is pending and the tool that sets each up; do that and call again with the same files.\n\nPublishing to a name that exists replaces its source with these files, so read get_source first when the agent is not yours. The first publish creates the agent. An agent deploy finishes before this call returns: the answer carries the release version, and get_service reports whether the agent is running and what it holds. Requires connecting a Valet account.","description_after":"Publish source as an agent: a SOUL.md describing who it is, a valet.yaml declaring the skills, connectors, channels, and configuration it runs with, and any supporting files. Use it when the work is an agent that answers on a channel or runs on a schedule, not a website or an app. Apply the governance skill before calling.\n\nSend the agent one of two ways. files carries it in the call, which works from any client. push: {id, commit} publishes a commit you pushed with git: call create_push, run the recipe it returns, then pass the push_id and the commit sha it prints. Use push when you can run git with network access or when you changed a clone of the agent's source; a push that builds on a main that has since moved is merged onto it as a deploy is. Pass files or push, not both.\n\nThe tree, in files or in the commit, must include valet.yaml and SOUL.md at the root. Unlike a website's or an app's, an agent's valet.yaml is yours: Valet validates it rather than writing it, and refuses one the agent rules reject. An organization connector or channel the manifest names is attached for you. When the manifest names one the organization does not have, or a skill that does not resolve, nothing deploys and the answer lists what is pending and the tool that sets each up; do that and call again with the same files.\n\nPublishing changes an agent that exists: create it first with create_service (kind: agent), then publish to its name. A name that holds no agent is refused. Publishing replaces the agent's source with these files, so read get_source first when the agent is not yours. An agent deploy finishes before this call returns: the answer carries the release version, and get_service reports whether the agent is running and what it holds. Requires connecting a Valet account.","description_similarity":0.725,"before_hash":"345271a3db20f79f8ee485862c8fb552","after_hash":"e2da2a790e0eebbb55a133457798de1f"},{"tool":"get_source","kind":"changed","observed_at":"2026-10-16T09:33:51.824Z","fields":["description","inputSchema"],"description_before":"Read what is published: the files of a website, app, or agent's active release. Without path it lists them; with path it returns one file's text. Pass release, a version from list_releases, to read an earlier release instead; publishing its files again rolls back. Read before you change something someone else built, so your publish carries their work forward rather than replacing it with yours. Binary files are listed and not returned. Requires connecting a Valet account.","description_after":"Read what is published: the files of a website, app, or agent's active release. Without path it lists them; with path it returns one file's text. Pass release, a version from list_releases, to read an earlier release instead; publishing its files again rolls back. Read before you change something someone else built, so your publish carries their work forward rather than replacing it with yours. Binary files are listed and not returned. Pass git: true instead, when you can run git with network access, to get a read-only Git URL for the release's commit with the commands to clone it. Prefer it to reading files one at a time. The URL expires in an hour and cannot push; do not share or log it. git cannot be combined with path. Requires connecting a Valet account.","description_similarity":0.705,"before_hash":"0e01abe2a41f3d6eec03227832f7d26c","after_hash":"6a9e1abedc78d8d94dd718d0c1eb68f2"},{"tool":"create_service","kind":"added","observed_at":"2026-10-16T09:33:51.824Z","fields":[],"description_before":null,"description_after":"Create an empty website, app, or agent in an organization, before publishing to it. This is the first step for anything new: publish_site, publish_app, and publish_agent change a service that exists and refuse a name that does not. Pass kind to say which you mean, and name to choose its name; omit name to have one generated. A name another website, app, or agent in the organization holds is refused, as is a create past the organization's limit for that kind. The result names the organization, kind, name, and URL; publish to the name next. Requires connecting a Valet account.","description_similarity":null,"before_hash":null,"after_hash":"d732d66bde12092e3cd32a9bf9958dc2"},{"tool":"create_push","kind":"added","observed_at":"2026-10-16T09:33:51.824Z","fields":[],"description_before":null,"description_after":"Open a Git push on a website, app, or agent that exists: a branch of its repository, writable for one hour, that you push source to before you publish. Use it when you can run git with network access; it sends only what changed, so a large service publishes without carrying its files through the conversation. Otherwise publish with files. The service must exist first: create_service makes it. The result carries a Git URL with a credential, the push's id and branch, the commit it starts from, the name and email to commit as, and two recipes with every value filled in: clone the branch and edit, or push a directory as it stands. Run a recipe, then call publish_site, publish_app, or publish_agent with push: {id, commit}, where commit is the sha the recipe prints. The URL writes only this push's branch, cannot force-push, and expires with the push; do not share or log it. A service holds ten open pushes at once. Requires connecting a Valet account.","description_similarity":null,"before_hash":null,"after_hash":"e1a4ddfe3e561ca5a0434a3b55d04cfe"},{"tool":"list_resources","kind":"changed","observed_at":"2026-10-15T21:10:54.988Z","fields":["description"],"description_before":"List the organization's resources, newest first: each one's name, provider, plan, and state, and the apps it is attached to. Use it to find a resource to attach by name, or one no app holds before deleting it. It never returns a variable value. Requires connecting a Valet account.","description_after":"List the organization's resources, newest first: each one's name, provider, plan, and state, and the apps it is attached to, with any attachment that is attaching, conflicted, or detaching and why. Use it to find a resource to attach by name, or one no app holds before deleting it. It never returns a variable value. Requires connecting a Valet account.","description_similarity":0.83,"before_hash":"fb1d1c9a35a57e64d9fe59fb0f0f9133","after_hash":"86c0b66b56013f994f8925693efdd994"},{"tool":"detach_resource","kind":"changed","observed_at":"2026-10-15T21:10:54.988Z","fields":["description"],"description_before":"Detach a resource from an app: remove the environment variables it set and, if the app is running, schedule a restart so its next process starts without them. The running process keeps them until it is replaced. The resource itself and its data are unchanged, and other apps that hold it keep it. Detaching a resource that is not attached changes nothing. Requires connecting a Valet account.","description_after":"Detach a resource from an app: remove the environment variables it set and, if the app is running, ask for a restart so its next process starts without them. The state is detached when that is done, and detaching while Valet still owes the restart or the removal, which it keeps trying; the answer gives the reason. The running process keeps the variables until it is replaced. A variable whose value is not the one the resource set stays on the app, and the answer names it. The resource itself and its data are unchanged, and other apps that hold it keep it. Detaching a resource that is not attached changes nothing. Requires connecting a Valet account.","description_similarity":0.652,"before_hash":"e07579805fa6d71585fdb2667726a209","after_hash":"af16f9330f464da5b9c0928ac41362dd"},{"tool":"attach_resource","kind":"changed","observed_at":"2026-10-15T21:10:54.988Z","fields":["description"],"description_before":"Attach a resource to an app: a named set of environment variables, such as a database's connection string, that the app reads as secrets. Name the resource. When the organization has none by that name, pass a provider from list_catalog_resources and the first call creates it, returning at once with state provisioning. Call again with the same arguments, env_prefix included, until the state is attached: the call that finds the resource ready attaches it and sets its variables, scheduling a restart if the app is running. An existing resource attaches by name alone, including one another app holds. The call is safe to repeat: one name is one resource however many times it is called, and an app can hold several under different names. Pass env_prefix when two resources would set the same variables. Read the names an attachment sets from list_catalog_resources before writing the app's code. A new database is empty, so the app creates its own tables, and its URL carries the TLS settings it needs. The app must exist, so publish it first. After the attach schedules its restart, get_service shows when the new process is running. Provisioning takes about a minute; call again every ten seconds. Values are never returned here. Requires connecting a Valet account.","description_after":"Attach a resource to an app: a named set of environment variables, such as a database's connection string, that the app reads as secrets. Name the resource. When the organization has none by that name, pass a provider from list_catalog_resources and the first call creates it, returning at once with state provisioning. Call again with the same arguments, env_prefix included, until the state is attached: the call that finds the resource ready attaches it and sets its variables, then asks for a restart if the app is running. The state is attaching while Valet still owes the restart or the variables, and conflicted when a name the resource sets is already set on the app; the answer gives the reason. An existing resource attaches by name alone, including one another app holds. The call is safe to repeat: one name is one resource however many times it is called, and an app can hold several under different names. Pass env_prefix when two resources would set the same variables. Read the names an attachment sets from list_catalog_resources before writing the app's code. A new database is empty, so the app creates its own tables, and its URL carries the TLS settings it needs. The app must exist, so publish it first. The running process does not see the variables until the restart completes; get_service shows the attachment's status and when the new process is running. Provisioning takes about a minute; call again every ten seconds. Values are never returned here. Requires connecting a Valet account.","description_similarity":0.843,"before_hash":"9cf9b7e5bf590bf22a8ae7155b0ad987","after_hash":"0054039c0a1910f3d4820d3a7045ceca"},{"tool":"unset_env_vars","kind":"changed","observed_at":"2026-10-14T21:14:30.914Z","fields":["description"],"description_before":"Remove environment variables set on an app or agent, and restart it once if it is running. This removes the service's own variables only; an organization variable it inherits is not touched. A variable a connector or channel references, or one a resource set, is refused: the answer names the holder and what frees it. A channel the agent owns is destroyed with destroy_channel; a resource's variables leave only when the resource is detached. A name that is not set is reported and does not fail the call. Requires connecting a Valet account.","description_after":"Remove environment variables set on an app or agent, and schedule one restart if it is running. This removes the service's own variables only; an organization variable it inherits is not touched. A variable a connector or channel references, or one a resource set, is refused: the answer names the holder and what frees it. A channel the agent owns is destroyed with destroy_channel; a resource's variables leave only when the resource is detached. A name that is not set is reported and does not fail the call. Requires connecting a Valet account.","description_similarity":0.966,"before_hash":"b3d4a3ba4d8c109ac8514edce0940804","after_hash":"c4a0bbc53c5d8b024999c1ed30fce2f8"},{"tool":"detach_resource","kind":"changed","observed_at":"2026-10-14T21:14:30.914Z","fields":["description"],"description_before":"Detach a resource from an app: remove the environment variables it set and restart the app if it is running, so a running app loses them at once. The resource itself and its data are unchanged, and other apps that hold it keep it. Detaching a resource that is not attached changes nothing. Requires connecting a Valet account.","description_after":"Detach a resource from an app: remove the environment variables it set and, if the app is running, schedule a restart so its next process starts without them. The running process keeps them until it is replaced. The resource itself and its data are unchanged, and other apps that hold it keep it. Detaching a resource that is not attached changes nothing. Requires connecting a Valet account.","description_similarity":0.776,"before_hash":"3ec2e7bfa96da591ad1b1411950f877e","after_hash":"e07579805fa6d71585fdb2667726a209"},{"tool":"detach_connector","kind":"changed","observed_at":"2026-10-14T21:14:30.914Z","fields":["description"],"description_before":"Detach a connector from a website or agent, ending the grant attach_connector made. The connector itself stays in the organization. A page or agent that still calls it starts getting an error, which is the intended outcome.\n\nWhile a connector is attached to a website, everyone who can open the page can call every tool it exposes with the credential Valet holds, so detaching is the way to end that reach. A running agent restarts to drop the connector. Detaching a connector that is not attached to an agent leaves the same absence; on a website it is refused, so a misspelled name is never read as a grant taken back. An app cannot hold a connector, so it is refused. Requires connecting a Valet account.","description_after":"Detach a connector from a website or agent, ending the grant attach_connector made. The connector itself stays in the organization. A page or agent that still calls it starts getting an error, which is the intended outcome.\n\nWhile a connector is attached to a website, everyone who can open the page can call every tool it exposes with the credential Valet holds, so detaching is the way to end that reach. A running agent gets a scheduled restart so its next process starts without the connector. Detaching a connector that is not attached to an agent leaves the same absence; on a website it is refused, so a misspelled name is never read as a grant taken back. An app cannot hold a connector, so it is refused. Requires connecting a Valet account.","description_similarity":0.885,"before_hash":"5fccbc6758a450627dacb368d965d6d4","after_hash":"07628e9e013c080d04995237e13fcbb4"},{"tool":"attach_resource","kind":"changed","observed_at":"2026-10-14T21:14:30.914Z","fields":["description"],"description_before":"Attach a resource to an app: a named set of environment variables, such as a database's connection string, that the app reads as secrets. Name the resource. When the organization has none by that name, pass a provider from list_catalog_resources and the first call creates it, returning at once with state provisioning. Call again with the same arguments, env_prefix included, until the state is attached: the call that finds the resource ready attaches it and sets its variables, restarting the app if it is running. An existing resource attaches by name alone, including one another app holds. The call is safe to repeat: one name is one resource however many times it is called, and an app can hold several under different names. Pass env_prefix when two resources would set the same variables. Read the names an attachment sets from list_catalog_resources before writing the app's code. A new database is empty, so the app creates its own tables, and its URL carries the TLS settings it needs. The app must exist, so publish it first. After the attach restarts it, get_service shows whether it is running again. Provisioning takes about a minute; call again every ten seconds. Values are never returned here. Requires connecting a Valet account.","description_after":"Attach a resource to an app: a named set of environment variables, such as a database's connection string, that the app reads as secrets. Name the resource. When the organization has none by that name, pass a provider from list_catalog_resources and the first call creates it, returning at once with state provisioning. Call again with the same arguments, env_prefix included, until the state is attached: the call that finds the resource ready attaches it and sets its variables, scheduling a restart if the app is running. An existing resource attaches by name alone, including one another app holds. The call is safe to repeat: one name is one resource however many times it is called, and an app can hold several under different names. Pass env_prefix when two resources would set the same variables. Read the names an attachment sets from list_catalog_resources before writing the app's code. A new database is empty, so the app creates its own tables, and its URL carries the TLS settings it needs. The app must exist, so publish it first. After the attach schedules its restart, get_service shows when the new process is running. Provisioning takes about a minute; call again every ten seconds. Values are never returned here. Requires connecting a Valet account.","description_similarity":0.944,"before_hash":"a67676df67fd6f97593076a6de7ec76c","after_hash":"9cf9b7e5bf590bf22a8ae7155b0ad987"},{"tool":"detach_connector","kind":"changed","observed_at":"2026-10-09T01:39:27.096Z","fields":["description","inputSchema"],"description_before":"Detach a connector from a website, app, or agent, ending the grant attach_connector made. The connector itself stays in the organization. A page or agent that still calls it starts getting an error, which is the intended outcome.\n\nWhile a connector is attached to a website, everyone who can open the page can call every tool it exposes with the credential Valet holds, so detaching is the way to end that reach. A running agent restarts to drop the connector. Detaching a connector that is not attached to an app or agent leaves the same absence; on a website it is refused, so a misspelled name is never read as a grant taken back. Requires connecting a Valet account.","description_after":"Detach a connector from a website or agent, ending the grant attach_connector made. The connector itself stays in the organization. A page or agent that still calls it starts getting an error, which is the intended outcome.\n\nWhile a connector is attached to a website, everyone who can open the page can call every tool it exposes with the credential Valet holds, so detaching is the way to end that reach. A running agent restarts to drop the connector. Detaching a connector that is not attached to an agent leaves the same absence; on a website it is refused, so a misspelled name is never read as a grant taken back. An app cannot hold a connector, so it is refused. Requires connecting a Valet account.","description_similarity":0.972,"before_hash":"b5d998385af2b60a68b21d77c23f9240","after_hash":"5fccbc6758a450627dacb368d965d6d4"},{"tool":"list_site_connectors","kind":"removed","observed_at":"2026-10-08T07:22:08.636Z","fields":[],"description_before":"List the connectors attached to a website, each with the tools a page served from that site can call. Read it before writing a page that calls one: the tool names and argument schemas it returns are what the page's own calls have to match, and guessing them produces a page that fails on its first click.\n\nIt lists what is attached to this one site, not what the organization has available. A connector nobody attached to this site does not appear here, and attaching one is a separate, deliberate act — it hands the connector's reach to everyone who can open the page.\n\nEach connector says whether a page can call it, and whether the server keeps an MCP session the page must hold — the page runs the initialize handshake, replays the Mcp-Session-Id header, and re-initializes when the session lapses. The broker forwards the handshake and the tool calls, and always hands the page one JSON document per request, whatever framing the server chose. A connector that could not be reached reports its own error and leaves every other row intact, so one expired credential does not hide the rest. Requires connecting a Valet account.","description_after":null,"description_similarity":null,"before_hash":"894760543fe3bcf8c65b8d77ffe8b1e7","after_hash":null},{"tool":"list_resource_catalog","kind":"removed","observed_at":"2026-10-08T07:22:08.636Z","fields":[],"description_before":"List the resource providers this server can provision from, such as a PostgreSQL database or an AI model: what each one is for, its plans, the first being the default, the environment variables an attachment sets, and a guide to using it from an app. Read it before choosing a resource and before writing the code that uses one, and follow the guide. Requires connecting a Valet account.","description_after":null,"description_similarity":null,"before_hash":"2afc32ed0ace3c35f6ff8ece33ea0da8","after_hash":null},{"tool":"list_connector_catalog","kind":"removed","observed_at":"2026-10-08T07:22:08.636Z","fields":[],"description_before":"List the connectors Valet curates — the catalog an organization creates a connector from. Reach for it when list_attachable_connectors returned nothing that serves the data a page needs: the organization has no connector for it yet, and this says whether Valet has an entry for the product and what setting it up would take.\n\nEach entry says how its credential arrives. An entry that takes a secret names each slot it asks for and what the slot is. An entry that authorizes in a browser, or connects through Composio, says so — a person completes those on the dashboard's Integrations page, and no answer here can stand in for that.\n\nEach entry also says whether a website's pages could call it. That is a marker, not a filter: an entry only an agent's container can run is still listed, because \"Valet has your product, but no page can call it\" is a real answer and reporting it as missing is not. Requires connecting a Valet account.","description_after":null,"description_similarity":null,"before_hash":"2a569139e6104809179e5892c574d49a","after_hash":null},{"tool":"list_attachable_connectors","kind":"removed","observed_at":"2026-10-08T07:22:08.636Z","fields":[],"description_before":"List the organization connectors a website can hold — the discovery step before attach_site_connector.\n\nOnly connectors a page can actually call appear: HTTP MCP servers reached over the sse or streamable-http transport. Command connectors and stdio MCP servers are excluded by definition — they run inside an agent's container and no page can reach them — so a connector the organization has that is not listed here cannot back a site.\n\nPass site to mark which connectors that site already holds; attached connectors stay listed because attaching is idempotent. Tool schemas are not included — attach the connector, then list_site_connectors reports its live tools and their schemas, which is the moment to write the page's calls. Requires connecting a Valet account.","description_after":null,"description_similarity":null,"before_hash":"ed979464fd06fa784f85ee0eac2b93aa","after_hash":null},{"tool":"detach_site_connector","kind":"removed","observed_at":"2026-10-08T07:22:08.636Z","fields":[],"description_before":"Detach a connector from a website, so pages served from that site can no longer call it. The connector itself is left in place for the rest of the organization, and nothing else about the site changes.\n\nThis is how the grant attaching made is taken back. While a connector is attached, everyone who can open the page can call every tool it exposes with the credential Valet holds, so detaching is the way to end that reach. A page that still calls the connector starts getting an error, which is the intended outcome. Requires connecting a Valet account.","description_after":null,"description_similarity":null,"before_hash":"97be1e7c175b54542b82871911c2ad0d","after_hash":null},{"tool":"delete_service","kind":"removed","observed_at":"2026-10-08T07:22:08.636Z","fields":[],"description_before":"Permanently delete a website or app and stop serving it. This cannot be undone, so confirm with the user first. Pass kind to say which you mean; a name holding another kind is then refused rather than deleted. Deleting an app stops it and removes its releases and source; its resources are detached and kept, because they belong to the organization and may serve other apps, and the answer names them for delete_resource. Identify the service by name, which requires connecting a Valet account, or a website published anonymously by the site_token returned when it was published — whoever published a site can always take it down. Agents are deleted with the Valet CLI.","description_after":null,"description_similarity":null,"before_hash":"2c787ff60e4b998afe36495ea2e81375","after_hash":null},{"tool":"call_site_connector","kind":"removed","observed_at":"2026-10-08T07:22:08.636Z","fields":[],"description_before":"Run one tool on a connector attached to a website and return what the connector answered. It is the sampling step of building a page that calls live data: discover, attach, read the schemas, then call one tool for real before you write any page code.\n\nCall it because a schema is not a shape. list_site_connectors gives you each tool's name and argument schema, which is what your call has to satisfy; this tells you what comes back, which is what the page has to parse. Results are text to read, not JSON to assume: many servers answer in markdown tables or prose, some expose a single meta-tool taking a whole command as one string, and a server that completes the handshake can still refuse half its tools when the stored credential's scope does not cover them. One real call settles all three.\n\nThis runs the tool for real, with the organization's own credential and whatever side effects the tool has. It is not a dry run and there is no preview: a tool that sends, writes, or deletes will do so. Prefer a read-only tool when you are only learning the shape, and ask the user before running anything that changes their systems.\n\nThe connector must already be attached to the site — attach_site_connector does that — and must be an HTTP MCP server. A tool that answers with an error is reported as an error carrying the connector's own text, which is usually the sentence that says what to fix. Requires connecting a Valet account.","description_after":null,"description_similarity":null,"before_hash":"4d39aac280b8355f1db86e57bc7164ee","after_hash":null},{"tool":"attach_site_connector","kind":"removed","observed_at":"2026-10-08T07:22:08.636Z","fields":[],"description_before":"Attach an organization connector to a website so pages served from that site can call the connector's tools.\n\nAttaching is a grant, and it is wider than it looks: every person who can open the page can call every tool the connector exposes, using the credential Valet holds for it. On a private site that is every member of the organization; on a password-protected or shared one it is everyone holding the password or the link. Valet does not narrow the connector's reach for a page, so attach only what the page needs and check the site's access mode before you do.\n\nOnly an organization connector that is an HTTP MCP server — transport sse or streamable-http — can be attached; list_attachable_connectors reports exactly that set. A connector that belongs to a single agent cannot back a page. A page calls the connector by its own name, which is what list_site_connectors reports and what the page's request path carries. Attaching a connector that is already attached changes nothing and is safe to repeat. Requires connecting a Valet account.","description_after":null,"description_similarity":null,"before_hash":"6e3d34813891b616eb132178cfb1204a","after_hash":null},{"tool":"delete_resource","kind":"removed","observed_at":"2026-10-08T07:22:08.636Z","fields":[],"description_before":"Delete a resource and all of its data, such as every table and row in a database. This cannot be undone, so confirm with the user first. A resource attached to any app is refused, and the answer names those apps: detach it from each with detach_resource, then delete it. The provider removes it in the background. Deleting a resource that is already being deleted changes nothing. Requires connecting a Valet account.","description_after":null,"description_similarity":null,"before_hash":"a066b1b98d562e94d28517898ace8594","after_hash":null},{"tool":"share_site","kind":"removed","observed_at":"2026-10-08T07:22:08.636Z","fields":[],"description_before":"Share a website with specific people by email, whether it is private or password-protected — sharing does not change who else can reach it. Each address is mailed a link from Valet that opens the site; the recipient needs no Valet account of their own, only the link, so anyone holding the email can open the site and forwarding it forwards access. Sharing again with an address that already has access re-sends the same link rather than creating a second one. Requires connecting a Valet account.","description_after":null,"description_similarity":null,"before_hash":"ce1ede96891d7a085d3dc243dcef906f","after_hash":null},{"tool":"get_skill_file","kind":"removed","observed_at":"2026-10-08T07:22:08.636Z","fields":[],"description_before":"Read one supporting file of a skill, by the path get_skill listed. A skill's SKILL.md points at its files for the detail it does not inline: a checklist, a template, a schema, an example. Read the ones the skill tells you to; do not read every file on principle. Binary files are listed but not returned here. Requires connecting a Valet account.","description_after":null,"description_similarity":null,"before_hash":"0da04a8817905a5354efb391cf5c74a3","after_hash":null},{"tool":"get_connector_client","kind":"removed","observed_at":"2026-10-08T07:22:08.636Z","fields":[],"description_before":"Get how a page served from a Valet site talks to the connectors attached to it. It is the pair to get_skill with design-system: consult that for the artifact's identity, this one for how it talks to its connectors. Call it before writing any page code that fetches from a connector.\n\nReturns the same-origin request contract and a paste-whole session helper that handles both sessionless and stateful connectors, plus the rules a page has to follow: handling a 403, recovering a lapsed session, and never caching a response on the caller's behalf.\n\nThis needs no Valet account. It answers with static guidance about how pages work — nothing here reads an organization or a site — so an agent can call it before running any OAuth flow.","description_after":null,"description_similarity":null,"before_hash":"6051bf4a814479ae31cd59bbd45494f4","after_hash":null}],"next_before":"500713","next_actions":[{"action":"list_changes","description":"Older changes","href":"/v1/servers/io.github.valetdotdev%2Fvalet/changes?before=500713&limit=50"}]}