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.
- package/CONTRIBUTING.md +83 -0
- package/LICENSE +21 -0
- package/README.md +645 -0
- package/bin/skillboard.mjs +4 -0
- package/docs/adapters.md +127 -0
- package/docs/capabilities.md +107 -0
- package/docs/install.md +346 -0
- package/docs/plans/20260625-080025-skillboard-mvp-review.md +189 -0
- package/docs/plans/README.md +20 -0
- package/docs/policy-model.md +251 -0
- package/docs/positioning.md +94 -0
- package/docs/profiles.md +166 -0
- package/docs/rollout-runbook.md +60 -0
- package/docs/user-flow.md +231 -0
- package/docs/versioning.md +201 -0
- package/examples/multi-source-skills/anthropic/docx/SKILL.md +8 -0
- package/examples/multi-source-skills/anthropic/skill-creator/SKILL.md +8 -0
- package/examples/multi-source-skills/matt/grill-me/SKILL.md +8 -0
- package/examples/multi-source-skills/matt/tdd/SKILL.md +8 -0
- package/examples/multi-source-skills/omo/review-work/SKILL.md +8 -0
- package/examples/multi-source-skills/omo/ulw-plan/SKILL.md +8 -0
- package/examples/multi-source-skills/private/tdd-work-continuity/SKILL.md +8 -0
- package/examples/multi-source-skills/private/workflow-router/SKILL.md +8 -0
- package/examples/multi-source-skills/wshobson/python-testing/SKILL.md +8 -0
- package/examples/multi-source-skills/wshobson/security-review/SKILL.md +8 -0
- package/examples/multi-source.config.yaml +271 -0
- package/examples/skillboard.config.yaml +194 -0
- package/examples/skills/grill-me/SKILL.md +9 -0
- package/examples/skills/grill-with-docs/SKILL.md +9 -0
- package/examples/skills/requirement-intake/SKILL.md +9 -0
- package/examples/skills/tdd/SKILL.md +8 -0
- package/package.json +58 -0
- package/profiles/anthropics-skills.yaml +17 -0
- package/profiles/mattpocock-skills.yaml +26 -0
- package/profiles/oh-my-openagent.yaml +32 -0
- package/profiles/voltagent-awesome-agent-skills.yaml +18 -0
- package/profiles/wshobson-agents.yaml +19 -0
- package/src/advisor/action-core.mjs +74 -0
- package/src/advisor/actions.mjs +256 -0
- package/src/advisor/application-commands.mjs +59 -0
- package/src/advisor/apply-action.mjs +183 -0
- package/src/advisor/schema.mjs +112 -0
- package/src/advisor/setup-actions.mjs +42 -0
- package/src/advisor/skills.mjs +191 -0
- package/src/advisor/sort.mjs +15 -0
- package/src/advisor/sources.mjs +160 -0
- package/src/advisor/trust-policy.mjs +65 -0
- package/src/advisor/workflow.mjs +41 -0
- package/src/advisor.mjs +134 -0
- package/src/agent-inventory-platforms.mjs +100 -0
- package/src/agent-inventory.mjs +804 -0
- package/src/brief-cli.mjs +40 -0
- package/src/brief-renderer.mjs +362 -0
- package/src/change-plan.mjs +169 -0
- package/src/cli.mjs +1171 -0
- package/src/config-helpers.mjs +72 -0
- package/src/control/can-use-guard.mjs +91 -0
- package/src/control/config-write.mjs +163 -0
- package/src/control/skill-crud.mjs +394 -0
- package/src/control/source-trust.mjs +161 -0
- package/src/control/workflow-crud.mjs +104 -0
- package/src/control.mjs +197 -0
- package/src/doctor.mjs +299 -0
- package/src/domain/constants.mjs +47 -0
- package/src/domain/indexes.mjs +29 -0
- package/src/domain/rules/capabilities.mjs +33 -0
- package/src/domain/rules/harnesses.mjs +16 -0
- package/src/domain/rules/install-units.mjs +95 -0
- package/src/domain/rules/skills.mjs +105 -0
- package/src/domain/rules/workflows.mjs +105 -0
- package/src/domain/skill-state-matrix.mjs +79 -0
- package/src/domain/source-classes.mjs +99 -0
- package/src/hook-plan.mjs +152 -0
- package/src/impact.mjs +41 -0
- package/src/index.mjs +82 -0
- package/src/init.mjs +136 -0
- package/src/install-output-detector.mjs +337 -0
- package/src/install-units.mjs +62 -0
- package/src/inventory-refresh.mjs +45 -0
- package/src/lifecycle-cli.mjs +166 -0
- package/src/lifecycle-content.mjs +87 -0
- package/src/policy.mjs +42 -0
- package/src/reconcile.mjs +111 -0
- package/src/report.mjs +151 -0
- package/src/review.mjs +88 -0
- package/src/rollout.mjs +453 -0
- package/src/skill-paths.mjs +17 -0
- package/src/source-cache.mjs +178 -0
- package/src/source-profile-loader.mjs +160 -0
- package/src/source-profiles.mjs +299 -0
- package/src/source-verification.mjs +252 -0
- package/src/uninstall.mjs +258 -0
- package/src/workspace.mjs +219 -0
- package/tsconfig.lsp.json +15 -0
package/docs/adapters.md
ADDED
|
@@ -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.
|
package/docs/install.md
ADDED
|
@@ -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).
|