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
package/README.md CHANGED
@@ -1,668 +1,192 @@
1
1
  # SkillBoard
2
2
 
3
- Know which agent skills can run before they run.
3
+ Use the right AI-agent skills without managing another checklist.
4
4
 
5
- SkillBoard is a policy and visibility layer for AI coding-agent skills. It is
6
- for developers who already have skill folders, plugins, MCP tools, hooks, or
7
- marketplaces, but still cannot answer the operational question that matters
8
- most:
5
+ Ask your AI normal questions: "what skills can you use?", "which skill should
6
+ write tests first?", or "can you make this reviewed skill available here?"
7
+ SkillBoard runs behind the scenes so you get the benefit: the right allowed
8
+ skill, a short disclosure of what was used, and fewer setup interruptions.
9
9
 
10
- > Which skills can run in this workflow, why, and what breaks if I remove one?
10
+ The burden stays low:
11
11
 
12
- SkillBoard separates "installed" from "allowed". A skill can be present in a
13
- repository without being eligible for model invocation. Workflows choose the
14
- active pool, automatic invocation is denied by default, and the reconciler turns
15
- skill or harness drift into safe defaults plus a short list of decisions that
16
- actually need user approval.
12
+ - No global install is required; use `npx --yes --package agent-skillboard`.
13
+ - Most use is read-only: `brief`, `route`, `doctor`, and `guard use` answer
14
+ what is safe now.
15
+ - Nothing changes until you approve a policy action.
16
+ - Project cleanup is conservative and previewable with `skillboard uninstall --dry-run`.
17
17
 
18
- <p align="center">
19
- <img src="https://raw.githubusercontent.com/NyXXiR/skillboard/main/skillboard.png" alt="SkillBoard architecture diagram: sources, inventory scanner, SkillBoard model, policy engine, and user and agent surfaces." width="100%">
20
- </p>
18
+ Under the hood, SkillBoard is workflow-scoped skill policy and routing for AI
19
+ agents. It separates `installed` from `allowed`, checks workflow policy and
20
+ guard state before use, and leaves a clear record of which skill influenced the
21
+ answer.
21
22
 
22
- ## The Problem
23
+ Start with normal requests:
23
24
 
24
- You installed a few agent skill packs.
25
+ - "What skills can you use in this project?"
26
+ - "Which skill should you use to write tests first?"
27
+ - "Can you make `anthropic.docx` available for this workflow?"
28
+ - "Why is this skill blocked?"
25
29
 
26
- Now every repository has a growing pile of `SKILL.md` files, plugin-provided
27
- tools, hooks, MCP servers, and workflow rules. Before an agent starts working,
28
- you still need to know:
30
+ Your AI runs SkillBoard behind the scenes, reads the current brief, checks the
31
+ guard automatically before invoking an allowed skill, and asks only before
32
+ policy-changing actions. For already-allowed skills, it should say which skill
33
+ it is about to use and which skill it used, not interrupt you for another
34
+ approval. That disclosure is an audit trace, not a permission prompt. You do
35
+ not need to memorize the SkillBoard command loop.
29
36
 
30
- - Which skills are merely installed?
31
- - Which skills are allowed to run in this workflow?
32
- - Which skills can be invoked automatically?
33
- - What changes if I disable one?
34
- - Did a plugin or runtime update silently add new capabilities?
37
+ A normal allowed-skill turn can look like this:
35
38
 
36
- SkillBoard turns that mess into an explicit skill map.
39
+ - You: "Which skill should you use to write tests first?"
40
+ - AI: "I will use matt.tdd for this request."
41
+ - AI: "I used matt.tdd for this request."
37
42
 
38
- ## What SkillBoard Gives You
43
+ Names you may see in setup and logs:
39
44
 
40
- - A skill inventory that separates installed from active.
41
- - Workflow-scoped allowlists for automatic invocation.
42
- - Quarantine for newly discovered skills.
43
- - Impact reports before disabling or migrating skills.
44
- - Agent bridge files so Codex and Claude Code follow the same policy.
45
- - An AI-facing brief so agents can explain availability without guessing from
46
- raw `SKILL.md` files.
45
+ - `SkillBoard`: the product and policy model.
46
+ - `agent-skillboard`: the npm package.
47
+ - `skillboard`: the CLI binary.
47
48
 
48
- ## Demo
49
+ Use SkillBoard when your agent setup has grown beyond one trusted skill folder
50
+ and you want workflow-scoped control without turning skill governance into a
51
+ manual checklist. If you are changing routing, brief, bridge, policy, or
52
+ workflow UX, read [AI Skill Routing Goal](docs/ai-skill-routing-goal.md) first;
53
+ it defines the non-blocking `observe → route → work → explain briefly → ask
54
+ after → remember policy` loop that development should preserve.
49
55
 
50
- ```bash
51
- skillboard init
52
- skillboard doctor
53
- skillboard brief --json --workflow codex-night-workflow
54
- skillboard list skills --workflow codex-night-workflow
55
- skillboard can-use matt.tdd --workflow codex-night-workflow
56
- skillboard impact disable matt.tdd
57
- ```
58
-
59
- Example dashboard output:
60
-
61
- ```markdown
62
- ## Skills
56
+ <p align="center">
57
+ <img src="https://raw.githubusercontent.com/NyXXiR/skillboard/main/skillboard.png" alt="SkillBoard architecture diagram: sources, inventory scanner, SkillBoard model, policy engine, and user and agent surfaces." width="100%">
58
+ </p>
63
59
 
64
- - `private.tdd-work-continuity` active, manual-only, local, owner: `user.local`
65
- - `matt.tdd` — active, workflow-auto, exported, owner: `github.mattpocock.skills`
66
- - `vendor.experimental-review` — quarantined, blocked, vendor, owner: `new.runtime.bundle`
60
+ ## Why Not Just List `/skills`?
67
61
 
68
- ## Reconcile Plan
62
+ A raw skill list answers what is declared. SkillBoard answers what can safely
63
+ run now.
69
64
 
70
- - quarantine new skills until a workflow explicitly opts in
71
- - report workflows affected before a skill or harness is disabled
72
- ```
65
+ Same fixture, different answer:
73
66
 
74
- ## Why This Exists
75
-
76
- Agent skill tooling is moving fast. `skillshare` is good at syncing skills across
77
- agent targets. Microsoft APM focuses on reproducible agent context from a
78
- manifest and lockfile. Security scanners such as SkillGate/SkillGuard focus on
79
- trust and risk.
80
-
81
- SkillBoard is deliberately narrower:
82
-
83
- - Deny automatic invocation by default.
84
- - Activate skills per workflow, not globally.
85
- - Separate installed, active, manual-only, router-only, workflow-auto, blocked,
86
- and deprecated states.
87
- - Quarantine newly discovered skills instead of auto-enabling them.
88
- - Treat harness additions/removals as migration events, not silent breakage.
89
- - Track capabilities so workflows can depend on roles instead of only skill ids.
90
- - Track install units so plugin bundles, package-manager dependencies, harnesses,
91
- MCP servers, hooks, agents, and LSPs are not flattened into skill names.
92
- - Keep user-added global skills limited to explicit `global-meta` skills such as
93
- routers, impact analyzers, and verification gates.
94
- - Show a human-readable skill map before users add or remove skills.
95
- - Report impact before disabling a skill.
96
-
97
- ## MVP Status
98
-
99
- This repository is an early CLI-first foundation. It currently supports:
100
-
101
- - YAML policy config parsing.
102
- - Recursive `SKILL.md` discovery.
103
- - Source-profile import for cloned or installed skill repositories.
104
- - Capability and harness config parsing.
105
- - Agent runtime install-unit inventory, including Codex plugin skills, hooks,
106
- MCP servers, commands, and modified config files when manifest metadata is
107
- available.
108
- - Strong reference checks for workflows, skills, capabilities, harnesses, and
109
- install units.
110
- - Semantic policy checks for workflow-scoped auto invocation, canonical skill
111
- claims, conflicts, status/invocation combinations, and install-unit component
112
- declarations.
113
- - Markdown dashboard generation.
114
- - Disable-impact analysis.
115
- - Reconcile plan generation for new skills, new harnesses, and removed
116
- harnesses.
117
-
118
- ## 5-Minute Quick Start
67
+ | Raw skill list | SkillBoard brief |
68
+ | --- | --- |
69
+ | `matt.tdd active workflow-auto` | `AI can use now: 0` |
70
+ | no policy health | `Blocked for safety: 8`, `Policy errors: 2` |
119
71
 
120
- Run SkillBoard in the project you want to manage:
72
+ That gap is the product. SkillBoard separates `installed` from `allowed`,
73
+ checks policy health, and gives agents a brief they can use without guessing
74
+ from raw `SKILL.md` files. The same proof also routes "write tests before
75
+ implementation" to `matt.tdd`, returns `private.tdd-work-continuity` as the
76
+ fallback, and gives the AI exact start and finish disclosure text.
121
77
 
122
- ```bash
123
- npx agent-skillboard init
124
- npx agent-skillboard brief
125
- npx agent-skillboard doctor --summary
126
- ```
78
+ See [Tested Value Proof](#tested-value-proof) for the executable proof.
127
79
 
128
- The first command creates the local control-plane files for the current
129
- directory. To manage another project from elsewhere, pass `--dir`:
80
+ ## 5-Minute Quick Start
130
81
 
131
- ```bash
132
- npx agent-skillboard init --dir /path/to/your/project
133
- npx agent-skillboard brief --dir /path/to/your/project
134
- npx agent-skillboard doctor --dir /path/to/your/project --summary
135
- ```
82
+ Ask your AI to set up SkillBoard in the project you want to manage. The AI runs
83
+ SkillBoard behind the scenes, then answers from the generated brief instead of
84
+ from memory or raw skill files.
136
85
 
137
- SkillBoard does not make installed skills automatically callable. It imports
138
- trusted local skills as manual-only and keeps runtime/plugin skills quarantined
139
- until reviewed.
86
+ Use without a global install:
140
87
 
141
- For CI or scripts, the explicit package form avoids ambiguity about the binary
142
- name:
88
+ AI/automation/operator details:
143
89
 
144
90
  ```bash
145
91
  npx --yes --package agent-skillboard skillboard init
146
- npm exec --yes --package agent-skillboard -- skillboard init
92
+ npx --yes --package agent-skillboard skillboard doctor --summary
93
+ npx --yes --package agent-skillboard skillboard brief --workflow <workflow-from-init>
147
94
  ```
148
95
 
149
- Then check the project:
96
+ `init` creates the local control-plane files, scans known local skill roots,
97
+ and writes agent bridge instructions. It prints the workflows it found and a
98
+ copyable workflow-scoped `brief` command. If `init` does not print a workflow,
99
+ run the unscoped `brief` command it prints instead. Trusted user-local skills
100
+ start as manual-only. Runtime, plugin, and external skills stay quarantined or
101
+ blocked until reviewed. The explicit package/binary spelling avoids an extra npx
102
+ install prompt and keeps the `skillboard` executable name clear.
150
103
 
151
- ```bash
152
- npx --yes --package agent-skillboard skillboard doctor
153
- ```
154
-
155
- For repeated local use, install the CLI globally:
156
-
157
- ```bash
158
- npm install -g agent-skillboard
159
- skillboard init
160
- skillboard doctor
161
- ```
162
-
163
- Unreleased GitHub builds are available for testing changes before npm release:
164
-
165
- ```bash
166
- npx --yes --package github:NyXXiR/skillboard skillboard init
167
- npx --yes --package github:NyXXiR/skillboard skillboard brief
168
- npx --yes --package github:NyXXiR/skillboard skillboard doctor --summary
169
- ```
170
-
171
- For development from a clone, run the source-tree CLI:
104
+ Remove the project bridge when you are done:
172
105
 
173
106
  ```bash
174
- git clone https://github.com/NyXXiR/skillboard.git
175
- cd skillboard
176
- npm install
177
- npm test
178
- node bin/skillboard.mjs init --dir /path/to/your/project
179
- node bin/skillboard.mjs brief --dir /path/to/your/project
180
- node bin/skillboard.mjs doctor --dir /path/to/your/project --summary
181
- ```
182
-
183
- Most examples below use the global or npm-exec `skillboard` command. When
184
- running from a clone, replace `skillboard ` with `node bin/skillboard.mjs `.
185
-
186
- Useful first commands:
187
-
188
- ```bash
189
- skillboard inventory refresh --dry-run
190
- skillboard import --profile github.mattpocock.skills --source-root /path/to/mattpocock-skills
191
- skillboard import --profile github.mattpocock.skills --source-root /path/to/mattpocock-skills --config skillboard.config.yaml --merge --dry-run
192
- skillboard check --config skillboard.config.yaml --skills skills
193
- skillboard rollout audit --config skillboard.config.yaml --skills skills --json
194
- skillboard rollout plan --config skillboard.config.yaml --skills skills --json
195
- ```
196
-
197
- `skillboard init` creates `skillboard.config.yaml`, `skills/`,
198
- `.skillboard/reports/`, `.skillboard/profiles/`, `AGENTS.md`, and `CLAUDE.md`.
199
- It also scans known local agent skill roots, including Codex user/system skills,
200
- Codex plugin-cache manifests, Claude user skills, Hermes user skills, and Hermes
201
- profile skills under `.hermes/profiles/*/skills`. Trusted user-local skills are
202
- imported as `status: active` with `invocation: manual-only` and attached to a
203
- generated local manual workflow when the project has no workflow metadata yet,
204
- so a first-time user can immediately use their own manual skills through
205
- `can-use` and guard checks without receiving legacy-state warning noise. System,
206
- plugin, and other runtime-supplied skills stay `quarantined` / `blocked`; plugin
207
- hooks, MCP servers, commands, and modified config files are attached to the
208
- owning install unit for review. The agent bridge files tell Codex-style and
209
- Claude Code agents to use `skillboard.config.yaml` as the control-plane source
210
- of truth instead of treating every installed `SKILL.md` as active.
211
-
212
- When you ask an agent "what skills can you use?", the bridge tells it to run
213
- `skillboard brief --json` before answering. The brief is designed for
214
- AI-mediated use without becoming another policy engine: it summarizes "What
215
- your AI can use now", what needs your decision, what is blocked for safety, and
216
- which change suggestions are available as action cards. Reviewable items should
217
- feel like a short decision queue, not repeated blocked chores: once the source,
218
- skill, and workflow decision is recorded, the same prompt should not return
219
- unless that input changes. Before an agent applies a risk-bearing action card,
220
- it should pick one current action id from the brief, ask for user confirmation,
221
- then use
222
- `skillboard apply-action <action-id> --yes --json` with the same config, skills,
223
- and workflow options instead of running raw action-card shell text. After a
224
- mutating `apply-action`, the agent should read the returned post-apply brief
225
- before answering the next availability question or applying another action.
226
- `apply-action` re-resolves the current brief, so stale action ids, cached action
227
- cards, and multi-action batches are refused rather than replayed.
228
- Immediately before a skill is actually invoked,
229
- `skillboard guard use ...` remains the final gate.
230
- The default text brief is compact for large skill sets: it keeps the summary,
231
- top categories, next safe action, short section previews, and short action
232
- summaries. Use `skillboard brief --verbose` when you need the full list or
233
- full copyable command details.
234
-
235
- ### Hermes System Prompt Bridge
236
-
237
- Hermes does not automatically read `AGENTS.md` or `CLAUDE.md`. To make Hermes
238
- follow the same SkillBoard policy, add a small bridge instruction to the Hermes
239
- profile or system prompt for the project:
240
-
241
- ```text
242
- Use SkillBoard as the source of truth for agent skill availability.
243
- Before answering what skills can be used, run:
244
- skillboard brief --json --dir /path/to/your/project
245
-
246
- Do not infer availability from installed SKILL.md files. Immediately before
247
- invoking a skill, run:
248
- skillboard guard use <skill-id> --workflow <workflow-name> --dir /path/to/your/project
249
-
250
- For suggested policy changes, ask the user to approve one current action id,
251
- then run:
252
- skillboard apply-action <action-id> --dir /path/to/your/project --yes --json
107
+ npx --yes --package agent-skillboard skillboard uninstall --dir /path/to/your/project --dry-run
108
+ npx --yes --package agent-skillboard skillboard uninstall --dir /path/to/your/project
253
109
  ```
254
110
 
255
- Replace `/path/to/your/project` and `<workflow-name>` with the project and
256
- workflow Hermes should operate inside.
111
+ Uninstall preserves local skills and policy files by default, and reports what
112
+ it removed or preserved.
257
113
 
258
- Example: overloaded local agent profile
114
+ See [docs/install.md](docs/install.md) for global installs, `--dir`, GitHub
115
+ builds, clone-based development, Hermes bridge setup, refresh, and uninstall.
259
116
 
260
- ```text
261
- Scanned installed agent skills: 128
262
- AI can use now: 123 (0 automatic, 123 manual)
263
- Needs your decision: 0
264
- Blocked for safety: 5
265
- Default brief: 54 lines
266
- Verbose inventory: 244 lines
267
- ```
268
-
269
- The point is not to install more skills. The point is to see that installed
270
- does not mean automatically callable, local skills stay manual-only, and risky
271
- runtime/plugin skills stay blocked until reviewed.
272
-
273
- Run `skillboard doctor` after init to see config health, bridge status, managed
274
- skill/install-unit counts, policy/source audit summaries, and the default
275
- uninstall dry-run plan. The default doctor command passes when the workspace is
276
- usable but has review-needed safe-mode warnings; add `--strict` when those
277
- warnings should fail automation. Add `--json` when an agent or script needs the
278
- same information as structured output. `skillboard status` returns the same
279
- health report for users and agents that prefer a shorter command name.
280
-
281
- See [docs/user-flow.md](docs/user-flow.md) for the first-time flow that covers
282
- adding a local skill, inspecting its influence, activating/blocking it, and
283
- removing SkillBoard policy references without deleting the underlying
284
- `SKILL.md`.
285
-
286
- Run `skillboard inventory refresh --dry-run` after installing a new local agent
287
- skill pack, plugin, workflow bundle, or harness. It reuses the same scanner as
288
- init and reports the text and YAML semantic config change plan. If the project
289
- has no workflows yet, newly discovered trusted user-local skills are attached to
290
- a generated manual workflow; if workflows already exist, those skills are kept as
291
- manual-only candidates and the refresh prints a review note to attach them with
292
- `skillboard add workflow`. Runtime or external skills remain out of automatic
293
- use until the source and workflow decisions are recorded. Broken detector
294
- entries or malformed `SKILL.md` files are reported as scan warnings instead of
295
- aborting the whole refresh.
296
-
297
- Add new local growth paths without hand-editing YAML:
298
-
299
- ```bash
300
- skillboard add harness codex --config skillboard.config.yaml --skills skills
301
- skillboard add workflow daily-workflow --harness codex --skill user.helper --config skillboard.config.yaml --skills skills
302
- ```
303
-
304
- When an installer writes runtime settings without a manifest, capture that
305
- surface explicitly:
306
-
307
- ```bash
308
- skillboard inventory detect --unit acme.runtime --config skillboard.config.yaml --install-output install.log --config-file ~/.codex/config.toml --dry-run
309
- ```
310
-
311
- For fetchable Git sources, refresh the local cache and digest pin before writing
312
- a lockfile:
313
-
314
- ```bash
315
- skillboard sources refresh --config skillboard.config.yaml --unit github.mattpocock.skills --dry-run
316
- skillboard sources refresh --config skillboard.config.yaml --unit github.mattpocock.skills
317
- ```
318
-
319
- After reviewing an imported install unit, record that decision before activating
320
- model-selectable skills from it:
321
-
322
- ```bash
323
- skillboard review install-unit github.mattpocock.skills --trust-level reviewed --config skillboard.config.yaml --skills skills
324
- ```
325
-
326
- To remove the project bridge safely:
327
-
328
- ```bash
329
- skillboard uninstall --dry-run
330
- skillboard uninstall
331
- ```
332
-
333
- `skillboard uninstall` removes only SkillBoard bridge blocks and unchanged
334
- generated helper files by default. It preserves `skillboard.config.yaml`, local
335
- skills, reports, and any user content in `AGENTS.md` or `CLAUDE.md`. Add
336
- `--remove-config` only when you want to delete an untouched default config. Use
337
- `--reset-config` when you intentionally want to discard the current
338
- `skillboard.config.yaml` and re-run `skillboard init` from a fresh policy
339
- lifecycle; local skill files, reports, and generated guard hooks are still
340
- preserved. Add `--remove-reports` with `--reset-config` when a test reset should
341
- also discard generated dashboard and impact reports. Add
342
- `--remove-hooks` with the same reset when you also want to discard the entire
343
- `.skillboard/hooks/` directory contents and remove the `.skillboard/` directory
344
- if it has no other content.
345
-
346
- Run the bundled examples from the repository root:
347
-
348
- ```bash
349
- npm install
350
- npm run check
351
- node bin/skillboard.mjs check \
352
- --config examples/multi-source.config.yaml \
353
- --skills examples/multi-source-skills
354
- node bin/skillboard.mjs list skills \
355
- --config examples/multi-source.config.yaml \
356
- --skills examples/multi-source-skills \
357
- --workflow codex-night-workflow
358
- node bin/skillboard.mjs explain private.tdd-work-continuity \
359
- --config examples/multi-source.config.yaml \
360
- --skills examples/multi-source-skills
361
- node bin/skillboard.mjs can-use matt.tdd \
362
- --workflow codex-night-workflow \
363
- --config examples/multi-source.config.yaml \
364
- --skills examples/multi-source-skills
365
- node bin/skillboard.mjs audit sources --verify \
366
- --config examples/multi-source.config.yaml \
367
- --skills examples/multi-source-skills
368
- mkdir -p .skillboard/reports
369
- node bin/skillboard.mjs lock write \
370
- --config examples/multi-source.config.yaml \
371
- --skills examples/multi-source-skills \
372
- --out .skillboard/reports/multi-source.lock.yaml \
373
- --replace
374
- node bin/skillboard.mjs apply-action <action-id> \
375
- --workflow codex-night-workflow \
376
- --config examples/multi-source.config.yaml \
377
- --skills examples/multi-source-skills \
378
- --yes --json
379
- ```
380
-
381
- For hook action cards, keep `apply-action` as the primary flow:
382
- `node bin/skillboard.mjs apply-action <action-id> ... --yes --json`. The raw
383
- hook commands below are underlying manual operator detail for previewing and
384
- materializing an executable guard hook outside the action-card approval loop:
385
-
386
- ```bash
387
- node bin/skillboard.mjs hook install \
388
- --workflow codex-night-workflow \
389
- --config examples/multi-source.config.yaml \
390
- --skills examples/multi-source-skills \
391
- --out .skillboard/reports/codex-night-guard.sh \
392
- --skillboard-bin "node bin/skillboard.mjs" \
393
- --dry-run --json
394
- node bin/skillboard.mjs hook install \
395
- --workflow codex-night-workflow \
396
- --config examples/multi-source.config.yaml \
397
- --skills examples/multi-source-skills \
398
- --out .skillboard/reports/codex-night-guard.sh \
399
- --skillboard-bin "node bin/skillboard.mjs"
400
- ```
401
-
402
- For manual hook installation, preview with `--dry-run --json` and inspect
403
- `planned.preview.shell` before an operator materializes the matching non-dry-run
404
- hook command directly.
405
- The multi-source example intentionally uses project-root-relative local paths,
406
- such as `./examples/multi-source-skills/private`, so a fresh clone can run these
407
- commands without editing machine-specific paths.
408
-
409
- ## Config Shape
410
-
411
- ```yaml
412
- version: 1
413
-
414
- defaults:
415
- invocation_policy: deny-by-default
416
- allow_model_invocation: false
417
- require_explicit_workflow: true
418
-
419
- skills:
420
- matt.tdd:
421
- path: tdd
422
- status: active
423
- invocation: workflow-auto
424
- exposure: exported
425
- category: engineering
426
-
427
- user.workflow-router:
428
- path: user/workflow-router
429
- status: active
430
- invocation: global-auto
431
- exposure: global-meta
432
- category: meta
433
-
434
- capabilities:
435
- test-first-implementation:
436
- canonical: matt.tdd
437
- alternatives:
438
- - meerkat.test-first-implementation
439
- default_policy: workflow-auto
440
-
441
- harnesses:
442
- codex:
443
- status: primary
444
- workflows:
445
- - codex-night-workflow
446
-
447
- install_units:
448
- lazycodex.omo:
449
- kind: harness
450
- source: npx lazycodex-ai install
451
- scope: user-global
452
- manifest_path: ~/.codex/plugins/cache/sisyphuslabs/omo/plugin.json
453
- cache_path: ~/.codex/plugins/cache/sisyphuslabs/omo
454
- provided_components:
455
- - skills
456
- - commands
457
- - mcp-server
458
- - hook
459
- components:
460
- skills:
461
- - lazycodex.ulw-plan
462
- commands:
463
- - $ulw-plan
464
- - $start-work
465
- hooks:
466
- - post-tool-use
467
- mcp_servers:
468
- - omo-docs
469
- modified_config_files:
470
- - ~/.codex/config.toml
471
- - ~/.local/bin
472
- auto_update: false
473
- enabled: true
474
- workflow_dependencies:
475
- - large-refactor-workflow
476
- permission_risk: high
477
- rollback: manual
478
-
479
- workflows:
480
- codex-night-workflow:
481
- harness: codex
482
- active_skills:
483
- - matt.tdd
484
- blocked_skills: []
485
- required_capabilities:
486
- test-first-implementation:
487
- preferred: matt.tdd
488
- fallback:
489
- - meerkat.test-first-implementation
490
- policy: workflow-auto
491
- ```
492
-
493
- ## Source Profiles
494
-
495
- `skillboard import` reads a source profile and emits a YAML fragment containing
496
- governed `skills` plus their owning `install_units`.
497
-
498
- ```bash
499
- skillboard import \
500
- --profile github.mattpocock.skills \
501
- --source-root /path/to/cloned-or-installed/repo \
502
- --out .skillboard/reports/import-fragment.yaml
503
- ```
504
-
505
- To preview a direct apply path, pass `--merge --config --dry-run`. Merge is
506
- non-destructive by default: if a skill or install-unit id already exists, the
507
- command fails and leaves the config unchanged. Use `--replace` only when you
508
- intend to overwrite existing entries, and drop `--dry-run` only after reviewing
509
- the reported change plan.
510
-
511
- ```bash
512
- skillboard import \
513
- --profile github.mattpocock.skills \
514
- --source-root /path/to/cloned-or-installed/repo \
515
- --config skillboard.config.yaml \
516
- --merge \
517
- --dry-run
518
- ```
519
-
520
- Built-in profiles are shipped as YAML data under `profiles/`, including:
521
-
522
- - `github.mattpocock.skills`
523
- - `github.code-yeongyu.oh-my-openagent`
524
- - `github.anthropics.skills`
525
- - `github.wshobson.agents`
526
- - `github.voltagent.awesome-agent-skills`
527
-
528
- Project-specific profiles can live under `.skillboard/profiles/` and be passed
529
- by path:
530
-
531
- ```bash
532
- skillboard import --profile .skillboard/profiles/my-source.yaml --source-root /path/to/repo
533
- ```
534
-
535
- Invocation modes:
536
-
537
- - `manual-only`: user must explicitly ask for it.
538
- - `router-only`: a router/orchestrator may select it after policy checks.
539
- - `workflow-auto`: model invocation is allowed only inside listed workflows.
540
- - `global-auto`: allowed globally; use sparingly.
541
- - `blocked`: installed but not callable until policy or provenance changes.
542
- - `deprecated`: kept for history, not for new use.
543
-
544
- Skill exposure:
545
-
546
- - `exported`: centrally governed skill that may serve shared workflows or
547
- canonical capabilities.
548
- - `global-meta`: intentionally global control skill, such as a router,
549
- impact analyzer, or verification gate. This is the only exposure that may use
550
- `global-auto`.
551
- - `unit-managed`: child component supplied by a parent install unit or harness
552
- bundle.
553
- - `private`: workflow-internal implementation detail; central governance should
554
- avoid managing it unless it becomes shared.
555
-
556
- `owner_install_unit` links a declared skill back to the package, plugin,
557
- marketplace, harness, or local source that supplied it. SkillBoard checks this
558
- both ways: install-unit `components.skills` must reference declared skills, and a
559
- skill that names an owner must be listed by that owner. `unit-managed` skills
560
- must always declare an owner.
561
-
562
- The multi-source example in `examples/multi-source.config.yaml` models one
563
- private skill source plus five external repositories:
564
-
565
- - `mattpocock/skills`
566
- - `code-yeongyu/oh-my-openagent`
567
- - `anthropics/skills`
568
- - `wshobson/agents`
569
- - `VoltAgent/awesome-agent-skills`
570
-
571
- Run the example commands from the repository root. Local example sources are
572
- written as project-root-relative paths; fetchable Git sources can be cached and
573
- pinned with `skillboard sources refresh`.
574
-
575
- ## Commands
576
-
577
- All commands below use the global `skillboard` binary. When running from a
578
- clone without `npm install -g agent-skillboard`, replace `skillboard ` with
579
- `node bin/skillboard.mjs ` and run from the repository root.
580
-
581
- ```bash
582
- skillboard init [--dir <path>] [--scan-root <dir>[,<dir>]] [--no-scan-installed]
583
- skillboard uninstall [--dir <path>] [--dry-run] [--remove-config|--reset-config] [--remove-reports] [--remove-hooks] [--keep-empty-dirs]
584
- skillboard inventory refresh [--dir <path>] [--config <path>] [--scan-root <dir>[,<dir>]] [--dry-run] [--json]
585
- skillboard inventory detect --unit <id> --config <path> [--install-output <path>] [--config-file a,b] [--source <value>] [--kind <kind>] [--scope <scope>] [--dry-run] [--json]
586
- skillboard sources refresh [--dir <path>] [--config <path>] [--unit <id>[,<id>]] [--cache-dir <dir>] [--dry-run] [--json]
587
- skillboard doctor [--dir <path>] [--config <path>] [--skills <dir>] [--verify] [--strict] [--json] [--summary]
588
- skillboard status [--dir <path>] [--config <path>] [--skills <dir>] [--verify] [--strict] [--json] [--summary]
589
- skillboard brief [--workflow <name>] [--dir <path>] [--config <path>] [--skills <dir>] [--include-actions] [--verbose] [--json]
590
- skillboard apply-action <action-id> [--workflow <name>] [--dir <path>] [--config <path>] [--skills <dir>] [--dry-run] [--yes] [--allow-destructive] [--json]
591
- skillboard import --profile <id-or-path> --source-root <dir> [--profile-dirs a,b] [--out <path>]
592
- skillboard import --profile <id-or-path> --source-root <dir> --config <path> --merge [--replace] [--dry-run]
593
- skillboard scan --config <path> --skills <dir>
594
- skillboard check --config <path> --skills <dir>
595
- skillboard list [skills|workflows|harnesses|install-units] --config <path> --skills <dir>
596
- skillboard explain <skill-id> --config <path> --skills <dir>
597
- skillboard can-use <skill-id> --workflow <name> --config <path> --skills <dir>
598
- skillboard guard use <skill-id> --workflow <name> --config <path> --skills <dir>
599
- skillboard audit sources --config <path> --skills <dir> [--verify]
600
- skillboard rollout [audit|plan|apply|rollback|report] [--dir <path>] [--config <path>] [--skills <dir>] [--transaction <id>] [--json]
601
- skillboard hook install --workflow <name> --config <path> --skills <dir> [--out <path>] [--skillboard-bin <path>] [--dry-run] [--json]
602
- skillboard lock write --config <path> --skills <dir> [--out <path>] [--replace] [--allow-unverified]
603
- skillboard review install-unit <unit-id> [--trust-level trusted|reviewed|unreviewed|blocked] --config <path> --skills <dir>
604
- skillboard add skill <skill-id> --path <relative-skill-path> --config <path> --skills <dir>
605
- skillboard add workflow <workflow-name> --harness <harness-name> --config <path> --skills <dir> [--skill <id>[,<id>]]
606
- skillboard add harness <harness-name> --config <path> --skills <dir> [--status <status>] [--command <cmd>[,<cmd>]]
607
- skillboard activate <skill-id> --workflow <name> --config <path> --skills <dir>
608
- skillboard block <skill-id> --workflow <name> --config <path> --skills <dir>
609
- skillboard quarantine <skill-id> --config <path> --skills <dir>
610
- skillboard prefer <skill-id> --workflow <name> --capability <name> --config <path> --skills <dir>
611
- skillboard remove skill <skill-id> --config <path> --skills <dir> [--force]
612
- skillboard dashboard --config <path> --skills <dir> [--out <path>]
613
- skillboard reconcile --config <path> --skills <dir> [--actual-harnesses a,b] [--out <path>]
614
- skillboard impact disable <skill-id> --config <path> --skills <dir> [--out <path>] [--json]
615
- ```
117
+ ## What SkillBoard Gives You
616
118
 
617
- The bundled examples in this repository use `node bin/skillboard.mjs` explicitly
618
- because they are meant to run from a fresh clone without a global install.
619
-
620
- ## Reconciliation Model
621
-
622
- SkillBoard compares desired state from config with actual state from discovered
623
- `SKILL.md` files and detected harnesses.
624
-
625
- - New skills become `quarantined` / `blocked` recommendations.
626
- - Known capability matches are surfaced, but not auto-enabled.
627
- - Removed harnesses report affected workflows, missing commands, and migration
628
- recommendations.
629
- - Newly detected harnesses are disabled until workflows explicitly opt in.
630
- - If actual harness inventory is not provided, reconcile emits a warning instead
631
- of silently assuming harness state.
632
-
633
- ## Install Units
634
-
635
- SkillBoard should not assume that every runtime change is a standalone skill.
636
- Modern agent environments increasingly install packaged primitives:
637
-
638
- - `skill`
639
- - `plugin`
640
- - `marketplace`
641
- - `package-manager-dependency`
642
- - `harness`
643
- - `mcp-server`
644
- - `hook`
645
- - `agent`
646
- - `lsp`
647
-
648
- An install unit records source, scope, manifest/cache paths, provided
649
- components, modified config files, enablement, workflow dependencies, permission
650
- risk, trust level, digest/signature pins, and rollback shape. LazyCodex-style setups fit this model as
651
- user-global harness/plugin bundles that provide commands, skills, MCP
652
- integrations, hooks, and config.
653
-
654
- ## Positioning
655
-
656
- SkillBoard is not a replacement for installers such as `skillshare` or package
657
- managers such as APM. It is the governance layer above them: it decides what is
658
- active, what is blocked, and what a user should inspect before changing the skill
659
- set.
660
-
661
- See [docs/install.md](docs/install.md) for install and bootstrap details.
662
-
663
- See [docs/user-flow.md](docs/user-flow.md),
664
- [docs/positioning.md](docs/positioning.md), and
665
- [docs/policy-model.md](docs/policy-model.md). See
666
- [docs/adapters.md](docs/adapters.md) for the source-profile adapter model, and
667
- [docs/versioning.md](docs/versioning.md) for release, schema, profile, workflow,
668
- and lockfile versioning rules.
119
+ - Inventory that separates installed skills from callable skills.
120
+ - Workflow-scoped policy instead of global "everything is active" behavior.
121
+ - `brief`, `route`, `can-use`, and `guard use` surfaces for AI-mediated selection and availability.
122
+ - Workflow conflict checks so overlapping skills cannot quietly degrade an answer.
123
+ - Action cards that apply one approved policy change, then re-resolve state.
124
+ - Source and install-unit review for plugins, hooks, MCP servers, harnesses,
125
+ commands, LSPs, and package-manager dependencies.
126
+ - Impact, reconcile, rollout, and dashboard output before cleanup or migration.
127
+ - Manual skill variant lifecycle for relationships such as `a -> claude.a`,
128
+ with draft, approval, drift, and reset checkpoints.
129
+
130
+ SkillBoard is deny-by-default. Installing a skill does not make it automatically
131
+ callable. A workflow, source, and invocation decision must make that explicit.
132
+ For action cards, use `skillboard apply-action <action-id> --yes --json`; raw
133
+ `skillboard hook install ... --dry-run --json` previews are underlying manual
134
+ operator detail, not the primary action-card flow.
135
+
136
+ ## What Works Today
137
+
138
+ SkillBoard currently supports:
139
+
140
+ - YAML policy config parsing and semantic checks.
141
+ - Recursive `SKILL.md` discovery.
142
+ - Source-profile import for cloned or installed skill repositories.
143
+ - Agent runtime install-unit inventory when manifest metadata is available.
144
+ - Markdown dashboard and machine-readable brief generation.
145
+ - Disable-impact analysis and reconcile plans.
146
+ - Workflow-scoped activation, blocking, preference, and guard checks.
147
+ - Action-card approval and post-apply brief refresh.
148
+ - Manual variant registration, fork, status, approval, and reset.
149
+
150
+ For the full command catalog and config shape, use
151
+ [docs/reference.md](docs/reference.md).
152
+
153
+ ## Tested Value Proof
154
+
155
+ A raw list says `matt.tdd` is active. SkillBoard says the same workflow has 0
156
+ usable skills because policy health fails.
157
+
158
+ | Question | Raw list | SkillBoard brief |
159
+ | --- | --- | --- |
160
+ | Does `matt.tdd` look enabled? | `active`, `workflow-auto` | blocked by policy health |
161
+ | Can the agent safely use anything now? | not answered | 0 usable skills, 8 blocked skills |
162
+ | Why? | not answered | `Policy errors: 2`, `Policy warnings: 1` |
163
+
164
+ The action-card flow is tested too. Applying
165
+ `activate-skill:anthropic.docx` in a temporary project changes the next brief
166
+ from 2 usable skills to 3 and moves `anthropic.docx` into the manual-allowed
167
+ set. SkillBoard applies one approved change, then re-resolves the next state.
168
+
169
+ Run the proof with:
170
+
171
+ ```bash
172
+ node --test test/readme-value-proof.test.mjs
173
+ ```
174
+
175
+ See the [full reproducible proof](docs/value-proof.md) for exact commands,
176
+ fixtures, and assertions.
177
+
178
+ ## Where To Go Next
179
+
180
+ - [AI skill routing goal](docs/ai-skill-routing-goal.md)
181
+ - [Install and bootstrap](docs/install.md)
182
+ - [First-time control flow](docs/user-flow.md)
183
+ - [Capability routing](docs/routing.md)
184
+ - [Command and config reference](docs/reference.md)
185
+ - [Policy model](docs/policy-model.md)
186
+ - [Capabilities](docs/capabilities.md)
187
+ - [Skill variant lifecycle](docs/variant-lifecycle.md)
188
+ - [Value proof](docs/value-proof.md)
189
+ - [Source-profile adapters](docs/adapters.md)
190
+ - [Rollout runbook](docs/rollout-runbook.md)
191
+ - [Versioning and release rules](docs/versioning.md)
192
+ - [Contributing](CONTRIBUTING.md)