Skip to content

feat(cli): support installing specific skills#200

Merged
christso merged 12 commits intomainfrom
feat/197-install-specific-skills
Mar 4, 2026
Merged

feat(cli): support installing specific skills#200
christso merged 12 commits intomainfrom
feat/197-install-specific-skills

Conversation

@christso
Copy link
Contributor

@christso christso commented Mar 3, 2026

Summary

Closes #197

  • Add --skill flag to plugin install for cherry-picking specific skills from a plugin
  • Add enabledSkills (allowlist) config field to complement existing disabledSkills (denylist)
  • Update plugin skills add/remove to detect allowlist vs denylist mode automatically
  • Fix pre-existing bug where skill pruning on uninstall failed for marketplace-resolved plugin names
  • Fix per-plugin scoping of enabledSkills filter (was incorrectly applied globally)
  • Fix plugin name consistency between skills listing and sync pipeline
  • Eliminate double sync on plugin install --skill

Usage

# Install plugin with only specific skills enabled
allagents plugin install superpowers@marketplace --skill brainstorming
allagents plugin install superpowers@marketplace --skill brainstorming --skill tdd

# After install, manage skills normally
allagents plugin skills add verification        # adds to enabledSkills
allagents plugin skills remove brainstorming     # removes from enabledSkills
allagents plugin skills list                     # shows enabled/disabled status

Config model

plugins:
  - superpowers@marketplace
enabledSkills:
  - superpowers:brainstorming
  - superpowers:test-driven-development

When enabledSkills has entries for a plugin, only those skills sync (allowlist). When absent, existing disabledSkills behavior applies (denylist). Uninstalling a plugin cleans up both lists.

Test plan

  • Unit tests: 848 pass, 0 fail
  • Lint and typecheck pass
  • E2E: full workflow validated (see below)

E2E steps reproduced

bun run build
TESTDIR=$(mktemp -d /tmp/e2e-skills-XXXXXX)
mkdir -p "$TESTDIR/.allagents"
echo 'repositories: []\nplugins: []\nclients: [claude]' > "$TESTDIR/.allagents/workspace.yaml"
cd "$TESTDIR"

# Test 1: Install with --skill (only brainstorming synced, 1 skill dir)
./dist/index.js plugin install superpowers@obra/superpowers --skill brainstorming
# PASS: 1 skill synced, enabledSkills key = superpowers:brainstorming

# Test 2: skills list shows correct enabled/disabled status
./dist/index.js plugin skills list --scope project
# PASS: brainstorming enabled, all others disabled

# Test 3: skills add in allowlist mode
./dist/index.js plugin skills add test-driven-development --scope project
# PASS: test-driven-development synced

# Test 4: skills remove in allowlist mode
./dist/index.js plugin skills remove brainstorming --scope project
# PASS: brainstorming removed from sync

# Test 5: uninstall cleans up enabledSkills
./dist/index.js plugin uninstall superpowers --scope project
# PASS: enabledSkills removed from config

rm -rf "$TESTDIR"

All 6 E2E assertions passed.

christso added 9 commits March 3, 2026 11:18
Add getEnabledSkills, addEnabledSkill, removeEnabledSkill, and
pruneEnabledSkillsForPlugin functions mirroring the existing disabled
skills helpers. Update removePlugin to prune enabledSkills alongside
disabledSkills when a plugin is removed.
extractPluginName only returned the plugin component from specs like
"plugin@marketplace", but skill keys use the resolved directory name
(often the marketplace name). Renamed to extractPluginNames and return
both candidates so pruning works for both disabledSkills and
enabledSkills.
@cloudflare-workers-and-pages
Copy link

cloudflare-workers-and-pages bot commented Mar 3, 2026

Deploying allagents with  Cloudflare Pages  Cloudflare Pages

Latest commit: 6e74cfe
Status: ✅  Deploy successful!
Preview URL: https://d340d538.allagents.pages.dev
Branch Preview URL: https://feat-197-install-specific-sk.allagents.pages.dev

View logs

christso added 3 commits March 4, 2026 09:02
… sync

enabledSkills was applied globally across all plugins, causing skills
from plugins without enabledSkills entries to be silently excluded.
Now only applies the allowlist to plugins that have entries in the set.

Also restructures plugin install --skill to write enabledSkills before
sync, eliminating a redundant second sync pass.
skills.ts used basename(pluginPath) as the plugin name, but sync.ts
used the manifest-resolved name from resolvePluginSpecWithAutoRegister.
This caused enabledSkills keys like "superpowers-dev:brainstorming" to
not match sync's lookup of "superpowers:brainstorming".

Now resolvePluginPath returns the manifest pluginName when available,
making skill keys consistent across skills listing, CLI commands, and
the sync pipeline. Also tightens the initialSync failure check.
@christso christso merged commit b0b064a into main Mar 4, 2026
1 check passed
@christso christso deleted the feat/197-install-specific-skills branch March 4, 2026 11:08
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.

feat: support installing specific skills

1 participant