agent-skillboard 0.1.0

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 (94) hide show
  1. package/CONTRIBUTING.md +83 -0
  2. package/LICENSE +21 -0
  3. package/README.md +645 -0
  4. package/bin/skillboard.mjs +4 -0
  5. package/docs/adapters.md +127 -0
  6. package/docs/capabilities.md +107 -0
  7. package/docs/install.md +346 -0
  8. package/docs/plans/20260625-080025-skillboard-mvp-review.md +189 -0
  9. package/docs/plans/README.md +20 -0
  10. package/docs/policy-model.md +251 -0
  11. package/docs/positioning.md +94 -0
  12. package/docs/profiles.md +166 -0
  13. package/docs/rollout-runbook.md +60 -0
  14. package/docs/user-flow.md +231 -0
  15. package/docs/versioning.md +201 -0
  16. package/examples/multi-source-skills/anthropic/docx/SKILL.md +8 -0
  17. package/examples/multi-source-skills/anthropic/skill-creator/SKILL.md +8 -0
  18. package/examples/multi-source-skills/matt/grill-me/SKILL.md +8 -0
  19. package/examples/multi-source-skills/matt/tdd/SKILL.md +8 -0
  20. package/examples/multi-source-skills/omo/review-work/SKILL.md +8 -0
  21. package/examples/multi-source-skills/omo/ulw-plan/SKILL.md +8 -0
  22. package/examples/multi-source-skills/private/tdd-work-continuity/SKILL.md +8 -0
  23. package/examples/multi-source-skills/private/workflow-router/SKILL.md +8 -0
  24. package/examples/multi-source-skills/wshobson/python-testing/SKILL.md +8 -0
  25. package/examples/multi-source-skills/wshobson/security-review/SKILL.md +8 -0
  26. package/examples/multi-source.config.yaml +271 -0
  27. package/examples/skillboard.config.yaml +194 -0
  28. package/examples/skills/grill-me/SKILL.md +9 -0
  29. package/examples/skills/grill-with-docs/SKILL.md +9 -0
  30. package/examples/skills/requirement-intake/SKILL.md +9 -0
  31. package/examples/skills/tdd/SKILL.md +8 -0
  32. package/package.json +58 -0
  33. package/profiles/anthropics-skills.yaml +17 -0
  34. package/profiles/mattpocock-skills.yaml +26 -0
  35. package/profiles/oh-my-openagent.yaml +32 -0
  36. package/profiles/voltagent-awesome-agent-skills.yaml +18 -0
  37. package/profiles/wshobson-agents.yaml +19 -0
  38. package/src/advisor/action-core.mjs +74 -0
  39. package/src/advisor/actions.mjs +256 -0
  40. package/src/advisor/application-commands.mjs +59 -0
  41. package/src/advisor/apply-action.mjs +183 -0
  42. package/src/advisor/schema.mjs +112 -0
  43. package/src/advisor/setup-actions.mjs +42 -0
  44. package/src/advisor/skills.mjs +191 -0
  45. package/src/advisor/sort.mjs +15 -0
  46. package/src/advisor/sources.mjs +160 -0
  47. package/src/advisor/trust-policy.mjs +65 -0
  48. package/src/advisor/workflow.mjs +41 -0
  49. package/src/advisor.mjs +134 -0
  50. package/src/agent-inventory-platforms.mjs +100 -0
  51. package/src/agent-inventory.mjs +804 -0
  52. package/src/brief-cli.mjs +40 -0
  53. package/src/brief-renderer.mjs +362 -0
  54. package/src/change-plan.mjs +169 -0
  55. package/src/cli.mjs +1171 -0
  56. package/src/config-helpers.mjs +72 -0
  57. package/src/control/can-use-guard.mjs +91 -0
  58. package/src/control/config-write.mjs +163 -0
  59. package/src/control/skill-crud.mjs +394 -0
  60. package/src/control/source-trust.mjs +161 -0
  61. package/src/control/workflow-crud.mjs +104 -0
  62. package/src/control.mjs +197 -0
  63. package/src/doctor.mjs +299 -0
  64. package/src/domain/constants.mjs +47 -0
  65. package/src/domain/indexes.mjs +29 -0
  66. package/src/domain/rules/capabilities.mjs +33 -0
  67. package/src/domain/rules/harnesses.mjs +16 -0
  68. package/src/domain/rules/install-units.mjs +95 -0
  69. package/src/domain/rules/skills.mjs +105 -0
  70. package/src/domain/rules/workflows.mjs +105 -0
  71. package/src/domain/skill-state-matrix.mjs +79 -0
  72. package/src/domain/source-classes.mjs +99 -0
  73. package/src/hook-plan.mjs +152 -0
  74. package/src/impact.mjs +41 -0
  75. package/src/index.mjs +82 -0
  76. package/src/init.mjs +136 -0
  77. package/src/install-output-detector.mjs +337 -0
  78. package/src/install-units.mjs +62 -0
  79. package/src/inventory-refresh.mjs +45 -0
  80. package/src/lifecycle-cli.mjs +166 -0
  81. package/src/lifecycle-content.mjs +87 -0
  82. package/src/policy.mjs +42 -0
  83. package/src/reconcile.mjs +111 -0
  84. package/src/report.mjs +151 -0
  85. package/src/review.mjs +88 -0
  86. package/src/rollout.mjs +453 -0
  87. package/src/skill-paths.mjs +17 -0
  88. package/src/source-cache.mjs +178 -0
  89. package/src/source-profile-loader.mjs +160 -0
  90. package/src/source-profiles.mjs +299 -0
  91. package/src/source-verification.mjs +252 -0
  92. package/src/uninstall.mjs +258 -0
  93. package/src/workspace.mjs +219 -0
  94. package/tsconfig.lsp.json +15 -0
@@ -0,0 +1,127 @@
1
+ # Adapter Model
2
+
3
+ SkillBoard should not hardcode one adapter per popular repository.
4
+
5
+ The core should stay generic, and repository-specific behavior should live in
6
+ data-driven source profiles wherever possible.
7
+
8
+ ## Layers
9
+
10
+ 1. Core scanners
11
+
12
+ Generic code that understands common primitives:
13
+
14
+ - `SKILL.md` folders with YAML frontmatter;
15
+ - plugin or marketplace manifests;
16
+ - package manager metadata;
17
+ - known user/project install scopes;
18
+ - command, hook, MCP, agent, and LSP component lists.
19
+
20
+ 2. Source profiles
21
+
22
+ Declarative profiles that describe how to interpret a source:
23
+
24
+ ```yaml
25
+ id: github.mattpocock.skills
26
+ source: mattpocock/skills
27
+ kind: marketplace
28
+ namespace: matt
29
+ target_path_prefix: matt
30
+ default_status: vendor
31
+ default_invocation: manual-only
32
+ default_exposure: exported
33
+ skill_paths:
34
+ - "skills/**/SKILL.md"
35
+ - "*/SKILL.md"
36
+ category_path_segment: 1
37
+ path_rules:
38
+ - pattern: "skills/deprecated/**/SKILL.md"
39
+ status: deprecated
40
+ invocation: deprecated
41
+ category: deprecated
42
+ ```
43
+
44
+ A profile can set namespace, default policy, component mapping, known manifest
45
+ paths, category extraction, lifecycle overrides, and risk hints without
46
+ requiring code changes.
47
+
48
+ `category_path_segment` reads a slash-separated path segment from the matched
49
+ `SKILL.md` path. For example, `skills/engineering/tdd/SKILL.md` with segment
50
+ `1` becomes category `engineering`. `path_rules` apply first-match overrides
51
+ for repository conventions such as `deprecated` or `in-progress` folders.
52
+
53
+ 3. Detector plugins
54
+
55
+ Code adapters are only for sources whose layout cannot be described
56
+ declaratively, such as installers that mutate multiple config files or require
57
+ command output parsing. These should be small detector modules that produce the
58
+ same install-unit data model as profiles.
59
+
60
+ ## Built-In Profiles Are Not Hardcoding
61
+
62
+ SkillBoard can ship built-in profiles for popular ecosystems, but they should be
63
+ treated as bundled data, not product logic. Users and communities should be able
64
+ to add or override profiles without forking the CLI.
65
+
66
+ Good built-ins:
67
+
68
+ - `mattpocock/skills`: skill pack profile.
69
+ - `code-yeongyu/oh-my-openagent`: harness/plugin bundle profile.
70
+ - `anthropics/skills`: standard Agent Skills profile.
71
+ - `wshobson/agents`: marketplace/plugin profile.
72
+ - `VoltAgent/awesome-agent-skills`: catalog profile.
73
+
74
+ Bad design:
75
+
76
+ - `if repo === "mattpocock/skills"` branches in the import logic;
77
+ - repo-specific policy decisions embedded in TypeScript;
78
+ - automatic global activation because a known repository was installed.
79
+
80
+ ## Import Output Contract
81
+
82
+ Every profile or detector should output the same normalized shape:
83
+
84
+ - install units;
85
+ - declared skills;
86
+ - owner links via `owner_install_unit`;
87
+ - component lists;
88
+ - guessed capabilities;
89
+ - default invocation and exposure;
90
+ - warnings and decisions requiring user approval.
91
+
92
+ Current CLI surface:
93
+
94
+ ```bash
95
+ skillboard import \
96
+ --profile github.mattpocock.skills \
97
+ --source-root /path/to/source \
98
+ --out .skillboard/reports/import-fragment.yaml
99
+ ```
100
+
101
+ The command emits a config fragment rather than mutating policy automatically.
102
+ This keeps the control plane reviewable while still avoiding hardcoded adapter
103
+ branches.
104
+
105
+ When the fragment is acceptable, the same importer can merge it:
106
+
107
+ ```bash
108
+ skillboard import \
109
+ --profile github.mattpocock.skills \
110
+ --source-root /path/to/source \
111
+ --config skillboard.config.yaml \
112
+ --merge \
113
+ --dry-run
114
+ ```
115
+
116
+ Merge is append-only by default and refuses duplicate skill or install-unit ids.
117
+ `--replace` is the explicit overwrite escape hatch. Drop `--dry-run` after
118
+ reviewing the change plan.
119
+
120
+ The reconciler then applies the same policy rules regardless of source.
121
+
122
+ ## Default Safety
123
+
124
+ New external skills should default to `vendor` or `candidate`, with
125
+ `manual-only` or `router-only` invocation. Personal control skills can become
126
+ `global-meta`, but external repositories should not gain `global-auto` through an
127
+ adapter.
@@ -0,0 +1,107 @@
1
+ # Capabilities
2
+
3
+ SkillBoard uses **capabilities** as a contract layer between a workflow and the skills that satisfy it. A capability is an abstract need, such as "requirement-clarification" or "test-first-implementation". Skills claim to provide it; workflows declare they require it.
4
+
5
+ There are two places where capabilities appear:
6
+
7
+ 1. **Global capability catalog** in `skillboard.config.yaml` (`capabilities`)
8
+ 2. **Workflow-scoped requirements** under each workflow (`required_capabilities`)
9
+
10
+ ## Global Capability Catalog
11
+
12
+ The global catalog defines a capability once for the whole project.
13
+
14
+ ```yaml
15
+ capabilities:
16
+ requirement-clarification:
17
+ canonical: meerkat.requirement-intake
18
+ alternatives:
19
+ - matt.grill-me
20
+ - matt.grill-with-docs
21
+ default_policy: router-only
22
+ ```
23
+
24
+ - `canonical`: the preferred skill for this capability.
25
+ - `alternatives`: other skills that may satisfy the same capability.
26
+ - `default_policy`: the suggested invocation policy when a workflow requires the capability but does not override it.
27
+
28
+ The catalog is used for project-wide policy checks, such as:
29
+
30
+ - Is the canonical skill declared?
31
+ - Does a skill that claims `canonical_for` actually match the catalog?
32
+ - Are fallback or alternative skill references valid?
33
+
34
+ ## Workflow-Scoped Requirements
35
+
36
+ A workflow can require a capability and pin how it should be resolved.
37
+
38
+ ```yaml
39
+ workflows:
40
+ requirement-review:
41
+ required_capabilities:
42
+ requirement-clarification:
43
+ preferred: meerkat.requirement-intake
44
+ fallback:
45
+ - matt.grill-with-docs
46
+ policy: router-only
47
+ ```
48
+
49
+ - `preferred`: the skill to use first for this workflow.
50
+ - `fallback`: ordered alternatives if the preferred skill is unavailable or blocked.
51
+ - `policy`: invocation mode that applies when the capability is resolved in this workflow.
52
+
53
+ ## Resolution Flow
54
+
55
+ When a workflow is selected, SkillBoard resolves each required capability like this:
56
+
57
+ ```
58
+ workflow.required_capabilities
59
+
60
+
61
+ capability name
62
+
63
+
64
+ lookup global catalog (capabilities.<name>)
65
+
66
+
67
+ preferred in workflow? ──yes──► use workflow.preferred with workflow.policy
68
+
69
+ no
70
+
71
+ use catalog.canonical with workflow.policy
72
+
73
+
74
+ fallback order: workflow.fallback, then catalog.alternatives
75
+ ```
76
+
77
+ If no preferred skill is set in the workflow, the global catalog's canonical skill is used. Fallbacks are checked in order: first the workflow's own fallback list, then the global alternatives.
78
+
79
+ ## Global vs Workflow: When to Use Each
80
+
81
+ | Use case | Use global catalog | Use workflow requirement |
82
+ |----------|-------------------|--------------------------|
83
+ | Define a canonical skill for a capability | ✅ | |
84
+ | List known alternatives project-wide | ✅ | |
85
+ | Provide a default invocation policy | ✅ | |
86
+ | Pin a different skill for one workflow | | ✅ |
87
+ | Add workflow-specific fallbacks | | ✅ |
88
+ | Override invocation policy for a workflow | | ✅ |
89
+
90
+ ## Skill Declaration
91
+
92
+ A skill declares that it satisfies a capability through `canonical_for`:
93
+
94
+ ```yaml
95
+ skills:
96
+ meerkat.requirement-intake:
97
+ canonical_for:
98
+ - requirement-clarification
99
+ ```
100
+
101
+ If `canonical_for` references a capability, the global catalog must list the same skill as its `canonical`. Otherwise the policy check reports a mismatch.
102
+
103
+ ## Safety Notes
104
+
105
+ - A workflow requirement can only reference capabilities defined in the global catalog.
106
+ - `policy` in a workflow requirement must be a valid invocation value.
107
+ - Prefer `workflow-auto` or `router-only` for workflow requirements; reserve `global-auto` for explicitly global-meta skills.
@@ -0,0 +1,346 @@
1
+ # Install And Bootstrap
2
+
3
+ SkillBoard sits one layer above skill installers, plugin marketplaces, harness
4
+ bundles, and local skill repositories.
5
+
6
+ ## Install From npm
7
+
8
+ Use npx when you want to bootstrap a project without keeping a global
9
+ SkillBoard binary installed:
10
+
11
+ ```bash
12
+ npx agent-skillboard init
13
+ npx agent-skillboard brief
14
+ npx agent-skillboard doctor --summary
15
+ ```
16
+
17
+ SkillBoard does not make installed skills automatically callable. It imports
18
+ trusted local skills as manual-only and keeps runtime/plugin skills quarantined
19
+ until reviewed.
20
+
21
+ In CI or scripts, use the explicit package/binary spelling:
22
+
23
+ ```bash
24
+ npx --yes --package agent-skillboard skillboard init
25
+ npx --yes --package agent-skillboard skillboard doctor --summary
26
+ npm exec --yes --package agent-skillboard -- skillboard init
27
+ npm exec --yes --package agent-skillboard -- skillboard doctor --summary
28
+ ```
29
+
30
+ For repeated local use, install the CLI globally:
31
+
32
+ ```bash
33
+ npm install -g agent-skillboard
34
+ skillboard init
35
+ skillboard doctor
36
+ ```
37
+
38
+ The executable remains `skillboard` even though the npm package name is
39
+ `agent-skillboard`.
40
+
41
+ ## Run Unreleased Builds From GitHub
42
+
43
+ Use GitHub npx only when you intentionally want the current repository state
44
+ before the next npm release:
45
+
46
+ ```bash
47
+ npx --yes --package github:NyXXiR/skillboard skillboard init
48
+ npx --yes --package github:NyXXiR/skillboard skillboard brief
49
+ npx --yes --package github:NyXXiR/skillboard skillboard doctor --summary
50
+ ```
51
+
52
+ The equivalent `npm exec` spelling is explicit about the package and binary:
53
+
54
+ ```bash
55
+ npm exec --yes --package github:NyXXiR/skillboard -- skillboard init
56
+ npm exec --yes --package github:NyXXiR/skillboard -- skillboard doctor --summary
57
+ ```
58
+
59
+ ## Install From A Clone
60
+
61
+ Use a clone when developing SkillBoard itself or testing unreleased changes:
62
+
63
+ ```bash
64
+ git clone https://github.com/NyXXiR/skillboard.git
65
+ cd skillboard
66
+ npm install
67
+ node bin/skillboard.mjs init --dir /path/to/your/project
68
+ node bin/skillboard.mjs brief --dir /path/to/your/project
69
+ node bin/skillboard.mjs doctor --dir /path/to/your/project --summary
70
+ ```
71
+
72
+ ## What init Does
73
+
74
+ `skillboard init` is the safe mutating step. npm installation itself does not
75
+ modify a project, but init creates the files that let agents discover the control
76
+ plane without a manual prompt and inventories already installed local agent
77
+ skills.
78
+
79
+ Created project files:
80
+
81
+ - `skillboard.config.yaml`: desired state for workflows, capabilities, skills,
82
+ harnesses, and install units.
83
+ - `skills/`: local skill root.
84
+ - `.skillboard/reports/`: generated dashboard and reconcile output location.
85
+ - `.skillboard/profiles/`: project-specific source profile location.
86
+ - `AGENTS.md`: Codex-style project instruction bridge.
87
+ - `CLAUDE.md`: Claude Code project instruction bridge.
88
+
89
+ The bridge block is marked with `BEGIN SKILLBOARD` / `END SKILLBOARD` and is
90
+ idempotent. Running init again does not duplicate it.
91
+
92
+ By default, init scans known local agent skill roots such as Codex user skills,
93
+ Codex system skills, Codex plugin-cache manifests, Claude user skills, Hermes
94
+ user skills, and Hermes profile skills under `.hermes/profiles/*/skills`.
95
+ Trusted user-local skills are written as `status: active` with `invocation:
96
+ manual-only` and attached to a generated local manual workflow when the project
97
+ has no workflow metadata yet. That lets a first-time user keep their existing
98
+ manual skills usable through `skillboard can-use` and guard checks without
99
+ granting automatic model invocation or creating legacy-state warning noise.
100
+ System, plugin, and other runtime-supplied skills are written with `status: quarantined` and
101
+ `invocation: blocked`. Plugin hooks, MCP servers, commands, and modified config files are
102
+ recorded on the owning install unit when manifest metadata exposes them, which
103
+ lets policy checks flag high-risk runtime extensions without flattening them
104
+ into loose skills. Use `--no-scan-installed` for a scaffold-only bootstrap, or
105
+ `--scan-root <dir>[,<dir>]` to add server-specific skill roots during bootstrap.
106
+
107
+ After init, run:
108
+
109
+ ```bash
110
+ skillboard doctor --dir /path/to/your/project
111
+ ```
112
+
113
+ Doctor is read-only. It reports config validity, bridge block status, managed
114
+ skills and install units, policy/source audit health, high-risk runtime
115
+ extensions, and the default uninstall dry-run plan. The default exit code stays
116
+ zero when the project is usable but has review-needed safe-mode warnings, such as
117
+ an unreviewed runtime extension. Add `--strict` when those warnings should fail a
118
+ CI or automation gate. Use `--json` for an agent-readable health payload, or
119
+ `--verify` when local source/cache digests should be checked as part of the
120
+ report. `skillboard status` is the same report under a shorter command name.
121
+
122
+ For AI-mediated use, the generated bridge tells agents to answer availability
123
+ questions from `skillboard brief --json`, not from memory or from raw
124
+ `SKILL.md` bodies. The brief is read-only and organizes the response around
125
+ "What your AI can use now", decisions the user can make once, hard safety
126
+ blocks, inactive installed skills, and suggested action cards. Text briefs show
127
+ action cards by default; JSON keeps them opt-in with `--include-actions`. The
128
+ default text brief is compact for large skill sets: it keeps counts, top
129
+ categories, the next safe action, short section previews, and short action
130
+ summaries. Use `skillboard brief --verbose` when you need the full list or full
131
+ copyable command details. Agents should still run `skillboard guard use ...`
132
+ immediately before an actual skill invocation.
133
+
134
+ Action cards are change suggestions. Before an agent applies one that changes
135
+ policy, trust, hooks, reset state, or skill references, it should request user
136
+ confirmation for one current action id from the brief. After confirmation, it should run
137
+ `skillboard apply-action <action-id> --config skillboard.config.yaml --skills skills --yes --json`
138
+ with `--workflow <name>` when a workflow is selected. It should then read the
139
+ returned post-apply brief before answering another availability question or
140
+ applying another action card. `apply-action` re-resolves current action cards,
141
+ so stale action ids and cached action-card shell text are not replayed.
142
+ For hook action cards specifically, keep `apply-action` as the action-card
143
+ primary flow. Raw `skillboard hook install ... --dry-run --json` previews and
144
+ the matching non-dry-run command are underlying manual detail for operators who
145
+ need to inspect or materialize an executable guard hook directly.
146
+
147
+ After installing a new local agent skill pack, plugin, workflow bundle, or
148
+ harness, rescan before enabling anything:
149
+
150
+ ```bash
151
+ skillboard inventory refresh --dir /path/to/your/project --dry-run
152
+ skillboard inventory refresh --dir /path/to/your/project
153
+ ```
154
+
155
+ The refresh command reuses the init scanner. If no workflows exist yet, trusted
156
+ user-local skills are attached to a generated local manual workflow. If workflows
157
+ already exist, those skills are imported as manual-only candidates with a review
158
+ note instead of being attached to an arbitrary workflow. Runtime components
159
+ remain attached to the owning install unit for review, and non-user runtime
160
+ skills stay out of automatic use until a source/workflow decision is recorded.
161
+ Dry-run output includes a capped YAML semantic change list, while broken
162
+ detector entries or malformed `SKILL.md` files are surfaced as scan warnings
163
+ instead of aborting the whole refresh.
164
+
165
+ Add a new workflow or harness without editing YAML by hand:
166
+
167
+ ```bash
168
+ skillboard add harness codex --config skillboard.config.yaml --skills skills
169
+ skillboard add workflow daily-workflow \
170
+ --harness codex \
171
+ --skill user.helper \
172
+ --config skillboard.config.yaml \
173
+ --skills skills
174
+ ```
175
+
176
+ If an installer mutates runtime config without a manifest, parse its output and
177
+ the mutated config files into the owning install unit before enabling anything:
178
+
179
+ ```bash
180
+ skillboard inventory detect \
181
+ --unit acme.runtime \
182
+ --config /path/to/your/project/skillboard.config.yaml \
183
+ --install-output /path/to/install.log \
184
+ --config-file ~/.codex/config.toml \
185
+ --dry-run
186
+ ```
187
+
188
+ The detector records discovered commands, hooks, MCP servers, and modified
189
+ config files under `install_units.<id>`, then updates `permission_risk` from the
190
+ detected runtime surface.
191
+
192
+ For fetchable Git sources, refresh the project cache and digest pin before
193
+ writing a lockfile:
194
+
195
+ ```bash
196
+ skillboard sources refresh --dir /path/to/your/project --unit github.mattpocock.skills --dry-run
197
+ skillboard sources refresh --dir /path/to/your/project --unit github.mattpocock.skills
198
+ skillboard audit sources \
199
+ --config /path/to/your/project/skillboard.config.yaml \
200
+ --skills /path/to/your/project/skills \
201
+ --verify
202
+ ```
203
+
204
+ `sources refresh` supports direct Git URLs, `git clone <url>` command strings,
205
+ GitHub `org/repo` shorthands, and `file://` Git remotes. It writes the refreshed
206
+ checkout under `.skillboard/sources/<install-unit-id>`, updates `cache_path`,
207
+ `source_digest`, and `verified_at`, and leaves the config untouched on dry-run.
208
+
209
+ ## Uninstall From A Project
210
+
211
+ Package removal and project cleanup are intentionally separate. `npm uninstall
212
+ -g agent-skillboard` removes the CLI package, but it does not edit a project.
213
+ Use the project cleanup command when you want to remove the bridge files created
214
+ by init:
215
+
216
+ ```bash
217
+ skillboard uninstall --dir /path/to/your/project --dry-run
218
+ skillboard uninstall --dir /path/to/your/project
219
+ ```
220
+
221
+ Default uninstall behavior is conservative:
222
+
223
+ - removes only the `BEGIN SKILLBOARD` / `END SKILLBOARD` bridge block from
224
+ `AGENTS.md` and `CLAUDE.md`;
225
+ - deletes a bridge file only when it has no user content left;
226
+ - deletes `.skillboard/profiles/README.md` and `.skillboard/hooks/README.md`
227
+ only when they still exactly match the generated text;
228
+ - removes empty generated directories;
229
+ - preserves `skillboard.config.yaml`, local skill files, reports, generated guard
230
+ hooks, and modified files by default. Empty generated directories can be
231
+ removed.
232
+
233
+ Use `--remove-config` to delete `skillboard.config.yaml` only when it still
234
+ matches the untouched default config. If the config contains scanned skills or
235
+ user edits, uninstall preserves it and reports it under `Preserved`.
236
+
237
+ Use `--reset-config` only when you intentionally want to discard the current
238
+ SkillBoard policy state and run `skillboard init` again from a fresh lifecycle.
239
+ This removes `skillboard.config.yaml` even when it contains imported skills or
240
+ workflow edits, but it still preserves local `skills/` files, reports, and
241
+ user-authored bridge content.
242
+
243
+ Add `--remove-reports` when a test reset should also delete generated
244
+ `.skillboard/reports/` output. This flag is explicit because reports may contain
245
+ review notes or other user-authored context. Local `skills/` files are still
246
+ preserved.
247
+
248
+ Add `--remove-hooks` only when a reset should also delete the entire
249
+ `.skillboard/hooks/` directory contents. This is explicit because hook scripts
250
+ may be wired into local agent/runtime configuration. Combine `--reset-config`,
251
+ `--remove-reports`, and `--remove-hooks` for a clean test reset that removes
252
+ SkillBoard-owned lifecycle scaffolding while preserving local `skills/`.
253
+
254
+ ## Upper-Layer Control
255
+
256
+ After installing skill packs or harness bundles, represent them as install
257
+ units:
258
+
259
+ ```bash
260
+ skillboard import \
261
+ --profile github.mattpocock.skills \
262
+ --source-root /path/to/mattpocock-skills \
263
+ --out .skillboard/reports/mattpocock-import.yaml
264
+ ```
265
+
266
+ The import output is a reviewable YAML fragment. Merge the accepted `skills` and
267
+ `install_units` into `skillboard.config.yaml`; imported skills stay inactive
268
+ until workflows and policies explicitly use them.
269
+
270
+ For a direct but still safe apply path:
271
+
272
+ ```bash
273
+ skillboard import \
274
+ --profile github.mattpocock.skills \
275
+ --source-root /path/to/mattpocock-skills \
276
+ --config skillboard.config.yaml \
277
+ --merge \
278
+ --dry-run
279
+ ```
280
+
281
+ `--merge` refuses to overwrite existing `skills` or `install_units`. Add
282
+ `--replace` only when you intentionally want the imported source profile to
283
+ replace those entries. The merge uses a structured YAML writer that keeps normal
284
+ comments and ordering where possible, but review the diff before committing
285
+ hand-edited formatting. Drop `--dry-run` only after the reported text and YAML
286
+ semantic change plan is acceptable.
287
+
288
+ After reviewing source ownership, expected components, and risk, record the
289
+ install-unit trust decision without editing YAML by hand:
290
+
291
+ ```bash
292
+ skillboard review install-unit github.mattpocock.skills \
293
+ --trust-level reviewed \
294
+ --config skillboard.config.yaml \
295
+ --skills skills
296
+ ```
297
+
298
+ Automatic invocation remains blocked for unreviewed non-user sources. The user
299
+ experience should still be a one-time decision queue: review, trust, or block
300
+ the install unit once, then revisit only when the source, skill, or workflow
301
+ changes.
302
+
303
+ ```yaml
304
+ install_units:
305
+ github.mattpocock.skills:
306
+ kind: marketplace
307
+ source: npx skills@latest add mattpocock/skills
308
+ scope: user-global
309
+ provided_components:
310
+ - skills
311
+ components:
312
+ skills:
313
+ - matt.tdd
314
+ ```
315
+
316
+ Then link each governed skill back to its owner:
317
+
318
+ ```yaml
319
+ skills:
320
+ matt.tdd:
321
+ path: matt/tdd
322
+ status: active
323
+ invocation: workflow-auto
324
+ exposure: exported
325
+ owner_install_unit: github.mattpocock.skills
326
+ ```
327
+
328
+ Run:
329
+
330
+ ```bash
331
+ skillboard check --config skillboard.config.yaml --skills skills
332
+ skillboard dashboard --config skillboard.config.yaml --skills skills --out .skillboard/reports/skill-map.md
333
+ ```
334
+
335
+ This keeps multiple installed repositories visible as managed units instead of
336
+ turning every skill into a global invocation candidate.
337
+
338
+ ## Adapter Direction
339
+
340
+ Import support should be profile-driven, not hardcoded. A popular source such as
341
+ `mattpocock/skills` or `oh-my-openagent` may ship with a built-in source profile,
342
+ but that profile should be data that maps repository layout and defaults into the
343
+ same install-unit model. Source-specific code should be limited to detector
344
+ plugins for layouts that cannot be described declaratively.
345
+
346
+ See [adapters.md](adapters.md).