agent-skillboard 0.1.2 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +154 -631
- package/docs/adapters.md +96 -96
- package/docs/ai-skill-routing-goal.md +112 -0
- package/docs/capabilities.md +6 -0
- package/docs/install.md +155 -105
- package/docs/plans/skillboard-variant-lifecycle-handoff.md +56 -0
- package/docs/policy-model.md +266 -214
- package/docs/positioning.md +94 -94
- package/docs/reference.md +349 -0
- package/docs/routing.md +85 -0
- package/docs/user-flow.md +75 -16
- package/docs/value-proof.md +190 -0
- package/docs/variant-lifecycle.md +86 -0
- package/docs/versioning.md +149 -138
- package/examples/multi-source-skills/anthropic/docx/SKILL.md +8 -8
- package/examples/multi-source-skills/anthropic/skill-creator/SKILL.md +8 -8
- package/examples/multi-source-skills/matt/grill-me/SKILL.md +8 -8
- package/examples/multi-source-skills/matt/tdd/SKILL.md +8 -8
- package/examples/multi-source-skills/omo/review-work/SKILL.md +8 -8
- package/examples/multi-source-skills/omo/ulw-plan/SKILL.md +8 -8
- package/examples/multi-source-skills/private/tdd-work-continuity/SKILL.md +8 -8
- package/examples/multi-source-skills/private/workflow-router/SKILL.md +8 -8
- package/examples/multi-source-skills/wshobson/python-testing/SKILL.md +8 -8
- package/examples/multi-source-skills/wshobson/security-review/SKILL.md +8 -8
- package/examples/skills/grill-me/SKILL.md +9 -9
- package/examples/skills/grill-with-docs/SKILL.md +9 -9
- package/examples/skills/requirement-intake/SKILL.md +9 -9
- package/examples/skills/tdd/SKILL.md +8 -8
- package/package.json +7 -3
- package/src/advisor/guidance.mjs +232 -0
- package/src/advisor/schema.mjs +2 -0
- package/src/advisor/skills.mjs +2 -0
- package/src/advisor.mjs +36 -7
- package/src/brief-cli.mjs +6 -5
- package/src/brief-renderer.mjs +225 -8
- package/src/cli.mjs +574 -27
- package/src/config-helpers.mjs +34 -18
- package/src/conflicts.mjs +70 -0
- package/src/control/can-use-guard.mjs +8 -3
- package/src/control/skill-crud.mjs +142 -0
- package/src/control/skill-variants.mjs +221 -0
- package/src/control/source-trust.mjs +1 -0
- package/src/control/variant-files.mjs +265 -0
- package/src/control/variant-lifecycle-config.mjs +156 -0
- package/src/control/variant-reset.mjs +171 -0
- package/src/control/variant-status.mjs +75 -0
- package/src/control.mjs +13 -1
- package/src/domain/rules/skills.mjs +60 -0
- package/src/domain/rules/workflows.mjs +13 -0
- package/src/impact.mjs +21 -12
- package/src/index.mjs +13 -1
- package/src/lifecycle-cli.mjs +18 -7
- package/src/lifecycle-content.mjs +29 -22
- package/src/route.mjs +537 -0
- package/src/source-verification.mjs +7 -3
- package/src/workspace.mjs +141 -43
- package/tsconfig.lsp.json +1 -1
package/docs/positioning.md
CHANGED
|
@@ -1,94 +1,94 @@
|
|
|
1
|
-
# Positioning
|
|
2
|
-
|
|
3
|
-
## Problem
|
|
4
|
-
|
|
5
|
-
AI agent skills are easy to install but hard to govern.
|
|
6
|
-
|
|
7
|
-
Users lose confidence when they cannot tell:
|
|
8
|
-
|
|
9
|
-
- which installed skills are active,
|
|
10
|
-
- which skills may be invoked automatically,
|
|
11
|
-
- which workflows depend on a skill,
|
|
12
|
-
- which similar skills compete silently,
|
|
13
|
-
- whether removing a skill breaks a hidden workflow.
|
|
14
|
-
- what to do after new skills or harnesses appear.
|
|
15
|
-
- how to migrate workflows when a harness disappears.
|
|
16
|
-
- which plugin, marketplace, package, or installer introduced a component.
|
|
17
|
-
|
|
18
|
-
## Product Definition
|
|
19
|
-
|
|
20
|
-
SkillBoard is a workflow-scoped skill control board with a reconciler.
|
|
21
|
-
|
|
22
|
-
It is not primarily a skill catalog. It is an operations layer that turns a
|
|
23
|
-
skill repository into a visible, policy-checked system. Users define intent and
|
|
24
|
-
policy; SkillBoard interprets drift between desired state and actual state.
|
|
25
|
-
|
|
26
|
-
## Adjacent Tools
|
|
27
|
-
|
|
28
|
-
- `skillshare`: syncs skills across many agent targets.
|
|
29
|
-
- Microsoft APM: reproduces agent context from `apm.yml` and lockfiles.
|
|
30
|
-
- SkillGate/SkillGuard/SkillScope-style tools: scan, permissions, and security
|
|
31
|
-
risk.
|
|
32
|
-
- SkillPilot/skill routers: pick relevant skills before inference.
|
|
33
|
-
|
|
34
|
-
SkillBoard complements those tools by making invocation state, workflow impact,
|
|
35
|
-
and migration decisions explicit.
|
|
36
|
-
|
|
37
|
-
## Runtime Primitive Model
|
|
38
|
-
|
|
39
|
-
SkillBoard should not depend on one installer shape. The likely ecosystem
|
|
40
|
-
direction is manifest plus scope plus bundle plus cache plus enable/disable plus
|
|
41
|
-
lockfile plus audit. That means the control plane needs a parent abstraction for
|
|
42
|
-
the thing that was installed.
|
|
43
|
-
|
|
44
|
-
The parent is an install unit. Skills and harnesses can then be child components
|
|
45
|
-
of a `plugin`, `marketplace`, `package-manager-dependency`, `harness`,
|
|
46
|
-
`mcp-server`, `hook`, `agent`, or `lsp` unit. LazyCodex-style installers should
|
|
47
|
-
therefore show up as user-global harness/plugin bundles that provide commands,
|
|
48
|
-
skills, MCP integrations, hooks, and config changes, not as loose skills mixed
|
|
49
|
-
into the skill list.
|
|
50
|
-
|
|
51
|
-
Users should be able to plug in workflow/harness bundles, then add only a small
|
|
52
|
-
number of personal global meta skills. Those global meta skills are for control
|
|
53
|
-
tasks such as routing, impact analysis, registry maintenance, and verification.
|
|
54
|
-
Everything else should remain scoped to a workflow or owned by its parent install
|
|
55
|
-
unit. This is how SkillBoard keeps skill count growth from becoming routing
|
|
56
|
-
complexity.
|
|
57
|
-
|
|
58
|
-
The multi-source fixture exercises this product claim with one private skill
|
|
59
|
-
source plus five external repositories: a personal skill folder, a workflow skill
|
|
60
|
-
pack, a harness bundle, a standard Agent Skills repository, a multi-harness
|
|
61
|
-
plugin marketplace, and a catalog-style marketplace.
|
|
62
|
-
|
|
63
|
-
Import adapters should follow the same principle. Popular repositories can have
|
|
64
|
-
bundled source profiles, but the import logic should not branch on repository
|
|
65
|
-
names. The stable contract is the normalized install-unit model, not a hardcoded
|
|
66
|
-
adapter per source.
|
|
67
|
-
|
|
68
|
-
## Wedge
|
|
69
|
-
|
|
70
|
-
The first useful wedge is:
|
|
71
|
-
|
|
72
|
-
1. read an existing skill folder,
|
|
73
|
-
2. read a strong workflow policy config,
|
|
74
|
-
3. quarantine newly discovered skills,
|
|
75
|
-
4. show active/manual/blocked state,
|
|
76
|
-
5. fail CI when policy references drift,
|
|
77
|
-
6. show disable impact before cleanup,
|
|
78
|
-
7. produce a reconcile plan when skills or harnesses change.
|
|
79
|
-
8. show the install unit that introduced a skill, harness, hook, MCP server, or
|
|
80
|
-
command.
|
|
81
|
-
|
|
82
|
-
That is enough to make adding and removing skills feel safer.
|
|
83
|
-
|
|
84
|
-
## Reconciler Promise
|
|
85
|
-
|
|
86
|
-
Control should not mean constant manual work. The reconciler should handle the
|
|
87
|
-
obvious safe defaults and only ask for important decisions:
|
|
88
|
-
|
|
89
|
-
- new skills: quarantine, map likely capability, ask whether to approve;
|
|
90
|
-
- removed skills: show affected workflows and fallback capabilities;
|
|
91
|
-
- changed harnesses: show missing commands and migration hints;
|
|
92
|
-
- new harnesses: disable by default until explicitly assigned;
|
|
93
|
-
- duplicate skills: group by capability and recommend a canonical
|
|
94
|
-
implementation.
|
|
1
|
+
# Positioning
|
|
2
|
+
|
|
3
|
+
## Problem
|
|
4
|
+
|
|
5
|
+
AI agent skills are easy to install but hard to govern.
|
|
6
|
+
|
|
7
|
+
Users lose confidence when they cannot tell:
|
|
8
|
+
|
|
9
|
+
- which installed skills are active,
|
|
10
|
+
- which skills may be invoked automatically,
|
|
11
|
+
- which workflows depend on a skill,
|
|
12
|
+
- which similar skills compete silently,
|
|
13
|
+
- whether removing a skill breaks a hidden workflow.
|
|
14
|
+
- what to do after new skills or harnesses appear.
|
|
15
|
+
- how to migrate workflows when a harness disappears.
|
|
16
|
+
- which plugin, marketplace, package, or installer introduced a component.
|
|
17
|
+
|
|
18
|
+
## Product Definition
|
|
19
|
+
|
|
20
|
+
SkillBoard is a workflow-scoped skill control board with a reconciler.
|
|
21
|
+
|
|
22
|
+
It is not primarily a skill catalog. It is an operations layer that turns a
|
|
23
|
+
skill repository into a visible, policy-checked system. Users define intent and
|
|
24
|
+
policy; SkillBoard interprets drift between desired state and actual state.
|
|
25
|
+
|
|
26
|
+
## Adjacent Tools
|
|
27
|
+
|
|
28
|
+
- `skillshare`: syncs skills across many agent targets.
|
|
29
|
+
- Microsoft APM: reproduces agent context from `apm.yml` and lockfiles.
|
|
30
|
+
- SkillGate/SkillGuard/SkillScope-style tools: scan, permissions, and security
|
|
31
|
+
risk.
|
|
32
|
+
- SkillPilot/skill routers: pick relevant skills before inference.
|
|
33
|
+
|
|
34
|
+
SkillBoard complements those tools by making invocation state, workflow impact,
|
|
35
|
+
and migration decisions explicit.
|
|
36
|
+
|
|
37
|
+
## Runtime Primitive Model
|
|
38
|
+
|
|
39
|
+
SkillBoard should not depend on one installer shape. The likely ecosystem
|
|
40
|
+
direction is manifest plus scope plus bundle plus cache plus enable/disable plus
|
|
41
|
+
lockfile plus audit. That means the control plane needs a parent abstraction for
|
|
42
|
+
the thing that was installed.
|
|
43
|
+
|
|
44
|
+
The parent is an install unit. Skills and harnesses can then be child components
|
|
45
|
+
of a `plugin`, `marketplace`, `package-manager-dependency`, `harness`,
|
|
46
|
+
`mcp-server`, `hook`, `agent`, or `lsp` unit. LazyCodex-style installers should
|
|
47
|
+
therefore show up as user-global harness/plugin bundles that provide commands,
|
|
48
|
+
skills, MCP integrations, hooks, and config changes, not as loose skills mixed
|
|
49
|
+
into the skill list.
|
|
50
|
+
|
|
51
|
+
Users should be able to plug in workflow/harness bundles, then add only a small
|
|
52
|
+
number of personal global meta skills. Those global meta skills are for control
|
|
53
|
+
tasks such as routing, impact analysis, registry maintenance, and verification.
|
|
54
|
+
Everything else should remain scoped to a workflow or owned by its parent install
|
|
55
|
+
unit. This is how SkillBoard keeps skill count growth from becoming routing
|
|
56
|
+
complexity.
|
|
57
|
+
|
|
58
|
+
The multi-source fixture exercises this product claim with one private skill
|
|
59
|
+
source plus five external repositories: a personal skill folder, a workflow skill
|
|
60
|
+
pack, a harness bundle, a standard Agent Skills repository, a multi-harness
|
|
61
|
+
plugin marketplace, and a catalog-style marketplace.
|
|
62
|
+
|
|
63
|
+
Import adapters should follow the same principle. Popular repositories can have
|
|
64
|
+
bundled source profiles, but the import logic should not branch on repository
|
|
65
|
+
names. The stable contract is the normalized install-unit model, not a hardcoded
|
|
66
|
+
adapter per source.
|
|
67
|
+
|
|
68
|
+
## Wedge
|
|
69
|
+
|
|
70
|
+
The first useful wedge is:
|
|
71
|
+
|
|
72
|
+
1. read an existing skill folder,
|
|
73
|
+
2. read a strong workflow policy config,
|
|
74
|
+
3. quarantine newly discovered skills,
|
|
75
|
+
4. show active/manual/blocked state,
|
|
76
|
+
5. fail CI when policy references drift,
|
|
77
|
+
6. show disable impact before cleanup,
|
|
78
|
+
7. produce a reconcile plan when skills or harnesses change.
|
|
79
|
+
8. show the install unit that introduced a skill, harness, hook, MCP server, or
|
|
80
|
+
command.
|
|
81
|
+
|
|
82
|
+
That is enough to make adding and removing skills feel safer.
|
|
83
|
+
|
|
84
|
+
## Reconciler Promise
|
|
85
|
+
|
|
86
|
+
Control should not mean constant manual work. The reconciler should handle the
|
|
87
|
+
obvious safe defaults and only ask for important decisions:
|
|
88
|
+
|
|
89
|
+
- new skills: quarantine, map likely capability, ask whether to approve;
|
|
90
|
+
- removed skills: show affected workflows and fallback capabilities;
|
|
91
|
+
- changed harnesses: show missing commands and migration hints;
|
|
92
|
+
- new harnesses: disable by default until explicitly assigned;
|
|
93
|
+
- duplicate skills: group by capability and recommend a canonical
|
|
94
|
+
implementation.
|
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
# SkillBoard Reference
|
|
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.
|
|
5
|
+
|
|
6
|
+
For installation and bootstrap 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:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npx --yes --package agent-skillboard skillboard init
|
|
20
|
+
npx --yes --package agent-skillboard skillboard doctor --summary
|
|
21
|
+
npx --yes --package agent-skillboard skillboard brief --workflow <workflow-from-init>
|
|
22
|
+
npm exec --yes --package agent-skillboard -- skillboard init
|
|
23
|
+
npm exec --yes --package agent-skillboard -- skillboard doctor --summary
|
|
24
|
+
npm exec --yes --package agent-skillboard -- skillboard brief --workflow <workflow-from-init>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
If `init` does not print a workflow, run the unscoped `brief` command it prints
|
|
28
|
+
instead.
|
|
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 init
|
|
35
|
+
npx --yes --package github:NyXXiR/skillboard skillboard doctor --summary
|
|
36
|
+
npx --yes --package github:NyXXiR/skillboard skillboard brief --workflow <workflow-from-init>
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
From a source clone:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
git clone https://github.com/NyXXiR/skillboard.git
|
|
43
|
+
cd skillboard
|
|
44
|
+
npm install
|
|
45
|
+
npm test
|
|
46
|
+
node bin/skillboard.mjs init --dir /path/to/your/project
|
|
47
|
+
node bin/skillboard.mjs doctor --dir /path/to/your/project --summary
|
|
48
|
+
node bin/skillboard.mjs brief --dir /path/to/your/project --workflow <workflow-from-init>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Commands
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
skillboard init [--dir <path>] [--scan-root <dir>[,<dir>]] [--no-scan-installed]
|
|
55
|
+
skillboard uninstall [--dir <path>] [--dry-run] [--remove-config|--reset-config] [--remove-reports] [--remove-hooks] [--keep-empty-dirs]
|
|
56
|
+
skillboard inventory refresh [--dir <path>] [--config <path>] [--scan-root <dir>[,<dir>]] [--dry-run] [--json]
|
|
57
|
+
skillboard inventory detect --unit <id> --config <path> [--install-output <path>] [--config-file a,b] [--source <value>] [--kind <kind>] [--scope <scope>] [--dry-run] [--json]
|
|
58
|
+
skillboard sources refresh [--dir <path>] [--config <path>] [--unit <id>[,<id>]] [--cache-dir <dir>] [--dry-run] [--json]
|
|
59
|
+
skillboard doctor [--dir <path>] [--config <path>] [--skills <dir>] [--verify] [--strict] [--json] [--summary]
|
|
60
|
+
skillboard status [--dir <path>] [--config <path>] [--skills <dir>] [--verify] [--strict] [--json] [--summary]
|
|
61
|
+
skillboard brief [--workflow <name>] [--intent <request>] [--dir <path>] [--config <path>] [--skills <dir>] [--include-actions] [--verbose] [--json]
|
|
62
|
+
skillboard apply-action <action-id> [--workflow <name>] [--dir <path>] [--config <path>] [--skills <dir>] [--dry-run] [--yes] [--allow-destructive] [--json]
|
|
63
|
+
skillboard import --profile <id-or-path> --source-root <dir> [--profile-dirs a,b] [--out <path>]
|
|
64
|
+
skillboard import --profile <id-or-path> --source-root <dir> --config <path> --merge [--replace] [--dry-run]
|
|
65
|
+
skillboard scan --config <path> --skills <dir>
|
|
66
|
+
skillboard check --config <path> --skills <dir>
|
|
67
|
+
skillboard list [skills|workflows|harnesses|install-units] --config <path> --skills <dir>
|
|
68
|
+
skillboard explain <skill-id> --config <path> --skills <dir>
|
|
69
|
+
skillboard route <intent> --workflow <name> --config <path> --skills <dir> [--json]
|
|
70
|
+
skillboard can-use <skill-id> --workflow <name> --config <path> --skills <dir>
|
|
71
|
+
skillboard guard use <skill-id> --workflow <name> --config <path> --skills <dir>
|
|
72
|
+
skillboard audit sources --config <path> --skills <dir> [--verify]
|
|
73
|
+
skillboard rollout [audit|plan|apply|rollback|report] [--dir <path>] [--config <path>] [--skills <dir>] [--transaction <id>] [--json]
|
|
74
|
+
skillboard hook install --workflow <name> --config <path> --skills <dir> [--out <path>] [--skillboard-bin <path>] [--dry-run] [--json]
|
|
75
|
+
skillboard lock write --config <path> --skills <dir> [--out <path>] [--replace] [--allow-unverified]
|
|
76
|
+
skillboard review install-unit <unit-id> [--trust-level trusted|reviewed|unreviewed|blocked] --config <path> --skills <dir>
|
|
77
|
+
skillboard add skill <skill-id> --path <relative-skill-path> --config <path> --skills <dir>
|
|
78
|
+
skillboard add workflow <workflow-name> --harness <harness-name> --config <path> --skills <dir> [--skill <id>[,<id>]]
|
|
79
|
+
skillboard add harness <harness-name> --config <path> --skills <dir> [--status <status>] [--command <cmd>[,<cmd>]]
|
|
80
|
+
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]
|
|
81
|
+
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]
|
|
82
|
+
skillboard variant status <variant-id> --config <path> --skills <dir> [--json]
|
|
83
|
+
skillboard variant approve <variant-id> --config <path> --skills <dir> [--mode manual-only|router-only|workflow-auto] [--dry-run] [--json]
|
|
84
|
+
skillboard variant reset <variant-id> --to-base|--to-approved --config <path> --skills <dir> [--yes] [--dry-run] [--mode manual-only|router-only|workflow-auto] [--json]
|
|
85
|
+
skillboard activate <skill-id> --workflow <name> --config <path> --skills <dir>
|
|
86
|
+
skillboard block <skill-id> --workflow <name> --config <path> --skills <dir>
|
|
87
|
+
skillboard quarantine <skill-id> --config <path> --skills <dir>
|
|
88
|
+
skillboard prefer <skill-id> --workflow <name> --capability <name> --config <path> --skills <dir>
|
|
89
|
+
skillboard remove skill <skill-id> --config <path> --skills <dir> [--force]
|
|
90
|
+
skillboard dashboard --config <path> --skills <dir> [--out <path>]
|
|
91
|
+
skillboard reconcile --config <path> --skills <dir> [--actual-harnesses a,b] [--out <path>]
|
|
92
|
+
skillboard impact disable <skill-id> --config <path> --skills <dir> [--out <path>] [--json]
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Capability Routing
|
|
96
|
+
|
|
97
|
+
For the normal AI-mediated flow, prefer `brief --intent`: it returns the current
|
|
98
|
+
availability brief plus a compact route recommendation in `assistant_guidance`.
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
skillboard brief \
|
|
102
|
+
--intent "write tests before implementation" \
|
|
103
|
+
--workflow codex-night-workflow \
|
|
104
|
+
--config skillboard.config.yaml \
|
|
105
|
+
--skills skills \
|
|
106
|
+
--json
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
`route` is a read-only recommendation surface for AI/automation. It maps a
|
|
110
|
+
normal user request to the best matching workflow capability or workflow-bound
|
|
111
|
+
skill metadata, then returns the recommended skill, fallback skills, matched
|
|
112
|
+
terms, recommendation reason, and the guard command that must still pass before
|
|
113
|
+
invocation.
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
skillboard route "write tests before implementation" \
|
|
117
|
+
--workflow codex-night-workflow \
|
|
118
|
+
--config skillboard.config.yaml \
|
|
119
|
+
--skills skills \
|
|
120
|
+
--json
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Routing first uses declared capability names and workflow bindings. If a fresh
|
|
124
|
+
project has workflow skills but no capability catalog yet, it can fall back to
|
|
125
|
+
workflow-bound skill id, path, category, `SKILL.md` name, and `SKILL.md`
|
|
126
|
+
description metadata. It does not inspect or semantically rank `SKILL.md` bodies,
|
|
127
|
+
and it does not invoke the skill. The JSON payload includes `match_source`,
|
|
128
|
+
`matched_terms`, and `recommendation_reason` so the AI can explain why it chose
|
|
129
|
+
or declined a skill without inventing rationale.
|
|
130
|
+
Recommended and fallback skills are limited to the selected workflow's active,
|
|
131
|
+
required, or global-auto bindings rather than every global alternative in the
|
|
132
|
+
capability catalog. When nothing matches, the result keeps
|
|
133
|
+
`matched_capability: null` and `recommended_skill: null`, then returns possible
|
|
134
|
+
workflow skills so the AI can ask a clarifying question. When a guard allows the
|
|
135
|
+
recommended skill, the AI should disclose the skill at start and completion
|
|
136
|
+
instead of asking for another approval. That disclosure is an audit trace, not a
|
|
137
|
+
permission prompt. When an allowed fallback is selected because the preferred
|
|
138
|
+
skill is denied, `post_use_policy_suggestion` tells the AI to ask after the task
|
|
139
|
+
whether to remember that fallback as the preferred workflow policy.
|
|
140
|
+
|
|
141
|
+
## Config Shape
|
|
142
|
+
|
|
143
|
+
```yaml
|
|
144
|
+
version: 1
|
|
145
|
+
|
|
146
|
+
defaults:
|
|
147
|
+
invocation_policy: deny-by-default
|
|
148
|
+
allow_model_invocation: false
|
|
149
|
+
require_explicit_workflow: true
|
|
150
|
+
|
|
151
|
+
skills:
|
|
152
|
+
matt.tdd:
|
|
153
|
+
path: tdd
|
|
154
|
+
status: active
|
|
155
|
+
invocation: workflow-auto
|
|
156
|
+
exposure: exported
|
|
157
|
+
category: engineering
|
|
158
|
+
conflicts_with:
|
|
159
|
+
- meerkat.no-tests-please
|
|
160
|
+
|
|
161
|
+
user.workflow-router:
|
|
162
|
+
path: user/workflow-router
|
|
163
|
+
status: active
|
|
164
|
+
invocation: global-auto
|
|
165
|
+
exposure: global-meta
|
|
166
|
+
category: meta
|
|
167
|
+
|
|
168
|
+
capabilities:
|
|
169
|
+
test-first-implementation:
|
|
170
|
+
canonical: matt.tdd
|
|
171
|
+
alternatives:
|
|
172
|
+
- meerkat.test-first-implementation
|
|
173
|
+
default_policy: workflow-auto
|
|
174
|
+
|
|
175
|
+
harnesses:
|
|
176
|
+
codex:
|
|
177
|
+
status: primary
|
|
178
|
+
workflows:
|
|
179
|
+
- codex-night-workflow
|
|
180
|
+
|
|
181
|
+
install_units:
|
|
182
|
+
lazycodex.omo:
|
|
183
|
+
kind: harness
|
|
184
|
+
source: npx lazycodex-ai install
|
|
185
|
+
scope: user-global
|
|
186
|
+
manifest_path: ~/.codex/plugins/cache/sisyphuslabs/omo/plugin.json
|
|
187
|
+
cache_path: ~/.codex/plugins/cache/sisyphuslabs/omo
|
|
188
|
+
provided_components:
|
|
189
|
+
- skills
|
|
190
|
+
- commands
|
|
191
|
+
- mcp-server
|
|
192
|
+
- hook
|
|
193
|
+
components:
|
|
194
|
+
skills:
|
|
195
|
+
- lazycodex.ulw-plan
|
|
196
|
+
commands:
|
|
197
|
+
- $ulw-plan
|
|
198
|
+
- $start-work
|
|
199
|
+
hooks:
|
|
200
|
+
- post-tool-use
|
|
201
|
+
mcp_servers:
|
|
202
|
+
- omo-docs
|
|
203
|
+
modified_config_files:
|
|
204
|
+
- ~/.codex/config.toml
|
|
205
|
+
- ~/.local/bin
|
|
206
|
+
auto_update: false
|
|
207
|
+
enabled: true
|
|
208
|
+
workflow_dependencies:
|
|
209
|
+
- large-refactor-workflow
|
|
210
|
+
permission_risk: high
|
|
211
|
+
rollback: manual
|
|
212
|
+
|
|
213
|
+
workflows:
|
|
214
|
+
codex-night-workflow:
|
|
215
|
+
harness: codex
|
|
216
|
+
active_skills:
|
|
217
|
+
- matt.tdd
|
|
218
|
+
blocked_skills: []
|
|
219
|
+
required_capabilities:
|
|
220
|
+
test-first-implementation:
|
|
221
|
+
preferred: matt.tdd
|
|
222
|
+
fallback:
|
|
223
|
+
- meerkat.test-first-implementation
|
|
224
|
+
policy: workflow-auto
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
`conflicts_with` is runtime policy, not documentation-only metadata. A workflow
|
|
228
|
+
cannot keep both sides selectable unless one side is explicitly blocked in that
|
|
229
|
+
workflow. Conflict failures appear in policy errors, guard reasons, brief
|
|
230
|
+
blocking reasons, and impact reports. `impact disable --json` includes:
|
|
231
|
+
|
|
232
|
+
- `conflictingSkills`: declared direct or reverse conflicts for the target
|
|
233
|
+
skill.
|
|
234
|
+
- `activeConflicts`: workflow-scoped conflict pairs currently involving the
|
|
235
|
+
target skill.
|
|
236
|
+
|
|
237
|
+
## Source Profiles
|
|
238
|
+
|
|
239
|
+
`skillboard import` reads a source profile and emits a YAML fragment containing
|
|
240
|
+
governed `skills` plus their owning `install_units`.
|
|
241
|
+
|
|
242
|
+
```bash
|
|
243
|
+
skillboard import \
|
|
244
|
+
--profile github.mattpocock.skills \
|
|
245
|
+
--source-root /path/to/cloned-or-installed/repo \
|
|
246
|
+
--out .skillboard/reports/import-fragment.yaml
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
To preview a direct apply path, pass `--merge --config --dry-run`. Merge is
|
|
250
|
+
non-destructive by default: if a skill or install-unit id already exists, the
|
|
251
|
+
command fails and leaves the config unchanged. Use `--replace` only when you
|
|
252
|
+
intend to overwrite existing entries, and drop `--dry-run` only after reviewing
|
|
253
|
+
the reported change plan.
|
|
254
|
+
|
|
255
|
+
Built-in profiles are shipped as YAML data under `profiles/`, including:
|
|
256
|
+
|
|
257
|
+
- `github.mattpocock.skills`
|
|
258
|
+
- `github.code-yeongyu.oh-my-openagent`
|
|
259
|
+
- `github.anthropics.skills`
|
|
260
|
+
- `github.wshobson.agents`
|
|
261
|
+
- `github.voltagent.awesome-agent-skills`
|
|
262
|
+
|
|
263
|
+
Project-specific profiles can live under `.skillboard/profiles/` and be passed
|
|
264
|
+
by path:
|
|
265
|
+
|
|
266
|
+
```bash
|
|
267
|
+
skillboard import --profile .skillboard/profiles/my-source.yaml --source-root /path/to/repo
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
## Invocation Modes
|
|
271
|
+
|
|
272
|
+
- `manual-only`: user must explicitly ask for it.
|
|
273
|
+
- `router-only`: a router or orchestrator may select it after policy checks.
|
|
274
|
+
- `workflow-auto`: model invocation is allowed only inside listed workflows.
|
|
275
|
+
- `global-auto`: allowed globally; use sparingly and only for `global-meta`
|
|
276
|
+
control skills.
|
|
277
|
+
- `blocked`: installed but not callable until policy or provenance changes.
|
|
278
|
+
- `deprecated`: kept for history, not for new use.
|
|
279
|
+
|
|
280
|
+
Skill exposure values:
|
|
281
|
+
|
|
282
|
+
- `exported`: centrally governed skill that may serve shared workflows or
|
|
283
|
+
canonical capabilities.
|
|
284
|
+
- `global-meta`: intentionally global control skill, such as a router, impact
|
|
285
|
+
analyzer, or verification gate.
|
|
286
|
+
- `unit-managed`: child component supplied by a parent install unit or harness
|
|
287
|
+
bundle.
|
|
288
|
+
- `private`: workflow-internal implementation detail.
|
|
289
|
+
|
|
290
|
+
## Reconciliation Model
|
|
291
|
+
|
|
292
|
+
SkillBoard compares desired state from config with actual state from discovered
|
|
293
|
+
`SKILL.md` files and detected harnesses.
|
|
294
|
+
|
|
295
|
+
- New skills become `quarantined` / `blocked` recommendations.
|
|
296
|
+
- Known capability matches are surfaced, but not auto-enabled.
|
|
297
|
+
- Removed harnesses report affected workflows, missing commands, and migration
|
|
298
|
+
recommendations.
|
|
299
|
+
- Newly detected harnesses are disabled until workflows explicitly opt in.
|
|
300
|
+
- If actual harness inventory is not provided, reconcile emits a warning instead
|
|
301
|
+
of silently assuming harness state.
|
|
302
|
+
|
|
303
|
+
## Install Units
|
|
304
|
+
|
|
305
|
+
SkillBoard should not assume that every runtime change is a standalone skill.
|
|
306
|
+
Modern agent environments increasingly install packaged primitives:
|
|
307
|
+
|
|
308
|
+
- `skill`
|
|
309
|
+
- `plugin`
|
|
310
|
+
- `marketplace`
|
|
311
|
+
- `package-manager-dependency`
|
|
312
|
+
- `harness`
|
|
313
|
+
- `mcp-server`
|
|
314
|
+
- `hook`
|
|
315
|
+
- `agent`
|
|
316
|
+
- `lsp`
|
|
317
|
+
|
|
318
|
+
An install unit records source, scope, manifest/cache paths, provided
|
|
319
|
+
components, modified config files, enablement, workflow dependencies,
|
|
320
|
+
permission risk, trust level, digest/signature pins, and rollback shape.
|
|
321
|
+
LazyCodex-style setups fit this model as user-global harness/plugin bundles
|
|
322
|
+
that provide commands, skills, MCP integrations, hooks, and config.
|
|
323
|
+
|
|
324
|
+
## Variant Commands
|
|
325
|
+
|
|
326
|
+
Use `skillboard variant add claude.a --from a --capability task-review
|
|
327
|
+
--workflow claude-workflow --path claude/a ...` to record an explicit,
|
|
328
|
+
user-approved `a -> claude.a` variant.
|
|
329
|
+
|
|
330
|
+
For a reviewed manual adaptation lifecycle, use `skillboard variant fork
|
|
331
|
+
<variant-id>` to create draft metadata and raw snapshot records, edit the
|
|
332
|
+
variant `SKILL.md` by hand, inspect `skillboard variant status <variant-id>`
|
|
333
|
+
for `variant.status` and computed drift, then promote with `skillboard variant
|
|
334
|
+
approve <variant-id>` or restore with `skillboard variant reset <variant-id>
|
|
335
|
+
--to-base|--to-approved`.
|
|
336
|
+
|
|
337
|
+
SkillBoard records the relationship and policy only; it does not convert skill
|
|
338
|
+
bodies, does not rewrite skill bodies, and does not guarantee semantic
|
|
339
|
+
equivalence of skill bodies. See [variant-lifecycle.md](variant-lifecycle.md)
|
|
340
|
+
for the full lifecycle guide.
|
|
341
|
+
|
|
342
|
+
## Related Runbooks
|
|
343
|
+
|
|
344
|
+
- [install.md](install.md): install, init, doctor, bridge, refresh, and uninstall.
|
|
345
|
+
- [user-flow.md](user-flow.md): first-time skill governance workflow.
|
|
346
|
+
- [policy-model.md](policy-model.md): policy states, invocation modes, and install units.
|
|
347
|
+
- [capabilities.md](capabilities.md): capability catalog and workflow resolution.
|
|
348
|
+
- [rollout-runbook.md](rollout-runbook.md): rollout audit, apply, report, and rollback.
|
|
349
|
+
- [versioning.md](versioning.md): release, schema, profile, workflow, and lockfile versioning.
|
package/docs/routing.md
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Capability Routing
|
|
2
|
+
|
|
3
|
+
Capability routing helps an AI choose a skill for the user's current request
|
|
4
|
+
without making the user learn SkillBoard commands.
|
|
5
|
+
|
|
6
|
+
For the normal AI-mediated flow, prefer `brief --intent`. It returns the
|
|
7
|
+
availability brief and the routing result together:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
skillboard brief \
|
|
11
|
+
--intent "write tests before implementation" \
|
|
12
|
+
--workflow codex-night-workflow \
|
|
13
|
+
--config skillboard.config.yaml \
|
|
14
|
+
--skills skills \
|
|
15
|
+
--json
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Read `assistant_guidance.route` from the JSON output. It includes:
|
|
19
|
+
|
|
20
|
+
- `matched_capability`
|
|
21
|
+
- `match_source`
|
|
22
|
+
- `confidence`
|
|
23
|
+
- `matched_terms`
|
|
24
|
+
- `recommendation_reason`
|
|
25
|
+
- `recommended_skill`
|
|
26
|
+
- `fallback_skills`
|
|
27
|
+
- `route_candidates`
|
|
28
|
+
- `post_use_policy_suggestion`
|
|
29
|
+
- `guard_command`
|
|
30
|
+
- `usage_disclosure`
|
|
31
|
+
|
|
32
|
+
When `guard_allowed` is true, the AI should run the guard automatically before
|
|
33
|
+
using the skill. It should not ask for another approval. It should disclose the
|
|
34
|
+
skill at the start and at completion:
|
|
35
|
+
|
|
36
|
+
```text
|
|
37
|
+
I will use <skill-id> for this request.
|
|
38
|
+
I used <skill-id> for this request.
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
When several skills match, inspect `route_candidates` before acting. Each entry
|
|
42
|
+
shows the candidate skill, whether it was selected, whether the guard currently
|
|
43
|
+
allows it, and the guard reason when it is denied. This is the field that tells
|
|
44
|
+
an AI why a preferred skill was skipped and an allowed fallback was selected.
|
|
45
|
+
|
|
46
|
+
When routing is safe but policy learning would reduce future ambiguity,
|
|
47
|
+
SkillBoard may return `post_use_policy_suggestion`. This includes cases where a
|
|
48
|
+
preferred skill is denied and an allowed fallback is selected, or where multiple
|
|
49
|
+
allowed workflow-bound skills match and one allowed skill is selected
|
|
50
|
+
deterministically. The AI should keep the task moving with the allowed routed
|
|
51
|
+
skill, then ask after completion whether to remember that skill as the preferred
|
|
52
|
+
workflow policy. The suggested policy command is informational until the user
|
|
53
|
+
confirms it.
|
|
54
|
+
|
|
55
|
+
Use `route` directly when an automation layer only needs the recommendation
|
|
56
|
+
payload:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
skillboard route "write tests before implementation" \
|
|
60
|
+
--workflow codex-night-workflow \
|
|
61
|
+
--config skillboard.config.yaml \
|
|
62
|
+
--skills skills \
|
|
63
|
+
--json
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Routing first matches declared workflow capabilities. If the workflow has skill
|
|
67
|
+
bindings but no matching capability, it can fall back to workflow-bound skill
|
|
68
|
+
metadata such as id, path, category, `SKILL.md` name, and `SKILL.md`
|
|
69
|
+
description.
|
|
70
|
+
|
|
71
|
+
Routing does not invoke the skill. The final boundary is still:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
skillboard guard use <skill-id> \
|
|
75
|
+
--workflow codex-night-workflow \
|
|
76
|
+
--config skillboard.config.yaml \
|
|
77
|
+
--skills skills
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
If no capability or workflow-bound skill matches, SkillBoard returns
|
|
81
|
+
`recommended_skill: null`. Ask a clarifying question before choosing a skill.
|
|
82
|
+
|
|
83
|
+
See [Value proof](value-proof.md) for an executable route example that selects
|
|
84
|
+
`matt.tdd`, returns `private.tdd-work-continuity` as fallback, and verifies the
|
|
85
|
+
guard and disclosure fields.
|