opencode-skills-collection 3.0.49 → 3.0.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/bundled-skills/.antigravity-install-manifest.json +27 -1
  2. package/bundled-skills/ab-test-setup/SKILL.md +14 -0
  3. package/bundled-skills/apple-notes-search/SKILL.md +122 -0
  4. package/bundled-skills/astropy/references/coordinates.md +9 -0
  5. package/bundled-skills/astropy/references/cosmology.md +8 -0
  6. package/bundled-skills/astropy/references/fits.md +8 -0
  7. package/bundled-skills/astropy/references/tables.md +8 -0
  8. package/bundled-skills/astropy/references/time.md +7 -0
  9. package/bundled-skills/astropy/references/units.md +9 -0
  10. package/bundled-skills/astropy/references/wcs_and_other_modules.md +9 -0
  11. package/bundled-skills/browser-extension-builder/SKILL.md +1 -1
  12. package/bundled-skills/ckw-design/SKILL.md +129 -0
  13. package/bundled-skills/deterministic-design/SKILL.md +56 -0
  14. package/bundled-skills/docs/integrations/jetski-cortex.md +3 -3
  15. package/bundled-skills/docs/integrations/jetski-gemini-loader/README.md +1 -1
  16. package/bundled-skills/docs/maintainers/repo-growth-seo.md +3 -3
  17. package/bundled-skills/docs/maintainers/skills-update-guide.md +1 -1
  18. package/bundled-skills/docs/users/bundles.md +1 -1
  19. package/bundled-skills/docs/users/claude-code-skills.md +1 -1
  20. package/bundled-skills/docs/users/gemini-cli-skills.md +1 -1
  21. package/bundled-skills/docs/users/getting-started.md +1 -1
  22. package/bundled-skills/docs/users/kiro-integration.md +1 -1
  23. package/bundled-skills/docs/users/usage.md +4 -4
  24. package/bundled-skills/docs/users/visual-guide.md +4 -4
  25. package/bundled-skills/lint-and-validate/SKILL.md +3 -1
  26. package/bundled-skills/lookdev/SKILL.md +229 -0
  27. package/bundled-skills/lookdev-auto/SKILL.md +102 -0
  28. package/bundled-skills/macos-screen-recorder/SKILL.md +59 -0
  29. package/bundled-skills/pr-merge-champion/SKILL.md +116 -0
  30. package/bundled-skills/programmatic-seo/SKILL.md +11 -0
  31. package/bundled-skills/schema-markup/SKILL.md +11 -0
  32. package/bundled-skills/screenstudio-alt/SKILL.md +91 -0
  33. package/bundled-skills/super-code/SKILL.md +209 -0
  34. package/bundled-skills/super-code/bash/SKILL.md +292 -0
  35. package/bundled-skills/super-code/c/SKILL.md +263 -0
  36. package/bundled-skills/super-code/cpp/SKILL.md +271 -0
  37. package/bundled-skills/super-code/csharp/SKILL.md +276 -0
  38. package/bundled-skills/super-code/dart/SKILL.md +327 -0
  39. package/bundled-skills/super-code/elixir/SKILL.md +366 -0
  40. package/bundled-skills/super-code/go/SKILL.md +234 -0
  41. package/bundled-skills/super-code/java/SKILL.md +230 -0
  42. package/bundled-skills/super-code/kotlin/SKILL.md +281 -0
  43. package/bundled-skills/super-code/php/SKILL.md +316 -0
  44. package/bundled-skills/super-code/python/SKILL.md +315 -0
  45. package/bundled-skills/super-code/ruby/SKILL.md +306 -0
  46. package/bundled-skills/super-code/rust/SKILL.md +289 -0
  47. package/bundled-skills/super-code/scala/SKILL.md +302 -0
  48. package/bundled-skills/super-code/swift/SKILL.md +299 -0
  49. package/bundled-skills/super-code/typescript/SKILL.md +286 -0
  50. package/bundled-skills/web-media-getter/SKILL.md +119 -0
  51. package/bundled-skills/youtube-seo-optimizer/SKILL.md +9 -9
  52. package/package.json +1 -1
  53. package/skills_index.json +574 -0
@@ -14,7 +14,7 @@ If you came in through a **Claude Code** or **Codex** plugin instead of a full l
14
14
 
15
15
  When you ran `npx antigravity-awesome-skills` or cloned the repository, you:
16
16
 
17
- ✅ **Downloaded 1,569+ skill files** to your computer (default: `~/.agents/skills/`; or a custom path like `~/.agent/skills/` if you used `--path`)
17
+ ✅ **Downloaded 1,595+ skill files** to your computer (default: `~/.agents/skills/`; or a custom path like `~/.agent/skills/` if you used `--path`)
18
18
  ✅ **Made them available** to your AI assistant
19
19
  ❌ **Did NOT enable them all automatically** (they're just sitting there, waiting)
20
20
 
@@ -34,7 +34,7 @@ Bundles are **curated groups** of skills organized by role. They help you decide
34
34
 
35
35
  **Analogy:**
36
36
 
37
- - You installed a toolbox with 1,569+ tools (✅ done)
37
+ - You installed a toolbox with 1,595+ tools (✅ done)
38
38
  - Bundles are like **labeled organizer trays** saying: "If you're a carpenter, start with these 10 tools"
39
39
  - You can either **pick skills from the tray** or install that tray as a focused marketplace bundle plugin
40
40
 
@@ -212,7 +212,7 @@ Let's actually use a skill right now. Follow these steps:
212
212
 
213
213
  ## Step 5: Picking Your First Skills (Practical Advice)
214
214
 
215
- Don't try to use all 1,569+ skills at once. Here's a sensible approach:
215
+ Don't try to use all 1,595+ skills at once. Here's a sensible approach:
216
216
 
217
217
  If you want a tool-specific starting point before choosing skills, use:
218
218
 
@@ -343,7 +343,7 @@ Usually no, but if your AI doesn't recognize a skill:
343
343
 
344
344
  ### "Can I load all skills into the model at once?"
345
345
 
346
- No. Even though you have 1,569+ skills installed locally, you should **not** concatenate every `SKILL.md` into a single system prompt or context block.
346
+ No. Even though you have 1,595+ skills installed locally, you should **not** concatenate every `SKILL.md` into a single system prompt or context block.
347
347
 
348
348
  The intended pattern is:
349
349
 
@@ -34,7 +34,7 @@ antigravity-awesome-skills/
34
34
  ├── 📄 CONTRIBUTING.md ← Contributor workflow
35
35
  ├── 📄 CATALOG.md ← Full generated catalog
36
36
 
37
- ├── 📁 skills/ ← 1,569+ skills live here
37
+ ├── 📁 skills/ ← 1,595+ skills live here
38
38
  │ │
39
39
  │ ├── 📁 brainstorming/
40
40
  │ │ └── 📄 SKILL.md ← Skill definition
@@ -47,7 +47,7 @@ antigravity-awesome-skills/
47
47
  │ │ └── 📁 2d-games/
48
48
  │ │ └── 📄 SKILL.md ← Nested skills also supported
49
49
  │ │
50
- │ └── ... (1,569+ total)
50
+ │ └── ... (1,595+ total)
51
51
 
52
52
  ├── 📁 apps/
53
53
  │ └── 📁 web-app/ ← Interactive browser
@@ -100,7 +100,7 @@ antigravity-awesome-skills/
100
100
 
101
101
  ```
102
102
  ┌─────────────────────────┐
103
- │ 1,569+ SKILLS │
103
+ │ 1,595+ SKILLS │
104
104
  └────────────┬────────────┘
105
105
 
106
106
  ┌────────────────────────┼────────────────────────┐
@@ -201,7 +201,7 @@ If you want a workspace-style manual install instead, cloning into `.agent/skill
201
201
  │ ├── 📁 brainstorming/ │
202
202
  │ ├── 📁 stripe-integration/ │
203
203
  │ ├── 📁 react-best-practices/ │
204
- │ └── ... (1,569+ total) │
204
+ │ └── ... (1,595+ total) │
205
205
  └─────────────────────────────────────────┘
206
206
  ```
207
207
 
@@ -24,7 +24,9 @@ date_added: "2026-02-27"
24
24
 
25
25
  ## The Quality Loop
26
26
  1. **Write/Edit Code**
27
- 2. **Run Audit:** `npm run lint && npx tsc --noEmit`
27
+ 2. **Run Audit** for the project's ecosystem:
28
+ - **Node.js / TypeScript:** `npm run lint && npx tsc --noEmit`
29
+ - **Python:** `ruff check . --fix && mypy . && bandit -r . -ll`
28
30
  3. **Analyze Report:** Check the "FINAL AUDIT REPORT" section.
29
31
  4. **Fix & Repeat:** Submitting code with "FINAL AUDIT" failures is NOT allowed.
30
32
 
@@ -0,0 +1,229 @@
1
+ ---
2
+ name: lookdev
3
+ description: "Human-in-the-loop web studio to tune AI-generated output by eye. Stand up a local interactive studio (sliders, pickers, drag handles) or an inline edit/highlight/comment annotation studio for prose & media, instead of guessing values or shipping a static comparison grid."
4
+ risk: safe
5
+ source: community
6
+ source_type: community
7
+ source_repo: connerkward/lookdev-studio-skill
8
+ date_added: "2026-06-16"
9
+ author: Conner K Ward
10
+ license: MIT
11
+ tags:
12
+ - lookdev
13
+ - design
14
+ - ui
15
+ - tuning
16
+ - studio
17
+ - visual-eval
18
+ - annotation
19
+ tools:
20
+ - claude-code
21
+ - antigravity
22
+ - cursor
23
+ - gemini-cli
24
+ - codex-cli
25
+ ---
26
+ ## When to Use
27
+
28
+ Use when the user says "lookdev", or asks to tune / dial in / iterate on the look of something, compare variations by feel, or review / edit / annotate a blog post, doc, copy, or media set. Use whenever "show me, I'll pick" beats asking the user to specify a number, and whenever you'd otherwise hand back a static grid or a wall of prose for review.
29
+
30
+ _Source: [connerkward/lookdev-studio-skill](https://github.com/connerkward/lookdev-studio-skill) (MIT)._
31
+
32
+ # Lookdev
33
+
34
+ When the user says **"lookdev"** — or any of: *tune*, *dial in*, *iterate on the look of*, *compare variations of*, *let me adjust*, *let me edit/annotate/mark up*, *review this post/doc/copy* — they mean **build an interactive in-browser tool the user directly manipulates**. Not a static grid of N variations. Not a Q&A where they specify numbers. Not a wall of prose they're asked to read and reply to in chat. A real-time studio where they act on the artifact and the change is captured.
35
+
36
+ **Two studio shapes — pick by what's being tuned:**
37
+
38
+ - **Visual-parameter lookdev** — the artifact's *look* is set by numbers/choices (color, type, layout, image treatment, animation, 3D). Controls = sliders, pickers, drag handles. This is the bulk of this skill (below).
39
+ - **Text & media lookdev** — the artifact is a *document, blog post, copy, or media set* and the user is editing/curating it: rewriting sentences, cutting boring paragraphs, highlighting, leaving margin comments, flagging "diagram goes here" / "wrong image, replace." Controls = **direct inline editing + selection highlight + anchored comments + media annotation**. See the dedicated section below. **A blog post / doc / script review IS this mode — never hand back a long markdown file and ask the user to react in chat. Stand up the annotation studio.**
40
+
41
+ ## What it covers
42
+
43
+ Any visual decision the user picks by feel, not by spec. Expand this list as needed:
44
+
45
+ - **Image processing** — dither, halftone, posterize, ASCII, blur, edge, quantize, mosaic, color-grade
46
+ - **Color** — palette extraction (show coverage %), per-band pickers, saturation / contrast / gamma curves, harmony presets, theme tokens
47
+ - **Typography** — font selector, size / weight / leading / tracking / measure, live sample text, fallback stack
48
+ - **Layout, positioning, framing, spacing** — draggable & selectable elements; resize handles; margin / padding rulers; alignment guides; snap-to-grid; aspect-lock toggles
49
+ - **Crop & framing** — draggable crop rectangle with aspect lock; live cropped preview at production size
50
+ - **Animation / transitions** — easing curve editor, duration sliders, scrubber, replay
51
+ - **Component variants** — render hover / focus / disabled / loading / dark side by side on one page
52
+ - **Iconography** — stroke weight, corner radius, glyph on canvas
53
+ - **AI-generated content** — prompt input + param sliders + side-by-side regeneration grid
54
+ - **Anything else where "show me, I'll pick"** beats "ask me to specify a number"
55
+
56
+ ## Controls must stay reachable while inspecting
57
+
58
+ If the studio shows a list, grid, or scroll-long set of variations, **controls must be visible from every scroll position**. The user has to be able to drag a slider while looking at row 14, not scroll back to the top each time.
59
+
60
+ Two approaches, pick by layout:
61
+
62
+ - **Sticky bar** (`position: sticky; top: 0`) at the top of the scroll container. Keep the bar visually distinct — paper background + blur backdrop + bottom border — so it doesn't muddy the specimens scrolling behind it. Sticky pins relative to the *nearest scrolling ancestor with a defined boundary*; if you nest it inside a sized parent (a `<header>` with `margin-bottom`, a `<div>` with a fixed height), it stops sticking at that parent's bottom edge. Lift it to be a direct child of `<body>` (or the page-wrap) so stickiness spans the whole page.
63
+ - **Floating overlay** (`position: fixed`) for hotkey-toggled controls — e.g. press `d` to reveal. The portfolio's `.debug-ctl` pattern is this: pinned top-left, transparent until summoned. Use when the controls shouldn't occupy permanent screen real estate (final viewers shouldn't see them; the author can summon on demand).
64
+
65
+ Anti-pattern: a top-of-page control panel that the user scrolls past and never sees again. They will tune blindly, give up, or guess. Either keep the controls in view *or* duplicate a compact control bar next to each variation row.
66
+
67
+ ## Text & media lookdev — direct edit, highlight, comment, annotate
68
+
69
+ When the artifact is a **blog post, doc, copy deck, script, or media set**, the user is not turning knobs — they're *marking up the work the way an editor marks a manuscript*. The studio renders the **real artifact WYSIWYG** (the actual rendered blog with its real components/media, not a raw-markdown textarea) and lets the user act on it directly. Building this for a doc review is mandatory: **do not paste a long file into chat and ask "what do you think?" — that's the boring wall of text the user is rejecting.** Stand up the annotation studio and let them edit in place.
70
+
71
+ ### The four affordances (build all that apply)
72
+
73
+ 1. **Direct inline editing.** Every text block is editable in place — click a paragraph/heading and type. Use `contentEditable` per block (or click-to-swap-to-`<textarea>`), each block carrying a stable `data-block-id` that maps back to a source location (markdown/MDX line range, JSX node, or content key). Capture the *edited* text per block; the agent applies the diff to source. Don't make them retype in a separate field — they edit the rendered sentence.
74
+ 2. **Selection highlight.** Select text → toolbar (or hotkey) applies a colored highlight (`<mark>`). Multiple colors = a legend the user defines (e.g. yellow "cut this", green "love it", red "wrong/fact-check"). Each highlight stores `{blockId, startOffset, endOffset, color, optional note}`.
75
+ 3. **Anchored comments / margin notes.** Select text or click a media region → attach a comment shown in a **margin rail** (pin in the gutter, expand on hover/click) or as a numbered superscript. Comment = `{anchor, text}` where anchor is a block+range or a media region. This is how the user says "diagram goes here", "too long, cut to two sentences", "needs a real screenshot".
76
+ 4. **Media annotation.** For images/figures: draw a box / drop a pin / arrow on the image and attach a note (`{mediaId, x, y, w, h, note}`); plus a per-media **flag menu** — "replace", "wrong model", "regenerate", "missing — generate one here". Placeholders ("DIAGRAM HERE", "MEDIA?") render as visible drop-zones the user clicks to specify what they want, directly addressing "where are the diagrams / where is the media."
77
+
78
+ ### Round-trip is MANDATORY (same rule as the settings JSON)
79
+
80
+ The studio is worthless if the agent can't read the markup back out. Every edit, highlight, comment, and media-flag must export as **one machine-readable patch** with a single **Copy** button (and persist to `localStorage`/URL so a refresh doesn't lose work — this is human-labeled data; see `human-labeled-data-rule`). Shape:
81
+
82
+ ```json
83
+ {
84
+ "edits": [{ "blockId": "p-12", "text": "new rewritten text" }],
85
+ "highlights": [{ "blockId": "p-3", "range": [40, 88], "color": "cut", "note": "boring, drop" }],
86
+ "comments": [{ "anchor": "p-7", "text": "diagram goes here — flow of the save loop" }],
87
+ "media": [{ "mediaId": "fig-2", "flag": "replace", "note": "use a real screenshot, not ASCII" }]
88
+ }
89
+ ```
90
+
91
+ The agent ingests this and bakes: applies the inline edits to the source file, acts on every comment/flag, swaps/generates the flagged media, resolves the highlights (cut the "cut" spans, etc.). Then re-serve the updated artifact for another pass. **No markup may exist that isn't in the export blob** — otherwise you're back to the user narrating changes by hand.
92
+
93
+ ### Mechanics
94
+
95
+ - **Render the real thing.** MDX/React blog → mount the actual components; static page → render the real HTML/CSS. WYSIWYG per Architecture #5. An annotation layer over a fake-looking preview lies about the result.
96
+ - **Selection → offsets.** Use the `Selection`/`Range` API; store character offsets relative to the block's text content (not DOM node paths, which break on re-render). Re-apply highlights/comments on load by walking each block's text to the stored offsets.
97
+ - **Editing toolbar floats with the selection** (a small popover at the selection rect) or a sticky top bar — controls stay reachable (see section above). Hotkeys: highlight on a key (e.g. `h`), comment on `c`.
98
+ - **Keep edit/annotate modes distinct** so a stray click doesn't garble text while they meant to highlight — a mode toggle (Edit · Highlight · Comment) or modifier key.
99
+ - Everything else — serve locally on a free port, verify headless, tear down after baking — is identical to the visual-parameter workflow below.
100
+
101
+ ## Control patterns
102
+
103
+ Pick controls by what the decision actually is.
104
+
105
+ | Decision type | Control |
106
+ |---|---|
107
+ | Continuous value (intensity, size, opacity, k) | `<input type=range>` **paired with an editable `<input type=number>`** (not a static label) — drag OR click-and-type; they two-way sync |
108
+ | Discrete choice (mode, blend, easing kind) | segmented buttons or radio chips |
109
+ | Color | `<input type=color>` swatches; pre-extract dominant palette with coverage % when relevant |
110
+ | Position / size on a canvas | **drag the element itself** — handles, not numeric inputs |
111
+ | Crop region | draggable rectangle + aspect-lock toggle |
112
+ | Multiple discrete states | render each in a labeled card on one page |
113
+ | Font choice | searchable picker + editable sample-text input |
114
+
115
+ **Spatial rule:** if the user could point at the thing and drag it, that *is* the control. Don't add an `x:` slider when a drag handle is the obvious affordance.
116
+
117
+ **Gesture capture — never make the gesturing hand leave the gesture.** When a control toggles a *live mouse action* the user is performing — recording a cursor path, scrubbing, freehand-drawing, demonstrating a motion — the start/stop must **not** be a button they have to click. Clicking it drags the mouse off the path, pollutes the start/end of the very motion being captured, and forces a round-trip back to where they were. Bind start/stop to the **keyboard (spacebar by default)** — `keydown` on `Space`, `e.preventDefault()` to kill page scroll, toggle the same handler the button would. Keep the button too (discoverability), but the hotkey is the real control. Generalize: any modal capture where one hand is committed to the primary input gets the *other* modality for mode-switching — gesture→key, and conversely a keyboard-heavy capture gets a foot/mouse toggle. The test: if triggering the control would move the thing you're capturing, it's the wrong modality.
118
+
119
+ ## Coherent control ranges — bounds must propagate
120
+
121
+ When one control sets a **bound** on another (a min, a max, a threshold, an allowed set), the bounded control's UI must reflect the new bound the instant you change it. A "scrub" slider whose `min`/`max` attributes drift out of sync with its declared bounds is the most common silent bug — the user moves the bounding slider, nothing visible changes downstream, they assume both are broken.
122
+
123
+ Rules:
124
+
125
+ - **Single source of truth.** Hold the bound in state once. Every input that *displays* it (its own slider, the dependent control's `min`/`max`, anything else) reads from that state on every update.
126
+ - **Re-render `min`/`max` on every state change.** Don't rely on browser-cached attribute values; rewrite them via JS each render. `dependent.min = state.lo; dependent.max = state.hi`.
127
+ - **Clamp the dependent value into the new range immediately.** If the user shrinks the upper bound below the current dependent value, the dependent must snap into range, NOT silently stay outside while the slider shows it pinned to the rail.
128
+ - **No-op regions are slider bugs.** If dragging a slider past some value has zero downstream effect (because some other control's bound caps it), that's a coherence bug — either narrow this slider's range to where it actually does something, OR change behavior so it does. Sliders with dead zones train the user to think the studio is broken.
129
+ - **Test by visualisation, not numeric snapshots.** Take a screenshot, change the bounding slider, take another. The two must look meaningfully different — or the slider is decorative. A numeric `snapshot()` showing state changed doesn't prove the pixels did.
130
+
131
+ Pattern: every time `applyState()` runs (or its split equivalents), call a `syncBounds()` helper that walks the dependent-input registry and pushes the live bounds into every `min`/`max`/`disabled` attribute. Clamp values into the new bounds in the same pass.
132
+
133
+ ### Paired controls must not cross
134
+
135
+ A common shape is **two sliders that together define an interval** — `min ⟷ max`, `near ⟷ far`, `tightEnd ⟷ wideEnd`, `start ⟷ end`. If the user can drag one past the other, the interval inverts or collapses. Downstream math typically does `(x - lo) / (hi - lo)` which **divides by zero or returns negative `t`** — producing `NaN` coordinates, collapsed views, or inverted lerps. The user sees the studio "break" but no error fires.
136
+
137
+ Both ends of the defense:
138
+
139
+ - **UI invariant.** Keep the two sliders from crossing. On every `syncBounds()` pass: `lower.max = upper.value - MIN_SPAN` and `upper.min = lower.value + MIN_SPAN` (small epsilon, e.g. 2 units, so they can't even touch). The user can't physically drag past the other anchor.
140
+ - **Math invariant.** The consuming code (lerp, normalisation, ratio) must guard `denominator > 0` and pick a sane fallback for the degenerate case (e.g. clamp `t = 1` or `t = 0`). UI can race the math — always assume the math could be hit with crossed bounds anyway (URL hash, JSON paste-back, programmatic state mutation).
141
+ - **Test the boundary explicitly.** When the lookdev exposes both ends of an interval, write a quick check: drag `tightEnd` to the same value as `wideEnd`, verify the scene doesn't break. Drag `tightEnd` past `wideEnd`, verify same. If you can crash the studio with two slider drags, that's a release blocker.
142
+
143
+ ## Architecture
144
+
145
+ 1. **Single-page HTML** — `<canvas>` and/or DOM, vanilla JS, a sidebar of controls. No build step, no framework, no deps unless one is genuinely required. Lives in a project-local scratch dir (e.g. `scripts/.lookdev-<name>/` or `scripts/.preview-<name>/`), **gitignored**.
146
+ 2. **Live re-render** on every `input` event. Debounce heavy work via `requestAnimationFrame`. Keep the loop tight enough to feel like a real slider, not a survey.
147
+ - **Every numeric control is dual-input (MANDATORY): a range slider AND an editable `<input type=number>`, two-way synced.** The drag is for exploring; the typed number is for hitting an exact value (and reading the current one). A static `<span>` readout is not enough — the user must be able to click it and type. Sync rule: on slider `input`, write the number field; on number `input`/`change`, update state and re-render — but **do not overwrite a field while it has focus** (guard with `document.activeElement`), or typing gets clobbered mid-keystroke. Clamp to [min,max] on commit (`change`), not on every keystroke, so intermediate values like "1" before "12" aren't snapped.
148
+ - **Always include a Reset control** that restores every control to its defaults in one click (keep a `DEFAULTS` object; `Object.assign(state, DEFAULTS)` then re-render). Cheap to add, and essential once the user has wandered far from baseline.
149
+ - **Always build undo/redo history (MANDATORY).** Dialing-in is iterative and lossy — the user *will* overshoot a good look and need to step back. Bind **Ctrl/Cmd-Z** (undo) and **Ctrl/Cmd-Shift-Z** / **Ctrl-Y** (redo), and surface visible **↶ Undo / ↷ Redo** buttons. Snapshot the *full* serialized state — every control **plus any drawn/spatial state** (polygons, crop rects, dragged handles, palettes), i.e. the same blob as the settings round-trip (#3), not just slider scalars. Debounce so a continuous drag collapses into **one** history step (snapshot ~350 ms after the last `input`, not per event), keep a bounded stack (~100–120 entries), and on a new edit after undo, truncate the redo branch. Restore by re-applying a snapshot through the same `applyState` path the loader uses (so it can't drift). Guard the key handler when focus is in an `<input>`/`<textarea>` so native text-undo still works. A lookdev without undo punishes exploration — the whole point of the tool.
150
+ 3. **Structured settings round-trip (MANDATORY).** Every lookdev MUST expose its full current state as machine-readable, copy-pasteable text — a settings JSON (or equivalent) covering *every* control, with a one-click **Copy** button and a visible live readout. This is non-negotiable: the agent cannot bake by eyeballing a screenshot, and the user shouldn't have to describe what they dialed in. The round-trip is: user drags → studio serializes the exact state → user pastes the blob back (or it persists to URL/localStorage) → agent bakes from those literal values with identical math. No control may be tweakable without appearing in the export blob. Mirror the state into the URL query so a look is shareable by link, too.
151
+ 4. **Reproducible export.** Beyond the settings blob, pick by what gets committed:
152
+ - **Copy settings JSON** — user pastes back, agent bakes with identical math (port the renderer to Python / build script / etc. and verify the bake matches).
153
+ - **Download asset** — page renders the final artifact at full resolution and triggers a download (PNG / SVG / WebP / JSON).
154
+ - **Make exported artifacts re-loadable — sidecar + embedded metadata.** When the download is a *non-JSON* artifact (STL, PNG, GLB, SVG, WebP, video…), the look that produced it shouldn't be strandable. Do BOTH, where the format allows:
155
+ - **Sidecar:** download a **zip** containing the artifact *and* its `settings.json`, so the exact state ships next to the result.
156
+ - **Embed the settings inside the file itself**, so the bare artifact alone restores the look — then add a **drag-drop / file-input loader** that reads it back through the same `applyState` path as the JSON paste. Per-format hooks: **binary STL** → append `MAGIC + uint32 len + JSON` after the triangle data (CAM ignores trailing bytes; parse `count` at byte 80, footer at `84 + count*50`) and drop a human note in the 80-byte header; **PNG** → a `tEXt`/`iTXt` chunk; **SVG/XML** → a `<metadata>` element or comment; **JPEG/MP4** → EXIF/XMP `UserComment`; **GLB** → an `extras` field. The payoff: the user drops last week's STL back on the viewport and the studio re-dials itself — no "which settings made this?" archaeology. Verify the round-trip (export → reset → load → assert state matches) and confirm the artifact still opens in its native tool (the trailing/edge metadata must not corrupt it). Skip only when the format has nowhere safe to stash bytes; the sidecar zip always works as the fallback.
157
+ 5. **WYSIWYG.** The preview frame must match the production context — same background color, same fonts loaded, same container max-width, same `object-fit`. A generic centered canvas is not WYSIWYG.
158
+ 6. **Framework-route variant.** When the lookdev is for UI layout inside an existing app, build it as a **temporary route** in the app (`app/dev/...` or equivalent) so the real components, styles, and tokens are in the comparison. **Delete the route once baked.**
159
+
160
+ ## 3D lookdev — orientation gizmo (MANDATORY when the camera orbits)
161
+
162
+ Any lookdev with a **non-fixed camera** (OrbitControls, trackball, free fly — anything where the user can spin/tumble the view) MUST include a **CAD-style ViewCube** in a corner. Free orbit alone disorients: the user loses which way is up, can't get a repeatable canonical view, and can't tell whether they're looking at the front or the back. The cube fixes both problems — it's an orientation *indicator* and a *controller* in one. **Copy the Autodesk/Fusion 360 ViewCube** — that's the interaction users expect; don't invent a different gizmo.
163
+
164
+ Required behaviour (this is cheap — ~70 lines of Three.js, no excuse to skip):
165
+
166
+ - **Live orientation readout.** A small second scene/renderer in a corner draws a labeled cube (FRONT/BACK/LEFT/RIGHT/TOP/BOTTOM). Each frame, drive the gizmo camera from the *main* camera's view direction (`gizmoCam.position = (mainCam.position − target).normalize() * d; gizmoCam.up = mainCam.up; gizmoCam.lookAt(0,0,0)`) so the cube always mirrors the scene's current orientation.
167
+ - **Click a face / edge / corner to snap** (the defining Fusion behavior; it's 26 preset views — 6 faces, 12 edges, 8 corners). Raycast the gizmo and snap each component of the local hit point (`|c|>0.55 ? sign(c) : 0`) to derive a view direction. One pickable cube then yields **faces → ortho views, edges → 45° edge views, corners → iso views** from a single mesh — no separate hit zones needed. Animate the main camera to `target + dir*currentDist` with a short lerp (~0.28/frame), not an instant cut — the motion is what keeps the user oriented.
168
+ - **Drag the cube to orbit freely** (also Fusion, also mandatory — the user WILL try to grab it). Use pointer events with **click-vs-drag discrimination**: on `pointerdown` record the start and `setPointerCapture`; on `pointermove`, once travel exceeds ~4px flip into drag mode and orbit the *main* camera by the pointer delta (convert the camera offset to spherical around the target, `theta -= dx*k; phi = clamp(phi - dy*k, ε, π−ε)`); on `pointerup`, if it never became a drag, treat it as a snap-click. Capture means the drag keeps working when the pointer leaves the little canvas. Cancel any in-flight snap tween when a drag starts.
169
+ - **Roll arrows = Fusion's "rotate".** Two curved-arrow buttons (⟲ ⟳) beside the cube that **roll the current view 90°** about the view axis (rotate `camera.up` by ±90° around the normalized `position−target` axis). This is the rotate users mean when they say the gizmo "can't rotate" — drag-orbit is *not* a substitute for it. Snap-cleanup the rolled up so near-cardinal components land exactly on 0/±1 (keep genuine diagonals). **Let it roll in ANY view, including iso** — do NOT gate it to face-on views or auto-snap-to-face first. (I tried that "Fusion only rolls in standard views" guard and it backfired: it stops the user rolling an *isometric* view into the exact orientation they want, which is a primary reason they reach for the arrows. Rolling an iso view is a valid, common move.)
170
+ - **Perspective ⇄ orthographic toggle.** Any 3D lookdev should expose a projection toggle. Perspective for a natural read; **orthographic for CAD/measure/section work** (parallel edges, true elevation, no foreshortening — essential when judging a thickness or aligning a face). Swap by building the other camera, copying `position`/`up`/`target`, and rebuilding controls; size the ortho frustum from the current target distance (`h = 2·dist·tan(fov/2)`) so the switch doesn't jump scale. Handle resize for both (`isPerspectiveCamera` → set `aspect`; ortho → recompute `left/right` from aspect keeping height).
171
+ - **`camera.up` + OrbitControls is a TRAP — read this.** Three's OrbitControls (r160) captures its orbit-axis quaternion from `camera.up` **once**, at construction. If you mutate `camera.up` afterward (e.g. to "fix" a top view, or to roll) and leave it, the main-viewport drag silently breaks — OrbitControls keeps orbiting around the *old* up while the camera renders with the *new* one. Two consequences for the gizmo: **(a)** Do NOT flip `camera.up` for top/bottom snaps. Leave it `(0,1,0)` and instead nudge the snap *direction* a hair off the pole (`dir = (0,±1,0.0009)`) so `lookAt` with `up=+Y` doesn't gimbal-lock. **(b)** When you DO need a new up (the roll arrows), **dispose and recreate OrbitControls** after setting `camera.up`, copying `target` across, so it re-captures the axis. Snaps and Home should reset to `up=(0,1,0)` and rebuild if currently rolled.
172
+ - **Home / reset-view button** beside the cube (Fusion's house icon) that re-frames the object, resets `camera.up=(0,1,0)`, and rebuilds controls if rolled.
173
+ - **Hover highlight the exact zone, not just the face.** Fusion subdivides each face into a 3×3 grid — center cell = face, edge cells = edges, corner cells = corners — and lights the hovered cell *wrapping across the adjacent faces*. Implement with a small pool of up to 3 translucent quads: from the hovered direction `d` (1/2/3 nonzero axes), for each nonzero axis place one quad on that face at the cell offset `(other-axis sign)*⅔`. A corner lights 3 quads (one per adjacent face), an edge 2, a face 1. A plain whole-face tint is wrong — the user can't tell a corner-pick from a face-pick. Also set a `grab`/`grabbing` cursor so the cube reads as draggable.
174
+
175
+ **Orient the model so FRONT is the face the user cares about.** The cube's labels are fixed to world axes, so how you place the model decides what "FRONT" shows. For a relief/panel/anything with a hero face, stand it so the hero face points world **+Z** (= FRONT) and image-up points **+Y** — don't lay it flat facing +Y, or FRONT shows a meaningless edge and TOP shows the hero (surprising and "wrong" to the user). Watch the displaced-axis sign too: Three's `PlaneGeometry` pushes `-y`, so vertex row 0 is **+Y (top)** — map image row 0 (top) to it with **no flip**, or your relief comes out upside-down. Verify by snapping FRONT and eyeballing against the source image; don't trust the index math.
176
+
177
+ **Build solids, not floating sheets.** A displaced `PlaneGeometry` is a single hollow surface — fine for a quick look, wrong the moment the user inspects it. In X-ray (or any side view) the raised bumps read as hollow domes floating above the base with a gap, and it's not watertight for STL/CAM. If the thing is a real object (relief, terrain block, carved panel), build a **solid heightfield**: displaced top surface + perimeter skirt walls + flat bottom, so it's rooted on its base. The user *will* notice "the back doesn't touch the backplate." Set the material `DoubleSide` so hand-wound walls never render black.
178
+
179
+ **Section / X-ray for hidden internal dimensions.** When a control sets something you can't see from outside — wall thickness, a backing/backplate, internal clearance, draft — add an **X-ray/section toggle** so the user can actually see what they're dialing. Cheapest version: ghost the outer shell (`transparent, opacity~0.15, depthWrite:false`) and render the measured solid (the backplate slab, the remaining wall) as an **opaque distinctly-colored mesh** with a bright edge line at the critical boundary; pair it with a side ortho snap so the dimension reads as a clean band. (A true clipping-plane section with caps is the fancier version; usually not worth the stencil work.) Don't make the user infer a hidden thickness from a number alone when one toggle can show it.
180
+
181
+ Keep it in world/view space aligned to how the model is *displayed* (account for any root rotation you applied). **Verify by visualization, not math** (these all bit me): click TOP then drag the *main viewport* and screenshot — confirm it still orbits (catches the `camera.up` trap); hover a corner and screenshot the cube — confirm the corner zone lights across faces, not the whole face; click a roll arrow from an iso view and screenshot — confirm it snaps to a face (not a diagonal roll); snap FRONT and confirm the hero face is upright. Genuinely-optional Fusion extras: the adjacent-face triangle arrows (drag-orbit covers them), the N/E/S/W compass ring, and the right-click "set current view as Home" menu — skip unless asked.
182
+
183
+ ## Workflow
184
+
185
+ 1. **Build the studio for the specific question.** Don't make it generic. If the user is choosing a hero crop, the studio shows the actual hero. If they're choosing a font, the studio is reading sample text.
186
+ 2. **Serve locally.** Never hardcode a port — bind a static server to port 0 (the OS hands back a free port) for static HTML, or use the project's dev server for framework routes. Give the user the URL.
187
+ 3. **Verify it works headlessly** before handing it over (headless Playwright). Don't ask the user to debug your scaffolding.
188
+ 4. **User iterates.** They paste back a settings JSON, click a Download button, or say "go with N" / "use this".
189
+ 5. **Bake.** Render the chosen state into committed assets / production code with reproducible math. Verify the baked result matches what they dialed in (a quick screenshot diff is fair).
190
+ 6. **Tear down the scaffolding.** Delete the lookdev dir / dev route — it was decision-time scaffolding, not production code. Commit + deploy.
191
+
192
+ ## Anti-patterns
193
+
194
+ - **Static N×M comparison grid** — limits the user to your guesses; takes longer than a switcher; doesn't give them the in-between point they actually wanted.
195
+ - **Numeric prompt before the slider** — "what saturation do you want?" is the wrong question; let them drag.
196
+ - **Numeric inputs for spatial decisions** — drag the element. Sliders for opacity, drag handles for position.
197
+ - **Drift between preview math and bake math** — when both JS preview and Python bake exist, port one to match the other and verify on a known input.
198
+ - **Building inside production routes** — keep scaffolding isolated and trivially deletable. Reach for `app/dev/...` then nuke it.
199
+ - **Skipping the WYSIWYG details** — preview without the real font / container / background lies to the user.
200
+ - **No structured way to read the state back out** — a studio with no copy-able settings blob forces the agent to bake from a screenshot and the user to narrate values by hand. Every control must round-trip through a machine-readable export (see Architecture #3).
201
+ - **Handing back a wall of prose for "review"** — pasting a long doc/blog into chat (or shipping the markdown file) and asking the user to react is NOT lookdev. For any document/copy/media review, build the **text & media annotation studio** (direct edit + highlight + comment + media-flag) so the user marks up the rendered artifact and the markup round-trips back as a patch. A boring text dump the user has to read and reply to in chat is the exact thing this skill exists to replace.
202
+
203
+ ## Working example
204
+
205
+ A worked example — an image-treatment studio:
206
+ extracts a Lab-k-means dominant palette with coverage %, exposes sliders
207
+ (resolution, colorize, saturation, gap, glyph, contrast), per-band color
208
+ pickers, a luminance-vs-nearest mapping toggle, a Copy-settings-JSON
209
+ button, and a `--bake-json` Python path that renders the chosen state to
210
+ committed PNG/WebP with math identical to the JS preview. The preview
211
+ canvases match the production thumb and hero shapes exactly.
212
+
213
+ ## Related (the studio / narrative family)
214
+
215
+ lookdev is one of two flagship narratives — **human-in-the-loop** (you, the human, judge and
216
+ tune). Its determinism-narrative sibling is deterministic-design (render → *measure* the
217
+ UI, numbers not vibes). The family it chains with:
218
+
219
+ - **deterministic-design** — the other flagship; measure/judge design output deterministically.
220
+ - **screenstudio-alternative** — human-in-the-loop video/demo polish studio (NLE timeline).
221
+ - **macos-screen-recorder** — capture a studio session or demo (display + system audio).
222
+ - **lookdev-auto** — the *automated* counterpart: a vision model judges instead of you.
223
+ The foil to lookdev's thesis — use when there's no human to sit the loop.
224
+
225
+ ## Limitations
226
+
227
+ - Lookdev is useful only when the user can inspect or mark up rendered variants; it is overkill for small deterministic edits.
228
+ - A studio must faithfully mirror production fonts, media, containers, and constraints, otherwise the chosen settings can be misleading.
229
+ - Human preference remains the source of truth, so the workflow cannot guarantee a universally "best" design or media treatment.
@@ -0,0 +1,102 @@
1
+ ---
2
+ name: lookdev-auto
3
+ description: "Automated visual tuning: a vision or video model rates rendered variants in a loop. Render several labeled variants into one artifact, ask the model to rate them and suggest better values, render the suggestions, ask it to pick the best, repeat until good — the model is the eye, you run the loop."
4
+ risk: safe
5
+ source: community
6
+ source_type: community
7
+ source_repo: connerkward/lookdev-auto-skill
8
+ date_added: "2026-06-16"
9
+ author: Conner K Ward
10
+ license: MIT
11
+ tags:
12
+ - visual-eval
13
+ - vision-model
14
+ - tuning
15
+ - automation
16
+ - render-loop
17
+ tools:
18
+ - claude-code
19
+ - antigravity
20
+ - cursor
21
+ - gemini-cli
22
+ - codex-cli
23
+ ---
24
+ ## When to Use
25
+
26
+ Use whenever "looks/feels right" is the success criterion and there's no cheap numeric metric — animation easing/timing, zoom/camera feel, color grade, layout/spacing, design params, render/encoder settings, prompt params. Use the automated counterpart to lookdev when there's no human to sit the loop.
27
+
28
+ _Source: [connerkward/lookdev-auto-skill](https://github.com/connerkward/lookdev-auto-skill) (MIT)._
29
+
30
+ # Visual eval loop — let a vision/video model tune what only an eye can judge
31
+
32
+ When the target is "does this LOOK/FEEL right" (not a number you can minimize), a
33
+ vision model (image) or video-understanding model (motion/timing) can be the judge in
34
+ a tight optimize loop. Worked reference: the `screenstudio-alternative` skill (`iteration.py`)
35
+ (tuned zoom-animation feel via `fal-ai/video-understanding`).
36
+
37
+ ## The loop
38
+
39
+ 1. **Render N labeled variants into ONE artifact.** Vary the parameter(s) across a
40
+ small spread. **Annotate each variant's params ON the artifact** (burn the label in:
41
+ "A · 2.2Hz · ζ0.5"). Images → a labeled grid/contact sheet. Video/motion → a
42
+ labeled *sequence* (label card or burned-in overlay before/over each clip) so the
43
+ model can compare temporally.
44
+ 2. **One model call, structured output.** Send the single artifact with an explicit
45
+ rubric (define what "good" means — and what "too much"/"too little" look like).
46
+ Ask for **per-variant ratings + concrete suggested new values as JSON**:
47
+ `{"ratings":{"A":n,...},"best_so_far":"X","suggest":[[p1,p2],...]}`.
48
+ 3. **Coarse → fine.** Round 1 = wide spread to locate the region. Round 2 = render the
49
+ model's suggestions (+ carry the current best) into one artifact; ask it to **pick
50
+ the single best**. Usually converges in **2 rounds**.
51
+ 4. **Stop when sufficient** — best rates high and suggestions cluster. Apply the winner.
52
+
53
+ ## Token / quality / step reductions (do these)
54
+
55
+ - **One artifact per round, not one call per variant.** The biggest saver — a 6-variant
56
+ round is 1 upload + 1 inference, not 6. Montage/grid beats a loop of single calls.
57
+ - **Burn params onto the artifact.** The model sees label+result together → no separate
58
+ "variant A used X" context to carry → fewer tokens, fewer mistakes.
59
+ - **Structured JSON out + parse.** No re-asking, no free-text wrangling. Prompt "return
60
+ ONLY JSON"; regex the first `{...}`.
61
+ - **Short representative sample.** Tune on a 3-5s clip / one frame / one component, not
62
+ the whole asset. Cheaper render, smaller upload, faster inference. Apply the found
63
+ params to the full render once.
64
+ - **Cap variants at ~5-6.** More doesn't improve the model's discrimination and multiplies
65
+ render + token cost. Wide-but-sparse round 1, narrow round 2.
66
+ - **Calibration anchors.** Include one deliberately-bad and one safe-default variant as
67
+ fixed anchors each round — gives the model a reference scale and exposes when its
68
+ "best" is worse than the safe default (catch a bad recommendation early).
69
+ - **Independent rubric, stated up front.** Define "good" concretely in the prompt
70
+ (smooth, subtle settle, not bouncy, not sluggish). Don't ask "which do you like" —
71
+ that lets it echo your framing. A held-out criterion keeps the judge honest
72
+ (see verify-outputs-rule: the check must be independent of what you tuned).
73
+ - **Reuse renders across rounds.** Carry the round-1 winner's clip into round 2 instead
74
+ of re-rendering it.
75
+ - **Early-exit.** If round-1 top ≥9/10 and the three suggestions are within a small delta,
76
+ skip round 2.
77
+ - **Cheapest judge that can see the failure.** Frames-through an image VLM can judge
78
+ spatial things (layout, color, crop); only reach for a true *video* model when the
79
+ thing being judged is **temporal** (easing, timing, motion smoothness) — those are
80
+ invisible in stills.
81
+
82
+ ## When NOT to use it
83
+
84
+ - A real numeric metric exists and correlates with quality → optimize that directly;
85
+ don't pay a model per step.
86
+ - The judgment is subjective-to-the-user (their taste, brand) → show them the variants
87
+ and let them pick; a model's "best" isn't their best. (This is why the screen-studio
88
+ spring auto-tune was dropped — the model's pick didn't match the owner's eye.)
89
+ - One or two variants → just look yourself.
90
+
91
+ ## Caveats (learned)
92
+
93
+ - The model's pick is an *opinion*, not ground truth — anchor it, and sanity-check the
94
+ winner against the safe default yourself before committing.
95
+ - Vision/video models perceive gross differences well, fine ones poorly — keep variant
96
+ spacing perceptible; near-identical variants get noise-rated.
97
+
98
+ ## Limitations
99
+
100
+ - Model ratings are probabilistic aesthetic judgments, not objective truth; keep a human review step for brand-critical or subjective work.
101
+ - Automated rounds can become expensive or slow when renders are heavy or many variants are explored.
102
+ - This skill needs screenshots, frames, or clips that expose the quality difference; it is weak for subtle motion, audio, copy nuance, or user-preference calls.
@@ -0,0 +1,59 @@
1
+ ---
2
+ name: macos-screen-recorder
3
+ description: "macOS screen recorder that captures the main display PLUS system audio via ScreenCaptureKit — no BlackHole/loopback driver, no sudo, just the standard Screen Recording permission. CLI-driven; fills the headless-screen-recording-with-system-sound gap QuickTime and `screencapture -v` can't."
4
+ risk: safe
5
+ source: community
6
+ source_type: community
7
+ source_repo: connerkward/macos-screen-recorder-system-audio
8
+ date_added: "2026-06-16"
9
+ author: Conner K Ward
10
+ license: MIT
11
+ tags:
12
+ - macos
13
+ - screen-recording
14
+ - system-audio
15
+ - screencapturekit
16
+ - cli
17
+ - swift
18
+ tools:
19
+ - claude-code
20
+ - antigravity
21
+ - cursor
22
+ - gemini-cli
23
+ - codex-cli
24
+ ---
25
+ ## When to Use
26
+
27
+ Use when you need to script a screen recording WITH system sound on macOS from the CLI (demos, captures, voice-demo recording) — the case QuickTime and `screencapture -v` can't cover without a virtual audio device.
28
+
29
+ _Source: [connerkward/macos-screen-recorder-system-audio](https://github.com/connerkward/macos-screen-recorder-system-audio) (MIT)._
30
+
31
+ # macos-screen-recorder (sck-record)
32
+
33
+ `sck-record.swift` → compiled `sck-record` (binary gitignored; built by `setup-machine`, or
34
+ `swiftc -O sck-record.swift -o sck-record`). Records the main display + system audio via
35
+ ScreenCaptureKit.
36
+
37
+ ```
38
+ ./sck-record <out.mp4> <seconds>
39
+ ```
40
+
41
+ **The one true differentiator:** system audio from the CLI with **zero install** — no
42
+ BlackHole / loopback virtual device, no sudo; only the standard Screen Recording permission
43
+ (granted once to whatever app shells out). It is *not* a general "better than OBS/Screen
44
+ Studio" tool — it fills exactly the headless-CLI-with-system-audio gap.
45
+
46
+ `sck-record` is the raw capture primitive — it records, nothing more. To polish a
47
+ recording afterward (idle speed-up, auto-zoom, keystroke chips, smoothed cursor,
48
+ vertical export), pair it with
49
+ [screenstudio-alternative-skill](https://github.com/connerkward/screenstudio-alternative-skill):
50
+ record with `sck-record --no-cursor <out.mp4> <seconds>`, then run its post-production
51
+ pass on the resulting mp4. (Auto-zoom and keystroke overlays additionally need an
52
+ input-event log captured *during* recording, which that skill supplies; `sck-record`'s
53
+ pixels alone cover idle speed-up, cursor smoothing, and vertical export.)
54
+
55
+ ## Limitations
56
+
57
+ - macOS only; it depends on ScreenCaptureKit and the user's Screen Recording permission.
58
+ - The recorder captures raw display and system audio but does not provide editing, auto-zoom, captions, or social-format polish by itself.
59
+ - Input-event overlays require a separate event log captured during recording; pixels alone cannot reconstruct keystrokes or precise click metadata.
@@ -0,0 +1,116 @@
1
+ ---
2
+ name: pr-merge-champion
3
+ description: "Optimize pull requests for quick approval and merging by ensuring clean diffs, comprehensive self-reviews, and structured documentation."
4
+ category: workflow
5
+ risk: safe
6
+ source: self
7
+ source_type: self
8
+ date_added: "2026-06-16"
9
+ author: himanshu-2l
10
+ tags: [git, github, pull-request, code-review, workflow]
11
+ tools: [claude, cursor, gemini, antigravity]
12
+ ---
13
+
14
+ # PR Merge Champion
15
+
16
+ ## Overview
17
+
18
+ A systematic playbook for preparing, reviewing, and documenting pull requests to ensure they are high-quality, free of common oversights, and optimized for instant maintainer approval and merging.
19
+
20
+ ## When to Use This Skill
21
+
22
+ - Use when preparing to open a new pull request on GitHub or any Git hosting platform.
23
+ - Use when self-auditing a feature or bug-fix branch for code cleanliness and consistency.
24
+ - Use when trying to minimize review cycles and speed up the integration of your changes.
25
+
26
+ ## How It Works
27
+
28
+ ### Step 1: Pre-Flight Clean Up & Rebase
29
+
30
+ Before presenting your code to reviewers, clean up any workspace noise and ensure your branch is up to date:
31
+ 1. Rebase your feature branch on top of the latest target branch (e.g., `main` or `master`) to resolve conflicts early.
32
+ 2. Clean up untracked, temp, or swap files from your repository.
33
+ 3. Run local linters, formatters, and compilers to ensure no stylistic or syntax errors exist.
34
+
35
+ ### Step 2: Critical Self-Review
36
+
37
+ Review your own diff line-by-line as if you were the reviewer. Look out for:
38
+ 1. Leftover debugging statements (e.g., `console.log`, `print`, breakpoints, or custom debug flags).
39
+ 2. Unnecessary changes, white-space only diffs, or commented-out code blocks.
40
+ 3. Incomplete `TODO` comments that should be resolved or turned into tracked issues.
41
+ 4. Correctness of error handling and edge cases.
42
+
43
+ ### Step 3: Local Verification & Test Suite
44
+
45
+ Verify that all changes work as expected:
46
+ 1. Run the project's automated test suite locally to verify no regressions are introduced.
47
+ 2. Check test coverage for any new code blocks you added.
48
+ 3. Manually test the critical paths and edge cases of your feature or bug fix.
49
+
50
+ ### Step 4: Crafting the Pull Request Description
51
+
52
+ Write a high-signal, structured PR description. A great description tells the story of the changes:
53
+ 1. **Summary**: A concise explanation of the changes.
54
+ 2. **Context / Why**: Why this change is necessary and what problem it solves.
55
+ 3. **Verification**: Explicit details on how you tested it (test commands, screenshots, or step-by-step reproduction).
56
+ 4. **Checklist**: Conform to the repository's contributing guidelines and checklist requirements.
57
+
58
+ ## Examples
59
+
60
+ ### Example 1: Creating a Clean PR Description
61
+
62
+ ```markdown
63
+ # Pull Request: Implement Rate Limiting on Authentication Endpoint
64
+
65
+ ## Summary
66
+ Introduces an IP-based rate limiter on the `/api/v1/auth/login` endpoint using Redis to prevent brute-force attacks.
67
+
68
+ ## Why
69
+ We identified a high volume of login attempts targeting single accounts. This rate limiting window slows down attackers while keeping the system responsive for genuine users.
70
+
71
+ ## Verification
72
+ - Ran unit tests: `npm run test tests/auth.test.js` (all green)
73
+ - Manually verified using Postman: sending 15 requests in under 60 seconds returns `429 Too Many Requests`.
74
+
75
+ ## Checklist
76
+ - [x] Code follows the style guide
77
+ - [x] Unit tests added/updated
78
+ - [x] Documentation updated
79
+ ```
80
+
81
+ ### Example 2: Self-Review Clean Up Commands
82
+
83
+ Before committing, run these commands to inspect the diff for accidental additions:
84
+
85
+ ```bash
86
+ # Check the names of files changed to ensure no unwanted files are staged
87
+ git status --porcelain
88
+
89
+ # Review the actual diff for any leftover print statements or debuggers
90
+ git diff | grep -E "(console\.log|debugger|print\(|var_dump|binding\.pry)"
91
+ ```
92
+
93
+ ## Best Practices
94
+
95
+ - ✅ **Keep PRs Small and Focused**: A PR with fewer than 200 lines of changes gets reviewed and merged significantly faster than a large one.
96
+ - ✅ **Perform a Self-Review first**: Finding your own bugs and formatting issues first builds trust with the maintainers.
97
+ - ✅ **Respect Repository Guidelines**: Check the project's `CONTRIBUTING.md` and pull request templates, and adhere to them strictly.
98
+ - ❌ **Do Not Bundle Unrelated Changes**: Avoid sneaking refactoring or unrelated bug fixes into a feature PR. Create separate PRs instead.
99
+ - ❌ **Do Not Ignore CI Failures**: Always fix failing tests, linters, or security scans on your branch before requesting a review.
100
+
101
+ ## Limitations
102
+
103
+ - This skill does not replace project-specific CI/CD validation, automated testing, or domain-expert reviews.
104
+ - It assumes a standard Git and GitHub-like environment, though the core principles apply to GitLab, Bitbucket, and other platforms.
105
+
106
+ ## Common Pitfalls
107
+
108
+ - **Problem:** A PR is left open for a long time due to minor formatting or style comments.
109
+ **Solution:** Always run the repository's local formatter (e.g., Prettier, ESLint, Black) before committing.
110
+ - **Problem:** Merge conflicts occur immediately after opening the PR.
111
+ **Solution:** Pull the latest main branch and rebase or merge it into your branch daily.
112
+
113
+ ## Related Skills
114
+
115
+ - `@pr-writer` - For Sentry-specific PR writing guidelines.
116
+ - `@clean-code` - To ensure code quality before submitting.
@@ -113,6 +113,17 @@ A high score indicates _structural suitability_, not guaranteed rankings.
113
113
 
114
114
  ---
115
115
 
116
+ ### Scoring Guidance per Category
117
+
118
+ For each of the six scoring categories, allot points within the category's weight band using these anchors:
119
+
120
+ - **0–15% of band:** No alignment — the site/topic clearly does not meet the criterion (e.g. fewer than 10 candidate entities for a directory-style PSEO).
121
+ - **16–40% of band:** Partial alignment — the criterion is partially met, OR met for a small subset of pages only.
122
+ - **41–80% of band:** Strong alignment — the criterion holds for most of the planned page set.
123
+ - **81–100% of band:** Exemplary — the criterion holds universally and is reinforced by a structural data source (DB, API, validated CSV).
124
+
125
+ Sum the per-category scores to compute the Feasibility Index used in §"Feasibility Bands" below.
126
+
116
127
  ### Feasibility Bands (Required)
117
128
 
118
129
  | Score | Verdict | Interpretation |