[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6J1MGH6A2FXTHYDF0WCCQJZ":3,"skill-same:01M6J1MGH6A2FXTHYDF0WCCQJZ":133},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":26,"publishedAt":37,"linkOnly":38,"markdownContent":39,"markdownBody":40,"frontMatter":41,"refName":45,"commitSha":46,"skillDirectory":47,"forksCount":48,"repositoryHtmlUrl":49,"repositoryHomepageUrl":6,"ownerHtmlUrl":50,"ownerBlogUrl":51,"ownerDescription":52,"updatedAt":53,"install":54,"resources":67},"01M6J1MGH6A2FXTHYDF0WCCQJZ","skill:test-skill",null,"Тест одного скилла: несколько кейсов, стабы, семантические проверки. Читает cases\u002F\u003Cns>\u002F\u003Cskill>.md, для каждого Case поднимает стаб, запускает скилл в агенте, проверяет contains + semantic.","esurvanov\u002Fawesome-claude","esurvanov","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F4973667?v=4","01M6J1G7N9TE6PM9STY2K0BH2Y","Egor Urvanov","01M6J1G7S79PJF3DN0XVVPBMM4",22,"MIT","https:\u002F\u002Fgithub.com\u002Fesurvanov\u002Fawesome-claude\u002Fblob\u002Fmain\u002Fnamespace\u002Fskill\u002Fskills\u002Ftest-skill\u002Fskill.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[27,28,29,30,31,32,33,34,35,36],"test","Test Skill","skill:test skill","help","Bash","read","sdd","semantic","case","sonnet","2026-11-10 10:12:30",false,"---\nname: skill:test-skill\ndescription: >\n  Тест одного скилла: несколько кейсов, стабы, семантические проверки.\n  Читает cases\u002F\u003Cns>\u002F\u003Cskill>.md, для каждого Case поднимает стаб,\n  запускает скилл в агенте, проверяет contains + semantic.\nargument-hint: \"\u003Cnamespace>:\u003Cskill>  (например sdd:help)\"\nmodel: sonnet\nallowed-tools: Bash, Read, Agent\n---\n\n# Тест скилла: $ARGUMENTS\n\n## Шаги\n\n### 1. Разбей аргумент и найди спеку\n\nИз `$ARGUMENTS` извлеки `NS` и `SKILL`.\n\nЧитай `.claude\u002Fskills\u002F$NS\u002F$SKILL\u002Fcases\u002F$SKILL.md`.\nЕсли не найдена → `SKIP: no test spec for $ARGUMENTS`.\n\n### 2. Разбей спеку на кейсы\n\nКаждый `## Case: \u003Cname>` — отдельный кейс. Извлеки:\n- `stub:` — имя стаба\n- `contains:` — список строк\n- `semantic:` — список семантических правил\n\n### 3. Для каждого кейса\n\n#### 3a. Загрузи стаб\n\nЧитай `.claude\u002Fskills\u002Fskill\u002Ftest-skill\u002Fstubs\u002F\u003Cstub-name>.md`. Разбери YAML frontmatter:\n- `git.branch`, `git.commits[]`\n- `skills.\u003Cns>[]` — список имён скиллов\n- `openspec.changes[]` — список имён changes (опционально)\n\n#### 3b. Материализуй стаб\n\n```bash\nRUN_ROOT=$(mktemp -d -t skill-test-XXXXXX)\ntrap \"rm -rf '$RUN_ROOT'\" EXIT\nTMP=\"$RUN_ROOT\u002Fcase-\u003CN>\"\nmkdir -p \"$TMP\"\ncd \"$TMP\"\ngit init --quiet\ngit config user.email \"test@test.local\"\ngit config user.name \"Test\"\ngit checkout -b \u003Cgit.branch> --quiet 2>\u002Fdev\u002Fnull || git checkout \u003Cgit.branch> --quiet\n```\n\nДля каждого коммита из `git.commits`:\n```bash\ngit commit --allow-empty -m \"\u003Ccommit>\" --quiet\n```\n\nДля каждого скилла из `skills.\u003Cns>`:\n```bash\nmkdir -p \"$TMP\u002F.claude\u002Fskills\u002F$NS\u002F\u003Cskill>\"\ncp \".claude\u002Fskills\u002F$NS\u002F\u003Cskill>\u002Fskill.md\" \"$TMP\u002F.claude\u002Fskills\u002F$NS\u002F\u003Cskill>\u002F\"\n```\nТакже скопируй `.claude\u002Fskills\u002F$NS\u002F.manifest`.\n\n**Новое: Mock-stubs расширение**\n\nЕсли в стабе есть `files:`:\n```bash\nfor path in \u003Cfiles.keys>; do\n  mkdir -p \"$(dirname \"$TMP\u002F$path\")\"\n  echo '\u003Cfiles[path]>' > \"$TMP\u002F$path\"\ndone\n```\n\nЕсли в стабе есть `mock_commands:`:\n```bash\nmkdir -p \"$TMP\u002F.mocks\"\nfor cmd in \u003Cmock_commands.keys>; do\n  echo '#!\u002Fbin\u002Fbash' > \"$TMP\u002F.mocks\u002F$cmd\"\n  echo '\u003Cmock_commands[cmd]>' >> \"$TMP\u002F.mocks\u002F$cmd\"\n  chmod +x \"$TMP\u002F.mocks\u002F$cmd\"\ndone\n```\n\nЕсли в стабе есть `openspec.changes`:\n```bash\nfor change in \u003Copenspec.changes>; do\n  mkdir -p \"$TMP\u002Fopenspec\u002Fchanges\u002F$change\"\ndone\n```\n\n#### 3c. Запусти скилл в агенте\n\nПрочитай `.claude\u002Fskills\u002F$NS\u002F$SKILL\u002Fskill.md`. Удали frontmatter (`---…---`).\n\n**Если есть mock_commands или env**, подготовь окружение:\n\n```\nPATH=$TMP\u002F.mocks:$PATH\n\u003Cдля каждого env ключа>: EXPORT \u003CKEY>=\u003CVALUE>\n```\n\nЗапусти Agent с промптом:\n```\nWorking directory for this test: \u003CTMP>\nBefore every bash command run: cd \u003CTMP>\nEnvironment: PATH=$TMP\u002F.mocks:$PATH [если есть mocks]\n[env переменные]\n\n\u003Cтело скилла без frontmatter>\n```\n\nСохрани весь текстовый вывод агента → `OUTPUT`.\n\n#### 3d. Проверь contains\n\nДля каждой строки из `contains:` проверь присутствие в `OUTPUT`.\n\n#### 3e. Проверь semantic\n\nКаждое правило — логический вывод из стаба:\n\n| Правило | Ожидание |\n|---|---|\n| `branch: stub.git.branch appears in output` | значение `git.branch` из стаба есть в `OUTPUT` |\n| `skills: all stub.skills.\u003Cns> items appear as \u002F\u003Cns>:\u003Cname> in output` | для каждого имени из `skills.\u003Cns>` строка `\u002F\u003Cns>:\u003Cname>` есть в `OUTPUT` |\n| `changes: active changes block shows \"(none)\"` | `(none)` есть в `OUTPUT` (стаб без `openspec.changes`) |\n| `changes: each stub.openspec.changes item appears in active changes block` | каждый элемент `openspec.changes` есть в `OUTPUT` |\n\n#### 3f. Результат кейса\n\n```\n  Case: \u003Cname>  PASSED (N\u002FN) | FAILED (M\u002FN)\n    contains[1]: PASS | FAIL — \"\u003Cpattern>\"\n    semantic[1]: PASS | FAIL — \u003Cописание правила> (ожидалось: \"\u003Cvalue>\")\n```\n\n### 4. Итоговый отчёт\n\n```\n=== TEST: $ARGUMENTS ===\n\n  Case: fresh-repo    PASSED (6\u002F6)\n  Case: with-openspec FAILED (3\u002F4)  ← semantic[2]: \"another-change\" not in output\n  Case: multi-skill   PASSED (6\u002F6)\n\nRESULT: 2 passed, 1 failed  (total checks: 16)\n```\n\nЕсли есть FAILED — вывести первые 20 строк `OUTPUT` упавшего кейса.\n\n### 5. Eval-framework: bootstrap k=5 + LLM-judge + результирующий файл\n\nКаждый кейс SHALL прогоняться **k=5** раз (bootstrap). Кейс получает PASS если ≥4\u002F5 прогонов успешны; иначе — `⚠ WARN`.\n\n#### 5a. Создать файл результатов в начале прогона\n\nВ начале (до запуска первого кейса):\n\n```bash\nmkdir -p test-results\nRESULTS_FILE=\"test-results\u002F$(date -u +'%Y-%m-%d-%H%M%S').md\"\ncat > \"$RESULTS_FILE\" \u003C\u003CEOF\n# Test results: $ARGUMENTS\nstarted_at: $(date -u +'%Y-%m-%dT%H:%M:%SZ')\ntest: $ARGUMENTS\n\nEOF\n```\n\n#### 5b. Прогресс в реальном времени\n\nДля каждого кейса по мере выполнения каждого из 5 прогонов выводи:\n\n```\n[\u003Ccase-name>] 1\u002F5 ✓\n[\u003Ccase-name>] 2\u002F5 ✓\n[\u003Ccase-name>] 3\u002F5 ✗\n[\u003Ccase-name>] 4\u002F5 ✓\n[\u003Ccase-name>] 5\u002F5 ✓\n[\u003Ccase-name>] → PASS 4\u002F5\n```\n\nЕсли ≤3\u002F5 — финальная строка: `→ ⚠ WARN N\u002F5`.\n\n#### 5c. Append каждого результата в RESULTS_FILE\n\nПосле завершения каждого кейса (всех 5 прогонов) — append блок:\n\n```markdown\n## Case: \u003Ccase-name>\nresult: PASS | ⚠ WARN\nruns: 5\npassed: 4\nruns_detail:\n  - run 1: PASS\n  - run 2: PASS\n  - run 3: FAIL — contains[1]: \"\u003Cpattern>\" not found\n  - run 4: PASS\n  - run 5: PASS\nsemantic_judge_reasons:\n  - judge[1]: \"yes — output confirms tmp_cleaned\"\n  - judge[2]: \"yes — no_residue verified\"\n```\n\n#### 5d. LLM-judge для semantic assertions\n\nКаждое правило из `semantic:` SHALL оцениваться отдельным LLM-вызовом (не regex):\n\n```\nPrompt: \"Output of the skill follows. Does it satisfy the criterion: \u003Ccriterion>? Answer yes or no with one-line reason.\"\nOutput: \u003COUTPUT>\n```\n\nВердикт: `yes` → semantic[i] PASS; `no` → FAIL. Reason записывается в `runs_detail` и `semantic_judge_reasons`.\n\n#### 5e. Итоговый отчёт в конце файла\n\nПосле завершения всех кейсов (всех bootstrap-прогонов) — append к RESULTS_FILE:\n\n```markdown\n---\n## Summary\ntotal_cases: 3\npassed: 2\nwarned: 1\nfailed: 0\nduration_ms: 45230\nfinished_at: 2026-05-02T03:15:45Z\n```\n\nИ финальный print в stdout:\n\n```\nResults: test-results\u002F2026-05-02-031500.md\n2 PASS, 1 WARN, 0 FAIL\n```\n\n### 6. Status tracking and cleanup\n\n**Before running cases:** Create `$RUN_ROOT\u002Fstatus.json`:\n```json\n{\n  \"started_at\": \"2026-05-02T03:15:00Z\",\n  \"test\": \"\u003Cns>:\u003Cskill>\",\n  \"run_root\": \"\u003CRUN_ROOT>\",\n  \"cases\": []\n}\n```\n\n**For each case:** Update status in `$RUN_ROOT\u002Fstatus.json`:\n```json\n{\n  \"name\": \"\u003Ccase-name>\",\n  \"verdict\": \"passed|failed\",\n  \"tmp_path\": \"\u003CRUN_ROOT>\u002Fcase-\u003CN>\",\n  \"duration_ms\": 5234\n}\n```\n\n**After all cases complete:** Print summary:\n```\nRun root: $RUN_ROOT (cleaned up)\n```\n\nIf `--keep-tmp=all` flag: Print `Run root: \u003CRUN_ROOT>` (path preserved for debugging).\nIf `--keep-tmp=failed-only`: Copy failed case dirs to `~\u002F.cache\u002Fskill-test\u002F\u003Crun-id>\u002F` and print that path.\n\n**Auto-cleanup:** The `trap \"rm -rf '$RUN_ROOT'\" EXIT` ensures $RUN_ROOT is deleted on success, failure, or Ctrl+C.\n","# Тест скилла: $ARGUMENTS\n\n## Шаги\n\n### 1. Разбей аргумент и найди спеку\n\nИз `$ARGUMENTS` извлеки `NS` и `SKILL`.\n\nЧитай `.claude\u002Fskills\u002F$NS\u002F$SKILL\u002Fcases\u002F$SKILL.md`.\nЕсли не найдена → `SKIP: no test spec for $ARGUMENTS`.\n\n### 2. Разбей спеку на кейсы\n\nКаждый `## Case: \u003Cname>` — отдельный кейс. Извлеки:\n- `stub:` — имя стаба\n- `contains:` — список строк\n- `semantic:` — список семантических правил\n\n### 3. Для каждого кейса\n\n#### 3a. Загрузи стаб\n\nЧитай `.claude\u002Fskills\u002Fskill\u002Ftest-skill\u002Fstubs\u002F\u003Cstub-name>.md`. Разбери YAML frontmatter:\n- `git.branch`, `git.commits[]`\n- `skills.\u003Cns>[]` — список имён скиллов\n- `openspec.changes[]` — список имён changes (опционально)\n\n#### 3b. Материализуй стаб\n\n```bash\nRUN_ROOT=$(mktemp -d -t skill-test-XXXXXX)\ntrap \"rm -rf '$RUN_ROOT'\" EXIT\nTMP=\"$RUN_ROOT\u002Fcase-\u003CN>\"\nmkdir -p \"$TMP\"\ncd \"$TMP\"\ngit init --quiet\ngit config user.email \"test@test.local\"\ngit config user.name \"Test\"\ngit checkout -b \u003Cgit.branch> --quiet 2>\u002Fdev\u002Fnull || git checkout \u003Cgit.branch> --quiet\n```\n\nДля каждого коммита из `git.commits`:\n```bash\ngit commit --allow-empty -m \"\u003Ccommit>\" --quiet\n```\n\nДля каждого скилла из `skills.\u003Cns>`:\n```bash\nmkdir -p \"$TMP\u002F.claude\u002Fskills\u002F$NS\u002F\u003Cskill>\"\ncp \".claude\u002Fskills\u002F$NS\u002F\u003Cskill>\u002Fskill.md\" \"$TMP\u002F.claude\u002Fskills\u002F$NS\u002F\u003Cskill>\u002F\"\n```\nТакже скопируй `.claude\u002Fskills\u002F$NS\u002F.manifest`.\n\n**Новое: Mock-stubs расширение**\n\nЕсли в стабе есть `files:`:\n```bash\nfor path in \u003Cfiles.keys>; do\n  mkdir -p \"$(dirname \"$TMP\u002F$path\")\"\n  echo '\u003Cfiles[path]>' > \"$TMP\u002F$path\"\ndone\n```\n\nЕсли в стабе есть `mock_commands:`:\n```bash\nmkdir -p \"$TMP\u002F.mocks\"\nfor cmd in \u003Cmock_commands.keys>; do\n  echo '#!\u002Fbin\u002Fbash' > \"$TMP\u002F.mocks\u002F$cmd\"\n  echo '\u003Cmock_commands[cmd]>' >> \"$TMP\u002F.mocks\u002F$cmd\"\n  chmod +x \"$TMP\u002F.mocks\u002F$cmd\"\ndone\n```\n\nЕсли в стабе есть `openspec.changes`:\n```bash\nfor change in \u003Copenspec.changes>; do\n  mkdir -p \"$TMP\u002Fopenspec\u002Fchanges\u002F$change\"\ndone\n```\n\n#### 3c. Запусти скилл в агенте\n\nПрочитай `.claude\u002Fskills\u002F$NS\u002F$SKILL\u002Fskill.md`. Удали frontmatter (`---…---`).\n\n**Если есть mock_commands или env**, подготовь окружение:\n\n```\nPATH=$TMP\u002F.mocks:$PATH\n\u003Cдля каждого env ключа>: EXPORT \u003CKEY>=\u003CVALUE>\n```\n\nЗапусти Agent с промптом:\n```\nWorking directory for this test: \u003CTMP>\nBefore every bash command run: cd \u003CTMP>\nEnvironment: PATH=$TMP\u002F.mocks:$PATH [если есть mocks]\n[env переменные]\n\n\u003Cтело скилла без frontmatter>\n```\n\nСохрани весь текстовый вывод агента → `OUTPUT`.\n\n#### 3d. Проверь contains\n\nДля каждой строки из `contains:` проверь присутствие в `OUTPUT`.\n\n#### 3e. Проверь semantic\n\nКаждое правило — логический вывод из стаба:\n\n| Правило | Ожидание |\n|---|---|\n| `branch: stub.git.branch appears in output` | значение `git.branch` из стаба есть в `OUTPUT` |\n| `skills: all stub.skills.\u003Cns> items appear as \u002F\u003Cns>:\u003Cname> in output` | для каждого имени из `skills.\u003Cns>` строка `\u002F\u003Cns>:\u003Cname>` есть в `OUTPUT` |\n| `changes: active changes block shows \"(none)\"` | `(none)` есть в `OUTPUT` (стаб без `openspec.changes`) |\n| `changes: each stub.openspec.changes item appears in active changes block` | каждый элемент `openspec.changes` есть в `OUTPUT` |\n\n#### 3f. Результат кейса\n\n```\n  Case: \u003Cname>  PASSED (N\u002FN) | FAILED (M\u002FN)\n    contains[1]: PASS | FAIL — \"\u003Cpattern>\"\n    semantic[1]: PASS | FAIL — \u003Cописание правила> (ожидалось: \"\u003Cvalue>\")\n```\n\n### 4. Итоговый отчёт\n\n```\n=== TEST: $ARGUMENTS ===\n\n  Case: fresh-repo    PASSED (6\u002F6)\n  Case: with-openspec FAILED (3\u002F4)  ← semantic[2]: \"another-change\" not in output\n  Case: multi-skill   PASSED (6\u002F6)\n\nRESULT: 2 passed, 1 failed  (total checks: 16)\n```\n\nЕсли есть FAILED — вывести первые 20 строк `OUTPUT` упавшего кейса.\n\n### 5. Eval-framework: bootstrap k=5 + LLM-judge + результирующий файл\n\nКаждый кейс SHALL прогоняться **k=5** раз (bootstrap). Кейс получает PASS если ≥4\u002F5 прогонов успешны; иначе — `⚠ WARN`.\n\n#### 5a. Создать файл результатов в начале прогона\n\nВ начале (до запуска первого кейса):\n\n```bash\nmkdir -p test-results\nRESULTS_FILE=\"test-results\u002F$(date -u +'%Y-%m-%d-%H%M%S').md\"\ncat > \"$RESULTS_FILE\" \u003C\u003CEOF\n# Test results: $ARGUMENTS\nstarted_at: $(date -u +'%Y-%m-%dT%H:%M:%SZ')\ntest: $ARGUMENTS\n\nEOF\n```\n\n#### 5b. Прогресс в реальном времени\n\nДля каждого кейса по мере выполнения каждого из 5 прогонов выводи:\n\n```\n[\u003Ccase-name>] 1\u002F5 ✓\n[\u003Ccase-name>] 2\u002F5 ✓\n[\u003Ccase-name>] 3\u002F5 ✗\n[\u003Ccase-name>] 4\u002F5 ✓\n[\u003Ccase-name>] 5\u002F5 ✓\n[\u003Ccase-name>] → PASS 4\u002F5\n```\n\nЕсли ≤3\u002F5 — финальная строка: `→ ⚠ WARN N\u002F5`.\n\n#### 5c. Append каждого результата в RESULTS_FILE\n\nПосле завершения каждого кейса (всех 5 прогонов) — append блок:\n\n```markdown\n## Case: \u003Ccase-name>\nresult: PASS | ⚠ WARN\nruns: 5\npassed: 4\nruns_detail:\n  - run 1: PASS\n  - run 2: PASS\n  - run 3: FAIL — contains[1]: \"\u003Cpattern>\" not found\n  - run 4: PASS\n  - run 5: PASS\nsemantic_judge_reasons:\n  - judge[1]: \"yes — output confirms tmp_cleaned\"\n  - judge[2]: \"yes — no_residue verified\"\n```\n\n#### 5d. LLM-judge для semantic assertions\n\nКаждое правило из `semantic:` SHALL оцениваться отдельным LLM-вызовом (не regex):\n\n```\nPrompt: \"Output of the skill follows. Does it satisfy the criterion: \u003Ccriterion>? Answer yes or no with one-line reason.\"\nOutput: \u003COUTPUT>\n```\n\nВердикт: `yes` → semantic[i] PASS; `no` → FAIL. Reason записывается в `runs_detail` и `semantic_judge_reasons`.\n\n#### 5e. Итоговый отчёт в конце файла\n\nПосле завершения всех кейсов (всех bootstrap-прогонов) — append к RESULTS_FILE:\n\n```markdown\n---\n## Summary\ntotal_cases: 3\npassed: 2\nwarned: 1\nfailed: 0\nduration_ms: 45230\nfinished_at: 2026-05-02T03:15:45Z\n```\n\nИ финальный print в stdout:\n\n```\nResults: test-results\u002F2026-05-02-031500.md\n2 PASS, 1 WARN, 0 FAIL\n```\n\n### 6. Status tracking and cleanup\n\n**Before running cases:** Create `$RUN_ROOT\u002Fstatus.json`:\n```json\n{\n  \"started_at\": \"2026-05-02T03:15:00Z\",\n  \"test\": \"\u003Cns>:\u003Cskill>\",\n  \"run_root\": \"\u003CRUN_ROOT>\",\n  \"cases\": []\n}\n```\n\n**For each case:** Update status in `$RUN_ROOT\u002Fstatus.json`:\n```json\n{\n  \"name\": \"\u003Ccase-name>\",\n  \"verdict\": \"passed|failed\",\n  \"tmp_path\": \"\u003CRUN_ROOT>\u002Fcase-\u003CN>\",\n  \"duration_ms\": 5234\n}\n```\n\n**After all cases complete:** Print summary:\n```\nRun root: $RUN_ROOT (cleaned up)\n```\n\nIf `--keep-tmp=all` flag: Print `Run root: \u003CRUN_ROOT>` (path preserved for debugging).\nIf `--keep-tmp=failed-only`: Copy failed case dirs to `~\u002F.cache\u002Fskill-test\u002F\u003Crun-id>\u002F` and print that path.\n\n**Auto-cleanup:** The `trap \"rm -rf '$RUN_ROOT'\" EXIT` ensures $RUN_ROOT is deleted on success, failure, or Ctrl+C.\n",{"name":5,"model":36,"description":42,"allowed-tools":43,"argument-hint":44},"Тест одного скилла: несколько кейсов, стабы, семантические проверки. Читает cases\u002F\u003Cns>\u002F\u003Cskill>.md, для каждого Case поднимает стаб, запускает скилл в агенте, проверяет contains + semantic.\n","Bash, Read, Agent","\u003Cnamespace>:\u003Cskill>  (например sdd:help)","main","81eafc75f9ca212c44852f5012421b956024b0e6","namespace\u002Fskill\u002Fskills\u002Ftest-skill",5,"https:\u002F\u002Fgithub.com\u002Fesurvanov\u002Fawesome-claude","https:\u002F\u002Fgithub.com\u002Fesurvanov","https:\u002F\u002Fwww.urvanov.com\u002F","CTO in iGaming (NDA). AI development, engineering leadership, networking. Based between Batumi, Da Nang and Bangkok. Founder of Jaiora.","2026-05-12 00:32:28",{"source":8,"skillName":5,"commands":55,"prompt":65,"zipAvailable":66},[56,59,62],{"tool":57,"command":58},"npx","npx skills add esurvanov\u002Fawesome-claude --skill \"skill:test-skill\"",{"tool":60,"command":61},"bunx","bunx skills add esurvanov\u002Fawesome-claude --skill \"skill:test-skill\"",{"tool":63,"command":64},"pnpm","pnpm dlx skills add esurvanov\u002Fawesome-claude --skill \"skill:test-skill\"","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fesurvanov\u002Fawesome-claude\u002Fblob\u002Fmain\u002Fnamespace\u002Fskill\u002Fskills\u002Ftest-skill\u002Fskill.md",true,[68,74,78,81,85,89,93,97,101,105,109,113,117,121,125,129],{"path":69,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":72,"sourceHtmlUrl":73},"cases\u002Ftest-skill.md","REFERENCE","参考文档",705,"https:\u002F\u002Fgithub.com\u002Fesurvanov\u002Fawesome-claude\u002Fblob\u002Fmain\u002Fnamespace\u002Fskill\u002Fskills\u002Ftest-skill\u002Fcases\u002Ftest-skill.md",{"path":75,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":76,"sourceHtmlUrl":77},"stubs\u002Fchange-missing-test-plan.md",331,"https:\u002F\u002Fgithub.com\u002Fesurvanov\u002Fawesome-claude\u002Fblob\u002Fmain\u002Fnamespace\u002Fskill\u002Fskills\u002Ftest-skill\u002Fstubs\u002Fchange-missing-test-plan.md",{"path":79,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":72,"sourceHtmlUrl":80},"stubs\u002Fchange-other-owner.md","https:\u002F\u002Fgithub.com\u002Fesurvanov\u002Fawesome-claude\u002Fblob\u002Fmain\u002Fnamespace\u002Fskill\u002Fskills\u002Ftest-skill\u002Fstubs\u002Fchange-other-owner.md",{"path":82,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":83,"sourceHtmlUrl":84},"stubs\u002Fchange-verify-failed.md",1256,"https:\u002F\u002Fgithub.com\u002Fesurvanov\u002Fawesome-claude\u002Fblob\u002Fmain\u002Fnamespace\u002Fskill\u002Fskills\u002Ftest-skill\u002Fstubs\u002Fchange-verify-failed.md",{"path":86,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":87,"sourceHtmlUrl":88},"stubs\u002Fchange-verifying-state.md",971,"https:\u002F\u002Fgithub.com\u002Fesurvanov\u002Fawesome-claude\u002Fblob\u002Fmain\u002Fnamespace\u002Fskill\u002Fskills\u002Ftest-skill\u002Fstubs\u002Fchange-verifying-state.md",{"path":90,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":91,"sourceHtmlUrl":92},"stubs\u002Fchange-with-removed-req-file-present.md",1207,"https:\u002F\u002Fgithub.com\u002Fesurvanov\u002Fawesome-claude\u002Fblob\u002Fmain\u002Fnamespace\u002Fskill\u002Fskills\u002Ftest-skill\u002Fstubs\u002Fchange-with-removed-req-file-present.md",{"path":94,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":95,"sourceHtmlUrl":96},"stubs\u002Fchange-with-removed-req-no-file.md",1147,"https:\u002F\u002Fgithub.com\u002Fesurvanov\u002Fawesome-claude\u002Fblob\u002Fmain\u002Fnamespace\u002Fskill\u002Fskills\u002Ftest-skill\u002Fstubs\u002Fchange-with-removed-req-no-file.md",{"path":98,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":99,"sourceHtmlUrl":100},"stubs\u002Fchange-with-sdd-yaml.md",889,"https:\u002F\u002Fgithub.com\u002Fesurvanov\u002Fawesome-claude\u002Fblob\u002Fmain\u002Fnamespace\u002Fskill\u002Fskills\u002Ftest-skill\u002Fstubs\u002Fchange-with-sdd-yaml.md",{"path":102,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":103,"sourceHtmlUrl":104},"stubs\u002Fcreates-collision.md",1404,"https:\u002F\u002Fgithub.com\u002Fesurvanov\u002Fawesome-claude\u002Fblob\u002Fmain\u002Fnamespace\u002Fskill\u002Fskills\u002Ftest-skill\u002Fstubs\u002Fcreates-collision.md",{"path":106,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":107,"sourceHtmlUrl":108},"stubs\u002Ffresh-repo.md",119,"https:\u002F\u002Fgithub.com\u002Fesurvanov\u002Fawesome-claude\u002Fblob\u002Fmain\u002Fnamespace\u002Fskill\u002Fskills\u002Ftest-skill\u002Fstubs\u002Ffresh-repo.md",{"path":110,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":111,"sourceHtmlUrl":112},"stubs\u002Fmulti-skill.md",136,"https:\u002F\u002Fgithub.com\u002Fesurvanov\u002Fawesome-claude\u002Fblob\u002Fmain\u002Fnamespace\u002Fskill\u002Fskills\u002Ftest-skill\u002Fstubs\u002Fmulti-skill.md",{"path":114,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":115,"sourceHtmlUrl":116},"stubs\u002Fspecs-with-index.md",955,"https:\u002F\u002Fgithub.com\u002Fesurvanov\u002Fawesome-claude\u002Fblob\u002Fmain\u002Fnamespace\u002Fskill\u002Fskills\u002Ftest-skill\u002Fstubs\u002Fspecs-with-index.md",{"path":118,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":119,"sourceHtmlUrl":120},"stubs\u002Fwith-change.md",1044,"https:\u002F\u002Fgithub.com\u002Fesurvanov\u002Fawesome-claude\u002Fblob\u002Fmain\u002Fnamespace\u002Fskill\u002Fskills\u002Ftest-skill\u002Fstubs\u002Fwith-change.md",{"path":122,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":123,"sourceHtmlUrl":124},"stubs\u002Fwith-deploy-config.md",579,"https:\u002F\u002Fgithub.com\u002Fesurvanov\u002Fawesome-claude\u002Fblob\u002Fmain\u002Fnamespace\u002Fskill\u002Fskills\u002Ftest-skill\u002Fstubs\u002Fwith-deploy-config.md",{"path":126,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":127,"sourceHtmlUrl":128},"stubs\u002Fwith-hooks-config.md",753,"https:\u002F\u002Fgithub.com\u002Fesurvanov\u002Fawesome-claude\u002Fblob\u002Fmain\u002Fnamespace\u002Fskill\u002Fskills\u002Ftest-skill\u002Fstubs\u002Fwith-hooks-config.md",{"path":130,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":131,"sourceHtmlUrl":132},"stubs\u002Fwith-openspec.md",166,"https:\u002F\u002Fgithub.com\u002Fesurvanov\u002Fawesome-claude\u002Fblob\u002Fmain\u002Fnamespace\u002Fskill\u002Fskills\u002Ftest-skill\u002Fstubs\u002Fwith-openspec.md",[134,147,159,175,189,207],{"skillNo":135,"name":136,"nameZh":6,"description":137,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":138,"categories":139,"keywords":142,"publishedAt":37},"01M6J1MCNHVC2NAVF5XYKCA3BR","skill:test-all","Запускает все тесты скиллов. Обнаруживает тест-спеки в .claude\u002Fskills\u002F*\u002F*\u002Fcases\u002F, запускает каждый через логику test-skill, выводит сводную таблицу, проверяет TDD-coverage матрицу.","https:\u002F\u002Fgithub.com\u002Fesurvanov\u002Fawesome-claude\u002Fblob\u002Fmain\u002Fnamespace\u002Fskill\u002Fskills\u002Ftest-all\u002Fskill.md",[140,141],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[143,27,144,145,31,32,146,36],"skill:test all","test all","tdd","coverage",{"skillNo":148,"name":149,"nameZh":6,"description":150,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":151,"categories":152,"keywords":153,"publishedAt":37},"01M6J1M7Q2T82FXF2S5TYWMYWK","skill:setup","Dev mode setup для awesome-claude репы — создаёт симлинки skills\u002F, commands\u002F, rules\u002F в .claude\u002F напрямую через bash. Идемпотентен: повторный вызов выводит \"Already linked\". Если .claude\u002F\u003Cdir> уже существует как обычная директория — предупреждает и просит подтверждение перед заменой.","https:\u002F\u002Fgithub.com\u002Fesurvanov\u002Fawesome-claude\u002Fblob\u002Fmain\u002Fnamespace\u002Fskill\u002Fskills\u002Fsetup\u002Fskill.md",[],[154,149,155,31,156,32,157,36,158],"setup","dev","Rules","commands","mode",{"skillNo":160,"name":161,"nameZh":6,"description":162,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":163,"categories":164,"keywords":166,"publishedAt":37},"01M6J1M37B5M33229RTK5EQM2Y","skill:release","Финальный шаг контрибьюторского workflow — релиз awesome-claude. Bump-version в manifest.yaml, commit, version tag. Останавливается если working tree не чистый.","https:\u002F\u002Fgithub.com\u002Fesurvanov\u002Fawesome-claude\u002Fblob\u002Fmain\u002Fnamespace\u002Fskill\u002Fskills\u002Frelease\u002Fskill.md",[165],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[161,167,168,169,170,171,31,32,172,173,36,174],"release","workflow","commit","yaml","manifest","version","bump","tree",{"skillNo":176,"name":177,"nameZh":6,"description":178,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":179,"categories":180,"keywords":187,"publishedAt":37},"01M6J1KZ8Y0TFBRF0D5ZKV62DW","skill:onboarding","Guided entry point для контрибьютора awesome-claude. Показывает полный contributor workflow и текущий следующий шаг по состоянию репы. НЕ запускает другие скиллы автоматически — только показывает, что вызвать дальше.","https:\u002F\u002Fgithub.com\u002Fesurvanov\u002Fawesome-claude\u002Fblob\u002Fmain\u002Fnamespace\u002Fskill\u002Fskills\u002Fonboarding\u002Fskill.md",[181,182],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":183,"categoryName":184,"taxonomyType":185,"taxonomyTypeDesc":186},"01JBSEEDCAT000000000000038","人力资源","PROFESSION","适用职业",[177,188,168,36,32,31],"onboarding",{"skillNo":190,"name":191,"nameZh":6,"description":192,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":193,"categories":194,"keywords":196,"publishedAt":37},"01M6J1KTMG1PW8QJGTGH9PQE4V","skill:deps","Установка\u002Fпроверка зависимостей awesome-claude из manifest.yaml: CLI-инструменты из секции tools:, субмодули из repos: через sdd:sync. Read-only по manifest.yaml — никогда не пишет в него (для добавления записей используй ручное редактирование или sdd:repo). Валидирует схему manifest.yaml: ошибка и стоп если отсутствует один из version, tools, repos.","https:\u002F\u002Fgithub.com\u002Fesurvanov\u002Fawesome-claude\u002Fblob\u002Fmain\u002Fnamespace\u002Fskill\u002Fskills\u002Fdeps\u002Fskill.md",[195],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[197,191,198,199,200,170,201,171,31,202,32,172,203,33,204,36,205,206],"deps","repos","cli","sync","Tools","repo","only","read-only","sdd:repo","sdd:sync",{"skillNo":208,"name":209,"nameZh":6,"description":210,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":211,"categories":212,"keywords":215,"publishedAt":37},"01M6J1KNENC157AA5ESVSMP25B","sdd:test","Generate and run check artifacts for a spec. Self-sufficient: MCP preflight, 2-agent generation, автоматически по всем Requirements, auto state transition.","https:\u002F\u002Fgithub.com\u002Fesurvanov\u002Fawesome-claude\u002Fblob\u002Fmain\u002Fnamespace\u002Fsdd\u002Fskills\u002Ftest\u002Fskill.md",[213,214],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[209,33,27,216,217,218,219,220,221,222,223,224,225,226,227,228,229],"spec","generate","run","artifacts","state","preflight","check","auto","self","requirements","generation","agent generation","for","MCP"]