agent-skillboard 0.2.18 → 0.3.1
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.
- package/CHANGELOG.md +85 -0
- package/README.md +161 -255
- package/bin/postinstall.mjs +2 -1
- package/docs/adapters.md +37 -113
- package/docs/ai-skill-routing-goal.md +41 -108
- package/docs/capabilities.md +17 -104
- package/docs/install.md +70 -473
- package/docs/policy-model.md +50 -280
- package/docs/positioning.md +19 -86
- package/docs/profiles.md +21 -153
- package/docs/reference.md +133 -362
- package/docs/rollout-runbook.md +23 -25
- package/docs/routing.md +23 -90
- package/docs/user-flow.md +68 -279
- package/docs/value-proof.md +23 -181
- package/docs/variant-lifecycle.md +47 -67
- package/docs/versioning.md +49 -269
- package/examples/v2-multi-source.config.yaml +35 -0
- package/examples/v2-policy-error.config.yaml +6 -0
- package/package.json +1 -1
- package/src/advisor/actions.mjs +102 -6
- package/src/advisor/application-commands.mjs +10 -9
- package/src/advisor/apply-action.mjs +74 -1
- package/src/advisor/guidance.mjs +24 -16
- package/src/advisor/schema.mjs +17 -6
- package/src/advisor/skills.mjs +18 -5
- package/src/advisor.mjs +27 -9
- package/src/agent-integration-cli.mjs +96 -13
- package/src/agent-integration-content.mjs +21 -11
- package/src/agent-integration-files.mjs +1 -1
- package/src/agent-integration-home.mjs +14 -1
- package/src/agent-inventory-platforms.mjs +21 -8
- package/src/agent-inventory.mjs +44 -16
- package/src/agent-root-registry.mjs +127 -0
- package/src/agent-skill-import.mjs +2 -2
- package/src/agent-skill-roots.mjs +70 -13
- package/src/audit-paths.mjs +42 -0
- package/src/brief-cli.mjs +3 -2
- package/src/brief-renderer.mjs +1 -0
- package/src/cli.mjs +521 -235
- package/src/compatibility.mjs +24 -0
- package/src/control/can-use-guard.mjs +21 -1
- package/src/control/config-write.mjs +32 -2
- package/src/control/skill-crud.mjs +5 -0
- package/src/control/v2-guard.mjs +175 -0
- package/src/control/v2-skill-crud.mjs +32 -0
- package/src/control/v2-skill-forget.mjs +38 -0
- package/src/control/variant-status.mjs +47 -1
- package/src/control.mjs +55 -0
- package/src/doctor.mjs +71 -5
- package/src/domain/v2-policy.mjs +111 -0
- package/src/hook-plan.mjs +33 -3
- package/src/impact.mjs +52 -29
- package/src/index.mjs +25 -1
- package/src/init.mjs +50 -34
- package/src/install-health.mjs +177 -0
- package/src/inventory-install-units.mjs +63 -0
- package/src/inventory-json.mjs +279 -0
- package/src/inventory-refresh.mjs +168 -19
- package/src/lifecycle-cli.mjs +40 -12
- package/src/lifecycle-content.mjs +52 -67
- package/src/migration/v1-to-v2.mjs +212 -0
- package/src/migration/v2-files.mjs +211 -0
- package/src/migration/v2-journal.mjs +169 -0
- package/src/migration/v2-projection.mjs +108 -0
- package/src/migration/v2-transaction.mjs +205 -0
- package/src/policy.mjs +3 -0
- package/src/reconcile.mjs +139 -111
- package/src/report.mjs +168 -148
- package/src/review.mjs +2 -0
- package/src/route-advisory.mjs +47 -2
- package/src/route-selection.mjs +38 -2
- package/src/route.mjs +62 -2
- package/src/shared-skill-reconcile.mjs +97 -0
- package/src/shared-skill.mjs +325 -0
- package/src/source-digest.mjs +42 -0
- package/src/source-profiles.mjs +171 -144
- package/src/source-verification.mjs +32 -48
- package/src/uninstall.mjs +22 -0
- package/src/user-state-paths.mjs +19 -0
- package/src/user-uninstall.mjs +161 -0
- package/src/workspace.mjs +119 -79
package/docs/policy-model.md
CHANGED
|
@@ -1,303 +1,73 @@
|
|
|
1
1
|
# Policy Model
|
|
2
2
|
|
|
3
|
-
SkillBoard
|
|
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
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
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
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
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
|
-
|
|
209
|
-
|
|
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
|
-
##
|
|
44
|
+
## Generated inventory
|
|
212
45
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
64
|
+
Version 1 is accepted only as read-only migration input during the v0.3.x
|
|
65
|
+
window:
|
|
242
66
|
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
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
|
-
|
|
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.
|
package/docs/positioning.md
CHANGED
|
@@ -1,96 +1,29 @@
|
|
|
1
1
|
# Positioning
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
SkillBoard solves overlap routing for people who use different skill sets in
|
|
4
|
+
multiple AI agents.
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
similar skills are broadly available.
|
|
6
|
+
Its durable policy answers two questions:
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
1. Is this skill enabled?
|
|
9
|
+
2. Should this one skill remain agent-local or be shared across agents?
|
|
9
10
|
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
##
|
|
14
|
+
## Difference from distribution tools
|
|
20
15
|
|
|
21
|
-
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
##
|
|
25
|
+
## Product promise
|
|
29
26
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
6
|
+
## Profile YAML structure
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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:
|
|
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
|
-
-
|
|
16
|
+
- skills/*/SKILL.md
|
|
148
17
|
path_rules:
|
|
149
|
-
|
|
150
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
34
|
+
Use a detector instead when an installation has no stable filesystem pattern.
|