agent-skillboard 0.1.1 → 0.2.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.
Files changed (58) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +154 -630
  3. package/docs/adapters.md +96 -96
  4. package/docs/ai-skill-routing-goal.md +112 -0
  5. package/docs/capabilities.md +6 -0
  6. package/docs/install.md +155 -105
  7. package/docs/plans/skillboard-variant-lifecycle-handoff.md +56 -0
  8. package/docs/policy-model.md +266 -214
  9. package/docs/positioning.md +94 -94
  10. package/docs/reference.md +349 -0
  11. package/docs/routing.md +85 -0
  12. package/docs/user-flow.md +75 -16
  13. package/docs/value-proof.md +190 -0
  14. package/docs/variant-lifecycle.md +86 -0
  15. package/docs/versioning.md +157 -138
  16. package/examples/multi-source-skills/anthropic/docx/SKILL.md +8 -8
  17. package/examples/multi-source-skills/anthropic/skill-creator/SKILL.md +8 -8
  18. package/examples/multi-source-skills/matt/grill-me/SKILL.md +8 -8
  19. package/examples/multi-source-skills/matt/tdd/SKILL.md +8 -8
  20. package/examples/multi-source-skills/omo/review-work/SKILL.md +8 -8
  21. package/examples/multi-source-skills/omo/ulw-plan/SKILL.md +8 -8
  22. package/examples/multi-source-skills/private/tdd-work-continuity/SKILL.md +8 -8
  23. package/examples/multi-source-skills/private/workflow-router/SKILL.md +8 -8
  24. package/examples/multi-source-skills/wshobson/python-testing/SKILL.md +8 -8
  25. package/examples/multi-source-skills/wshobson/security-review/SKILL.md +8 -8
  26. package/examples/skills/grill-me/SKILL.md +9 -9
  27. package/examples/skills/grill-with-docs/SKILL.md +9 -9
  28. package/examples/skills/requirement-intake/SKILL.md +9 -9
  29. package/examples/skills/tdd/SKILL.md +8 -8
  30. package/package.json +25 -20
  31. package/src/advisor/guidance.mjs +232 -0
  32. package/src/advisor/schema.mjs +2 -0
  33. package/src/advisor/skills.mjs +2 -0
  34. package/src/advisor.mjs +36 -7
  35. package/src/brief-cli.mjs +6 -5
  36. package/src/brief-renderer.mjs +225 -8
  37. package/src/cli.mjs +589 -34
  38. package/src/config-helpers.mjs +34 -18
  39. package/src/conflicts.mjs +70 -0
  40. package/src/control/can-use-guard.mjs +8 -3
  41. package/src/control/skill-crud.mjs +142 -0
  42. package/src/control/skill-variants.mjs +221 -0
  43. package/src/control/source-trust.mjs +1 -0
  44. package/src/control/variant-files.mjs +265 -0
  45. package/src/control/variant-lifecycle-config.mjs +156 -0
  46. package/src/control/variant-reset.mjs +171 -0
  47. package/src/control/variant-status.mjs +75 -0
  48. package/src/control.mjs +13 -1
  49. package/src/domain/rules/skills.mjs +60 -0
  50. package/src/domain/rules/workflows.mjs +13 -0
  51. package/src/impact.mjs +21 -12
  52. package/src/index.mjs +13 -1
  53. package/src/lifecycle-cli.mjs +18 -7
  54. package/src/lifecycle-content.mjs +29 -22
  55. package/src/route.mjs +537 -0
  56. package/src/source-verification.mjs +7 -3
  57. package/src/workspace.mjs +141 -43
  58. package/tsconfig.lsp.json +1 -1
@@ -1,74 +1,80 @@
1
- # Policy Model
2
-
3
- SkillBoard separates storage from invocation.
4
-
5
- ## Skill States
6
-
7
- - `installed`: discovered on disk from `SKILL.md`.
8
- - `declared`: present in `skillboard.config.yaml`.
9
- - `discovered`: present in actual state but not yet classified.
10
- - `quarantined`: visible to the control plane but not callable.
11
- - `active`: allowed in at least one workflow.
1
+ # Policy Model
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.
12
18
  - `active` with `invocation: manual-only`: active only for direct user invocation.
13
19
  - `active-manual`: legacy spelling accepted for compatibility.
14
- - `active-router`: active only through a policy-checked router.
15
- - `active-auto`: active for workflow-scoped automatic invocation.
16
- - `candidate`: proposed for one or more workflows, pending approval.
17
- - `canonical`: the preferred implementation for a capability.
18
- - `vendor`: kept from an upstream source, but not automatically trusted.
19
- - `blocked`: never callable.
20
- - `deprecated`: kept for historical compatibility.
21
- - `archived`: retained outside normal workflows.
22
- - `removed`: absent from actual state but retained in history or lock data.
23
-
24
- ## Skill Exposure
25
-
26
- Skill exposure controls whether a skill belongs in central governance or should
27
- stay inside a workflow or install-unit boundary.
28
-
29
- - `exported`: shared or externally visible skill governed by SkillBoard.
30
- - `global-meta`: intentionally global control skill such as a workflow router,
31
- impact analyzer, skill registry, or verification gate.
32
- - `unit-managed`: skill supplied by a parent plugin/harness install unit.
33
- - `private`: workflow-internal implementation detail.
34
-
35
- Only `global-meta` skills may use `global-auto`. This keeps a user's small set
36
- of personal control skills globally available while plugin-provided skills remain
37
- selected through workflows or install units.
38
-
39
- Skills can also declare `owner_install_unit`. This points to the source that
40
- introduced the skill, such as a private skill repository, GitHub marketplace,
41
- package manager dependency, or harness installer. SkillBoard treats owner drift
42
- as a policy error:
43
-
44
- - `components.skills` entries must reference declared skills.
45
- - A skill with `owner_install_unit` must be listed in that install unit's
46
- `components.skills`.
47
- - A component skill cannot claim a different owner than the install unit listing
48
- it.
49
- - `unit-managed` skills must declare `owner_install_unit`.
50
-
51
- ## Invocation Modes
52
-
53
- - `manual-only`: direct user invocation only.
54
- - `router-only`: selected by an approved routing skill or control layer.
55
- - `workflow-auto`: eligible for model invocation only inside workflows that list
56
- the skill.
57
- - `global-auto`: eligible everywhere. This should be rare.
58
- - `blocked`: not callable even when installed.
59
- - `deprecated`: not callable for new workflows.
60
-
61
- ## Default Policy
62
-
63
- SkillBoard assumes:
64
-
65
- ```yaml
66
- defaults:
67
- invocation_policy: deny-by-default
68
- allow_model_invocation: false
69
- require_explicit_workflow: true
70
- ```
71
-
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
+
72
78
  That means installation alone never implies automatic use.
73
79
 
74
80
  `require_explicit_workflow: true` means a `workflow-auto` skill must be scoped by
@@ -79,163 +85,209 @@ explicit policy decision rather than installation.
79
85
 
80
86
  ## AI-Mediated Availability
81
87
 
82
- `skillboard brief --json` is the AI-facing availability contract. It lets an
83
- agent answer "What your AI can use now" with grouped facts from the control
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
84
93
  plane instead of trusting installed `SKILL.md` text or inventing policy from the
85
- filesystem. Human brief text separates reviewable friction from hard blocks:
86
- "Needs your decision" means the user can make a source/skill/workflow decision
87
- once, while "Blocked for safety" means policy or provenance must change before
88
- the item is usable. The brief may include action cards when requested, but an
89
- action card is only a suggestion. It does not authorize invocation and it does
90
- not make unreviewed external skills safe for automatic use.
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.
91
102
 
92
103
  Risk-bearing action cards require user confirmation before apply. Any apply
93
104
  that mutates policy, trust, hooks, reset state, or skill references makes the
94
- previous brief stale, so the agent should rerun `skillboard brief --json` before
95
- answering another availability question or applying another action card. The
96
- runtime boundary remains `skillboard guard use ...`, run immediately before the
97
- actual skill invocation.
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.
98
113
 
99
114
  ## Workflow Activation
100
-
101
- Workflows own active skill pools:
102
-
103
- ```yaml
104
- workflows:
105
- codex-night-workflow:
106
- harness: codex
107
- active_skills:
108
- - meerkat.requirement-intake
109
- - matt.tdd
110
- blocked_skills:
111
- - matt.grill-me
112
- ```
113
-
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
+
114
129
  The generated lockfile pins install-unit source/cache digests, skill content
115
130
  digests, workflow bindings, and policy decisions.
116
-
117
- ## Capabilities
118
-
119
- Workflows should depend on capabilities when possible, with skills acting as
120
- implementations:
121
-
122
- ```yaml
123
- capabilities:
124
- requirement-clarification:
125
- canonical: meerkat.requirement-intake
126
- alternatives:
127
- - matt.grill-me
128
- - matt.grill-with-docs
129
- default_policy: router-only
130
- ```
131
-
132
- This lets SkillBoard suggest replacements when a skill is removed and group
133
- overlapping skills by role instead of by name alone.
134
-
131
+
132
+ ## Skill Conflicts
133
+
134
+ Skills can declare known overlap or incompatibility with `conflicts_with`:
135
+
136
+ ```yaml
137
+ 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
169
+ ```
170
+
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.
186
+
135
187
  When the reconciler discovers a new non-user skill that already maps to a
136
188
  capability, it uses `default_policy` as the recommended invocation mode. The
137
189
  status remains `quarantined`, so the recommendation is visible but not
138
190
  automatically callable.
139
-
140
- ## Harness Lifecycle
141
-
142
- Harnesses have their own state because removing a harness can break command
143
- flows even when the skills still exist:
144
-
145
- ```yaml
146
- harnesses:
147
- lazycodex:
148
- status: fallback
149
- workflows:
150
- - large-refactor-workflow
151
- commands:
152
- - $ulw-plan
153
- - $start-work
154
- ```
155
-
156
- The reconciler treats missing configured harnesses as migration events and
157
- newly detected harnesses as disabled until a workflow opts in.
158
-
159
- ## Install Units
160
-
161
- SkillBoard models packaged agent runtime changes as install units. This keeps a
162
- plugin bundle or opinionated harness installer from being flattened into a list
163
- of unrelated skills.
164
-
165
- Supported install unit kinds:
166
-
167
- - `skill`
168
- - `plugin`
169
- - `marketplace`
170
- - `package-manager-dependency`
171
- - `harness`
172
- - `mcp-server`
173
- - `hook`
174
- - `agent`
175
- - `lsp`
176
-
177
- Each unit can record:
178
-
179
- - source command or package origin;
180
- - install scope such as user-global, project, local, or admin;
181
- - manifest and cache paths;
182
- - provided components;
183
- - modified config files;
184
- - auto-update and enable/disable state;
185
- - workflow dependencies;
186
- - permission risk;
187
- - rollback shape.
188
-
189
- Example:
190
-
191
- ```yaml
192
- install_units:
193
- lazycodex.omo:
194
- kind: harness
195
- source: npx lazycodex-ai install
196
- scope: user-global
197
- manifest_path: ~/.codex/plugins/cache/sisyphuslabs/omo/plugin.json
198
- cache_path: ~/.codex/plugins/cache/sisyphuslabs/omo
199
- provided_components:
200
- - skills
201
- - commands
202
- - mcp-server
203
- - hook
204
- components:
205
- skills:
206
- - lazycodex.ulw-plan
207
- commands:
208
- - $ulw-plan
209
- - $start-work
210
- hooks:
211
- - post-tool-use
212
- mcp_servers:
213
- - omo-docs
214
- modified_config_files:
215
- - ~/.codex/config.toml
216
- - ~/.local/bin
217
- auto_update: false
218
- enabled: true
219
- workflow_dependencies:
220
- - large-refactor-workflow
221
- permission_risk: high
222
- rollback: manual
223
- ```
224
-
225
- The `examples/multi-source.config.yaml` fixture models a private skill source
226
- plus `mattpocock/skills`, `code-yeongyu/oh-my-openagent`,
227
- `anthropics/skills`, `wshobson/agents`, and
228
- `VoltAgent/awesome-agent-skills` in one workspace. It is intentionally a
229
- reproducible policy fixture, not a network installer.
230
-
231
- ## Reconciliation
232
-
233
- SkillBoard compares desired state with actual state:
234
-
235
- - Desired state: config, workflows, capabilities, harnesses, and policy.
236
- - Actual state: discovered `SKILL.md` files and detected harnesses.
237
- - Reconcile plan: automatic safe actions plus decisions requiring approval.
238
-
191
+
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:
196
+
197
+ ```yaml
198
+ harnesses:
199
+ lazycodex:
200
+ status: fallback
201
+ workflows:
202
+ - large-refactor-workflow
203
+ commands:
204
+ - $ulw-plan
205
+ - $start-work
206
+ ```
207
+
208
+ The reconciler treats missing configured harnesses as migration events and
209
+ newly detected harnesses as disabled until a workflow opts in.
210
+
211
+ ## Install Units
212
+
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.
216
+
217
+ Supported install unit kinds:
218
+
219
+ - `skill`
220
+ - `plugin`
221
+ - `marketplace`
222
+ - `package-manager-dependency`
223
+ - `harness`
224
+ - `mcp-server`
225
+ - `hook`
226
+ - `agent`
227
+ - `lsp`
228
+
229
+ Each unit can record:
230
+
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.
240
+
241
+ Example:
242
+
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
275
+ ```
276
+
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
+
239
291
  Safe automatic defaults:
240
292
 
241
293
  - Trusted user-local skills become `status: active` with