Adding owned skills¶
Use owned when a skill belongs with another project you maintain. The source
project evolves the instructions alongside its code; this collection supplies
discovery, grouped installation, documentation, and a reviewed distribution copy.
| Category | Canonical location | Editing rule |
|---|---|---|
local |
This repository | Edit skills/local/<name>/ |
owned |
Another first-party repository | Edit there; sync into skills/owned/<name>/ |
vendor |
A third-party repository | Follow upstream; sync into skills/vendor/<name>/ |
Ownership is explicit through collection: owned, not inferred from a username.
vendor.yaml retains its historical filename and serves both upstream categories;
omitting collection preserves existing vendor behavior. series, license_path
and frozen work in either category.
Start in the source project¶
For a skill useful while developing that project, put the canonical directory in
.agents/skills/<name>/, with an optional .claude/skills/<name> discovery link.
Use skill-author with explicit project scope:
bash skills/local/skill-author/scripts/new-skill.sh \
--project --root /path/to/source-project userscript-development
Write and validate the skill in that project. Publish its canonical files before enrolling an ordinary remote sync source. Then, from this collection:
./scripts/add-vendor.sh --owned \
daviddwlee84/Tampermonkey-Scripts/.agents/skills/userscript-development
Add ./owned/userscript-development to the appropriate marketplace plugin's
skills[], add bilingual docs and navigation, and run make validate plus
make docs-build. A series uses ./owned/<series>/<name>.
Bootstrap before the first upstream publication¶
A skill being authored across two local repositories does not yet have a remote
commit containing its new files. Do not record an unrelated HEAD as last_sync.
For this initial state only:
- Finish and validate the source project's canonical directory.
- Copy its actual files into
skills/owned/<name>/and verify byte equality. - Add the source entry with
collection: owned,pending_upstream: true, and emptylast_sync.date/last_sync.commit. - Keep developing in the source project; refresh the bootstrap copy when needed.
skills:
- name: userscript-development
collection: owned
pending_upstream: true
upstream:
owner: daviddwlee84
repo: Tampermonkey-Scripts
path: .agents/skills/userscript-development
branch: main
last_sync:
date: ""
commit: ""
Routine make sync / make sync-check explicitly report pending and preserve the
bootstrap files. After the source is published, activate the named entry:
Activation performs a real remote sync and clears pending only after success.
An unpublished path or failed download leaves the existing copy intact. Review
the diff before publishing this collection. Pending is for an unpublished owned
source; frozen is for an upstream intentionally no longer being followed.
Normal update loop¶
- Update and validate the canonical skill with the source project's change.
- Publish that source change through the project's normal workflow.
- Run
./scripts/sync-vendor.sh --check userscript-development, then./scripts/sync-vendor.sh userscript-developmenthere. - Review the mirrored diff and recorded upstream SHA, run publish gates, and publish this collection through its normal workflow.
The existing weekly sync workflow also covers active owned entries and opens a reviewable PR. Sync fetches the skill tree from the recorded commit and stages downloads before replacing the last good copy.
The distribution copy contains real files. Cross-repository symlinks would refer
to paths absent from downstream installations. Do not add a second canonical
skills/local/<name> copy or load the skill into this collection's own discovery
directories unless maintaining this collection actually needs it.
After publication, users can install from this collection's grouped picker or
directly from the source project. The skill name stays userscript-development;
changing its upstream source can still require an explicit reinstall/lock review.
Maintainer verification¶
make test-source-sync runs offline fixtures with a fake GitHub CLI and real
yq: default vendor routing, owned/series routing, check mode, pending activation,
failed-download preservation, frozen entries, destination validation, and
add-vendor.sh --owned. It requires Python 3 and mikefarah/yq.