Skip to content

Add workspace-member predicate and use it to sync .agents/skills#264

Merged
jackh726 merged 3 commits into
mainfrom
workspace-plugins
Jul 15, 2026
Merged

Add workspace-member predicate and use it to sync .agents/skills#264
jackh726 merged 3 commits into
mainfrom
workspace-plugins

Conversation

@jackh726

Copy link
Copy Markdown
Contributor

Part of the registry-centric plugins RFD.

Disclosure questions

AI disclosure.

  • The AI tool authored large parts of the code

jackh726 added 3 commits July 14, 2026 23:49
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
jackh726 force-pushed the workspace-plugins branch from e7f3799 to 797efc6 Compare July 15, 2026 03:25
@jackh726
jackh726 added this pull request to the merge queue Jul 15, 2026
Merged via the queue into main with commit 803a61b Jul 15, 2026
7 checks passed
@jackh726
jackh726 deleted the workspace-plugins branch July 15, 2026 16:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant