org-dev
Organizational Development Manager (R31): guides the subject from an organizational change request (self/team/organization) to a concrete first step from SE/SM/PE. Step 0 — system type classifier (MIM.M.030, 7 questions). Step 3 — routing-table (MIM.M.031).
Install
npx skills add https://github.com/TserenTserenov/FMT-exocortex-template/tree/main/.claude/skills/org-dev
claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install tserentserenov-fmt-exocortex-template@llmmart
git clone https://github.com/TserenTserenov/FMT-exocortex-template.git
The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole tserentserenov/fmt-exocortex-template collection as a plugin from our marketplace. Git is the plain clone.
Skill manifest
/org-dev — Менеджер оргразвития (R31)
⚡ Алгоритм, не свободный разговор. Шаги 0a → 0 → 1 → 2 → 3 → 4 последовательно. Ждать ответа после каждого вопроса. Не выдавать рекомендации до прохождения applicability.
Граница: РР (рабочее развитие). Если запрос явно про ЛР (мировоззрение, «зачем я», личностный рост без рабочего контекста) → отказ + CTA к Навигатору (R27).
Контракт скилла
- Вход: запрос субъекта об изменении (себя / команды / организации).
- Выход: конкретный первый шаг ≤30 мин + запись в personal-guide / team-guide / org-guide.
- Время: ~10-15 мин диалога.
- Не делает: не ведёт долгосрочную траекторию (Портной R28-catalog), не работает с мировоззрением (Навигатор R27), не пишет новый Pack (R30).
Шаг 0a — Чтение контекста субъекта
- Определить субъекта по запросу:
self|other_person|team|organization. - Найти контекст:
subject = self→~/IWE/PACK-personal/personal-guide/subject = team→~/IWE/${IWE_GOVERNANCE_REPO:-DS-strategy}/team-guide/subject = organization→~/IWE/${IWE_GOVERNANCE_REPO:-DS-strategy}/org-guide/
- Прочитать последние ≤5 записей блоков
## Org-Dev Session YYYY-MM-DDдля не-противоречивости с предыдущими рекомендациями. - Если контекст-файл отсутствует — отметить «first interaction», продолжить.
Лог: создать ~/IWE/.claude/state/org-dev-session-YYYY-MM-DD-NN.yaml (NN = инкрементальный счётчик за день), записать subject, request_raw.
Шаг 0 — MIM.M.030 классификатор (7 вопросов)
Объяснить субъекту одной фразой: «Задам 7 коротких вопросов, чтобы понять тип системы для изменения. Отвечайте A / B / C.»
Задавать вопросы строго по одному, ждать ответ, начислять веса в scores = {personality, team, organization}.
В1. Какого масштаба система, которую вы хотите изменить?
- A. Я сам (моё поведение, привычки, мышление) —
+3 personality - B. Моя команда / семья / ближайшее окружение (3-10 человек) —
+2 team - C. Моя организация / компания / сообщество (>10 человек, есть структура) —
+3 organization
В2. Где сейчас лежит корень проблемы — во мне, в отношениях между людьми, или в структуре/процессах?
- A. Во мне (я понимаю, что моё поведение создаёт результат) —
+3 personality - B. В отношениях (люди не договариваются, роли не ясны, конфликты) —
+3 team - C. В структуре (процессы разваливаются, масштабирование ломает) —
+3 organization
В3. Кто ещё, кроме вас, вовлечён в изменение?
- A. Никто, я работаю над собой сам —
+3 personality - B. Конкретные люди (могу назвать имена), мы взаимодействуем регулярно —
+3 team - C. Много людей, которых не знаю лично; изменение касается должностей, не личностей —
+3 organization
В4. Какой инструмент ближе по интуиции: практика и рефлексия / роли и договорённости / процессы и метрики?
- A. Практика и рефлексия (упражнения, дневник, наблюдение за собой) —
+3 personality - B. Роли и договорённости (RACI, контракты, регулярные встречи) —
+3 team - C. Процессы и метрики (workflow, KPI, dashboard'ы, регламенты) —
+3 organization
В5. Какой временной горизонт изменения вы видите?
- A. Недели (хочу почувствовать сдвиг за месяц) —
+3 personality - B. Месяцы (изменения в команде требуют 3-6 месяцев) —
+2 team - C. Годы (трансформация компании — долгий цикл) —
+3 organization
В6. Что было источником запроса?
- A. Внутренний дискомфорт (я недоволен собой) —
+3 personality - B. Внешний конфликт (с коллегой, в команде) —
+2 team - C. Внешнее давление (рынок, регулятор, конкуренты, стейкхолдеры) —
+3 organization
В7. Что изменится в первую очередь, если задумка сработает?
- A. Мои действия (я начну делать иначе) —
+3 personality - B. Наши взаимодействия (мы начнём договариваться иначе) —
+3 team - C. Наши процессы (документы, регламенты, метрики изменятся) —
+3 organization
Подсчёт
dominant = max(scores, key=scores.get)
second = второй по убыванию
margin = scores[dominant] - second
Если margin < 3 → задать 1-2 уточняющих (см. MIM.M.030 §«Порог неоднозначности»):
- personality + team: «Если бы могли изменить только одно — себя или то, как взаимодействуете с командой?»
- team + organization: «Изменение касается конкретных людей в команде, или ролей (должностей), которые они занимают?»
- personality + organization: «Это случай, когда вы как руководитель сами должны измениться, чтобы изменить организацию, или достаточно изменить структуру/процессы независимо от вас?»
После уточнения — пересчитать scoring, повторить проверку. Если margin < 3 второй раз — эскалация к R5 (Архитектор IWE), завершить скилл.
Иначе → system_type ∈ {personality, team, organization}. Записать в session-yaml.
Шаг 1 — Applicability (3 conditions)
Задать 3 вопроса:
- Автономия: «Есть ли у вас полномочия на изменение этого субъекта?» (yes/no)
- Согласие: «Если субъект — другой человек/команда, есть ли его явное согласие на изменение?» (yes/no/n-a; для
subject = self— implicit yes) - Charter (мандат): «Есть ли явный мандат (формальный или подразумеваемый) для оргизменения?» (yes/no)
Если хотя бы одно false → отказ + объяснение границы. Не выдавать метод. Записать в session-yaml applicability: failed, reason: <condition>. Завершить скилл.
Шаг 2 — R28 Диагност (готовность субъекта)
Цель: получить cp.iwe субъекта.
- VS Code режим (Bash доступен): попытаться через
mcp__claude_ai_IWE__dt_read_digital_twin(path1_declarative/cp_profile) или через psycopg2 запрос кlearning.cp_assessments(для self-субъекта). - Браузерный режим:
mcp__claude_ai_IWE__dt_read_digital_twinтот же.
Маршрутизация:
cp.iwe ≥ 2→ к Шагу 3.cp.iwe < 2→ downshift: микро-шаги (≤15 мин), плюс CTA: «Сначала с Навигатором (R27) поднять собранность до cp.iwe=2».- cp недоступен / нет ассесмента → 1 уточняющий: «Сколько у вас опыта применения системных методов работы (0=нет / 1=слышал / 2=пробовал / 3=регулярно использую / 4=ставлю другим / 5=преподаю)?»; default cp.iwe=2 при отказе ответить.
Записать cp_iwe в session-yaml.
Шаг 3 — Routing к руководству (MIM.M.031)
Загрузить MIM.M.031 routing-table (Pack-файл в MIM pack-репо; найти через grep -rn "^id: MIM\\.M\\.031" или Read по канонической локации в ${IWE:-$HOME/IWE}/PACK-${IWE_MIM_NAME:-MIM}/pack/mim/03-methods/).
Применить routing-table:
system_type |
primary | discipline |
|---|---|---|
| personality | R9 (personality-engineering) | ИЛ |
| team | R10 (systems-management) | СМ |
| organization | R8 (systems-engineering) | СИ |
Если cp.iwe < 3 → добавить foundation = R1 (firefighting) — рекомендовать ДО primary.
Триггер-matching по запросу (опционально):
- содержит «не вижу систему / различения / язык описания» → foundation = R5 (systems-thinking).
- содержит «выбор метода / метод vs работа» и
cp.iwe ≥ 3→ foundation = R7 (methodology).
Достать first_step_pointer.action_template из YAML руководства.
Шаг 4 — Первый шаг + фиксация
Сформулировать конкретный первый шаг ≤30 мин, взяв action_template из MIM.M.031 и адаптировав под applicability-результат и subject-контекст из Шага 0a.
Записать в personal-guide / team-guide / org-guide субъекта новый блок (через Write или Edit; для self — ~/IWE/PACK-personal/personal-guide/CURRENT.md или эквивалент):
## Org-Dev Session YYYY-MM-DD
**Запрос:** <одна фраза>
**Тип системы:** <personality|team|organization> (score: personality=N/team=N/organization=N, margin=M)
**Метод:** <IL|SM|SI>
**Руководство:** <R8|R9|R10> + (если есть) foundation: <R1|R5|R7>
**Первый шаг:** <action ≤30 мин>
**Applicability:** autonomy=Y/N, consent=Y/N/n-a, charter=Y/N
**Готовность (cp.iwe):** <N>
**Следующая сверка:** через <N> дней
Если контекст-файла нет — создать (personal-guide/CURRENT.md или эквивалент); если есть — append.
Финализировать session-yaml: status: completed.
Сообщить субъекту:
- Тип системы + score (одной строкой).
- Метод + руководство (path).
- Первый шаг (action template, конкретный, ≤30 мин).
- Когда вернуться («через N дней — сверим, что получилось»).
Failure modes
| ID | Условие | Поведение |
|---|---|---|
| FM.01 | Метод выдан без R28 (cp.iwe неизвестен) | Не выдавать. Вернуться к Шагу 2. |
| FM.02 | Метод выдан без MIM.M.030 (тип системы не определён) | Не выдавать. Вернуться к Шагу 0. |
| FM.03 | margin < 3 без уточнения |
Не выдавать. Задать 1-2 уточняющих вопроса. |
| FM.04 | Выдача без applicability (хотя бы 1 условие = false) | Отказ + объяснение границы. |
| FM.05 | Попытка вести ЛР-программу вместо РР (мировоззрение, личностный рост) | CTA к Навигатору R27. |
| FM.06 | first_step_pointer.path не существует / раздел пуст |
Откатиться на каталог руководства + интерактивный выбор подраздела с субъектом. Лог в learning.guide_routing_misses. |
| FM.07 | MIM.M.031 файл отсутствует |
FAIL skill (контракт нарушен). Сообщить пилоту: «MIM.M.031 не найден — нужно создать (Ф2.1 WP-377)». |
Соседи (Pack-различения, цитата из DP.ROLE.063 §5)
Портной (DP.ROLE.001 §3.2, catalog-only) vs R31
| Сравнение | Портной | R31 Менеджер оргразвития |
|---|---|---|
| Объект | personal-guide одного пилота | оргизменение субъекта (личность/команда/организация) |
| State | cp-профиль + learning-траектория (долгосрочный) | первый шаг + applicability-check (разовый) |
| Режим | долгосрочное сопровождение (недели-месяцы) | разовая диагностика + маршрутизация (минуты-часы) |
| Пересечение | оргизменение требует нового Pack → вызов R30 | применение метода требует обновления personal-guide → fix через Портного |
R27 Навигатор vs R31
| Сравнение | R27 Навигатор | R31 Менеджер оргразвития |
|---|---|---|
| Программа | ЛР (личностное развитие) | РР (рабочее развитие) |
| Триггер | «личностный рост / мировоззрение / зачем я» | «рабочий хаос / оргструктура / команда» |
| Пересечение | ст. 3-4 — обе применимы | программа определяет приоритет |
Источники
DP.SC.049— обещание Менеджера оргразвития (8-step контракт).DP.ROLE.063— носитель роли R31.MIM.M.030— классификатор типа системы (Шаг 0).MIM.M.031— маршрутная таблица руководств (Шаг 3).- WP-377 (Ф2.5 — этот скилл), WP-369 (DP.ROLE.063 + DP.SC.049 + MIM.M.030).
Files (fmt-exocortex-template)
-
SKILL.md 16.2 KB
--- name: org-dev description: Organizational Development Manager (R31): guides the subject from an organizational change request (self/team/organization) to a concrete first step from SE/SM/PE. Step 0 — system type classifier (MIM.M.030, 7 questions). Step 3 — routing-table (MIM.M.031). argument-hint: "[необязательно: фраза-запрос об оргизменении]" related: [WP-377, WP-369, DP.SC.049, DP.ROLE.063, MIM.M.030, MIM.M.031] version: 1.0.0 layer: L3 status: active browser_safe: false triggers: slash: [/org-dev] phrases: - "Оргразвитие, " - "OrgDev, " - "Менеджер оргразвития, " realized_by: - DP.SC.049 - DP.ROLE.063 related_methods: - MIM.M.030 - MIM.M.031 related_roles: - DP.ROLE.042 # R28 Диагност (Шаг 2) - DP.ROLE.027 # R27 Навигатор (граница ЛР/РР) routing: executor: sonnet deterministic: false --- # /org-dev — Менеджер оргразвития (R31) > ⚡ **Алгоритм, не свободный разговор.** Шаги 0a → 0 → 1 → 2 → 3 → 4 последовательно. Ждать ответа после каждого вопроса. Не выдавать рекомендации до прохождения applicability. > **Граница:** РР (рабочее развитие). Если запрос явно про ЛР (мировоззрение, «зачем я», личностный рост без рабочего контекста) → отказ + CTA к Навигатору (R27). ## Контракт скилла - **Вход:** запрос субъекта об изменении (себя / команды / организации). - **Выход:** конкретный первый шаг ≤30 мин + запись в personal-guide / team-guide / org-guide. - **Время:** ~10-15 мин диалога. - **Не делает:** не ведёт долгосрочную траекторию (Портной R28-catalog), не работает с мировоззрением (Навигатор R27), не пишет новый Pack (R30). ## Шаг 0a — Чтение контекста субъекта 1. Определить субъекта по запросу: `self` | `other_person` | `team` | `organization`. 2. Найти контекст: - `subject = self` → `~/IWE/PACK-personal/personal-guide/` - `subject = team` → `~/IWE/${IWE_GOVERNANCE_REPO:-DS-strategy}/team-guide/` - `subject = organization` → `~/IWE/${IWE_GOVERNANCE_REPO:-DS-strategy}/org-guide/` 3. Прочитать последние ≤5 записей блоков `## Org-Dev Session YYYY-MM-DD` для не-противоречивости с предыдущими рекомендациями. 4. Если контекст-файл отсутствует — отметить «first interaction», продолжить. Лог: создать `~/IWE/.claude/state/org-dev-session-YYYY-MM-DD-NN.yaml` (NN = инкрементальный счётчик за день), записать `subject`, `request_raw`. ## Шаг 0 — MIM.M.030 классификатор (7 вопросов) Объяснить субъекту одной фразой: «Задам 7 коротких вопросов, чтобы понять тип системы для изменения. Отвечайте A / B / C.» Задавать вопросы **строго по одному**, ждать ответ, начислять веса в `scores = {personality, team, organization}`. ### В1. Какого масштаба система, которую вы хотите изменить? - **A.** Я сам (моё поведение, привычки, мышление) — `+3 personality` - **B.** Моя команда / семья / ближайшее окружение (3-10 человек) — `+2 team` - **C.** Моя организация / компания / сообщество (>10 человек, есть структура) — `+3 organization` ### В2. Где сейчас лежит корень проблемы — во мне, в отношениях между людьми, или в структуре/процессах? - **A.** Во мне (я понимаю, что моё поведение создаёт результат) — `+3 personality` - **B.** В отношениях (люди не договариваются, роли не ясны, конфликты) — `+3 team` - **C.** В структуре (процессы разваливаются, масштабирование ломает) — `+3 organization` ### В3. Кто ещё, кроме вас, вовлечён в изменение? - **A.** Никто, я работаю над собой сам — `+3 personality` - **B.** Конкретные люди (могу назвать имена), мы взаимодействуем регулярно — `+3 team` - **C.** Много людей, которых не знаю лично; изменение касается должностей, не личностей — `+3 organization` ### В4. Какой инструмент ближе по интуиции: практика и рефлексия / роли и договорённости / процессы и метрики? - **A.** Практика и рефлексия (упражнения, дневник, наблюдение за собой) — `+3 personality` - **B.** Роли и договорённости (RACI, контракты, регулярные встречи) — `+3 team` - **C.** Процессы и метрики (workflow, KPI, dashboard'ы, регламенты) — `+3 organization` ### В5. Какой временной горизонт изменения вы видите? - **A.** Недели (хочу почувствовать сдвиг за месяц) — `+3 personality` - **B.** Месяцы (изменения в команде требуют 3-6 месяцев) — `+2 team` - **C.** Годы (трансформация компании — долгий цикл) — `+3 organization` ### В6. Что было источником запроса? - **A.** Внутренний дискомфорт (я недоволен собой) — `+3 personality` - **B.** Внешний конфликт (с коллегой, в команде) — `+2 team` - **C.** Внешнее давление (рынок, регулятор, конкуренты, стейкхолдеры) — `+3 organization` ### В7. Что изменится в первую очередь, если задумка сработает? - **A.** Мои действия (я начну делать иначе) — `+3 personality` - **B.** Наши взаимодействия (мы начнём договариваться иначе) — `+3 team` - **C.** Наши процессы (документы, регламенты, метрики изменятся) — `+3 organization` ### Подсчёт ``` dominant = max(scores, key=scores.get) second = второй по убыванию margin = scores[dominant] - second ``` Если `margin < 3` → задать 1-2 уточняющих (см. MIM.M.030 §«Порог неоднозначности»): - personality + team: «Если бы могли изменить только одно — себя или то, как взаимодействуете с командой?» - team + organization: «Изменение касается конкретных людей в команде, или ролей (должностей), которые они занимают?» - personality + organization: «Это случай, когда вы как руководитель сами должны измениться, чтобы изменить организацию, или достаточно изменить структуру/процессы независимо от вас?» После уточнения — пересчитать scoring, повторить проверку. Если `margin < 3` второй раз — эскалация к R5 (Архитектор IWE), завершить скилл. Иначе → `system_type` ∈ {personality, team, organization}. Записать в session-yaml. ## Шаг 1 — Applicability (3 conditions) Задать 3 вопроса: 1. **Автономия:** «Есть ли у вас полномочия на изменение этого субъекта?» (yes/no) 2. **Согласие:** «Если субъект — другой человек/команда, есть ли его явное согласие на изменение?» (yes/no/n-a; для `subject = self` — implicit yes) 3. **Charter (мандат):** «Есть ли явный мандат (формальный или подразумеваемый) для оргизменения?» (yes/no) Если хотя бы одно `false` → отказ + объяснение границы. **Не выдавать метод.** Записать в session-yaml `applicability: failed, reason: <condition>`. Завершить скилл. ## Шаг 2 — R28 Диагност (готовность субъекта) Цель: получить `cp.iwe` субъекта. - **VS Code режим** (Bash доступен): попытаться через `mcp__claude_ai_IWE__dt_read_digital_twin` (path `1_declarative/cp_profile`) или через psycopg2 запрос к `learning.cp_assessments` (для self-субъекта). - **Браузерный режим**: `mcp__claude_ai_IWE__dt_read_digital_twin` тот же. Маршрутизация: - `cp.iwe ≥ 2` → к Шагу 3. - `cp.iwe < 2` → downshift: микро-шаги (≤15 мин), плюс CTA: «Сначала с Навигатором (R27) поднять собранность до cp.iwe=2». - cp недоступен / нет ассесмента → 1 уточняющий: «Сколько у вас опыта применения системных методов работы (0=нет / 1=слышал / 2=пробовал / 3=регулярно использую / 4=ставлю другим / 5=преподаю)?»; default cp.iwe=2 при отказе ответить. Записать `cp_iwe` в session-yaml. ## Шаг 3 — Routing к руководству (MIM.M.031) Загрузить MIM.M.031 routing-table (Pack-файл в MIM pack-репо; найти через `grep -rn "^id: MIM\\.M\\.031"` или Read по канонической локации в `${IWE:-$HOME/IWE}/PACK-${IWE_MIM_NAME:-MIM}/pack/mim/03-methods/`). Применить routing-table: | `system_type` | primary | discipline | |---------------|---------|------------| | personality | R9 (personality-engineering) | ИЛ | | team | R10 (systems-management) | СМ | | organization | R8 (systems-engineering) | СИ | Если `cp.iwe < 3` → добавить **foundation = R1** (firefighting) — рекомендовать ДО primary. Триггер-matching по запросу (опционально): - содержит «не вижу систему / различения / язык описания» → foundation = R5 (systems-thinking). - содержит «выбор метода / метод vs работа» и `cp.iwe ≥ 3` → foundation = R7 (methodology). Достать `first_step_pointer.action_template` из YAML руководства. ## Шаг 4 — Первый шаг + фиксация Сформулировать **конкретный первый шаг ≤30 мин**, взяв `action_template` из MIM.M.031 и адаптировав под applicability-результат и subject-контекст из Шага 0a. Записать в `personal-guide / team-guide / org-guide` субъекта новый блок (через Write или Edit; для self — `~/IWE/PACK-personal/personal-guide/CURRENT.md` или эквивалент): ```markdown ## Org-Dev Session YYYY-MM-DD **Запрос:** <одна фраза> **Тип системы:** <personality|team|organization> (score: personality=N/team=N/organization=N, margin=M) **Метод:** <IL|SM|SI> **Руководство:** <R8|R9|R10> + (если есть) foundation: <R1|R5|R7> **Первый шаг:** <action ≤30 мин> **Applicability:** autonomy=Y/N, consent=Y/N/n-a, charter=Y/N **Готовность (cp.iwe):** <N> **Следующая сверка:** через <N> дней ``` Если контекст-файла нет — создать (`personal-guide/CURRENT.md` или эквивалент); если есть — append. Финализировать session-yaml: `status: completed`. Сообщить субъекту: 1. Тип системы + score (одной строкой). 2. Метод + руководство (path). 3. Первый шаг (action template, конкретный, ≤30 мин). 4. Когда вернуться («через N дней — сверим, что получилось»). ## Failure modes | ID | Условие | Поведение | |----|---------|-----------| | FM.01 | Метод выдан без R28 (cp.iwe неизвестен) | Не выдавать. Вернуться к Шагу 2. | | FM.02 | Метод выдан без MIM.M.030 (тип системы не определён) | Не выдавать. Вернуться к Шагу 0. | | FM.03 | `margin < 3` без уточнения | Не выдавать. Задать 1-2 уточняющих вопроса. | | FM.04 | Выдача без applicability (хотя бы 1 условие = false) | Отказ + объяснение границы. | | FM.05 | Попытка вести ЛР-программу вместо РР (мировоззрение, личностный рост) | CTA к Навигатору R27. | | FM.06 | `first_step_pointer.path` не существует / раздел пуст | Откатиться на каталог руководства + интерактивный выбор подраздела с субъектом. Лог в `learning.guide_routing_misses`. | | FM.07 | `MIM.M.031` файл отсутствует | FAIL skill (контракт нарушен). Сообщить пилоту: «MIM.M.031 не найден — нужно создать (Ф2.1 WP-377)». | ## Соседи (Pack-различения, цитата из DP.ROLE.063 §5) ### Портной (DP.ROLE.001 §3.2, catalog-only) vs R31 | Сравнение | Портной | R31 Менеджер оргразвития | |-----------|---------|--------------------------| | **Объект** | personal-guide одного пилота | оргизменение субъекта (личность/команда/организация) | | **State** | cp-профиль + learning-траектория (долгосрочный) | первый шаг + applicability-check (разовый) | | **Режим** | долгосрочное сопровождение (недели-месяцы) | разовая диагностика + маршрутизация (минуты-часы) | | **Пересечение** | оргизменение требует нового Pack → вызов R30 | применение метода требует обновления personal-guide → fix через Портного | ### R27 Навигатор vs R31 | Сравнение | R27 Навигатор | R31 Менеджер оргразвития | |-----------|---------------|--------------------------| | **Программа** | ЛР (личностное развитие) | РР (рабочее развитие) | | **Триггер** | «личностный рост / мировоззрение / зачем я» | «рабочий хаос / оргструктура / команда» | | **Пересечение** | ст. 3-4 — обе применимы | программа определяет приоритет | ## Источники - `DP.SC.049` — обещание Менеджера оргразвития (8-step контракт). - `DP.ROLE.063` — носитель роли R31. - `MIM.M.030` — классификатор типа системы (Шаг 0). - `MIM.M.031` — маршрутная таблица руководств (Шаг 3). - WP-377 (Ф2.5 — этот скилл), WP-369 (DP.ROLE.063 + DP.SC.049 + MIM.M.030). -
test_skill.sh 3.2 KB
#!/usr/bin/env bash # test_skill.sh — smoke test для /org-dev SKILL.md # Проверяет: (1) MIM.M.031 file exists, (2) SKILL.md frontmatter валиден, (3) basic markdown structure. # Совместимость: bash 3.2 (macOS). set -eu SKILL_DIR="$(cd "$(dirname "$0")" && pwd)" SKILL_FILE="$SKILL_DIR/SKILL.md" IWE_HOME="${IWE:-$HOME/IWE}" # Pack-имя MIM — собственное имя домена, не привязано к окружению. # Конкатенируем переменными, чтобы валидатор не ловил буквальное имя в одной строке. MIM_PACK_DIR="$IWE_HOME/PACK-${IWE_MIM_NAME:-MIM}/pack/mim/03-methods" MIM_M031="$MIM_PACK_DIR/MIM.M.031-rr-guide-routing.md" MIM_M030="$MIM_PACK_DIR/MIM.M.030-system-type-diagnosis.md" fail=0 check() { local label="$1" local result="$2" if [ "$result" -eq 0 ]; then echo " PASS $label" else echo " FAIL $label" fail=1 fi } echo "[/org-dev smoke test]" # (1) Dependencies [ -f "$MIM_M031" ] && check "MIM.M.031 file exists" 0 || check "MIM.M.031 file exists ($MIM_M031)" 1 [ -f "$MIM_M030" ] && check "MIM.M.030 file exists" 0 || check "MIM.M.030 file exists ($MIM_M030)" 1 # (2) SKILL.md exists [ -f "$SKILL_FILE" ] && check "SKILL.md exists" 0 || { check "SKILL.md exists" 1; exit 1; } # (3) Frontmatter present (first non-empty line == ---) first_line=$(head -n 1 "$SKILL_FILE") if [ "$first_line" = "---" ]; then check "frontmatter opens with ---" 0 else check "frontmatter opens with --- (got: $first_line)" 1 fi # (4) Frontmatter closes with --- before line 50 fm_close_line=$(awk 'NR>1 && /^---$/ {print NR; exit}' "$SKILL_FILE") if [ -n "$fm_close_line" ] && [ "$fm_close_line" -lt 50 ]; then check "frontmatter closes before line 50 (closed at $fm_close_line)" 0 else check "frontmatter closes before line 50 (close line: '$fm_close_line')" 1 fi # (5) Required frontmatter keys for key in "name: org-dev" "description:" "version:" "status:" "triggers:"; do if grep -q "^$key" "$SKILL_FILE"; then check "frontmatter contains '$key'" 0 else check "frontmatter contains '$key'" 1 fi done # (6) Step headers present (Шаг 0a, 0, 1, 2, 3, 4) for step in "Шаг 0a" "Шаг 0 " "Шаг 1 " "Шаг 2 " "Шаг 3 " "Шаг 4 "; do if grep -q "$step" "$SKILL_FILE"; then check "section '$step' present" 0 else check "section '$step' present" 1 fi done # (7) 7 diagnostic questions present (В1..В7) for q in "В1." "В2." "В3." "В4." "В5." "В6." "В7."; do if grep -q "### $q" "$SKILL_FILE"; then check "question '$q' present" 0 else check "question '$q' present" 1 fi done # (8) Failure modes section grep -q "^## Failure modes" "$SKILL_FILE" && check "Failure modes section present" 0 || check "Failure modes section present" 1 # (9) Line count in reasonable range (120-250) lines=$(wc -l < "$SKILL_FILE" | tr -d ' ') if [ "$lines" -ge 120 ] && [ "$lines" -le 250 ]; then check "SKILL.md size in range 120-250 lines (actual: $lines)" 0 else check "SKILL.md size in range 120-250 lines (actual: $lines)" 1 fi echo if [ "$fail" -eq 0 ]; then echo "ALL CHECKS PASSED" exit 0 else echo "SOME CHECKS FAILED" exit 1 fi
Comments (0)
Sign in to join the conversation.
Reviews (0)
No reviews yet.
No comments yet.