$npx -y skills add Varnan-Tech/opendirectory --skill dx-roasterBrutally honest developer-experience audit for a GitHub repo. Scores 10 DX dimensions (time-to-first-success, README clarity, visual proof, install, quick-start, docs, examples, community, trust, marketing), writes a shareable roast in the requested tone (brutal/honest/kind), pro
| 1 | # dx-roaster |
| 2 | |
| 3 | Roasts a GitHub repo's developer experience. Produces four files: `roast.md`, `action-plan.md`, `ideal-readme.md`, `score.json`. Built for OSS maintainers and dev-tool founders preparing for Show HN, Product Hunt, or any launch where the first five minutes matter. |
| 4 | |
| 5 | --- |
| 6 | |
| 7 | ## Critical rules (read before every run) |
| 8 | |
| 9 | 1. **Read all three reference files BEFORE scoring.** `references/scoring-rubric.md`, `references/roast-voice-guide.md`, `references/readme-template.md`. The rubric is non-negotiable — use the exact 10 dimensions. |
| 10 | |
| 11 | 2. **Score every dimension on the 0–10 scale. Never skip.** Missing data = score 0, not "N/A". |
| 12 | |
| 13 | 3. **Roast must cite specific findings.** Quote bad lines verbatim. Reference file paths. Cite line numbers when possible. Never write generic platitudes like "documentation could be better". |
| 14 | |
| 15 | 4. **Tone matters.** Default `honest`. Switch voice per `references/roast-voice-guide.md`. Brutal is funny but never personal. Kind is encouraging but still specific. |
| 16 | |
| 17 | 5. **Action plan is impact-ranked, not severity-ranked.** Use `impact × (1 / effort)`. A 5-minute fix that adds 10 points ranks above a 2-hour fix that adds 12 points. |
| 18 | |
| 19 | 6. **Never invent URLs.** When writing `ideal-readme.md`, use `<placeholder>` syntax for missing links. Roast will tell maintainer to fill in. |
| 20 | |
| 21 | 7. **Never name maintainers or contributors.** Roast the work, not the people. |
| 22 | |
| 23 | 8. **Output exactly four files** in `dx-roast/`. Do not write to other locations. Do not skip files. |
| 24 | |
| 25 | --- |
| 26 | |
| 27 | ## Step 1: Intake |
| 28 | |
| 29 | **Required:** |
| 30 | - `repo` — local path (default `.`) OR `https://github.com/owner/repo` URL |
| 31 | |
| 32 | **Optional:** |
| 33 | |
| 34 | | Parameter | Default | Description | |
| 35 | |---|---|---| |
| 36 | | `tone` | `honest` | `brutal` / `honest` / `kind` | |
| 37 | | `output_dir` | `dx-roast/` | Where to write the 4 output files | |
| 38 | | `compare_to` | none | Optional second repo URL for benchmark comparison | |
| 39 | |
| 40 | If `repo` is a URL: clone to a temp dir using `git clone <url> /tmp/dx-roast-<short-hash>`. Scan from there. Delete temp dir after run. |
| 41 | |
| 42 | If `repo` is `.` or local path: scan in place, do not modify anything. |
| 43 | |
| 44 | --- |
| 45 | |
| 46 | ## Step 2: Discover |
| 47 | |
| 48 | Read these files (each may be absent — note absence): |
| 49 | - `README.md` — full contents, structure (headings), code blocks, image refs, badge URLs |
| 50 | - `CONTRIBUTING.md`, `CODE_OF_CONDUCT.md` |
| 51 | - `.github/ISSUE_TEMPLATE/`, `.github/PULL_REQUEST_TEMPLATE.md`, `.github/CODEOWNERS` |
| 52 | - `package.json` (description, homepage, repository, license, scripts), `pyproject.toml`, `Cargo.toml`, `go.mod` |
| 53 | - `LICENSE` (existence + type) |
| 54 | - `docs/` folder contents (just file names + sizes) |
| 55 | - `examples/` or `samples/` or `cookbook/` folder |
| 56 | - `.github/workflows/*.yml` (just names + brief CI presence check) |
| 57 | |
| 58 | If `repo` is a URL, also fetch via `gh`: |
| 59 | ```bash |
| 60 | gh api repos/<owner>/<repo> --jq '{stars: .stargazers_count, forks: .forks_count, watchers: .subscribers_count, pushed_at, description, homepage, topics, default_branch}' |
| 61 | gh api repos/<owner>/<repo>/commits --jq '.[0].commit.author.date' | head -1 |
| 62 | gh api repos/<owner>/<repo>/contributors --paginate --jq '[.[] | .login] | length' |
| 63 | ``` |
| 64 | |
| 65 | Catch and continue if any GitHub call fails. |
| 66 | |
| 67 | --- |
| 68 | |
| 69 | ## Step 3: Score 10 dimensions |
| 70 | |
| 71 | For each of the 10 dimensions in `references/scoring-rubric.md`, output `{score: 0–10, evidence: [...]}` where `evidence` is a list of 1–3 short strings citing what you found. |
| 72 | |
| 73 | Example: |
| 74 | ```json |
| 75 | "visual_proof": { |
| 76 | "score": 4, |
| 77 | "evidence": [ |
| 78 | "Found 1 screenshot at line 89 (below the fold)", |
| 79 | "No animated demo / gif", |
| 80 | "No video" |
| 81 | ] |
| 82 | } |
| 83 | ``` |
| 84 | |
| 85 | Sum scores → total (0–100) → grade (A/B/C/D/F per rubric). |
| 86 | |
| 87 | Save to `dx-roast/score.json` with this exact shape: |
| 88 | |
| 89 | ```json |
| 90 | { |
| 91 | "repo": "<owner/repo or local path>", |
| 92 | "scanned_at": "<ISO 8601 timestamp>", |
| 93 | "dimensions": { |
| 94 | "time_to_first_success": { "score": 7, "evidence": ["..."] }, |
| 95 | "what_is_this_clarity": { "score": 5, "evidence": ["..."] }, |
| 96 | "visual_proof": { "score": 4, "evidence": ["..."] }, |
| 97 | "install_simplicity": { "score": 9, "evidence": ["..."] }, |
| 98 | "runnable_quick_start": { "score": 8, "evidence": ["..."] }, |
| 99 | "documentation_depth": { "score": 6, "evidence": ["..."] }, |
| 100 | "examples": { "score": 5, "evidence": ["..."] }, |
| 101 | "community_signals": { "score": 3, "evidence": ["..."] }, |
| 102 | "trust_signals": { "score": 7, "evidence": ["..."] }, |
| 103 | "marketing_signals" |