[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71PQBGGWMPSQXWG2Z6AVR1Q":3,"skill-same:01M71PQBGGWMPSQXWG2Z6AVR1Q":430},{"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":16,"sourceHtmlUrl":17,"categories":18,"keywords":29,"publishedAt":50,"linkOnly":51,"markdownContent":52,"markdownBody":53,"frontMatter":54,"refName":55,"commitSha":56,"skillDirectory":57,"forksCount":14,"repositoryHtmlUrl":58,"repositoryHomepageUrl":59,"ownerHtmlUrl":60,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":61,"install":62,"resources":75},"01M71PQBGGWMPSQXWG2Z6AVR1Q","skill-studio",null,"Interview-driven automation design tool. This skill should be used when the user wants to design a new skill, agent, automation, shortcut, or any other automatable workflow. Runs a coverage-driven JTBD interview (text or voice), then exports a one-page markdown spec plus an SVG design map. Can also analyze Claude Code sessions (current or by ID) to extract workflows, subagent patterns, and skill usage, then propose new skills based on observed patterns. Use this skill whenever the user mentions analyzing a session, extracting workflows, proposing skills from past work, reviewing what tools or agents were used, or turning a session into a skill. Triggers on \"analyze this session\", \"what skills could I build from this\", \"propose skills from session\", \"what workflows did I use\", \"what did I do in this session\", \"extract patterns\", \"turn this into a skill\".","pattanation\u002FNorvik","pattanation","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F235419268?v=4","01M71M5THHYYB15ME8R2E4FCZG","Patta","01M71M5TJM1NDM992M8PDKYR2K",0,"MIT","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002FSKILL.md",[19,24],{"categoryNo":20,"categoryName":21,"taxonomyType":22,"taxonomyTypeDesc":23},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",{"categoryNo":25,"categoryName":26,"taxonomyType":27,"taxonomyTypeDesc":28},"01JBSEEDCAT000000000000038","人力资源","PROFESSION","适用职业",[30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49],"skill studio","studio","past","markdown","one-page","work","text","analyze","subagent","code","workflow","when","workflows","jtbd","claude code sessions","map","new","design","extracting","coverage","2026-11-10 13:02:02",false,"---\nname: skill-studio\ndescription: Interview-driven automation design tool. This skill should be used when the user wants to design a new skill, agent, automation, shortcut, or any other automatable workflow. Runs a coverage-driven JTBD interview (text or voice), then exports a one-page markdown spec plus an SVG design map. Can also analyze Claude Code sessions (current or by ID) to extract workflows, subagent patterns, and skill usage, then propose new skills based on observed patterns. Use this skill whenever the user mentions analyzing a session, extracting workflows, proposing skills from past work, reviewing what tools or agents were used, or turning a session into a skill. Triggers on \"analyze this session\", \"what skills could I build from this\", \"propose skills from session\", \"what workflows did I use\", \"what did I do in this session\", \"extract patterns\", \"turn this into a skill\".\n---\n\n# Skill Studio\n\n## Purpose\n\nConduct a structured JTBD interview that captures what to build, for whom, and why — then emit a one-page `design.md` + `design.svg` spec. Sits between \"should I automate this?\" (automation-advisor) and \"how do I package this as a skill?\" (skill-creator).\n\n## Architecture\n\nThis skill wraps an external CLI tool (`skill-studio`) installed via pip. The CLI handles session state, coverage tracking, and export. The skill orchestrates the CLI — it does not bundle scripts directly.\n\n## When to use\n\nTrigger on any of: \"help me design...\", \"build a skill for...\", \"design an automation for...\", \"I want a bot\u002Fagent\u002Fworkflow that...\", \"scope a new shortcut\". Also trigger when the user describes a recurring pain and asks how to automate it.\n\nAlso trigger for session analysis: \"analyze this session\", \"what skills could I build from this\", \"propose skills from session\", \"what workflows did I use\", \"what did I do in this session\", \"extract patterns from my work\", \"turn this session into a skill\", \"what could be automated from this\". If the user references a session ID or asks about subagent activity, this skill handles it.\n\n## Prerequisites\n\n- `skill-studio` CLI on PATH (`pip install -e .` inside the skill directory, or `skill-studio init` for guided setup)\n- Python 3.11+\n- Text mode needs no API key — the interview runs natively inside Claude Code\n- Voice mode (`--voice`) needs `DAILY_API_KEY`, `GROQ_API_KEY`, `DEEPGRAM_API_KEY`, and an LLM provider key (`OPENROUTER_API_KEY` by default). If any key is missing, suggest text mode instead.\n\nTo verify the CLI is available, run `skill-studio --help`. If the command is not found, install it from the skill's base directory: `pip install -e \u003Cskill-studio-base-dir>`.\n\n## Interview protocol (text mode)\n\nFollow these steps in order.\n\n### Step 0 — (Optional) Seed from a prior session\n\nIf the user provides a prior session (Claude Code transcript, another skill-studio session, or arbitrary transcript path), seed the interview instead of starting blank:\n\n```bash\n# Analyze the current running session\nskill-studio propose-from-session --current\n\n# Analyze a specific session by ID (prefix match works)\nskill-studio propose-from-session \u003Csession_id>\n\n# Analyze a session from a specific project\nskill-studio propose-from-session \u003Csession_id> --project \u003Cproject-dir-name>\n\n# Analyze an arbitrary transcript file\nskill-studio propose-from-session --path \u003Cfile>\n\n# Inspect the raw extracted bundle without an LLM call\nskill-studio propose-from-session --current --bundle-only\n```\n\nThis runs in two stages:\n1. **Deterministic ingest** (no LLM) — extracts models tried, cost events, prompt changes, pain snippets, **subagent calls** (Agent tool with descriptions, types, prompt snippets), **skill invocations**, **tool sequences** (ordered list of all tool calls), **tool frequency**, and **workflow patterns** (repeated multi-tool sequences). A 50k-token transcript compresses to a compact structured JSON bundle.\n2. **Single LLM call** — over that compact bundle only, proposes a partial DesignJSON patch with a `rationale` map citing which signals justified each field, plus **skill proposals** — potential new skills derived from observed workflow patterns and agent orchestration.\n\nThe bundle includes these structured signals:\n- `agents` — subagent calls with `description`, `subagent_type`, and `prompt_snippet`\n- `skills` — skill invocations observed during the session\n- `tool_sequence` — ordered list of all tool calls with descriptions\n- `tool_frequency` — how often each tool was used\n- `workflow_patterns` — repeated tool sequences (e.g. \"Read → Edit → Bash\" appearing 3× suggests a test-fix cycle)\n\n**The proposal is NOT applied automatically.** Present it to the user (with the rationale and any skill proposals) and ask for approval. Offer: `approve as-is`, `edit inline`, `discard and start fresh`, `approve partial` (keep some fields, re-interview others).\n\nIf the proposal includes `skill_proposals`, present them separately and ask if the user wants to proceed to `\u002Fskill-creator` with any of them.\n\n`propose-from-session` does not create a session. After approval, run `new-session` (Step 1) to create one, then pipe the approved patch to `apply-patch`, and continue the interview loop from the next uncovered target.\n\n### Browsing Claude Code sessions\n\nTo help the user pick a session to analyze:\n\n```bash\n# List recent sessions (most recent first, all projects)\nskill-studio list-sessions\n\n# Filter to a specific project\nskill-studio list-sessions --project \u003Cproject-dir-name>\n\n# Show more results\nskill-studio list-sessions --limit 50\n```\n\nOutput shows session ID prefix, age, size, and title.\n\n### Step 1 — Start the session\n\nPresets: `ai-agent` (default), `life-automation`, `knowledge-work`, `custom`.\nDepth: `sprint` (0.60, ~5–7 questions), `standard` (0.80, ~15–20 questions, default), `deep` (0.92, ~25–35 questions).\n\nStyles (shape how questions are phrased):\n- `scenario-first` (default) — \"Walk me through a specific time when...\"\n- `socratic` — \"Why does that matter? What would happen if...?\"\n- `metaphor-first` — \"If this automation were a [thing], what would it be?\"\n- `form` — One direct question per field, no preamble.\n\nRun:\n\n```bash\nskill-studio new-session --preset \u003Cpreset> --depth \u003Cdepth> --style \u003Cstyle>\n```\n\nOutput:\n\n```\nsession_id: \u003Cuuid>\nopening: \u003Cquestion text>\n```\n\nStore the `session_id`. Present the opening question to the user as a direct text message.\n\n### Step 2 — Interview loop\n\nFor every user answer:\n\n**a. Extract a JSON patch.** Emit a JSON object containing only the DesignJSON fields the answer addresses. Use only fields from the schema below — never hallucinate fields or values. If nothing schema-relevant was said, emit `{}`.\n\nExample patch:\n\n```json\n{\"jtbd.situation\": \"When I finish a coaching call and need to write up notes\", \"problem.what_hurts\": \"Manual note-taking takes 20 minutes and I lose details\"}\n```\n\nExample with list fields:\n\n```json\n{\"needs.functional\": [\"transcribe audio\", \"extract action items\"], \"guardrails\": [\"never send notes without review\"]}\n```\n\nExample with object-list field (`scenarios`):\n\n```json\n{\"scenarios\": [{\"title\": \"Post-coaching rush\", \"vignette\": \"Call ends at 14:00, next meeting at 14:15 — I scribble three bullet points and lose the rest by evening.\"}]}\n```\n\n**DesignJSON fields:**\n\n| Field | Type | Notes |\n|-------|------|-------|\n| `hook` | str | One-sentence pitch of the automation |\n| `problem.what_hurts` | str | Specific pain |\n| `problem.cost_today` | str | What the pain costs right now |\n| `needs.functional` | list[str] | What it must do |\n| `needs.emotional` | list[str] | How the user wants to feel |\n| `needs.social` | list[str] | Relational \u002F status needs |\n| `jtbd.situation` | str | When this happens |\n| `jtbd.motivation` | str | What the user wants |\n| `jtbd.outcome` | str | So they can... |\n| `before_after.before_external` | str | Visible state before |\n| `before_after.before_internal` | str | Felt state before |\n| `before_after.after_external` | str | Visible state after |\n| `before_after.after_internal` | str | Felt state after |\n| `scenarios` | list[{title, vignette}] | Concrete day-in-the-life stories |\n| `trigger.type` | `manual` \u002F `scheduled` \u002F `event` | |\n| `trigger.detail` | str | e.g. \"7:45am weekdays\" |\n| `inputs` | list[str] | Data \u002F services consumed |\n| `capabilities` | list[str] | What it does |\n| `outputs` | list[str] | What it produces |\n| `guardrails` | list[str] | Safety rails; negative-space rules |\n| `cta` | str | Next action at end of design |\n| `concept_imagery.metaphor` | str | Visual \u002F verbal handle |\n\n**b. Apply the patch.**\n\n```bash\necho '\u003Cpatch_json>' | skill-studio apply-patch \u003Csession_id>\n```\n\nOutput:\n\n```\ncoverage: 0.42\nnext_target: jtbd.situation\n```\n\n**c. Check stop conditions.** End the loop if either:\n- `coverage >= threshold` (sprint=0.60, standard=0.80, deep=0.92)\n- User says \"done\", \"wrap up\", or \"stop\"\n\n**d. Ask the next question.** Target the `next_target` field, in the active style. Never re-ask a field already past 0.5 coverage. Present the question as direct text to the user.\n\n### Step 3 — Export\n\n```bash\nskill-studio done \u003Csession_id>\n```\n\nPrints the paths to `design.md` and `design.svg`. Present both paths to the user.\n\n## Voice mode\n\nFor voice interviews, skip the manual loop and delegate to the built-in pipeline:\n\n```bash\nskill-studio new --voice --preset \u003Cpreset> --depth \u003Cdepth>\n```\n\nThis spins up a Daily room (auto-opens in the browser), runs Groq Whisper STT -> interview loop -> Deepgram TTS, and auto-exports on session end.\n\nIf voice mode fails due to missing API keys, fall back to text mode and inform the user. To configure keys, run `skill-studio init`.\n\n## Other commands\n\n- `skill-studio list` — list all skill-studio interview sessions\n- `skill-studio list-sessions` — list Claude Code sessions (most recent first)\n- `skill-studio list-sessions --project \u003Cname>` — filter by project\n- `skill-studio export \u003Cid> md-svg` — regenerate `design.md` + `design.svg`\n- `skill-studio coverage \u003Cid>` — per-field confidence JSON\n- `skill-studio next-target \u003Cid>` — ask-this-next hint\n- `skill-studio init` — full first-run wizard (prereq checks + keys + paths)\n- `skill-studio setup` — narrower key-rotation flow (sops-only)\n\n## Sessions\n\nEach interview writes to `$SKILL_STUDIO_HOME\u002Fsessions\u002F\u003Cuuid>\u002F` (default: `~\u002F.skill-studio\u002Fsessions\u002F\u003Cuuid>\u002F`):\n\n- `design.json` — canonical schema (single source of truth)\n- `transcript.md` — full Q&A log\n- `design.md`, `design.svg` — exported artifacts\n\n## Troubleshooting\n\n- **`skill-studio: command not found`** — Run `pip install -e \u003Cskill-studio-base-dir>` and retry.\n- **`apply-patch` returns an error** — Verify the JSON patch is valid (keys must match schema fields above). Run `skill-studio coverage \u003Csession_id>` to inspect current state.\n- **Session not found** — Always run `new-session` before the first `apply-patch`. There is no implicit session creation. Run `skill-studio list` to check existing sessions.\n- **Voice mode key errors** — Run `skill-studio init` to configure missing keys, or fall back to text mode.\n\n## Notes\n\n- The interview loop runs entirely inside Claude Code for text mode. No Anthropic API key is required.\n- Voice mode LLM provider is swappable via `LLM_PROVIDER=anthropic` (default is `openrouter`).\n","# Skill Studio\n\n## Purpose\n\nConduct a structured JTBD interview that captures what to build, for whom, and why — then emit a one-page `design.md` + `design.svg` spec. Sits between \"should I automate this?\" (automation-advisor) and \"how do I package this as a skill?\" (skill-creator).\n\n## Architecture\n\nThis skill wraps an external CLI tool (`skill-studio`) installed via pip. The CLI handles session state, coverage tracking, and export. The skill orchestrates the CLI — it does not bundle scripts directly.\n\n## When to use\n\nTrigger on any of: \"help me design...\", \"build a skill for...\", \"design an automation for...\", \"I want a bot\u002Fagent\u002Fworkflow that...\", \"scope a new shortcut\". Also trigger when the user describes a recurring pain and asks how to automate it.\n\nAlso trigger for session analysis: \"analyze this session\", \"what skills could I build from this\", \"propose skills from session\", \"what workflows did I use\", \"what did I do in this session\", \"extract patterns from my work\", \"turn this session into a skill\", \"what could be automated from this\". If the user references a session ID or asks about subagent activity, this skill handles it.\n\n## Prerequisites\n\n- `skill-studio` CLI on PATH (`pip install -e .` inside the skill directory, or `skill-studio init` for guided setup)\n- Python 3.11+\n- Text mode needs no API key — the interview runs natively inside Claude Code\n- Voice mode (`--voice`) needs `DAILY_API_KEY`, `GROQ_API_KEY`, `DEEPGRAM_API_KEY`, and an LLM provider key (`OPENROUTER_API_KEY` by default). If any key is missing, suggest text mode instead.\n\nTo verify the CLI is available, run `skill-studio --help`. If the command is not found, install it from the skill's base directory: `pip install -e \u003Cskill-studio-base-dir>`.\n\n## Interview protocol (text mode)\n\nFollow these steps in order.\n\n### Step 0 — (Optional) Seed from a prior session\n\nIf the user provides a prior session (Claude Code transcript, another skill-studio session, or arbitrary transcript path), seed the interview instead of starting blank:\n\n```bash\n# Analyze the current running session\nskill-studio propose-from-session --current\n\n# Analyze a specific session by ID (prefix match works)\nskill-studio propose-from-session \u003Csession_id>\n\n# Analyze a session from a specific project\nskill-studio propose-from-session \u003Csession_id> --project \u003Cproject-dir-name>\n\n# Analyze an arbitrary transcript file\nskill-studio propose-from-session --path \u003Cfile>\n\n# Inspect the raw extracted bundle without an LLM call\nskill-studio propose-from-session --current --bundle-only\n```\n\nThis runs in two stages:\n1. **Deterministic ingest** (no LLM) — extracts models tried, cost events, prompt changes, pain snippets, **subagent calls** (Agent tool with descriptions, types, prompt snippets), **skill invocations**, **tool sequences** (ordered list of all tool calls), **tool frequency**, and **workflow patterns** (repeated multi-tool sequences). A 50k-token transcript compresses to a compact structured JSON bundle.\n2. **Single LLM call** — over that compact bundle only, proposes a partial DesignJSON patch with a `rationale` map citing which signals justified each field, plus **skill proposals** — potential new skills derived from observed workflow patterns and agent orchestration.\n\nThe bundle includes these structured signals:\n- `agents` — subagent calls with `description`, `subagent_type`, and `prompt_snippet`\n- `skills` — skill invocations observed during the session\n- `tool_sequence` — ordered list of all tool calls with descriptions\n- `tool_frequency` — how often each tool was used\n- `workflow_patterns` — repeated tool sequences (e.g. \"Read → Edit → Bash\" appearing 3× suggests a test-fix cycle)\n\n**The proposal is NOT applied automatically.** Present it to the user (with the rationale and any skill proposals) and ask for approval. Offer: `approve as-is`, `edit inline`, `discard and start fresh`, `approve partial` (keep some fields, re-interview others).\n\nIf the proposal includes `skill_proposals`, present them separately and ask if the user wants to proceed to `\u002Fskill-creator` with any of them.\n\n`propose-from-session` does not create a session. After approval, run `new-session` (Step 1) to create one, then pipe the approved patch to `apply-patch`, and continue the interview loop from the next uncovered target.\n\n### Browsing Claude Code sessions\n\nTo help the user pick a session to analyze:\n\n```bash\n# List recent sessions (most recent first, all projects)\nskill-studio list-sessions\n\n# Filter to a specific project\nskill-studio list-sessions --project \u003Cproject-dir-name>\n\n# Show more results\nskill-studio list-sessions --limit 50\n```\n\nOutput shows session ID prefix, age, size, and title.\n\n### Step 1 — Start the session\n\nPresets: `ai-agent` (default), `life-automation`, `knowledge-work`, `custom`.\nDepth: `sprint` (0.60, ~5–7 questions), `standard` (0.80, ~15–20 questions, default), `deep` (0.92, ~25–35 questions).\n\nStyles (shape how questions are phrased):\n- `scenario-first` (default) — \"Walk me through a specific time when...\"\n- `socratic` — \"Why does that matter? What would happen if...?\"\n- `metaphor-first` — \"If this automation were a [thing], what would it be?\"\n- `form` — One direct question per field, no preamble.\n\nRun:\n\n```bash\nskill-studio new-session --preset \u003Cpreset> --depth \u003Cdepth> --style \u003Cstyle>\n```\n\nOutput:\n\n```\nsession_id: \u003Cuuid>\nopening: \u003Cquestion text>\n```\n\nStore the `session_id`. Present the opening question to the user as a direct text message.\n\n### Step 2 — Interview loop\n\nFor every user answer:\n\n**a. Extract a JSON patch.** Emit a JSON object containing only the DesignJSON fields the answer addresses. Use only fields from the schema below — never hallucinate fields or values. If nothing schema-relevant was said, emit `{}`.\n\nExample patch:\n\n```json\n{\"jtbd.situation\": \"When I finish a coaching call and need to write up notes\", \"problem.what_hurts\": \"Manual note-taking takes 20 minutes and I lose details\"}\n```\n\nExample with list fields:\n\n```json\n{\"needs.functional\": [\"transcribe audio\", \"extract action items\"], \"guardrails\": [\"never send notes without review\"]}\n```\n\nExample with object-list field (`scenarios`):\n\n```json\n{\"scenarios\": [{\"title\": \"Post-coaching rush\", \"vignette\": \"Call ends at 14:00, next meeting at 14:15 — I scribble three bullet points and lose the rest by evening.\"}]}\n```\n\n**DesignJSON fields:**\n\n| Field | Type | Notes |\n|-------|------|-------|\n| `hook` | str | One-sentence pitch of the automation |\n| `problem.what_hurts` | str | Specific pain |\n| `problem.cost_today` | str | What the pain costs right now |\n| `needs.functional` | list[str] | What it must do |\n| `needs.emotional` | list[str] | How the user wants to feel |\n| `needs.social` | list[str] | Relational \u002F status needs |\n| `jtbd.situation` | str | When this happens |\n| `jtbd.motivation` | str | What the user wants |\n| `jtbd.outcome` | str | So they can... |\n| `before_after.before_external` | str | Visible state before |\n| `before_after.before_internal` | str | Felt state before |\n| `before_after.after_external` | str | Visible state after |\n| `before_after.after_internal` | str | Felt state after |\n| `scenarios` | list[{title, vignette}] | Concrete day-in-the-life stories |\n| `trigger.type` | `manual` \u002F `scheduled` \u002F `event` | |\n| `trigger.detail` | str | e.g. \"7:45am weekdays\" |\n| `inputs` | list[str] | Data \u002F services consumed |\n| `capabilities` | list[str] | What it does |\n| `outputs` | list[str] | What it produces |\n| `guardrails` | list[str] | Safety rails; negative-space rules |\n| `cta` | str | Next action at end of design |\n| `concept_imagery.metaphor` | str | Visual \u002F verbal handle |\n\n**b. Apply the patch.**\n\n```bash\necho '\u003Cpatch_json>' | skill-studio apply-patch \u003Csession_id>\n```\n\nOutput:\n\n```\ncoverage: 0.42\nnext_target: jtbd.situation\n```\n\n**c. Check stop conditions.** End the loop if either:\n- `coverage >= threshold` (sprint=0.60, standard=0.80, deep=0.92)\n- User says \"done\", \"wrap up\", or \"stop\"\n\n**d. Ask the next question.** Target the `next_target` field, in the active style. Never re-ask a field already past 0.5 coverage. Present the question as direct text to the user.\n\n### Step 3 — Export\n\n```bash\nskill-studio done \u003Csession_id>\n```\n\nPrints the paths to `design.md` and `design.svg`. Present both paths to the user.\n\n## Voice mode\n\nFor voice interviews, skip the manual loop and delegate to the built-in pipeline:\n\n```bash\nskill-studio new --voice --preset \u003Cpreset> --depth \u003Cdepth>\n```\n\nThis spins up a Daily room (auto-opens in the browser), runs Groq Whisper STT -> interview loop -> Deepgram TTS, and auto-exports on session end.\n\nIf voice mode fails due to missing API keys, fall back to text mode and inform the user. To configure keys, run `skill-studio init`.\n\n## Other commands\n\n- `skill-studio list` — list all skill-studio interview sessions\n- `skill-studio list-sessions` — list Claude Code sessions (most recent first)\n- `skill-studio list-sessions --project \u003Cname>` — filter by project\n- `skill-studio export \u003Cid> md-svg` — regenerate `design.md` + `design.svg`\n- `skill-studio coverage \u003Cid>` — per-field confidence JSON\n- `skill-studio next-target \u003Cid>` — ask-this-next hint\n- `skill-studio init` — full first-run wizard (prereq checks + keys + paths)\n- `skill-studio setup` — narrower key-rotation flow (sops-only)\n\n## Sessions\n\nEach interview writes to `$SKILL_STUDIO_HOME\u002Fsessions\u002F\u003Cuuid>\u002F` (default: `~\u002F.skill-studio\u002Fsessions\u002F\u003Cuuid>\u002F`):\n\n- `design.json` — canonical schema (single source of truth)\n- `transcript.md` — full Q&A log\n- `design.md`, `design.svg` — exported artifacts\n\n## Troubleshooting\n\n- **`skill-studio: command not found`** — Run `pip install -e \u003Cskill-studio-base-dir>` and retry.\n- **`apply-patch` returns an error** — Verify the JSON patch is valid (keys must match schema fields above). Run `skill-studio coverage \u003Csession_id>` to inspect current state.\n- **Session not found** — Always run `new-session` before the first `apply-patch`. There is no implicit session creation. Run `skill-studio list` to check existing sessions.\n- **Voice mode key errors** — Run `skill-studio init` to configure missing keys, or fall back to text mode.\n\n## Notes\n\n- The interview loop runs entirely inside Claude Code for text mode. No Anthropic API key is required.\n- Voice mode LLM provider is swappable via `LLM_PROVIDER=anthropic` (default is `openrouter`).\n",{"name":5,"description":7},"claude\u002Finstall-gsd-build-foQdV","d86cd127f527124b5fd0fd0bc679a4d79b7d01d7",".agents\u002Fskills\u002Fskill-studio","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik","https:\u002F\u002Fnorvik-orpin.vercel.app","https:\u002F\u002Fgithub.com\u002Fpattanation","2026-07-17 11:17:04",{"source":8,"skillName":5,"commands":63,"prompt":73,"zipAvailable":74},[64,67,70],{"tool":65,"command":66},"npx","npx skills add pattanation\u002FNorvik --skill skill-studio",{"tool":68,"command":69},"bunx","bunx skills add pattanation\u002FNorvik --skill skill-studio",{"tool":71,"command":72},"pnpm","pnpm dlx skills add pattanation\u002FNorvik --skill skill-studio","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002FSKILL.md",true,[76,82,88,92,98,102,106,110,114,118,122,126,130,135,139,143,146,150,154,158,161,165,169,173,176,180,184,188,192,196,200,204,208,212,216,220,224,228,232,236,240,244,248,252,256,260,264,268,272,276,280,283,287,290,294,298,302,306,310,314,318,322,326,330,334,338,342,346,350,354,358,362,366,370,374,378,382,386,390,394,398,402,406,410,414,418,422,426],{"path":77,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":80,"sourceHtmlUrl":81},".claude-plugin\u002Fplugin.json","REFERENCE","参考文档",294,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002F.claude-plugin\u002Fplugin.json",{"path":83,"resourceType":84,"resourceTypeDesc":85,"sizeBytes":86,"sourceHtmlUrl":87},".env.example","OTHER","其他",732,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002F.env.example",{"path":89,"resourceType":84,"resourceTypeDesc":85,"sizeBytes":90,"sourceHtmlUrl":91},".gitignore",618,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002F.gitignore",{"path":93,"resourceType":94,"resourceTypeDesc":95,"sizeBytes":96,"sourceHtmlUrl":97},"assets\u002Fdesign.md.j2","ASSET","资产文件",1882,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fassets\u002Fdesign.md.j2",{"path":99,"resourceType":94,"resourceTypeDesc":95,"sizeBytes":100,"sourceHtmlUrl":101},"assets\u002Fdesign.svg.j2",4281,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fassets\u002Fdesign.svg.j2",{"path":103,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":104,"sourceHtmlUrl":105},"CONTRIBUTING.md",2859,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002FCONTRIBUTING.md",{"path":107,"resourceType":107,"resourceTypeDesc":108,"sizeBytes":109,"sourceHtmlUrl":16},"LICENSE","许可证",1082,{"path":111,"resourceType":84,"resourceTypeDesc":85,"sizeBytes":112,"sourceHtmlUrl":113},"pyproject.toml",1712,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fpyproject.toml",{"path":115,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":116,"sourceHtmlUrl":117},"README.md",10333,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002FREADME.md",{"path":119,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":120,"sourceHtmlUrl":121},"references\u002Fpresets_and_modes.md",199,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Freferences\u002Fpresets_and_modes.md",{"path":123,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":124,"sourceHtmlUrl":125},"references\u002Fschema.md",241,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Freferences\u002Fschema.md",{"path":127,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":128,"sourceHtmlUrl":129},"requirements.txt",137,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Frequirements.txt",{"path":131,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":14,"sourceHtmlUrl":134},"src\u002Fskill_studio\u002F__init__.py","SCRIPT","脚本","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002F__init__.py",{"path":136,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":137,"sourceHtmlUrl":138},"src\u002Fskill_studio\u002Fanthropic_client.py",1049,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Fanthropic_client.py",{"path":140,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":141,"sourceHtmlUrl":142},"src\u002Fskill_studio\u002Fcli.py",13505,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Fcli.py",{"path":144,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":14,"sourceHtmlUrl":145},"src\u002Fskill_studio\u002Fexporters\u002F__init__.py","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Fexporters\u002F__init__.py",{"path":147,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":148,"sourceHtmlUrl":149},"src\u002Fskill_studio\u002Fexporters\u002Fbase.py",249,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Fexporters\u002Fbase.py",{"path":151,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":152,"sourceHtmlUrl":153},"src\u002Fskill_studio\u002Fexporters\u002Fmd_svg.py",994,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Fexporters\u002Fmd_svg.py",{"path":155,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":156,"sourceHtmlUrl":157},"src\u002Fskill_studio\u002Fexporters\u002Fregistry.py",394,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Fexporters\u002Fregistry.py",{"path":159,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":14,"sourceHtmlUrl":160},"src\u002Fskill_studio\u002Fingest\u002F__init__.py","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Fingest\u002F__init__.py",{"path":162,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":163,"sourceHtmlUrl":164},"src\u002Fskill_studio\u002Fingest\u002Fproposer.py",4725,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Fingest\u002Fproposer.py",{"path":166,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":167,"sourceHtmlUrl":168},"src\u002Fskill_studio\u002Fingest\u002Ftranscript.py",12691,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Fingest\u002Ftranscript.py",{"path":170,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":171,"sourceHtmlUrl":172},"src\u002Fskill_studio\u002Finit_wizard.py",8720,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Finit_wizard.py",{"path":174,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":14,"sourceHtmlUrl":175},"src\u002Fskill_studio\u002Finterview\u002F__init__.py","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Finterview\u002F__init__.py",{"path":177,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":178,"sourceHtmlUrl":179},"src\u002Fskill_studio\u002Finterview\u002Fcombined.py",2445,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Finterview\u002Fcombined.py",{"path":181,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":182,"sourceHtmlUrl":183},"src\u002Fskill_studio\u002Finterview\u002Fcoverage.py",3112,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Finterview\u002Fcoverage.py",{"path":185,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":186,"sourceHtmlUrl":187},"src\u002Fskill_studio\u002Finterview\u002Fdirector.py",5187,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Finterview\u002Fdirector.py",{"path":189,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":190,"sourceHtmlUrl":191},"src\u002Fskill_studio\u002Finterview\u002Fextractor.py",1332,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Finterview\u002Fextractor.py",{"path":193,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":194,"sourceHtmlUrl":195},"src\u002Fskill_studio\u002Finterview\u002Fframe_suggester.py",746,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Finterview\u002Fframe_suggester.py",{"path":197,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":198,"sourceHtmlUrl":199},"src\u002Fskill_studio\u002Finterview\u002Fframeworks\u002F__init__.py",456,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Finterview\u002Fframeworks\u002F__init__.py",{"path":201,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":202,"sourceHtmlUrl":203},"src\u002Fskill_studio\u002Finterview\u002Fframeworks\u002Fforces.yaml",2142,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Finterview\u002Fframeworks\u002Fforces.yaml",{"path":205,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":206,"sourceHtmlUrl":207},"src\u002Fskill_studio\u002Finterview\u002Floop.py",4404,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Finterview\u002Floop.py",{"path":209,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":210,"sourceHtmlUrl":211},"src\u002Fskill_studio\u002Finterview\u002Fmerge.py",2776,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Finterview\u002Fmerge.py",{"path":213,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":214,"sourceHtmlUrl":215},"src\u002Fskill_studio\u002Finterview\u002Fmodes.py",1423,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Finterview\u002Fmodes.py",{"path":217,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":218,"sourceHtmlUrl":219},"src\u002Fskill_studio\u002Finterview\u002Fphases.py",649,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Finterview\u002Fphases.py",{"path":221,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":222,"sourceHtmlUrl":223},"src\u002Fskill_studio\u002Finterview\u002Fquestion_picker.py",4151,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Finterview\u002Fquestion_picker.py",{"path":225,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":226,"sourceHtmlUrl":227},"src\u002Fskill_studio\u002Finterview\u002Fsubjects.py",2662,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Finterview\u002Fsubjects.py",{"path":229,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":230,"sourceHtmlUrl":231},"src\u002Fskill_studio\u002Finterview\u002Fupdater.py",1040,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Finterview\u002Fupdater.py",{"path":233,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":234,"sourceHtmlUrl":235},"src\u002Fskill_studio\u002Fllm_provider.py",2800,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Fllm_provider.py",{"path":237,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":238,"sourceHtmlUrl":239},"src\u002Fskill_studio\u002Fpaths.py",1987,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Fpaths.py",{"path":241,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":242,"sourceHtmlUrl":243},"src\u002Fskill_studio\u002Fpresets\u002F__init__.py",721,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Fpresets\u002F__init__.py",{"path":245,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":246,"sourceHtmlUrl":247},"src\u002Fskill_studio\u002Fpresets\u002Fai_agent.yaml",452,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Fpresets\u002Fai_agent.yaml",{"path":249,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":250,"sourceHtmlUrl":251},"src\u002Fskill_studio\u002Fpresets\u002Fcustom.yaml",415,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Fpresets\u002Fcustom.yaml",{"path":253,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":254,"sourceHtmlUrl":255},"src\u002Fskill_studio\u002Fpresets\u002Fknowledge_work.yaml",492,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Fpresets\u002Fknowledge_work.yaml",{"path":257,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":258,"sourceHtmlUrl":259},"src\u002Fskill_studio\u002Fpresets\u002Flife_automation.yaml",467,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Fpresets\u002Flife_automation.yaml",{"path":261,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":262,"sourceHtmlUrl":263},"src\u002Fskill_studio\u002Fschema.py",3260,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Fschema.py",{"path":265,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":266,"sourceHtmlUrl":267},"src\u002Fskill_studio\u002Fsetup.py",4401,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Fsetup.py",{"path":269,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":270,"sourceHtmlUrl":271},"src\u002Fskill_studio\u002Fsops_helper.py",1500,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Fsops_helper.py",{"path":273,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":274,"sourceHtmlUrl":275},"src\u002Fskill_studio\u002Fstorage.py",2374,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Fstorage.py",{"path":277,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":278,"sourceHtmlUrl":279},"src\u002Fskill_studio\u002Fsynthesis.py",4569,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Fsynthesis.py",{"path":281,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":14,"sourceHtmlUrl":282},"src\u002Fskill_studio\u002Fvoice\u002F__init__.py","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Fvoice\u002F__init__.py",{"path":284,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":285,"sourceHtmlUrl":286},"src\u002Fskill_studio\u002Fvoice\u002Fpipecat_interview.py",18703,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Fsrc\u002Fskill_studio\u002Fvoice\u002Fpipecat_interview.py",{"path":288,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":14,"sourceHtmlUrl":289},"tests\u002F__init__.py","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002F__init__.py",{"path":291,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":292,"sourceHtmlUrl":293},"tests\u002Ffixtures\u002Fsample_design.json",1888,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ffixtures\u002Fsample_design.json",{"path":295,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":296,"sourceHtmlUrl":297},"tests\u002Ftest_anthropic_client.py",717,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_anthropic_client.py",{"path":299,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":300,"sourceHtmlUrl":301},"tests\u002Ftest_bugfixes.py",2733,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_bugfixes.py",{"path":303,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":304,"sourceHtmlUrl":305},"tests\u002Ftest_cli_state_ops.py",6739,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_cli_state_ops.py",{"path":307,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":308,"sourceHtmlUrl":309},"tests\u002Ftest_cli.py",1924,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_cli.py",{"path":311,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":312,"sourceHtmlUrl":313},"tests\u002Ftest_combined.py",2549,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_combined.py",{"path":315,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":316,"sourceHtmlUrl":317},"tests\u002Ftest_coverage.py",1074,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_coverage.py",{"path":319,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":320,"sourceHtmlUrl":321},"tests\u002Ftest_director.py",4209,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_director.py",{"path":323,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":324,"sourceHtmlUrl":325},"tests\u002Ftest_e2e_text_interview.py",1529,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_e2e_text_interview.py",{"path":327,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":328,"sourceHtmlUrl":329},"tests\u002Ftest_exporter_registry.py",361,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_exporter_registry.py",{"path":331,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":332,"sourceHtmlUrl":333},"tests\u002Ftest_extractor.py",3321,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_extractor.py",{"path":335,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":336,"sourceHtmlUrl":337},"tests\u002Ftest_frame_suggester.py",876,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_frame_suggester.py",{"path":339,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":340,"sourceHtmlUrl":341},"tests\u002Ftest_frameworks.py",1093,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_frameworks.py",{"path":343,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":344,"sourceHtmlUrl":345},"tests\u002Ftest_ingest.py",4877,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_ingest.py",{"path":347,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":348,"sourceHtmlUrl":349},"tests\u002Ftest_init_wizard.py",3763,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_init_wizard.py",{"path":351,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":352,"sourceHtmlUrl":353},"tests\u002Ftest_interview_integration.py",4968,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_interview_integration.py",{"path":355,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":356,"sourceHtmlUrl":357},"tests\u002Ftest_llm_provider.py",3950,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_llm_provider.py",{"path":359,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":360,"sourceHtmlUrl":361},"tests\u002Ftest_loop_persist.py",3069,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_loop_persist.py",{"path":363,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":364,"sourceHtmlUrl":365},"tests\u002Ftest_loop.py",3574,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_loop.py",{"path":367,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":368,"sourceHtmlUrl":369},"tests\u002Ftest_md_svg_exporter.py",1102,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_md_svg_exporter.py",{"path":371,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":372,"sourceHtmlUrl":373},"tests\u002Ftest_merge.py",1026,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_merge.py",{"path":375,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":376,"sourceHtmlUrl":377},"tests\u002Ftest_modes.py",901,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_modes.py",{"path":379,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":380,"sourceHtmlUrl":381},"tests\u002Ftest_phases.py",822,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_phases.py",{"path":383,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":384,"sourceHtmlUrl":385},"tests\u002Ftest_presets.py",596,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_presets.py",{"path":387,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":388,"sourceHtmlUrl":389},"tests\u002Ftest_question_picker_dedup.py",3095,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_question_picker_dedup.py",{"path":391,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":392,"sourceHtmlUrl":393},"tests\u002Ftest_question_picker.py",1311,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_question_picker.py",{"path":395,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":396,"sourceHtmlUrl":397},"tests\u002Ftest_schema.py",1021,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_schema.py",{"path":399,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":400,"sourceHtmlUrl":401},"tests\u002Ftest_setup.py",4272,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_setup.py",{"path":403,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":404,"sourceHtmlUrl":405},"tests\u002Ftest_sops_helper.py",1140,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_sops_helper.py",{"path":407,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":408,"sourceHtmlUrl":409},"tests\u002Ftest_storage.py",2882,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_storage.py",{"path":411,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":412,"sourceHtmlUrl":413},"tests\u002Ftest_subjects.py",1379,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_subjects.py",{"path":415,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":416,"sourceHtmlUrl":417},"tests\u002Ftest_synthesis.py",4645,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_synthesis.py",{"path":419,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":420,"sourceHtmlUrl":421},"tests\u002Ftest_updater.py",1976,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_updater.py",{"path":423,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":424,"sourceHtmlUrl":425},"tests\u002Ftest_voice_commands.py",1449,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_voice_commands.py",{"path":427,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":428,"sourceHtmlUrl":429},"tests\u002Ftest_voice_interview.py",3084,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fskill-studio\u002Ftests\u002Ftest_voice_interview.py",[431,463,489,512,534,549],{"skillNo":432,"name":433,"nameZh":6,"description":434,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":435,"licenseFileUrl":436,"sourceHtmlUrl":437,"categories":438,"keywords":445,"publishedAt":50},"01M71QDV4DM8T19HEHWATEF1K4","webapp-testing","Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fwebapp-testing\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fwebapp-testing\u002FSKILL.md",[439,442],{"categoryNo":440,"categoryName":441,"taxonomyType":22,"taxonomyTypeDesc":23},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":443,"categoryName":444,"taxonomyType":22,"taxonomyTypeDesc":23},"01JBSEEDCAT000000000000009","前端开发",[446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462],"webapp","testing","webapp testing","for","applications","local","frontend","debugging","toolkit","logs","browser","with","playwright","web","behavior","ui","screenshots",{"skillNo":464,"name":465,"nameZh":6,"description":466,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":435,"licenseFileUrl":467,"sourceHtmlUrl":468,"categories":469,"keywords":471,"publishedAt":50},"01M71QDH2GGMXGA9105C9W1N7B","web-artifacts-builder","Suite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn\u002Fui). Use for complex artifacts requiring state management, routing, or shadcn\u002Fui components - not for simple single-file HTML\u002FJSX artifacts.","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fweb-artifacts-builder\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fweb-artifacts-builder\u002FSKILL.md",[470],{"categoryNo":443,"categoryName":444,"taxonomyType":22,"taxonomyTypeDesc":23},[472,473,474,459,475,476,477,449,478,479,452,480,481,482,483,484,485,486,487,488],"builder","artifacts builder","artifacts","web artifacts builder","single-file","css","Tailwind","ui components","single","use","file","components","react","multi","state","routing","state management",{"skillNo":490,"name":491,"nameZh":6,"description":492,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":493,"sourceHtmlUrl":494,"categories":495,"keywords":497,"publishedAt":50},"01M71QD9T2XC3EWMQNN9ACNWQ1","vueuse-functions","Apply VueUse composables where appropriate to build concise, maintainable Vue.js \u002F Nuxt features.","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvueuse-functions\u002FLICENSE.md","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvueuse-functions\u002FSKILL.md",[496],{"categoryNo":443,"categoryName":444,"taxonomyType":22,"taxonomyTypeDesc":23},[498,499,500,501,502,503,504,505,506,507,508,509,510,511],"functions","vueuse","vueuse functions","project","nuxt","apply","github","concise","build","https","features","vue","js","composables",{"skillNo":513,"name":514,"nameZh":6,"description":515,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":516,"sourceHtmlUrl":517,"categories":518,"keywords":521,"publishedAt":50},"01M71QD51HWSGYMCMB7RW7PGK8","vue-testing-best-practices","Use for Vue.js testing. Covers Vitest, Vue Test Utils, component testing, mocking, testing patterns, and Playwright for E2E testing.","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvue-testing-best-practices\u002FLICENSE.md","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvue-testing-best-practices\u002FSKILL.md",[519,520],{"categoryNo":440,"categoryName":441,"taxonomyType":22,"taxonomyTypeDesc":23},{"categoryNo":443,"categoryName":444,"taxonomyType":22,"taxonomyTypeDesc":23},[522,447,523,509,524,458,525,526,527,504,528,449,529,530,531,481,532,510,533],"vue testing best practices","testing best practices","best practices","test","testing patterns","component","vitest","mocking","e2e","utils","patterns","e2e testing",{"skillNo":535,"name":536,"nameZh":6,"description":537,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":538,"sourceHtmlUrl":539,"categories":540,"keywords":542,"publishedAt":50},"01M71QD358H2DJ9THJRBP77T3T","vue-router-best-practices","Vue Router 4 patterns, navigation guards, route params, and route-component lifecycle interactions.","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvue-router-best-practices\u002FLICENSE.md","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvue-router-best-practices\u002FSKILL.md",[541],{"categoryNo":443,"categoryName":444,"taxonomyType":22,"taxonomyTypeDesc":23},[543,509,544,524,545,527,546,504,532,547,548],"router","vue router best practices","route","guards","navigation","lifecycle",{"skillNo":550,"name":551,"nameZh":6,"description":552,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":553,"sourceHtmlUrl":554,"categories":555,"keywords":557,"publishedAt":50},"01M71QCYPNWDE2MQZ1TF3ED5S4","vue-best-practices","MUST be used for Vue.js tasks. Strongly recommends Composition API with `\u003Cscript setup>` and TypeScript as the standard approach. Covers Vue 3, SSR, Volar, vue-tsc. Load for any Vue, .vue files, Vue Router, Pinia, or Vite with Vue work. ALWAYS use Composition API unless the project explicitly requires Options API.","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvue-best-practices\u002FLICENSE.md","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvue-best-practices\u002FSKILL.md",[556],{"categoryNo":443,"categoryName":444,"taxonomyType":22,"taxonomyTypeDesc":23},[558,509,524,559,501,560,561,562,543,563,35,564,565,566,567,449,568,481,569,570],"vue best practices","Composition","files","tasks","api","pinia","options","ssr","typescript","as","vite","load","standard"]