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
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# skillboard-mvp-review
|
|
2
|
+
|
|
3
|
+
- Skill: tdd-work-continuity
|
|
4
|
+
- Agent: hermes
|
|
5
|
+
- Created: 2026-06-25T08:00:25Z
|
|
6
|
+
- Updated: 2026-06-25T10:05:00Z
|
|
7
|
+
- Workdir: /home/nyxxir/skillboard
|
|
8
|
+
- Status: completed
|
|
9
|
+
|
|
10
|
+
## Goal
|
|
11
|
+
|
|
12
|
+
SkillBoard(`skill-control-plane`)의 MVP 기능과 낶부 도메인 설계를 검토하고, **처음 사용자가 skill을 가져다 붙이고 이용 및 삭제하는 불편을 해소하는 방향인지**, **도메인 설계가 적합하고 확장 가능한지**를 평가한다. 이전 대화에서 제안한 4.1~4.3 UX 개선 항목도 포함된 실행 계획을 문서화한다.
|
|
13
|
+
|
|
14
|
+
## Context
|
|
15
|
+
|
|
16
|
+
- Repo: `/home/nyxxir/skillboard`
|
|
17
|
+
- Relevant files:
|
|
18
|
+
- `src/cli.mjs` — CLI 라우터
|
|
19
|
+
- `src/control.mjs` — skill/workflow/harness/capability CRUD, `can-use`, `guard`, trust/source 분류
|
|
20
|
+
- `src/domain/rules/*.mjs` — 정책 규칙 엔진
|
|
21
|
+
- `src/workspace.mjs` — config 파싱, `SKILL.md` frontmatter 파싱
|
|
22
|
+
- `src/agent-inventory.mjs` — 설치된 agent skill 자동 스캔/병합
|
|
23
|
+
- `src/brief-cli.mjs`, `src/brief-renderer.mjs`, `src/advisor.mjs` — AI/사용자 브리핑
|
|
24
|
+
- `src/impact.mjs`, `src/reconcile.mjs` — 영향도/재조정 분석
|
|
25
|
+
- `src/init.mjs`, `src/uninstall.mjs` — 생명주기
|
|
26
|
+
- Constraints:
|
|
27
|
+
- MVP 단계, npm publish 전 (`version: 0.1.0`)
|
|
28
|
+
- Node.js >= 20, ESM, yaml 의존성 하나
|
|
29
|
+
- cross-platform CI (ubuntu/macOS/windows × node 20/22)
|
|
30
|
+
|
|
31
|
+
## Findings Summary
|
|
32
|
+
|
|
33
|
+
### 1. 도메인 설계: 적합하고 확장 가능함 (Score: 8/10)
|
|
34
|
+
|
|
35
|
+
**핵심 엔티티 5개**가 skill 생태계의 실제 관심사를 잘 반영한다.
|
|
36
|
+
|
|
37
|
+
| Entity | 역할 | 적합성 |
|
|
38
|
+
|--------|------|--------|
|
|
39
|
+
| `skills` | 선언된 스킬의 상태/호출방식/노출범위 | ✅ 적절. status/invocation/exposure 3중 분리로 정책 표현력 높음 |
|
|
40
|
+
| `capabilities` | 역할 기반 스킬 추상화 | ✅ 적절. canonical/alternatives/default_policy로 교체/대안 추천 가능 |
|
|
41
|
+
| `workflows` | 스킬이 활성화되는 맥락 | ✅ 적절. active_skills/blocked_skills/required_capabilities로 명시적 제어 |
|
|
42
|
+
| `harnesses` | runtime/command 제공자 추적 | ✅ 적절. harness 제거 시 workflow 영향도 파악 가능 |
|
|
43
|
+
| `install_units` | plugin/marketplace/harness 등의 부모 단위 | ✅ 매우 적절. skill 평탄화 문제 해결 |
|
|
44
|
+
|
|
45
|
+
**확장 가능성**
|
|
46
|
+
- `INSTALL_UNIT_KIND_VALUES`에 `skill`, `plugin`, `marketplace`, `harness`, `mcp-server`, `hook`, `agent`, `lsp`, `custom`을 두어 새로운 runtime primitive 추가가 용이함.
|
|
47
|
+
- `source_classes.mjs`의 우선순위/분류 함수가 데이터 기반으로 되어 있어 새 source class 추가가 쉬움.
|
|
48
|
+
- `source profile` 어댑터 모델이 하드코딩을 피하고 데이터 주도 import를 지향함.
|
|
49
|
+
|
|
50
|
+
**위험 요소**
|
|
51
|
+
- `src/control.mjs`가 1000줄에 달해 단일 책임 위반. `can-use`, CRUD, trust/source, YAML 쓰기, hook 설치 등이 한 파일에 있어 장기 유지보수 부담.
|
|
52
|
+
- `status` 값이 14개로 많고, `status`와 `invocation` 간의 유효 조합 규칙이 복잡(`SKILL-STATUS-001`). 새로운 상태 추가 시 규칙 행렬이 기하급수적으로 늘어날 수 있음.
|
|
53
|
+
- `capability`가 workflow-scoped `required_capabilities`와 global `capabilities`로 이중 정의됨. 의도는 명확하지만 사용자 입장에서 학습 곡선이 있음.
|
|
54
|
+
|
|
55
|
+
### 2. 사용자 불편 해소 vs 가중
|
|
56
|
+
|
|
57
|
+
#### 해소하는 설계
|
|
58
|
+
|
|
59
|
+
| 기능 | 불편 해소 메커니즘 |
|
|
60
|
+
|------|------------------|
|
|
61
|
+
| `init` 시 자동 스캔 + `active-manual` 연결 | 기존 수동 스킬을 따로 등록하지 않아도 `can-use`/`guard`로 계속 사용 가능 |
|
|
62
|
+
| `deny-by-default` + quarantine | 설치만으로 AI가 스킬을 부르는 것을 원천 차단 |
|
|
63
|
+
| `impact disable` | 스킬 제거 전 영향받는 workflow/capability를 사전에 노출 |
|
|
64
|
+
| 대부분의 mutating 명령에 `--dry-run` | 실수로 config를 망치는 위험 감소 |
|
|
65
|
+
| `brief --json` | 에이전트가 정책을 직접 해석하지 않고 control plane에 질의 |
|
|
66
|
+
| `uninstall`이 사용자 파일 보존 | 도구를 빼도 skill 파일과 사용자 config는 남음 |
|
|
67
|
+
|
|
68
|
+
#### 가중할 수 있는 설계
|
|
69
|
+
|
|
70
|
+
| 지점 | 불편 가능성 | 심각도 |
|
|
71
|
+
|------|------------|--------|
|
|
72
|
+
| 매번 `--config skillboard.config.yaml --skills skills` 필요 | 일상 명령이 번거로움 | 중간 |
|
|
73
|
+
| `SKILL.md` frontmatter 누락 시 메시지가 모호함 | 처음 사용자가 문서를 찾아야 함 | 높음 |
|
|
74
|
+
| `doctor` 출력이 길고 `--summary` 부재 | 매일 보기에 피로함 | 중간 |
|
|
75
|
+
| `add workflow` 시 `--harness`를 명시해야 함 | harness 개념을 모르는 사용자에게 진입 장벽 | 중간 |
|
|
76
|
+
| `status`/`invocation`/`exposure`/`trust_level` 용어가 많음 | 정책 도구이므로 불가피하지만, 온볭딩 문서가 중요 | 중간 |
|
|
77
|
+
| `init` 후 생성되는 config가 수십 개 스킬로 즉시 커짐 | 실제로 설치된 게 많으면 압도적 | 낮음~중간 |
|
|
78
|
+
|
|
79
|
+
**종합 판단**: 보안/통제를 얻는 대가로 적정 수준의 복잡성을 요구한다. 다만 **처음 사용자의 첫 5분**을 더 부드럽게 만들면 Adoption이 크게 올라갈 것이다.
|
|
80
|
+
|
|
81
|
+
### 3. MVP 기능 검증 결과
|
|
82
|
+
|
|
83
|
+
| 기능 | 상태 | 비고 |
|
|
84
|
+
|------|------|------|
|
|
85
|
+
| `init` | ✅ 정상 | bridge 파일, config, 디렉토리 생성, 자동 스캔 |
|
|
86
|
+
| `doctor`/`status` | ✅ 정상 | safe-mode, strict 모드, JSON 출력 |
|
|
87
|
+
| `brief` | ✅ 정상 | text/JSON, action cards, unknown workflow 처리 |
|
|
88
|
+
| `add skill/workflow/harness` | ✅ 정상 | dry-run, 자동 status 승격 |
|
|
89
|
+
| `activate`/`block`/`quarantine` | ✅ 정상 | workflow-scoped |
|
|
90
|
+
| `can-use`/`guard` | ✅ 정상 | 정책 위반 시 거부 |
|
|
91
|
+
| `impact disable` | ✅ 정상 | affected workflows/alternatives/risk |
|
|
92
|
+
| `remove skill` | ✅ 정상 | 참조 시 거부, `--force`로 정리 |
|
|
93
|
+
| `uninstall` | ✅ 정상 | 보수적 제거, dry-run |
|
|
94
|
+
| `inventory refresh`/`detect` | ✅ 정상 | runtime component 감지 |
|
|
95
|
+
| `sources refresh`/`audit` | ✅ 정상 | Git source digest pin |
|
|
96
|
+
| `import`/`merge` | ✅ 정상 | built-in profiles |
|
|
97
|
+
| `check` | ✅ 정상 | policy reference/rules |
|
|
98
|
+
| `dashboard` | ✅ 정상 | markdown 보고서 |
|
|
99
|
+
| `hook install` | ✅ 정상 | dry-run preview |
|
|
100
|
+
|
|
101
|
+
### 4. 핵심 코드 품질 관찰
|
|
102
|
+
|
|
103
|
+
- **정책 엔진**: `src/domain/rules/*.mjs`가 rule-id 기반으로 깔끔하게 분리되어 있어 새 규칙 추가가 쉬움.
|
|
104
|
+
- **workspace 로딩**: `workspace.mjs`가 config 파싱과 설치 skill discovery를 분리. `SKILL.md` frontmatter 강제는 정합성을 위해 필요하지만, 에러 메시지가 개선되어야 함.
|
|
105
|
+
- **control.mjs**: 거대 파일. CRUD, policy runtime, source classification, hook 설치 등을 분리하면 가독성과 테스트 용이성이 향상.
|
|
106
|
+
- **writeCheckedConfig**: 임시 파일에 쓰고 policy + usability 검증 후 rename하는 방식은 안전함. dry-run과 실제 적용의 경계도 명확.
|
|
107
|
+
- **agent-inventory**: detector 기반 스캔이 확장 가능. 다만 detector matching이 경로 suffix에 의존해 Windows/Linux 경로를 모두 고려한 점은 긍정적.
|
|
108
|
+
|
|
109
|
+
## Plan
|
|
110
|
+
|
|
111
|
+
### Phase 1: 첫 5분 UX 다듬기 (4.1)
|
|
112
|
+
|
|
113
|
+
- [x] `workspace.mjs`의 `parseSkillFrontmatter` 에러 메시지 개선
|
|
114
|
+
- "SKILL.md is missing YAML frontmatter" → 필요한 frontmatter 예시와 docs/user-flow.md 링크 포함
|
|
115
|
+
- 예상 영향: `src/workspace.mjs` 1함수, test 1~2개 추가
|
|
116
|
+
- [x] `add workflow`에서 `--harness` 누락 시 usage dump 대신 사용 가능한 harness 목록 제시
|
|
117
|
+
- 예상 영향: `src/cli.mjs` 또는 `src/control.mjs`의 `addWorkflow`
|
|
118
|
+
- [x] `doctor`에 `--summary` 플래그 추가 (또는 기본 출력에서 1줄 status + 핵심 warnings만)
|
|
119
|
+
- 예상 영향: `src/doctor.mjs`, `src/report.mjs` 수정
|
|
120
|
+
- [x] CLI 글로벌 defaults 파일/디렉토리 탐지: `--config`, `--skills` 미지정 시 현재 디렉토리의 `skillboard.config.yaml`과 `skills/`를 기본으로 사용하도록 개선
|
|
121
|
+
- 예상 영향: `src/cli.mjs` option parser, test 보강
|
|
122
|
+
|
|
123
|
+
### Phase 2: 생태계 연결 및 문서 (4.2)
|
|
124
|
+
|
|
125
|
+
- [x] `CONTRIBUTING.md` 작성: 개발 환경, 테스트 실행, source profile 추가 방법
|
|
126
|
+
- [x] built-in profile 추가 가이드 문서화 (`docs/adapters.md` 보강 또는 `docs/profiles.md` 신규)
|
|
127
|
+
- [x] README의 install 전/후 명령어 섹션 정리 (`skillboard` vs `node bin/skillboard.mjs` 구분 강조)
|
|
128
|
+
- [x] 본 프로젝트에 `AGENTS.md`/`CLAUDE.md` bridge 적용 검토 (dogfooding)
|
|
129
|
+
|
|
130
|
+
### Phase 3: 성능 및 구조 (4.3)
|
|
131
|
+
|
|
132
|
+
- [x] `npm test` 실행 시간 프로파일링
|
|
133
|
+
- 병목이 되는 CLI 통합 테스트 식별
|
|
134
|
+
- 가능하다면 독립적인 단위 테스트와 통합 테스트 분리 (`npm run test:unit`, `npm run test:integration`)
|
|
135
|
+
- [x] `src/control.mjs` 분리
|
|
136
|
+
- `skill-crud.mjs`, `workflow-crud.mjs`, `trust-source.mjs`, `can-use-guard.mjs`, `config-write.mjs` 등으로 쪼개기
|
|
137
|
+
- 예상 영향: 낶부 구조 개선, 기존 테스트 그대로 통과해야 함
|
|
138
|
+
- [x] `doctor`/`brief`의 중복 workspace 로딩 최소화 (cache 또는 단일 로드 경로)
|
|
139
|
+
|
|
140
|
+
### Phase 4: 도메인 정제 (선택, 높은 가치)
|
|
141
|
+
|
|
142
|
+
- [x] `status`/`invocation` 매트릭스 검토: 14×7 조합 중 실제로 사용되는 조합을 문서화하고, 불필요한 조합은 deprecate 또는 명시적 금지
|
|
143
|
+
- [x] `capability`의 global 정의와 workflow-scope `required_capabilities` 관계를 docs에 명확히 시각화
|
|
144
|
+
- [x] `install_unit`의 `trust_level`과 `permission_risk` 조합에 따른 자동 권고 정책을 advisor action cards로 노출
|
|
145
|
+
|
|
146
|
+
## TDD Notes
|
|
147
|
+
|
|
148
|
+
- Red: Add failing tests for newly invalid status/invocation combos, capability docs, trust/risk action cards.
|
|
149
|
+
- Green: Implement matrix, docs, and action card logic.
|
|
150
|
+
- Refactor: `control.mjs` split into `src/control/*.mjs` modules; public API preserved.
|
|
151
|
+
|
|
152
|
+
## Verification
|
|
153
|
+
|
|
154
|
+
- Commands to run:
|
|
155
|
+
- `npm run diagnostics`
|
|
156
|
+
- `npm run test:unit`
|
|
157
|
+
- `npm run test:integration`
|
|
158
|
+
- `npm run check`
|
|
159
|
+
- `node bin/skillboard.mjs brief --config skillboard.config.yaml --skills skills`
|
|
160
|
+
- `git diff --check`
|
|
161
|
+
- Results:
|
|
162
|
+
- TypeScript diagnostics: ✅
|
|
163
|
+
- `npm run test:unit`: 47 passed
|
|
164
|
+
- `npm run test:integration`: 103 passed
|
|
165
|
+
- `npm run check`: 161 passed
|
|
166
|
+
- CLI smoke test: ✅
|
|
167
|
+
- `git diff --check`: ✅
|
|
168
|
+
|
|
169
|
+
## Decisions
|
|
170
|
+
|
|
171
|
+
- **즉시 개선 권장**: 4.1 frontmatter 에러 메시지, `--config/--skills` 기본값, `doctor --summary`
|
|
172
|
+
- **중기 개선 권장**: `control.mjs` 분리, test suite 분리, `CONTRIBUTING.md`
|
|
173
|
+
- **도메인 설계는 유지**: 5개 엔티티 구조와 deny-by-default 정책은 변경하지 않음. 세부 상태/호출 매트릭스만 정제
|
|
174
|
+
- **변경사항은 unstaged로 보관**: 사용자가 직접 커밋 지시 전까지 git index에 추가하지 않음
|
|
175
|
+
|
|
176
|
+
## Resume State
|
|
177
|
+
|
|
178
|
+
- Done: Phase 1~4 모두 완료. 모든 테스트 통과. 문서/워크로그 정리 완료.
|
|
179
|
+
- In progress: 없음.
|
|
180
|
+
- Next command: 사용자가 커밋/푸시 지시 또는 추가 개선 항목 제시
|
|
181
|
+
- Open risks:
|
|
182
|
+
- `.skillboard/`와 `.omo/` 등 untracked artifact는 별도 정리 필요
|
|
183
|
+
- npm pack 시 포함 여부는 `test/package.test.mjs`에서 검증 완료
|
|
184
|
+
|
|
185
|
+
## Progress Log
|
|
186
|
+
|
|
187
|
+
- 2026-06-25T08:00:25Z: Plan created.
|
|
188
|
+
- 2026-06-25T08:45:00Z: Domain audit, friction analysis, and improvement plan written.
|
|
189
|
+
- 2026-06-25T10:05:00Z: Phase 1~4 implementation completed. All 161 tests passing.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Agent Handoff Plans
|
|
2
|
+
|
|
3
|
+
This directory contains durable plans that can be picked up by another agent
|
|
4
|
+
(such as Hermes) when the original author is not available.
|
|
5
|
+
|
|
6
|
+
## Conventions
|
|
7
|
+
|
|
8
|
+
- Each plan file is named `<timestamp>-<slug>.md`.
|
|
9
|
+
- The `Status:` field in the frontmatter controls the lifecycle:
|
|
10
|
+
- `pending` — waiting for an agent to pick it up
|
|
11
|
+
- `assigned` — an agent is currently working on it
|
|
12
|
+
- `consumed` — the agent has finished the planned work
|
|
13
|
+
- Agents should only pick up files with `Status: pending`.
|
|
14
|
+
- After picking up a plan, change the status to `assigned` and commit.
|
|
15
|
+
- After completing the work, change the status to `consumed` and commit.
|
|
16
|
+
|
|
17
|
+
## Current Plans
|
|
18
|
+
|
|
19
|
+
- `20260625-080025-skillboard-mvp-review.md` — SkillBoard MVP feature/domain
|
|
20
|
+
review and UX improvement plan (Status: completed)
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
# Policy Model
|
|
2
|
+
|
|
3
|
+
SkillBoard separates storage from invocation.
|
|
4
|
+
|
|
5
|
+
## Skill States
|
|
6
|
+
|
|
7
|
+
- `installed`: discovered on disk from `SKILL.md`.
|
|
8
|
+
- `declared`: present in `skillboard.config.yaml`.
|
|
9
|
+
- `discovered`: present in actual state but not yet classified.
|
|
10
|
+
- `quarantined`: visible to the control plane but not callable.
|
|
11
|
+
- `active`: allowed in at least one workflow.
|
|
12
|
+
- `active` with `invocation: manual-only`: active only for direct user invocation.
|
|
13
|
+
- `active-manual`: legacy spelling accepted for compatibility.
|
|
14
|
+
- `active-router`: active only through a policy-checked router.
|
|
15
|
+
- `active-auto`: active for workflow-scoped automatic invocation.
|
|
16
|
+
- `candidate`: proposed for one or more workflows, pending approval.
|
|
17
|
+
- `canonical`: the preferred implementation for a capability.
|
|
18
|
+
- `vendor`: kept from an upstream source, but not automatically trusted.
|
|
19
|
+
- `blocked`: never callable.
|
|
20
|
+
- `deprecated`: kept for historical compatibility.
|
|
21
|
+
- `archived`: retained outside normal workflows.
|
|
22
|
+
- `removed`: absent from actual state but retained in history or lock data.
|
|
23
|
+
|
|
24
|
+
## Skill Exposure
|
|
25
|
+
|
|
26
|
+
Skill exposure controls whether a skill belongs in central governance or should
|
|
27
|
+
stay inside a workflow or install-unit boundary.
|
|
28
|
+
|
|
29
|
+
- `exported`: shared or externally visible skill governed by SkillBoard.
|
|
30
|
+
- `global-meta`: intentionally global control skill such as a workflow router,
|
|
31
|
+
impact analyzer, skill registry, or verification gate.
|
|
32
|
+
- `unit-managed`: skill supplied by a parent plugin/harness install unit.
|
|
33
|
+
- `private`: workflow-internal implementation detail.
|
|
34
|
+
|
|
35
|
+
Only `global-meta` skills may use `global-auto`. This keeps a user's small set
|
|
36
|
+
of personal control skills globally available while plugin-provided skills remain
|
|
37
|
+
selected through workflows or install units.
|
|
38
|
+
|
|
39
|
+
Skills can also declare `owner_install_unit`. This points to the source that
|
|
40
|
+
introduced the skill, such as a private skill repository, GitHub marketplace,
|
|
41
|
+
package manager dependency, or harness installer. SkillBoard treats owner drift
|
|
42
|
+
as a policy error:
|
|
43
|
+
|
|
44
|
+
- `components.skills` entries must reference declared skills.
|
|
45
|
+
- A skill with `owner_install_unit` must be listed in that install unit's
|
|
46
|
+
`components.skills`.
|
|
47
|
+
- A component skill cannot claim a different owner than the install unit listing
|
|
48
|
+
it.
|
|
49
|
+
- `unit-managed` skills must declare `owner_install_unit`.
|
|
50
|
+
|
|
51
|
+
## Invocation Modes
|
|
52
|
+
|
|
53
|
+
- `manual-only`: direct user invocation only.
|
|
54
|
+
- `router-only`: selected by an approved routing skill or control layer.
|
|
55
|
+
- `workflow-auto`: eligible for model invocation only inside workflows that list
|
|
56
|
+
the skill.
|
|
57
|
+
- `global-auto`: eligible everywhere. This should be rare.
|
|
58
|
+
- `blocked`: not callable even when installed.
|
|
59
|
+
- `deprecated`: not callable for new workflows.
|
|
60
|
+
|
|
61
|
+
## Default Policy
|
|
62
|
+
|
|
63
|
+
SkillBoard assumes:
|
|
64
|
+
|
|
65
|
+
```yaml
|
|
66
|
+
defaults:
|
|
67
|
+
invocation_policy: deny-by-default
|
|
68
|
+
allow_model_invocation: false
|
|
69
|
+
require_explicit_workflow: true
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
That means installation alone never implies automatic use.
|
|
73
|
+
|
|
74
|
+
`require_explicit_workflow: true` means a `workflow-auto` skill must be scoped by
|
|
75
|
+
at least one workflow, either through `active_skills` or a workflow capability
|
|
76
|
+
requirement. `allow_model_invocation: false` is not a blanket ban on
|
|
77
|
+
workflow-scoped automation; it means automatic invocation must come from an
|
|
78
|
+
explicit policy decision rather than installation.
|
|
79
|
+
|
|
80
|
+
## AI-Mediated Availability
|
|
81
|
+
|
|
82
|
+
`skillboard brief --json` is the AI-facing availability contract. It lets an
|
|
83
|
+
agent answer "What your AI can use now" with grouped facts from the control
|
|
84
|
+
plane instead of trusting installed `SKILL.md` text or inventing policy from the
|
|
85
|
+
filesystem. Human brief text separates reviewable friction from hard blocks:
|
|
86
|
+
"Needs your decision" means the user can make a source/skill/workflow decision
|
|
87
|
+
once, while "Blocked for safety" means policy or provenance must change before
|
|
88
|
+
the item is usable. The brief may include action cards when requested, but an
|
|
89
|
+
action card is only a suggestion. It does not authorize invocation and it does
|
|
90
|
+
not make unreviewed external skills safe for automatic use.
|
|
91
|
+
|
|
92
|
+
Risk-bearing action cards require user confirmation before apply. Any apply
|
|
93
|
+
that mutates policy, trust, hooks, reset state, or skill references makes the
|
|
94
|
+
previous brief stale, so the agent should rerun `skillboard brief --json` before
|
|
95
|
+
answering another availability question or applying another action card. The
|
|
96
|
+
runtime boundary remains `skillboard guard use ...`, run immediately before the
|
|
97
|
+
actual skill invocation.
|
|
98
|
+
|
|
99
|
+
## Workflow Activation
|
|
100
|
+
|
|
101
|
+
Workflows own active skill pools:
|
|
102
|
+
|
|
103
|
+
```yaml
|
|
104
|
+
workflows:
|
|
105
|
+
codex-night-workflow:
|
|
106
|
+
harness: codex
|
|
107
|
+
active_skills:
|
|
108
|
+
- meerkat.requirement-intake
|
|
109
|
+
- matt.tdd
|
|
110
|
+
blocked_skills:
|
|
111
|
+
- matt.grill-me
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
The generated lockfile pins install-unit source/cache digests, skill content
|
|
115
|
+
digests, workflow bindings, and policy decisions.
|
|
116
|
+
|
|
117
|
+
## Capabilities
|
|
118
|
+
|
|
119
|
+
Workflows should depend on capabilities when possible, with skills acting as
|
|
120
|
+
implementations:
|
|
121
|
+
|
|
122
|
+
```yaml
|
|
123
|
+
capabilities:
|
|
124
|
+
requirement-clarification:
|
|
125
|
+
canonical: meerkat.requirement-intake
|
|
126
|
+
alternatives:
|
|
127
|
+
- matt.grill-me
|
|
128
|
+
- matt.grill-with-docs
|
|
129
|
+
default_policy: router-only
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
This lets SkillBoard suggest replacements when a skill is removed and group
|
|
133
|
+
overlapping skills by role instead of by name alone.
|
|
134
|
+
|
|
135
|
+
When the reconciler discovers a new non-user skill that already maps to a
|
|
136
|
+
capability, it uses `default_policy` as the recommended invocation mode. The
|
|
137
|
+
status remains `quarantined`, so the recommendation is visible but not
|
|
138
|
+
automatically callable.
|
|
139
|
+
|
|
140
|
+
## Harness Lifecycle
|
|
141
|
+
|
|
142
|
+
Harnesses have their own state because removing a harness can break command
|
|
143
|
+
flows even when the skills still exist:
|
|
144
|
+
|
|
145
|
+
```yaml
|
|
146
|
+
harnesses:
|
|
147
|
+
lazycodex:
|
|
148
|
+
status: fallback
|
|
149
|
+
workflows:
|
|
150
|
+
- large-refactor-workflow
|
|
151
|
+
commands:
|
|
152
|
+
- $ulw-plan
|
|
153
|
+
- $start-work
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
The reconciler treats missing configured harnesses as migration events and
|
|
157
|
+
newly detected harnesses as disabled until a workflow opts in.
|
|
158
|
+
|
|
159
|
+
## Install Units
|
|
160
|
+
|
|
161
|
+
SkillBoard models packaged agent runtime changes as install units. This keeps a
|
|
162
|
+
plugin bundle or opinionated harness installer from being flattened into a list
|
|
163
|
+
of unrelated skills.
|
|
164
|
+
|
|
165
|
+
Supported install unit kinds:
|
|
166
|
+
|
|
167
|
+
- `skill`
|
|
168
|
+
- `plugin`
|
|
169
|
+
- `marketplace`
|
|
170
|
+
- `package-manager-dependency`
|
|
171
|
+
- `harness`
|
|
172
|
+
- `mcp-server`
|
|
173
|
+
- `hook`
|
|
174
|
+
- `agent`
|
|
175
|
+
- `lsp`
|
|
176
|
+
|
|
177
|
+
Each unit can record:
|
|
178
|
+
|
|
179
|
+
- source command or package origin;
|
|
180
|
+
- install scope such as user-global, project, local, or admin;
|
|
181
|
+
- manifest and cache paths;
|
|
182
|
+
- provided components;
|
|
183
|
+
- modified config files;
|
|
184
|
+
- auto-update and enable/disable state;
|
|
185
|
+
- workflow dependencies;
|
|
186
|
+
- permission risk;
|
|
187
|
+
- rollback shape.
|
|
188
|
+
|
|
189
|
+
Example:
|
|
190
|
+
|
|
191
|
+
```yaml
|
|
192
|
+
install_units:
|
|
193
|
+
lazycodex.omo:
|
|
194
|
+
kind: harness
|
|
195
|
+
source: npx lazycodex-ai install
|
|
196
|
+
scope: user-global
|
|
197
|
+
manifest_path: ~/.codex/plugins/cache/sisyphuslabs/omo/plugin.json
|
|
198
|
+
cache_path: ~/.codex/plugins/cache/sisyphuslabs/omo
|
|
199
|
+
provided_components:
|
|
200
|
+
- skills
|
|
201
|
+
- commands
|
|
202
|
+
- mcp-server
|
|
203
|
+
- hook
|
|
204
|
+
components:
|
|
205
|
+
skills:
|
|
206
|
+
- lazycodex.ulw-plan
|
|
207
|
+
commands:
|
|
208
|
+
- $ulw-plan
|
|
209
|
+
- $start-work
|
|
210
|
+
hooks:
|
|
211
|
+
- post-tool-use
|
|
212
|
+
mcp_servers:
|
|
213
|
+
- omo-docs
|
|
214
|
+
modified_config_files:
|
|
215
|
+
- ~/.codex/config.toml
|
|
216
|
+
- ~/.local/bin
|
|
217
|
+
auto_update: false
|
|
218
|
+
enabled: true
|
|
219
|
+
workflow_dependencies:
|
|
220
|
+
- large-refactor-workflow
|
|
221
|
+
permission_risk: high
|
|
222
|
+
rollback: manual
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
The `examples/multi-source.config.yaml` fixture models a private skill source
|
|
226
|
+
plus `mattpocock/skills`, `code-yeongyu/oh-my-openagent`,
|
|
227
|
+
`anthropics/skills`, `wshobson/agents`, and
|
|
228
|
+
`VoltAgent/awesome-agent-skills` in one workspace. It is intentionally a
|
|
229
|
+
reproducible policy fixture, not a network installer.
|
|
230
|
+
|
|
231
|
+
## Reconciliation
|
|
232
|
+
|
|
233
|
+
SkillBoard compares desired state with actual state:
|
|
234
|
+
|
|
235
|
+
- Desired state: config, workflows, capabilities, harnesses, and policy.
|
|
236
|
+
- Actual state: discovered `SKILL.md` files and detected harnesses.
|
|
237
|
+
- Reconcile plan: automatic safe actions plus decisions requiring approval.
|
|
238
|
+
|
|
239
|
+
Safe automatic defaults:
|
|
240
|
+
|
|
241
|
+
- Trusted user-local skills become `status: active` with
|
|
242
|
+
`invocation: manual-only` only when SkillBoard has no existing workflow
|
|
243
|
+
metadata and can create a local manual workflow.
|
|
244
|
+
- Trusted user-local skills discovered after workflows exist become
|
|
245
|
+
`candidate` / `manual-only` with a review note instead of being attached to an
|
|
246
|
+
arbitrary workflow.
|
|
247
|
+
- Runtime-supplied, external, system, or unreviewed skills are quarantined from
|
|
248
|
+
automatic use and surfaced as decisions when a safe review path exists.
|
|
249
|
+
- New harnesses detected by reconciliation are disabled until workflows opt in.
|
|
250
|
+
- Removed skills and harnesses produce impact reports before config changes.
|
|
251
|
+
- Capability matches are surfaced as recommendations, not auto-activation.
|
|
@@ -0,0 +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.
|