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.
Files changed (82) hide show
  1. package/CHANGELOG.md +85 -0
  2. package/README.md +161 -255
  3. package/bin/postinstall.mjs +2 -1
  4. package/docs/adapters.md +37 -113
  5. package/docs/ai-skill-routing-goal.md +41 -108
  6. package/docs/capabilities.md +17 -104
  7. package/docs/install.md +70 -473
  8. package/docs/policy-model.md +50 -280
  9. package/docs/positioning.md +19 -86
  10. package/docs/profiles.md +21 -153
  11. package/docs/reference.md +133 -362
  12. package/docs/rollout-runbook.md +23 -25
  13. package/docs/routing.md +23 -90
  14. package/docs/user-flow.md +68 -279
  15. package/docs/value-proof.md +23 -181
  16. package/docs/variant-lifecycle.md +47 -67
  17. package/docs/versioning.md +49 -269
  18. package/examples/v2-multi-source.config.yaml +35 -0
  19. package/examples/v2-policy-error.config.yaml +6 -0
  20. package/package.json +1 -1
  21. package/src/advisor/actions.mjs +102 -6
  22. package/src/advisor/application-commands.mjs +10 -9
  23. package/src/advisor/apply-action.mjs +74 -1
  24. package/src/advisor/guidance.mjs +24 -16
  25. package/src/advisor/schema.mjs +17 -6
  26. package/src/advisor/skills.mjs +18 -5
  27. package/src/advisor.mjs +27 -9
  28. package/src/agent-integration-cli.mjs +96 -13
  29. package/src/agent-integration-content.mjs +21 -11
  30. package/src/agent-integration-files.mjs +1 -1
  31. package/src/agent-integration-home.mjs +14 -1
  32. package/src/agent-inventory-platforms.mjs +21 -8
  33. package/src/agent-inventory.mjs +44 -16
  34. package/src/agent-root-registry.mjs +127 -0
  35. package/src/agent-skill-import.mjs +2 -2
  36. package/src/agent-skill-roots.mjs +70 -13
  37. package/src/audit-paths.mjs +42 -0
  38. package/src/brief-cli.mjs +3 -2
  39. package/src/brief-renderer.mjs +1 -0
  40. package/src/cli.mjs +521 -235
  41. package/src/compatibility.mjs +24 -0
  42. package/src/control/can-use-guard.mjs +21 -1
  43. package/src/control/config-write.mjs +32 -2
  44. package/src/control/skill-crud.mjs +5 -0
  45. package/src/control/v2-guard.mjs +175 -0
  46. package/src/control/v2-skill-crud.mjs +32 -0
  47. package/src/control/v2-skill-forget.mjs +38 -0
  48. package/src/control/variant-status.mjs +47 -1
  49. package/src/control.mjs +55 -0
  50. package/src/doctor.mjs +71 -5
  51. package/src/domain/v2-policy.mjs +111 -0
  52. package/src/hook-plan.mjs +33 -3
  53. package/src/impact.mjs +52 -29
  54. package/src/index.mjs +25 -1
  55. package/src/init.mjs +50 -34
  56. package/src/install-health.mjs +177 -0
  57. package/src/inventory-install-units.mjs +63 -0
  58. package/src/inventory-json.mjs +279 -0
  59. package/src/inventory-refresh.mjs +168 -19
  60. package/src/lifecycle-cli.mjs +40 -12
  61. package/src/lifecycle-content.mjs +52 -67
  62. package/src/migration/v1-to-v2.mjs +212 -0
  63. package/src/migration/v2-files.mjs +211 -0
  64. package/src/migration/v2-journal.mjs +169 -0
  65. package/src/migration/v2-projection.mjs +108 -0
  66. package/src/migration/v2-transaction.mjs +205 -0
  67. package/src/policy.mjs +3 -0
  68. package/src/reconcile.mjs +139 -111
  69. package/src/report.mjs +168 -148
  70. package/src/review.mjs +2 -0
  71. package/src/route-advisory.mjs +47 -2
  72. package/src/route-selection.mjs +38 -2
  73. package/src/route.mjs +62 -2
  74. package/src/shared-skill-reconcile.mjs +97 -0
  75. package/src/shared-skill.mjs +325 -0
  76. package/src/source-digest.mjs +42 -0
  77. package/src/source-profiles.mjs +171 -144
  78. package/src/source-verification.mjs +32 -48
  79. package/src/uninstall.mjs +22 -0
  80. package/src/user-state-paths.mjs +19 -0
  81. package/src/user-uninstall.mjs +161 -0
  82. package/src/workspace.mjs +119 -79
package/docs/reference.md CHANGED
@@ -1,413 +1,184 @@
1
1
  # SkillBoard Reference
2
2
 
3
- This is the operator reference for users who already understand the basic
4
- SkillBoard flow and need exact command, config, and lifecycle details.
3
+ ## Command forms
5
4
 
6
- For installation and agent-layer setup commands, start with [install.md](install.md).
7
- For a guided first workflow, use [user-flow.md](user-flow.md).
8
-
9
- ## Command Forms
10
-
11
- Most examples use the global `skillboard` binary. When running from a clone
12
- without `npm install -g agent-skillboard`, replace `skillboard ` with
13
- `node bin/skillboard.mjs ` and run from the repository root.
14
-
15
- The npm package is `agent-skillboard`; the executable remains `skillboard`.
16
- For CI or scripts, the explicit package form avoids binary-name ambiguity:
5
+ Global install:
17
6
 
18
7
  ```bash
19
- npm exec --yes --package agent-skillboard -- skillboard --version
20
- npm exec --yes --package agent-skillboard -- skillboard help brief
8
+ skillboard <command>
21
9
  ```
22
10
 
23
- After a global install, postinstall auto-runs agent-layer setup for detected
24
- supported agent homes. Use `skillboard setup` later when you add another
25
- supported agent, skipped lifecycle scripts, or need to repair user-level agent
26
- guidance. This is agent-layer integration; it does not initialize, attach, or
27
- manage individual projects. To remove only managed agent-layer guidance, run
28
- `skillboard uninstall --agent-layer` before package removal.
29
-
30
- Unreleased GitHub builds are available when intentionally testing repository
31
- state before the next npm release:
32
-
33
- ```bash
34
- npx --yes --package github:NyXXiR/skillboard skillboard --version
35
- npx --yes --package github:NyXXiR/skillboard skillboard help
11
+ Source tree: replace `skillboard ` with `node bin/skillboard.mjs `.
12
+
13
+ ## Core user-level commands
14
+
15
+ ```text
16
+ skillboard setup [--yes] [--agent codex[,claude,opencode,hermes]] [--skill-root <path>]
17
+ skillboard inventory refresh [--config <path>] [--dry-run] [--json]
18
+ skillboard brief [--agent codex|claude|opencode|hermes] [--intent <request>] [--include-actions] [--json]
19
+ skillboard route <intent> --agent codex|claude|opencode|hermes [--json]
20
+ skillboard can-use <skill-id> --agent codex|claude|opencode|hermes [--json]
21
+ skillboard guard use <skill-id> --agent codex|claude|opencode|hermes [--json]
22
+ skillboard skill enable <skill-id> [--dry-run] [--json]
23
+ skillboard skill disable <skill-id> [--dry-run] [--json]
24
+ skillboard skill share <skill-id> [--dry-run] [--json]
25
+ skillboard skill unshare <skill-id> [--dry-run] [--json]
26
+ skillboard skill preference <skill-id> --intent <term>[,<term>] --priority <integer> [--dry-run] [--json]
27
+ skillboard skill forget <skill-id> [--dry-run] [--json]
28
+ skillboard uninstall --user (--dry-run|--yes) [--json]
29
+ skillboard doctor [--config <path>] [--strict] [--json]
36
30
  ```
37
31
 
38
- From a source clone:
32
+ Without path overrides, commands read `~/skillboard.config.yaml` and
33
+ `~/.skillboard/inventory.json` from any directory. Setup bootstraps both files
34
+ atomically and never creates project state.
39
35
 
40
- ```bash
41
- git clone https://github.com/NyXXiR/skillboard.git
42
- cd skillboard
43
- npm install
44
- npm test
45
- node bin/skillboard.mjs --version
46
- node bin/skillboard.mjs help
47
- ```
36
+ Doctor also reports installation health: the running package version and
37
+ entrypoint, the `skillboard` executable selected by `PATH`, discovered package
38
+ installations, shadowing, and duplicate global installs. These observations are
39
+ informational and do not change policy health. Candidate executables are never
40
+ run during discovery. Use `skillboard doctor --summary` after updates; use
41
+ `npm config get prefix` in each Node environment to identify the owner of a
42
+ stale global copy. SkillBoard does not automatically uninstall another prefix.
48
43
 
49
- ## Commands
44
+ Setup is the convergent install/update command. It refreshes managed guidance,
45
+ policy, and inventory; discovers late standard roots and Hermes profiles; and
46
+ creates missing compatible copies for policy entries already marked
47
+ `shared: true`. `--skill-root` requires exactly one `--agent`, accepts only a
48
+ non-symlinked path inside the invoking user's home, and persists the mapping in
49
+ `~/.skillboard/agent-roots.json`. That registry is operational discovery state,
50
+ not authorization or policy. One root cannot be registered to two agents.
50
51
 
51
- ```bash
52
- skillboard setup [--yes] [--agent codex[,claude,opencode,hermes]]
53
- skillboard import-skill --from <agent> --to <agent> --skill <id-or-dir> [--target-skill <id-or-dir>] [--adapted-file <path>] [--dry-run] [--yes] [--replace] [--json]
54
- skillboard uninstall [--dir <path>] [--dry-run] [--keep-settings] [--purge] [--remove-config|--reset-config] [--remove-reports] [--remove-hooks] [--keep-empty-dirs] [--agent-layer] [--agent codex[,claude,opencode,hermes]]
55
- skillboard inventory refresh [--dir <path>] [--config <path>] [--scan-root <dir>[,<dir>]] [--dry-run] [--json]
56
- skillboard inventory detect --unit <id> --config <path> [--install-output <path>] [--config-file a,b] [--source <value>] [--kind <kind>] [--scope <scope>] [--dry-run] [--json]
57
- skillboard sources refresh [--dir <path>] [--config <path>] [--unit <id>[,<id>]] [--cache-dir <dir>] [--dry-run] [--json]
58
- skillboard doctor [--dir <path>] [--config <path>] [--skills <dir>] [--verify] [--strict] [--json] [--summary]
59
- skillboard status [--dir <path>] [--config <path>] [--skills <dir>] [--verify] [--strict] [--json] [--summary]
60
- skillboard brief [--workflow <name>] [--intent <request>] [--dir <path>] [--config <path>] [--skills <dir>] [--include-actions] [--verbose] [--json]
61
- skillboard apply-action <action-id> [--workflow <name>] [--dir <path>] [--config <path>] [--skills <dir>] [--dry-run] [--yes] [--allow-destructive] [--json]
62
- skillboard import --profile <id-or-path> --source-root <dir> [--profile-dirs a,b] [--out <path>]
63
- skillboard import --profile <id-or-path> --source-root <dir> --config <path> --merge [--replace] [--dry-run]
64
- skillboard scan --config <path> --skills <dir>
65
- skillboard check --config <path> --skills <dir>
66
- skillboard list [skills|workflows|harnesses|install-units] --config <path> --skills <dir>
67
- skillboard explain <skill-id> --config <path> --skills <dir>
68
- skillboard route <intent> --workflow <name> --config <path> --skills <dir> [--json]
69
- skillboard can-use <skill-id> --workflow <name> --config <path> --skills <dir>
70
- skillboard guard use <skill-id> --workflow <name> --config <path> --skills <dir>
71
- skillboard audit sources --config <path> --skills <dir> [--verify]
72
- skillboard rollout [audit|plan|apply|rollback|report] [--dir <path>] [--config <path>] [--skills <dir>] [--transaction <id>] [--json]
73
- skillboard hook install --workflow <name> --config <path> --skills <dir> [--out <path>] [--skillboard-bin <path>] [--dry-run] [--json]
74
- skillboard lock write --config <path> --skills <dir> [--out <path>] [--replace] [--allow-unverified]
75
- skillboard review install-unit <unit-id> [--trust-level trusted|reviewed|unreviewed|blocked] --config <path> --skills <dir>
76
- skillboard add skill <skill-id> --path <relative-skill-path> --config <path> --skills <dir>
77
- skillboard add workflow <workflow-name> --harness <harness-name> --config <path> --skills <dir> [--skill <id>[,<id>]]
78
- skillboard add harness <harness-name> --config <path> --skills <dir> [--status <status>] [--command <cmd>[,<cmd>]]
79
- skillboard variant add <variant-id> --from <base-id> --capability <name> --workflow <name> --config <path> --skills <dir> [--path <relative-skill-path>] [--mode manual-only|router-only|workflow-auto] [--category <name>] [--owner-install-unit <unit-id>] [--dry-run] [--json]
80
- skillboard variant fork <variant-id> --from <base-id> --capability <name> --workflow <name> --path <relative-skill-path> --config <path> --skills <dir> [--adapted-for <label>] [--category <name>] [--owner-install-unit <unit-id>] [--dry-run] [--json]
81
- skillboard variant status <variant-id> --config <path> --skills <dir> [--json]
82
- skillboard variant approve <variant-id> --config <path> --skills <dir> [--mode manual-only|router-only|workflow-auto] [--dry-run] [--json]
83
- skillboard variant reset <variant-id> --to-base|--to-approved --config <path> --skills <dir> [--yes] [--dry-run] [--mode manual-only|router-only|workflow-auto] [--json]
84
- skillboard activate <skill-id> --workflow <name> --config <path> --skills <dir>
85
- skillboard block <skill-id> --workflow <name> --config <path> --skills <dir>
86
- skillboard quarantine <skill-id> --config <path> --skills <dir>
87
- skillboard prefer <skill-id> --workflow <name> --capability <name> --config <path> --skills <dir>
88
- skillboard remove skill <skill-id> --config <path> --skills <dir> [--force]
89
- skillboard dashboard --config <path> --skills <dir> [--out <path>]
90
- skillboard reconcile --config <path> --skills <dir> [--actual-harnesses a,b] [--out <path>]
91
- skillboard impact disable <skill-id> --config <path> --skills <dir> [--out <path>] [--json]
92
- ```
52
+ Guard requires a valid inventory record, `enabled: true`, and the selected agent
53
+ in `installed_on`. Optional preference ranks candidates but never changes
54
+ availability.
93
55
 
94
- ## Agent Skill Reuse
56
+ Version 2 route, can-use, and guard require `--agent`; generated agent guidance
57
+ passes it automatically. This prevents one agent from selecting another
58
+ agent's local-only skill without adding a user prompt to the normal flow.
95
59
 
96
- `import-skill` operates above projects. It reads one supported agent's user
97
- skill root and writes to another supported agent's user skill root:
60
+ ## Config schema v2
98
61
 
99
- ```bash
100
- skillboard import-skill --from codex --to opencode --skill test-first --json
101
- skillboard import-skill --from codex --to opencode --skill test-first --yes --json
62
+ ```yaml
63
+ version: 2
64
+ skills:
65
+ local-helper:
66
+ enabled: true
67
+ shared: false
68
+ preference:
69
+ intents: [implementation]
70
+ priority: 50
71
+ shared-helper:
72
+ enabled: true
73
+ shared: true
74
+ disabled-helper:
75
+ enabled: false
76
+ shared: false
102
77
  ```
103
78
 
104
- Supported agents are `codex`, `claude`, `opencode`, and `hermes`. Roots come
105
- from `CODEX_HOME`, `AGENTS_HOME`, `CLAUDE_HOME`, `OPENCODE_HOME`, and
106
- `HERMES_HOME`, or from their default user locations. Codex source scanning also
107
- checks `~/.agents/skills` and `~/.codex/skills`.
79
+ - `enabled` and `shared` are required Booleans.
80
+ - `shared: false` means agent-local; `shared: true` enables managed cross-agent
81
+ copies while preserving the original.
82
+ - `preference` is optional and ranks enabled skills installed for the current
83
+ agent only.
84
+ - Unknown policy keys are rejected.
85
+ - Skill ids use letters, numbers, `.`, `_`, `:`, and `-`; path-like ids are rejected.
86
+ - A valid newly discovered skill defaults to enabled and agent-local.
108
87
 
109
- If the source skill contains markers for another agent runtime, the command
110
- returns `status: "needs-adaptation"` with compatibility reasons and no writes.
111
- The target agent should ask the user before changing the skill body. After
112
- approval, it writes an adapted `SKILL.md` and installs it with provenance:
88
+ `skill forget` removes only a policy entry. It requires healthy inventory,
89
+ refuses skills that are still observed or shared, and never deletes skill files.
90
+ This distinguishes permanent owner removal from a temporarily unavailable agent
91
+ root.
113
92
 
114
- ```bash
115
- skillboard import-skill \
116
- --from codex \
117
- --to opencode \
118
- --skill codex-hook \
119
- --target-skill opencode-hook \
120
- --adapted-file /tmp/opencode-hook.SKILL.md \
121
- --yes \
122
- --json
123
- ```
93
+ ## Generated inventory and audits
124
94
 
125
- This is separate from `variant` commands. `import-skill` installs a target-agent
126
- user skill file; `variant` records project-local policy relationships,
127
- snapshots, and workflow preferences.
95
+ `~/.skillboard/inventory.json` records `installed_on`, paths, sources,
96
+ provenance, digests, aliases, install units, and runtime-component observations.
97
+ Only `installed_on` participates in the presence check. Other observations are
98
+ optional audit metadata and never determine availability.
128
99
 
129
- ## Deprecated Project Policy Mode
100
+ Runtime and action authorization are outside SkillBoard's scope. The active
101
+ agent or harness owns permission checks for hooks, MCP servers, commands,
102
+ network access, external writes, destructive operations, and secrets.
130
103
 
131
- `skillboard init` is deprecated project-local policy bootstrap and is not
132
- needed for normal use. Package install, postinstall, and `skillboard setup`
133
- connect SkillBoard at the agent layer without initializing, attaching, or
134
- managing individual projects.
104
+ Profile import is trust-neutral. Preview a merge before writing:
135
105
 
136
106
  ```bash
137
- skillboard init [--dir <path>] [--scan-root <dir>[,<dir>]] [--no-scan-installed]
138
- skillboard help init
107
+ skillboard import --profile <id-or-path> --source-root <dir> --config <path> --merge --dry-run
139
108
  ```
140
109
 
141
- The command remains available for existing workspaces that intentionally keep
142
- local `skillboard.config.yaml`, `.skillboard/`, `AGENTS.md`, or `CLAUDE.md`
143
- policy files. If `init` creates or discovers workflows, use one of the workflow
144
- names it prints for the first `brief`. If it does not print a workflow, run the
145
- unscoped `brief` command it prints instead.
110
+ Import does not approve a source or authorize runtime components. Missing valid
111
+ skills receive the enabled, agent-local default; existing policy is preserved
112
+ unless `--replace` is explicit.
146
113
 
147
- ## Capability Routing
114
+ ## Policy actions
148
115
 
149
- For the normal AI-mediated flow, prefer `brief --intent`: it returns the current
150
- availability brief plus a compact route recommendation in `assistant_guidance`.
116
+ Agents obtain current actions from `brief --include-actions --json`, ask once,
117
+ and apply exactly one current id:
151
118
 
152
119
  ```bash
153
- skillboard brief \
154
- --intent "write tests before implementation" \
155
- --workflow codex-night-workflow \
156
- --config skillboard.config.yaml \
157
- --skills skills \
158
- --json
120
+ skillboard apply-action <action-id> --agent <agent> --yes --json
159
121
  ```
160
122
 
161
- `route` is a read-only recommendation surface for AI/automation. It maps a
162
- normal user request to the best matching workflow capability or workflow-bound
163
- skill metadata, then returns the recommended skill, fallback skills, matched
164
- terms, recommendation reason, and the guard command that must still pass before
165
- invocation.
123
+ The returned post-apply brief is authoritative. Cached ids are not reused.
124
+ Share and unshare action cards use the same managed-copy transaction as the
125
+ direct commands.
126
+
127
+ ## User-level removal
166
128
 
167
129
  ```bash
168
- skillboard route "write tests before implementation" \
169
- --workflow codex-night-workflow \
170
- --config skillboard.config.yaml \
171
- --skills skills \
172
- --json
130
+ skillboard uninstall --user --dry-run
131
+ skillboard uninstall --user --yes
173
132
  ```
174
133
 
175
- Routing first honors an exact request for a specific already-allowed workflow
176
- skill. Otherwise, it uses declared capability names and workflow bindings. If a
177
- fresh project has workflow skills but no capability catalog yet, it can fall back
178
- to workflow-bound skill id, path, category, `SKILL.md` name, and `SKILL.md`
179
- description metadata. It does not inspect or semantically rank `SKILL.md` bodies,
180
- and it does not invoke the skill. The JSON payload includes `match_source`,
181
- `matched_terms`, `recommendation_reason`, `route_candidates`, and
182
- `overlap_resolution` so the AI can explain why it chose or declined a skill
183
- without inventing rationale. When remembered or configured workflow policy
184
- selected the routed skill while other allowed skills were also available,
185
- `policy_memory` tells the AI to disclose that after completion. The same
186
- `assistant_guidance` object includes
187
- `assistant_guidance.goal_document`; its `loop` and `simplification_rule` fields
188
- make the non-blocking routing goal machine-readable for agent integrations.
189
- Recommended and fallback skills are limited to the selected workflow's active,
190
- required, or global-auto bindings rather than every global alternative in the
191
- capability catalog. When nothing matches, the result keeps
192
- `matched_capability: null` and `recommended_skill: null`, then returns possible
193
- workflow skills so the AI can ask a clarifying question. When a guard allows the
194
- recommended skill, the AI should disclose the skill at start and completion
195
- instead of asking for another approval. That disclosure is an audit trace, not a
196
- permission prompt. When several allowed skills match, `overlap_resolution`
197
- explains that SkillBoard kept them available and routed the workflow to one
198
- selected skill. When remembered or configured policy determines that route,
199
- `policy_memory` keeps the final disclosure honest about why that skill was used.
200
- When an allowed fallback is selected because the preferred skill is denied,
201
- `post_use_policy_suggestion` tells the AI to ask after the task whether to
202
- remember that fallback as the preferred workflow policy.
203
-
204
- ## Config Shape
134
+ Dry-run reports marker-owned shared copies, managed agent guidance, and the two
135
+ home state paths without mutation. Apply requires `--yes`, rechecks ownership
136
+ markers before removing copies, never follows a symlinked agent skill root, and
137
+ preserves agent-owned and unmanaged skills. It then removes
138
+ `~/skillboard.config.yaml` and `~/.skillboard`. Package removal remains a
139
+ separate `npm uninstall -g agent-skillboard` step.
205
140
 
206
- ```yaml
207
- version: 1
141
+ ## Version 1 migration reference
208
142
 
209
- defaults:
210
- invocation_policy: deny-by-default
211
- allow_model_invocation: false
212
- require_explicit_workflow: true
143
+ Version 1 is readable but immutable during the v0.3 one-release read-only
144
+ window:
213
145
 
214
- skills:
215
- matt.tdd:
216
- path: tdd
217
- status: active
218
- invocation: workflow-auto
219
- exposure: exported
220
- category: engineering
221
- conflicts_with:
222
- - meerkat.no-tests-please
223
-
224
- user.workflow-router:
225
- path: user/workflow-router
226
- status: active
227
- invocation: global-auto
228
- exposure: global-meta
229
- category: meta
230
-
231
- capabilities:
232
- test-first-implementation:
233
- canonical: matt.tdd
234
- alternatives:
235
- - meerkat.test-first-implementation
236
- default_policy: workflow-auto
237
-
238
- harnesses:
239
- codex:
240
- status: primary
241
- workflows:
242
- - codex-night-workflow
243
-
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
- workflows:
277
- codex-night-workflow:
278
- harness: codex
279
- active_skills:
280
- - matt.tdd
281
- blocked_skills: []
282
- required_capabilities:
283
- test-first-implementation:
284
- preferred: matt.tdd
285
- fallback:
286
- - meerkat.test-first-implementation
287
- policy: workflow-auto
146
+ ```bash
147
+ skillboard migrate v2 --config <path> --json
148
+ skillboard migrate v2 --config <path> --yes --json
149
+ skillboard migrate v2 --config <path> --rollback <backup> --json
288
150
  ```
289
151
 
290
- `conflicts_with` is runtime policy, not documentation-only metadata. A workflow
291
- cannot keep both sides selectable unless one side is explicitly blocked in that
292
- workflow. Conflict failures appear in policy errors, guard reasons, brief
293
- blocking reasons, and impact reports. `impact disable --json` includes:
294
-
295
- - `conflictingSkills`: declared direct or reverse conflicts for the target
296
- skill.
297
- - `activeConflicts`: workflow-scoped conflict pairs currently involving the
298
- target skill.
152
+ Preview changes no bytes. Apply creates an adjacent byte-for-byte backup and
153
+ writes v2 policy plus generated inventory atomically. Rollback restores the
154
+ selected backup. v0.4.0 removes the v1 reader.
299
155
 
300
- ## Source Profiles
156
+ Setup and npm postinstall preserve an existing v1 policy and print only the
157
+ preview form. SkillBoard does not automatically migrate version 1.
301
158
 
302
- `skillboard import` reads a source profile and emits a YAML fragment containing
303
- governed `skills` plus their owning `install_units`.
159
+ Legacy fields are interpreted only by migration and never become hidden v2
160
+ authorization. Primary examples are `examples/v2-multi-source.config.yaml` and
161
+ `examples/v2-policy-error.config.yaml`; unprefixed v1 examples remain migration
162
+ fixtures.
304
163
 
305
- ```bash
306
- skillboard import \
307
- --profile github.mattpocock.skills \
308
- --source-root /path/to/cloned-or-installed/repo \
309
- --out .skillboard/reports/import-fragment.yaml
310
- ```
164
+ ## Advanced operator commands
311
165
 
312
- To preview a direct apply path, pass `--merge --config --dry-run`. Merge is
313
- non-destructive by default: if a skill or install-unit id already exists, the
314
- command fails and leaves the config unchanged. Use `--replace` only when you
315
- intend to overwrite existing entries, and drop `--dry-run` only after reviewing
316
- the reported change plan.
166
+ The complete CLI help lists import, audit, rollout, hook, lock, variant,
167
+ reconcile, impact, dashboard, and legacy lifecycle commands. These are not the
168
+ normal user loop.
317
169
 
318
- Built-in profiles are shipped as YAML data under `profiles/`, including:
170
+ `reconcile` reports missing valid inventory skills as enabled, agent-local
171
+ recommendations. It does not write policy implicitly. `impact disable
172
+ <skill-id>` reports current enabled and sharing consequences. Neither command
173
+ introduces another authorization state.
319
174
 
320
- - `github.mattpocock.skills`
321
- - `github.code-yeongyu.oh-my-openagent`
322
- - `github.anthropics.skills`
323
- - `github.wshobson.agents`
324
- - `github.voltagent.awesome-agent-skills`
175
+ `variant status <variant-id>` is read-only content and inventory lifecycle
176
+ inspection. V2 availability changes only through `skill enable`, `skill
177
+ disable`, `skill share`, `skill unshare`, and `skill preference`; `skill forget`
178
+ removes obsolete policy only after the skill is absent.
325
179
 
326
- Project-specific profiles can live under `.skillboard/profiles/` and be passed
327
- by path:
180
+ Hook installation remains an advanced legacy-workflow surface:
328
181
 
329
182
  ```bash
330
- skillboard import --profile .skillboard/profiles/my-source.yaml --source-root /path/to/repo
183
+ skillboard hook install --workflow <name> --config <path> --skills <dir> --out <path> --dry-run --json
331
184
  ```
332
-
333
- ## Invocation Modes
334
-
335
- - `manual-only`: user must explicitly ask for it.
336
- - `router-only`: a router or orchestrator may select it after policy checks.
337
- - `workflow-auto`: model invocation is allowed only inside listed workflows.
338
- - `global-auto`: allowed globally; use sparingly and only for `global-meta`
339
- control skills.
340
- - `blocked`: installed but not callable until policy or provenance changes.
341
- - `deprecated`: kept for history, not for new use.
342
-
343
- Skill exposure values:
344
-
345
- - `exported`: centrally governed skill that may serve shared workflows or
346
- canonical capabilities.
347
- - `global-meta`: intentionally global control skill, such as a router, impact
348
- analyzer, or verification gate.
349
- - `unit-managed`: child component supplied by a parent install unit or harness
350
- bundle.
351
- - `private`: workflow-internal implementation detail.
352
-
353
- ## Reconciliation Model
354
-
355
- SkillBoard compares desired state from config with actual state from discovered
356
- `SKILL.md` files and detected harnesses.
357
-
358
- - New skills become `quarantined` / `blocked` recommendations.
359
- - Known capability matches are surfaced, but not auto-enabled.
360
- - Removed harnesses report affected workflows, missing commands, and migration
361
- recommendations.
362
- - Newly detected harnesses are disabled until workflows explicitly opt in.
363
- - If actual harness inventory is not provided, reconcile emits a warning instead
364
- of silently assuming harness state.
365
-
366
- ## Install Units
367
-
368
- SkillBoard should not assume that every runtime change is a standalone skill.
369
- Modern agent environments increasingly install packaged primitives:
370
-
371
- - `skill`
372
- - `plugin`
373
- - `marketplace`
374
- - `package-manager-dependency`
375
- - `harness`
376
- - `mcp-server`
377
- - `hook`
378
- - `agent`
379
- - `lsp`
380
-
381
- An install unit records source, scope, manifest/cache paths, provided
382
- components, modified config files, enablement, workflow dependencies,
383
- permission risk, trust level, digest/signature pins, and rollback shape.
384
- LazyCodex-style setups fit this model as user-global harness/plugin bundles
385
- that provide commands, skills, MCP integrations, hooks, and config.
386
-
387
- ## Variant Commands
388
-
389
- Use `skillboard variant add claude.a --from a --capability task-review
390
- --workflow claude-workflow --path claude/a ...` to record an explicit,
391
- user-approved `a -> claude.a` variant.
392
-
393
- For a reviewed manual adaptation lifecycle, use `skillboard variant fork
394
- <variant-id>` to create draft metadata and raw snapshot records, edit the
395
- variant `SKILL.md` by hand, inspect `skillboard variant status <variant-id>`
396
- for `variant.status` and computed drift, then promote with `skillboard variant
397
- approve <variant-id>` or restore with `skillboard variant reset <variant-id>
398
- --to-base|--to-approved`.
399
-
400
- SkillBoard records the relationship and policy only; it does not convert skill
401
- bodies, does not rewrite skill bodies, and does not guarantee semantic
402
- equivalence of skill bodies. See [variant-lifecycle.md](variant-lifecycle.md)
403
- for the full lifecycle guide.
404
-
405
- ## Related Runbooks
406
-
407
- - [install.md](install.md): install, agent-layer setup, legacy policy mode,
408
- doctor, refresh, and uninstall.
409
- - [user-flow.md](user-flow.md): first-time skill governance workflow.
410
- - [policy-model.md](policy-model.md): policy states, invocation modes, and install units.
411
- - [capabilities.md](capabilities.md): capability catalog and workflow resolution.
412
- - [rollout-runbook.md](rollout-runbook.md): rollout audit, apply, report, and rollback.
413
- - [versioning.md](versioning.md): release, schema, profile, workflow, and lockfile versioning.
@@ -1,23 +1,29 @@
1
1
  # SkillBoard Rollout Runbook
2
2
 
3
- Use this runbook when SkillBoard is operated as an enterprise rollout gate for agent skills, plugins, harnesses, hooks, MCP servers, and workflow bundles.
3
+ This is an advanced operator runbook for applying and reversing generated
4
+ rollout artifacts. It does not add availability rules: v2 availability remains
5
+ an enabled policy entry plus generated presence on the selected agent.
4
6
 
5
7
  ## Preconditions
6
8
 
7
- - Run on Node.js 20 or newer.
8
- - Keep `skillboard.config.yaml` as the source of truth.
9
- - Use `--json` for automation; rollout commands do not prompt or wait for user input.
10
- - Treat plugin, runtime extension, and external package sources as blocked from automatic activation unless an explicit reviewed/trusted policy is recorded in config.
9
+ - Run on Node.js 14.21 or newer. Release CI covers Node.js 14.21, 20, and 22.
10
+ - Use policy schema v2.
11
+ - Use `--json` for automation; rollout commands do not prompt.
12
+ - Treat source/provenance findings as optional audit metadata. They never change
13
+ availability.
14
+ - Runtime and action authorization remains with the agent or harness.
11
15
 
12
16
  ## Status and exit codes
13
17
 
14
- - `healthy`: exit code `0`; policy and source gates passed.
15
- - `safe-mode`: exit code `1`; reserved for usable-but-limited rollout states.
16
- - `strict-failed`: exit code `2`; policy/source gates failed and automation must not apply rollout.
17
- - `apply-failed`: exit code `3`; apply was blocked or failed before a committed transaction.
18
- - `rollback-needed`: exit code `4`; apply failed after mutation risk and operator rollback is required.
18
+ - `healthy`: exit code `0`.
19
+ - `safe-mode`: exit code `1`.
20
+ - `strict-failed`: exit code `2`.
21
+ - `apply-failed`: exit code `3`.
22
+ - `rollback-needed`: exit code `4`.
19
23
 
20
- ## Standard rollout flow
24
+ These statuses describe operator execution health, not skill availability.
25
+
26
+ ## Standard flow
21
27
 
22
28
  ```bash
23
29
  skillboard rollout audit --config skillboard.config.yaml --skills skills --json
@@ -26,16 +32,12 @@ skillboard rollout apply --config skillboard.config.yaml --skills skills --json
26
32
  skillboard rollout report --config skillboard.config.yaml --skills skills --json
27
33
  ```
28
34
 
29
- `audit` and `plan` are read-only. `apply` creates a transaction directory under `.skillboard/rollouts/` with a manifest, report, state file, and exact-byte backup of the config before committing.
30
-
31
- ## Source gate policy
32
-
33
- Rollout blocks unreviewed high-risk runtime/plugin/external sources when they could become active through model-selectable skills. Before apply, review each relevant install unit and set a reviewed/trusted trust level only after source ownership, pinning, and expected runtime components are understood.
35
+ `audit` and `plan` are read-only. `apply` records a transaction under
36
+ `.skillboard/rollouts/` with an exact-byte config backup. Source observations in
37
+ the report are informational and cannot enable or disable a skill.
34
38
 
35
39
  ## Emergency rollback
36
40
 
37
- If a rollout report or operator check indicates `rollback-needed`, restore the committed transaction by id:
38
-
39
41
  ```bash
40
42
  skillboard rollout rollback \
41
43
  --config skillboard.config.yaml \
@@ -44,17 +46,13 @@ skillboard rollout rollback \
44
46
  --json
45
47
  ```
46
48
 
47
- Rollback reads `.skillboard/rollouts/<transaction>/manifest.json` and restores configured files from their recorded backups. The config restore is byte-for-byte so accidental operator edits made after apply are removed.
48
-
49
- ## Fleet report handling
50
-
51
- Use `skillboard rollout report --json` for dashboards and schedulers. The report includes deterministic status counters for `healthy`, `safe-mode`, `strict-failed`, `apply-failed`, and `rollback-needed`. Local paths and obvious secret/token values are redacted from machine-readable payloads by default.
49
+ Rollback restores files recorded by the transaction manifest. It does not
50
+ reinterpret availability policy.
52
51
 
53
52
  ## Release gate checklist
54
53
 
55
54
  - `npm run check`
56
- - Node 20: `npx -y -p node@20 -c 'node -v && npm -v && npm run check'`
57
55
  - `git diff --check`
58
56
  - `npm audit --audit-level=moderate`
59
57
  - `npm pack --dry-run --json`
60
- - Secret scan changed source, docs, and config files before publishing or pushing.
58
+ - Scan changed source, docs, and config for secrets before publishing.