코드베이스 온보딩을 위해 특정 파일과 줄 번호를 연결하는 페르소나 맞춤형 단계별 가이드를 .tour 파일로 생성합니다.
- GitHub 스타
- 41,038
- 파일
- 5
- 마지막 커밋
- 2026년 11월 11일
- 라이선스
- MIT
- 허용된 도구
- —
code-tour skill은 무엇을 하나요?
code-tour은(는) agent skill입니다. 코드베이스 온보딩을 위해 특정 파일과 줄 번호를 연결하는 페르소나 맞춤형 단계별 가이드를 .tour 파일로 생성합니다.
skill의 SKILL.md에서 생성된 요약입니다.
code-tour skill 정보
code-tour는 구조화된 워크스루를 생성하여 신입 개발자의 온보딩을 돕거나 복잡한 코드 변경 사항을 설명합니다. .tours/ 디렉토리에 .tour 파일을 생성하며, 이는 특정 파일 및 줄 번호와 직접 연결되어 VS Code CodeTour 확장 프로그램과 호환됩니다. 이 SKILL은 신입 사원부터 아키텍트, 보안 검토자, 버그 수정 담당자에 이르기까지 20가지의 다양한 개발자 페르소나를 지원합니다.
사용자가 워크스루, PR 리뷰 투어 또는 특정 기능의 작동 방식에 대한 설명을 요청할 때 에이전트는 이 SKILL을 로드해야 합니다. 실제 코드베이스를 읽어 세부 내용을 채우기 전에 특정 Python 스크립트를 사용하여 기존 문서로부터 스켈레톤을 생성할 수 있습니다. 정확성을 보장하기 위해 이 SKILL은 검증 스크립트를 사용하여 JSON 유효성, 파일 존재 여부 및 줄 번호 범위를 확인합니다. 필드 정확성을 위해 제공된 JSON schema를 사용하며, 패턴, 선택 또는 터미널 명령과 같은 다양한 단계 유형을 통합하여 독자를 위한 서사적인 이야기를 만들 수 있습니다.
skill의 SKILL.md를 기반으로 작성되었습니다. 모든 사용 사례는 해당 문서의 인용구와 대조 확인되었습니다.
code-tour skill 설치 방법
각 명령은 skill 폴더를 클라이언트의 skills 디렉터리에 복사합니다. 클라이언트를 재시작하거나 새 세션을 시작하여 로드하세요.Claude Code에 code-tour skill 설치
~/.claude/skills/code-tour/SKILL.md
$ npx degit github/awesome-copilot/skills/code-tour ~/.claude/skills/code-tourClaude Code (project)에 code-tour skill 설치
.claude/skills/code-tour/SKILL.md
$ npx degit github/awesome-copilot/skills/code-tour .claude/skills/code-tourCodex에 code-tour skill 설치
~/.agents/skills/code-tour/SKILL.md
$ npx degit github/awesome-copilot/skills/code-tour ~/.agents/skills/code-tourGemini CLI에 code-tour skill 설치
~/.gemini/skills/code-tour/SKILL.md
$ npx degit github/awesome-copilot/skills/code-tour ~/.gemini/skills/code-tourClaude.ai에 code-tour skill 설치
npx degit github/awesome-copilot/skills/code-tour code-tour && zip -r code-tour.zip code-tour # claude.ai → Customize → Skills → + → Create skill → Upload a skill → code-tour.zip
자동 검사
2026년 11월 13일에 실행됨전체 보고서 →자동 검사를 통과했습니다. 보안 감사는 아닙니다. 에이전트가 실행하기 전에 스크립트를 읽어 보세요. 검사 방식
- 소스 저장소 연결 및 접근 가능github/awesome-copilot/skills/code-tour is public and reachablegithub.com/github/awesome-copilot/tree/HEAD/skills/code-tour ↗통과
- 오픈 소스 라이선스 (OSI)MITspdx.org/licenses/MIT.html ↗통과
- 최근 1년 내 커밋 또는 릴리스Last commit 2026-11-11github.com/github/awesome-copilot/commits ↗통과
- 스크립트에 다운로드 후 실행이나 자격 증명 탈취가 없음2 scripts read; no download-and-run, remote eval, base64 execution or credential upload통과
- SKILL.md에 숨겨진 지침 없음No override phrases, safeguard switches, credential requests or hidden charactersgithub.com/github/awesome-copilot/blob/HEAD/skills/code-tour ↗통과
- 사전 허용 도구가 제한됨No pre-approved tools; the agent asks before using onegithub.com/github/awesome-copilot/blob/HEAD/skills/code-tour ↗통과
SKILL.md
GitHub에서 보기Code Tour Skill
You are creating a CodeTour — a persona-targeted, step-by-step walkthrough of a codebase
that links directly to files and line numbers. CodeTour files live in .tours/ and work with
the VS Code CodeTour extension.
Two scripts are bundled in scripts/:
scripts/validate_tour.py— run after writing any tour. Checks JSON validity, file/directory existence, line numbers within bounds, pattern matches, nextTour cross-references, and narrative arc. Run it:python ~/.agents/skills/code-tour/scripts/validate_tour.py .tours/<name>.tour --repo-root .scripts/generate_from_docs.py— when the user asks to generate from README/docs, run this first to extract a skeleton, then fill it in. Run it:python ~/.agents/skills/code-tour/scripts/generate_from_docs.py --persona new-joiner --output .tours/skeleton.tour
Two reference files are bundled:
references/codetour-schema.json— the authoritative JSON schema. Read it to verify any field name or type. Every field you use must conform to it.references/examples.md— 8 real-world CodeTour tours from production repos with annotated techniques. Read it when you want to see how a specific feature (commands,selection,view,pattern,isPrimary, multi-tour series) is used in practice.
Real-world .tour files on GitHub
These are confirmed production .tour files. Fetch one when you need a working example of a specific step type, tour-level field, or narrative structure — don't write from memory when the real thing is one fetch away.
Find more with the GitHub code search: https://github.com/search?q=path%3A**%2F*.tour+&type=code
By step type / technique demonstrated
| What to study | File URL |
|---|---|
directory + file+line (contributor onboarding) |
https://github.com/coder/code-server/blob/main/.tours/contributing.tour |
selection + file+line + intro content step (accessibility project) |
https://github.com/a11yproject/a11yproject.com/blob/main/.tours/code-tour.tour |
Minimal tutorial — tight file+line narration for interactive learning |
https://github.com/lostintangent/rock-paper-scissors/blob/master/main.tour |
Multi-tour repo with nextTour chaining (cloud native OCI walkthroughs) |
https://github.com/lucasjellema/cloudnative-on-oci-2021/blob/main/.tours/introduction.tour |
isPrimary: true (marks the onboarding entry point) |
https://github.com/nickvdyck/webbundlr/blob/main/.tours/getting-started.tour |
pattern instead of line (regex-anchored steps) |
https://github.com/nickvdyck/webbundlr/blob/main/.tours/architecture.tour |
Raw content tip: Prefix raw.githubusercontent.com and drop /blob/ for raw JSON access.
A great tour is not just annotated files. It is a narrative — a story told to a specific person about what matters, why it matters, and what to do next. Your goal is to write the tour that the right person would wish existed when they first opened this repo.
CRITICAL: Only create .tour JSON files. Never create, modify, or scaffold any other files.
Step 1: Discover the repo
Before asking the user anything, explore the codebase:
- List the root directory, read the README, and check key config files (package.json, pyproject.toml, go.mod, Cargo.toml, composer.json, etc.)
- Identify the language(s), framework(s), and what the project does
- Map the folder structure 1–2 levels deep
- Find entry points: main files, index files, app bootstrapping
- Note which files actually exist — every path you write in the tour must be real
If the repo is sparse or empty, say so and work with what exists.
If the user says "generate from README" or "use the docs": run the skeleton generator first, then fill in every [TODO: ...] by reading the actual files:
python skills/code-tour/scripts/generate_from_docs.py \
--persona new-joiner \
--output .tours/skeleton.tour
Entry points by language/framework
Don't read everything — start here, then follow imports.
| Stack | Entry points to read first |
|---|---|
| Node.js / TS | index.js/ts, server.js, app.js, src/main.ts, package.json (scripts) |
| Python | main.py, app.py, __main__.py, manage.py (Django), app/__init__.py (Flask/FastAPI) |
| Go | main.go, cmd/<name>/main.go, internal/ |
| Rust | src/main.rs, src/lib.rs, Cargo.toml |
| Java / Kotlin | *Application.java, src/main/java/.../Main.java, build.gradle |
| Ruby | config/application.rb, config/routes.rb, app/controllers/application_controller.rb |
| PHP | index.php, public/index.php, bootstrap/app.php (Laravel) |
Repo type variants — adjust focus accordingly
The same persona asks for different things depending on what kind of repo this is:
| Repo type | What to emphasize | Typical anchor files |
|---|---|---|
| Service / API | Request lifecycle, auth, error contracts | router, middleware, handler, schema |
| Library / SDK | Public API surface, extension points, versioning | index/exports, types, changelog |
| CLI tool | Command parsing, config loading, output formatting | main, commands/, config |
| Monorepo | Package boundaries, shared contracts, build graph | root package.json/pnpm-workspace, shared/, packages/ |
| Framework | Plugin system, lifecycle hooks, escape hatches | core/, plugins/, lifecycle |
| Data pipeline | Source → transform → sink, schema ownership | ingest/, transform/, schema/, dbt models |
| Frontend app | Component hierarchy, state management, routing | pages/, store/, router, api/ |
For monorepos: identify the 2–3 packages most relevant to the persona's goal. Don't try to tour everything — open the tour with a step that explains how to navigate the workspace, then stay focused.
Large repo strategy
For repos with 100+ files: don't try to read everything.
- Read entry points and the README first
- Build a mental model of the top 5–7 modules
- For the requested persona, identify the 2–3 modules that matter most and read those deeply
- For modules you're not covering, mention them in the intro step as "out of scope for this tour"
- Use
directorysteps for areas you mapped but didn't read — they orient without requiring full knowledge
A focused 10-step tour of the right files beats a scattered 25-step tour of everything.
Step 2: Read the intent — infer everything you can, ask only what you can't
One message from the user should be enough. Read their request and infer persona, depth, and focus before asking anything.
Intent map
| User says | → Persona | → Depth | → Action |
|---|---|---|---|
| "tour for this PR" / "PR review" / "#123" | pr-reviewer | standard | Add uri step for the PR; use ref for the branch |
| "why did X break" / "RCA" / "incident" | rca-investigator | standard | Trace the failure causality chain |
| "debug X" / "bug tour" / "find the bug" | bug-fixer | standard | Entry → fault points → tests |
| "onboarding" / "new joiner" / "ramp up" | new-joiner | standard | Directories, setup, business context |
| "quick tour" / "vibe check" / "just the gist" | vibecoder | quick | 5–8 steps, fast path only |
| "explain how X works" / "feature tour" | feature-explainer | standard | UI → API → backend → storage |
| "architecture" / "tech lead" / "system design" | architect | deep | Boundaries, decisions, tradeoffs |
| "security" / "auth review" / "trust boundaries" | security-reviewer | standard | Auth flow, validation, sensitive sinks |
| "refactor" / "safe to extract?" | refactorer | standard | Seams, hidden deps, extraction order |
| "performance" / "bottlenecks" / "slow path" | performance-optimizer | standard | Hot path, N+1, I/O, caches |
| "contributor" / "open source onboarding" | external-contributor | quick | Safe areas, conventions, landmines |
| "concept" / "explain pattern X" | concept-learner | standard | Concept → implementation → rationale |
| "test coverage" / "where to add tests" | test-writer | standard | Contracts, seams, coverage gaps |
| "how do I call the API" | api-consumer | standard | Public surface, auth, error semantics |
Infer silently: persona, depth, focus area, whether to add uri/ref, isPrimary.
Ask only if you genuinely can't infer:
- "bug tour" but no bug described → ask for the bug description
- "feature tour" but no feature named → ask which feature
- "specific files" explicitly requested → honor them as required stops
Never ask about nextTour, commands, when, or stepMarker unless the user mentioned them.
PR tour recipe
For PR tours: set "ref" to the branch, open with a uri step for the PR, cover changed files first, then unchanged-but-critical files, close with a reviewer checklist.
User-provided customization — always honor these
| User says | What to do |
|---|---|
"cover src/auth.ts and config/db.yml" |
Those files are required stops |
"pin to the v2.3.0 tag" / "this commit: abc123" |
Set "ref": "v2.3.0" |
| "link to PR #456" / pastes a URL | Add a uri step at the right narrative moment |
| "lead into the security tour when done" | Set "nextTour": "Security Review" |
| "make this the main onboarding tour" | Set "isPrimary": true |
| "open a terminal at this step" | Add "commands": ["workbench.action.terminal.focus"] |
| "deep" / "thorough" / "5 steps" / "quick" | Override depth accordingly |
Step 3: Read the actual files — no exceptions
Every file path and line number in the tour must be verified by reading the file. A tour pointing to the wrong file or a non-existent line is worse than no tour.
For every planned step:
- Read the file
- Find the exact line of the code you want to highlight
- Understand it well enough to explain it to the target persona
If a user-requested file doesn't exist, say so — don't silently substitute another.
Step 4: Write the tour
Save to .tours/<persona>-<focus>.tour. Read references/codetour-schema.json for the
authoritative field list. Every field you use must appear in that schema.
Tour root
{
"$schema": "https://aka.ms/codetour-schema",
"title": "Descriptive Title — Persona / Goal",
"description": "One sentence: who this is for and what they'll understand after.",
"ref": "main",
"isPrimary": false,
"nextTour": "Title of follow-up tour",
"steps": []
}
Omit any field that doesn't apply to this tour.
when — conditional display. A JavaScript expression evaluated at runtime. Only show this tour
if the condition is true. Useful for persona-specific auto-launching, or hiding advanced tours
until a simpler one is complete.
{ "when": "workspaceFolders[0].name === 'api'" }
stepMarker — embed step anchors directly in source code comments. When set, CodeTour
looks for // <stepMarker> comments in files and uses them as step positions instead of
(or alongside) line numbers. Useful for tours on actively changing code where line numbers
shift constantly. Example: set "stepMarker": "CT" and put // CT in the source file.
Don't suggest this unless the user asks — it requires editing source files, which is unusual.
Step types — full reference
All step types: content (intro/closing, max 2), directory, file+line (workhorse), selection (code block), pattern (regex match), uri (external link), view (focus VS Code panel), commands (run VS Code commands).
Path rule:
"file"and"directory"must be relative to repo root. No absolute paths, no leading./.
When to use each step type
| Situation | Step type |
|---|---|
| Tour intro or closing | content |
| "Here's what lives in this folder" | directory |
| One line tells the whole story | file + line |
| A function/class body is the point | selection |
| Line numbers shift, file is volatile | pattern |
| PR / issue / doc gives the "why" | uri |
| Reader should open terminal or explorer | view or commands |
Step count calibration
Match steps to depth and persona. These are targets, not hard limits.
| Depth | Total steps | Core path steps | Notes |
|---|---|---|---|
| Quick | 5–8 | 3–5 | Vibecoder, fast explorer — cut ruthlessly |
| Standard | 9–13 | 6–9 | Most personas — breadth + enough detail |
| Deep | 14–18 | 10–13 | Architect, RCA — every tradeoff surfaced |
Scale with repo size too. A 3-file CLI doesn't get 15 steps. A 200-file monolith shouldn't be squeezed into 5.
| Repo size | Recommended standard depth |
|---|---|
| Tiny (< 20 files) | 5–8 steps |
| Small (20–80 files) | 8–11 steps |
| Medium (80–300 files) | 10–13 steps |
| Large (300+ files) | 12–15 steps (scoped to relevant subsystem) |
Writing excellent descriptions — the SMIG formula
Every description should answer four questions in order. You don't need four paragraphs — but every description needs all four elements, even briefly.
S — Situation: What is the reader looking at? One sentence grounding them in context. M — Mechanism: How does this code work? What pattern, rule, or design is in play? I — Implication: Why does this matter for this persona's goal specifically? G — Gotcha: What would a smart person get wrong here? What's non-obvious, fragile, or surprising?
Descriptions should tell the reader something they couldn't learn by reading the file themselves. Name the pattern, explain the design decision, flag failure modes, and cross-reference related context.
Narrative arc — every tour, every persona
-
Orientation — must be a
fileordirectorystep, never content-only. Use"file": "README.md", "line": 1or"directory": "src"and put your welcome text in the description. A content-only first step (nofile,directory, oruri) renders as a blank page in VS Code CodeTour — this is a known VS Code extension behaviour, not configurable. -
High-level map (1–3 directory or uri steps) — major modules and how they relate. Not every folder — just what this persona needs to know.
-
Core path (file/line, selection, pattern, uri steps) — the specific code that matters. This is the heart of the tour. Read and narrate. Don't skim.
-
Closing (content) — what the reader now understands, what they can do next, 2–3 suggested follow-up tours. If
nextTouris set, reference it by name here.
Closing steps
Don't summarize — the reader just read it. Instead, tell them what they can now do, what to avoid, and suggest 2-3 follow-up tours.
The 20 personas
| Persona | Goal | Must cover | Avoid |
|---|---|---|---|
| Vibecoder | Get the vibe fast | Entry point, request flow, main modules. Max 8 steps. | Deep dives, edge cases |
| New joiner | Structured ramp-up | Directories, setup, business context, service boundaries. | Advanced internals |
| Bug fixer | Root cause fast | User action → trigger → fault points. Repro hints + test locations. | Architecture tours |
| RCA investigator | Why did it fail | Causality chain, side effects, race conditions, observability. | Happy path |
| Feature explainer | One feature end-to-end | UI → API → backend → storage. Feature flags, edge cases. | Unrelated features |
| PR reviewer | Review the change correctly | Change story, invariants, risky areas, reviewer checklist. URI step for PR. | Unrelated context |
| Security reviewer | Trust boundaries | Auth flow, input validation, secret handling, sensitive sinks. | Unrelated business logic |
| Refactorer | Safe restructuring | Seams, hidden deps, coupling hotspots, safe extraction order. | Feature explanations |
| External contributor | Contribute without breaking | Safe areas, code style, architecture landmines. | Deep internals |
| Tech lead / architect | Shape and rationale | Module boundaries, design tradeoffs, risk hotspots. | Line-by-line walkthroughs |
Designing a tour series
When a codebase is complex enough that one tour can't cover it well, design a series.
The nextTour field chains them: when the reader finishes one tour, VS Code offers to
launch the next automatically.
Plan the series before writing any tour. A good series has:
- A clear escalation path (broad → narrow, orientation → deep-dive)
- No duplicate steps between tours
- Each tour standalone enough to be useful on its own
Set nextTour in each tour to the title of the next one (must match exactly). Each tour should be standalone enough to be useful on its own.
What CodeTour cannot do
If asked for any of these, say clearly that it's not supported — do not suggest a workaround that doesn't exist:
| Request | Reality |
|---|---|
| Auto-advance to next step after X seconds | Not supported. Navigation is always manual — the reader clicks Next. There is no timer, delay, or autoplay step mechanic in CodeTour. |
| Embed a video or GIF in a step | Not supported. Descriptions are Markdown text only. |
| Run arbitrary shell commands | Not supported. commands only executes VS Code commands (e.g. workbench.action.terminal.focus), not shell commands. |
| Branch / conditional next step | Not supported. Tours are linear. when controls whether a tour is shown, not which step follows which. |
| Show a step without opening a file | Partially — content-only steps work, but step 1 must have a file or directory anchor or VS Code shows a blank page. |
Anti-patterns
| Anti-pattern | Fix |
|---|---|
| File listing — visiting files with "this file contains..." | Tell a story; each step should depend on the previous one |
| Generic descriptions | Name the specific pattern/gotcha unique to this codebase |
| Line number guessing | Never write a line number you didn't verify by reading the file |
| Ignoring the persona | Cut every step that doesn't serve their specific goal |
| Hallucinated files | If a file doesn't exist, skip the step |
Quality checklist — verify before writing the file
- Every
filepath is relative to the repo root (no leading/or./) - Every
filepath read and confirmed to exist - Every
linenumber verified by reading the file (not guessed) - Every
directoryis relative to the repo root and confirmed to exist - Every
patternregex would match a real line in the file - Every
uriis a complete, real URL (https://...) -
refis a real branch/tag/commit if set -
nextTourexactly matches thetitleof another.tourfile if set - Only
.tourJSON files created — no source code touched - First step has a
fileordirectoryanchor (content-only first step = blank page in VS Code) - Tour ends with a closing content step that tells the reader what they can do next
- Every description answers SMIG — Situation, Mechanism, Implication, Gotcha
- Persona's priorities drive step selection (cut everything that doesn't serve their goal)
- Step count matches requested depth and repo size (see calibration table)
- At most 2 content-only steps (intro + closing)
- All fields conform to
references/codetour-schema.json
Step 5: Validate the tour
Always run the validator immediately after writing the tour file. Do not skip this step.
python ~/.agents/skills/code-tour/scripts/validate_tour.py .tours/<name>.tour --repo-root .
The validator checks:
- JSON validity
- Every
filepath exists and everylineis within file bounds - Every
directoryexists - Every
patternregex compiles and matches at least one line in the file - Every
uristarts withhttps:// nextTourmatches an existing tour title in.tours/- Content-only step count (warns if > 2)
- Narrative arc (warns if no orientation or closing step)
Fix every error before proceeding. Re-run until the validator reports ✓ or only warnings. Warnings are advisory — use your judgment. Do not show the user the tour until validation passes.
Common VS Code issues: Content-only first step renders blank (anchor to file/directory instead). Absolute or ./-prefixed paths silently fail. Out-of-bounds line numbers scroll nowhere.
If you can't run scripts, manually verify: step 1 has file/directory, all paths exist, all line numbers are in bounds, nextTour matches exactly.
Autoplay: isPrimary: true + .vscode/settings.json with { "codetour.promptForPrimaryTour": true } prompts on repo open. Omit ref for tours that should appear on any branch.
Share: For public repos, users can open tours at https://vscode.dev/github.com/<owner>/<repo> with no install.
Step 6: Summarize
After writing the tour, tell the user:
- File path (
.tours/<name>.tour) - One-paragraph summary of what the tour covers and who it's for
- The
vscode.devURL if the repo is public (so they can share it immediately) - 2–3 suggested follow-up tours (or the next tour in the series if one was planned)
- Any user-requested files that didn't exist (be explicit — don't quietly substitute)
File naming
<persona>-<focus>.tour — kebab-case, communicates both:
onboarding-new-joiner.tour
bug-fixer-payment-flow.tour
architect-overview.tour
vibecoder-quickstart.tour
pr-review-auth-refactor.tour
security-auth-boundaries.tour
concept-dependency-injection.tour
rca-login-outage.tour
이 스킬의 파일
5code-tour skill 질문
Claude Code에 code-tour skill을 어떻게 설치하나요?
npx degit github/awesome-copilot/skills/code-tour ~/.claude/skills/code-tour를 실행합니다. Claude Code는 ~/.claude/skills(모든 프로젝트) 또는 .claude/skills(한 프로젝트)에서 skills를 로드하며, 설명이 작업과 일치할 때 skill을 사용합니다.
code-tour skill을 사용할 수 있는 클라이언트는 무엇인가요?
Agent Skills 형식을 읽는 모든 클라이언트(Claude Code, Codex, Gemini CLI, claude.ai(ZIP으로 업로드))가 사용할 수 있습니다. skill 내 스크립트는 클라이언트가 코드 실행을 허용하는 경우에만 실행됩니다.
CodeTour란 무엇인가요?
.tours/ 디렉토리에 .tour 파일로 저장되며, 파일 및 줄 번호로 직접 연결되는 페르소나 맞춤형 코드베이스 단계별 가이드입니다.
tour 파일을 어떻게 검증할 수 있나요?
validate_tour.py 스크립트를 사용하여 JSON 유효성, 파일 존재 여부, 줄 번호 범위 및 서사 구조를 확인할 수 있습니다.
기존 문서를 사용하여 tour를 생성할 수 있나요?
네, generate_from_docs.py 스크립트를 사용하여 README 또는 기타 문서에서 스켈레톤을 추출한 후 세부 내용을 채울 수 있습니다.