Add workspace-member predicate and use it to sync .agents/skills#264
Merged
Conversation
workspace-member() holds when the plugin being evaluated is defined by a member of the active workspace. It is provenance, not a workspace fact: the same bytes can arrive as a workspace member or as a fetched dependency, and only the loading route distinguishes them — so the loader stamps it per plugin. ParsedPlugin carries the stamp (registry sources always stamp false; the workspace-plugin loader will stamp true when workspace-local extensions land) and ParsedPlugin::applies() writes it into the PredicateContext before evaluating, covering the plugin's nested components on the same context. All plugin-gate call sites (skills, hook dispatch, prewarm, MCP collection, subcommands) route through it; standalone skills clear the stamp.
Implements the RFD's workspace-local extensions. The workspace root and every member directory now define a plugin when they carry a SYMPOSIUM.toml manifest or a bare skills/ directory. Workspace manifests are validated with relaxed rules (ManifestOrigin::WorkspaceMember): the name defaults to the directory name, the must-mention-a-dependency rule is waived (workspace membership is the gate), and the default `[[skills]] source.path = "skills"` group is appended unless the manifest opts out with `[defaults] skills = false`. The SDK's LoadedWorkspace now carries member manifest directories (the disk-cache format bump self-heals: old caches fail to parse and are rebuilt). Workspace-scoped callers — sync, hook dispatch/prewarm, the discovery hint, help rendering, subcommand dispatch — load the registry via load_registry_with_workspace; init's global hook registration stays registry-only. Workspace plugins are stamped workspace_member = true, making them the first producer of the workspace-member() predicate, and their skills are attributed to the "(workspace)" source with paths relative to the workspace root. The existing .agents/skills propagation is untouched; folding it into a workspace-member()-gated default group is a follow-up.
The agents-syncing feature predates workspace plugins: a bespoke loop at the end of sync copied each dir under <root>/.agents/skills/ into every agent's skill directory, with its own conflict handling and none of the pipeline's origin tracking, dedup, or disambiguation. Per the RFD's default-content section, .agents/skills is now the second default skill group on every workspace plugin, gated by workspace-member() — maintainer skills apply while working in the workspace and never install for dependents of a published crate. The bespoke loop, discover_user_authored_skills, and the SkillPropagated report event are gone; workspace root *and member* .agents/skills (new) flow through ordinary skill resolution. The agents-syncing config knob now gates appending that default group, and a bare .agents/skills/ directory counts for the manifest-less workspace-plugin convention. Two marker guards make .agents/skills safe as both a source and (for vendor-neutral agents) a destination: skill discovery skips .symposium-marked directories, so copies symposium installed there are never re-discovered as sources; and a skill whose source already sits at an agent's install slot is skipped for that agent, so the suffixed-name fallback can't manufacture a duplicate next to the source. Workspace skills stay as informal as the legacy blind copy allowed: the SKILL.md frontmatter block and its name/description fields are optional for them, with the name defaulting to the skill directory's name. The leniency is provenance-keyed — SkillGroup carries a workspace_member stamp set during manifest validation for workspace-member origins — so registry and crate skills keep the agentskills.io contract.
jackh726
force-pushed
the
workspace-plugins
branch
from
July 15, 2026 03:25
e7f3799 to
797efc6
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part of the registry-centric plugins RFD.
Disclosure questions
AI disclosure.