feat: разворачивание комка plugin-dev — 7 навыков (роутер-реестр)
Эпик роутер-реестр, спека v2 §2, этап 1. Зонтик plugin-dev развёрнут в 7 карточек-навыков + 7 под-узлов #57a..#57g. - 7 карточек plugin-dev__<навык>.contract.json (agent/command/hook/mcp/ plugin-structure/plugin-settings/skill-development) - nodes.yaml: узел #57 → #57a..#57g; keyword-триггеры на plugin-structure; ссылка L11 обновлена на plugin-dev:plugin-structure - зонтик plugin-dev убран (карточка + узел) - registry-load.test: 109 узлов / 101 active Регрессия (без 5 pre-existing node:test файлов): 4361 passed, exit 0. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,12 +0,0 @@
|
|||||||
{
|
|
||||||
"skill": "plugin-dev",
|
|
||||||
"kind": "external",
|
|
||||||
"needs": ["намерение разработать marketplace Claude-плагин"],
|
|
||||||
"produces": ["scaffold плагина (plugin.json, MCP, хуки, доки, публикация)"],
|
|
||||||
"constraints": ["8 sub-skills + 3 агента", "НЕ standalone-скилы (skill-creator)"],
|
|
||||||
"preview-form": "outline",
|
|
||||||
"defaults": ["plugin.json + структура компонентов"],
|
|
||||||
"key-decisions": ["состав компонентов плагина"],
|
|
||||||
"acceptance-criteria": ["плагин валиден и публикуем"],
|
|
||||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"skill": "plugin-dev:agent-development",
|
||||||
|
"kind": "external",
|
||||||
|
"needs": [
|
||||||
|
"намерение создать субагента плагина"
|
||||||
|
],
|
||||||
|
"produces": [
|
||||||
|
"субагент: frontmatter + when-to-use + системный промпт"
|
||||||
|
],
|
||||||
|
"constraints": [
|
||||||
|
"под-навык зонтика plugin-dev (разработка Claude-плагинов)",
|
||||||
|
"компоненты плагина, НЕ standalone-навыки (skill-creator)"
|
||||||
|
],
|
||||||
|
"preview-form": "outline",
|
||||||
|
"defaults": [
|
||||||
|
"структура агента и условия срабатывания"
|
||||||
|
],
|
||||||
|
"key-decisions": [
|
||||||
|
"scope и триггеры агента"
|
||||||
|
],
|
||||||
|
"acceptance-criteria": [
|
||||||
|
"агент оформлен по best-practices"
|
||||||
|
],
|
||||||
|
"source": {
|
||||||
|
"version": "n/a",
|
||||||
|
"hash": "0000000000000000000000000000000000000000000000000000000000000000",
|
||||||
|
"path": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"skill": "plugin-dev:command-development",
|
||||||
|
"kind": "external",
|
||||||
|
"needs": [
|
||||||
|
"намерение создать слэш-команду плагина"
|
||||||
|
],
|
||||||
|
"produces": [
|
||||||
|
"слэш-команда: YAML-frontmatter + аргументы + bash"
|
||||||
|
],
|
||||||
|
"constraints": [
|
||||||
|
"под-навык зонтика plugin-dev (разработка Claude-плагинов)",
|
||||||
|
"компоненты плагина, НЕ standalone-навыки (skill-creator)"
|
||||||
|
],
|
||||||
|
"preview-form": "outline",
|
||||||
|
"defaults": [
|
||||||
|
"frontmatter и динамические аргументы"
|
||||||
|
],
|
||||||
|
"key-decisions": [
|
||||||
|
"аргументы и интерактивность команды"
|
||||||
|
],
|
||||||
|
"acceptance-criteria": [
|
||||||
|
"команда работает с аргументами"
|
||||||
|
],
|
||||||
|
"source": {
|
||||||
|
"version": "n/a",
|
||||||
|
"hash": "0000000000000000000000000000000000000000000000000000000000000000",
|
||||||
|
"path": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"skill": "plugin-dev:hook-development",
|
||||||
|
"kind": "external",
|
||||||
|
"needs": [
|
||||||
|
"намерение создать хук плагина (PreToolUse/PostToolUse/...)"
|
||||||
|
],
|
||||||
|
"produces": [
|
||||||
|
"хук: событие + matcher + скрипт ${CLAUDE_PLUGIN_ROOT}"
|
||||||
|
],
|
||||||
|
"constraints": [
|
||||||
|
"под-навык зонтика plugin-dev (разработка Claude-плагинов)",
|
||||||
|
"компоненты плагина, НЕ standalone-навыки (skill-creator)"
|
||||||
|
],
|
||||||
|
"preview-form": "outline",
|
||||||
|
"defaults": [
|
||||||
|
"событие хука и matcher"
|
||||||
|
],
|
||||||
|
"key-decisions": [
|
||||||
|
"какое событие перехватывать"
|
||||||
|
],
|
||||||
|
"acceptance-criteria": [
|
||||||
|
"хук срабатывает и не ломает поток"
|
||||||
|
],
|
||||||
|
"source": {
|
||||||
|
"version": "n/a",
|
||||||
|
"hash": "0000000000000000000000000000000000000000000000000000000000000000",
|
||||||
|
"path": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"skill": "plugin-dev:mcp-integration",
|
||||||
|
"kind": "external",
|
||||||
|
"needs": [
|
||||||
|
"намерение подключить MCP-сервер в плагин"
|
||||||
|
],
|
||||||
|
"produces": [
|
||||||
|
".mcp.json: stdio/SSE/HTTP-сервер в плагине"
|
||||||
|
],
|
||||||
|
"constraints": [
|
||||||
|
"под-навык зонтика plugin-dev (разработка Claude-плагинов)",
|
||||||
|
"компоненты плагина, НЕ standalone-навыки (skill-creator)"
|
||||||
|
],
|
||||||
|
"preview-form": "outline",
|
||||||
|
"defaults": [
|
||||||
|
"тип MCP-сервера и конфиг"
|
||||||
|
],
|
||||||
|
"key-decisions": [
|
||||||
|
"тип транспорта MCP"
|
||||||
|
],
|
||||||
|
"acceptance-criteria": [
|
||||||
|
"MCP-сервер подключён через плагин"
|
||||||
|
],
|
||||||
|
"source": {
|
||||||
|
"version": "n/a",
|
||||||
|
"hash": "0000000000000000000000000000000000000000000000000000000000000000",
|
||||||
|
"path": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"skill": "plugin-dev:plugin-settings",
|
||||||
|
"kind": "external",
|
||||||
|
"needs": [
|
||||||
|
"намерение сделать поведение плагина настраиваемым"
|
||||||
|
],
|
||||||
|
"produces": [
|
||||||
|
".local.md настройки плагина (YAML-frontmatter + состояние)"
|
||||||
|
],
|
||||||
|
"constraints": [
|
||||||
|
"под-навык зонтика plugin-dev (разработка Claude-плагинов)",
|
||||||
|
"компоненты плагина, НЕ standalone-навыки (skill-creator)"
|
||||||
|
],
|
||||||
|
"preview-form": "outline",
|
||||||
|
"defaults": [
|
||||||
|
"per-project конфиг плагина"
|
||||||
|
],
|
||||||
|
"key-decisions": [
|
||||||
|
"какие настройки выносить"
|
||||||
|
],
|
||||||
|
"acceptance-criteria": [
|
||||||
|
"настройки читаются плагином"
|
||||||
|
],
|
||||||
|
"source": {
|
||||||
|
"version": "n/a",
|
||||||
|
"hash": "0000000000000000000000000000000000000000000000000000000000000000",
|
||||||
|
"path": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"skill": "plugin-dev:plugin-structure",
|
||||||
|
"kind": "external",
|
||||||
|
"needs": [
|
||||||
|
"намерение создать или организовать плагин"
|
||||||
|
],
|
||||||
|
"produces": [
|
||||||
|
"структура плагина: plugin.json + раскладка компонентов"
|
||||||
|
],
|
||||||
|
"constraints": [
|
||||||
|
"под-навык зонтика plugin-dev (разработка Claude-плагинов)",
|
||||||
|
"компоненты плагина, НЕ standalone-навыки (skill-creator)"
|
||||||
|
],
|
||||||
|
"preview-form": "outline",
|
||||||
|
"defaults": [
|
||||||
|
"раскладка каталогов и манифест"
|
||||||
|
],
|
||||||
|
"key-decisions": [
|
||||||
|
"организация компонентов плагина"
|
||||||
|
],
|
||||||
|
"acceptance-criteria": [
|
||||||
|
"структура плагина валидна"
|
||||||
|
],
|
||||||
|
"source": {
|
||||||
|
"version": "n/a",
|
||||||
|
"hash": "0000000000000000000000000000000000000000000000000000000000000000",
|
||||||
|
"path": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"skill": "plugin-dev:skill-development",
|
||||||
|
"kind": "external",
|
||||||
|
"needs": [
|
||||||
|
"намерение создать навык внутри плагина"
|
||||||
|
],
|
||||||
|
"produces": [
|
||||||
|
"навык плагина: SKILL.md + прогрессивное раскрытие"
|
||||||
|
],
|
||||||
|
"constraints": [
|
||||||
|
"под-навык зонтика plugin-dev (разработка Claude-плагинов)",
|
||||||
|
"компоненты плагина, НЕ standalone-навыки (skill-creator)"
|
||||||
|
],
|
||||||
|
"preview-form": "outline",
|
||||||
|
"defaults": [
|
||||||
|
"структура навыка и прогрессивное раскрытие"
|
||||||
|
],
|
||||||
|
"key-decisions": [
|
||||||
|
"scope и описание навыка"
|
||||||
|
],
|
||||||
|
"acceptance-criteria": [
|
||||||
|
"навык оформлен и триггерится"
|
||||||
|
],
|
||||||
|
"source": {
|
||||||
|
"version": "n/a",
|
||||||
|
"hash": "0000000000000000000000000000000000000000000000000000000000000000",
|
||||||
|
"path": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1245,14 +1245,70 @@ nodes:
|
|||||||
attributes:
|
attributes:
|
||||||
tooling_section: "§4.31 #56"
|
tooling_section: "§4.31 #56"
|
||||||
|
|
||||||
- id: "#57"
|
- id: "#57a"
|
||||||
name: "plugin-dev"
|
name: "agent-development"
|
||||||
slug: "plugin-dev"
|
slug: "plugin-dev:agent-development"
|
||||||
category: "off-phase"
|
category: "off-phase"
|
||||||
subcategory: "authoring-tooling"
|
subcategory: "authoring-tooling"
|
||||||
status: "active"
|
status: "active"
|
||||||
dormancy_reason: null
|
dormancy_reason: null
|
||||||
capabilities: "Плагин для разработки marketplace Claude-плагинов: 8 sub-skills (plugin.json, MCP-интеграция, хуки, документация, публикация) + 3 специализированных агента."
|
capabilities: "Субагент плагина: frontmatter + when-to-use + системный промпт."
|
||||||
|
triggers: []
|
||||||
|
boundaries: []
|
||||||
|
chain_membership: []
|
||||||
|
attributes:
|
||||||
|
tooling_section: "§4.32 #57"
|
||||||
|
|
||||||
|
- id: "#57b"
|
||||||
|
name: "command-development"
|
||||||
|
slug: "plugin-dev:command-development"
|
||||||
|
category: "off-phase"
|
||||||
|
subcategory: "authoring-tooling"
|
||||||
|
status: "active"
|
||||||
|
dormancy_reason: null
|
||||||
|
capabilities: "Слэш-команда плагина: YAML-frontmatter + аргументы + bash."
|
||||||
|
triggers: []
|
||||||
|
boundaries: []
|
||||||
|
chain_membership: []
|
||||||
|
attributes:
|
||||||
|
tooling_section: "§4.32 #57"
|
||||||
|
|
||||||
|
- id: "#57c"
|
||||||
|
name: "hook-development"
|
||||||
|
slug: "plugin-dev:hook-development"
|
||||||
|
category: "off-phase"
|
||||||
|
subcategory: "authoring-tooling"
|
||||||
|
status: "active"
|
||||||
|
dormancy_reason: null
|
||||||
|
capabilities: "Хук плагина: событие (PreToolUse/PostToolUse/...) + matcher + скрипт ${CLAUDE_PLUGIN_ROOT}."
|
||||||
|
triggers: []
|
||||||
|
boundaries: []
|
||||||
|
chain_membership: []
|
||||||
|
attributes:
|
||||||
|
tooling_section: "§4.32 #57"
|
||||||
|
|
||||||
|
- id: "#57d"
|
||||||
|
name: "mcp-integration"
|
||||||
|
slug: "plugin-dev:mcp-integration"
|
||||||
|
category: "off-phase"
|
||||||
|
subcategory: "authoring-tooling"
|
||||||
|
status: "active"
|
||||||
|
dormancy_reason: null
|
||||||
|
capabilities: "MCP-сервер в плагине: .mcp.json (stdio/SSE/HTTP)."
|
||||||
|
triggers: []
|
||||||
|
boundaries: []
|
||||||
|
chain_membership: []
|
||||||
|
attributes:
|
||||||
|
tooling_section: "§4.32 #57"
|
||||||
|
|
||||||
|
- id: "#57e"
|
||||||
|
name: "plugin-structure"
|
||||||
|
slug: "plugin-dev:plugin-structure"
|
||||||
|
category: "off-phase"
|
||||||
|
subcategory: "authoring-tooling"
|
||||||
|
status: "active"
|
||||||
|
dormancy_reason: null
|
||||||
|
capabilities: "Структура плагина: plugin.json + раскладка компонентов. Входная точка разработки Claude-плагина."
|
||||||
triggers:
|
triggers:
|
||||||
- {keyword: "разработка claude-плагинов", weight: 1.0}
|
- {keyword: "разработка claude-плагинов", weight: 1.0}
|
||||||
- {keyword: "плагин claude code", weight: 1.0}
|
- {keyword: "плагин claude code", weight: 1.0}
|
||||||
@@ -1264,6 +1320,34 @@ nodes:
|
|||||||
attributes:
|
attributes:
|
||||||
tooling_section: "§4.32 #57"
|
tooling_section: "§4.32 #57"
|
||||||
|
|
||||||
|
- id: "#57f"
|
||||||
|
name: "plugin-settings"
|
||||||
|
slug: "plugin-dev:plugin-settings"
|
||||||
|
category: "off-phase"
|
||||||
|
subcategory: "authoring-tooling"
|
||||||
|
status: "active"
|
||||||
|
dormancy_reason: null
|
||||||
|
capabilities: "Настройки плагина: .local.md (YAML-frontmatter + состояние), per-project конфиг."
|
||||||
|
triggers: []
|
||||||
|
boundaries: []
|
||||||
|
chain_membership: []
|
||||||
|
attributes:
|
||||||
|
tooling_section: "§4.32 #57"
|
||||||
|
|
||||||
|
- id: "#57g"
|
||||||
|
name: "skill-development"
|
||||||
|
slug: "plugin-dev:skill-development"
|
||||||
|
category: "off-phase"
|
||||||
|
subcategory: "authoring-tooling"
|
||||||
|
status: "active"
|
||||||
|
dormancy_reason: null
|
||||||
|
capabilities: "Навык плагина: SKILL.md + прогрессивное раскрытие."
|
||||||
|
triggers: []
|
||||||
|
boundaries: []
|
||||||
|
chain_membership: []
|
||||||
|
attributes:
|
||||||
|
tooling_section: "§4.32 #57"
|
||||||
|
|
||||||
- id: "#58"
|
- id: "#58"
|
||||||
name: "hookify"
|
name: "hookify"
|
||||||
slug: "hookify"
|
slug: "hookify"
|
||||||
@@ -2083,7 +2167,7 @@ chains:
|
|||||||
sequence:
|
sequence:
|
||||||
- "#56"
|
- "#56"
|
||||||
- "#58"
|
- "#58"
|
||||||
- "#57"
|
- "plugin-dev:plugin-structure"
|
||||||
|
|
||||||
L12:
|
L12:
|
||||||
name: "CLAUDE.md capture chain"
|
name: "CLAUDE.md capture chain"
|
||||||
|
|||||||
@@ -111,8 +111,8 @@
|
|||||||
| Комок | Статус | Коммит |
|
| Комок | Статус | Коммит |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| claude-md-management (2) | ✅ DONE | e98ba1e (pushed) |
|
| claude-md-management (2) | ✅ DONE | e98ba1e (pushed) |
|
||||||
| superpowers (14) | ✅ DONE (не закоммичено) | — |
|
| superpowers (14) | ✅ DONE | 5a7c5c2 (pushed) |
|
||||||
| plugin-dev (7) | ⬜ | |
|
| plugin-dev (7) | ✅ DONE | этот коммит |
|
||||||
| adr-kit (2: adr, judge) | ⬜ | |
|
| adr-kit (2: adr, judge) | ⬜ | |
|
||||||
| hookify (1–2) | ⬜ | |
|
| hookify (1–2) | ⬜ | |
|
||||||
| product-management (8) | ⬜ | |
|
| product-management (8) | ⬜ | |
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ import { loadRegistry, clearCache, findByClassification, findByKeyword, findActi
|
|||||||
describe('registry-load', () => {
|
describe('registry-load', () => {
|
||||||
beforeEach(() => clearCache());
|
beforeEach(() => clearCache());
|
||||||
|
|
||||||
it('loads registry (103 nodes: 90 + разворачивание #19 superpowers в 14 под-узлов 18.06.2026)', () => {
|
it('loads registry (109 nodes: разворачивание #33/#19/#57 комков 18.06.2026)', () => {
|
||||||
const r = loadRegistry();
|
const r = loadRegistry();
|
||||||
expect(r.nodes).toHaveLength(103);
|
expect(r.nodes).toHaveLength(109);
|
||||||
expect(r.version).toBe('0.1.0');
|
expect(r.version).toBe('0.1.0');
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -46,9 +46,9 @@ describe('registry-load', () => {
|
|||||||
it('findActiveNodes excludes non-active (nodes.yaml registry)', () => {
|
it('findActiveNodes excludes non-active (nodes.yaml registry)', () => {
|
||||||
const r = loadRegistry();
|
const r = loadRegistry();
|
||||||
const active = findActiveNodes(r);
|
const active = findActiveNodes(r);
|
||||||
// 103 nodes total; #1 historic, #17 dormant, #44/#50/#54/#67/#82/#83 deferred;
|
// 109 nodes total; #1 historic, #17 dormant, #44/#50/#54/#67/#82/#83 deferred;
|
||||||
// #33→#33a/#33b (+1 active) и #19→#19a..#19n (14 active вместо 1, +13) → 82 + 13 = 95 active
|
// развёрнуты комки: #33→2, #19→14, #57 plugin-dev→7 (active +1+13+6) → 82+13+6 = 101 active
|
||||||
expect(active).toHaveLength(95);
|
expect(active).toHaveLength(101);
|
||||||
expect(active.map(n => n.id)).toContain('#18');
|
expect(active.map(n => n.id)).toContain('#18');
|
||||||
expect(active.map(n => n.id)).toContain('#19a');
|
expect(active.map(n => n.id)).toContain('#19a');
|
||||||
expect(active.map(n => n.id)).not.toContain('#1');
|
expect(active.map(n => n.id)).not.toContain('#1');
|
||||||
|
|||||||
Reference in New Issue
Block a user