@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.
Files changed (37) hide show
  1. package/LICENSE +21 -0
  2. package/README.ko.md +112 -0
  3. package/README.md +112 -0
  4. package/README.zh.md +115 -0
  5. package/bin/cli.js +386 -0
  6. package/package.json +31 -0
  7. package/skills/ultra-grill-me/README.ko.md +123 -0
  8. package/skills/ultra-grill-me/README.md +122 -0
  9. package/skills/ultra-grill-me/README.zh.md +122 -0
  10. package/skills/ultra-grill-me/SKILL.ko.md +299 -0
  11. package/skills/ultra-grill-me/SKILL.md +130 -0
  12. package/skills/ultra-grill-me/SKILL.zh.md +140 -0
  13. package/skills/ultra-grill-me/evals/check_evals.py +134 -0
  14. package/skills/ultra-grill-me/evals/trigger_test_cases.json +98 -0
  15. package/skills/ultra-grill-me/examples/should-not-trigger.md +86 -0
  16. package/skills/ultra-grill-me/examples/should-trigger.md +254 -0
  17. package/skills/ultra-grill-me/logs/template.md +41 -0
  18. package/skills/ultra-grill-me/references/architecture-decision-grill.ko.md +87 -0
  19. package/skills/ultra-grill-me/references/architecture-decision-grill.md +68 -0
  20. package/skills/ultra-grill-me/references/business-strategy-grill.ko.md +88 -0
  21. package/skills/ultra-grill-me/references/business-strategy-grill.md +70 -0
  22. package/skills/ultra-grill-me/references/implementation-plan-grill.ko.md +87 -0
  23. package/skills/ultra-grill-me/references/implementation-plan-grill.md +70 -0
  24. package/skills/ultra-grill-me/references/learning-plan-grill.ko.md +87 -0
  25. package/skills/ultra-grill-me/references/learning-plan-grill.md +68 -0
  26. package/skills/ultra-grill-me/references/personal-decision-grill.ko.md +98 -0
  27. package/skills/ultra-grill-me/references/personal-decision-grill.md +71 -0
  28. package/skills/ultra-grill-me/references/product-idea-grill.ko.md +87 -0
  29. package/skills/ultra-grill-me/references/product-idea-grill.md +67 -0
  30. package/skills/ultra-grill-me/references/research-question-grill.ko.md +87 -0
  31. package/skills/ultra-grill-me/references/research-question-grill.md +68 -0
  32. package/skills/ultra-grill-me/references/skill-design-grill.ko.md +88 -0
  33. package/skills/ultra-grill-me/references/skill-design-grill.md +70 -0
  34. package/skills/ultra-grill-me/references/technical-design-grill.ko.md +88 -0
  35. package/skills/ultra-grill-me/references/technical-design-grill.md +66 -0
  36. package/skills/ultra-grill-me/references/writing-direction-grill.ko.md +88 -0
  37. 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.