{"id":"23dc21ee-d42f-4f62-9a03-274a3137a395","shortId":"zSrKAb","kind":"skill","title":"codewiki","tagline":"Generate a structured product knowledge base from codebase scanning. Creates a codewiki/ folder with architecture docs, user flows, API reference, service maps, and more. Also generates CLAUDE.md. Handles single repos, monorepos, and multi-repo microservices. Use when asked to do","description":"# CodeWiki — Product Knowledge Base Generator\n\nScan code, fetch product context, discover user flows, and generate a structured `codewiki/` knowledge base.\n\nOutput templates are in this skill's `templates/` directory. Read each template only when generating that specific file — do NOT load all templates at once.\n\n## HARD RULES\n\n1. **Phase 1 is not optional.** Product context is the difference between a useful wiki and a mechanical code listing. Complete it before scanning. If user can't answer, use the code-first fallback.\n2. **Multi-repo workspace must be verified before scanning.** If repos aren't in a shared parent folder, stop and help the user set it up.\n3. **Never scan all repos simultaneously.** Use Scan → Write to `_scratch/` → Carry 30-line summary → Next. This is how you survive large multi-repo projects.\n4. **Never skip a service in microservices.** User flows that touch 5 services are useless if one is undocumented. Every service gets at least a lightweight scan.\n5. **Scan in priority order.** Infrastructure/contracts → gateway → frontends → core business services → supporting services.\n6. **Report progress between repos.** Tell the user what you found and which repo is next. Do not ask for permission between repos — just continue. Only pause on errors or contradictions.\n7. **On startup, check if `codewiki/_scratch/` exists.** If it does, offer to resume from previous scan data.\n8. **Always use `codewiki/` (no dot prefix).** Ensures visibility in file explorers and default git tracking.\n9. **Adaptive detection.** If hardcoded grep patterns don't match anything for a component, read the entry point file and trace outward. Don't report \"no endpoints found\" without trying alternative approaches.\n10. **WebFetch failures.** Report the specific error (401, 404, timeout) and continue. Never silently skip a URL.\n\n---\n\n## Phase 1: Product Context Gathering (MANDATORY — DO NOT SKIP)\n\n> **STOP. You MUST complete Phase 1 before scanning any code.**\n> Do not run `ls`, `grep`, or read any files until Phase 1 is done.\n> If the user says \"just scan the code\" or tries to skip, explain that\n> the wiki quality depends heavily on product context and ask them to\n> answer at least questions 1–3 before proceeding.\n\n### Step 1a: Ask the User\n\nAsk all of these in a single message. Mark which are required vs. optional:\n\n1. **Product name** *(required)* — What is this product called?\n2. **One-liner** *(required)* — Describe it in one sentence. What does it do and for whom?\n3. **Target users** *(required)* — Who uses this? (e.g., developers, marketers, internal ops team)\n4. **Product URLs** *(optional but strongly recommended)* — Provide any of:\n   - Marketing website / landing page\n   - Documentation site\n   - API docs URL\n   - App Store / Play Store listing\n   - README or repo URL (if different from the working directory)\n5. **Repo list** *(required for multi-repo)* — If this is a multi-repo product:\n   - List all repos (backend, frontend, mobile app, comms, infra, etc.)\n   - Are they all cloned into a single parent folder? If not, I'll ask you to set that up.\n   - Provide git clone URLs for any not yet cloned.\n6. **Anything the code won't tell me?** *(optional)* — Business context, upcoming changes, non-obvious terminology, areas of tech debt, inter-service communication patterns, etc.\n\n**Code-first fallback:** If user says they can't answer 1–3, say: \"No problem — I'll scan the code first and come back with my best guess for you to correct.\" Infer product name from package.json `name` field or README title, one-liner from package.json `description` or README first paragraph, users from UI/API patterns (admin dashboard = internal ops, public signup = consumers, API-only = developers). Present guesses for confirmation before continuing to Phase 2.\n\n### Step 1b: Multi-Repo Workspace Setup\n\n> **For multi-repo products, all repos MUST be cloned into a single parent folder.**\n> This is how CodeWiki discovers cross-repo relationships.\n\nExpected structure:\n```\n<product-name>/              ← master folder\n├── backend/                 ← git clone <backend-url>\n├── frontend/                ← git clone <frontend-url>\n├── mobile-app/              ← git clone <mobile-url>\n├── comms-service/           ← git clone <comms-url>\n├── shared-libs/             ← git clone <shared-url>\n└── infra/                   ← git clone <infra-url>\n```\n\n**If repos are not yet organized this way**, give the user exact commands:\n```bash\nmkdir -p ~/projects/<product-name> && cd ~/projects/<product-name>\ngit clone <url-1> <folder-name-1>\ngit clone <url-2> <folder-name-2>\n# ... etc\n```\n\nThen ask the user to `cd` into the master folder and run CodeWiki from there.\n\n**Verify the setup:**\n```bash\nls -la\nfor dir in */; do echo \"$dir: $(git -C \"$dir\" remote get-url origin 2>/dev/null || echo 'not a git repo')\"; done\n```\n\nIf any repos are missing, tell the user which ones and provide the clone command. Do NOT proceed to Phase 2 until the workspace is verified.\n\n### Step 1c: Fetch External Context\n\nFor each URL provided, use WebFetch to extract product context.\n\n**Error handling:** If a URL fails (auth wall, 404, timeout), tell the user which URL failed and why, then continue with the rest. Do not silently skip.\n\nFor each successful fetch, extract:\n- Landing page copy, feature descriptions, value propositions\n- App store descriptions and key metadata\n- Documentation structure (table of contents, section names)\n- API documentation overview (auth method, base URL, resource groups)\n\n### Step 1d: Summarize Before Proceeding\n\nPresent a short summary back to the user:\n> \"Here's what I understand about [Product Name] before I look at the code: ...\"\n\nAsk: **\"Is this accurate? Anything to correct or add?\"**\n\nOnly after the user confirms, proceed to Phase 2.\n\nAfter confirmation, estimate scope:\n> \"Based on [N repos/components], this will take [several phases]. I'll report progress after each repo/component.\"\n\n---\n\n## Context Window Management (Multi-Repo Strategy)\n\n> **CRITICAL: Do NOT scan all repos at once.** Scanning multiple repos simultaneously\n> will exhaust the context window. Instead, use the Scan → Summarize → Flush → Next\n> pattern described below.\n\n### Scan Priority Order\n\nScan in this order. The goal is top-down: infrastructure first (the \"map\"), then entry points, then services behind them.\n\n**Priority 1 — Infrastructure & contracts (scan first)**\n- `infra/`, `deploy/`, `platform/` — docker-compose, k8s manifests, terraform\n- Shared proto/OpenAPI/AsyncAPI specs\n- Shared libraries / type packages\n\n*Why first:* Gives you the full service map, ports, dependencies, and contracts before any individual service. It's the table of contents.\n\n**Priority 2 — API gateway / BFF (Backend-for-Frontend)**\n- The service that receives external traffic and routes it internally\n- Often named: `gateway`, `api-gateway`, `bff`, `proxy`\n\n*Why second:* Shows all user-facing endpoints and which internal service handles each one.\n\n**Priority 3 — Frontend(s)**\n- Web frontend, mobile app, admin dashboard\n- Scan routes/screens, API client configuration, state management\n\n*Why third:* Now you can map screens → gateway endpoints → internal services.\n\n**Priority 4 — Core business services**\n- Services that own primary business data (users, orders, payments, etc.)\n- Prioritize by: how many user flows touch this service\n\n**Priority 5 — Supporting services**\n- Notifications, analytics, logging, search, file storage\n- These are consumed by other services but rarely initiate flows\n\n### The Scan → Summarize → Flush → Next Pattern\n\nFor each repo/service, follow this cycle:\n\n```\n1. SCAN      Read the repo: tech stack, endpoints, models, events, env vars\n2. WRITE     Write findings to codewiki/_scratch/<repo-name>.md (on disk)\n3. SUMMARIZE Create a compact summary (max 30 lines) of:\n             - What this service does (1-2 sentences)\n             - Endpoints it exposes (list)\n             - Events it produces/consumes (list)\n             - Data models it owns (list)\n             - How it connects to other services (list)\n4. CARRY     Keep ONLY the compact summary in working memory\n5. NEXT      Move to the next repo — raw scan data is on disk, not in context\n```\n\n**The `_scratch/` folder:**\n```\ncodewiki/\n├── _scratch/                  ← temporary, per-repo scan notes\n│   ├── backend.md\n│   ├── frontend.md\n│   ├── comms-service.md\n│   └── ...\n├── overview.md                ← final output files (generated in Phase 5)\n├── architecture.md\n└── ...\n```\n\n**Compact summary format** (carried between repo scans):\n```markdown\n## <service-name> | <tech stack> | <port>\nPurpose: <one sentence>\nEndpoints: GET /users, POST /users, GET /users/:id, ...\nProduces: user.created, user.updated\nConsumes: payment.completed\nModels: User, Role, Session\nCalls: payment-service (gRPC), notification-service (HTTP)\nDB: postgres (users, roles, sessions tables)\n```\n\n### Progress Reporting\n\nAfter scanning each repo, tell the user:\n> \"✓ Scanned **backend** (3/6 repos done). Found 14 endpoints, 3 event topics, 5 models.\n> Next up: **comms-service**. Continuing...\"\n\nDo NOT ask for permission between each repo — just report progress and continue.\n\n---\n\n## Phase 2: Codebase Analysis\n\n### Step 2a: Project Layout & Scoping\n\n**Single-repo projects:**\n```bash\nls -la\nfind . -maxdepth 2 -type f -name \"*.json\" -o -name \"*.toml\" -o -name \"*.yaml\" -o -name \"*.yml\" -o -name \"*.mod\" -o -name \"*.lock\" | head -50\n```\n\n**Multi-repo master folder:**\n```bash\nls -la\nfor dir in */; do\n  echo \"=== $dir ===\"\n  ls \"$dir\"/*.json \"$dir\"/*.toml \"$dir\"/*.yaml \"$dir\"/*.yml \"$dir\"/*.mod \"$dir\"/Dockerfile 2>/dev/null\n  echo \"\"\ndone\n```\n\nIdentify:\n- **Single repo:** Project type (monorepo, single app, library, CLI tool, etc.)\n- **Multi-repo:** Map each folder to its role (backend, frontend, mobile, comms, infra, shared libs, etc.)\n\nFor multi-repo, present the inventory:\n> \"I found [N] repos in this workspace:\n> | Folder | Likely role | Stack signals |\n> |--------|------------|---------------|\n> | backend/ | API server | go.mod, Dockerfile |\n> | frontend/ | Web app | package.json (next), tsconfig.json |\n> | ...\n>\n> I'll scan them in this order: [list in priority order]. Starting now.\"\n\n#### Architecture Classification\n\nClassify the project:\n- **Single app** — one deployable unit (e.g., a Rails app, a Next.js full-stack app)\n- **Modular monolith** — one deployable unit with clearly separated internal modules\n- **Microservices** — multiple independently deployable services\n- **Monorepo with shared packages** — multiple apps/services sharing code via a package manager workspace\n\nDetection signals for **microservices**:\n- `docker-compose.yml` defining multiple services with separate build contexts\n- Multiple directories each with their own `Dockerfile`\n- Multiple directories each with their own dependency files (separate `go.mod`, `package.json`, `requirements.txt`)\n- Presence of API gateway, service mesh config, or message broker config\n- Proto/OpenAPI/AsyncAPI spec files defining service contracts\n- Kubernetes manifests or Helm charts with multiple deployments\n\nState your classification to the user before proceeding.\n\n#### Scoping Gate\n\n**If microservices or multi-service architecture:**\nDo NOT ask the user to skip services. Instead, use a two-tier scan:\n\n> \"This is a microservices project with [N] services. I found: [list them].\n> I'll do a **lightweight scan** of all services first to map the full topology,\n> then a **deep scan** of the [3–4] most critical ones.\n> Which services are most critical to document in depth?\"\n\n**Lightweight scan** (ALL services): tech stack, exposed endpoints/topics/events, data models owned, env vars, Dockerfile/deployment config.\n**Deep scan** (user-selected): internal code structure, handler logic, error handling, full file mapping, test coverage.\n\n**If monolith or single app with many modules:**\n> \"This is a large project with [N] components. I found: [list them].\n> Which ones should I focus on? I recommend starting with [top 3–4 by importance],\n> and I can document the rest in a follow-up pass.\"\n\nWait for user to confirm scope before continuing.\n\n#### Infrastructure-as-Architecture (Microservices only)\n\nBefore scanning individual services, read the infrastructure layer — it IS the architecture map:\n\n```bash\n# Docker compose — shows service dependencies, ports, networks\ncat docker-compose*.yml 2>/dev/null\n\n# Kubernetes — shows deployments, services, ingress\nfind . -path \"*/k8s/*\" -o -path \"*/helm/*\" -o -path \"*/kubernetes/*\" | head -30\n\n# API gateway config\nfind . -name \"nginx.conf\" -o -name \"kong.yml\" -o -name \"traefik.*\" -o -name \"envoy.*\" | head -10\n\n# Message broker config\nfind . -name \"*.proto\" -o -name \"asyncapi.*\" -o -name \"*.avsc\" | head -20\n```\n\nFrom this, build an initial **service topology** before looking at any service code:\n- Which services exist and their ports\n- Which services depend on which (links, depends_on, network policies)\n- What shared infrastructure exists (databases, message brokers, caches, object storage)\n- What the external entry points are (API gateway, load balancer, CDN)\n\nPresent this topology to the user for confirmation before deep-scanning individual services.\n\n### Step 2b: Per-Component Analysis\n\nFor each component **in scope**, analyze:\n\n**Tech stack** — Read dependency/config files:\n- package.json, tsconfig.json (Node/TS)\n- go.mod, go.sum (Go)\n- requirements.txt, pyproject.toml, setup.py (Python)\n- Cargo.toml (Rust)\n- pubspec.yaml (Flutter/Dart)\n\nIf none of the above exist, check for other indicators (Gemfile, pom.xml, build.gradle, mix.exs, etc.) and adapt accordingly. Don't assume a fixed set of languages.\n\n**Entry points** — Find main files:\n- Look for `main.*`, `index.*`, `app.*`, `server.*` in src/ or root\n- Check package.json `main`/`bin` fields, or `[tool.poetry.scripts]`, etc.\n\n**Routes/Screens** — Discover user-facing paths:\n- Web: Grep for route definitions in the framework's style (React Router, Next.js pages/app dir, Express `app.get`, etc.)\n- Mobile: Look for screen/navigation definitions\n\n**API endpoints** — Find all route/handler definitions:\n- REST: Grep for HTTP method decorators/calls (`@Get`, `@Post`, `app.get(`, `router.`, etc.)\n- GraphQL: Look for schema files, resolver definitions\n- tRPC: Look for router definitions\n- If no patterns match, read the main entry point and trace outward\n\n**Data models** — Find schemas and types:\n- Database migrations: `migrations/`, `db/migrate/`, `alembic/`\n- ORM models: Look for model/entity definition patterns in the detected framework\n- TypeScript types/interfaces: key type definition files\n- Prisma schema, GraphQL type definitions, protobuf files\n\n**Environment variables** — Find config:\n- `.env.example`, `.env.sample`, `.env.template`\n- Docker compose files for service-level env vars\n- Config files that reference `process.env`, `os.environ`, `os.Getenv`, etc.\n\n**Build/run/test commands** — Find all dev commands:\n- package.json scripts section\n- Makefile, Taskfile.yml, Justfile\n- Docker and docker-compose files\n- CI/CD configs (.github/workflows/, .gitlab-ci.yml, etc.)\n\n#### Additional Fields for Microservices\n\nIf the project was classified as microservices, also capture for EACH service:\n\n**Service identity:**\n- Service name (as defined in docker-compose, k8s manifests, or code)\n- Port(s) it listens on\n- Whether it's user-facing (external) or internal-only\n\n**Data ownership:**\n- Which database(s) does this service own?\n- Does it have its own DB, or share with another service?\n- What are the primary tables/collections it manages?\n\n**Events & messages (produced and consumed):**\n- Message queue topics/channels this service publishes to\n- Topics/channels it subscribes to / consumes from\n- Look for: RabbitMQ channel/queue definitions, Kafka topic configs, Redis pub/sub, AWS SQS/SNS, NATS subjects, event emitter patterns\n- Grep for: `publish(`, `emit(`, `produce(`, `subscribe(`, `consume(`, `on(`, queue/topic name strings in config files\n\n**Synchronous service-to-service calls:**\n- gRPC client stubs and proto imports\n- HTTP calls to other internal services (look for internal base URLs, service discovery patterns, or hardcoded `localhost:<port>` in dev configs)\n- Look in docker-compose for `depends_on` to find call direction\n\n**Service contracts:**\n- Proto files (`.proto`) — who defines them, who consumes them\n- OpenAPI/Swagger specs generated or consumed by this service\n- AsyncAPI specs for event contracts\n- Shared type packages imported by this service\n\n### Step 2c: Cross-Component Mapping\n\nDiscover how components connect:\n- **Frontend-to-backend calls**: Grep for fetch/axios/ky base URLs, API client configs, tRPC client setup, GraphQL client setup\n- **Shared types/contracts**: packages shared between components, proto files, OpenAPI generated clients\n- **Auth flow**: How authentication works across frontend and backend (JWT, sessions, OAuth providers)\n- **Infrastructure**: Docker compose service dependencies, API gateway configs\n\n#### Additional mapping for microservices:\n\n**Service dependency graph** — Build a complete picture of which service calls which:\n\n| Source Service | Target Service | Protocol | Purpose |\n|---------------|---------------|----------|---------|\n| api-gateway | user-service | REST | Auth, user lookup |\n| user-service | notification-service | Kafka | Send welcome email on signup |\n| billing-service | user-service | gRPC | Validate user plan |\n\nTo build this table:\n1. Read each service's outbound client configs and env vars referencing other service URLs\n2. Read message broker topic names — match publishers to consumers across services\n3. Read proto/OpenAPI imports across services\n4. Cross-reference with docker-compose `depends_on` and kubernetes service definitions\n\n**Data ownership map** — Which service owns which data:\n\n| Data Entity | Owner Service | Shared With | Access Method |\n|------------|--------------|-------------|---------------|\n| User | user-service | all services | REST API / JWT claims |\n| Invoice | billing-service | admin-dashboard | REST API |\n\n**Async flow chains** — For event-driven patterns, trace the full chain:\n> Example: User signs up → user-service publishes `user.created` → notification-service sends welcome email → billing-service creates free trial\n\nDocument every async chain by matching published topics to consumed topics across services. These are invisible in HTTP-only tracing and often the most poorly documented part of any system.\n\n---\n\n## Phase 3: User Flow Discovery (Interactive)\n\n### Step 3a: Present & Identify Flows\n\nPresent a structured summary of what you discovered in Phase 2:\n- List all detected routes/screens/pages\n- List all detected API endpoints grouped by resource\n- List detected data models\n\nThen propose flows you inferred from code:\n> \"Based on what I found, I think the main user flows are:\n> 1. User signup/onboarding\n> 2. Create a project\n> 3. Invite a teammate\n> 4. ...\n>\n> **Add, remove, or reorder these, then I'll document each one.**\"\n\nThe user confirms the list in one pass.\n\n### Step 3b: Flow Deep-Dive\n\nFor each confirmed flow, generate documentation from code analysis first. Then present your draft and ask:\n- \"Is this accurate? What am I missing?\"\n- \"What error states or edge cases exist?\"\n- \"Are there different user roles that experience this differently?\"\n\nFor each flow, also:\n- Map the user's description to the routes/endpoints discovered in Phase 2\n- Identify the API calls triggered at each step\n- Note any gaps between code and user description (ask about them)\n\n#### Multi-Service Flow Tracing (microservices only)\n\nFor each step in a flow, trace the full service chain:\n\n1. **Entry point**: Which service receives the initial request? (usually gateway or BFF)\n2. **Synchronous chain**: Does that service call others? Map: Service A → Service B → Service C.\n3. **Async side-effects**: After the synchronous response, what events get published? Which services consume them?\n4. **Data writes**: Which service writes to which database at each step?\n5. **Failure modes**: What happens if a mid-chain service is down? Retry logic, DLQ, saga/compensation?\n\nAlso ask: \"After [step], does anything happen in the background that the user doesn't see? (e.g., emails sent, records synced, jobs queued)\"\n\nConfirm traced chains with the user — async flows are the hardest to discover from code alone.\n\n### Step 3c: Generate User Stories\n\nFor each flow, generate user stories:\n> As a [user type], I want to [action] so that [benefit].\n\nPresent all stories for validation.\n\n### Step 3d: Check for More\n\nAsk: \"Are there other flows I should document? If not, I'll confirm the architecture and start generating the wiki.\"\n\n---\n\n## Phase 4: Architecture Checkpoint (BEFORE writing files)\n\n> Before generating any files, present a brief architecture summary to the user:\n\n> \"Here's the architecture I'm about to document:\n> - **Architecture type**: [single app / microservices / monorepo / etc.]\n> - **Components**: [list]\n> - **Communication**: [how they connect]\n> - **Auth**: [method]\n> - **Key data models**: [list]\n>\n> Does this look right? Any corrections before I generate the wiki?\"\n\n**For microservices, also present:**\n\n> **Service dependency summary:**\n> | Service | Calls (sync) | Publishes events | Consumes events | Owns DB |\n> |---------|-------------|-----------------|----------------|---------|\n> | api-gateway | user-svc, payment-svc | — | — | No |\n> | user-svc | — | user.created | — | users-db |\n> | payment-svc | user-svc | payment.completed | — | payments-db |\n> | notification-svc | — | — | user.created, payment.completed | No |\n>\n> \"Does this service map look right? Are there connections I'm missing?\"\n\nWait for confirmation. This prevents errors from propagating across all output files.\n\n---\n\n## Phase 5: Knowledge Base Generation\n\n### Directory Structure\n\n```\ncodewiki/\n├── overview.md\n├── architecture.md\n├── service-map.md          (microservices only)\n├── events.md               (microservices only)\n├── user-flows/\n│   ├── index.md\n│   └── <flow-name>.md    (one per flow)\n├── api-reference.md\n├── data-models.md\n├── frontend-map.md        (skip if no frontend)\n├── mobile-map.md          (skip if no mobile app)\n├── commands.md\n├── env-vars.md\n└── glossary.md\n```\n\n### Generation Process\n\nFor each file:\n1. Read the corresponding template from this skill's `templates/` directory\n2. Read the relevant `codewiki/_scratch/` files for source data\n3. Fill in the template with findings\n4. Write to `codewiki/`\n\nRead templates one at a time — do not load all templates simultaneously.\n\n**Glossary detection:** Scan READMEs, doc comments, and UI strings for capitalized multi-word terms that appear to be domain concepts. Also check for existing glossary/terminology sections. Focus on product-specific terms only — not general programming terms.\n\n**Important:** Only generate files that are relevant. Skip `service-map.md` and `events.md` for single apps. Skip `mobile-map.md` if no mobile app. Skip `frontend-map.md` if no frontend.\n\nAfter all files are generated:\n```bash\nrm -rf codewiki/_scratch/\n```\n\n---\n\n## Phase 6: CLAUDE.md Generation\n\nCheck if `CLAUDE.md` exists in the project root.\n\n### If CLAUDE.md does NOT exist:\n\nRead the template from `templates/claude-md.md` and generate. Remove links for any files that were skipped (e.g., mobile-map.md if no mobile app).\n\n### If CLAUDE.md ALREADY exists:\n\nAsk the user:\n> \"CLAUDE.md already exists. Would you like me to:\n> 1. **Fresh scan** — back up the existing file and replace it entirely\n> 2. **Rescan & merge** — preserve your manual additions and merge in new findings\"\n\n- **Fresh**: Copy existing to `CLAUDE.md.bak`, then generate new.\n- **Merge**: Read existing CLAUDE.md, identify sections that are manually written (not matching codewiki template), preserve those, and update/add generated sections around them. Show the user a diff summary of what changed.\n\n---\n\n## Phase 7: Git & Repository Setup\n\n> Always run this phase — do not skip.\n\n### Step 7a: Clean Up Scratch Files\n\n```bash\nrm -rf codewiki/_scratch/\n```\n\n### Step 7b: Ask User for Repo Preferences\n\nAsk all in a single message:\n\n> \"The knowledge base is ready. Let me set up the repo:\n>\n> 1. **Where should the wiki live?**\n>    - a) Inside this project repo (add `codewiki/` folder here)\n>    - b) Its own dedicated repo (I'll create a new folder next to this project)\n>\n> 2. **Want me to create a GitHub repo for it?**\n>    - If yes: What should the repo be named? (default: `<product-name>-codewiki`)\n>    - Should it be **public** or **private**?\n>    - Which GitHub org/account? (default: your personal account)\n>\n> 3. **Any custom repo description?** (default: 'Product knowledge base for <Product Name>')\"\n\n### Step 7c: Commit Locally\n\n**Option A — Inside project repo:**\n```bash\ngit add codewiki/ CLAUDE.md\ngit commit -m \"docs: add codewiki product knowledge base\n\nGenerated by CodeWiki. Contains:\n- Product overview and architecture docs\n- User flow documentation\n- API reference and data models\n- Service map and environment variable reference\"\n```\n\n**Option B — Dedicated repo:**\n```bash\nmkdir -p ../<repo-name>\ncp -r codewiki/ ../<repo-name>/codewiki/\ncp CLAUDE.md ../<repo-name>/\n\ncd ../<repo-name>\ngit init\ngit add -A\ngit commit -m \"Initial codewiki generation\"\n```\n\nFor Option B, also generate `README.md` using the template from `templates/readme.md`. Only include rows/sections for files that were actually generated.\n\n### Step 7d: Create Remote GitHub Repo (if user opted in)\n\nCheck if `gh` CLI is available and authenticated:\n```bash\ngh auth status 2>/dev/null\n```\n\n**If `gh` is available and authenticated:**\n```bash\ncd ../<repo-name>\ngh repo create <org-or-user>/<repo-name> \\\n  --description \"<repo description>\" \\\n  --<public|private> \\\n  --source . \\\n  --push\n```\n\n**If `gh` is not available:**\nTell the user:\n> \"I can't create the GitHub repo automatically because the `gh` CLI isn't\n> installed or authenticated. Here's what to do:\n>\n> 1. Go to https://github.com/new\n> 2. Create a repo named `<repo-name>` (<public/private>)\n> 3. Then run:\n> ```bash\n> cd ../<repo-name>\n> git remote add origin git@github.com:<org>/<repo-name>.git\n> git push -u origin main\n> ```\"\n\n### Step 7e: Final Summary\n\nPresent to the user:\n\n> **CodeWiki generation complete!**\n>\n> **Files created:**\n> <list all files in codewiki/>\n>\n> **CLAUDE.md:** <created new / merged / replaced>\n>\n> **Repo:** <committed to project repo / created at ../<repo-name>/>\n> <if GitHub: \"Pushed to https://github.com/<org>/<repo-name>\">\n>\n> **Repos scanned:**\n> | Repo | Endpoints | Models | Events | Scan depth |\n> |------|-----------|--------|--------|------------|\n> | backend | 14 | 5 | 3 | deep |\n> | frontend | 12 routes | — | — | deep |\n> | comms-service | 4 | 2 | 6 | lightweight |\n>\n> **Next steps:**\n> - Share the repo URL with your team\n> - Copy `CLAUDE.md` into whichever repo you're working in for Claude Code context\n> - Run CodeWiki again anytime to update — I'll detect existing files and offer to merge\n\n---\n\n## Behavioral Guidelines\n\n- Be thorough in scanning but batch related questions. Don't overwhelm with one question per message.\n- When scanning code, read actual file contents — don't just list filenames. Understand what the code does.\n- Use Task subagents to parallelize scanning when possible (e.g., scan frontend and backend simultaneously) — but only if context window allows. For multi-repo, sequential is safer.\n- If you encounter very large files (>1000 lines), read strategically — focus on exports, route definitions, model definitions, and config sections.\n- Keep generated documentation concise and scannable. Use tables where appropriate. Avoid walls of text.\n- Use relative paths in all documentation so it works regardless of where the repo is cloned.\n- If the user interrupts or wants to skip a phase, accommodate gracefully — but always note what was skipped so they can come back to it.\n- For microservices: prioritize understanding contracts (protos, event schemas, API specs) over internal implementation. When tracing flows, always confirm async chains with the user.","tags":["codewiki","ekuttan","agent-skills","claude-code","claude-skills"],"capabilities":["skill","source-ekuttan","skill-codewiki","topic-agent-skills","topic-claude-code","topic-claude-skills","topic-codewiki"],"categories":["codewiki"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/ekuttan/codewiki","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add ekuttan/codewiki","source_repo":"https://github.com/ekuttan/codewiki","install_from":"skills.sh"}},"qualityScore":"0.454","qualityRationale":"deterministic score 0.45 from registry signals: · indexed on github topic:agent-skills · 9 github stars · SKILL.md body (28,152 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:08:31.371Z","embedding":null,"createdAt":"2026-05-18T13:13:59.775Z","updatedAt":"2026-05-18T19:08:31.371Z","lastSeenAt":"2026-05-18T19:08:31.371Z","tsv":"'-10':1837 '-2':1205 '-20':1851 '-30':1820 '-50':1397 '/codewiki':3543 '/dev/null':767,1426,1804,3601 '/dockerfile':1424 '/helm':1815 '/k8s':1812 '/kubernetes':1818 '/new':3653 '/projects':723,725 '/users':1287,1289,1291 '1':90,92,332,345,361,394,417,582,1000,1169,1204,2464,2667,2796,3137,3305,3414,3648 '10':314 '1000':3826 '12':3711 '14':1332,3706 '1a':399 '1b':649 '1c':801 '1d':877 '2':125,426,647,766,794,920,1044,1181,1359,1376,1425,1803,2479,2631,2670,2758,2809,3148,3317,3444,3600,3654,3718 '2a':1363 '2b':1917 '2c':2346 '3':152,395,443,583,1086,1190,1334,1670,1747,2491,2611,2674,2824,3157,3477,3660,3708 '3/6':1328 '30':164,1197 '3a':2617 '3b':2699 '3c':2910 '3d':2937 '4':178,456,1114,1227,1671,1748,2497,2678,2841,2962,3164,3717 '401':321 '404':322,823 '5':189,205,490,1138,1237,1274,1337,2853,3093,3707 '6':218,544,3253,3719 '7':249,3369 '7a':3381 '7b':3391 '7c':3488 '7d':3579 '7e':3677 '8':266 '9':282 'access':2525 'accommod':3880 'accord':1964 'account':3476 'accur':906,2722 'across':2390,2489,2495,2590,3088 'action':2927 'actual':3576,3780 'adapt':283,1963 'add':911,2679,3425,3498,3505,3550,3667 'addit':2148,2406,3323 'admin':628,1093,2542 'admin-dashboard':2541 'alemb':2076 'allow':3812 'alon':2908 'alreadi':3292,3298 'also':26,2159,2746,2870,3021,3201,3561 'altern':312 'alway':267,3373,3883,3911 'analysi':1361,1921,2712 'analyt':1142 'analyz':1927 'anoth':2212 'answer':118,390,581 'anyth':292,545,907,2875 'anytim':3746 'api':20,472,636,867,1045,1066,1097,1478,1582,1821,1897,2025,2365,2403,2429,2534,2545,2639,2761,3036,3522,3903 'api-gateway':1065,2428,3035 'api-on':635 'api-reference.md':3116 'app':475,512,691,854,1092,1436,1484,1507,1514,1520,1720,1982,2992,3128,3231,3237,3289 'app.get':2018,2039 'appear':3196 'approach':313 'appropri':3849 'apps/services':1541 'architectur':16,1501,1621,1774,1788,2955,2963,2975,2983,2989,3517 'architecture.md':1275,3101 'area':561 'aren':137 'around':3357 'ask':40,236,387,400,403,529,732,903,1347,1624,2719,2775,2871,2941,3294,3392,3397 'assum':1967 'async':2546,2581,2825,2899,3913 'asyncapi':1846,2333 'auth':821,870,2385,2435,3002,3598 'authent':2388,3595,3607,3642 'automat':3633 'avail':3593,3605,3622 'avoid':3850 'avsc':1849 'aw':2249 'b':2821,3429,3534,3560 'back':595,885,3308,3892 'backend':509,683,1049,1327,1450,1477,2358,2393,3705,3805 'backend-for-frontend':1048 'backend.md':1264 'background':2879 'balanc':1900 'base':7,46,62,872,925,2291,2363,2655,3095,3405,3485,3509 'bash':720,749,1371,1403,1790,3248,3386,3496,3537,3596,3608,3663 'batch':3765 'behavior':3758 'behind':997 'benefit':2930 'best':598 'bff':1047,1068,2808 'bill':2451,2539,2574 'billing-servic':2450,2538,2573 'bin':1991 'brief':2974 'broker':1589,1839,1887,2482 'build':1559,1854,2413,2461 'build.gradle':1959 'build/run/test':2125 'busi':214,553,1116,1122 'c':759,2823 'cach':1888 'call':425,1302,2275,2283,2312,2359,2420,2762,2815,3027 'capit':3190 'captur':2160 'cargo.toml':1943 'carri':163,1228,1279 'case':2732 'cat':1798 'cd':724,736,3546,3609,3664 'cdn':1901 'chain':2548,2557,2582,2795,2811,2862,2895,3914 'chang':556,3367 'channel/queue':2242 'chart':1601 'check':252,1953,1988,2938,3202,3256,3588 'checkpoint':2964 'ci/cd':2143 'claim':2536 'classif':1502,1607 'classifi':1503,2156 'claud':3740 'claude.md':28,3254,3258,3265,3291,3297,3340,3500,3545,3689,3731 'claude.md.bak':3333 'clean':3382 'clear':1527 'cli':1438,3591,3637 'client':1098,2277,2366,2369,2372,2384,2470 'clone':519,537,543,664,685,688,693,698,703,706,727,729,787,3869 'code':49,108,122,349,371,547,572,591,902,1543,1705,1864,2177,2654,2711,2771,2907,3741,3778,3791 'code-first':121,571 'codebas':9,1360 'codewiki':1,13,43,60,269,673,743,1256,3099,3167,3349,3426,3463,3499,3506,3512,3542,3556,3684,3744 'codewiki/_scratch':254,1186,3152,3251,3389 'come':594,3891 'comm':513,695,1342,1453,3715 'command':719,788,2126,2130 'commands.md':3129 'comment':3185 'commit':3489,3502,3553,3691 'comms-servic':694,1341,3714 'comms-service.md':1266 'communic':568,2998 'compact':1194,1232,1276 'complet':110,343,2415,3686 'compon':295,1731,1920,1924,2349,2353,2379,2996 'compos':1010,1792,1801,2109,2141,2173,2306,2400,2504 'concept':3200 'concis':3843 'config':1586,1590,1698,1823,1840,2104,2117,2144,2246,2268,2301,2367,2405,2471,3838 'configur':1099 'confirm':642,916,922,1767,1909,2692,2706,2893,2953,3082,3912 'connect':1222,2354,3001,3076 'consum':634,1149,1296,2225,2237,2262,2323,2329,2488,2588,2839,3031 'contain':3513 'content':864,1042,3782 'context':52,97,334,385,554,804,814,941,963,1252,1560,3742,3810 'continu':242,325,644,834,1344,1357,1770 'contract':1002,1032,1596,2315,2337,3899 'contradict':248 'copi':849,3330,3730 'core':213,1115 'correct':603,909,3013 'correspond':3140 'coverag':1715 'cp':3540,3544 'creat':11,1192,2576,2671,3436,3448,3580,3612,3629,3655,3688,3695 'critic':948,1673,1679 'cross':676,2348,2499 'cross-compon':2347 'cross-refer':2498 'cross-repo':675 'custom':3479 'cycl':1168 'dashboard':629,1094,2543 'data':265,1123,1215,1246,1692,2066,2194,2511,2518,2519,2646,2842,3005,3156,3525 'data-models.md':3117 'databas':1885,2072,2197,2849 'db':1311,2208,3034,3051,3061 'db/migrate':2075 'debt':564 'decorators/calls':2036 'dedic':3432,3535 'deep':1666,1699,1912,2702,3709,3713 'deep-div':2701 'deep-scan':1911 'default':279,3462,3473,3482 'defin':1554,1594,2169,2320 'definit':2006,2024,2030,2048,2053,2082,2092,2098,2243,2510,3834,3836 'depend':381,1030,1574,1795,1873,1877,2308,2402,2411,2505,3024 'dependency/config':1931 'deploy':1006,1509,1524,1534,1604,1807 'depth':1683,3704 'describ':431,973 'descript':619,851,856,2751,2774,3481,3613 'detect':284,1549,2086,2634,2638,2645,3181,3751 'dev':2129,2300 'develop':451,638 'diff':3363 'differ':100,485,2736,2742 'dir':753,757,760,1407,1411,1413,1415,1417,1419,1421,1423,2016 'direct':2313 'directori':71,489,1562,1569,3097,3147 'discov':53,674,1997,2351,2628,2755,2905 'discoveri':2294,2614 'disk':1189,1249 'dive':2703 'dlq':2868 'doc':17,473,3184,3504,3518 'docker':1009,1791,1800,2108,2137,2140,2172,2305,2399,2503 'docker-compos':1008,1799,2139,2171,2304,2502 'docker-compose.yml':1553 'dockerfil':1481,1567 'dockerfile/deployment':1697 'document':470,860,868,1681,1754,2579,2605,2687,2709,2948,2988,3521,3842,3859 'doesn':2883 'domain':3199 'done':363,773,1330,1428 'dot':271 'draft':2717 'driven':2552 'e.g':450,1511,2886,3284,3801 'echo':756,768,1410,1427 'edg':2731 'effect':2828 'email':2447,2572,2887 'emit':2259 'emitt':2254 'encount':3822 'endpoint':308,1077,1110,1176,1207,1285,1333,2026,2640,3700 'endpoints/topics/events':1691 'ensur':273 'entir':3316 'entiti':2520 'entri':298,993,1894,1973,2061,2797 'env':1179,1695,2115,2473 'env-vars.md':3130 'env.example':2105 'env.sample':2106 'env.template':2107 'environ':2101,3530 'envoy':1835 'error':246,320,815,1709,2728,3085 'estim':923 'etc':515,570,730,1127,1440,1457,1961,1995,2019,2041,2124,2147,2995 'event':1178,1211,1335,2221,2253,2336,2551,2834,3030,3032,3702,3901 'event-driven':2550 'events.md':3105,3228 'everi':197,2580 'exact':718 'exampl':2558 'exhaust':961 'exist':255,1867,1884,1952,2733,3204,3259,3268,3293,3299,3311,3331,3339,3752 'expect':679 'experi':2740 'explain':376 'explor':277 'export':3832 'expos':1209,1690 'express':2017 'extern':803,1056,1893,2189 'extract':812,846 'f':1378 'face':1076,2000,2188 'fail':820,830 'failur':316,2854 'fallback':124,574 'featur':850 'fetch':50,802,845 'fetch/axios/ky':2362 'field':610,1992,2149 'file':80,276,300,358,1145,1270,1575,1593,1712,1932,1977,2046,2093,2100,2110,2118,2142,2269,2317,2381,2967,2971,3091,3136,3153,3221,3245,3280,3312,3385,3573,3687,3753,3781,3825 'filenam':3787 'fill':3158 'final':1268,3678 'find':1184,1374,1810,1824,1841,1975,2027,2068,2103,2127,2311,3163,3328 'first':123,573,592,622,989,1004,1022,1658,2713 'fix':1969 'flow':19,55,186,1133,1156,2386,2547,2613,2620,2650,2665,2700,2707,2745,2781,2790,2900,2916,2945,3110,3115,3520,3910 'flush':970,1160 'flutter/dart':1946 'focus':1740,3207,3830 'folder':14,143,524,669,682,740,1255,1402,1446,1472,3427,3439 'follow':1166,1760 'follow-up':1759 'format':1278 'found':228,309,1331,1466,1646,1733,2659 'framework':2009,2087 'free':2577 'fresh':3306,3329 'frontend':212,510,686,1051,1087,1090,1451,1482,2356,2391,3122,3242,3710,3803 'frontend-map.md':3118,3239 'frontend-to-backend':2355 'frontend.md':1265 'full':1026,1518,1662,1711,2556,2793 'full-stack':1517 'gap':2769 'gate':1614 'gateway':211,1046,1064,1067,1109,1583,1822,1898,2404,2430,2806,3037 'gather':335 'gemfil':1957 'general':3215 'generat':2,27,47,57,77,1271,2327,2383,2708,2911,2917,2958,2969,3016,3096,3132,3220,3247,3255,3275,3335,3355,3510,3557,3562,3577,3685,3841 'get':199,763,1286,1290,2037,2835 'get-url':762 'gh':3590,3597,3603,3610,3619,3636 'git':280,536,684,687,692,697,702,705,726,728,758,771,3370,3497,3501,3547,3549,3552,3665,3670,3671 'git@github.com':3669 'github':3450,3471,3582,3631 'github.com':3652 'github.com/new':3651 'github/workflows':2145 'gitlab-ci.yml':2146 'give':715,1023 'glossari':3180 'glossary.md':3131 'glossary/terminology':3205 'go':1938,3649 'go.mod':1480,1577,1936 'go.sum':1937 'goal':983 'grace':3881 'graph':2412 'graphql':2042,2096,2371 'grep':287,354,2003,2032,2256,2360 'group':875,2641 'grpc':1306,2276,2456 'guess':599,640 'guidelin':3759 'handl':29,816,1082,1710 'handler':1707 'happen':2857,2876 'hard':88 'hardcod':286,2297 'hardest':2903 'head':1396,1819,1836,1850 'heavili':382 'helm':1600 'help':146 'http':1310,2034,2282,2597 'http-on':2596 'id':1292 'ident':2165 'identifi':1429,2619,2759,3341 'implement':3907 'import':1750,2281,2341,2494,3218 'includ':3570 'independ':1533 'index':1981 'index.md':3111 'indic':1956 'individu':1035,1779,1914 'infer':604,2652 'infra':514,704,1005,1454 'infrastructur':988,1001,1772,1783,1883,2398 'infrastructure-as-architectur':1771 'infrastructure/contracts':210 'ingress':1809 'init':3548 'initi':1155,1856,2803,3555 'insid':3421,3493 'instal':3640 'instead':965,1630 'inter':566 'inter-servic':565 'interact':2615 'intern':453,630,1061,1080,1111,1529,1704,2192,2286,2290,3906 'internal-on':2191 'interrupt':3873 'inventori':1464 'invis':2594 'invit':2675 'invoic':2537 'isn':3638 'job':2891 'json':1380,1414 'justfil':2136 'jwt':2394,2535 'k8s':1011,2174 'kafka':2244,2444 'keep':1229,3840 'key':858,2090,3004 'knowledg':6,45,61,3094,3404,3484,3508 'kong.yml':1829 'kubernet':1597,1805,2508 'la':751,1373,1405 'land':468,847 'languag':1972 'larg':173,1727,3824 'layer':1784 'layout':1365 'least':201,392 'let':3408 'level':2114 'lib':701,1456 'librari':1018,1437 'lightweight':203,1653,1684,3720 'like':1473,3302 'line':165,1198,3827 'liner':429,616 'link':1876,3277 'list':109,479,492,506,1210,1214,1219,1226,1495,1647,1734,2632,2636,2644,2694,2997,3007,3786 'listen':2181 'live':3419 'll':528,588,935,1489,1650,2686,2952,3435,3750 'load':83,1899,3176 'local':3490 'localhost':2298 'lock':1395 'log':1143 'logic':1708,2867 'look':899,1860,1978,2021,2043,2050,2079,2239,2288,2302,3010,3072 'lookup':2437 'ls':353,750,1372,1404,1412 'm':2985,3078,3503,3554 'main':1976,1980,1990,2060,2663,3675 'makefil':2134 'manag':943,1101,1547,2220 'mandatori':336 'mani':1131,1722 'manifest':1012,1598,2175 'manual':3322,3345 'map':23,991,1028,1107,1444,1660,1713,1789,2350,2407,2513,2747,2817,3071,3528 'mark':411 'markdown':1283 'market':452,466 'master':681,739,1401 'match':291,2057,2485,2584,3348 'max':1196 'maxdepth':1375 'md':1187,3112 'mechan':107 'memori':1236 'merg':3319,3325,3337,3757 'mesh':1585 'messag':410,1588,1838,1886,2222,2226,2481,3402,3775 'metadata':859 'method':871,2035,2526,3003 'microservic':37,184,1531,1552,1616,1640,1775,2151,2158,2409,2783,2993,3020,3103,3106,3896 'mid':2861 'mid-chain':2860 'migrat':2073,2074 'miss':778,2726,3079 'mix.exs':1960 'mkdir':721,3538 'mobil':511,690,1091,1452,2020,3127,3236,3288 'mobile-app':689 'mobile-map.md':3123,3233,3285 'mod':1392,1422 'mode':2855 'model':1177,1216,1298,1338,1693,2067,2078,2647,3006,3526,3701,3835 'model/entity':2081 'modul':1530,1723 'modular':1521 'monolith':1522,1717 'monorepo':32,1434,1536,2994 'move':1239 'multi':35,127,175,496,503,651,657,945,1399,1442,1460,1619,2779,3192,3815 'multi-repo':34,126,174,495,502,650,656,944,1398,1441,1459,3814 'multi-servic':1618,2778 'multi-word':3191 'multipl':957,1532,1540,1555,1561,1568,1603 'must':130,342,662 'n':927,1467,1643,1730 'name':419,606,609,866,896,1063,1379,1382,1385,1388,1391,1394,1825,1828,1831,1834,1842,1845,1848,2167,2265,2484,3461,3658 'nat':2251 'network':1797,1879 'never':153,179,326 'new':3327,3336,3438 'next':167,233,971,1161,1238,1242,1339,1486,3440,3721 'next.js':1516,2014 'nginx.conf':1826 'node/ts':1935 'non':558 'non-obvi':557 'none':1948 'note':1263,2767,3884 'notif':1141,1308,2442,2568,3063 'notification-servic':1307,2441,2567 'notification-svc':3062 'o':1381,1384,1387,1390,1393,1813,1816,1827,1830,1833,1844,1847 'oauth':2396 'object':1889 'obvious':559 'offer':259,3755 'often':1062,2601 'one':194,428,434,615,783,1084,1508,1523,1674,1737,2689,2696,3113,3170,3772 'one-lin':427,614 'op':454,631 'openapi':2382 'openapi/swagger':2325 'opt':3586 'option':95,416,459,552,3491,3533,3559 'order':209,977,981,1125,1494,1498 'org/account':3472 'organ':712 'origin':765,3668,3674 'orm':2077 'os.environ':2122 'os.getenv':2123 'other':2816 'outbound':2469 'output':63,1269,3090 'outward':303,2065 'overview':869,3515 'overview.md':1267,3100 'overwhelm':3770 'own':1218,1694,2516,3033 'owner':2521 'ownership':2195,2512 'p':722,3539 'packag':1020,1539,1546,2340,2376 'package.json':608,618,1485,1578,1933,1989,2131 'page':469,848 'pages/app':2015 'paragraph':623 'parallel':3797 'parent':142,523,668 'part':2606 'pass':1762,2697 'path':1811,1814,1817,2001,3856 'pattern':288,569,627,972,1162,2056,2083,2255,2295,2553 'paus':244 'payment':1126,1304,3042,3053,3060 'payment-servic':1303 'payment-svc':3041,3052 'payment.completed':1297,3058,3066 'payments-db':3059 'per':1260,1919,3114,3774 'per-compon':1918 'per-repo':1259 'permiss':238,1349 'person':3475 'phase':91,331,344,360,646,793,919,933,1273,1358,2610,2630,2757,2961,3092,3252,3368,3376,3879 'pictur':2416 'plan':2459 'platform':1007 'play':477 'point':299,994,1895,1974,2062,2798 'polici':1880 'pom.xml':1958 'poor':2604 'port':1029,1796,1870,2178 'possibl':3800 'post':1288,2038 'postgr':1312 'prefer':3396 'prefix':272 'presenc':1580 'present':639,881,1462,1902,2618,2621,2715,2931,2972,3022,3680 'preserv':3320,3351 'prevent':3084 'previous':263 'primari':1121,2217 'priorit':1128,3897 'prioriti':208,976,999,1043,1085,1113,1137,1497 'prisma':2094 'privat':3469,3615 'problem':586 'proceed':397,791,880,917,1612 'process':3133 'process.env':2121 'produc':1293,2223,2260 'produces/consumes':1213 'product':5,44,51,96,333,384,418,424,457,505,605,659,813,895,3210,3483,3507,3514 'product-specif':3209 'program':3216 'progress':220,937,1317,1355 'project':177,1364,1370,1432,1505,1641,1728,2154,2673,3262,3423,3443,3494,3693 'propag':3087 'propos':2649 'proposit':853 'proto':1843,2280,2316,2318,2380,3900 'proto/openapi':2493 'proto/openapi/asyncapi':1015,1591 'protobuf':2099 'protocol':2426 'provid':463,535,785,808,2397 'proxi':1069 'pub/sub':2248 'public':632,3467,3614 'public/private':3659 'publish':2231,2258,2486,2565,2585,2836,3029 'pubspec.yaml':1945 'purpos':1284,2427 'push':3617,3672 'pyproject.toml':1940 'python':1942 'qualiti':380 'question':393,3767,3773 'queu':2892 'queue':2227 'queue/topic':2264 'r':3541 'rabbitmq':2241 'rail':1513 'rare':1154 'raw':1244 're':3736 'react':2012 'read':72,296,356,1171,1781,1930,2058,2465,2480,2492,3138,3149,3168,3269,3338,3779,3828 'readi':3407 'readm':480,612,621,3183 'readme.md':3563 'receiv':1055,2801 'recommend':462,1743 'record':2889 'redi':2247 'refer':21,2120,2500,3523,3532 'referenc':2475 'regardless':3863 'relat':3766,3855 'relationship':678 'relev':3151,3224 'remot':761,3581,3666 'remov':2680,3276 'reorder':2682 'replac':3314 'repo':31,36,128,136,156,176,222,231,240,482,491,497,504,508,652,658,661,677,708,772,776,946,953,958,1173,1243,1261,1281,1322,1329,1352,1369,1400,1431,1443,1461,1468,3395,3413,3424,3433,3451,3459,3480,3495,3536,3583,3611,3632,3657,3690,3694,3697,3699,3725,3734,3816,3867 'repo/component':940 'repo/service':1165 'report':219,306,317,936,1318,1354 'repos/components':928 'repositori':3371 'request':2804 'requir':414,420,430,446,493 'requirements.txt':1579,1939 'rescan':3318 'resolv':2047 'resourc':874,2643 'respons':2832 'rest':837,1756,2031,2434,2533,2544 'resum':261 'retri':2866 'rf':3250,3388 'right':3011,3073 'rm':3249,3387 'role':1300,1314,1449,1474,2738 'root':1987,3263 'rout':1059,2005,3712,3833 'route/handler':2029 'router':2013,2040,2052 'routes/endpoints':2754 'routes/screens':1096,1996 'routes/screens/pages':2635 'rows/sections':3571 'rule':89 'run':352,742,3374,3662,3743 'rust':1944 'safer':3819 'saga/compensation':2869 'say':367,577,584 'scan':10,48,113,134,154,159,204,206,264,347,369,589,951,956,968,975,978,1003,1095,1158,1170,1245,1262,1282,1320,1326,1490,1636,1654,1667,1685,1700,1778,1913,3182,3307,3698,3703,3763,3777,3798,3802 'scannabl':3845 'schema':2045,2069,2095,3902 'scope':924,1366,1613,1768,1926 'scratch':162,1254,1257,3384 'screen':1108 'screen/navigation':2023 'script':2132 'search':1144 'second':1071 'section':865,2133,3206,3342,3356,3839 'see':2885 'select':1703 'send':2445,2570 'sent':2888 'sentenc':435,1206 'separ':1528,1558,1576 'sequenti':3817 'server':1479,1983 'servic':22,182,190,198,215,217,567,696,996,1027,1036,1053,1081,1112,1117,1118,1136,1140,1152,1202,1225,1305,1309,1343,1535,1556,1584,1595,1620,1629,1644,1657,1676,1687,1780,1794,1808,1857,1863,1866,1872,1915,2113,2163,2164,2166,2201,2213,2230,2272,2274,2287,2293,2314,2332,2344,2401,2410,2419,2423,2425,2433,2440,2443,2452,2455,2467,2477,2490,2496,2509,2515,2522,2530,2532,2540,2564,2569,2575,2591,2780,2794,2800,2814,2818,2820,2822,2838,2845,2863,3023,3026,3070,3527,3716 'service-level':2112 'service-map.md':3102,3226 'service-to-servic':2271 'session':1301,1315,2395 'set':149,532,1970,3410 'setup':654,748,2370,2373,3372 'setup.py':1941 'sever':932 'share':141,700,1014,1017,1455,1538,1542,1882,2210,2338,2374,2377,2523,3723 'shared-lib':699 'short':883 'show':1072,1793,1806,3359 'side':2827 'side-effect':2826 'sign':2560 'signal':1476,1550 'signup':633,2449 'signup/onboarding':2669 'silent':327,840 'simultan':157,959,3179,3806 'singl':30,409,522,667,1368,1430,1435,1506,1719,2991,3230,3401 'single-repo':1367 'site':471 'skill':68,3144 'skill-codewiki' 'skip':180,328,339,375,841,1628,3119,3124,3225,3232,3238,3283,3379,3877,3887 'sourc':2422,3155,3616 'source-ekuttan' 'spec':1016,1592,2326,2334,3904 'specif':79,319,3211 'sqs/sns':2250 'src':1985 'stack':1175,1475,1519,1689,1929 'start':1499,1744,2957 'startup':251 'state':1100,1605,2729 'status':3599 'step':398,648,800,876,1362,1916,2345,2616,2698,2766,2787,2852,2873,2909,2936,3380,3390,3487,3578,3676,3722 'stop':144,340 'storag':1146,1890 'store':476,478,855 'stori':2913,2919,2933 'strateg':3829 'strategi':947 'string':2266,3188 'strong':461 'structur':4,59,680,861,1706,2623,3098 'stub':2278 'style':2011 'subag':3795 'subject':2252 'subscrib':2235,2261 'success':844 'summar':878,969,1159,1191 'summari':166,884,1195,1233,1277,2624,2976,3025,3364,3679 'support':216,1139 'surviv':172 'svc':3040,3043,3047,3054,3057,3064 'sync':2890,3028 'synchron':2270,2810,2831 'system':2609 'tabl':862,1040,1316,2463,3847 'tables/collections':2218 'take':931 'target':444,2424 'task':3794 'taskfile.yml':2135 'team':455,3729 'teammat':2677 'tech':563,1174,1688,1928 'tell':223,550,779,825,1323,3623 'templat':64,70,74,85,3141,3146,3161,3169,3178,3271,3350,3566 'templates/claude-md.md':3273 'templates/readme.md':3568 'temporari':1258 'term':3194,3212,3217 'terminolog':560 'terraform':1013 'test':1714 'text':3853 'think':2661 'third':1103 'thorough':3761 'tier':1635 'time':3173 'timeout':323,824 'titl':613 'toml':1383,1416 'tool':1439 'tool.poetry.scripts':1994 'top':986,1746 'top-down':985 'topic':1336,2245,2483,2586,2589 'topic-agent-skills' 'topic-claude-code' 'topic-claude-skills' 'topic-codewiki' 'topics/channels':2228,2233 'topolog':1663,1858,1904 'touch':188,1134 'trace':302,2064,2554,2599,2782,2791,2894,3909 'track':281 'traefik':1832 'traffic':1057 'tri':311,373 'trial':2578 'trigger':2763 'trpc':2049,2368 'tsconfig.json':1487,1934 'two':1634 'two-tier':1633 'type':1019,1377,1433,2071,2091,2097,2339,2923,2990 'types/contracts':2375 'types/interfaces':2089 'typescript':2088 'u':3673 'ui':3187 'ui/api':626 'understand':893,3788,3898 'undocu':196 'unit':1510,1525 'upcom':555 'updat':3748 'update/add':3354 'url':330,458,474,483,538,764,807,819,829,873,2292,2364,2478,3726 'use':38,103,119,158,268,448,809,966,1631,3564,3793,3846,3854 'useless':192 'user':18,54,115,148,185,225,366,402,445,576,624,717,734,781,827,888,915,1075,1124,1132,1299,1313,1325,1610,1626,1702,1765,1907,1999,2187,2432,2436,2439,2454,2458,2527,2529,2559,2563,2612,2664,2668,2691,2737,2749,2773,2882,2898,2912,2918,2922,2979,3039,3046,3050,3056,3109,3296,3361,3393,3519,3585,3625,3683,3872,3917 'user-fac':1074,1998,2186 'user-flow':3108 'user-select':1701 'user-servic':2431,2438,2453,2528,2562 'user-svc':3038,3045,3055 'user.created':1294,2566,3048,3065 'user.updated':1295 'users-db':3049 'usual':2805 'valid':2457,2935 'valu':852 'var':1180,1696,2116,2474 'variabl':2102,3531 'verifi':132,746,799 'via':1544 'visibl':274 'vs':415 'wait':1763,3080 'wall':822,3851 'want':2925,3445,3875 'way':714 'web':1089,1483,2002 'webfetch':315,810 'websit':467 'welcom':2446,2571 'whether':2183 'whichev':3733 'wiki':104,379,2960,3018,3418 'window':942,964,3811 'without':310 'won':548 'word':3193 'work':488,1235,2389,3737,3862 'workspac':129,653,797,1471,1548 'would':3300 'write':160,1182,1183,2843,2846,2966,3165 'written':3346 'yaml':1386,1418 'yes':3455 'yet':542,711 'yml':1389,1420,1802","prices":[{"id":"81e2561d-d378-44ca-a623-b6223250988c","listingId":"23dc21ee-d42f-4f62-9a03-274a3137a395","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"ekuttan","category":"codewiki","install_from":"skills.sh"},"createdAt":"2026-05-18T13:13:59.775Z"}],"sources":[{"listingId":"23dc21ee-d42f-4f62-9a03-274a3137a395","source":"github","sourceId":"ekuttan/codewiki","sourceUrl":"https://github.com/ekuttan/codewiki","isPrimary":false,"firstSeenAt":"2026-05-18T13:13:59.775Z","lastSeenAt":"2026-05-18T19:08:31.371Z"}],"details":{"listingId":"23dc21ee-d42f-4f62-9a03-274a3137a395","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"ekuttan","slug":"codewiki","github":{"repo":"ekuttan/codewiki","stars":9,"topics":["agent-skills","claude-code","claude-skills","codewiki"],"license":"mit","html_url":"https://github.com/ekuttan/codewiki","pushed_at":"2026-03-06T07:08:30Z","description":"Claude Code skill that generates structured product knowledge bases from codebase scanning","skill_md_sha":"b55198880c69b28f92474b4b47ac64fa3db60020","skill_md_path":"SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/ekuttan/codewiki"},"layout":"root","source":"github","category":"codewiki","frontmatter":{"name":"codewiki","description":"Generate a structured product knowledge base from codebase scanning. Creates a codewiki/ folder with architecture docs, user flows, API reference, service maps, and more. Also generates CLAUDE.md. Handles single repos, monorepos, and multi-repo microservices. Use when asked to document a project, generate a knowledge base, map architecture, create onboarding docs, or set up CLAUDE.md for a codebase."},"skills_sh_url":"https://skills.sh/ekuttan/codewiki"},"updatedAt":"2026-05-18T19:08:31.371Z"}}