agent-skillboard 0.2.18 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/README.md +129 -258
  3. package/docs/adapters.md +37 -113
  4. package/docs/ai-skill-routing-goal.md +35 -109
  5. package/docs/capabilities.md +17 -104
  6. package/docs/install.md +36 -485
  7. package/docs/policy-model.md +50 -280
  8. package/docs/positioning.md +19 -86
  9. package/docs/profiles.md +21 -153
  10. package/docs/reference.md +115 -363
  11. package/docs/rollout-runbook.md +23 -25
  12. package/docs/routing.md +23 -90
  13. package/docs/user-flow.md +60 -284
  14. package/docs/value-proof.md +23 -181
  15. package/docs/variant-lifecycle.md +47 -67
  16. package/docs/versioning.md +31 -264
  17. package/examples/v2-multi-source.config.yaml +35 -0
  18. package/examples/v2-policy-error.config.yaml +6 -0
  19. package/package.json +1 -1
  20. package/src/advisor/actions.mjs +102 -6
  21. package/src/advisor/application-commands.mjs +10 -9
  22. package/src/advisor/apply-action.mjs +74 -1
  23. package/src/advisor/guidance.mjs +24 -16
  24. package/src/advisor/schema.mjs +17 -6
  25. package/src/advisor/skills.mjs +18 -5
  26. package/src/advisor.mjs +27 -9
  27. package/src/agent-integration-cli.mjs +13 -4
  28. package/src/agent-integration-content.mjs +21 -11
  29. package/src/agent-integration-files.mjs +1 -1
  30. package/src/agent-inventory-platforms.mjs +10 -0
  31. package/src/agent-inventory.mjs +23 -1
  32. package/src/agent-skill-import.mjs +2 -2
  33. package/src/audit-paths.mjs +42 -0
  34. package/src/brief-cli.mjs +3 -2
  35. package/src/brief-renderer.mjs +1 -0
  36. package/src/cli.mjs +498 -232
  37. package/src/compatibility.mjs +24 -0
  38. package/src/control/can-use-guard.mjs +21 -1
  39. package/src/control/config-write.mjs +32 -2
  40. package/src/control/skill-crud.mjs +5 -0
  41. package/src/control/v2-guard.mjs +175 -0
  42. package/src/control/v2-skill-crud.mjs +32 -0
  43. package/src/control/v2-skill-forget.mjs +38 -0
  44. package/src/control/variant-status.mjs +47 -1
  45. package/src/control.mjs +55 -0
  46. package/src/doctor.mjs +63 -4
  47. package/src/domain/v2-policy.mjs +111 -0
  48. package/src/hook-plan.mjs +33 -3
  49. package/src/impact.mjs +52 -29
  50. package/src/index.mjs +25 -1
  51. package/src/init.mjs +50 -34
  52. package/src/inventory-install-units.mjs +63 -0
  53. package/src/inventory-json.mjs +279 -0
  54. package/src/inventory-refresh.mjs +163 -18
  55. package/src/lifecycle-cli.mjs +40 -12
  56. package/src/lifecycle-content.mjs +52 -67
  57. package/src/migration/v1-to-v2.mjs +212 -0
  58. package/src/migration/v2-files.mjs +211 -0
  59. package/src/migration/v2-journal.mjs +169 -0
  60. package/src/migration/v2-projection.mjs +108 -0
  61. package/src/migration/v2-transaction.mjs +205 -0
  62. package/src/policy.mjs +3 -0
  63. package/src/reconcile.mjs +139 -111
  64. package/src/report.mjs +168 -148
  65. package/src/review.mjs +2 -0
  66. package/src/route-advisory.mjs +47 -2
  67. package/src/route-selection.mjs +38 -2
  68. package/src/route.mjs +62 -2
  69. package/src/shared-skill.mjs +301 -0
  70. package/src/source-digest.mjs +42 -0
  71. package/src/source-profiles.mjs +171 -144
  72. package/src/source-verification.mjs +32 -48
  73. package/src/uninstall.mjs +22 -0
  74. package/src/user-state-paths.mjs +19 -0
  75. package/src/user-uninstall.mjs +146 -0
  76. package/src/workspace.mjs +119 -79
@@ -1,303 +1,73 @@
1
1
  # Policy Model
2
2
 
3
- SkillBoard separates storage from invocation.
4
-
5
- For product and AI-mediated development, read
6
- [`docs/ai-skill-routing-goal.md`](ai-skill-routing-goal.md) before changing
7
- routing, brief, bridge, policy, or workflow UX. The policy model should support
8
- a non-blocking flow where the AI routes and works first when safe, then asks
9
- afterward only when remembering a usage policy would reduce future ambiguity.
10
-
11
- ## Skill States
12
-
13
- - `installed`: discovered on disk from `SKILL.md`.
14
- - `declared`: present in `skillboard.config.yaml`.
15
- - `discovered`: present in actual state but not yet classified.
16
- - `quarantined`: visible to the control plane but not callable.
17
- - `active`: allowed in at least one workflow.
18
- - `active` with `invocation: manual-only`: active only for direct user invocation.
19
- - `active-manual`: legacy spelling accepted for compatibility.
20
- - `active-router`: active only through a policy-checked router.
21
- - `active-auto`: active for workflow-scoped automatic invocation.
22
- - `candidate`: proposed for one or more workflows, pending approval.
23
- - `canonical`: the preferred implementation for a capability.
24
- - `vendor`: kept from an upstream source, but not automatically trusted.
25
- - `blocked`: never callable.
26
- - `deprecated`: kept for historical compatibility.
27
- - `archived`: retained outside normal workflows.
28
- - `removed`: absent from actual state but retained in history or lock data.
29
-
30
- ## Skill Exposure
31
-
32
- Skill exposure controls whether a skill belongs in central governance or should
33
- stay inside a workflow or install-unit boundary.
34
-
35
- - `exported`: shared or externally visible skill governed by SkillBoard.
36
- - `global-meta`: intentionally global control skill such as a workflow router,
37
- impact analyzer, skill registry, or verification gate.
38
- - `unit-managed`: skill supplied by a parent plugin/harness install unit.
39
- - `private`: workflow-internal implementation detail.
40
-
41
- Only `global-meta` skills may use `global-auto`. This keeps a user's small set
42
- of personal control skills globally available while plugin-provided skills remain
43
- selected through workflows or install units.
44
-
45
- Skills can also declare `owner_install_unit`. This points to the source that
46
- introduced the skill, such as a private skill repository, GitHub marketplace,
47
- package manager dependency, or harness installer. SkillBoard treats owner drift
48
- as a policy error:
49
-
50
- - `components.skills` entries must reference declared skills.
51
- - A skill with `owner_install_unit` must be listed in that install unit's
52
- `components.skills`.
53
- - A component skill cannot claim a different owner than the install unit listing
54
- it.
55
- - `unit-managed` skills must declare `owner_install_unit`.
56
-
57
- ## Invocation Modes
58
-
59
- - `manual-only`: direct user invocation only.
60
- - `router-only`: selected by an approved routing skill or control layer.
61
- - `workflow-auto`: eligible for model invocation only inside workflows that list
62
- the skill.
63
- - `global-auto`: eligible everywhere. This should be rare.
64
- - `blocked`: not callable even when installed.
65
- - `deprecated`: not callable for new workflows.
66
-
67
- ## Default Policy
68
-
69
- SkillBoard assumes:
70
-
71
- ```yaml
72
- defaults:
73
- invocation_policy: deny-by-default
74
- allow_model_invocation: false
75
- require_explicit_workflow: true
76
- ```
77
-
78
- That means installation alone never implies automatic use.
79
-
80
- `require_explicit_workflow: true` means a `workflow-auto` skill must be scoped by
81
- at least one workflow, either through `active_skills` or a workflow capability
82
- requirement. `allow_model_invocation: false` is not a blanket ban on
83
- workflow-scoped automation; it means automatic invocation must come from an
84
- explicit policy decision rather than installation.
85
-
86
- ## AI-Mediated Availability
87
-
88
- `skillboard brief --json` is the AI-facing availability contract. The user does
89
- not need to know the command loop: they can ask their AI what skills are
90
- available, why something is blocked, or whether a reviewed skill can be made
91
- available for a workflow. Behind the scenes, the AI should read the current
92
- brief and answer "What your AI can use now" with grouped facts from the control
93
- plane instead of trusting installed `SKILL.md` text or inventing policy from the
94
- filesystem.
95
-
96
- Human brief text separates reviewable friction from hard blocks: "Needs your
97
- decision" means the user can make a source/skill/workflow decision once, while
98
- "Blocked for safety" means policy or provenance must change before the item is
99
- usable. The brief may include action cards when requested, but an action card is
100
- only a suggestion. It does not authorize invocation and it does not make
101
- unreviewed external skills safe for automatic use.
102
-
103
- Risk-bearing action cards require user confirmation before apply. Any apply
104
- that mutates policy, trust, hooks, reset state, or skill references makes the
105
- previous brief stale, so the agent should use one current action id from the
106
- current brief and then rerun `skillboard brief --json` before answering another
107
- availability question or applying another action card. The runtime boundary
108
- remains `skillboard guard use ...`, run immediately before the actual skill
109
- invocation. A passing guard is not another user confirmation step: the agent
110
- should disclose the selected skill before use and mention it again in the
111
- result. That disclosure is an audit trace, not a permission prompt. CLI examples
112
- in this model are AI/automation/operator details, not a memorized user workflow.
113
-
114
- ## Workflow Activation
115
-
116
- Workflows own active skill pools:
117
-
118
- ```yaml
119
- workflows:
120
- codex-night-workflow:
121
- harness: codex
122
- active_skills:
123
- - meerkat.requirement-intake
124
- - matt.tdd
125
- blocked_skills:
126
- - matt.grill-me
127
- ```
128
-
129
- The generated lockfile pins install-unit source/cache digests, skill content
130
- digests, workflow bindings, and policy decisions.
131
-
132
- ## Skill Conflicts
133
-
134
- Skills can declare known overlap or incompatibility with `conflicts_with`:
3
+ SkillBoard v2 keeps one user-level policy and makes two durable decisions per
4
+ skill: enable or disable it, then keep it agent-local or share it across agents.
135
5
 
136
6
  ```yaml
7
+ version: 2
137
8
  skills:
138
- meerkat.requirement-intake:
139
- path: requirement-intake
140
- status: active
141
- invocation: router-only
142
- exposure: exported
143
- category: requirements
144
- conflicts_with:
145
- - matt.grill-me
146
- ```
147
-
148
- The referenced skill must be declared. If both sides of a declared conflict are
149
- active or capability-selectable in the same workflow, and neither is explicitly
150
- blocked there, policy fails. `skillboard guard use ...` denies the selected
151
- skill with a conflict reason, `brief` moves the affected skill into "Blocked for
152
- safety", and `impact disable <skill-id> --json` reports `conflictingSkills` plus
153
- `activeConflicts`. This gives the AI a concrete reason to ask for a policy
154
- change instead of silently choosing between overlapping skills.
155
-
156
- ## Capabilities
157
-
158
- Workflows should depend on capabilities when possible, with skills acting as
159
- implementations:
160
-
161
- ```yaml
162
- capabilities:
163
- requirement-clarification:
164
- canonical: meerkat.requirement-intake
165
- alternatives:
166
- - matt.grill-me
167
- - matt.grill-with-docs
168
- default_policy: router-only
9
+ test-first:
10
+ enabled: true
11
+ shared: false
12
+ docs-helper:
13
+ enabled: true
14
+ shared: true
15
+ unused-helper:
16
+ enabled: false
17
+ shared: false
169
18
  ```
170
19
 
171
- This lets SkillBoard suggest replacements when a skill is removed and group
172
- overlapping skills by role instead of by name alone.
173
-
174
- Explicit variants use the same capability and workflow fields. For example,
175
- `skillboard variant add claude.a --from a --capability task-review --workflow
176
- claude-workflow --path claude/a ...` records the user-approved `a -> claude.a`
177
- relationship, makes `claude.a` preferred for that workflow, and keeps `a` as a
178
- fallback. For a reviewed manual adaptation lifecycle, `skillboard variant fork
179
- <variant-id>` creates draft metadata and raw snapshot records, `skillboard
180
- variant status <variant-id>` reports `variant.status` plus computed drift, and
181
- `skillboard variant approve <variant-id>` promotes the reviewed body. Use
182
- `skillboard variant reset <variant-id>` with `--to-base` or `--to-approved` to
183
- restore a known snapshot. SkillBoard records workflow policy across agents; it
184
- does not convert skill bodies, does not rewrite skill bodies, and does not
185
- guarantee semantic equivalence of skill bodies.
20
+ `enabled: false` is the only disabled state. `shared: false` is the default and
21
+ means SkillBoard does not propagate the skill; it is not isolation or a safety
22
+ judgment. `shared: true` preserves the agent-owned original and creates managed
23
+ compatible copies for other supported agents.
186
24
 
187
- When the reconciler discovers a new non-user skill that already maps to a
188
- capability, it uses `default_policy` as the recommended invocation mode. The
189
- status remains `quarantined`, so the recommendation is visible but not
190
- automatically callable.
25
+ ## Optional routing preference
191
26
 
192
- ## Harness Lifecycle
193
-
194
- Harnesses have their own state because removing a harness can break command
195
- flows even when the skills still exist:
27
+ Preference ranks enabled skills installed for the current agent. It never
28
+ changes availability and never shares files.
196
29
 
197
30
  ```yaml
198
- harnesses:
199
- lazycodex:
200
- status: fallback
201
- workflows:
202
- - large-refactor-workflow
203
- commands:
204
- - $ulw-plan
205
- - $start-work
31
+ test-first:
32
+ enabled: true
33
+ shared: false
34
+ preference:
35
+ intents:
36
+ - implementation
37
+ - testing
38
+ priority: 100
206
39
  ```
207
40
 
208
- The reconciler treats missing configured harnesses as migration events and
209
- newly detected harnesses as disabled until a workflow opts in.
41
+ An explicit user selection wins when the guard allows it. A high priority cannot
42
+ enable a disabled skill or make a skill appear on an agent where it is absent.
210
43
 
211
- ## Install Units
44
+ ## Generated inventory
212
45
 
213
- SkillBoard models packaged agent runtime changes as install units. This keeps a
214
- plugin bundle or opinionated harness installer from being flattened into a list
215
- of unrelated skills.
46
+ `~/.skillboard/inventory.json` is generated observation data. Its `installed_on`
47
+ list tells routing and guard which supported agents can see each skill. Users do
48
+ not maintain an agent matrix in policy.
216
49
 
217
- Supported install unit kinds:
50
+ Source, provenance, install-unit, path, digest, alias, and risk observations are
51
+ optional audit metadata and never determine availability. Runtime and action
52
+ authorization are outside SkillBoard's scope and remain with the agent or
53
+ harness.
218
54
 
219
- - `skill`
220
- - `plugin`
221
- - `marketplace`
222
- - `package-manager-dependency`
223
- - `harness`
224
- - `mcp-server`
225
- - `hook`
226
- - `agent`
227
- - `lsp`
55
+ ## Installation default
228
56
 
229
- Each unit can record:
57
+ A newly discovered valid skill receives `enabled: true` and `shared: false`.
58
+ Inventory refresh preserves existing user policy. After the owning installer
59
+ permanently removes a skill, `skillboard skill forget <skill-id>` explicitly
60
+ removes its stale unshared policy; it never deletes skill files.
230
61
 
231
- - source command or package origin;
232
- - install scope such as user-global, project, local, or admin;
233
- - manifest and cache paths;
234
- - provided components;
235
- - modified config files;
236
- - auto-update and enable/disable state;
237
- - workflow dependencies;
238
- - permission risk;
239
- - rollback shape.
62
+ ## Version 1 migration reference
240
63
 
241
- Example:
64
+ Version 1 is accepted only as read-only migration input during the v0.3.x
65
+ window:
242
66
 
243
- ```yaml
244
- install_units:
245
- lazycodex.omo:
246
- kind: harness
247
- source: npx lazycodex-ai install
248
- scope: user-global
249
- manifest_path: ~/.codex/plugins/cache/sisyphuslabs/omo/plugin.json
250
- cache_path: ~/.codex/plugins/cache/sisyphuslabs/omo
251
- provided_components:
252
- - skills
253
- - commands
254
- - mcp-server
255
- - hook
256
- components:
257
- skills:
258
- - lazycodex.ulw-plan
259
- commands:
260
- - $ulw-plan
261
- - $start-work
262
- hooks:
263
- - post-tool-use
264
- mcp_servers:
265
- - omo-docs
266
- modified_config_files:
267
- - ~/.codex/config.toml
268
- - ~/.local/bin
269
- auto_update: false
270
- enabled: true
271
- workflow_dependencies:
272
- - large-refactor-workflow
273
- permission_risk: high
274
- rollback: manual
67
+ ```bash
68
+ skillboard migrate v2 --config <path> --json
69
+ skillboard migrate v2 --config <path> --yes --json
70
+ skillboard migrate v2 --config <path> --rollback <backup> --json
275
71
  ```
276
72
 
277
- The `examples/multi-source.config.yaml` fixture models a private skill source
278
- plus `mattpocock/skills`, `code-yeongyu/oh-my-openagent`,
279
- `anthropics/skills`, `wshobson/agents`, and
280
- `VoltAgent/awesome-agent-skills` in one workspace. It is intentionally a
281
- reproducible policy fixture, not a network installer.
282
-
283
- ## Reconciliation
284
-
285
- SkillBoard compares desired state with actual state:
286
-
287
- - Desired state: config, workflows, capabilities, harnesses, and policy.
288
- - Actual state: discovered `SKILL.md` files and detected harnesses.
289
- - Reconcile plan: automatic safe actions plus decisions requiring approval.
290
-
291
- Safe automatic defaults:
292
-
293
- - Trusted user-local skills become `status: active` with
294
- `invocation: manual-only` only when SkillBoard has no existing workflow
295
- metadata and can create a local manual workflow.
296
- - Trusted user-local skills discovered after workflows exist become
297
- `candidate` / `manual-only` with a review note instead of being attached to an
298
- arbitrary workflow.
299
- - Runtime-supplied, external, system, or unreviewed skills are quarantined from
300
- automatic use and surfaced as decisions when a safe review path exists.
301
- - New harnesses detected by reconciliation are disabled until workflows opt in.
302
- - Removed skills and harnesses produce impact reports before config changes.
303
- - Capability matches are surfaced as recommendations, not auto-activation.
73
+ v0.4.0 removes the v1 reader.
@@ -1,96 +1,29 @@
1
1
  # Positioning
2
2
 
3
- ## Problem
3
+ SkillBoard solves overlap routing for people who use different skill sets in
4
+ multiple AI agents.
4
5
 
5
- AI agent skills are easy to install but hard to route consistently once several
6
- similar skills are broadly available.
6
+ Its durable policy answers two questions:
7
7
 
8
- Users lose confidence when they cannot tell:
8
+ 1. Is this skill enabled?
9
+ 2. Should this one skill remain agent-local or be shared across agents?
9
10
 
10
- - which installed skills are active,
11
- - which skills may be invoked automatically,
12
- - which workflows depend on a skill,
13
- - which similar skills compete silently,
14
- - whether removing a skill breaks a hidden workflow.
15
- - what to do after new skills or harnesses appear.
16
- - how to migrate workflows when a harness disappears.
17
- - which plugin, marketplace, package, or installer introduced a component.
11
+ Optional preference ranks enabled skills installed for the current agent and
12
+ never changes availability.
18
13
 
19
- ## Product Definition
14
+ ## Difference from distribution tools
20
15
 
21
- SkillBoard is a workflow-scoped skill routing board with a reconciler.
16
+ A pure distribution tool copies a selected set everywhere. SkillBoard observes
17
+ agent-local installations, routes among what the current agent can actually use,
18
+ and promotes only explicitly selected skills into managed sharing. Users do not
19
+ need to flatten every agent into one global skill set.
22
20
 
23
- It is not primarily a skill catalog or a deny-first permission wall. It is an
24
- operations layer that keeps skills broadly usable, turns overlap into a visible
25
- route, and still checks policy before invocation. Users define intent and
26
- policy; SkillBoard interprets drift between desired state and actual state.
21
+ Source scanners and permission systems remain separate. Source and provenance
22
+ observations are audit metadata and never determine availability.
23
+ Runtime and action authorization are outside SkillBoard's policy scope.
27
24
 
28
- ## Adjacent Tools
25
+ ## Product promise
29
26
 
30
- - `skillshare`: syncs skills across many agent targets.
31
- - Microsoft APM: reproduces agent context from `apm.yml` and lockfiles.
32
- - SkillGate/SkillGuard/SkillScope-style tools: scan, permissions, and security
33
- risk.
34
- - SkillPilot/skill routers: pick relevant skills before inference.
35
-
36
- SkillBoard complements those tools by making invocation state, workflow impact,
37
- and migration decisions explicit.
38
-
39
- ## Runtime Primitive Model
40
-
41
- SkillBoard should not depend on one installer shape. The likely ecosystem
42
- direction is manifest plus scope plus bundle plus cache plus enable/disable plus
43
- lockfile plus audit. That means the control plane needs a parent abstraction for
44
- the thing that was installed.
45
-
46
- The parent is an install unit. Skills and harnesses can then be child components
47
- of a `plugin`, `marketplace`, `package-manager-dependency`, `harness`,
48
- `mcp-server`, `hook`, `agent`, or `lsp` unit. LazyCodex-style installers should
49
- therefore show up as user-global harness/plugin bundles that provide commands,
50
- skills, MCP integrations, hooks, and config changes, not as loose skills mixed
51
- into the skill list.
52
-
53
- Users should be able to plug in workflow/harness bundles, then add only a small
54
- number of personal global meta skills. Those global meta skills are for control
55
- tasks such as routing, impact analysis, registry maintenance, and verification.
56
- Everything else should remain scoped to a workflow or owned by its parent install
57
- unit. This is how SkillBoard keeps skill count growth from becoming routing
58
- complexity.
59
-
60
- The multi-source fixture exercises this product claim with one private skill
61
- source plus five external repositories: a personal skill folder, a workflow skill
62
- pack, a harness bundle, a standard Agent Skills repository, a multi-harness
63
- plugin marketplace, and a catalog-style marketplace.
64
-
65
- Import adapters should follow the same principle. Popular repositories can have
66
- bundled source profiles, but the import logic should not branch on repository
67
- names. The stable contract is the normalized install-unit model, not a hardcoded
68
- adapter per source.
69
-
70
- ## Wedge
71
-
72
- The first useful wedge is:
73
-
74
- 1. read an existing skill folder,
75
- 2. read a strong workflow policy config,
76
- 3. quarantine newly discovered skills,
77
- 4. show active/manual/blocked state,
78
- 5. fail CI when policy references drift,
79
- 6. show disable impact before cleanup,
80
- 7. produce a reconcile plan when skills or harnesses change.
81
- 8. show the install unit that introduced a skill, harness, hook, MCP server, or
82
- command.
83
-
84
- That is enough to make adding and removing skills feel safer.
85
-
86
- ## Reconciler Promise
87
-
88
- Control should not mean constant manual work. The reconciler should handle the
89
- obvious safe defaults and only ask for important decisions:
90
-
91
- - new skills: quarantine, map likely capability, ask whether to approve;
92
- - removed skills: show affected workflows and fallback capabilities;
93
- - changed harnesses: show missing commands and migration hints;
94
- - new harnesses: disable by default until explicitly assigned;
95
- - duplicate or overlapping skills: group by capability, keep allowed skills
96
- available, and recommend a canonical route for the current workflow.
27
+ Installing a valid skill makes it enabled and agent-local. Ordinary use never
28
+ waits for quarantine or source review. Users intervene only to disable it,
29
+ share or unshare that skill, or remember a routing preference.
package/docs/profiles.md CHANGED
@@ -1,166 +1,34 @@
1
1
  # Source Profiles
2
2
 
3
- SkillBoard imports skill repositories through **source profiles**. A profile is a YAML file that tells SkillBoard how to find `SKILL.md` files in a source tree and how to classify the skills it finds, without writing repository-specific code.
3
+ Source profiles teach inventory discovery where a skill pack stores skills and
4
+ how paths map to stable ids. They do not authorize availability.
4
5
 
5
- ## Why Profiles Exist
6
+ ## Profile YAML structure
6
7
 
7
- Agent skill repositories come in many layouts:
8
-
9
- - `skills/<category>/<skill>/SKILL.md`
10
- - `<skill>/SKILL.md`
11
- - deprecated or in-progress folders with special rules
12
- - namespaces such as `matt.tdd` or `anthropic.requirement-intake`
13
-
14
- Instead of hardcoding `if (repo === "mattpocock/skills")` branches, SkillBoard reads a declarative profile. The same importer code works for every source.
15
-
16
- ## Profile Location
17
-
18
- Built-in profiles ship with the CLI under `profiles/`:
19
-
20
- - `profiles/mattpocock-skills.yaml`
21
- - `profiles/anthropics-skills.yaml`
22
- - `profiles/oh-my-openagent.yaml`
23
- - `profiles/wshobson-agents.yaml`
24
- - `profiles/voltagent-awesome-agent-skills.yaml`
25
-
26
- Project-specific profiles can live under `.skillboard/profiles/`:
27
-
28
- ```bash
29
- skillboard import --profile .skillboard/profiles/my-team.yaml --source-root /path/to/repo
30
- ```
31
-
32
- ## Profile YAML Structure
33
-
34
- ```yaml
35
- id: github.mattpocock.skills
36
- source: mattpocock/skills
37
- kind: marketplace
38
- namespace: matt
39
- target_path_prefix: matt
40
- scope: user-global
41
- default_status: vendor
42
- default_invocation: manual-only
43
- default_exposure: exported
44
- default_category: uncategorized
45
- category_path_segment: 1
46
- skill_paths:
47
- - "skills/**/SKILL.md"
48
- - "*/SKILL.md"
49
- path_rules:
50
- - pattern: "skills/deprecated/**/SKILL.md"
51
- status: deprecated
52
- invocation: deprecated
53
- category: deprecated
54
- - pattern: "skills/in-progress/**/SKILL.md"
55
- status: candidate
56
- category: in-progress
57
- provided_components:
58
- - skills
59
- permission_risk: medium
60
- rollback: reinstall
61
- ```
62
-
63
- ### Fields
64
-
65
- | Field | Required | Description |
66
- |-------|----------|-------------|
67
- | `id` | yes | Unique install-unit id used in `skillboard.config.yaml`. |
68
- | `source` | no | Human-readable source identifier, e.g. `owner/repo` or install command. |
69
- | `kind` | yes | One of the install-unit kinds: `skill`, `plugin`, `marketplace`, `harness`, `mcp-server`, `hook`, `agent`, `lsp`. |
70
- | `namespace` | no | Prefix added to every generated skill id. Empty means use the bare slug. |
71
- | `target_path_prefix` | no | Prefix added to every generated skill `path`. |
72
- | `scope` | no | Install scope: `user-global`, `project`, `local`, `admin`. |
73
- | `default_status` | no | Default skill `status`: `discovered`, `vendor`, `candidate`, `active`, `quarantined`, `blocked`, `deprecated`, etc. |
74
- | `default_invocation` | no | Default `invocation`: `manual-only`, `router-only`, `workflow-auto`, `blocked`, `deprecated`. `global-auto` is downgraded to `blocked`. |
75
- | `default_exposure` | no | Default `exposure`: `exported`, `global-meta`, `unit-managed`, `private`. |
76
- | `default_category` | no | Fallback category when no path rule or segment applies. |
77
- | `category_path_segment` | no | Reads a path segment from the matched `SKILL.md` path as category. `skills/engineering/tdd/SKILL.md` with segment `1` becomes `engineering`. |
78
- | `skill_paths` | yes | Glob patterns that identify `SKILL.md` files to import. |
79
- | `path_rules` | no | First-match overrides for paths such as `deprecated/**` or `in-progress/**`. |
80
- | `provided_components` | no | Components supplied by the install unit: `skills`, `commands`, `hooks`, `mcp_servers`. |
81
- | `permission_risk` | no | `low`, `medium`, `high`. |
82
- | `rollback` | no | Rollback strategy hint. |
83
-
84
- ## How to Add a Built-In Profile
85
-
86
- 1. **Create `profiles/<short-name>.yaml`.**
87
-
88
- Pick a short, descriptive file name. The `id` field should be a stable dotted identifier.
89
-
90
- 2. **Choose defaults that keep imported skills inactive.**
91
-
92
- New external skills should default to `vendor` or `candidate` with `manual-only` or `router-only` invocation. Do not use `global-auto` for external repositories.
93
-
94
- 3. **Add `path_rules` for repository conventions.**
95
-
96
- If the repo has `deprecated/`, `in-progress/`, or `archive/` folders, override status and invocation there.
97
-
98
- 4. **Test the profile against a real or fixture source.**
99
-
100
- ```bash
101
- skillboard import \
102
- --profile github.myorg.skills \
103
- --source-root /path/to/myorg-skills \
104
- --out .skillboard/reports/myorg-import.yaml
105
- ```
106
-
107
- Review the emitted fragment before merging.
108
-
109
- 5. **Add an integration test.**
110
-
111
- Put a minimal fixture under `test/fixtures/` or `examples/` and add a test in `test/source-profiles.test.mjs` or `test/multi-source-integration.test.mjs`.
112
-
113
- 6. **Update `package.json` `files` if needed.**
114
-
115
- Profiles are already included via `"files": [..., "profiles", ...]`.
116
-
117
- ## Example Walkthrough
118
-
119
- Given this repository layout:
120
-
121
- ```
122
- myorg-skills/
123
- engineering/
124
- tdd/
125
- SKILL.md
126
- review/
127
- SKILL.md
128
- deprecated/
129
- old-linter/
130
- SKILL.md
131
- ```
132
-
133
- and this profile:
8
+ Profiles describe `skill_paths`, `path_rules`, source class, and optional
9
+ install-unit observations. Import emits inventory/audit metadata and v2 policy
10
+ entries for valid discovered skills. New entries default to enabled and agent-local;
11
+ existing user policy is preserved.
134
12
 
135
13
  ```yaml
136
- id: github.myorg.skills
137
- source: myorg/skills
138
- kind: marketplace
139
- namespace: myorg
140
- target_path_prefix: myorg
141
- scope: user-global
142
- default_status: vendor
143
- default_invocation: manual-only
144
- default_exposure: exported
145
- category_path_segment: 0
14
+ id: example-pack
146
15
  skill_paths:
147
- - "**/SKILL.md"
16
+ - skills/*/SKILL.md
148
17
  path_rules:
149
- - pattern: "deprecated/**/SKILL.md"
150
- status: deprecated
151
- invocation: deprecated
152
- category: deprecated
153
- provided_components:
154
- - skills
155
- permission_risk: medium
18
+ strip_prefix: skills/
19
+ strip_suffix: /SKILL.md
156
20
  ```
157
21
 
158
- SkillBoard produces:
22
+ Source, provenance, trust observations, digests, and install-unit fields are
23
+ optional audit metadata and never determine availability. Runtime and action
24
+ authorization remain outside SkillBoard.
159
25
 
160
- - `myorg.tdd` path `myorg/tdd`, category `engineering`, status `vendor`, invocation `manual-only`
161
- - `myorg.review` → path `myorg/review`, category `engineering`
162
- - `myorg.old-linter` → path `myorg/old-linter`, category `deprecated`, status `deprecated`, invocation `deprecated`
26
+ ## How to add a built-in profile
163
27
 
164
- ## When to Use a Detector Instead
28
+ 1. Add the YAML under `profiles/`.
29
+ 2. Add a fixture with representative paths.
30
+ 3. Test deterministic ids and inventory output.
31
+ 4. Test that discovery creates enabled, agent-local policy without overwriting
32
+ an existing disabled or shared entry.
165
33
 
166
- Profiles cover most repository layouts. If a source mutates config files, exposes components only through command output, or requires parsing a non-YAML manifest, use `skillboard inventory detect` or write a small detector. See [adapters.md](adapters.md) for the adapter/detector model.
34
+ Use a detector instead when an installation has no stable filesystem pattern.