cdragon 0.1.0
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.
- package/README.md +110 -0
- package/bin/cdragon.js +170 -0
- package/package.json +31 -0
- package/skills/agent-browser/SKILL.md +50 -0
- package/skills/grill-me/SKILL.md +7 -0
- package/skills/herdr-agent/SKILL.md +142 -0
- package/skills/herdr-cli/SKILL.md +388 -0
- package/skills/herdr-cli/scripts/herdr-agent-run-and-wait +203 -0
- package/skills/herdr-cli/scripts/herdr-agent-wait-complete +168 -0
- package/skills/notion-presentation/SKILL.md +170 -0
- package/skills/notion-presentation/references/example-redis-deck.md +97 -0
- package/skills/setup-matt-pocock-skills/SKILL.md +127 -0
- package/skills/setup-matt-pocock-skills/domain.md +51 -0
- package/skills/setup-matt-pocock-skills/issue-tracker-github.md +34 -0
- package/skills/setup-matt-pocock-skills/issue-tracker-gitlab.md +35 -0
- package/skills/setup-matt-pocock-skills/issue-tracker-local.md +19 -0
- package/skills/setup-matt-pocock-skills/triage-labels.md +15 -0
- package/skills/tdd/SKILL.md +108 -0
- package/skills/tdd/mocking.md +59 -0
- package/skills/tdd/refactoring.md +10 -0
- package/skills/tdd/tests.md +61 -0
- package/skills/to-html/SKILL.md +83 -0
- package/skills/to-html/designs/INDEX.md +74 -0
- package/skills/to-html/designs/airbnb.DESIGN.md +581 -0
- package/skills/to-html/designs/airtable.DESIGN.md +275 -0
- package/skills/to-html/designs/alipay.DESIGN.md +456 -0
- package/skills/to-html/designs/apple.DESIGN.md +566 -0
- package/skills/to-html/designs/banksalad.DESIGN.md +621 -0
- package/skills/to-html/designs/channeltalk.DESIGN.md +374 -0
- package/skills/to-html/designs/clay.DESIGN.md +398 -0
- package/skills/to-html/designs/clickhouse.DESIGN.md +374 -0
- package/skills/to-html/designs/cohere.DESIGN.md +361 -0
- package/skills/to-html/designs/coinone.DESIGN.md +218 -0
- package/skills/to-html/designs/coupang.DESIGN.md +502 -0
- package/skills/to-html/designs/cursor.DESIGN.md +416 -0
- package/skills/to-html/designs/elevenlabs.DESIGN.md +376 -0
- package/skills/to-html/designs/expo.DESIGN.md +373 -0
- package/skills/to-html/designs/figma.DESIGN.md +490 -0
- package/skills/to-html/designs/framer.DESIGN.md +393 -0
- package/skills/to-html/designs/freee.DESIGN.md +572 -0
- package/skills/to-html/designs/gangnamunni.DESIGN.md +621 -0
- package/skills/to-html/designs/gmarket.DESIGN.md +483 -0
- package/skills/to-html/designs/gogolook.DESIGN.md +131 -0
- package/skills/to-html/designs/hahow.DESIGN.md +158 -0
- package/skills/to-html/designs/hashicorp.DESIGN.md +369 -0
- package/skills/to-html/designs/hyundaicard.DESIGN.md +177 -0
- package/skills/to-html/designs/ibm.DESIGN.md +420 -0
- package/skills/to-html/designs/kakaobank.DESIGN.md +548 -0
- package/skills/to-html/designs/kakaopay.DESIGN.md +544 -0
- package/skills/to-html/designs/karrot.DESIGN.md +445 -0
- package/skills/to-html/designs/kdan.DESIGN.md +160 -0
- package/skills/to-html/designs/krds.DESIGN.md +997 -0
- package/skills/to-html/designs/line.DESIGN.md +431 -0
- package/skills/to-html/designs/linear.app.DESIGN.md +548 -0
- package/skills/to-html/designs/miro.DESIGN.md +272 -0
- package/skills/to-html/designs/mistral.ai.DESIGN.md +353 -0
- package/skills/to-html/designs/money-forward.DESIGN.md +401 -0
- package/skills/to-html/designs/mongodb.DESIGN.md +357 -0
- package/skills/to-html/designs/naver.DESIGN.md +533 -0
- package/skills/to-html/designs/nhncloud.DESIGN.md +174 -0
- package/skills/to-html/designs/opencode.ai.DESIGN.md +388 -0
- package/skills/to-html/designs/pinterest.DESIGN.md +322 -0
- package/skills/to-html/designs/posthog.DESIGN.md +430 -0
- package/skills/to-html/designs/raycast.DESIGN.md +422 -0
- package/skills/to-html/designs/remember.DESIGN.md +460 -0
- package/skills/to-html/designs/resend.DESIGN.md +396 -0
- package/skills/to-html/designs/sanity.DESIGN.md +449 -0
- package/skills/to-html/designs/sendbird.DESIGN.md +285 -0
- package/skills/to-html/designs/smarthr.DESIGN.md +404 -0
- package/skills/to-html/designs/socar.DESIGN.md +403 -0
- package/skills/to-html/designs/spotify.DESIGN.md +265 -0
- package/skills/to-html/designs/supabase.DESIGN.md +348 -0
- package/skills/to-html/designs/superhuman.DESIGN.md +414 -0
- package/skills/to-html/designs/together.ai.DESIGN.md +356 -0
- package/skills/to-html/designs/toss.DESIGN.md +655 -0
- package/skills/to-html/designs/uber.DESIGN.md +387 -0
- package/skills/to-html/designs/upstage.DESIGN.md +232 -0
- package/skills/to-html/designs/velog.DESIGN.md +168 -0
- package/skills/to-html/designs/vercel.DESIGN.md +479 -0
- package/skills/to-html/designs/wanted.DESIGN.md +529 -0
- package/skills/to-html/designs/wise.DESIGN.md +276 -0
- package/skills/to-html/designs/yanolja.DESIGN.md +463 -0
- package/skills/to-html/designs/yeogiotte.DESIGN.md +459 -0
- package/skills/to-html/designs/zapier.DESIGN.md +433 -0
- package/skills/to-html/designs/zigzag.DESIGN.md +633 -0
- package/skills/to-issues/SKILL.md +84 -0
- package/skills/to-prd/SKILL.md +75 -0
- package/src/colors.js +15 -0
- package/src/link.js +47 -0
- package/src/prompt.js +137 -0
- package/src/skills.js +75 -0
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
import argparse
|
|
3
|
+
import json
|
|
4
|
+
import subprocess
|
|
5
|
+
import sys
|
|
6
|
+
import time
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
COMPLETION_STATUSES = ("idle", "done")
|
|
10
|
+
ATTENTION_STATUSES = ("blocked",)
|
|
11
|
+
WATCHED_STATUSES = COMPLETION_STATUSES + ATTENTION_STATUSES
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def run_json(args):
|
|
15
|
+
result = subprocess.run(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
|
|
16
|
+
if result.returncode != 0:
|
|
17
|
+
return None, result
|
|
18
|
+
try:
|
|
19
|
+
return json.loads(result.stdout), result
|
|
20
|
+
except json.JSONDecodeError:
|
|
21
|
+
return None, result
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def pane_status(pane_id):
|
|
25
|
+
data, result = run_json(["herdr", "pane", "get", pane_id])
|
|
26
|
+
if data is None:
|
|
27
|
+
return None, result
|
|
28
|
+
return data["result"]["pane"].get("agent_status"), result
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def wait_status(pane_id, status, timeout_ms):
|
|
32
|
+
return subprocess.Popen(
|
|
33
|
+
["herdr", "wait", "agent-status", pane_id, "--status", status, "--timeout", str(timeout_ms)],
|
|
34
|
+
stdout=subprocess.PIPE,
|
|
35
|
+
stderr=subprocess.PIPE,
|
|
36
|
+
text=True,
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def wait_for_start(pane_id, start_timeout_ms):
|
|
41
|
+
deadline = time.time() + (start_timeout_ms / 1000)
|
|
42
|
+
last_status = None
|
|
43
|
+
last_error = None
|
|
44
|
+
while time.time() < deadline:
|
|
45
|
+
status, result = pane_status(pane_id)
|
|
46
|
+
if status is None:
|
|
47
|
+
last_error = result.stderr.strip() or result.stdout.strip()
|
|
48
|
+
else:
|
|
49
|
+
last_status = status
|
|
50
|
+
if status == "working":
|
|
51
|
+
return "working", None
|
|
52
|
+
if status in ATTENTION_STATUSES:
|
|
53
|
+
return status, None
|
|
54
|
+
time.sleep(0.1)
|
|
55
|
+
return last_status, last_error
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def race_completion(pane_id, timeout_ms):
|
|
59
|
+
procs = {status: wait_status(pane_id, status, timeout_ms) for status in WATCHED_STATUSES}
|
|
60
|
+
deadline = time.time() + (timeout_ms / 1000)
|
|
61
|
+
winner = None
|
|
62
|
+
|
|
63
|
+
while time.time() < deadline:
|
|
64
|
+
for status, proc in list(procs.items()):
|
|
65
|
+
rc = proc.poll()
|
|
66
|
+
if rc is not None:
|
|
67
|
+
stdout, stderr = proc.communicate()
|
|
68
|
+
if rc == 0:
|
|
69
|
+
winner = (status, stdout.strip(), stderr.strip())
|
|
70
|
+
break
|
|
71
|
+
procs.pop(status, None)
|
|
72
|
+
if winner:
|
|
73
|
+
break
|
|
74
|
+
time.sleep(0.1)
|
|
75
|
+
|
|
76
|
+
for proc in procs.values():
|
|
77
|
+
if proc.poll() is None:
|
|
78
|
+
proc.terminate()
|
|
79
|
+
try:
|
|
80
|
+
proc.wait(timeout=2)
|
|
81
|
+
except subprocess.TimeoutExpired:
|
|
82
|
+
proc.kill()
|
|
83
|
+
|
|
84
|
+
return winner
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def main():
|
|
88
|
+
parser = argparse.ArgumentParser(
|
|
89
|
+
description="Wait for a herdr agent task to complete as idle/done, or return promptly on blocked."
|
|
90
|
+
)
|
|
91
|
+
parser.add_argument("pane_id")
|
|
92
|
+
parser.add_argument("--timeout", type=int, default=120000, help="completion timeout in ms")
|
|
93
|
+
parser.add_argument(
|
|
94
|
+
"--start-timeout",
|
|
95
|
+
type=int,
|
|
96
|
+
default=10000,
|
|
97
|
+
help="time in ms to observe working before racing idle/done",
|
|
98
|
+
)
|
|
99
|
+
parser.add_argument(
|
|
100
|
+
"--no-wait-working",
|
|
101
|
+
action="store_true",
|
|
102
|
+
help="skip the initial working observation and immediately race idle/done",
|
|
103
|
+
)
|
|
104
|
+
args = parser.parse_args()
|
|
105
|
+
|
|
106
|
+
if not args.no_wait_working:
|
|
107
|
+
start_status, start_error = wait_for_start(args.pane_id, args.start_timeout)
|
|
108
|
+
if start_status in ATTENTION_STATUSES:
|
|
109
|
+
print(
|
|
110
|
+
json.dumps(
|
|
111
|
+
{
|
|
112
|
+
"completed_status": None,
|
|
113
|
+
"status": start_status,
|
|
114
|
+
"phase": "attention",
|
|
115
|
+
"pane_id": args.pane_id,
|
|
116
|
+
"event": None,
|
|
117
|
+
}
|
|
118
|
+
)
|
|
119
|
+
)
|
|
120
|
+
return 2
|
|
121
|
+
if start_status != "working":
|
|
122
|
+
print(
|
|
123
|
+
json.dumps(
|
|
124
|
+
{
|
|
125
|
+
"error": "agent did not enter working before start timeout",
|
|
126
|
+
"pane_id": args.pane_id,
|
|
127
|
+
"last_status": start_status,
|
|
128
|
+
"last_error": start_error,
|
|
129
|
+
}
|
|
130
|
+
),
|
|
131
|
+
file=sys.stderr,
|
|
132
|
+
)
|
|
133
|
+
return 1
|
|
134
|
+
|
|
135
|
+
winner = race_completion(args.pane_id, args.timeout)
|
|
136
|
+
if winner:
|
|
137
|
+
status, stdout, stderr = winner
|
|
138
|
+
phase = "attention" if status in ATTENTION_STATUSES else "completion"
|
|
139
|
+
print(
|
|
140
|
+
json.dumps(
|
|
141
|
+
{
|
|
142
|
+
"completed_status": status if status in COMPLETION_STATUSES else None,
|
|
143
|
+
"status": status,
|
|
144
|
+
"phase": phase,
|
|
145
|
+
"pane_id": args.pane_id,
|
|
146
|
+
"event": json.loads(stdout) if stdout else None,
|
|
147
|
+
}
|
|
148
|
+
)
|
|
149
|
+
)
|
|
150
|
+
return 2 if status in ATTENTION_STATUSES else 0
|
|
151
|
+
|
|
152
|
+
status, result = pane_status(args.pane_id)
|
|
153
|
+
print(
|
|
154
|
+
json.dumps(
|
|
155
|
+
{
|
|
156
|
+
"error": "timed out waiting for idle, done, or blocked",
|
|
157
|
+
"pane_id": args.pane_id,
|
|
158
|
+
"last_status": status,
|
|
159
|
+
"pane_get_stderr": result.stderr.strip() if result else None,
|
|
160
|
+
}
|
|
161
|
+
),
|
|
162
|
+
file=sys.stderr,
|
|
163
|
+
)
|
|
164
|
+
return 1
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
if __name__ == "__main__":
|
|
168
|
+
raise SystemExit(main())
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: notion-presentation
|
|
3
|
+
description: Use this skill whenever the user wants to create, design, or restructure a presentation document inside Notion — especially for Notion's presentation mode (where `---` becomes a slide break and headings become slide titles). Trigger on phrases like "노션 프레젠테이션", "프레젠테이션 모드", "노션으로 발표자료", "슬라이드 문서", "Notion presentation", "make slides in Notion", or when the user pastes a Notion URL and asks to turn it into slides. Also use when the user has a topic, outline, or technical content that needs to be converted into a polished, designer-quality Notion slide deck. The skill blends traditional presentation craft (narrative arc, rule of three, visual hierarchy, contrast, metaphor) with Notion-native blocks (callouts, columns, toggles, Mermaid, tables, inline color) so the result reads like something a senior designer or technical evangelist would produce — not a wall of bullets.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Notion Presentation Builder
|
|
7
|
+
|
|
8
|
+
This skill produces **designer-grade Notion presentation documents** that work in Notion's presentation mode. The goal is not "a Notion page with headings" — it is a slide deck that survives standing on a stage, with deliberate rhythm, visual hierarchy, and a strong narrative arc.
|
|
9
|
+
|
|
10
|
+
## When to use this skill
|
|
11
|
+
|
|
12
|
+
- The user wants to turn a topic, outline, or raw content into a Notion presentation
|
|
13
|
+
- The user references Notion's presentation mode (`---` as slide break, headings as titles)
|
|
14
|
+
- The user shares a Notion URL and asks to restructure it into slides
|
|
15
|
+
- The user gives you an existing slide spec and asks you to "build it properly" in Notion
|
|
16
|
+
|
|
17
|
+
If the request is for a static document (report, wiki page, spec), this skill is **not** the right tool — use plain Notion markdown instead.
|
|
18
|
+
|
|
19
|
+
## Core mental model
|
|
20
|
+
|
|
21
|
+
Notion presentation mode has two non-negotiable rules:
|
|
22
|
+
|
|
23
|
+
1. **`---` (a horizontal divider) starts a new slide.**
|
|
24
|
+
2. **Headings (`#`, `##`, `###`) become the slide title.** Use `#` for the main title of each slide; reserve `##` / `###` for in-slide section headers.
|
|
25
|
+
|
|
26
|
+
Everything else is just Notion blocks — but the *combination* of blocks is what separates a good deck from a bad one. A great Notion slide uses 2–4 different block types arranged with intent. A bad one is a bulleted list pretending to be a slide.
|
|
27
|
+
|
|
28
|
+
## Before you start: interview the user (briefly)
|
|
29
|
+
|
|
30
|
+
If the user hasn't already provided structure, ask just enough to design well. Don't over-ask — pick 1–3 of these depending on what's missing:
|
|
31
|
+
|
|
32
|
+
- **Audience**: technical engineers? executives? mixed?
|
|
33
|
+
- **Length**: how many slides? (default: 8–12 if not specified)
|
|
34
|
+
- **Tone**: formal / conversational / technical-with-personality?
|
|
35
|
+
- **Format constraints**: are they presenting live, or sharing the doc async? (Live = simpler slides, async = more text OK.)
|
|
36
|
+
- **Existing material**: do they have an outline, or are you building from a topic?
|
|
37
|
+
|
|
38
|
+
If they already gave a detailed slide-by-slide spec (like the Redis example), skip the interview and execute.
|
|
39
|
+
|
|
40
|
+
## The narrative spine (apply to every deck)
|
|
41
|
+
|
|
42
|
+
Strong decks follow a story, not a table of contents. Map the slides to this arc:
|
|
43
|
+
|
|
44
|
+
| Phase | Purpose | Typical slides |
|
|
45
|
+
|---|---|---|
|
|
46
|
+
| **Hook** | Pull the audience in with tension, a counterintuitive claim, or a vivid number | 1 |
|
|
47
|
+
| **Problem / Question** | Establish *why this matters now* | 1–2 |
|
|
48
|
+
| **Tension / Tradeoff** | Show the conventional answer is incomplete | 1 |
|
|
49
|
+
| **Core insight** | The "aha" — the central thesis of the deck | 1 |
|
|
50
|
+
| **Body (deep dive)** | Evidence, mechanisms, examples — usually 3–5 sub-points (rule of three works) | 3–6 |
|
|
51
|
+
| **Nuance / Counter** | Address the "yes but…" — shows intellectual honesty | 1 |
|
|
52
|
+
| **Summary + action** | What to remember, what to do Monday morning | 1 |
|
|
53
|
+
|
|
54
|
+
Not every deck needs all phases, but **every deck needs Hook → Insight → Body → Summary** at minimum. If you can't identify the hook and the insight, the deck isn't ready to build.
|
|
55
|
+
|
|
56
|
+
## Slide design patterns
|
|
57
|
+
|
|
58
|
+
A slide is one of these archetypes. Mixing archetypes is what creates visual rhythm — *never* build a deck where every slide looks the same.
|
|
59
|
+
|
|
60
|
+
### 1. Title slide (Hook)
|
|
61
|
+
- One bold H1 with the actual claim, not "Introduction"
|
|
62
|
+
- One short framing paragraph (1–2 sentences)
|
|
63
|
+
- One callout with the *provocative* version of the thesis
|
|
64
|
+
- Optionally: inline-code keywords as a teaser
|
|
65
|
+
|
|
66
|
+
### 2. Question / Tension slide
|
|
67
|
+
- H1 phrased as a question or a contrarian statement (`🤔 의문: …` works well)
|
|
68
|
+
- **Two-column layout**: conventional wisdom on the left, reality/data on the right
|
|
69
|
+
- End with a callout that frames the actual problem
|
|
70
|
+
|
|
71
|
+
### 3. Mechanism / Diagram slide
|
|
72
|
+
- H1 names the mechanism
|
|
73
|
+
- 2–4 lines of prose explaining the *what*
|
|
74
|
+
- A Mermaid diagram (flowchart, sequence, or comparison)
|
|
75
|
+
- Optional callout for the takeaway
|
|
76
|
+
|
|
77
|
+
### 4. Comparison slide
|
|
78
|
+
- Either a **table** (when 3+ items, 2+ attributes) or **two-column callouts** (when comparing exactly 2 things)
|
|
79
|
+
- Use color coding: green for the "winning" side, red/orange for the losing side, never both neutral
|
|
80
|
+
|
|
81
|
+
### 5. Progressive disclosure slide
|
|
82
|
+
- H1 states the claim
|
|
83
|
+
- 2–4 toggles (`<details>`) — each one a sub-point with the *headline* visible and the *details* hidden
|
|
84
|
+
- This is great when you have a "3 reasons why X" structure and don't want to overwhelm the slide
|
|
85
|
+
|
|
86
|
+
### 6. Numbered breakdown slide ("the rule of three")
|
|
87
|
+
- H1 names the breakdown
|
|
88
|
+
- 3 sub-headers (`##`) with short prose under each
|
|
89
|
+
- Three is the magic number — two feels thin, four feels like a list
|
|
90
|
+
|
|
91
|
+
### 7. Code / protocol slide
|
|
92
|
+
- H1 names the artifact
|
|
93
|
+
- A short prose lead-in
|
|
94
|
+
- A code block (use the right language tag)
|
|
95
|
+
- A callout explaining what's notable about it
|
|
96
|
+
|
|
97
|
+
### 8. Summary slide
|
|
98
|
+
- H1 with a recap claim
|
|
99
|
+
- A checklist (`- [ ]`) of the things to remember / do
|
|
100
|
+
- One final callout with the single sentence the audience should leave with
|
|
101
|
+
|
|
102
|
+
## Notion block toolkit (when to use what)
|
|
103
|
+
|
|
104
|
+
Use the [enhanced markdown spec](notion://docs/enhanced-markdown-spec) for exact syntax. Key blocks and their best use:
|
|
105
|
+
|
|
106
|
+
- **Callout** (`<callout icon="…" color="…_bg">`): the single most important Notion block. Use 1–2 per slide to highlight the thesis, warning, or aha moment. Pick the icon and color deliberately:
|
|
107
|
+
- 💡 `blue_bg` — insight, tip
|
|
108
|
+
- ⚠️ `red_bg` — warning, anti-pattern
|
|
109
|
+
- 🎯 `yellow_bg` / `green_bg` — key claim, summary
|
|
110
|
+
- 📌 `gray_bg` — neutral note, aside
|
|
111
|
+
- 🔥 `orange_bg` — practical / hot tip
|
|
112
|
+
- **Columns** (`<columns><column>…</column>…</columns>`): use for compare/contrast. Two columns is ideal; three only if the items are very short.
|
|
113
|
+
- **Toggle** (`<details><summary>…</summary>…</details>`): use when you have a punchy headline and want to keep details available without cluttering the slide.
|
|
114
|
+
- **Mermaid** (` ```mermaid `): use for flow, sequence, state, comparison. Always wrap node labels with special characters in double quotes (`A["Notion (App)"]`). Use `<br>` for line breaks, not `\n`.
|
|
115
|
+
- **Tables**: use when you have ≥3 rows and ≥2 columns of structured data. With 1–2 rows, a callout or columns reads better.
|
|
116
|
+
- **Inline color** (`<span color="red">…</span>`): use very sparingly — usually for a single number or word per slide. Overuse kills the effect.
|
|
117
|
+
- **Inline code** (`` `text` ``): use for technical keywords, command names, API names. Adds visual texture and reads as "expert".
|
|
118
|
+
- **Checklist** (`- [ ]`): use on summary slides for "things to remember" or "things to avoid". The unchecked-box visual reads as "action items".
|
|
119
|
+
|
|
120
|
+
## Visual rhythm rules
|
|
121
|
+
|
|
122
|
+
These are the rules that separate a designer-quality deck from a "Claude made me a slide deck" deck:
|
|
123
|
+
|
|
124
|
+
1. **No two adjacent slides should use the same archetype.** If slide 3 is a two-column comparison, slide 4 shouldn't be. Vary the visual.
|
|
125
|
+
2. **Every slide should have at least one non-text block** (callout, diagram, table, columns, code). A slide that is only headings + paragraphs + bullets is a weak slide.
|
|
126
|
+
3. **Color is signal, not decoration.** Use the same color for the same meaning across the whole deck (e.g., red_bg always = warning; green_bg always = the answer). Don't randomly color callouts.
|
|
127
|
+
4. **One thesis per slide.** If you can't summarize the slide in a single sentence, it's two slides.
|
|
128
|
+
5. **Concrete numbers beat adjectives.** "Very fast" → "<1ms p99 latency". Every body slide should have at least one concrete data point if the topic allows it.
|
|
129
|
+
6. **Metaphors carry mechanism slides.** The Redis epoll = restaurant waiter analogy was load-bearing in the example deck. When explaining a mechanism, reach for a vivid concrete analogy and lay it out in a two-column callout.
|
|
130
|
+
7. **Whitespace is created with `<empty-block/>`**, but you almost never need it. Notion spaces blocks well by default — only add empty blocks inside columns or callouts where the rhythm feels too tight.
|
|
131
|
+
|
|
132
|
+
## Working with Notion via MCP
|
|
133
|
+
|
|
134
|
+
When the user provides a Notion URL:
|
|
135
|
+
|
|
136
|
+
1. **Fetch the page first** with `mcp__notion__notion-fetch` to see current content and confirm you have the right page.
|
|
137
|
+
2. **Read the enhanced markdown spec** if you haven't already in this session — fetch `notion://docs/enhanced-markdown-spec` via the MCP resource tool. Don't guess Notion-flavored markdown syntax; it has subtle differences from standard markdown (e.g., `<details>` not `<summary>` alone, tab indentation, escape rules).
|
|
138
|
+
3. **Use `replace_content`** (via `mcp__notion__notion-update-page`) for full deck rewrites. Use `update_content` with `content_updates` for targeted slide edits.
|
|
139
|
+
4. **Preserve child pages**: if the page has `<page>` or `<database>` blocks you want to keep, include them in the new content. `replace_content` will refuse to delete them unless you pass `allow_deleting_content: true`.
|
|
140
|
+
|
|
141
|
+
If the user gives you content but no URL, write the markdown directly and ask where to put it.
|
|
142
|
+
|
|
143
|
+
## Output checklist (run this before you finish)
|
|
144
|
+
|
|
145
|
+
Before declaring the deck done, mentally walk through it:
|
|
146
|
+
|
|
147
|
+
- [ ] Slide 1 has a real claim, not "Introduction" or "Agenda"
|
|
148
|
+
- [ ] The narrative arc is identifiable (Hook → Insight → Body → Summary at minimum)
|
|
149
|
+
- [ ] No two adjacent slides use the same archetype
|
|
150
|
+
- [ ] Every slide has at least one non-text block
|
|
151
|
+
- [ ] Callout colors are consistent in meaning across the deck
|
|
152
|
+
- [ ] At least one Mermaid diagram, one table or columns layout, and one callout in the deck
|
|
153
|
+
- [ ] The summary slide has actionable content, not just recap
|
|
154
|
+
- [ ] All Mermaid node labels with parens or special chars are double-quoted
|
|
155
|
+
- [ ] If presentation mode is the target: `---` between every slide, `#` as every slide title
|
|
156
|
+
|
|
157
|
+
If any of these fail, fix before handing off.
|
|
158
|
+
|
|
159
|
+
## Worked example (mini)
|
|
160
|
+
|
|
161
|
+
For deeper reference patterns, see `references/example-redis-deck.md` — a complete 10-slide deck on a technical topic that demonstrates every archetype above.
|
|
162
|
+
|
|
163
|
+
## Anti-patterns to avoid
|
|
164
|
+
|
|
165
|
+
- **Wall-of-bullets slides.** If a slide is just `- item` × 6, it failed. Convert to columns, table, toggles, or split into two slides.
|
|
166
|
+
- **Every slide has the same callout color.** That's not signal, it's wallpaper.
|
|
167
|
+
- **Title slides that say "Agenda" or "Overview".** Lead with the claim.
|
|
168
|
+
- **Mermaid diagrams with cramped labels.** If the label is >4 words, use `<br>` or rethink the diagram.
|
|
169
|
+
- **Code blocks with no surrounding context.** Always sandwich code between a setup line and a callout-style takeaway.
|
|
170
|
+
- **Forgetting the presentation mode rules.** A document with `##` titles and no `---` dividers does not work in presentation mode. Always use `#` + `---`.
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# Worked example: Redis singlethread deck (10 slides)
|
|
2
|
+
|
|
3
|
+
This is a reference deck demonstrating every archetype and block pattern from SKILL.md. Read it when you need a concrete model of what a "designer-grade" Notion presentation looks like end-to-end.
|
|
4
|
+
|
|
5
|
+
## Narrative arc used
|
|
6
|
+
|
|
7
|
+
| Slide | Phase | Archetype |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| 1 | Hook | Title (claim + callout teaser) |
|
|
10
|
+
| 2 | Problem | Question + two-column compare |
|
|
11
|
+
| 3 | Tension | Mechanism + Mermaid flowchart |
|
|
12
|
+
| 4 | Insight | Numbered breakdown via toggles |
|
|
13
|
+
| 5 | Body ① | Comparison (table + Mermaid) |
|
|
14
|
+
| 6 | Body ② | Mechanism + metaphor (two-column callouts) |
|
|
15
|
+
| 7 | Body ③+④ | Code / protocol |
|
|
16
|
+
| 8 | Body ⑤ | Mechanism + Mermaid sequence diagram |
|
|
17
|
+
| 9 | Nuance | Counter-argument with versioned bullets |
|
|
18
|
+
| 10 | Summary | Recap + checklist + final callout |
|
|
19
|
+
|
|
20
|
+
Notice the rhythm: no two adjacent slides share an archetype. Mermaid appears on slides 3, 5, 8 — spaced out, not back-to-back. Callouts appear on every slide but with different colors meaning different things (blue=insight, red=warning, green=answer, yellow=key claim, orange=practical tip).
|
|
21
|
+
|
|
22
|
+
## Full deck source
|
|
23
|
+
|
|
24
|
+
```markdown
|
|
25
|
+
# 싱글스레드 Redis가 수십만 QPS를 내는 아키텍처의 비밀
|
|
26
|
+
|
|
27
|
+
**발표 목적**: 멀티코어 서버 시대에 Redis가 '싱글스레드'를 선택한 의도와, 그럼에도 불구하고 압도적인 성능(수십만~수백만 QPS)을 유지하는 **5가지 구조적 비밀**을 아키텍트의 시각에서 파헤칩니다.
|
|
28
|
+
|
|
29
|
+
<callout icon="💡" color="blue_bg">
|
|
30
|
+
**싱글스레드니까 느리다?** 멀티코어가 무조건 빠르다는 편견을 깨는 Redis의 설계 철학
|
|
31
|
+
</callout>
|
|
32
|
+
|
|
33
|
+
키워드: `Single-Threaded` · `QPS(Queries Per Second)` · `Latency < 1ms`
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
# 🤔 의문: 8코어 서버에서 코어를 하나만 쓰면 7개는 노는 것 아닌가?
|
|
38
|
+
|
|
39
|
+
<columns>
|
|
40
|
+
<column>
|
|
41
|
+
## 일반적인 통념
|
|
42
|
+
멀티코어를 병렬로 활용해야 무조건 빠른 시스템이다? ❌
|
|
43
|
+
<empty-block/>
|
|
44
|
+
8코어 중 1코어만 사용 ➡️ **"비효율적이다?"**
|
|
45
|
+
</column>
|
|
46
|
+
<column>
|
|
47
|
+
## 실제 벤치마크 성능
|
|
48
|
+
**평균 응답 시간**: <span color="green">**1ms 이하**</span>
|
|
49
|
+
<empty-block/>
|
|
50
|
+
**파이프라인 활용 시**
|
|
51
|
+
- Set: <span color="green">**153만 QPS**</span>
|
|
52
|
+
- Get: <span color="green">**181만 QPS**</span>
|
|
53
|
+
</column>
|
|
54
|
+
</columns>
|
|
55
|
+
|
|
56
|
+
<callout icon="⚠️" color="red_bg">
|
|
57
|
+
Redis가 느려지는 대부분의 경우는 싱글스레드여서가 아니라, **무거운 연산(O(N))이나 너무 큰 데이터**를 조작할 때입니다.
|
|
58
|
+
</callout>
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
# ⚖️ 멀티스레드가 무조건 빠르지 않은 이유
|
|
63
|
+
|
|
64
|
+
- **공유 자원 경쟁 및 락(Lock) 비용**
|
|
65
|
+
- **컨텍스트 스위칭(Context Switching)**
|
|
66
|
+
- **CPU 캐시 일관성(Cache Coherence) 유지 비용**
|
|
67
|
+
|
|
68
|
+
```mermaid
|
|
69
|
+
graph TD
|
|
70
|
+
A["멀티스레드 환경"] --> B("공유 자원 접근")
|
|
71
|
+
B --> C["락 획득 경쟁/대기"]
|
|
72
|
+
B --> D["컨텍스트 스위칭 오버헤드"]
|
|
73
|
+
C --> F(("성능 선형 증가 저해"))
|
|
74
|
+
D --> F
|
|
75
|
+
style F fill:#ffcccc,stroke:#333,stroke-width:2px
|
|
76
|
+
```
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
(The deck continues for 10 slides total — see the actual Notion page if regenerating.)
|
|
80
|
+
|
|
81
|
+
## Why each pattern worked
|
|
82
|
+
|
|
83
|
+
- **Slide 1 callout** uses a question-as-claim ("싱글스레드니까 느리다?") instead of just stating the topic. This creates tension immediately.
|
|
84
|
+
- **Slide 2 columns** put conventional wisdom against real data side-by-side. The reader does the comparison instinctively.
|
|
85
|
+
- **Slide 3 Mermaid** uses convergence (multiple nodes → one) to visualize "all these costs add up". The styled end-node (`fill:#ffcccc`) acts as the punchline.
|
|
86
|
+
- **Slide 4 toggles** hide details so the slide reads as "3 reasons, expand for depth" — perfect for a live presentation where the speaker discusses what's hidden.
|
|
87
|
+
- **Slide 5 table** is used because there are 4 storage tiers × 3 attributes — too much for prose, just right for a table.
|
|
88
|
+
- **Slide 6 two-column callouts** carry the restaurant-waiter metaphor. The metaphor is the slide; the technical content sits inside the analogy.
|
|
89
|
+
- **Slide 10 checklist** uses `- [ ]` not `-` because unchecked boxes signal "things to do", which is exactly what the audience should leave with.
|
|
90
|
+
|
|
91
|
+
## What to copy
|
|
92
|
+
|
|
93
|
+
- The color discipline (red=warning, green=answer, blue=insight, yellow=claim, orange=tip)
|
|
94
|
+
- The archetype rotation (no two adjacent slides look alike)
|
|
95
|
+
- The use of metaphor on mechanism-heavy slides
|
|
96
|
+
- The Mermaid styling for emphasis (filled end-nodes act like a punctuation mark)
|
|
97
|
+
- The final callout that gives the audience one sentence to leave with
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: setup-matt-pocock-skills
|
|
3
|
+
description: Configure this repo for the engineering skills — set up its issue tracker, triage label vocabulary, and domain doc layout. Run once before first use of the other engineering skills.
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Setup Matt Pocock's Skills
|
|
8
|
+
|
|
9
|
+
Scaffold the per-repo configuration that the engineering skills assume:
|
|
10
|
+
|
|
11
|
+
- **Issue tracker** — where issues live (GitHub by default; local markdown is also supported out of the box)
|
|
12
|
+
- **Triage labels** — the strings used for the five canonical triage roles
|
|
13
|
+
- **Domain docs** — where `CONTEXT.md` and ADRs live, and the consumer rules for reading them
|
|
14
|
+
|
|
15
|
+
This is a prompt-driven skill, not a deterministic script. Explore, present what you found, confirm with the user, then write.
|
|
16
|
+
|
|
17
|
+
## Process
|
|
18
|
+
|
|
19
|
+
### 1. Explore
|
|
20
|
+
|
|
21
|
+
Look at the current repo to understand its starting state. Read whatever exists; don't assume:
|
|
22
|
+
|
|
23
|
+
- `git remote -v` and `.git/config` — is this a GitHub repo? Which one?
|
|
24
|
+
- `AGENTS.md` and `CLAUDE.md` at the repo root — does either exist? Is there already an `## Agent skills` section in either?
|
|
25
|
+
- `CONTEXT.md` and `CONTEXT-MAP.md` at the repo root
|
|
26
|
+
- `docs/adr/` and any `src/*/docs/adr/` directories
|
|
27
|
+
- `docs/agents/` — does this skill's prior output already exist?
|
|
28
|
+
- `.scratch/` — sign that a local-markdown issue tracker convention is already in use
|
|
29
|
+
|
|
30
|
+
### 2. Present findings and ask
|
|
31
|
+
|
|
32
|
+
Summarise what's present and what's missing. Then walk the user through the three decisions **one at a time** — present a section, get the user's answer, then move to the next. Don't dump all three at once.
|
|
33
|
+
|
|
34
|
+
Assume the user does not know what these terms mean. Each section starts with a short explainer (what it is, why these skills need it, what changes if they pick differently). Then show the choices and the default.
|
|
35
|
+
|
|
36
|
+
**Section A — Issue tracker.**
|
|
37
|
+
|
|
38
|
+
> Explainer: The "issue tracker" is where issues live for this repo. Skills like `to-issues`, `triage`, `to-prd`, and `qa` read from and write to it — they need to know whether to call `gh issue create`, write a markdown file under `.scratch/`, or follow some other workflow you describe. Pick the place you actually track work for this repo.
|
|
39
|
+
|
|
40
|
+
Default posture: these skills were designed for GitHub. If a `git remote` points at GitHub, propose that. If a `git remote` points at GitLab (`gitlab.com` or a self-hosted host), propose GitLab. Otherwise (or if the user prefers), offer:
|
|
41
|
+
|
|
42
|
+
- **GitHub** — issues live in the repo's GitHub Issues (uses the `gh` CLI)
|
|
43
|
+
- **GitLab** — issues live in the repo's GitLab Issues (uses the [`glab`](https://gitlab.com/gitlab-org/cli) CLI)
|
|
44
|
+
- **Local markdown** — issues live as files under `.scratch/<feature>/` in this repo (good for solo projects or repos without a remote)
|
|
45
|
+
- **Other** (Jira, Linear, etc.) — ask the user to describe the workflow in one paragraph; the skill will record it as freeform prose
|
|
46
|
+
|
|
47
|
+
If — and only if — the user picked **GitHub** or **GitLab**, ask one follow-up:
|
|
48
|
+
|
|
49
|
+
> Explainer: Open-source repos often receive feature requests as pull requests, not just issues — a PR is an issue with attached code. If you turn this on, `/triage` pulls *external* PRs into the same queue and runs them through the same labels and states as issues (collaborators' in-flight PRs are left alone). Leave it off if PRs aren't a request surface for you.
|
|
50
|
+
|
|
51
|
+
- **PRs as a request surface** — yes / no (default: no). Record the answer in `docs/agents/issue-tracker.md`. For local-markdown and other trackers, skip this question — there are no PRs.
|
|
52
|
+
|
|
53
|
+
**Section B — Triage label vocabulary.**
|
|
54
|
+
|
|
55
|
+
> Explainer: When the `triage` skill processes an incoming issue, it moves it through a state machine — needs evaluation, waiting on reporter, ready for an AFK agent to pick up, ready for a human, or won't fix. To do that, it needs to apply labels (or the equivalent in your issue tracker) that match strings *you've actually configured*. If your repo already uses different label names (e.g. `bug:triage` instead of `needs-triage`), map them here so the skill applies the right ones instead of creating duplicates.
|
|
56
|
+
|
|
57
|
+
The five canonical roles:
|
|
58
|
+
|
|
59
|
+
- `needs-triage` — maintainer needs to evaluate
|
|
60
|
+
- `needs-info` — waiting on reporter
|
|
61
|
+
- `ready-for-agent` — fully specified, AFK-ready (an agent can pick it up with no human context)
|
|
62
|
+
- `ready-for-human` — needs human implementation
|
|
63
|
+
- `wontfix` — will not be actioned
|
|
64
|
+
|
|
65
|
+
Default: each role's string equals its name. Ask the user if they want to override any. If their issue tracker has no existing labels, the defaults are fine.
|
|
66
|
+
|
|
67
|
+
**Section C — Domain docs.**
|
|
68
|
+
|
|
69
|
+
> Explainer: Some skills (`improve-codebase-architecture`, `diagnosing-bugs`, `tdd`) read a `CONTEXT.md` file to learn the project's domain language, and `docs/adr/` for past architectural decisions. They need to know whether the repo has one global context or multiple (e.g. a monorepo with separate frontend/backend contexts) so they look in the right place.
|
|
70
|
+
|
|
71
|
+
Confirm the layout:
|
|
72
|
+
|
|
73
|
+
- **Single-context** — one `CONTEXT.md` + `docs/adr/` at the repo root. Most repos are this.
|
|
74
|
+
- **Multi-context** — `CONTEXT-MAP.md` at the root pointing to per-context `CONTEXT.md` files (typically a monorepo).
|
|
75
|
+
|
|
76
|
+
### 3. Confirm and edit
|
|
77
|
+
|
|
78
|
+
Show the user a draft of:
|
|
79
|
+
|
|
80
|
+
- The `## Agent skills` block to add to whichever of `CLAUDE.md` / `AGENTS.md` is being edited (see step 4 for selection rules)
|
|
81
|
+
- The contents of `docs/agents/issue-tracker.md`, `docs/agents/triage-labels.md`, `docs/agents/domain.md`
|
|
82
|
+
|
|
83
|
+
Let them edit before writing.
|
|
84
|
+
|
|
85
|
+
### 4. Write
|
|
86
|
+
|
|
87
|
+
**Pick the file to edit:**
|
|
88
|
+
|
|
89
|
+
- If `CLAUDE.md` exists, edit it.
|
|
90
|
+
- Else if `AGENTS.md` exists, edit it.
|
|
91
|
+
- If neither exists, ask the user which one to create — don't pick for them.
|
|
92
|
+
|
|
93
|
+
Never create `AGENTS.md` when `CLAUDE.md` already exists (or vice versa) — always edit the one that's already there.
|
|
94
|
+
|
|
95
|
+
If an `## Agent skills` block already exists in the chosen file, update its contents in-place rather than appending a duplicate. Don't overwrite user edits to the surrounding sections.
|
|
96
|
+
|
|
97
|
+
The block:
|
|
98
|
+
|
|
99
|
+
```markdown
|
|
100
|
+
## Agent skills
|
|
101
|
+
|
|
102
|
+
### Issue tracker
|
|
103
|
+
|
|
104
|
+
[one-line summary of where issues are tracked, plus whether external PRs are a triage surface]. See `docs/agents/issue-tracker.md`.
|
|
105
|
+
|
|
106
|
+
### Triage labels
|
|
107
|
+
|
|
108
|
+
[one-line summary of the label vocabulary]. See `docs/agents/triage-labels.md`.
|
|
109
|
+
|
|
110
|
+
### Domain docs
|
|
111
|
+
|
|
112
|
+
[one-line summary of layout — "single-context" or "multi-context"]. See `docs/agents/domain.md`.
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Then write the three docs files using the seed templates in this skill folder as a starting point:
|
|
116
|
+
|
|
117
|
+
- [issue-tracker-github.md](./issue-tracker-github.md) — GitHub issue tracker
|
|
118
|
+
- [issue-tracker-gitlab.md](./issue-tracker-gitlab.md) — GitLab issue tracker
|
|
119
|
+
- [issue-tracker-local.md](./issue-tracker-local.md) — local-markdown issue tracker
|
|
120
|
+
- [triage-labels.md](./triage-labels.md) — label mapping
|
|
121
|
+
- [domain.md](./domain.md) — domain doc consumer rules + layout
|
|
122
|
+
|
|
123
|
+
For "other" issue trackers, write `docs/agents/issue-tracker.md` from scratch using the user's description.
|
|
124
|
+
|
|
125
|
+
### 5. Done
|
|
126
|
+
|
|
127
|
+
Tell the user the setup is complete and which engineering skills will now read from these files. Mention they can edit `docs/agents/*.md` directly later — re-running this skill is only necessary if they want to switch issue trackers or restart from scratch.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Domain Docs
|
|
2
|
+
|
|
3
|
+
How the engineering skills should consume this repo's domain documentation when exploring the codebase.
|
|
4
|
+
|
|
5
|
+
## Before exploring, read these
|
|
6
|
+
|
|
7
|
+
- **`CONTEXT.md`** at the repo root, or
|
|
8
|
+
- **`CONTEXT-MAP.md`** at the repo root if it exists — it points at one `CONTEXT.md` per context. Read each one relevant to the topic.
|
|
9
|
+
- **`docs/adr/`** — read ADRs that touch the area you're about to work in. In multi-context repos, also check `src/<context>/docs/adr/` for context-scoped decisions.
|
|
10
|
+
|
|
11
|
+
If any of these files don't exist, **proceed silently**. Don't flag their absence; don't suggest creating them upfront. The `/domain-modeling` skill (reached via `/grill-with-docs` and `/improve-codebase-architecture`) creates them lazily when terms or decisions actually get resolved.
|
|
12
|
+
|
|
13
|
+
## File structure
|
|
14
|
+
|
|
15
|
+
Single-context repo (most repos):
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
/
|
|
19
|
+
├── CONTEXT.md
|
|
20
|
+
├── docs/adr/
|
|
21
|
+
│ ├── 0001-event-sourced-orders.md
|
|
22
|
+
│ └── 0002-postgres-for-write-model.md
|
|
23
|
+
└── src/
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Multi-context repo (presence of `CONTEXT-MAP.md` at the root):
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
/
|
|
30
|
+
├── CONTEXT-MAP.md
|
|
31
|
+
├── docs/adr/ ← system-wide decisions
|
|
32
|
+
└── src/
|
|
33
|
+
├── ordering/
|
|
34
|
+
│ ├── CONTEXT.md
|
|
35
|
+
│ └── docs/adr/ ← context-specific decisions
|
|
36
|
+
└── billing/
|
|
37
|
+
├── CONTEXT.md
|
|
38
|
+
└── docs/adr/
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Use the glossary's vocabulary
|
|
42
|
+
|
|
43
|
+
When your output names a domain concept (in an issue title, a refactor proposal, a hypothesis, a test name), use the term as defined in `CONTEXT.md`. Don't drift to synonyms the glossary explicitly avoids.
|
|
44
|
+
|
|
45
|
+
If the concept you need isn't in the glossary yet, that's a signal — either you're inventing language the project doesn't use (reconsider) or there's a real gap (note it for `/domain-modeling`).
|
|
46
|
+
|
|
47
|
+
## Flag ADR conflicts
|
|
48
|
+
|
|
49
|
+
If your output contradicts an existing ADR, surface it explicitly rather than silently overriding:
|
|
50
|
+
|
|
51
|
+
> _Contradicts ADR-0007 (event-sourced orders) — but worth reopening because…_
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Issue tracker: GitHub
|
|
2
|
+
|
|
3
|
+
Issues and PRDs for this repo live as GitHub issues. Use the `gh` CLI for all operations.
|
|
4
|
+
|
|
5
|
+
## Conventions
|
|
6
|
+
|
|
7
|
+
- **Create an issue**: `gh issue create --title "..." --body "..."`. Use a heredoc for multi-line bodies.
|
|
8
|
+
- **Read an issue**: `gh issue view <number> --comments`, filtering comments by `jq` and also fetching labels.
|
|
9
|
+
- **List issues**: `gh issue list --state open --json number,title,body,labels,comments --jq '[.[] | {number, title, body, labels: [.labels[].name], comments: [.comments[].body]}]'` with appropriate `--label` and `--state` filters.
|
|
10
|
+
- **Comment on an issue**: `gh issue comment <number> --body "..."`
|
|
11
|
+
- **Apply / remove labels**: `gh issue edit <number> --add-label "..."` / `--remove-label "..."`
|
|
12
|
+
- **Close**: `gh issue close <number> --comment "..."`
|
|
13
|
+
|
|
14
|
+
Infer the repo from `git remote -v` — `gh` does this automatically when run inside a clone.
|
|
15
|
+
|
|
16
|
+
## Pull requests as a triage surface
|
|
17
|
+
|
|
18
|
+
**PRs as a request surface: no.** _(Set to `yes` if this repo treats external PRs as feature requests; `/triage` reads this flag.)_
|
|
19
|
+
|
|
20
|
+
When set to `yes`, PRs run through the same labels and states as issues, using the `gh pr` equivalents:
|
|
21
|
+
|
|
22
|
+
- **Read a PR**: `gh pr view <number> --comments` and `gh pr diff <number>` for the diff.
|
|
23
|
+
- **List external PRs for triage**: `gh pr list --state open --json number,title,body,labels,author,authorAssociation,comments` then keep only `authorAssociation` of `CONTRIBUTOR`, `FIRST_TIME_CONTRIBUTOR`, or `NONE` (drop `OWNER`/`MEMBER`/`COLLABORATOR`).
|
|
24
|
+
- **Comment / label / close**: `gh pr comment`, `gh pr edit --add-label`/`--remove-label`, `gh pr close`.
|
|
25
|
+
|
|
26
|
+
GitHub shares one number space across issues and PRs, so a bare `#42` may be either — resolve with `gh pr view 42` and fall back to `gh issue view 42`.
|
|
27
|
+
|
|
28
|
+
## When a skill says "publish to the issue tracker"
|
|
29
|
+
|
|
30
|
+
Create a GitHub issue.
|
|
31
|
+
|
|
32
|
+
## When a skill says "fetch the relevant ticket"
|
|
33
|
+
|
|
34
|
+
Run `gh issue view <number> --comments`.
|