@bhoon716/skill-forge 1.0.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/LICENSE +21 -0
- package/README.ko.md +112 -0
- package/README.md +112 -0
- package/README.zh.md +115 -0
- package/bin/cli.js +386 -0
- package/package.json +31 -0
- package/skills/ultra-grill-me/README.ko.md +123 -0
- package/skills/ultra-grill-me/README.md +122 -0
- package/skills/ultra-grill-me/README.zh.md +122 -0
- package/skills/ultra-grill-me/SKILL.ko.md +299 -0
- package/skills/ultra-grill-me/SKILL.md +130 -0
- package/skills/ultra-grill-me/SKILL.zh.md +140 -0
- package/skills/ultra-grill-me/evals/check_evals.py +134 -0
- package/skills/ultra-grill-me/evals/trigger_test_cases.json +98 -0
- package/skills/ultra-grill-me/examples/should-not-trigger.md +86 -0
- package/skills/ultra-grill-me/examples/should-trigger.md +254 -0
- package/skills/ultra-grill-me/logs/template.md +41 -0
- package/skills/ultra-grill-me/references/architecture-decision-grill.ko.md +87 -0
- package/skills/ultra-grill-me/references/architecture-decision-grill.md +68 -0
- package/skills/ultra-grill-me/references/business-strategy-grill.ko.md +88 -0
- package/skills/ultra-grill-me/references/business-strategy-grill.md +70 -0
- package/skills/ultra-grill-me/references/implementation-plan-grill.ko.md +87 -0
- package/skills/ultra-grill-me/references/implementation-plan-grill.md +70 -0
- package/skills/ultra-grill-me/references/learning-plan-grill.ko.md +87 -0
- package/skills/ultra-grill-me/references/learning-plan-grill.md +68 -0
- package/skills/ultra-grill-me/references/personal-decision-grill.ko.md +98 -0
- package/skills/ultra-grill-me/references/personal-decision-grill.md +71 -0
- package/skills/ultra-grill-me/references/product-idea-grill.ko.md +87 -0
- package/skills/ultra-grill-me/references/product-idea-grill.md +67 -0
- package/skills/ultra-grill-me/references/research-question-grill.ko.md +87 -0
- package/skills/ultra-grill-me/references/research-question-grill.md +68 -0
- package/skills/ultra-grill-me/references/skill-design-grill.ko.md +88 -0
- package/skills/ultra-grill-me/references/skill-design-grill.md +70 -0
- package/skills/ultra-grill-me/references/technical-design-grill.ko.md +88 -0
- package/skills/ultra-grill-me/references/technical-design-grill.md +66 -0
- package/skills/ultra-grill-me/references/writing-direction-grill.ko.md +88 -0
- package/skills/ultra-grill-me/references/writing-direction-grill.md +68 -0
package/bin/cli.js
ADDED
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const os = require('os');
|
|
6
|
+
const readline = require('readline');
|
|
7
|
+
|
|
8
|
+
const sourceSkillsDir = path.join(__dirname, '..', 'skills');
|
|
9
|
+
|
|
10
|
+
// Helper to print usage info
|
|
11
|
+
const def_usage = () => {
|
|
12
|
+
console.log(`
|
|
13
|
+
Usage: npx @bhoon716/skill-forge [command] [options]
|
|
14
|
+
|
|
15
|
+
If run without arguments, launches Interactive Setup Mode.
|
|
16
|
+
|
|
17
|
+
Commands:
|
|
18
|
+
list List all available skills and their descriptions.
|
|
19
|
+
add <skill-name> Install a specific skill from the forge workspace.
|
|
20
|
+
install-all Install all available skills from the forge workspace.
|
|
21
|
+
|
|
22
|
+
Options:
|
|
23
|
+
-l, --lang <lang> Specify localization language (e.g., en, ko, zh). (Default: en)
|
|
24
|
+
-a, --agent <agent> Target AI Agent environment. (Default: codex)
|
|
25
|
+
Supported: codex, gemini, claude, cursor, copilot, global
|
|
26
|
+
--dry-run Simulate copying without actually modifying files.
|
|
27
|
+
-h, --help Display help message.
|
|
28
|
+
|
|
29
|
+
Examples:
|
|
30
|
+
npx @bhoon716/skill-forge list --lang ko
|
|
31
|
+
npx @bhoon716/skill-forge add ultra-grill-me --lang ko
|
|
32
|
+
npx @bhoon716/skill-forge add ultra-grill-me --lang zh --agent claude
|
|
33
|
+
`);
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
// Autodetect agent paths in current working directory
|
|
37
|
+
const detectAgents = () => {
|
|
38
|
+
const detected = [];
|
|
39
|
+
const pwd = process.cwd();
|
|
40
|
+
if (fs.existsSync(path.join(pwd, '.agents'))) detected.push({ name: 'codex/gemini', value: 'codex' });
|
|
41
|
+
if (fs.existsSync(path.join(pwd, '.claude'))) detected.push({ name: 'claude', value: 'claude' });
|
|
42
|
+
if (fs.existsSync(path.join(pwd, '.cursor'))) detected.push({ name: 'cursor', value: 'cursor' });
|
|
43
|
+
if (fs.existsSync(path.join(pwd, '.copilot'))) detected.push({ name: 'copilot', value: 'copilot' });
|
|
44
|
+
return detected;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
// List available skills logic
|
|
48
|
+
const listSkillsLogic = (selectedLang = 'en') => {
|
|
49
|
+
if (!fs.existsSync(sourceSkillsDir)) {
|
|
50
|
+
console.error(`Error: Skills source directory not found at ${sourceSkillsDir}`);
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const skills = fs.readdirSync(sourceSkillsDir).filter(file => {
|
|
55
|
+
return fs.statSync(path.join(sourceSkillsDir, file)).isDirectory();
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
console.log('\n===================================================');
|
|
59
|
+
console.log(`๐ Available Skills in Forge Workspace (Lang: ${selectedLang})`);
|
|
60
|
+
console.log('===================================================\n');
|
|
61
|
+
|
|
62
|
+
if (skills.length === 0) {
|
|
63
|
+
console.log('No skills found in workspace.');
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
skills.forEach(skill => {
|
|
68
|
+
// Try to find localized SKILL file
|
|
69
|
+
let skillFile = path.join(sourceSkillsDir, skill, `SKILL.${selectedLang}.md`);
|
|
70
|
+
if (!fs.existsSync(skillFile)) {
|
|
71
|
+
skillFile = path.join(sourceSkillsDir, skill, 'SKILL.md'); // Fallback to default
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
let description = 'No description provided.';
|
|
75
|
+
if (fs.existsSync(skillFile)) {
|
|
76
|
+
const content = fs.readFileSync(skillFile, 'utf8');
|
|
77
|
+
|
|
78
|
+
// Parse description from frontmatter
|
|
79
|
+
const descMatch = content.match(/description:\s*(.*)/);
|
|
80
|
+
if (descMatch && descMatch[1]) {
|
|
81
|
+
description = descMatch[1].trim();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
console.log(`* ${skill.padEnd(20)} - ${description}`);
|
|
86
|
+
});
|
|
87
|
+
console.log('\nUse "skill-forge add <skill-name>" to install a specific skill.\n');
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
// Interactive Mode Prompt
|
|
91
|
+
const runInteractiveMode = async () => {
|
|
92
|
+
console.log('===================================================');
|
|
93
|
+
console.log('๐ ๏ธ Welcome to skill-forge Interactive Setup Mode');
|
|
94
|
+
console.log('===================================================\n');
|
|
95
|
+
|
|
96
|
+
if (!fs.existsSync(sourceSkillsDir)) {
|
|
97
|
+
console.error(`Error: Skills source directory not found at ${sourceSkillsDir}`);
|
|
98
|
+
process.exit(1);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const skills = fs.readdirSync(sourceSkillsDir).filter(file => {
|
|
102
|
+
return fs.statSync(path.join(sourceSkillsDir, file)).isDirectory();
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
if (skills.length === 0) {
|
|
106
|
+
console.log('No skills found in workspace to install.');
|
|
107
|
+
process.exit(0);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const rl = readline.createInterface({
|
|
111
|
+
input: process.stdin,
|
|
112
|
+
output: process.stdout
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
const question = (query) => new Promise((resolve) => rl.question(query, resolve));
|
|
116
|
+
|
|
117
|
+
try {
|
|
118
|
+
// 1. Select Skill
|
|
119
|
+
console.log('Available Skills in Forge:');
|
|
120
|
+
skills.forEach((s, idx) => console.log(` [${idx + 1}] ${s}`));
|
|
121
|
+
console.log(` [${skills.length + 1}] (Install All Available Skills)`);
|
|
122
|
+
|
|
123
|
+
let skillChoiceIdx = -1;
|
|
124
|
+
while (true) {
|
|
125
|
+
const ans = await question(`\nSelect a skill to install [1-${skills.length + 1}]: `);
|
|
126
|
+
const val = parseInt(ans.trim());
|
|
127
|
+
if (val >= 1 && val <= skills.length + 1) {
|
|
128
|
+
skillChoiceIdx = val - 1;
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
console.log('Invalid choice. Please select a valid option number.');
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const installAll = skillChoiceIdx === skills.length;
|
|
135
|
+
const selectedSkill = installAll ? null : skills[skillChoiceIdx];
|
|
136
|
+
|
|
137
|
+
// 2. Select Language
|
|
138
|
+
console.log('\nSelect localization language:');
|
|
139
|
+
console.log(' [1] English (en) - Default');
|
|
140
|
+
console.log(' [2] ํ๊ตญ์ด (ko)');
|
|
141
|
+
console.log(' [3] ็ฎไฝไธญๆ (zh)');
|
|
142
|
+
|
|
143
|
+
let selectedLang = 'en';
|
|
144
|
+
while (true) {
|
|
145
|
+
const ans = await question('\nSelect language option [1-3, Default 1]: ');
|
|
146
|
+
const val = ans.trim();
|
|
147
|
+
if (val === '' || val === '1') {
|
|
148
|
+
selectedLang = 'en';
|
|
149
|
+
break;
|
|
150
|
+
} else if (val === '2') {
|
|
151
|
+
selectedLang = 'ko';
|
|
152
|
+
break;
|
|
153
|
+
} else if (val === '3') {
|
|
154
|
+
selectedLang = 'zh';
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
console.log('Invalid choice. Please select 1, 2, or 3.');
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// 3. Select Agent Target
|
|
161
|
+
const detected = detectAgents();
|
|
162
|
+
console.log('\nSelect target AI Agent environment:');
|
|
163
|
+
|
|
164
|
+
const agentsList = [
|
|
165
|
+
{ name: 'Codex / Gemini (./.agents/)', value: 'codex' },
|
|
166
|
+
{ name: 'Claude Code (./.claude/)', value: 'claude' },
|
|
167
|
+
{ name: 'Cursor (./.cursor/)', value: 'cursor' },
|
|
168
|
+
{ name: 'Github Copilot (./.copilot/)', value: 'copilot' },
|
|
169
|
+
{ name: 'Global User Setting (~/.gemini/config/)', value: 'global' }
|
|
170
|
+
];
|
|
171
|
+
|
|
172
|
+
agentsList.forEach((ag, idx) => {
|
|
173
|
+
const isDetected = detected.some(d => d.value === ag.value);
|
|
174
|
+
const label = isDetected ? 'โญ (Detected in Project)' : '';
|
|
175
|
+
console.log(` [${idx + 1}] ${ag.name} ${label}`);
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
let selectedAgent = 'codex';
|
|
179
|
+
while (true) {
|
|
180
|
+
const ans = await question('\nSelect agent option [1-5, Default 1]: ');
|
|
181
|
+
const val = ans.trim();
|
|
182
|
+
if (val === '') {
|
|
183
|
+
selectedAgent = 'codex';
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
const idx = parseInt(val);
|
|
187
|
+
if (idx >= 1 && idx <= 5) {
|
|
188
|
+
selectedAgent = agentsList[idx - 1].value;
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
console.log('Invalid choice. Please select a option number between 1 and 5.');
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
rl.close();
|
|
195
|
+
|
|
196
|
+
// Summary and Execute
|
|
197
|
+
console.log('\n---------------------------------------------------');
|
|
198
|
+
console.log('๐ Ready to install:');
|
|
199
|
+
console.log(` - Skill: ${installAll ? 'ALL Skills' : selectedSkill}`);
|
|
200
|
+
console.log(` - Language: ${selectedLang}`);
|
|
201
|
+
console.log(` - Target Agent: ${selectedAgent}`);
|
|
202
|
+
console.log('---------------------------------------------------\n');
|
|
203
|
+
|
|
204
|
+
// Run installation logic
|
|
205
|
+
const targetBaseDir = getTargetBaseDir(selectedAgent);
|
|
206
|
+
if (installAll) {
|
|
207
|
+
console.log(`Installing all ${skills.length} skills to target path: ${targetBaseDir}...\n`);
|
|
208
|
+
skills.forEach(s => installSkillLogic(s, selectedLang, selectedAgent, targetBaseDir));
|
|
209
|
+
} else {
|
|
210
|
+
installSkillLogic(selectedSkill, selectedLang, selectedAgent, targetBaseDir);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
} catch (err) {
|
|
214
|
+
console.error('Error during interactive setup:', err);
|
|
215
|
+
rl.close();
|
|
216
|
+
process.exit(1);
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
const getTargetBaseDir = (selectedAgent) => {
|
|
221
|
+
const pwd = process.cwd();
|
|
222
|
+
switch (selectedAgent.toLowerCase()) {
|
|
223
|
+
case 'codex':
|
|
224
|
+
case 'gemini':
|
|
225
|
+
return path.join(pwd, '.agents', 'skills');
|
|
226
|
+
case 'claude':
|
|
227
|
+
return path.join(pwd, '.claude', 'skills');
|
|
228
|
+
case 'cursor':
|
|
229
|
+
return path.join(pwd, '.cursor', 'skills');
|
|
230
|
+
case 'copilot':
|
|
231
|
+
return path.join(pwd, '.copilot', 'skills');
|
|
232
|
+
case 'global':
|
|
233
|
+
return path.join(os.homedir(), '.gemini', 'config', 'skills');
|
|
234
|
+
default:
|
|
235
|
+
console.error(`Error: Unsupported agent type "${selectedAgent}".`);
|
|
236
|
+
process.exit(1);
|
|
237
|
+
}
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
// Main Entry Point Parsing
|
|
241
|
+
const args = process.argv.slice(2);
|
|
242
|
+
|
|
243
|
+
if (args.includes('-h') || args.includes('--help')) {
|
|
244
|
+
def_usage();
|
|
245
|
+
process.exit(0);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// If no arguments, launch Interactive Mode
|
|
249
|
+
if (args.length === 0) {
|
|
250
|
+
runInteractiveMode();
|
|
251
|
+
} else {
|
|
252
|
+
// Command line parameters parsing mode
|
|
253
|
+
const command = args[0];
|
|
254
|
+
if (command !== 'add' && command !== 'install-all' && command !== 'list') {
|
|
255
|
+
console.error(`Error: Unknown command "${command}"`);
|
|
256
|
+
def_usage();
|
|
257
|
+
process.exit(1);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
let targetSkill = null;
|
|
261
|
+
let lang = 'en';
|
|
262
|
+
let agent = 'codex';
|
|
263
|
+
let dryRun = false;
|
|
264
|
+
|
|
265
|
+
if (command === 'add') {
|
|
266
|
+
targetSkill = args[1];
|
|
267
|
+
if (!targetSkill || targetSkill.startsWith('-')) {
|
|
268
|
+
console.error('Error: Please specify a skill name to add.');
|
|
269
|
+
process.exit(1);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// Parse command flags
|
|
274
|
+
const parseStartIdx = command === 'add' ? 2 : 1;
|
|
275
|
+
for (let i = parseStartIdx; i < args.length; i++) {
|
|
276
|
+
const arg = args[i];
|
|
277
|
+
if (arg === '-l' || arg === '--lang') {
|
|
278
|
+
lang = args[++i];
|
|
279
|
+
} else if (arg === '-a' || arg === '--agent') {
|
|
280
|
+
agent = args[++i];
|
|
281
|
+
} else if (arg === '--dry-run') {
|
|
282
|
+
dryRun = true;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
if (command === 'list') {
|
|
287
|
+
listSkillsLogic(lang);
|
|
288
|
+
} else {
|
|
289
|
+
const targetBaseDir = getTargetBaseDir(agent);
|
|
290
|
+
|
|
291
|
+
if (command === 'add') {
|
|
292
|
+
installSkillLogic(targetSkill, lang, agent, targetBaseDir, dryRun);
|
|
293
|
+
} else if (command === 'install-all') {
|
|
294
|
+
if (!fs.existsSync(sourceSkillsDir)) {
|
|
295
|
+
console.error(`Error: Skills source directory not found at ${sourceSkillsDir}`);
|
|
296
|
+
process.exit(1);
|
|
297
|
+
}
|
|
298
|
+
const skills = fs.readdirSync(sourceSkillsDir).filter(file => {
|
|
299
|
+
return fs.statSync(path.join(sourceSkillsDir, file)).isDirectory();
|
|
300
|
+
});
|
|
301
|
+
skills.forEach(s => installSkillLogic(s, lang, agent, targetBaseDir, dryRun));
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
function installSkillLogic(skillName, lang, agent, targetBaseDir, dryRun = false) {
|
|
307
|
+
const sourceDir = path.join(sourceSkillsDir, skillName);
|
|
308
|
+
const destDir = path.join(targetBaseDir, skillName);
|
|
309
|
+
|
|
310
|
+
if (!fs.existsSync(sourceDir)) {
|
|
311
|
+
console.error(`Error: Skill "${skillName}" does not exist in path: ${sourceDir}`);
|
|
312
|
+
process.exit(1);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
console.log(`[INSTALLING] Skill "${skillName}" (Language: ${lang}, Target Agent: ${agent})`);
|
|
316
|
+
if (dryRun) console.log(' *** DRY-RUN MODE: No files will be modified ***');
|
|
317
|
+
|
|
318
|
+
function copyRecursive(src, dest) {
|
|
319
|
+
if (!fs.existsSync(src)) return;
|
|
320
|
+
const stats = fs.statSync(src);
|
|
321
|
+
|
|
322
|
+
if (stats.isDirectory()) {
|
|
323
|
+
if (!fs.existsSync(dest) && !dryRun) {
|
|
324
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
325
|
+
}
|
|
326
|
+
const files = fs.readdirSync(src);
|
|
327
|
+
const fileMappings = [];
|
|
328
|
+
const filesToSkip = new Set();
|
|
329
|
+
|
|
330
|
+
files.forEach(file => {
|
|
331
|
+
const filePath = path.join(src, file);
|
|
332
|
+
if (fs.statSync(filePath).isDirectory()) return;
|
|
333
|
+
|
|
334
|
+
const ext = path.extname(file);
|
|
335
|
+
const base = path.basename(file, ext);
|
|
336
|
+
const langSuffix = `.${lang}`;
|
|
337
|
+
|
|
338
|
+
if (base.endsWith(langSuffix)) {
|
|
339
|
+
const originalBaseName = base.slice(0, -langSuffix.length);
|
|
340
|
+
const originalFileName = originalBaseName + ext;
|
|
341
|
+
fileMappings.push({ srcFile: file, destFile: originalFileName });
|
|
342
|
+
if (files.includes(originalFileName)) {
|
|
343
|
+
filesToSkip.add(originalFileName);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
});
|
|
347
|
+
|
|
348
|
+
files.forEach(file => {
|
|
349
|
+
const srcPath = path.join(src, file);
|
|
350
|
+
const destPath = path.join(dest, file);
|
|
351
|
+
|
|
352
|
+
if (fs.statSync(srcPath).isDirectory()) {
|
|
353
|
+
copyRecursive(srcPath, destPath);
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
if (filesToSkip.has(file)) return;
|
|
358
|
+
|
|
359
|
+
const ext = path.extname(file);
|
|
360
|
+
const base = path.basename(file, ext);
|
|
361
|
+
const langMatch = base.match(/\.([a-z]{2})$/);
|
|
362
|
+
if (langMatch) {
|
|
363
|
+
const matchedLang = langMatch[1];
|
|
364
|
+
if (matchedLang !== lang) return;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
const mapping = fileMappings.find(m => m.srcFile === file);
|
|
368
|
+
if (mapping) {
|
|
369
|
+
const mappedDestPath = path.join(dest, mapping.destFile);
|
|
370
|
+
console.log(` Copy: ${file} -> ${mapping.destFile}`);
|
|
371
|
+
if (!dryRun) fs.copyFileSync(srcPath, mappedDestPath);
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
console.log(` Copy: ${file} -> ${file}`);
|
|
376
|
+
if (!dryRun) fs.copyFileSync(srcPath, destPath);
|
|
377
|
+
});
|
|
378
|
+
} else {
|
|
379
|
+
console.log(` Copy: ${path.basename(src)} -> ${path.basename(dest)}`);
|
|
380
|
+
if (!dryRun) fs.copyFileSync(src, dest);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
copyRecursive(sourceDir, destDir);
|
|
385
|
+
console.log(`[SUCCESS] Installed "${skillName}" to: ${destDir}\n`);
|
|
386
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@bhoon716/skill-forge",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Agent Skill Authoring & Distribution CLI Workspace",
|
|
5
|
+
"main": "bin/cli.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"skill-forge": "./bin/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"bin",
|
|
14
|
+
"skills",
|
|
15
|
+
"README.md",
|
|
16
|
+
"README.ko.md",
|
|
17
|
+
"README.zh.md"
|
|
18
|
+
],
|
|
19
|
+
"keywords": [
|
|
20
|
+
"agent",
|
|
21
|
+
"skills",
|
|
22
|
+
"codex",
|
|
23
|
+
"claude",
|
|
24
|
+
"gemini"
|
|
25
|
+
],
|
|
26
|
+
"author": "",
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"engines": {
|
|
29
|
+
"node": ">=16.0.0"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# ๐ฏ Ultra Grill Me (์ํฌ๋ผํ
์ค์ ์๋ฐ ๊ฒ์ฆ ์คํฌ)
|
|
2
|
+
|
|
3
|
+
<p align="center">
|
|
4
|
+
<a href="./README.md">English</a> | <a href="./README.ko.md">ํ๊ตญ์ด</a> | <a href="./README.zh.md">็ฎไฝไธญๆ</a>
|
|
5
|
+
</p>
|
|
6
|
+
`ultra-grill-me`๋ ์ฌ์ฉ์์ ๋ค์ํ ๊ธฐํ, ์ํคํ
์ฒ, ์ฝ๋ ๋ชจ๋ธ, ๋น์ฆ๋์ค ์ ๋ต ๋ฑ์ ๋ฐ๋ก ์ฝ๋๋ ๋ฌธ์๋ก ์์ฑํ๊ธฐ ์ ์, **ํ ๋ฒ์ ํ๋์ ์ง๋ฌธ์ผ๋ก ๋ชจํธ์ฑ๊ณผ ์ฝ์ ์ ๋ฐ๋์ ๋ฌธํ๋ฏ ๊น์๋๊ฐ๋ ๊ฒ์ฆ ์ ์ฉ AI ์์ด์ ํธ ์คํฌ(Agent Skill)**์
๋๋ค.
|
|
7
|
+
|
|
8
|
+
"๋์ ์์ฑํด์ฃผ๋ ์คํฌ"์ด ์๋๋ผ, **"์คํํ๊ธฐ ์ ์ ์คํจ ๊ฐ๋ฅ์ฑ์ ์ง์๋๊ฐ๋ ์๋ฐฉ์ ๊ฒ์ฆ ์คํฌ"**๋ก ์๋ํฉ๋๋ค.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 1. ์ธ์
๋์ ๋ฉ์ปค๋์ฆ (Mermaid Flow)
|
|
13
|
+
|
|
14
|
+
์์ด์ ํธ๋ ์ฌ์ฉ์๊ฐ ์ธ์
์ ์์ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฒ ์ ํ Socratic ๋ฃจํ๋ฅผ ๋๋ฉฐ ์๋ํฉ๋๋ค.
|
|
15
|
+
|
|
16
|
+
```mermaid
|
|
17
|
+
graph TD
|
|
18
|
+
A[์ธ์
์์ ์์ฒญ] --> B[logs/ ์ธ์
๋ก๊ทธ ์์ฑ]
|
|
19
|
+
B --> C[๋๋ฉ์ธ reference ํ์ผ 1์ข
๋ก๋]
|
|
20
|
+
C --> D[ํ์ฌ ์ํ 1๋ฌธ์ฅ ์์ฝ]
|
|
21
|
+
D --> E[๊ฐ์ฅ ์ฐ์ ์์ ๋์ ์นด์ ๊ฒฐ์ ์๋ณ]
|
|
22
|
+
E --> F[1๊ฐ์ Micro-Question ์์ฑ]
|
|
23
|
+
F --> G{์ถ์ฒ ๋ผ๋ฒจ โญ / ๋ค๋ฅธ ์ต์
๋ ๋ฐ๊ธฐ ํฌํจ ์ ํ์ง ์ ์}
|
|
24
|
+
G --> H[์ฌ์ฉ์ ๋ต๋ณ ๋๊ธฐ ๋ฐ ์
๋ ฅ ๊ตฌ์]
|
|
25
|
+
H --> I[๋ต๋ณ ๋ด์ฉ ๋ถ์ ๋ฐ ๋ด๋ถ ์ํ ๊ฐฑ์ ]
|
|
26
|
+
I --> J[logs/ ์ ํด๋ณ ์ง๋ฌธ/๋ต๋ณ ๊ฒฐ๊ณผ ๊ธฐ๋ก]
|
|
27
|
+
J --> K{์ข
๋ฃ ์กฐ๊ฑด ์ถฉ์กฑ?}
|
|
28
|
+
K -- No --> D
|
|
29
|
+
K -- Yes --> L[9๊ฐ ์น์
์ ์ต์ข
์ ๋ฆฌ ์ถ๋ ฅ]
|
|
30
|
+
L --> M[์ต์ข
์ ๋ฆฌ๋ฅผ ๋ก๊ทธ์ ์๊ตฌ ๊ธฐ๋ก ๋ฐ ์ข
๋ฃ]
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 2. 10๋ ๊ฒ์ฆ ๋๋ฉ์ธ ๋ฐ Reference ๋งคํ
|
|
36
|
+
|
|
37
|
+
์ด ์คํฌ์ ์ฌ์ฉ์์ ๊ธฐํ ๋๋ฉ์ธ ์ฑ๊ฒฉ์ ๋ฐ๋ผ ํนํ๋ 10๊ฐ์ reference ๋งํฌ๋ค์ด ์คํ์ ๋ก๋ํด ์ ๋ฌธ์ฑ์ ํ๋ณดํฉ๋๋ค.
|
|
38
|
+
|
|
39
|
+
| ๋๋ฉ์ธ ์์ญ | ๋์ ํ์ผ๋ช
| ์ค์ ๊ฒ์ฆ ๋ฐ ์ง๋ฌธ ์ฒ ํ |
|
|
40
|
+
| :--- | :--- | :--- |
|
|
41
|
+
| **์ ํ / SaaS ์์ด๋์ด** | [product-idea-grill.md](file:///skills/ultra-grill-me/references/product-idea-grill.md) | ICP ์ขํ๊ธฐ, ์ฌ์ฉ์ ํ์ธํฌ์ธํธ ์ ๋ํ, ํต์ฌ 1๊ฐ ๊ธฐ๋ฅ์ MVP ๊ฒฝ๊ณ์ ํ๋ฆฝ |
|
|
42
|
+
| **๊ฐ๋ฐ ๊ตฌํ ์ค๊ณ** | [technical-design-grill.md](file:///skills/ultra-grill-me/references/technical-design-grill.md) | Latency/๊ฐ์ฉ์ฑ ๋ฑ ๋น๊ธฐ๋ฅ์ ์๊ตฌ์ฌํญ(NFR), ๋ฐ์ดํฐ ์ผ๊ด์ฑ ๋ฐ ๋์์ฑ, ์ฅ์ ๋ณต๊ตฌ ์๋๋ฆฌ์ค |
|
|
43
|
+
| **์ํคํ
์ฒ ๊ฒฐ์ (ADR)** | [architecture-decision-grill.md](file:///skills/ultra-grill-me/references/architecture-decision-grill.md) | ๋์ ๊ธฐ์ ๋น๊ต(ํ์ ์ ์ง ํ์), ์ํคํ
์ฒ ๊ฒฐ์ ์ ๋ฒ๋ณตํ ๋์ ๊ธฐํ๋น์ฉ(๊ฐ์ญ์ฑ) |
|
|
44
|
+
| **๊ตฌํ / ์ผ์ ๊ณํ** | [implementation-plan-grill.md](file:///skills/ultra-grill-me/references/implementation-plan-grill.md) | ์๋ฃ ์กฐ๊ฑด(DoD), ์์
๋จ์ 3์ผ ์ด๋ด ์ชผ๊ฐ๊ธฐ, ์ธ๋ถ ์ฌ์ฌ ์์กด์ฑ ๋ฆฌ์คํฌ ๋ฐ ๋กค๋ฐฑ ํ์ดํ๋ผ์ธ |
|
|
45
|
+
| **์ฌ์
์ ๋ต / GTM** | [business-strategy-grill.md](file:///skills/ultra-grill-me/references/business-strategy-grill.md) | ์ค์ ๊ฒฐ์ ์ฃผ์ฒด์ ์ฌ์ฉ์์ ๊ตฌ๋ถ, ์ด๊ธฐ 10๋ช
์ ์ ๋ฃ ๊ณ ๊ฐ ํ๋ณด ์ฑ๋, ๊ฐ๊ฒฉ ํจํค์ง |
|
|
46
|
+
| **๊ธ์ฐ๊ธฐ / ๋ด๋ฌํฐ๋ธ** | [writing-direction-grill.md](file:///skills/ultra-grill-me/references/writing-direction-grill.md) | ํ๊ฒ ๋
์์ ์ง์ ๊น์ด ์ ์, 1๊ฐ ๋จ์ผ ํต์ฌ ๋ฉ์์ง ์ถ์ถ, ๋
์๊ฐ ์ทจํ ๋ค์ ํ๋(CTA) |
|
|
47
|
+
| **์ฐ๊ตฌ ์ง๋ฌธ / ๊ฐ์ค** | [research-question-grill.md](file:///skills/ultra-grill-me/references/research-question-grill.md) | ์ธ๊ณผ๊ด๊ณ๋ฅผ ์
์ฆํ ํต์ ๋ณ์ ๋ฐ ๋
๋ฆฝ ๋ณ์ ์๋ณ, ๋์กฐ๊ตฐ(Baseline), ํต๊ณ์ ์ ์๋ฏธ ์ญ์น |
|
|
48
|
+
| **ํ์ต ๊ณํ / ๋ก๋๋งต** | [learning-plan-grill.md](file:///skills/ultra-grill-me/references/learning-plan-grill.md) | ์๊ฐ ํ๊ฐ๊ฐ ๊ฐ๋ฅํ ์์ ํ ์ด ํ๋ก์ ํธ ๋ชฉํ ์ค์ , ์ฃผ๊ฐ ๊ฐ์ฉ ์๊ฐ ํ๊ณ, ํผ๋๋ฐฑ ๋ฉ์ปค๋์ฆ |
|
|
49
|
+
| **๊ฐ์ธ ์์ฌ๊ฒฐ์ ** | [personal-decision-grill.md](file:///skills/ultra-grill-me/references/personal-decision-grill.md) | ๊ฐ์ธ์ ๋นํํ์ ์กฐ๊ฑด(์ ์ฝ) ๋ช
์, ๊ธฐํ๋น์ฉ ๋ถ์, ์ต์
์๋๋ฆฌ์ค ์ฒดํ ์คํ ์ค๊ณ |
|
|
50
|
+
| **Agent Skill ์ค๊ณ** | [skill-design-grill.md](file:///skills/ultra-grill-me/references/skill-design-grill.md) | ์คํฌ์ ์ข์ ๋ฐ๋ณต ๋ฒ์(Scope), ๋ฐ๋(Trigger)๊ณผ ์ค๋ฐ๋(Non-trigger) ์๋๋ฆฌ์ค ๊ฒฝ๊ณ |
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## 3. ๋ํ ์์ (Socratic Conversation Flow)
|
|
55
|
+
|
|
56
|
+
์์ด์ ํธ๋ ์ฌ์ฉ์๊ฐ ๋ชจํธํ ๊ณํ์ ๋์ก์ ๋ ๋ค์๊ณผ ๊ฐ์ด ๋๋ต์ ์ ๋ํฉ๋๋ค.
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
[์ฌ์ฉ์]: "์๋ก ๊ธฐํ ์ค์ธ 1์ธ ๊ฐ๋ฐ์์ฉ ํ ์ผ ๊ด๋ฆฌ ์ฑ ๊ฒ์ฆํด์ค."
|
|
60
|
+
---
|
|
61
|
+
[์์ด์ ํธ]:
|
|
62
|
+
**ํ์ฌ ์ดํด**: ๊ฐ๋ฐ์์ฉ ํ ์ผ ๊ด๋ฆฌ ์ฑ ์์ด๋์ด๋ฅผ ๊ฒ์ฆํ๊ณ ์ถ์ ์ํ์
๋๋ค.
|
|
63
|
+
|
|
64
|
+
**๋งํ ๊ฒฐ์ **: ๋์ ์ฌ์ฉ์์ ๋ฒ์๊ฐ ๋๋ฌด ๋์ด, ๊ตฌ์ฒด์ ์ธ ํฌ๋ฌ ๊ธฐ๋ฅ๊ณผ ์ฑ๊ณต ์งํ๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
|
|
65
|
+
|
|
66
|
+
**์ง๋ฌธ**: ์ด ์ฑ์ ์ฌ์ฉํ 1์ฐจ ํ๊ฒ ๊ฐ๋ฐ์๋ ๋๊ตฌ์ธ๊ฐ์?
|
|
67
|
+
|
|
68
|
+
**์ ์ค์ํ์ง**: ๊ฐ๋ฐ์๋ง๋ค ์
๋ฌด ์คํ์ผ(ํ๋ฆฌ๋์, ๋๊ธฐ์
์ฌ์, 1์ธ ๊ฐ๋ฐ์)์ด ๋ค๋ฅด๋ฏ๋ก, ๊ตฌ์ฒด์ ์ธ ํ๊ฒ์ ์ขํ์ผ ์ด๋ค์ ์ง์ง ํ์ธํฌ์ธํธ๋ฅผ ํด๊ฒฐํ๋ ๊ธฐ๋ฅ ๋ฒ์(MVP)๋ฅผ ๋์ถํ ์ ์์ต๋๋ค.
|
|
69
|
+
|
|
70
|
+
**์ ํ์ง**:
|
|
71
|
+
1. (์ถ์ฒ) 1์ธ ๊ฐ๋ฐ์ ๋๋ ์ธ๋ ํด์ปค โ ์ฌ๋ฌ ํ๋ก์ ํธ์ ์ปจํ
์คํธ ์ค์์นญ๊ณผ ์ผ์ ๊ด๋ฆฌ์ ์ง์ค
|
|
72
|
+
2. 5์ธ ์ดํ ์๊ท๋ชจ ์คํํธ์
์ ํ์คํ ๊ฐ๋ฐ์ โ ํ์
๊ณผ ๋น ๋ฅธ ๋ฐฐํฌ ๋๊ธฐํ์ ์ง์ค
|
|
73
|
+
3. ๋๊ธฐ์
์ ๊ทผ๋ฌดํ๋ ํ๋ซํผ ์์ง๋์ด โ ํฐ์ผ ๊ด๋ฆฌ ์์คํ
(Jira ๋ฑ)๊ณผ์ ์ฐ๋์ ์ง์ค
|
|
74
|
+
4. ๋ค๋ฅธ ์ต์
๋ ์ถ์ฒ๋ฐ๊ธฐ
|
|
75
|
+
5. ์ง์ ๋ต๋ณ
|
|
76
|
+
|
|
77
|
+
๋ฒํธ๋ฅผ ์ ํํ๊ฑฐ๋, ๋ค๋ฅธ ์ต์
์ ์์ฒญํ๊ฑฐ๋, ์ง์ ๋ตํด ์ฃผ์ธ์.
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## 4. `npx @bhoon716/skill-forge` CLI ์ค์น ๊ฐ์ด๋
|
|
83
|
+
|
|
84
|
+
์ ์ฅ์ ๊ณตํต CLI ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ ์์ด์ ํธ ๋๊ตฌ ํ๊ฒฝ์ ์ง์ ๋ ์ธ์ด ๋ฒ์ ์ผ๋ก ์ฆ์ ์ด์ํฉ๋๋ค.
|
|
85
|
+
|
|
86
|
+
> [!NOTE]
|
|
87
|
+
> `--lang ko` ์ต์
์ ์ฃผ๋ฉด, ์์ค ํด๋ ๋ด์ `SKILL.ko.md`๊ฐ ํ๊ฒ ๊ฒฝ๋ก์ `SKILL.md`๋ก ๋ณํ๋์ด ์ด์๋ฉ๋๋ค. references ๋ด ํ๊ตญ์ด ๋งํฌ๋ค์ด๋ค๋ ์ ๋ฏธ์ฌ๋ฅผ ๋ผ๊ณ ๊นจ๋ํ๊ฒ ๋ฎ์ด์ฐ์ฌ ์ฐ๋๋ฉ๋๋ค.
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
# 1. Codex/Gemini์ ํ๊ตญ์ด ๋ฒ์ ์ผ๋ก ๋ก์ปฌ ์ค์น (๊ธฐ๋ณธ๊ฐ)
|
|
91
|
+
npx @bhoon716/skill-forge add ultra-grill-me --lang ko
|
|
92
|
+
|
|
93
|
+
# 2. Claude Code์ ํ๊ตญ์ด ๋ฒ์ ์ผ๋ก ๋ก์ปฌ ์ค์น
|
|
94
|
+
npx @bhoon716/skill-forge add ultra-grill-me --lang ko --agent claude
|
|
95
|
+
|
|
96
|
+
# 3. Cursor ํ๋ก์ ํธ ๋ก์ปฌ์ ์์ด ๋ฒ์ ์ผ๋ก ์ค์น
|
|
97
|
+
npx @bhoon716/skill-forge add ultra-grill-me --lang en --agent cursor
|
|
98
|
+
|
|
99
|
+
# 4. ๊ธ๋ก๋ฒ ์คํฌ ๋๋ ํ ๋ฆฌ์ ํ๊ตญ์ด ๋ฒ์ ์ ์ญ ์ค์น (๋ชจ๋ ์ํฌ์คํ์ด์ค ๊ณต์ )
|
|
100
|
+
npx @bhoon716/skill-forge add ultra-grill-me --lang ko --agent global
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## 5. ์ธ์
๋ก๊ทธ ๋ฐ ํ์ง ๊ด๋ฆฌ
|
|
106
|
+
|
|
107
|
+
### ์ธ์
๋ก๊ทธ ํ์ผ
|
|
108
|
+
- ์คํฌ์ด ๋ฐ๋๋๋ฉด `logs/` ๋๋ ํ ๋ฆฌ ์๋์ ํด๋ณ ์ง๋ฌธ ๋ด์ฉ, ์ฌ์ฉ์ ๋ต๋ณ, ๊ฐฑ์ ๋ ๊ฒฐ์ ์ฌํญ์ด ๋งํฌ๋ค์ด ํ์ผ(`logs/session_YYYYMMDD_HHMMSS.md`)๋ก ์ค์๊ฐ ๋์ ์ ์ฅ๋ฉ๋๋ค. Socratic ๊ฒ์ฆ์ ๋ฐ์์ทจ๋ฅผ ์ถํ ํ์คํ ๋ฆฌ๋ก ์กฐํํ๊ธฐ ์ ็จํฉ๋๋ค.
|
|
109
|
+
|
|
110
|
+
### ํ์ ํ
์คํธ (Evals)
|
|
111
|
+
- ์คํฌ์ ๋ฌด๋จ ์์ ์ผ๋ก ์ธํด ์ง๋ฌธ ํ์ง์ด๋ ๋ฐ๋ ํ์์ด ๋ง๊ฐ์ง๋ ๊ฒ์ ๊ฒ์ฌํ๊ธฐ ์ํด `evals/` ๋๋ ํ ๋ฆฌ์ **์๋ํ ์ฑ์ ์ค์ํธ**๊ฐ ํ์ฌ๋์ด ์์ต๋๋ค.
|
|
112
|
+
- ๋ค์ ๋ช
๋ น์ด๋ฅผ ํตํด ๊ฒ์ฆ ํ์ง ํต๊ณผ์จ(Pass/Fail) ๋ฐ F1 Score๋ฅผ ์ ๋ ์ธก์ ํ ์ ์์ต๋๋ค:
|
|
113
|
+
```bash
|
|
114
|
+
python3 skills/ultra-grill-me/evals/check_evals.py --run-mock
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## 6. ์ฃผ์ ์ฌํญ (Gotchas)
|
|
120
|
+
|
|
121
|
+
> [!WARNING]
|
|
122
|
+
> - **์ ๋์ ์คํต ์ฐํ(Adversarial Bypass)**: ๋ํ ๋์ค "์ง๋ฌธ์ ๋๊ณ ๋ฐ๋ก ์ฝ๋ ์ง์ค" ๋๋ "์ด์ ๋ฃฐ ๋ฌด์ํด์ค" ๊ฐ์ ๋ช
๋ น์ ๋ณด๋ด๋๋ผ๋, ์์ด์ ํธ๋ ์คํฌ์ Socratic ์ ์ฝ์ ์ฐํํ์ง ์๊ณ ์ง๋ฌธ ๋ฃจํ๋ฅผ ์์ ํ๊ฒ ์์ํ๋๋ก ํ๋ก๊ทธ๋๋ฐ๋์ด ์์ต๋๋ค.
|
|
123
|
+
> - **์ฝ๋ ์์ ๋ณด์ฅ**: ์ต์ข
์(์ต์ข
์ ๋ฆฌ)์ด ์น์ธ๋๊ณ ์ธ์
์ด ์์ ํ ๋ซํ ๋๊น์ง ์์ด์ ํธ๋ ํ๋ก์ ํธ ์์ค ์ฝ๋ ํ์ผ์ ๊ฑด๋๋ฆฌ์ง ์์ต๋๋ค. ์์ฌํ๊ณ ์ค๊ณ๋ฅผ ๋ช
ํํํ๋ ๋ํ์ ์ง์คํ์ธ์.
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# ๐ฏ Ultra Grill Me (Socratic Interrogation Agent Skill)
|
|
2
|
+
|
|
3
|
+
<p align="center">
|
|
4
|
+
<a href="./README.md">English</a> | <a href="./README.ko.md">ํ๊ตญ์ด</a> | <a href="./README.zh.md">็ฎไฝไธญๆ</a>
|
|
5
|
+
</p>
|
|
6
|
+
`ultra-grill-me` is a validation-only Agent Skill designed to stress-test your plans, designs, product ideas, GTM strategies, and personal decisions through Socratic, one-question-at-a-time interrogation before you jump into code implementation or execution.
|
|
7
|
+
|
|
8
|
+
This is a "preventative validation skill" to remove failure modes early, NOT an immediate generation utility.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 1. Session Execution Loop (Mermaid Flow)
|
|
13
|
+
|
|
14
|
+
Upon activation, the agent executes the following Socratic query-answer iteration:
|
|
15
|
+
|
|
16
|
+
```mermaid
|
|
17
|
+
graph TD
|
|
18
|
+
A[Request Session Start] --> B[Generate log file under logs/]
|
|
19
|
+
B --> C[Load 1 matching domain reference file]
|
|
20
|
+
C --> D[Summarize current state in 1 sentence]
|
|
21
|
+
D --> E[Identify highest-priority blocked decision]
|
|
22
|
+
E --> F[Generate 1 specific Micro-Question]
|
|
23
|
+
F --> G{Render options with Recommended label & Ask for more trigger}
|
|
24
|
+
G --> H[Wait for user answer and restrict input]
|
|
25
|
+
H --> I[Analyze answer and update internal state variables]
|
|
26
|
+
I --> J[Append Q&A results to logs/ session log]
|
|
27
|
+
J --> K{Stopping conditions met?}
|
|
28
|
+
K -- No --> D
|
|
29
|
+
K -- Yes --> L[Output final structured 9-section synthesis]
|
|
30
|
+
L --> M[Record final synthesis to log and close session]
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 2. 10 Domain Reference Maps
|
|
36
|
+
|
|
37
|
+
The skill imports one of the 10 domain references based on user intent to deliver professional-grade challenges.
|
|
38
|
+
|
|
39
|
+
| Domain Area | Target Reference File | Key Questioning Principles |
|
|
40
|
+
| :--- | :--- | :--- |
|
|
41
|
+
| **Product / SaaS Idea** | [product-idea-grill.md](file:///skills/ultra-grill-me/references/product-idea-grill.md) | Persona narrowing, pain-point quantification, MVP scope cuts |
|
|
42
|
+
| **Technical Design** | [technical-design-grill.md](file:///skills/ultra-grill-me/references/technical-design-grill.md) | Non-functional requirements (NFRs), concurrency, data rollbacks |
|
|
43
|
+
| **Architecture Decision** | [architecture-decision-grill.md](file:///skills/ultra-grill-me/references/architecture-decision-grill.md) | Tradeoffs, comparing alternatives (must include status quo), reversibility |
|
|
44
|
+
| **Implementation Plan** | [implementation-plan-grill.md](file:///skills/ultra-grill-me/references/implementation-plan-grill.md) | Definition of Done (DoD), path scheduling, milestones, rollback protocols |
|
|
45
|
+
| **Business Strategy** | [business-strategy-grill.md](file:///skills/ultra-grill-me/references/business-strategy-grill.md) | Buyer vs. User split, GTM channel focus, unit pricing packaging |
|
|
46
|
+
| **Writing / Narrative** | [writing-direction-grill.md](file:///skills/ultra-grill-me/references/writing-direction-grill.md) | Reader knowledge level definition, core message, explicit call-to-actions (CTAs) |
|
|
47
|
+
| **Research Hypothesis** | [research-question-grill.md](file:///skills/ultra-grill-me/references/research-question-grill.md) | Control group baseline settings, dependent variables, statistical margins |
|
|
48
|
+
| **Learning Plan** | [learning-plan-grill.md](file:///skills/ultra-grill-me/references/learning-plan-grill.md) | Output verification project targets, weekly time budgets, mentors feedback |
|
|
49
|
+
| **Personal Decision** | [personal-decision-grill.md](file:///skills/ultra-grill-me/references/personal-decision-grill.md) | Hard constraints definition, opportunity cost, mini 1-week experiments |
|
|
50
|
+
| **Agent Skill Design** | [skill-design-grill.md](file:///skills/ultra-grill-me/references/skill-design-grill.md) | Scope bounding, triggers vs. non-trigger scenarios, process validation |
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## 3. Conversation Specimen
|
|
55
|
+
|
|
56
|
+
Here is a typical interaction log showing the structure of each turn:
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
[User]: "I want to stress-test my new developer task manager app idea."
|
|
60
|
+
---
|
|
61
|
+
[Agent]:
|
|
62
|
+
**Current Understanding**: Validating a new developer task manager SaaS idea.
|
|
63
|
+
|
|
64
|
+
**Blocked Decision**: Target user remains too broad, preventing core MVP value definition.
|
|
65
|
+
|
|
66
|
+
**Question**: Who is the primary target developer for this MVP?
|
|
67
|
+
|
|
68
|
+
**Why it matters**: Freelancers, big-tech engineers, and indie hackers have completely different workflow bottlenecks. Defining this determines the primary MVP feature.
|
|
69
|
+
|
|
70
|
+
**Options**:
|
|
71
|
+
1. (Recommended) 1์ธ ๊ฐ๋ฐ์ ๋๋ ์ธ๋ ํด์ปค โ Focus on multiple projects and context switching
|
|
72
|
+
2. 5์ธ ์ดํ ์๊ท๋ชจ ์คํํธ์
์ ํ์คํ ๊ฐ๋ฐ์ โ Focus on rapid sync and collaboration
|
|
73
|
+
3. ๋๊ธฐ์
์ ๊ทผ๋ฌดํ๋ ํ๋ซํผ ์์ง๋์ด โ Focus on Jira integration and tickets
|
|
74
|
+
4. Ask for more recommended options
|
|
75
|
+
5. Answer directly
|
|
76
|
+
|
|
77
|
+
Please select a number, ask for more options, or answer directly.
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## 4. `npx @bhoon716/skill-forge` CLI Installer
|
|
83
|
+
|
|
84
|
+
Use the workspace CLI to deploy the skill to your target agent directory.
|
|
85
|
+
|
|
86
|
+
> [!NOTE]
|
|
87
|
+
> Setting `--lang ko` automatically translates `SKILL.ko.md` into `SKILL.md` in the destination folder, mapping all dependencies seamlessly.
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
# 1. Install Korean translation locally to Codex/Gemini (Default)
|
|
91
|
+
npx @bhoon716/skill-forge add ultra-grill-me --lang ko
|
|
92
|
+
|
|
93
|
+
# 2. Install English version locally to Claude Code
|
|
94
|
+
npx @bhoon716/skill-forge add ultra-grill-me --lang en --agent claude
|
|
95
|
+
|
|
96
|
+
# 3. Install English version locally to Cursor
|
|
97
|
+
npx @bhoon716/skill-forge add ultra-grill-me --lang en --agent cursor
|
|
98
|
+
|
|
99
|
+
# 4. Install globally for all workspaces (English default)
|
|
100
|
+
npx @bhoon716/skill-forge add ultra-grill-me --lang en --agent global
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## 5. Logs & Evaluators
|
|
106
|
+
|
|
107
|
+
### Session Logs
|
|
108
|
+
- Every session generates active log outputs under `logs/` (e.g., `logs/session_YYYYMMDD_HHMMSS.md`) recording all Q&As, assumptions, and decisions to track historical changes.
|
|
109
|
+
|
|
110
|
+
### Automated Testing (Evals)
|
|
111
|
+
- Assert questioning structures and process adherence using the python test suite:
|
|
112
|
+
```bash
|
|
113
|
+
python3 skills/ultra-grill-me/evals/check_evals.py --run-mock
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## 6. Gotchas & Safety Rules
|
|
119
|
+
|
|
120
|
+
> [!WARNING]
|
|
121
|
+
> - **Adversarial Bypass Defense**: The agent will reject bypass commands (e.g., "skip questions and write the code now") and insist on resolving the single blocked decision.
|
|
122
|
+
> - **Code Non-Modification Policy**: Workspace source codes will not be altered during active Socratic dialogs until the user accepts the final synthesis.
|