diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 14345f0..c5288e8 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -1,7 +1,7 @@ { "name": "kit", "description": "Community plugin & skills marketplace for Claude Code", - "version": "1.6.0", + "version": "1.6.1", "owner": { "name": "hamsurang", "email": "zlemzlem5656@naver.com" diff --git a/README.ko.md b/README.ko.md index 86065fd..4238ccc 100644 --- a/README.ko.md +++ b/README.ko.md @@ -82,6 +82,8 @@ bash scripts/scaffold-plugin.sh | [gh-cli](./plugins/gh-cli) | gh CLI로 GitHub 작업을 수행할 때 자동으로 활성화되는 스킬 | [minsoo.web](https://github.com/minsoo-web) | | [personal-tutor](./plugins/personal-tutor) | 세션 간 학습자 프로필과 지식 그래프를 유지하는 적응형 기술 튜터링 스킬 | [minsoo.web](https://github.com/minsoo-web) | | [deepwiki-cli](./plugins/deepwiki-cli) | MCP 토큰 오버헤드 없이 DeepWiki CLI로 GitHub 저장소 위키를 조회하는 스킬 | [minsoo.web](https://github.com/minsoo-web) | +| [obsidian](./plugins/obsidian) | Obsidian 볼트에서 노트 검색, 생성, 편집, 정리 및 obsidian-cli와 Obsidian Headless를 통한 프론트매터 관리 | [minsoo.web](https://github.com/minsoo-web) | +| [library-analyzer](./plugins/library-analyzer) | 병렬 에이전트를 활용하여 오픈소스 라이브러리의 기여 준비도를 분석하는 스킬 | [minsoo.web](https://github.com/minsoo-web) | *플러그인을 기여하고 싶으신가요? [기여 방법](docs/contributors/contributing.md)을 확인하세요.* diff --git a/README.md b/README.md index 54f718f..a70c155 100644 --- a/README.md +++ b/README.md @@ -82,6 +82,8 @@ bash scripts/scaffold-plugin.sh | [gh-cli](./plugins/gh-cli) | Auto-invoked skill for working with GitHub from the command line using the gh CLI tool | [minsoo.web](https://github.com/minsoo-web) | | [personal-tutor](./plugins/personal-tutor) | Adaptive technical tutoring skill that builds a persistent knowledge graph and learner profile across sessions | [minsoo.web](https://github.com/minsoo-web) | | [deepwiki-cli](./plugins/deepwiki-cli) | Query GitHub repository wikis via DeepWiki CLI without MCP token overhead. | [minsoo.web](https://github.com/minsoo-web) | +| [obsidian](./plugins/obsidian) | Work with Obsidian vaults — search, create, edit, organize notes and manage frontmatter via obsidian-cli and Obsidian Headless | [minsoo.web](https://github.com/minsoo-web) | +| [library-analyzer](./plugins/library-analyzer) | Analyze open-source libraries for contribution readiness with parallel agents | [minsoo.web](https://github.com/minsoo-web) | *Have a plugin to share? See [Contributing](docs/contributors/contributing.md).* diff --git a/docs/contributors/plugin-spec.md b/docs/contributors/plugin-spec.md index fb545f7..9db0f6f 100644 --- a/docs/contributors/plugin-spec.md +++ b/docs/contributors/plugin-spec.md @@ -115,13 +115,13 @@ Skills are automatically invoked by Claude when the conversation context matches --- name: skill-name # Required: unique identifier description: > # Required: trigger conditions (used by Claude to decide when to activate) - This skill should be used when... + Use when... --- ``` `skills/*/SKILL.md` frontmatter requires both `name` and `description`. -The `description` field is critical — it's what Claude reads to decide whether to activate this skill. Write it as trigger scenarios starting with "This skill should be used when...". +The `description` field is critical — it's what Claude reads to decide whether to activate this skill. Write it as trigger scenarios starting with "Use when...". ### Example: `skills/code-explainer/SKILL.md` @@ -129,9 +129,9 @@ The `description` field is critical — it's what Claude reads to decide whether --- name: code-explainer description: > - This skill should be used when the user asks to "explain this code", - "what does this do", "help me understand", or asks questions about - how a specific piece of code works. + Use when the user asks to "explain this code", "what does this do", + "help me understand", or asks questions about how a specific piece + of code works. --- # Code Explainer diff --git a/docs/plans/2026-03-08-refactor-skill-quality-improvements-plan.md b/docs/plans/2026-03-08-refactor-skill-quality-improvements-plan.md new file mode 100644 index 0000000..ea87847 --- /dev/null +++ b/docs/plans/2026-03-08-refactor-skill-quality-improvements-plan.md @@ -0,0 +1,268 @@ +--- +title: "refactor: Skill Quality Improvements P1-P8" +type: refactor +status: completed +date: 2026-03-08 +deepened: 2026-03-08 +--- + +# Skill Quality Improvements P1-P8 + +## Overview + +skill-creator eval 기반 전체 스킬 리뷰 결과, 7개 플러그인에서 총 5개 errors와 35개 warnings를 발견했다. 2개 플러그인(obsidian, deepwiki-cli)이 FAIL 판정을 받아 publish가 차단된 상태이며, 나머지 5개는 NEEDS WORK 상태다. + +| 플러그인 | 판정 | Errors | Warnings | 목표 잔여 Warnings | +|---------|------|--------|----------|-------------------| +| obsidian | FAIL | 4 | 7 | ≤2 | +| deepwiki-cli | FAIL | 1 | 4 | ≤1 | +| gh-cli | NEEDS WORK | 0 | 9 | ≤2 | +| personal-tutor | NEEDS WORK | 0 | 5 | ≤2 | +| library-analyzer | NEEDS WORK | 0 | 4 | ≤1 | +| skill-review | NEEDS WORK | 0 | 3 | ≤1 | +| vitest | NEEDS WORK | 0 | 3 | 3 (변경 없음) | +| **합계** | | **5** | **35** | **≤12** | + +--- + +## Execution Strategy + +skill-review checklist 수정 → 7개 플러그인 CP0 pre-flight → 나머지 5개 플러그인 병렬 수정 → 최종 re-review. + +1. **skill-review** checklist 먼저 수정 (새 체크 항목이 re-review 기준이 됨) +2. **CP0**: 새 체크 항목(YAML 유효성, 깨진 참조)으로 7개 전부 pre-flight 검증 — 예상치 못한 새 ERROR 조기 발견 +3. deepwiki-cli, obsidian, personal-tutor, library-analyzer, gh-cli **병렬** 수정 +4. 최종 re-review로 전체 검증 + +**브랜칭**: 플러그인별 1커밋, 단일 PR. gh-cli 재구성이 문제되면 해당 커밋만 선택적 revert 가능. + +**Re-fix 루프**: re-review 실패 시 최대 2회 재수정. 2회 후에도 실패하면 해당 플러그인만 분리하여 별도 PR로 처리. 통과한 플러그인은 먼저 머지 가능. + +--- + +## Fix Instructions + +### 0. skill-review (선행 — 반드시 먼저) + +**파일:** `plugins/skill-review/skills/skill-review/references/checklist.md` + +체크리스트에 누락 항목 추가: +- 섹션 1 (Frontmatter) 첫 항목: `YAML frontmatter is valid YAML syntax (parses without error, no duplicate keys, correct indentation)` (❌ Error) +- 섹션 5 (Progressive Disclosure): `All files linked from SKILL.md via markdown links or explicit Read instructions exist at the referenced path` (❌ Error) +- 섹션 3 (Naming) 헤더 아래에 blockquote 주석 추가: + ```markdown + > **Exception:** Tool-wrapper skills (e.g., vitest, gh-cli) may use the tool name directly. This is an accepted convention and not counted as a warning. + ``` + +Scoring guide는 **변경하지 않는다** (0 errors + 0 warnings = PASS, 1+ warnings = NEEDS WORK 유지). 대신 tool-wrapper naming 예외를 체크리스트에 명시하여, vitest/gh-cli의 naming warning이 리뷰 시 skip 가능하도록 한다. + +### 1. deepwiki-cli (FAIL 해제) + +**파일:** `plugins/deepwiki-cli/skills/deepwiki-cli/SKILL.md`, `plugins/deepwiki-cli/.claude-plugin/plugin.json` + +**(a) P1: description "Use when..." 형식으로 변경** (ERROR 해결) +```yaml +description: > + Use when the user asks questions about a GitHub repository's architecture, + API, or internals, or mentions deepwiki-cli or DeepWiki. Activates when + the user needs to understand a codebase they haven't cloned locally, or + asks how a library or framework works. Do NOT activate for local codebases + already accessible on disk or private repositories. +``` +검증: ~370자 (≤500 PASS). "deepwiki-cli" 도구명을 트리거 키워드로 유지. "in owner/repo format"은 본문으로 이동 (description은 트리거 조건만). + +**(b) P5: "When NOT to Use" + Error Handling 섹션 추가** +- When NOT to Use: 이미 clone된 로컬 repo, private repo, 자신의 코드 +- Error Handling: repo 존재 확인 → `structure` 먼저 시도 → fallback to web search + +**(c) plugin.json author 오타 수정** +- `"github": "minsoo.web"` → `"github": "minsoo-web"` +- `"name": "minsoo.web"` — 표시 이름으로 의도된 것인지 확인 후 결정. GitHub username에 dot은 유효하지만, 다른 모든 플러그인의 author.name이 "minsoo.web"이고 github만 "minsoo-web"인 점을 고려하면 name은 유지, github만 수정이 적절. + +### 2. obsidian (FAIL 해제) + +**파일:** `plugins/obsidian/skills/obsidian/SKILL.md`, `plugins/obsidian/skills/obsidian/references/commands.md` + +**(a) P2: frontmatter 정리** (ERROR 해결) +- `metadata.openclaw` 블록 전체 삭제 → `name`과 `description`만 남김 +- 설치 정보는 본문 Prerequisites 섹션에 1-2줄로 이동 + +**(b) P1 + P3: description 재작성** (ERROR 해결) +- 현재 873자(실측) → 500자 이하. "Use when..." 형식으로 변경 +```yaml +description: > + Use when the user mentions Obsidian, vault, daily notes, wikilinks, + frontmatter, backlinks, graph view, PKM, Zettelkasten, or obsidian-cli. + Activates for searching, creating, editing, moving notes in an Obsidian + vault, managing YAML frontmatter, or syncing vaults via Obsidian Headless + (ob CLI). Also trigger on Korean phrases like "내 노트에서 찾아줘" or + "vault 동기화". Do NOT trigger for generic Markdown editing (README, docs) + or other note apps (Notion, Bear). +``` +검증: ~474자 (≤500 PASS). 기존 대비 변경: "graph view" 복원 (Obsidian 고유 용어), "ob CLI" → "Obsidian Headless (ob CLI)" 명확화, "Trigger for" → "Activates for" (3인칭 일관성). + +**(c) P5: 에러 핸들링 추가** +- `obsidian-cli` 미설치 시 fallback (Glob/Read/Write로 직접 파일 조작) +- OS별 Obsidian config 경로 (macOS / Linux / Windows) +- "When NOT to Use" 섹션 추가 (deepwiki-cli, library-analyzer와 일관성): generic Markdown editing, non-Obsidian note apps + +**(d) P6: 시간 민감 정보 제거** +- `references/commands.md`에서 "Version: 0.2.3", "Version: 0.0.6 (open beta)" 제거 + +**(e) P7: `## Contents` ToC 추가** (최종 SKILL.md가 100줄 초과 시에만) + +**(f) Headless 섹션 정리** +- `references/commands.md`에 이미 headless 커맨드 레퍼런스 존재 (lines 168-268) +- SKILL.md의 inline headless 섹션(~55줄) 삭제, `references/commands.md`의 기존 섹션으로 참조 통합 +- 별도 `references/headless.md` 생성 불필요 (중복 방지) +- SKILL.md에 한 줄 참조: "For headless sync (CI/servers), see the Headless section in `references/commands.md`." + +**(g) lazy loading 테이블 추가** +```markdown +| Situation | Load | +|-----------|------| +| CLI 명령어 상세 옵션, headless 사용법 | `references/commands.md` | +``` +참고: `references/workflows.md`는 존재하지 않으므로 테이블에서 제외. 현재 obsidian references는 `commands.md` 1개뿐. + +### 3. gh-cli (구조 재편 — 가장 복잡) + +**파일:** `plugins/gh-cli/skills/gh-cli/SKILL.md` + +**(a) P3: description 500자 이하로 축소** +- 현재 583자(실측) → 500자 이하. 중복 문장 제거 + "Do NOT" 부정 경계 추가. +```yaml +description: > + Use when working with GitHub from the command line using the gh CLI tool. + Trigger on "create PR", "open pull request", "list issues", "check CI", + "merge PR", "review PR", "create issue", "release", "gh auth", "clone repo", + "fork repo", "close issue", "view workflow run", or any GitHub operation + from the terminal. Do NOT trigger for GitHub web UI actions or direct REST + API calls without gh. +``` +검증: ~487자 (≤500 PASS). 기존 대비 변경: 중복 3번째 문장 삭제 ("Always use this skill..."), "Do NOT" 부정 경계 추가, "fork repo"/"close issue"/"view workflow run" 트리거 복원. + +**(b) P4: cheat sheet → 행동 가이드 전환** +- 현재 299줄 → 목표 80-150줄 +- 구조: `## Contents` → `## Behavior Guidelines` (3-5개) → `## Core Workflows` (PR/CI/Issue, 각 10-15줄) → `## JSON Scripting Patterns` (2-3개) → `## Reference Loading Guide` (vitest 스타일 테이블) +- inline 명령어 카탈로그(~200줄)를 기존 3개 reference 파일에 도메인별 분배 (새 `commands.md` 생성 대신 기존 `prs-issues.md`, `repos-actions.md`, `auth-search-api.md` 활용) +- Quick Start 설치/인증 명령은 `references/auth-search-api.md`에 보존. Quick Aliases 섹션은 완전 제거. +- Common Troubleshooting 테이블(8줄)은 본문에 유지 (에러 대응에 유용, 컴팩트) +- **재구성 시 low-freedom 유지**: gh-cli는 정확한 명령어 템플릿이 필요한 도메인. 행동 가이드 전환 후에도 Core Workflows 내에 구체적 명령어 예시를 반드시 포함. + +**(c) P6: 버전 번호 제거** — "2.85.0+" 삭제 + +**(d) P7: `## Contents` ToC 추가** + +**(e) P8: vitest 스타일 lazy loading 테이블** +```markdown +| Situation | Load | +|-----------|------| +| PR 생성/리뷰/머지 상세 옵션 | `references/prs-issues.md` | +| Repo/Actions/Workflow 관리 | `references/repos-actions.md` | +| 인증/검색/API 호출 | `references/auth-search-api.md` | +``` + +**(f) 재구성 검증**: 수정 전/후 skill-review re-review로 warning 수 비교. re-review에서 기존보다 나빠지면 해당 커밋 revert. + +### 4. personal-tutor + +**파일:** `plugins/personal-tutor/skills/personal-tutor/SKILL.md` + +**(신규) description 개선** — 현재 141자로 지나치게 모호. 도메인 경계와 부정 트리거 추가: +```yaml +description: > + Use when the user wants to learn a technical topic through structured, + multi-session tutoring with prerequisite tracking and knowledge graphs. + Activates on "I want to learn X", "teach me X", "let's study X", or + resuming a previous learning session. Do NOT activate for quick reference + lookups or one-off coding questions — only for sustained learning goals. +``` +검증: ~340자 (≤500 PASS). "structured, multi-session tutoring"으로 quick lookup과 구분. "Do NOT" 부정 경계 추가. + +- **P8**: Phase 1에 lazy loading 지시 추가 — `Read knowledge-graph-template.md only when creating a new knowledge graph (first session for a topic).` +- topic 이름 정규화 규칙 추가 (Session Start에 배치) +- knowledge graph 노드 상한 10-15개 (Phase 1에 배치) +- quiz 실패 시 상태 전이 명시 (Phase 5 Upgrade rules, "## Phase 5: Archive" line 72 이후에 배치) +- Early Session Exit 섹션 추가 (Iron Rules 앞에 배치) + +> 참고: `knowledge-graph-template.md`가 `references/` 밖(SKILL.md 형제 위치)에 있음. 관례상 `references/`에 넣는 것이 좋으나, 이번 수정 범위에서는 이동하지 않음 (별도 이슈로 분리). + +### 5. library-analyzer + +**파일:** `plugins/library-analyzer/skills/library-analyzer/SKILL.md` + +- **P5**: Step 2 (line 70)에 context 크기 제한 명시 (readme 500줄, file_tree 300항목, wiki_content 800줄, 총 15,000자) +- **P8**: Step 4 (line 189)에 `Read references/output-template.md at this point for the report template.` 추가 +- URL mode context bundle 매핑 규칙 추가 (deepwiki-cli output → context bundle 필드 매핑) + +### 6. vitest (변경 없음) + +변경하지 않는다. 3개 warning은 모두 naming convention 관련: +- 체크리스트 §3.1: skill name이 gerund 형식이 아님 ("vitest" vs "testing-with-vitest") +- 체크리스트 §3.2: 이름이 tool명 그대로 +- 체크리스트 §3.3: action이 아닌 domain 반영 + +이는 tool-wrapper 스킬의 관례적 예외이며, skill-review checklist §3에 예외 주석을 추가하여 문서화한다. + +### 7. plugin-spec.md 동기화 (추가 작업) + +**파일:** `docs/contributors/plugin-spec.md` + +`"This skill should be used when..."` → `"Use when..."` 으로 변경. **2곳** 존재: +- line 118 (description 필드 설명 예시) +- line 132 (code-explainer 예시) + +둘 다 수정하여 실제 관행과 일치시킨다. 이를 하지 않으면 새 기여자가 spec을 따라 잘못된 형식을 사용하게 된다. + +--- + +## Done When + +### FAIL 해제 (필수) +- [ ] obsidian: frontmatter에 `name`과 `description`만 존재, 총 길이 ≤ 1024자 +- [ ] obsidian: description "Use when..."으로 시작, ≤ 500자 (`wc -c` 검증) +- [ ] obsidian: SKILL.md 본문 ≤ 230줄 (headless ~55줄 분리 + 에러핸들링 추가 감안) +- [ ] obsidian: 에러 핸들링/fallback 섹션 + "When NOT to Use" 섹션 존재, OS별 경로 포함 +- [ ] obsidian: `references/commands.md`에서 버전 번호 제거됨 +- [ ] obsidian: lazy loading 테이블 존재 +- [ ] deepwiki-cli: description "Use when..."으로 시작, "deepwiki-cli" 트리거 키워드 포함 +- [ ] deepwiki-cli: plugin.json `author.github` = "minsoo-web" +- [ ] deepwiki-cli: "When NOT to Use" + Error Handling 섹션 존재 + +### 품질 향상 +- [ ] gh-cli: description ≤ 500자, "Do NOT" 부정 경계 포함 +- [ ] gh-cli: 행동 가이드 형식으로 재구성, SKILL.md 80-150줄, low-freedom 명령어 예시 유지 +- [ ] gh-cli: "2.85.0+" 제거, ToC 존재, lazy loading 테이블 존재 (3개 기존 reference 파일 매핑) +- [ ] personal-tutor: description ≥ 300자로 확장, "Do NOT" 부정 경계 포함 +- [ ] personal-tutor: topic 정규화, 노드 상한, quiz 실패 전이, lazy loading 지시, Early Session Exit 존재 +- [ ] library-analyzer: URL mode 매핑 규칙, output-template lazy loading, context 크기 제한 존재 +- [ ] skill-review: YAML 유효성 + 깨진 참조 체크 항목 존재, tool-wrapper 예외 blockquote로 문서화 +- [ ] plugin-spec.md: 2곳 모두 "Use when..." 형식으로 업데이트됨 + +### Success Metrics +- FAIL 플러그인: 2 → 0 +- 전체 Error: 5 → 0 +- 전체 Warning: 35 → ≤12 (66% 감소) + +### 검증 흐름 +1. **CP0** (skill-review 수정 직후): 새 체크 항목으로 7개 전부 pre-flight → 예상치 못한 새 ERROR 없음 확인 +2. **CP1** (각 플러그인 수정 직후): description 길이(`wc -c`), frontmatter 유효성, 참조 파일 존재 개별 확인 +3. **CP2** (전체 완료 후): 업데이트된 checklist로 7개 전부 re-review 실행, success metrics 확인 + +--- + +## Risks + +- **gh-cli 재구성**: 가장 높은 리스크. 수정 전/후 skill-review로 warning 수 비교, 악화 시 revert. 별도 A/B eval 인프라는 불필요. +- **obsidian 한국어 트리거 감소**: 핵심 2~3개만 선별 유지. "graph view" 등 Obsidian 고유 용어는 복원하여 활성화 정확도 유지. +- **새 체크리스트 항목의 부작용**: CP0 pre-flight로 조기 발견. vitest YAML은 유효하고 references 4개 파일 모두 존재 확인됨. +- **deepwiki-cli author.name**: `"minsoo.web"`은 표시 이름으로 유효할 수 있음 — `author.github`만 확실히 수정, `author.name`은 구현 시 확인 후 결정. + +## Sources + +- 리뷰 체크리스트: `plugins/skill-review/skills/skill-review/references/checklist.md` +- 플러그인 스펙: `docs/contributors/plugin-spec.md` +- skill 작성 가이드: `compound-engineering:create-agent-skills` skill +- 기술 리뷰: architecture-strategist, code-simplicity-reviewer, critic, specflow-analyzer +- deepen 리서치: create-agent-skills 검증, 파일 상태 검증, description 최적화 분석 diff --git a/docs/solutions/quality-maintenance/skill-plugin-quality-review-fixes.md b/docs/solutions/quality-maintenance/skill-plugin-quality-review-fixes.md new file mode 100644 index 0000000..7fcac6a --- /dev/null +++ b/docs/solutions/quality-maintenance/skill-plugin-quality-review-fixes.md @@ -0,0 +1,83 @@ +--- +title: "Systematic quality fixes for 7 Claude Code skill plugins failing skill-review eval" +category: quality-maintenance +tags: [skill-plugins, code-review, linting, frontmatter, error-handling, lazy-loading, documentation] +module: skill-review +symptom: "2 plugins (obsidian, deepwiki-cli) FAIL with 5 errors; 5 plugins NEEDS WORK with 35 warnings; issues include wrong description format, oversized frontmatter, missing error handling, cheat-sheet style docs, version numbers in docs, missing lazy loading tables, vague descriptions" +root_cause: "Skill plugins were authored without consistent adherence to the skill-review checklist standards — description format, frontmatter size limits, error handling patterns, behavioral guide structure, and lazy loading conventions were not enforced during initial development" +date_solved: 2026-03-09 +severity: medium +--- + +# Systematic Skill Plugin Quality Fixes (P1-P8) + +## Root Cause + +Seven Claude Code skill plugins failed quality review because they were authored without following the established best practices checklist. The specific violations fell into several categories: + +- **Description format**: Descriptions didn't use the "Use when..." trigger format that Claude uses for activation decisions. Vague descriptions failed to specify trigger boundaries. +- **Invalid frontmatter**: Obsidian had an extra `metadata.openclaw` block (only `name` and `description` are allowed in skill frontmatter). +- **Oversized content**: gh-cli was a 299-line cheat sheet instead of an 80-150 line behavioral guide. +- **Missing operational sections**: No error handling or fallback strategies defined. +- **Hard-coded version numbers**: Time-sensitive information embedded directly rather than referenced dynamically. +- **Missing lazy loading**: Reference tables that should have been lazy-loaded were inlined. + +## Solution + +The fix followed a prerequisite-first execution order across four phases: + +**Phase 1 — Update the review standard first.** Modified the skill-review checklist itself before touching any plugins. Added three new checks: YAML validity (Error severity), broken reference detection (Error severity), and a tool-wrapper naming exception (documented via blockquote). This ensured all subsequent fixes would be validated against the updated standard. + +**Phase 2 — Pre-flight validation.** Ran CP0 (pre-flight) on all 7 plugins against the new checklist to confirm no unexpected errors and to baseline the known issues. + +**Phase 3 — Fix all 6 plugins in parallel** (4 via delegated agents, 2 directly): + +| Plugin | Key Changes | +|---|---| +| **deepwiki-cli** | Rewrote description to "Use when..." format, added "When NOT to Use" section, added Error Handling section, fixed plugin.json typo | +| **obsidian** | Cleaned frontmatter (removed `metadata.openclaw`), rewrote description (873 to ~474 chars), removed inline headless section (293 to 134 lines), added error handling with OS-specific paths | +| **gh-cli** | Full restructure (299 to 115 lines), moved command references to separate lazy-loaded files, added behavioral guidelines | +| **personal-tutor** | Expanded description (141 to ~340 chars), added topic normalization rules, node limits, quiz failure transitions | +| **library-analyzer** | Added context size limits, URL mode mapping, output-template lazy loading | +| **plugin-spec.md** | Updated 3 instances of old description format to match new standard | + +**Phase 4 — Version bump and verify.** Patch-bumped all changed plugins, then ran CP2 (final verification) confirming all checks passed. + +### Results + +| Metric | Before | After | +|--------|--------|-------| +| FAIL plugins | 2 | 0 | +| Errors | 5 | 0 | +| Warnings | 35 | ≤12 | + +## Key Technique + +**Prerequisite-first execution**: Modify the review checklist before fixing the plugins, so every fix is validated against the updated standard in the same pass. This eliminates the risk of fixing plugins to an outdated standard and having to re-fix them after the checklist is updated. The final verification pass (CP2) is authoritative — if it passes, the plugins conform to the new standard, not just the old one. + +## Prevention Checklist + +Before merging any PR that modifies a `SKILL.md` file, verify each item: + +- [ ] **Run skill-review eval**: Execute the skill-review analyzer on every modified `SKILL.md`. Zero errors must be the merge threshold. +- [ ] **Description starts with "Use when..."**: The description field must open with a trigger phrase. Follow with trigger nouns/verbs, then a "Do NOT trigger for..." negative boundary clause. +- [ ] **Frontmatter contains only `name` and `description`**: No `version`, `author`, `tags`, or any other metadata fields in YAML frontmatter. +- [ ] **Body is 150 lines or fewer**: If the skill needs heavy reference material, move it into a `references/` directory. +- [ ] **Lazy loading table present when `references/` exists**: Include a "References Loading Guide" table mapping each reference file to when to load it. +- [ ] **No hard-coded version numbers**: Search the file for semver patterns. Instruct the agent to check at runtime instead. +- [ ] **Tool-wrapper naming is intentional**: Skills named after tools (vitest, gh-cli) are acceptable convention. Generic skills should not be named after a single tool. + +## Anti-Patterns to Avoid + +1. **The Vague Description**: `"Manages deployments"` — too broad, causes false activations. Fix: add trigger conditions and negative boundaries. +2. **The Metadata-Stuffed Frontmatter**: Extra fields create maintenance burden and token cost. Fix: strip to `name` and `description` only. +3. **The 400-Line Mega-Skill**: Every activation loads the entire file. Fix: keep body under 150 lines, move references out. +4. **The Hard-Coded Version**: Version numbers go stale within weeks. Fix: instruct runtime checking. +5. **The Cheat Sheet Masquerading as a Skill**: Tables of commands without behavioral instructions. Fix: lead with behavioral guidelines, move reference tables to `references/`. + +## Related References + +- **Plan**: `docs/plans/2026-03-08-refactor-skill-quality-improvements-plan.md` +- **Checklist**: `plugins/skill-review/skills/skill-review/references/checklist.md` +- **Plugin spec**: `docs/contributors/plugin-spec.md` +- **PR**: https://github.com/hamsurang/kit/pull/15 diff --git a/plugins/deepwiki-cli/.claude-plugin/plugin.json b/plugins/deepwiki-cli/.claude-plugin/plugin.json index 52d9c5f..0ae734f 100644 --- a/plugins/deepwiki-cli/.claude-plugin/plugin.json +++ b/plugins/deepwiki-cli/.claude-plugin/plugin.json @@ -1,10 +1,10 @@ { "name": "deepwiki-cli", - "version": "1.0.0", + "version": "1.0.1", "description": "Query GitHub repository wikis via DeepWiki CLI without MCP token overhead.", "author": { "name": "minsoo.web", - "github": "minsoo.web" + "github": "minsoo-web" }, "license": "MIT", "keywords": ["deepwiki", "github", "wiki", "token-saving"], diff --git a/plugins/deepwiki-cli/skills/deepwiki-cli/SKILL.md b/plugins/deepwiki-cli/skills/deepwiki-cli/SKILL.md index 650f5ec..6e5b4c0 100644 --- a/plugins/deepwiki-cli/skills/deepwiki-cli/SKILL.md +++ b/plugins/deepwiki-cli/skills/deepwiki-cli/SKILL.md @@ -1,10 +1,11 @@ --- name: deepwiki-cli description: > - Use deepwiki-cli to query GitHub repository documentation without MCP overhead. - Activates when the user asks questions about a specific GitHub repository - (owner/repo format), asks how a library or framework works, or needs to - understand a codebase they haven't read locally. + Use when the user asks questions about a GitHub repository's architecture, + API, or internals, or mentions deepwiki-cli or DeepWiki. Activates when + the user needs to understand a codebase they haven't cloned locally, or + asks how a library or framework works. Do NOT activate for local codebases + already accessible on disk or private repositories. --- # deepwiki-cli Skill @@ -54,6 +55,22 @@ cargo install deepwiki-cli If the binary is not found, inform the user to install it first. +## When NOT to Use + +- Repository is already cloned locally — use Glob/Grep/Read tools directly +- Repository is private — deepwiki-cli only works with public repositories +- User is asking about their own code in the current working directory + +## Error Handling + +If `deepwiki-cli` is not installed or a command fails: + +1. Check if the binary exists: `which deepwiki-cli` +2. If not found, tell the user to install: `cargo install deepwiki-cli` +3. If the repository is not found, verify the owner/repo format +4. If the command times out, try `deepwiki-cli structure` first (lighter query), then ask specific questions +5. As a last resort, fall back to web search for the repository's documentation + ## Why This Saves Tokens Using the CLI via `Bash` outputs only the result text to Claude's context. diff --git a/plugins/gh-cli/.claude-plugin/plugin.json b/plugins/gh-cli/.claude-plugin/plugin.json index eb7398b..5697eb7 100644 --- a/plugins/gh-cli/.claude-plugin/plugin.json +++ b/plugins/gh-cli/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "gh-cli", - "version": "1.0.0", + "version": "1.0.1", "description": "Auto-invoked skill for working with GitHub from the command line using the gh CLI tool", "author": { "name": "minsoo.web", diff --git a/plugins/gh-cli/skills/gh-cli/SKILL.md b/plugins/gh-cli/skills/gh-cli/SKILL.md index 5b521e1..bd476de 100644 --- a/plugins/gh-cli/skills/gh-cli/SKILL.md +++ b/plugins/gh-cli/skills/gh-cli/SKILL.md @@ -1,283 +1,101 @@ --- name: gh-cli description: > - Use when working with GitHub from the command line using the gh CLI tool. Triggers on - "create PR", "open pull request", "gh command", "GitHub CLI", "list issues", "check CI", - "merge PR", "view workflow run", "gh auth", "clone repo", "fork repo", "create issue", - "review PR", "close issue", "release", or any GitHub operation from the terminal. - Always use this skill when the user wants to interact with GitHub repositories, - pull requests, issues, releases, or GitHub Actions via the command line — even if - they don't explicitly say "gh" or "GitHub CLI". + Use when working with GitHub from the command line using the gh CLI tool. + Trigger on "create PR", "open pull request", "list issues", "check CI", + "merge PR", "review PR", "create issue", "release", "gh auth", "clone repo", + "fork repo", "close issue", "view workflow run", or any GitHub operation + from the terminal. Do NOT trigger for GitHub web UI actions or direct REST + API calls without gh. --- -# GitHub CLI (gh) — Practical Workflow Guide +# GitHub CLI (gh) — Workflow Guide -The `gh` CLI lets you do everything GitHub without leaving the terminal. +## Contents -> **Version:** 2.85.0+ | **Docs:** [cli.github.com](https://cli.github.com) -> -> For detailed command options, see the `references/` files linked throughout. +- [Behavior Guidelines](#behavior-guidelines) +- [Core Workflows](#core-workflows) +- [JSON Scripting Patterns](#json-scripting-patterns) +- [Common Troubleshooting](#common-troubleshooting) +- [References Loading Guide](#references-loading-guide) ---- - -## Quick Start - -```bash -# Install -brew install gh # macOS -sudo apt install gh # Ubuntu/Debian -winget install --id GitHub.cli # Windows +## Behavior Guidelines -# Authenticate -gh auth login # Interactive (recommended) -gh auth status # Verify login -``` +1. **Always check auth first** — run `gh auth status` before complex operations. If not logged in, run `gh auth login`. +2. **Prefer `--json` + `--jq` for scripting** — never parse human-readable gh output with grep/awk. Use structured JSON output. +3. **Use `--repo owner/repo` for cross-repo ops** — avoid cd-ing into directories when you can target repos directly. +4. **Prefer `gh pr create` over manual push + web UI** — it handles branch pushing, PR creation, and linking in one step. +5. **Use `--web` to hand off to browser** — when the user needs to fill forms or review visually, open in browser instead of guessing. ---- +## Core Workflows -## Pull Requests - -### Create a PR +### Pull Requests ```bash -# Interactive — gh fills in title/body from commit messages +# Create PR (interactive — fills title/body from commits) gh pr create -# One-liner +# Create with details gh pr create --title "feat: add dark mode" --body "Closes #42" # Draft PR gh pr create --draft --title "WIP: refactor auth" -# Target a specific base branch -gh pr create --base develop --title "feat: add feature" - -# Open the new PR in browser immediately -gh pr create --web -``` - -### Review & Merge - -```bash -# List open PRs in current repo -gh pr list - -# View PR details (with diff) -gh pr view 123 -gh pr view 123 --web # Open in browser - -# Check out a PR locally -gh pr checkout 123 - -# Review: approve / request changes / comment +# Review and merge gh pr review 123 --approve -gh pr review 123 --request-changes --body "Please add tests" -gh pr review 123 --comment --body "Looks good, but minor nit below" - -# Merge (default: merge commit) -gh pr merge 123 -gh pr merge 123 --squash # Squash merge -gh pr merge 123 --rebase # Rebase merge -gh pr merge 123 --auto # Auto-merge when checks pass -``` - -### PR Status & Search - -```bash -# PRs assigned to you or mentioning you -gh pr list --author "@me" -gh pr list --assignee "@me" -gh pr list --search "review-requested:@me" +gh pr merge 123 --squash --auto -# Filter by label or state -gh pr list --label "bug" --state open -gh pr list --state merged --limit 20 - -# Show all checks for a PR +# Check PR status gh pr checks 123 +gh pr list --author "@me" ``` ---- - -## Issues - -### Create & Edit - -```bash -# Interactive -gh issue create - -# One-liner -gh issue create --title "Bug: login fails on Safari" --body "Steps to reproduce..." - -# With labels and assignee -gh issue create --title "feat: dark mode" --label "enhancement" --assignee "@me" - -# Edit an issue -gh issue edit 42 --title "Updated title" --add-label "priority:high" -``` - -### List & Close +### Issues ```bash -# List open issues -gh issue list +# Create issue +gh issue create --title "Bug: login fails" --label "bug" --assignee "@me" -# Filter -gh issue list --label "bug" -gh issue list --assignee "@me" +# List and filter +gh issue list --label "bug" --state open gh issue list --search "is:open label:bug created:>2024-01-01" -# View issue -gh issue view 42 -gh issue view 42 --web - -# Close / reopen -gh issue close 42 +# Close with comment gh issue close 42 --comment "Fixed in #123" -gh issue reopen 42 ``` ---- - -## Repositories +### CI / Actions ```bash -# Clone a repo -gh repo clone owner/repo -gh repo clone owner/repo -- --depth 1 # Shallow clone - -# Fork and clone in one step -gh repo fork owner/repo --clone - -# Create a new repo -gh repo create my-app --public --clone -gh repo create my-app --private --description "My new project" - -# View repo info -gh repo view -gh repo view owner/repo --web - -# List repos for a user/org -gh repo list # Your repos -gh repo list my-org --limit 50 # Org repos -``` - ---- - -## GitHub Actions +# Watch current run +gh run watch -```bash -# List recent workflow runs -gh run list -gh run list --workflow ci.yml +# List failures gh run list --branch main --status failure --limit 10 -# Watch a run in real time -gh run watch - -# View run logs -gh run view 12345678 +# View logs gh run view 12345678 --log -# Re-run failed jobs only +# Re-run failed jobs gh run rerun 12345678 --failed -# Trigger a workflow manually -gh workflow run ci.yml +# Trigger workflow manually gh workflow run deploy.yml --field environment=staging - -# List workflows -gh workflow list -gh workflow enable ci.yml -gh workflow disable old-workflow.yml ``` ---- - -## Releases - -```bash -# List releases -gh release list - -# View latest release -gh release view - -# Create a release -gh release create v1.2.0 -gh release create v1.2.0 --title "v1.2.0 — Dark Mode" --notes "Added dark mode support" -gh release create v1.2.0 ./dist/*.tar.gz # Attach assets - -# Upload additional assets to an existing release -gh release upload v1.2.0 ./dist/app.zip -``` - ---- - -## JSON Output & Scripting - -`gh` returns rich JSON via `--json`. Pair with `jq` for powerful filtering. +## JSON Scripting Patterns ```bash # List PR titles and numbers gh pr list --json number,title --jq '.[] | "\(.number): \(.title)"' -# Get PR's head branch name -gh pr view 123 --json headRefName --jq '.headRefName' - # Check if all PR checks passed gh pr checks 123 --json name,state --jq '[.[] | select(.state != "SUCCESS")] | length == 0' -# Get issue labels -gh issue view 42 --json labels --jq '.labels[].name' - # Find failing workflow runs gh run list --json status,name,url --jq '.[] | select(.status == "failure") | .url' - -# Count open PRs by author -gh pr list --state open --json author --jq 'group_by(.author.login) | map({author: .[0].author.login, count: length})' ``` ---- - -## Useful Global Flags - -| Flag | Description | -|------|-------------| -| `--repo owner/repo` | Target a specific repo (skip cd) | -| `--json field1,field2` | Return JSON for scripting | -| `--jq ` | Filter JSON with jq expression | -| `--web` | Open in browser | -| `--paginate` | Fetch all pages (use with `--json`) | -| `--limit N` | Limit results (default varies) | - -```bash -# Operate on a repo without cd-ing into it -gh pr list --repo facebook/react --limit 5 - -# Paginate all issues as JSON -gh issue list --paginate --json number,title,state -``` - ---- - -## Quick Aliases (save typing) - -```bash -# Set up convenient aliases -gh alias set prc 'pr create --web' -gh alias set prl 'pr list --assignee @me' -gh alias set isl 'issue list --assignee @me' - -# Use them -gh prc # open PR creation in browser -gh prl # list your PRs -gh isl # list your issues -``` - ---- - ## Common Troubleshooting | Problem | Fix | @@ -288,12 +106,10 @@ gh isl # list your issues | Wrong repo targeted | Add `--repo owner/repo` or `cd` into the repo | | Stale token | `gh auth refresh` | ---- - -## More Detail - -For exhaustive flag lists and advanced options, see: +## References Loading Guide -- [`references/prs-issues.md`](references/prs-issues.md) — PR reviews, issue templates, milestones, projects -- [`references/repos-actions.md`](references/repos-actions.md) — repo settings, Actions secrets/variables, caches, artifacts -- [`references/auth-search-api.md`](references/auth-search-api.md) — auth flows, search syntax, direct API calls +| Situation | Load | +|-----------|------| +| PR creation/review/merge details, issue templates, milestones | `references/prs-issues.md` | +| Repo/Actions/Workflow management, secrets, caches | `references/repos-actions.md` | +| Authentication, search syntax, API calls | `references/auth-search-api.md` | diff --git a/plugins/gh-cli/skills/gh-cli/references/auth-search-api.md b/plugins/gh-cli/skills/gh-cli/references/auth-search-api.md index a02de68..a884e35 100644 --- a/plugins/gh-cli/skills/gh-cli/references/auth-search-api.md +++ b/plugins/gh-cli/skills/gh-cli/references/auth-search-api.md @@ -1,5 +1,17 @@ # Auth, Search & API — Extended Reference +## Installation + +```bash +brew install gh # macOS +sudo apt install gh # Ubuntu/Debian +winget install --id GitHub.cli # Windows +``` + +See [cli.github.com](https://cli.github.com) for other platforms. + +--- + ## Authentication ### gh auth login diff --git a/plugins/gh-cli/skills/gh-cli/references/repos-actions.md b/plugins/gh-cli/skills/gh-cli/references/repos-actions.md index 0ec9217..b051627 100644 --- a/plugins/gh-cli/skills/gh-cli/references/repos-actions.md +++ b/plugins/gh-cli/skills/gh-cli/references/repos-actions.md @@ -222,3 +222,30 @@ gh api repos/{owner}/{repo}/environments/production \ --method PUT \ --field wait_timer=5 ``` + +--- + +## Releases + +```bash +# List releases +gh release list + +# View latest release +gh release view + +# Create a release +gh release create v1.2.0 +gh release create v1.2.0 --title "v1.2.0 — Dark Mode" --notes "Added dark mode support" +gh release create v1.2.0 ./dist/*.tar.gz # Attach assets +gh release create v1.2.0 --draft # Draft release +gh release create v1.2.0 --prerelease # Mark as pre-release +gh release create v1.2.0 --generate-notes # Auto-generate release notes + +# Upload additional assets to an existing release +gh release upload v1.2.0 ./dist/app.zip + +# Edit / delete +gh release edit v1.2.0 --title "v1.2.0 — Hotfix" +gh release delete v1.2.0 --confirm +``` diff --git a/plugins/library-analyzer/.claude-plugin/plugin.json b/plugins/library-analyzer/.claude-plugin/plugin.json index b1fea30..a81c1e4 100644 --- a/plugins/library-analyzer/.claude-plugin/plugin.json +++ b/plugins/library-analyzer/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "library-analyzer", - "version": "1.0.0", + "version": "1.0.1", "description": "Analyze open-source libraries for contribution readiness with parallel agents", "author": { "name": "minsoo.web", diff --git a/plugins/library-analyzer/skills/library-analyzer/SKILL.md b/plugins/library-analyzer/skills/library-analyzer/SKILL.md index 922c3be..96e46f9 100644 --- a/plugins/library-analyzer/skills/library-analyzer/SKILL.md +++ b/plugins/library-analyzer/skills/library-analyzer/SKILL.md @@ -72,6 +72,12 @@ Announce what you will analyze: Collect data into a **context bundle** before launching any agents. Read `references/agent-prompts.md` at this point for the agent prompt templates. +**Context size limits** — cap each field to keep total context under 15,000 characters: +- `readme`: first 500 lines +- `file_tree`: max 300 entries (top 3 directory levels) +- `wiki_content` (URL mode): first 800 lines +- Truncate with a note: `(truncated at N lines — full content available via direct access)` + ### URL Mode (deepwiki-cli) ```bash @@ -82,6 +88,11 @@ deepwiki-cli structure deepwiki-cli read ``` +**Map deepwiki-cli output to context bundle fields:** +- `deepwiki-cli structure` output → `file_tree` +- `deepwiki-cli read` output → split into `readme` (first section) + `wiki_content` (remainder) +- If `deepwiki-cli ask` is used for specific questions → append answers to relevant fields + ### Error Recovery (both modes) If `deepwiki-cli` or `gh` commands fail (timeout, network error, rate limit, permission denied): @@ -188,6 +199,8 @@ directory listing, etc. If a field is `null`, replace the placeholder with: ## Step 4: Result Assembly +Read `references/output-template.md` at this point for the report template. + After all 3 agents return: 1. **Check each result.** For any agent that failed or returned empty: diff --git a/plugins/obsidian/.claude-plugin/plugin.json b/plugins/obsidian/.claude-plugin/plugin.json index a986bc9..098f5bb 100644 --- a/plugins/obsidian/.claude-plugin/plugin.json +++ b/plugins/obsidian/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "obsidian", - "version": "1.0.0", + "version": "1.0.1", "description": "Work with Obsidian vaults — search, create, edit, organize notes and manage frontmatter via obsidian-cli and direct file access", "author": { "name": "minsoo.web", diff --git a/plugins/obsidian/skills/obsidian/SKILL.md b/plugins/obsidian/skills/obsidian/SKILL.md index 82e72a3..e5fec68 100644 --- a/plugins/obsidian/skills/obsidian/SKILL.md +++ b/plugins/obsidian/skills/obsidian/SKILL.md @@ -1,293 +1,134 @@ --- name: obsidian description: > - Work with Obsidian vaults — search, create, edit, move, and organize Markdown - notes using obsidian-cli and direct file access. Trigger this skill when the user - mentions Obsidian, vault (보관함), daily notes (데일리 노트), wikilinks ([[link]]), - frontmatter, backlinks, graph view, canvas, knowledge base, PKM, Zettelkasten, - or obsidian-cli. Also trigger when the user wants to search/create/edit/move notes - in their Obsidian vault, manage YAML frontmatter (tags, status, metadata), open - today's daily note, rename notes with link updates, explore vault structure, - or sync vaults via Obsidian Headless (`ob` CLI) — even if they just say - "내 노트에서 찾아줘", "메모 정리해줘", "vault 동기화", or reference a vault path. - Do NOT trigger for generic Markdown file editing (README.md, docs/), code - documentation, or other note-taking apps (Notion, Bear, Apple Notes). -metadata: - openclaw: - emoji: "💎" - requires: - bins: ["obsidian-cli"] - install: - - id: brew - kind: brew - formula: yakitrak/yakitrak/obsidian-cli - bins: ["obsidian-cli"] - label: "Install obsidian-cli (brew)" + Use when the user mentions Obsidian, vault, daily notes, wikilinks, + frontmatter, backlinks, graph view, PKM, Zettelkasten, or obsidian-cli. + Activates for searching, creating, editing, moving notes in an Obsidian + vault, managing YAML frontmatter, or syncing vaults via Obsidian Headless + (ob CLI). Also trigger on Korean phrases like "내 노트에서 찾아줘" or + "vault 동기화". Do NOT trigger for generic Markdown editing (README, docs) + or other note apps (Notion, Bear). --- # Obsidian Vault Skill -Obsidian vault = a normal folder of Markdown files on disk. Claude Code can read and edit these files directly — use `obsidian-cli` only when its features add real value (search, link-aware move/rename, frontmatter ops, opening in Obsidian). +## Contents -## Tool Selection Guide - -Pick the right tool for each task: - -| Task | Best tool | Why | -|------|-----------|-----| -| Read note content | `Read` tool | Direct, fast, no overhead | -| Edit note content | `Edit` tool | Precise diffs, preserves formatting | -| Create new note (no need to open) | `Write` tool | Direct file creation | -| Create note + open in Obsidian | `obsidian-cli create --open` | Triggers Obsidian URI | -| Search note names | `obsidian-cli search "query"` | Fuzzy matching across vault | -| Search inside notes | `obsidian-cli search-content "query"` | Shows snippets + line numbers | -| Broad content search | `Grep` tool on vault path | Regex support, faster for patterns | -| Find notes by name pattern | `Glob` tool on vault path | Pattern matching (e.g., `**/*meeting*.md`) | -| Move/rename note | `obsidian-cli move` | Updates `[[wikilinks]]` across vault | -| View/edit frontmatter | `obsidian-cli frontmatter` | Structured YAML manipulation | -| Open daily note | `obsidian-cli daily` | Creates if needed, opens in Obsidian | -| List vault contents | `obsidian-cli list` | Tree view of vault structure | -| Delete note | `obsidian-cli delete` | Safe removal | -| Sync vault (no desktop) | `ob sync` | Headless sync without Obsidian app | -| Check sync status | `ob sync-status` | Show pending changes | - -## Step 1: Find the Vault - -Before any vault operation, resolve the vault path. Never hardcode paths. - -```bash -# If default vault is set: -obsidian-cli print-default --path-only - -# If no default is set, read the Obsidian config directly: -cat ~/Library/Application\ Support/obsidian/obsidian.json -``` - -The config JSON has a `vaults` object — each entry has a `path` and `open` field. Use the vault with `"open": true`. Multiple vaults are common (work/personal, iCloud/local). - -If the user hasn't set a default and has multiple vaults, ask which one to use. Then set it: - -```bash -obsidian-cli set-default "" -``` - -## Step 2: Work with Notes - -### Reading notes - -Use the `Read` tool directly on the `.md` file — it's faster and keeps context lean: - -``` -Read: /path/to/vault/Projects/my-note.md -``` - -For reading with backlink context, use obsidian-cli: - -```bash -obsidian-cli print "Projects/my-note" --mentions -``` - -### Creating notes - -For simple note creation, use `Write` tool directly: - -``` -Write: /path/to/vault/Folder/New Note.md -Content: "# New Note\n\nContent here..." -``` - -To create AND open in Obsidian: - -```bash -obsidian-cli create "Folder/New Note" --content "# New Note" --open -``` - -To append to an existing note: - -```bash -obsidian-cli create "Folder/Existing Note" --content "Appended text" --append -``` - -### Editing notes - -Use the `Edit` tool for precise content changes — it shows clear diffs and preserves formatting. This is almost always better than obsidian-cli for content modification. - -### Searching - -For finding notes by name: - -```bash -obsidian-cli search "project plan" -``` - -For searching inside note content: - -```bash -obsidian-cli search-content "API design" -``` +- [Tool Selection Guide](#tool-selection-guide) +- [Find the Vault](#find-the-vault) +- [Working with Notes](#working-with-notes) +- [Multi-Vault Usage](#multi-vault-usage) +- [Common Patterns](#common-patterns) +- [When NOT to Use](#when-not-to-use) +- [Error Handling](#error-handling) +- [Obsidian Headless](#obsidian-headless) +- [CLI Reference](#cli-reference) -For regex or pattern-based search, use `Grep` directly on the vault path — it's faster and supports regex: +Obsidian vault = a normal folder of Markdown files on disk. Use `obsidian-cli` only when its features add real value (search, link-aware move/rename, frontmatter ops, opening in Obsidian). -``` -Grep: pattern="TODO|FIXME" path="/path/to/vault" -``` - -For finding notes by filename pattern: +## Tool Selection Guide -``` -Glob: pattern="**/daily/**/*.md" path="/path/to/vault" -``` +| Task | Best tool | +|------|-----------| +| Read note content | `Read` tool | +| Edit note content | `Edit` tool | +| Create new note | `Write` tool | +| Create note + open in Obsidian | `obsidian-cli create --open` | +| Search note names | `obsidian-cli search "query"` | +| Search inside notes | `obsidian-cli search-content "query"` | +| Broad content search / regex | `Grep` tool on vault path | +| Find notes by name pattern | `Glob` tool on vault path | +| Move/rename note (updates wikilinks) | `obsidian-cli move` | +| View/edit frontmatter | `obsidian-cli frontmatter` | +| Open daily note | `obsidian-cli daily` | +| List vault contents | `obsidian-cli list` | +| Delete note | `obsidian-cli delete` | +| Sync vault (no desktop) | `ob sync` | -### Moving / Renaming +## Find the Vault -Always use `obsidian-cli move` — it updates `[[wikilinks]]` and Markdown links across the entire vault, which plain `mv` cannot do: +Never hardcode paths. Resolve the vault path first: ```bash -obsidian-cli move "Old Folder/note" "New Folder/note" +obsidian-cli print-default --path-only # if default vault is set +cat ~/Library/Application\ Support/obsidian/obsidian.json # otherwise ``` -### Frontmatter +The config JSON has a `vaults` object; use the entry with `"open": true`. If multiple vaults exist, ask the user which to use, then: `obsidian-cli set-default ""` -View frontmatter: +## Working with Notes -```bash -obsidian-cli frontmatter "My Note" --print -``` +**Read**: Use `Read` tool on the `.md` file directly. For backlink context: `obsidian-cli print "Note" --mentions` -Edit a frontmatter key: +**Create**: Use `Write` tool for simple creation. To also open in Obsidian: `obsidian-cli create "Folder/Note" --content "..." --open`. To append: add `--append`. -```bash -obsidian-cli frontmatter "My Note" --edit --key "status" --value "done" -``` +**Edit**: Use `Edit` tool — precise diffs, preserves formatting. Prefer over obsidian-cli for content changes. -Delete a frontmatter key: +**Search by name**: `obsidian-cli search "query"` — fuzzy match across vault. +**Search content**: `obsidian-cli search-content "query"` — snippets + line numbers. +**Regex search**: Use `Grep` on vault path (faster, supports regex). +**Filename pattern**: Use `Glob` on vault path (e.g., `**/daily/**/*.md`). -```bash -obsidian-cli frontmatter "My Note" --delete --key "draft" -``` - -For bulk frontmatter operations across many notes, read files directly with `Read` and edit with `Edit` — it's more efficient than calling obsidian-cli per note. - -### Daily Notes +**Move/rename**: Always use `obsidian-cli move "Old/note" "New/note"` — updates `[[wikilinks]]` across vault. Plain `mv` cannot do this. +**Frontmatter**: ```bash -obsidian-cli daily +obsidian-cli frontmatter "Note" --print +obsidian-cli frontmatter "Note" --edit --key "status" --value "done" +obsidian-cli frontmatter "Note" --delete --key "draft" ``` +For bulk frontmatter ops across many notes, use `Read` + `Edit` directly — more efficient. -Creates today's daily note if it doesn't exist, then opens it in Obsidian. - -### Listing vault structure +**Daily note**: `obsidian-cli daily` — creates if needed, opens in Obsidian. -```bash -# List root of vault -obsidian-cli list - -# List a specific folder -obsidian-cli list "Projects" -``` +**List vault**: `obsidian-cli list` or `obsidian-cli list "Projects"` for a subfolder. -### Deleting notes - -```bash -obsidian-cli delete "Folder/note-to-delete" -``` +**Delete**: `obsidian-cli delete "Folder/note-to-delete"` ## Multi-Vault Usage -All obsidian-cli commands accept `--vault ` to target a specific vault: +All obsidian-cli commands accept `--vault `: ```bash obsidian-cli search "query" --vault "Work" obsidian-cli create "Note" --content "..." --vault "Personal" ``` -## Vault Structure (typical) - -``` -My Vault/ -├── .obsidian/ # Config + plugin settings (don't modify from scripts) -├── Daily Notes/ # Daily journal entries -├── Projects/ # Project-specific notes -├── Templates/ # Note templates -├── Attachments/ # Images, PDFs, etc. -└── *.md # Individual notes -``` - -- Notes are plain `.md` files — any editor can read/write them -- `.obsidian/` contains workspace and plugin config — avoid modifying it -- `*.canvas` files are JSON-based Obsidian Canvas documents -- Attachments folder location is configured in Obsidian settings - ## Common Patterns -### Batch operations on notes - -When you need to update many notes (e.g., add a tag, fix links, update frontmatter), use `Glob` to find files, then `Read` + `Edit` for each — it's faster and more reliable than calling obsidian-cli repeatedly. - -### Creating linked notes - -When creating a set of related notes, use `Write` to create files and include `[[wikilinks]]` in the content. Obsidian will resolve the links automatically when the vault is opened. - -### Template-based creation - -If the vault has a Templates folder, read the template with `Read`, substitute placeholders, then write the new note with `Write`. - -## Obsidian Headless (`ob`) - -Obsidian Headless is a standalone CLI client for Obsidian Sync — no desktop app required. Useful for CI/CD, servers, automated backups, and agentic workflows. - -> **Headless vs obsidian-cli**: `obsidian-cli` controls the Obsidian desktop app from the terminal. `ob` (Obsidian Headless) is an independent client that syncs vaults without the desktop app. +**Batch note updates**: Use `Glob` to find files, then `Read` + `Edit` per file — faster than calling obsidian-cli repeatedly. -### Install +**Linked notes**: Use `Write` with `[[wikilinks]]` in content; Obsidian resolves them on open. -Requires Node.js 22+: +**Template-based creation**: `Read` the template, substitute placeholders, `Write` the new note. -```bash -npm install -g obsidian-headless -``` +## When NOT to Use -### Authentication +- Generic Markdown editing (README.md, CHANGELOG.md, docs/) — use Read/Edit tools directly +- Other note-taking apps (Notion, Bear, Apple Notes) — this skill is Obsidian-specific +- Code documentation or inline comments -```bash -ob login # Interactive login -ob login --email user@example.com # Non-interactive -ob login --email user@example.com --password "..." --mfa 123456 -ob logout # Clear credentials -``` +## Error Handling -### Vault Sync +If `obsidian-cli` is not installed: +- Fall back to direct file operations: use Glob to find notes, Read/Edit/Write to modify them +- Wikilink-aware move/rename won't work without obsidian-cli — warn the user -```bash -# List available vaults -ob sync-list-remote # Remote vaults on Obsidian Sync -ob sync-list-local # Locally configured vaults - -# Setup sync -ob sync-create-remote --name "My Vault" # Create new remote vault -ob sync-setup --path /path/to/vault # Link local path to remote vault -ob sync-config # Change sync configuration - -# Sync operations -ob sync # Sync the vault -ob sync-status # Show sync status (pending changes) -ob sync-unlink # Disconnect vault from sync -``` +OS-specific Obsidian config paths: +- **macOS**: `~/Library/Application Support/obsidian/obsidian.json` +- **Linux**: `~/.config/obsidian/obsidian.json` +- **Windows**: `%APPDATA%/obsidian/obsidian.json` -### When to use Headless +## Obsidian Headless -- **Automated backups**: sync vault on a schedule (cron, CI) -- **Agentic access**: give Claude Code access to a vault on a remote server -- **Team workflows**: sync shared vault to a server that feeds other tools -- **Scheduled automations**: aggregate daily notes, auto-tag, generate summaries - -### Headless + Claude Code workflow - -1. `ob sync` to pull latest vault changes -2. Use `Read`/`Edit`/`Write` tools to work with notes directly -3. `ob sync` to push changes back - -This is especially useful on servers or in CI where Obsidian desktop isn't installed. +For headless sync (CI/servers), see the Headless section in `references/commands.md`. ## CLI Reference For detailed flag options, see [`references/commands.md`](references/commands.md). + +## References Loading Guide + +| Situation | Load | +|-----------|------| +| CLI command options, headless usage | `references/commands.md` | diff --git a/plugins/obsidian/skills/obsidian/references/commands.md b/plugins/obsidian/skills/obsidian/references/commands.md index 9c01077..4790dd1 100644 --- a/plugins/obsidian/skills/obsidian/references/commands.md +++ b/plugins/obsidian/skills/obsidian/references/commands.md @@ -1,6 +1,6 @@ # obsidian-cli Command Reference -Version: 0.2.3 | Install: `brew install yakitrak/yakitrak/obsidian-cli` +Install: `brew install yakitrak/yakitrak/obsidian-cli` All commands accept `--vault ` to target a specific vault. If omitted, uses the default vault set via `set-default`. @@ -167,7 +167,7 @@ obsidian-cli completion fish # Obsidian Headless (`ob`) Command Reference -Version: 0.0.6 (open beta) | Install: `npm install -g obsidian-headless` | Requires: Node.js 22+ +Install: `npm install -g obsidian-headless` | Requires: Node.js 22+ Obsidian Headless is a standalone CLI for Obsidian Sync — syncs vaults without the desktop app. diff --git a/plugins/personal-tutor/.claude-plugin/plugin.json b/plugins/personal-tutor/.claude-plugin/plugin.json index 15ffa64..ff9aa32 100644 --- a/plugins/personal-tutor/.claude-plugin/plugin.json +++ b/plugins/personal-tutor/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "personal-tutor", - "version": "1.0.0", + "version": "1.0.1", "description": "Adaptive technical tutoring skill that builds a persistent knowledge graph and learner profile across sessions", "author": { "name": "minsoo.web", diff --git a/plugins/personal-tutor/skills/personal-tutor/SKILL.md b/plugins/personal-tutor/skills/personal-tutor/SKILL.md index e5c2350..5903e1c 100644 --- a/plugins/personal-tutor/skills/personal-tutor/SKILL.md +++ b/plugins/personal-tutor/skills/personal-tutor/SKILL.md @@ -1,6 +1,11 @@ --- name: personal-tutor -description: Use when user wants to learn a technical topic, says "I want to learn X", "teach me X", or "let's study X". Also use when user resumes a previous learning session on a topic they've studied before. +description: > + Use when the user wants to learn a technical topic through structured, + multi-session tutoring with prerequisite tracking and knowledge graphs. + Activates on "I want to learn X", "teach me X", "let's study X", or + resuming a previous learning session. Do NOT activate for quick reference + lookups or one-off coding questions — only for sustained learning goals. --- # Personal Tutor @@ -10,6 +15,8 @@ description: Use when user wants to learn a technical topic, says "I want to lea ## Session Start 1. Extract topic name from user input (e.g., "Rust", "TypeScript generics") + - Normalize the topic name: lowercase, replace spaces with hyphens, strip special characters + - Example: "TypeScript Generics" → `typescript-generics`, "Rust" → `rust` 2. Check `~/.claude/learning/topics/{topic}/knowledge-graph.md` - **Exists** → load it + `~/.claude/learning/learner-profile.md` → jump to **Phase 2** - **Not exists** → create `~/.claude/learning/topics/{topic}/` → start **Phase 1** @@ -25,7 +32,9 @@ After mapping, ask once: **"Is there a reference you'd like me to draw from? (bo - Yes → store in `knowledge-graph.md` header as `Reference: [title + URL]`; use for examples and citations only — Claude leads curriculum - No → set `Reference: none` -Create `knowledge-graph.md` using `knowledge-graph-template.md`. Seed nodes based on the topic's prerequisite tree. All nodes start as `gap`. +Read `knowledge-graph-template.md` only when creating a new knowledge graph (first session for a topic). Create `knowledge-graph.md` using the template. Seed nodes based on the topic's prerequisite tree. All nodes start as `gap`. + +Keep the initial knowledge graph to 10–15 nodes. If the topic is broad (e.g., "Rust"), scope to a subtopic first (e.g., "Rust ownership and borrowing"). Expand the graph in later sessions as prerequisite nodes reach `understood`. ## Phase 2: Agenda Planning @@ -80,6 +89,7 @@ Upgrade rules: - `partial → understood`: node was already `partial` from a prior session AND passed quiz today WITHOUT hints Never downgrade a node. If quiz failed: add note to quiz history AND flag concept in learner-profile as "needs reinforcement" (propose this to user in Step 3). +- If a node fails quiz 2 sessions in a row: downgrade `partial → gap` and re-teach from a different angle next session Depth progression (update when quiz demonstrates deeper mastery): - Quiz format was Feynman and passed → depth moves toward `explain` @@ -129,6 +139,14 @@ Wait for explicit confirmation. Then update `~/.claude/learning/learner-profile. - {topic}: {N} sessions ({Concept} ✓|⚠|✗, ...) ``` +## Early Session Exit + +If the user needs to leave mid-session: + +1. Save progress immediately — update any node states changed so far +2. Write a partial session log noting where the session stopped +3. On next session resume, pick up from the interrupted point (skip re-teaching completed concepts) + ## Iron Rules These rules are non-negotiable. Do not skip them under any circumstances. diff --git a/plugins/skill-review/.claude-plugin/plugin.json b/plugins/skill-review/.claude-plugin/plugin.json index 4e8f8cc..55c6d0d 100644 --- a/plugins/skill-review/.claude-plugin/plugin.json +++ b/plugins/skill-review/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "skill-review", - "version": "1.0.2", + "version": "1.0.3", "description": "Slash-command skill that reviews any SKILL.md against best practices and outputs a structured pass/fail report", "author": { "name": "minsoo.web", diff --git a/plugins/skill-review/skills/skill-review/references/checklist.md b/plugins/skill-review/skills/skill-review/references/checklist.md index ec77dda..603b0e6 100644 --- a/plugins/skill-review/skills/skill-review/references/checklist.md +++ b/plugins/skill-review/skills/skill-review/references/checklist.md @@ -8,6 +8,7 @@ Derived from the Claude Agent Skills best practices. Run every check against the | Check | Severity | What to look for | |---|---|---| +| YAML frontmatter is valid YAML syntax (parses without error, no duplicate keys, correct indentation) | ❌ Error | Invalid YAML prevents Claude from reading the skill metadata entirely | | Only `name` and `description` fields present | ⚠️ Warning | Extra fields (e.g. `version`, `license`) are ignored by Claude and signal authoring confusion | | Total frontmatter ≤ 1024 characters | ❌ Error | Longer frontmatter may be truncated; description becomes unreliable | | `name` uses only letters, numbers, and hyphens | ❌ Error | Parentheses, underscores, or special characters break skill lookup | @@ -35,6 +36,8 @@ The description is how Claude decides whether to load a skill. It must be a prec ## 3. Naming Conventions +> **Exception:** Tool-wrapper skills (e.g., vitest, gh-cli) may use the tool name directly. This is an accepted convention and not counted as a warning. + | Check | Severity | What to look for | |---|---|---| | Name uses gerund (-ing) or descriptive verb form for process skills | ⚠️ Warning | `creating-skills` > `skill-creation`; `condition-based-waiting` > `async-test-helpers` | @@ -61,6 +64,7 @@ The description is how Claude decides whether to load a skill. It must be a prec | Check | Severity | What to look for | |---|---|---| +| All files linked from SKILL.md via markdown links or explicit Read instructions exist at the referenced path | ❌ Error | Broken references cause Claude to fail silently when trying to load context | | Heavy reference (100+ lines) is in `references/` not inline | ⚠️ Warning | Inline API docs bloat every invocation of the skill | | Nesting is at most one level deep (`references/topic.md`) | ⚠️ Warning | Deeper nesting (`references/a/b/c.md`) is hard to maintain and discover | | If the skill has ≥ 4 major sections, there is a table of contents | ⚠️ Warning | Long skills without a ToC are hard to navigate |