agent-skillboard 0.1.2 → 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.
- package/README.md +154 -631
- package/docs/adapters.md +96 -96
- package/docs/ai-skill-routing-goal.md +112 -0
- package/docs/capabilities.md +6 -0
- package/docs/install.md +155 -105
- package/docs/plans/skillboard-variant-lifecycle-handoff.md +56 -0
- package/docs/policy-model.md +266 -214
- package/docs/positioning.md +94 -94
- package/docs/reference.md +349 -0
- package/docs/routing.md +85 -0
- package/docs/user-flow.md +75 -16
- package/docs/value-proof.md +190 -0
- package/docs/variant-lifecycle.md +86 -0
- package/docs/versioning.md +149 -138
- package/examples/multi-source-skills/anthropic/docx/SKILL.md +8 -8
- package/examples/multi-source-skills/anthropic/skill-creator/SKILL.md +8 -8
- package/examples/multi-source-skills/matt/grill-me/SKILL.md +8 -8
- package/examples/multi-source-skills/matt/tdd/SKILL.md +8 -8
- package/examples/multi-source-skills/omo/review-work/SKILL.md +8 -8
- package/examples/multi-source-skills/omo/ulw-plan/SKILL.md +8 -8
- package/examples/multi-source-skills/private/tdd-work-continuity/SKILL.md +8 -8
- package/examples/multi-source-skills/private/workflow-router/SKILL.md +8 -8
- package/examples/multi-source-skills/wshobson/python-testing/SKILL.md +8 -8
- package/examples/multi-source-skills/wshobson/security-review/SKILL.md +8 -8
- package/examples/skills/grill-me/SKILL.md +9 -9
- package/examples/skills/grill-with-docs/SKILL.md +9 -9
- package/examples/skills/requirement-intake/SKILL.md +9 -9
- package/examples/skills/tdd/SKILL.md +8 -8
- package/package.json +7 -3
- package/src/advisor/guidance.mjs +232 -0
- package/src/advisor/schema.mjs +2 -0
- package/src/advisor/skills.mjs +2 -0
- package/src/advisor.mjs +36 -7
- package/src/brief-cli.mjs +6 -5
- package/src/brief-renderer.mjs +225 -8
- package/src/cli.mjs +574 -27
- package/src/config-helpers.mjs +34 -18
- package/src/conflicts.mjs +70 -0
- package/src/control/can-use-guard.mjs +8 -3
- package/src/control/skill-crud.mjs +142 -0
- package/src/control/skill-variants.mjs +221 -0
- package/src/control/source-trust.mjs +1 -0
- package/src/control/variant-files.mjs +265 -0
- package/src/control/variant-lifecycle-config.mjs +156 -0
- package/src/control/variant-reset.mjs +171 -0
- package/src/control/variant-status.mjs +75 -0
- package/src/control.mjs +13 -1
- package/src/domain/rules/skills.mjs +60 -0
- package/src/domain/rules/workflows.mjs +13 -0
- package/src/impact.mjs +21 -12
- package/src/index.mjs +13 -1
- package/src/lifecycle-cli.mjs +18 -7
- package/src/lifecycle-content.mjs +29 -22
- package/src/route.mjs +537 -0
- package/src/source-verification.mjs +7 -3
- package/src/workspace.mjs +141 -43
- package/tsconfig.lsp.json +1 -1
package/docs/policy-model.md
CHANGED
|
@@ -1,74 +1,80 @@
|
|
|
1
|
-
# Policy Model
|
|
2
|
-
|
|
3
|
-
SkillBoard separates storage from invocation.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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.
|
|
83
|
-
|
|
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.
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
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
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
actual skill
|
|
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
|
-
##
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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
|