brunovskyoliver 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 +50 -0
- package/bin/install-skills.mjs +191 -0
- package/package.json +18 -0
- package/skills/deprecated/README.md +8 -0
- package/skills/deprecated/design-an-interface/SKILL.md +94 -0
- package/skills/deprecated/qa/SKILL.md +130 -0
- package/skills/deprecated/request-refactor-plan/SKILL.md +68 -0
- package/skills/deprecated/ubiquitous-language/SKILL.md +93 -0
- package/skills/design/frontend-design/LICENSE.txt +177 -0
- package/skills/design/frontend-design/SKILL.md +42 -0
- package/skills/design/ui-ux-pro-max/SKILL.md +674 -0
- package/skills/design/ui-ux-pro-max/data/_sync_all.py +414 -0
- package/skills/design/ui-ux-pro-max/data/app-interface.csv +31 -0
- package/skills/design/ui-ux-pro-max/data/charts.csv +26 -0
- package/skills/design/ui-ux-pro-max/data/colors.csv +162 -0
- package/skills/design/ui-ux-pro-max/data/design.csv +1776 -0
- package/skills/design/ui-ux-pro-max/data/draft.csv +1779 -0
- package/skills/design/ui-ux-pro-max/data/google-fonts.csv +1924 -0
- package/skills/design/ui-ux-pro-max/data/icons.csv +106 -0
- package/skills/design/ui-ux-pro-max/data/landing.csv +35 -0
- package/skills/design/ui-ux-pro-max/data/products.csv +162 -0
- package/skills/design/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/skills/design/ui-ux-pro-max/data/stacks/angular.csv +51 -0
- package/skills/design/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/skills/design/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/skills/design/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/skills/design/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/skills/design/ui-ux-pro-max/data/stacks/laravel.csv +51 -0
- package/skills/design/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/skills/design/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/skills/design/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/skills/design/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/skills/design/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/skills/design/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/skills/design/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/skills/design/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/skills/design/ui-ux-pro-max/data/stacks/threejs.csv +54 -0
- package/skills/design/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/skills/design/ui-ux-pro-max/data/styles.csv +85 -0
- package/skills/design/ui-ux-pro-max/data/typography.csv +74 -0
- package/skills/design/ui-ux-pro-max/data/ui-reasoning.csv +162 -0
- package/skills/design/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/skills/design/ui-ux-pro-max/scripts/core.py +262 -0
- package/skills/design/ui-ux-pro-max/scripts/design_system.py +1148 -0
- package/skills/design/ui-ux-pro-max/scripts/search.py +114 -0
- package/skills/engineering/README.md +25 -0
- package/skills/engineering/ask-matt/SKILL.md +61 -0
- package/skills/engineering/codebase-design/DEEPENING.md +37 -0
- package/skills/engineering/codebase-design/DESIGN-IT-TWICE.md +44 -0
- package/skills/engineering/codebase-design/SKILL.md +114 -0
- package/skills/engineering/diagnosing-bugs/SKILL.md +134 -0
- package/skills/engineering/diagnosing-bugs/scripts/hitl-loop.template.sh +41 -0
- package/skills/engineering/domain-modeling/ADR-FORMAT.md +47 -0
- package/skills/engineering/domain-modeling/CONTEXT-FORMAT.md +60 -0
- package/skills/engineering/domain-modeling/SKILL.md +74 -0
- package/skills/engineering/grill-with-docs/SKILL.md +7 -0
- package/skills/engineering/implement/SKILL.md +15 -0
- package/skills/engineering/improve-codebase-architecture/HTML-REPORT.md +123 -0
- package/skills/engineering/improve-codebase-architecture/SKILL.md +66 -0
- package/skills/engineering/prototype/LOGIC.md +79 -0
- package/skills/engineering/prototype/SKILL.md +31 -0
- package/skills/engineering/prototype/UI.md +112 -0
- package/skills/engineering/resolving-merge-conflicts/SKILL.md +14 -0
- package/skills/engineering/setup-matt-pocock-skills/SKILL.md +127 -0
- package/skills/engineering/setup-matt-pocock-skills/domain.md +51 -0
- package/skills/engineering/setup-matt-pocock-skills/issue-tracker-github.md +34 -0
- package/skills/engineering/setup-matt-pocock-skills/issue-tracker-gitlab.md +35 -0
- package/skills/engineering/setup-matt-pocock-skills/issue-tracker-local.md +21 -0
- package/skills/engineering/setup-matt-pocock-skills/triage-labels.md +15 -0
- package/skills/engineering/tdd/SKILL.md +108 -0
- package/skills/engineering/tdd/mocking.md +59 -0
- package/skills/engineering/tdd/refactoring.md +10 -0
- package/skills/engineering/tdd/tests.md +61 -0
- package/skills/engineering/to-issues/SKILL.md +98 -0
- package/skills/engineering/to-prd/SKILL.md +75 -0
- package/skills/engineering/triage/AGENT-BRIEF.md +207 -0
- package/skills/engineering/triage/OUT-OF-SCOPE.md +105 -0
- package/skills/engineering/triage/SKILL.md +112 -0
- package/skills/in-progress/README.md +10 -0
- package/skills/in-progress/decision-mapping/SKILL.md +84 -0
- package/skills/in-progress/loop-me/SKILL.md +32 -0
- package/skills/in-progress/review/SKILL.md +69 -0
- package/skills/in-progress/writing-beats/SKILL.md +67 -0
- package/skills/in-progress/writing-fragments/SKILL.md +79 -0
- package/skills/in-progress/writing-shape/SKILL.md +79 -0
- package/skills/misc/README.md +8 -0
- package/skills/misc/git-guardrails-claude-code/SKILL.md +95 -0
- package/skills/misc/git-guardrails-claude-code/scripts/block-dangerous-git.sh +25 -0
- package/skills/misc/migrate-to-shoehorn/SKILL.md +118 -0
- package/skills/misc/ralph/SKILL.md +83 -0
- package/skills/misc/ralph/references/default-prompt.md +22 -0
- package/skills/misc/ralph/scripts/afk.sh +41 -0
- package/skills/misc/scaffold-exercises/SKILL.md +106 -0
- package/skills/misc/setup-pre-commit/SKILL.md +91 -0
- package/skills/personal/README.md +6 -0
- package/skills/personal/edit-article/SKILL.md +15 -0
- package/skills/personal/obsidian-vault/SKILL.md +59 -0
- package/skills/productivity/README.md +18 -0
- package/skills/productivity/grill-me/SKILL.md +7 -0
- package/skills/productivity/grilling/SKILL.md +10 -0
- package/skills/productivity/handoff/SKILL.md +16 -0
- package/skills/productivity/teach/GLOSSARY-FORMAT.md +35 -0
- package/skills/productivity/teach/LEARNING-RECORD-FORMAT.md +46 -0
- package/skills/productivity/teach/MISSION-FORMAT.md +31 -0
- package/skills/productivity/teach/RESOURCES-FORMAT.md +32 -0
- package/skills/productivity/teach/SKILL.md +140 -0
- package/skills/productivity/writing-great-skills/GLOSSARY.md +195 -0
- package/skills/productivity/writing-great-skills/SKILL.md +82 -0
package/README.md
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# brunovskyoliver skills
|
|
2
|
+
|
|
3
|
+
Personal agent skill bundle installable with the `skills` CLI.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
Preferred install through the `skills` CLI:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npx skills@latest add brunovskyoliver/skills --all -g --copy
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Install only for Codex and Claude Code:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npx skills@latest add brunovskyoliver/skills -g --agent codex claude-code --skill '*' --copy -y
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Git-free install
|
|
20
|
+
|
|
21
|
+
If Git is not installed, use the npm package installer instead. This works on macOS,
|
|
22
|
+
Windows, and Linux with Node/npm only:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npx brunovskyoliver@latest
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Install only for Codex and Claude Code:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
npx brunovskyoliver@latest --agent codex claude
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Replace existing installed skills:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
npx brunovskyoliver@latest --force
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## List available skills
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
npx skills@latest add brunovskyoliver/skills --list --full-depth
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
With the Git-free installer:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
npx brunovskyoliver@latest --list
|
|
50
|
+
```
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import fs from "node:fs/promises";
|
|
4
|
+
import os from "node:os";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { fileURLToPath } from "node:url";
|
|
7
|
+
|
|
8
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
const packageRoot = path.resolve(__dirname, "..");
|
|
10
|
+
const bundledSkillsRoot = path.join(packageRoot, "skills");
|
|
11
|
+
|
|
12
|
+
const args = process.argv.slice(2);
|
|
13
|
+
|
|
14
|
+
function has(flag) {
|
|
15
|
+
return args.includes(flag);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function valuesAfter(flag) {
|
|
19
|
+
const index = args.indexOf(flag);
|
|
20
|
+
if (index === -1) return [];
|
|
21
|
+
|
|
22
|
+
const values = [];
|
|
23
|
+
for (let i = index + 1; i < args.length; i += 1) {
|
|
24
|
+
if (args[i].startsWith("-")) break;
|
|
25
|
+
values.push(args[i]);
|
|
26
|
+
}
|
|
27
|
+
return values;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function usage() {
|
|
31
|
+
console.log(`brunovskyoliver skill installer
|
|
32
|
+
|
|
33
|
+
Usage:
|
|
34
|
+
npx brunovskyoliver@latest [options]
|
|
35
|
+
|
|
36
|
+
Options:
|
|
37
|
+
--agent <agents...> universal, codex, claude, or all
|
|
38
|
+
--skill <skills...> Skill names to install. Defaults to all.
|
|
39
|
+
--force Replace existing skill directories.
|
|
40
|
+
--list List bundled skills without installing.
|
|
41
|
+
--dry-run Show what would be installed.
|
|
42
|
+
--help Show this help.
|
|
43
|
+
|
|
44
|
+
Examples:
|
|
45
|
+
npx brunovskyoliver@latest
|
|
46
|
+
npx brunovskyoliver@latest --agent codex claude
|
|
47
|
+
npx brunovskyoliver@latest --skill ralph to-prd to-issues --force
|
|
48
|
+
`);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async function exists(filePath) {
|
|
52
|
+
try {
|
|
53
|
+
await fs.access(filePath);
|
|
54
|
+
return true;
|
|
55
|
+
} catch {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
async function findSkills(dir) {
|
|
61
|
+
const found = [];
|
|
62
|
+
|
|
63
|
+
async function walk(current) {
|
|
64
|
+
const entries = await fs.readdir(current, { withFileTypes: true });
|
|
65
|
+
|
|
66
|
+
if (entries.some((entry) => entry.isFile() && entry.name === "SKILL.md")) {
|
|
67
|
+
found.push({
|
|
68
|
+
name: path.basename(current),
|
|
69
|
+
source: current,
|
|
70
|
+
});
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
for (const entry of entries) {
|
|
75
|
+
if (!entry.isDirectory()) continue;
|
|
76
|
+
if (entry.name === "node_modules" || entry.name === ".git") continue;
|
|
77
|
+
await walk(path.join(current, entry.name));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
await walk(dir);
|
|
82
|
+
return found.sort((a, b) => a.name.localeCompare(b.name));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function selectedTargets() {
|
|
86
|
+
const home = os.homedir();
|
|
87
|
+
const agents = valuesAfter("--agent");
|
|
88
|
+
const requested = agents.length > 0 ? agents : ["universal", "codex", "claude"];
|
|
89
|
+
const normalized = new Set(requested.map((agent) => agent.toLowerCase()));
|
|
90
|
+
|
|
91
|
+
if (normalized.has("all")) {
|
|
92
|
+
normalized.add("universal");
|
|
93
|
+
normalized.add("codex");
|
|
94
|
+
normalized.add("claude");
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const targets = [];
|
|
98
|
+
|
|
99
|
+
if (normalized.has("universal") || normalized.has("agents")) {
|
|
100
|
+
targets.push({
|
|
101
|
+
name: "universal",
|
|
102
|
+
root: path.join(home, ".agents", "skills"),
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if (normalized.has("codex")) {
|
|
107
|
+
targets.push({
|
|
108
|
+
name: "codex",
|
|
109
|
+
root: path.join(process.env.CODEX_HOME || path.join(home, ".codex"), "skills"),
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (normalized.has("claude") || normalized.has("claude-code")) {
|
|
114
|
+
targets.push({
|
|
115
|
+
name: "claude",
|
|
116
|
+
root: path.join(process.env.CLAUDE_CONFIG_DIR || path.join(home, ".claude"), "skills"),
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
if (targets.length === 0) {
|
|
121
|
+
throw new Error(`No supported agents selected: ${requested.join(", ")}`);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return targets;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
async function main() {
|
|
128
|
+
if (has("--help") || has("-h")) {
|
|
129
|
+
usage();
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const skills = await findSkills(bundledSkillsRoot);
|
|
134
|
+
const requestedSkills = valuesAfter("--skill");
|
|
135
|
+
const requestedSet = new Set(requestedSkills);
|
|
136
|
+
const selectedSkills = requestedSkills.length === 0 || requestedSet.has("*")
|
|
137
|
+
? skills
|
|
138
|
+
: skills.filter((skill) => requestedSet.has(skill.name));
|
|
139
|
+
|
|
140
|
+
if (has("--list")) {
|
|
141
|
+
for (const skill of skills) console.log(skill.name);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const missing = requestedSkills.filter((name) => name !== "*" && !skills.some((skill) => skill.name === name));
|
|
146
|
+
if (missing.length > 0) {
|
|
147
|
+
throw new Error(`Unknown skill(s): ${missing.join(", ")}`);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const targets = selectedTargets();
|
|
151
|
+
const force = has("--force");
|
|
152
|
+
const dryRun = has("--dry-run");
|
|
153
|
+
let installed = 0;
|
|
154
|
+
let skipped = 0;
|
|
155
|
+
|
|
156
|
+
for (const target of targets) {
|
|
157
|
+
await fs.mkdir(target.root, { recursive: true });
|
|
158
|
+
|
|
159
|
+
for (const skill of selectedSkills) {
|
|
160
|
+
const destination = path.join(target.root, skill.name);
|
|
161
|
+
|
|
162
|
+
if (await exists(destination)) {
|
|
163
|
+
if (!force) {
|
|
164
|
+
console.log(`skip ${target.name}:${skill.name} already exists`);
|
|
165
|
+
skipped += 1;
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
if (!dryRun) await fs.rm(destination, { recursive: true, force: true });
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
if (dryRun) {
|
|
173
|
+
console.log(`install ${target.name}:${skill.name} -> ${destination}`);
|
|
174
|
+
} else {
|
|
175
|
+
await fs.cp(skill.source, destination, { recursive: true });
|
|
176
|
+
console.log(`installed ${target.name}:${skill.name} -> ${destination}`);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
installed += 1;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const action = dryRun ? "Would install" : "Installed";
|
|
184
|
+
console.log(`${action} ${installed} skill target(s), skipped ${skipped}.`);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
main().catch((error) => {
|
|
188
|
+
console.error(error.message);
|
|
189
|
+
process.exitCode = 1;
|
|
190
|
+
});
|
|
191
|
+
|
package/package.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "brunovskyoliver",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Personal agent skill bundle for the skills CLI",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"brunovskyoliver": "./bin/install-skills.mjs"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"bin",
|
|
11
|
+
"skills",
|
|
12
|
+
"README.md"
|
|
13
|
+
],
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "git+https://github.com/brunovskyoliver/skills.git"
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Deprecated
|
|
2
|
+
|
|
3
|
+
Skills I no longer use.
|
|
4
|
+
|
|
5
|
+
- **[design-an-interface](./design-an-interface/SKILL.md)** — Generate multiple radically different interface designs for a module using parallel sub-agents.
|
|
6
|
+
- **[qa](./qa/SKILL.md)** — Interactive QA session where user reports bugs conversationally and the agent files GitHub issues.
|
|
7
|
+
- **[request-refactor-plan](./request-refactor-plan/SKILL.md)** — Create a detailed refactor plan with tiny commits via user interview, then file it as a GitHub issue.
|
|
8
|
+
- **[ubiquitous-language](./ubiquitous-language/SKILL.md)** — Extract a DDD-style ubiquitous language glossary from the current conversation.
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: design-an-interface
|
|
3
|
+
description: Generate multiple radically different interface designs for a module using parallel sub-agents. Use when user wants to design an API, explore interface options, compare module shapes, or mentions "design it twice".
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Design an Interface
|
|
7
|
+
|
|
8
|
+
Based on "Design It Twice" from "A Philosophy of Software Design": your first idea is unlikely to be the best. Generate multiple radically different designs, then compare.
|
|
9
|
+
|
|
10
|
+
## Workflow
|
|
11
|
+
|
|
12
|
+
### 1. Gather Requirements
|
|
13
|
+
|
|
14
|
+
Before designing, understand:
|
|
15
|
+
|
|
16
|
+
- [ ] What problem does this module solve?
|
|
17
|
+
- [ ] Who are the callers? (other modules, external users, tests)
|
|
18
|
+
- [ ] What are the key operations?
|
|
19
|
+
- [ ] Any constraints? (performance, compatibility, existing patterns)
|
|
20
|
+
- [ ] What should be hidden inside vs exposed?
|
|
21
|
+
|
|
22
|
+
Ask: "What does this module need to do? Who will use it?"
|
|
23
|
+
|
|
24
|
+
### 2. Generate Designs (Parallel Sub-Agents)
|
|
25
|
+
|
|
26
|
+
Spawn 3+ sub-agents simultaneously using Task tool. Each must produce a **radically different** approach.
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
Prompt template for each sub-agent:
|
|
30
|
+
|
|
31
|
+
Design an interface for: [module description]
|
|
32
|
+
|
|
33
|
+
Requirements: [gathered requirements]
|
|
34
|
+
|
|
35
|
+
Constraints for this design: [assign a different constraint to each agent]
|
|
36
|
+
- Agent 1: "Minimize method count - aim for 1-3 methods max"
|
|
37
|
+
- Agent 2: "Maximize flexibility - support many use cases"
|
|
38
|
+
- Agent 3: "Optimize for the most common case"
|
|
39
|
+
- Agent 4: "Take inspiration from [specific paradigm/library]"
|
|
40
|
+
|
|
41
|
+
Output format:
|
|
42
|
+
1. Interface signature (types/methods)
|
|
43
|
+
2. Usage example (how caller uses it)
|
|
44
|
+
3. What this design hides internally
|
|
45
|
+
4. Trade-offs of this approach
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### 3. Present Designs
|
|
49
|
+
|
|
50
|
+
Show each design with:
|
|
51
|
+
|
|
52
|
+
1. **Interface signature** - types, methods, params
|
|
53
|
+
2. **Usage examples** - how callers actually use it in practice
|
|
54
|
+
3. **What it hides** - complexity kept internal
|
|
55
|
+
|
|
56
|
+
Present designs sequentially so user can absorb each approach before comparison.
|
|
57
|
+
|
|
58
|
+
### 4. Compare Designs
|
|
59
|
+
|
|
60
|
+
After showing all designs, compare them on:
|
|
61
|
+
|
|
62
|
+
- **Interface simplicity**: fewer methods, simpler params
|
|
63
|
+
- **General-purpose vs specialized**: flexibility vs focus
|
|
64
|
+
- **Implementation efficiency**: does shape allow efficient internals?
|
|
65
|
+
- **Depth**: small interface hiding significant complexity (good) vs large interface with thin implementation (bad)
|
|
66
|
+
- **Ease of correct use** vs **ease of misuse**
|
|
67
|
+
|
|
68
|
+
Discuss trade-offs in prose, not tables. Highlight where designs diverge most.
|
|
69
|
+
|
|
70
|
+
### 5. Synthesize
|
|
71
|
+
|
|
72
|
+
Often the best design combines insights from multiple options. Ask:
|
|
73
|
+
|
|
74
|
+
- "Which design best fits your primary use case?"
|
|
75
|
+
- "Any elements from other designs worth incorporating?"
|
|
76
|
+
|
|
77
|
+
## Evaluation Criteria
|
|
78
|
+
|
|
79
|
+
From "A Philosophy of Software Design":
|
|
80
|
+
|
|
81
|
+
**Interface simplicity**: Fewer methods, simpler params = easier to learn and use correctly.
|
|
82
|
+
|
|
83
|
+
**General-purpose**: Can handle future use cases without changes. But beware over-generalization.
|
|
84
|
+
|
|
85
|
+
**Implementation efficiency**: Does interface shape allow efficient implementation? Or force awkward internals?
|
|
86
|
+
|
|
87
|
+
**Depth**: Small interface hiding significant complexity = deep module (good). Large interface with thin implementation = shallow module (avoid).
|
|
88
|
+
|
|
89
|
+
## Anti-Patterns
|
|
90
|
+
|
|
91
|
+
- Don't let sub-agents produce similar designs - enforce radical difference
|
|
92
|
+
- Don't skip comparison - the value is in contrast
|
|
93
|
+
- Don't implement - this is purely about interface shape
|
|
94
|
+
- Don't evaluate based on implementation effort
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: qa
|
|
3
|
+
description: Interactive QA session where user reports bugs or issues conversationally, and the agent files GitHub issues. Explores the codebase in the background for context and domain language. Use when user wants to report bugs, do QA, file issues conversationally, or mentions "QA session".
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# QA Session
|
|
7
|
+
|
|
8
|
+
Run an interactive QA session. The user describes problems they're encountering. You clarify, explore the codebase for context, and file GitHub issues that are durable, user-focused, and use the project's domain language.
|
|
9
|
+
|
|
10
|
+
## For each issue the user raises
|
|
11
|
+
|
|
12
|
+
### 1. Listen and lightly clarify
|
|
13
|
+
|
|
14
|
+
Let the user describe the problem in their own words. Ask **at most 2-3 short clarifying questions** focused on:
|
|
15
|
+
|
|
16
|
+
- What they expected vs what actually happened
|
|
17
|
+
- Steps to reproduce (if not obvious)
|
|
18
|
+
- Whether it's consistent or intermittent
|
|
19
|
+
|
|
20
|
+
Do NOT over-interview. If the description is clear enough to file, move on.
|
|
21
|
+
|
|
22
|
+
### 2. Explore the codebase in the background
|
|
23
|
+
|
|
24
|
+
While talking to the user, kick off an Agent (subagent_type=Explore) in the background to understand the relevant area. The goal is NOT to find a fix — it's to:
|
|
25
|
+
|
|
26
|
+
- Learn the domain language used in that area (check UBIQUITOUS_LANGUAGE.md)
|
|
27
|
+
- Understand what the feature is supposed to do
|
|
28
|
+
- Identify the user-facing behavior boundary
|
|
29
|
+
|
|
30
|
+
This context helps you write a better issue — but the issue itself should NOT reference specific files, line numbers, or internal implementation details.
|
|
31
|
+
|
|
32
|
+
### 3. Assess scope: single issue or breakdown?
|
|
33
|
+
|
|
34
|
+
Before filing, decide whether this is a **single issue** or needs to be **broken down** into multiple issues.
|
|
35
|
+
|
|
36
|
+
Break down when:
|
|
37
|
+
|
|
38
|
+
- The fix spans multiple independent areas (e.g. "the form validation is wrong AND the success message is missing AND the redirect is broken")
|
|
39
|
+
- There are clearly separable concerns that different people could work on in parallel
|
|
40
|
+
- The user describes something that has multiple distinct failure modes or symptoms
|
|
41
|
+
|
|
42
|
+
Keep as a single issue when:
|
|
43
|
+
|
|
44
|
+
- It's one behavior that's wrong in one place
|
|
45
|
+
- The symptoms are all caused by the same root behavior
|
|
46
|
+
|
|
47
|
+
### 4. File the GitHub issue(s)
|
|
48
|
+
|
|
49
|
+
Create issues with `gh issue create`. Do NOT ask the user to review first — just file and share URLs.
|
|
50
|
+
|
|
51
|
+
Issues must be **durable** — they should still make sense after major refactors. Write from the user's perspective.
|
|
52
|
+
|
|
53
|
+
#### For a single issue
|
|
54
|
+
|
|
55
|
+
Use this template:
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
## What happened
|
|
59
|
+
|
|
60
|
+
[Describe the actual behavior the user experienced, in plain language]
|
|
61
|
+
|
|
62
|
+
## What I expected
|
|
63
|
+
|
|
64
|
+
[Describe the expected behavior]
|
|
65
|
+
|
|
66
|
+
## Steps to reproduce
|
|
67
|
+
|
|
68
|
+
1. [Concrete, numbered steps a developer can follow]
|
|
69
|
+
2. [Use domain terms from the codebase, not internal module names]
|
|
70
|
+
3. [Include relevant inputs, flags, or configuration]
|
|
71
|
+
|
|
72
|
+
## Additional context
|
|
73
|
+
|
|
74
|
+
[Any extra observations from the user or from codebase exploration that help frame the issue — e.g. "this only happens when using the Docker layer, not the filesystem layer" — use domain language but don't cite files]
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
#### For a breakdown (multiple issues)
|
|
78
|
+
|
|
79
|
+
Create issues in dependency order (blockers first) so you can reference real issue numbers.
|
|
80
|
+
|
|
81
|
+
Use this template for each sub-issue:
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
## Parent issue
|
|
85
|
+
|
|
86
|
+
#<parent-issue-number> (if you created a tracking issue) or "Reported during QA session"
|
|
87
|
+
|
|
88
|
+
## What's wrong
|
|
89
|
+
|
|
90
|
+
[Describe this specific behavior problem — just this slice, not the whole report]
|
|
91
|
+
|
|
92
|
+
## What I expected
|
|
93
|
+
|
|
94
|
+
[Expected behavior for this specific slice]
|
|
95
|
+
|
|
96
|
+
## Steps to reproduce
|
|
97
|
+
|
|
98
|
+
1. [Steps specific to THIS issue]
|
|
99
|
+
|
|
100
|
+
## Blocked by
|
|
101
|
+
|
|
102
|
+
- #<issue-number> (if this issue can't be fixed until another is resolved)
|
|
103
|
+
|
|
104
|
+
Or "None — can start immediately" if no blockers.
|
|
105
|
+
|
|
106
|
+
## Additional context
|
|
107
|
+
|
|
108
|
+
[Any extra observations relevant to this slice]
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
When creating a breakdown:
|
|
112
|
+
|
|
113
|
+
- **Prefer many thin issues over few thick ones** — each should be independently fixable and verifiable
|
|
114
|
+
- **Mark blocking relationships honestly** — if issue B genuinely can't be tested until issue A is fixed, say so. If they're independent, mark both as "None — can start immediately"
|
|
115
|
+
- **Create issues in dependency order** so you can reference real issue numbers in "Blocked by"
|
|
116
|
+
- **Maximize parallelism** — the goal is that multiple people (or agents) can grab different issues simultaneously
|
|
117
|
+
|
|
118
|
+
#### Rules for all issue bodies
|
|
119
|
+
|
|
120
|
+
- **No file paths or line numbers** — these go stale
|
|
121
|
+
- **Use the project's domain language** (check UBIQUITOUS_LANGUAGE.md if it exists)
|
|
122
|
+
- **Describe behaviors, not code** — "the sync service fails to apply the patch" not "applyPatch() throws on line 42"
|
|
123
|
+
- **Reproduction steps are mandatory** — if you can't determine them, ask the user
|
|
124
|
+
- **Keep it concise** — a developer should be able to read the issue in 30 seconds
|
|
125
|
+
|
|
126
|
+
After filing, print all issue URLs (with blocking relationships summarized) and ask: "Next issue, or are we done?"
|
|
127
|
+
|
|
128
|
+
### 5. Continue the session
|
|
129
|
+
|
|
130
|
+
Keep going until the user says they're done. Each issue is independent — don't batch them.
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: request-refactor-plan
|
|
3
|
+
description: Create a detailed refactor plan with tiny commits via user interview, then file it as a GitHub issue. Use when user wants to plan a refactor, create a refactoring RFC, or break a refactor into safe incremental steps.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
This skill will be invoked when the user wants to create a refactor request. You should go through the steps below. You may skip steps if you don't consider them necessary.
|
|
7
|
+
|
|
8
|
+
1. Ask the user for a long, detailed description of the problem they want to solve and any potential ideas for solutions.
|
|
9
|
+
|
|
10
|
+
2. Explore the repo to verify their assertions and understand the current state of the codebase.
|
|
11
|
+
|
|
12
|
+
3. Ask whether they have considered other options, and present other options to them.
|
|
13
|
+
|
|
14
|
+
4. Interview the user about the implementation. Be extremely detailed and thorough.
|
|
15
|
+
|
|
16
|
+
5. Hammer out the exact scope of the implementation. Work out what you plan to change and what you plan not to change.
|
|
17
|
+
|
|
18
|
+
6. Look in the codebase to check for test coverage of this area of the codebase. If there is insufficient test coverage, ask the user what their plans for testing are.
|
|
19
|
+
|
|
20
|
+
7. Break the implementation into a plan of tiny commits. Remember Martin Fowler's advice to "make each refactoring step as small as possible, so that you can always see the program working."
|
|
21
|
+
|
|
22
|
+
8. Create a GitHub issue with the refactor plan. Use the following template for the issue description:
|
|
23
|
+
|
|
24
|
+
<refactor-plan-template>
|
|
25
|
+
|
|
26
|
+
## Problem Statement
|
|
27
|
+
|
|
28
|
+
The problem that the developer is facing, from the developer's perspective.
|
|
29
|
+
|
|
30
|
+
## Solution
|
|
31
|
+
|
|
32
|
+
The solution to the problem, from the developer's perspective.
|
|
33
|
+
|
|
34
|
+
## Commits
|
|
35
|
+
|
|
36
|
+
A LONG, detailed implementation plan. Write the plan in plain English, breaking down the implementation into the tiniest commits possible. Each commit should leave the codebase in a working state.
|
|
37
|
+
|
|
38
|
+
## Decision Document
|
|
39
|
+
|
|
40
|
+
A list of implementation decisions that were made. This can include:
|
|
41
|
+
|
|
42
|
+
- The modules that will be built/modified
|
|
43
|
+
- The interfaces of those modules that will be modified
|
|
44
|
+
- Technical clarifications from the developer
|
|
45
|
+
- Architectural decisions
|
|
46
|
+
- Schema changes
|
|
47
|
+
- API contracts
|
|
48
|
+
- Specific interactions
|
|
49
|
+
|
|
50
|
+
Do NOT include specific file paths or code snippets. They may end up being outdated very quickly.
|
|
51
|
+
|
|
52
|
+
## Testing Decisions
|
|
53
|
+
|
|
54
|
+
A list of testing decisions that were made. Include:
|
|
55
|
+
|
|
56
|
+
- A description of what makes a good test (only test external behavior, not implementation details)
|
|
57
|
+
- Which modules will be tested
|
|
58
|
+
- Prior art for the tests (i.e. similar types of tests in the codebase)
|
|
59
|
+
|
|
60
|
+
## Out of Scope
|
|
61
|
+
|
|
62
|
+
A description of the things that are out of scope for this refactor.
|
|
63
|
+
|
|
64
|
+
## Further Notes (optional)
|
|
65
|
+
|
|
66
|
+
Any further notes about the refactor.
|
|
67
|
+
|
|
68
|
+
</refactor-plan-template>
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ubiquitous-language
|
|
3
|
+
description: Extract a DDD-style ubiquitous language glossary from the current conversation, flagging ambiguities and proposing canonical terms. Saves to UBIQUITOUS_LANGUAGE.md. Use when user wants to define domain terms, build a glossary, harden terminology, create a ubiquitous language, or mentions "domain model" or "DDD".
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Ubiquitous Language
|
|
8
|
+
|
|
9
|
+
Extract and formalize domain terminology from the current conversation into a consistent glossary, saved to a local file.
|
|
10
|
+
|
|
11
|
+
## Process
|
|
12
|
+
|
|
13
|
+
1. **Scan the conversation** for domain-relevant nouns, verbs, and concepts
|
|
14
|
+
2. **Identify problems**:
|
|
15
|
+
- Same word used for different concepts (ambiguity)
|
|
16
|
+
- Different words used for the same concept (synonyms)
|
|
17
|
+
- Vague or overloaded terms
|
|
18
|
+
3. **Propose a canonical glossary** with opinionated term choices
|
|
19
|
+
4. **Write to `UBIQUITOUS_LANGUAGE.md`** in the working directory using the format below
|
|
20
|
+
5. **Output a summary** inline in the conversation
|
|
21
|
+
|
|
22
|
+
## Output Format
|
|
23
|
+
|
|
24
|
+
Write a `UBIQUITOUS_LANGUAGE.md` file with this structure:
|
|
25
|
+
|
|
26
|
+
```md
|
|
27
|
+
# Ubiquitous Language
|
|
28
|
+
|
|
29
|
+
## Order lifecycle
|
|
30
|
+
|
|
31
|
+
| Term | Definition | Aliases to avoid |
|
|
32
|
+
| ----------- | ------------------------------------------------------- | --------------------- |
|
|
33
|
+
| **Order** | A customer's request to purchase one or more items | Purchase, transaction |
|
|
34
|
+
| **Invoice** | A request for payment sent to a customer after delivery | Bill, payment request |
|
|
35
|
+
|
|
36
|
+
## People
|
|
37
|
+
|
|
38
|
+
| Term | Definition | Aliases to avoid |
|
|
39
|
+
| ------------ | ------------------------------------------- | ---------------------- |
|
|
40
|
+
| **Customer** | A person or organization that places orders | Client, buyer, account |
|
|
41
|
+
| **User** | An authentication identity in the system | Login, account |
|
|
42
|
+
|
|
43
|
+
## Relationships
|
|
44
|
+
|
|
45
|
+
- An **Invoice** belongs to exactly one **Customer**
|
|
46
|
+
- An **Order** produces one or more **Invoices**
|
|
47
|
+
|
|
48
|
+
## Example dialogue
|
|
49
|
+
|
|
50
|
+
> **Dev:** "When a **Customer** places an **Order**, do we create the **Invoice** immediately?"
|
|
51
|
+
> **Domain expert:** "No — an **Invoice** is only generated once a **Fulfillment** is confirmed. A single **Order** can produce multiple **Invoices** if items ship in separate **Shipments**."
|
|
52
|
+
> **Dev:** "So if a **Shipment** is cancelled before dispatch, no **Invoice** exists for it?"
|
|
53
|
+
> **Domain expert:** "Exactly. The **Invoice** lifecycle is tied to the **Fulfillment**, not the **Order**."
|
|
54
|
+
|
|
55
|
+
## Flagged ambiguities
|
|
56
|
+
|
|
57
|
+
- "account" was used to mean both **Customer** and **User** — these are distinct concepts: a **Customer** places orders, while a **User** is an authentication identity that may or may not represent a **Customer**.
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Rules
|
|
61
|
+
|
|
62
|
+
- **Be opinionated.** When multiple words exist for the same concept, pick the best one and list the others as aliases to avoid.
|
|
63
|
+
- **Flag conflicts explicitly.** If a term is used ambiguously in the conversation, call it out in the "Flagged ambiguities" section with a clear recommendation.
|
|
64
|
+
- **Only include terms relevant for domain experts.** Skip the names of modules or classes unless they have meaning in the domain language.
|
|
65
|
+
- **Keep definitions tight.** One sentence max. Define what it IS, not what it does.
|
|
66
|
+
- **Show relationships.** Use bold term names and express cardinality where obvious.
|
|
67
|
+
- **Only include domain terms.** Skip generic programming concepts (array, function, endpoint) unless they have domain-specific meaning.
|
|
68
|
+
- **Group terms into multiple tables** when natural clusters emerge (e.g. by subdomain, lifecycle, or actor). Each group gets its own heading and table. If all terms belong to a single cohesive domain, one table is fine — don't force groupings.
|
|
69
|
+
- **Write an example dialogue.** A short conversation (3-5 exchanges) between a dev and a domain expert that demonstrates how the terms interact naturally. The dialogue should clarify boundaries between related concepts and show terms being used precisely.
|
|
70
|
+
|
|
71
|
+
<example>
|
|
72
|
+
|
|
73
|
+
## Example dialogue
|
|
74
|
+
|
|
75
|
+
> **Dev:** "How do I test the **sync service** without Docker?"
|
|
76
|
+
|
|
77
|
+
> **Domain expert:** "Provide the **filesystem layer** instead of the **Docker layer**. It implements the same **Sandbox service** interface but uses a local directory as the **sandbox**."
|
|
78
|
+
|
|
79
|
+
> **Dev:** "So **sync-in** still creates a **bundle** and unpacks it?"
|
|
80
|
+
|
|
81
|
+
> **Domain expert:** "Exactly. The **sync service** doesn't know which layer it's talking to. It calls `exec` and `copyIn` — the **filesystem layer** just runs those as local shell commands."
|
|
82
|
+
|
|
83
|
+
</example>
|
|
84
|
+
|
|
85
|
+
## Re-running
|
|
86
|
+
|
|
87
|
+
When invoked again in the same conversation:
|
|
88
|
+
|
|
89
|
+
1. Read the existing `UBIQUITOUS_LANGUAGE.md`
|
|
90
|
+
2. Incorporate any new terms from subsequent discussion
|
|
91
|
+
3. Update definitions if understanding has evolved
|
|
92
|
+
4. Re-flag any new ambiguities
|
|
93
|
+
5. Rewrite the example dialogue to incorporate new terms
|