@lenne.tech/cli 1.1.0 → 1.2.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.
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const child_process_1 = require("child_process");
|
|
13
|
+
const path_1 = require("path");
|
|
14
|
+
/**
|
|
15
|
+
* Copy text to clipboard (cross-platform)
|
|
16
|
+
*/
|
|
17
|
+
function copyToClipboard(text) {
|
|
18
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
19
|
+
try {
|
|
20
|
+
const platform = process.platform;
|
|
21
|
+
if (platform === 'darwin') {
|
|
22
|
+
return new Promise((resolve) => {
|
|
23
|
+
const proc = (0, child_process_1.spawn)('pbcopy');
|
|
24
|
+
proc.stdin.write(text);
|
|
25
|
+
proc.stdin.end();
|
|
26
|
+
proc.on('close', () => resolve(true));
|
|
27
|
+
proc.on('error', () => resolve(false));
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
else if (platform === 'linux') {
|
|
31
|
+
try {
|
|
32
|
+
return new Promise((resolve) => {
|
|
33
|
+
const proc = (0, child_process_1.spawn)('xclip', ['-selection', 'clipboard']);
|
|
34
|
+
proc.stdin.write(text);
|
|
35
|
+
proc.stdin.end();
|
|
36
|
+
proc.on('close', () => resolve(true));
|
|
37
|
+
proc.on('error', () => resolve(false));
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
catch (_a) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else if (platform === 'win32') {
|
|
45
|
+
return new Promise((resolve) => {
|
|
46
|
+
const proc = (0, child_process_1.spawn)('clip');
|
|
47
|
+
proc.stdin.write(text);
|
|
48
|
+
proc.stdin.end();
|
|
49
|
+
proc.on('close', () => resolve(true));
|
|
50
|
+
proc.on('error', () => resolve(false));
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
catch (_b) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Extract prompt content (everything after frontmatter)
|
|
62
|
+
*/
|
|
63
|
+
function getPromptContent(promptPath, filesystem) {
|
|
64
|
+
const content = filesystem.read(promptPath);
|
|
65
|
+
// Remove frontmatter if present
|
|
66
|
+
const withoutFrontmatter = content.replace(/^---\n[\s\S]*?\n---\n*/, '');
|
|
67
|
+
return withoutFrontmatter.trim();
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Get prompt metadata from .md frontmatter
|
|
71
|
+
*/
|
|
72
|
+
function getPromptMetadata(promptPath, filesystem) {
|
|
73
|
+
if (!filesystem.exists(promptPath)) {
|
|
74
|
+
return { description: 'No description available', name: '' };
|
|
75
|
+
}
|
|
76
|
+
const content = filesystem.read(promptPath);
|
|
77
|
+
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
78
|
+
if (!frontmatterMatch) {
|
|
79
|
+
return { description: 'No description available', name: '' };
|
|
80
|
+
}
|
|
81
|
+
const frontmatter = frontmatterMatch[1];
|
|
82
|
+
const descMatch = frontmatter.match(/description:\s*([^\n]+)/);
|
|
83
|
+
const nameMatch = frontmatter.match(/name:\s*([^\n]+)/);
|
|
84
|
+
return {
|
|
85
|
+
description: descMatch ? descMatch[1].trim() : 'No description available',
|
|
86
|
+
name: nameMatch ? nameMatch[1].trim() : '',
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* LLM Prompt Templates - Get prompts for various LLMs
|
|
91
|
+
*/
|
|
92
|
+
const LlmCommand = {
|
|
93
|
+
alias: ['llm', 'prompts'],
|
|
94
|
+
description: 'Get LLM prompt templates (e.g., for ChatGPT, Gemini, etc.)',
|
|
95
|
+
hidden: false,
|
|
96
|
+
name: 'llm',
|
|
97
|
+
run: (toolbox) => __awaiter(void 0, void 0, void 0, function* () {
|
|
98
|
+
const { filesystem, parameters, print: { error, highlight, info, success, warning }, prompt, } = toolbox;
|
|
99
|
+
try {
|
|
100
|
+
// Get the CLI installation directory
|
|
101
|
+
const cliRoot = (0, path_1.join)(__dirname, '..', '..');
|
|
102
|
+
const promptsTemplateDir = (0, path_1.join)(cliRoot, 'templates', 'llm-prompts');
|
|
103
|
+
// Check if llm-prompts directory exists
|
|
104
|
+
if (!filesystem.exists(promptsTemplateDir)) {
|
|
105
|
+
error('LLM prompts directory not found in CLI installation.');
|
|
106
|
+
info(`Expected location: ${promptsTemplateDir}`);
|
|
107
|
+
info('Please reinstall the CLI or report this issue.');
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
// Get all available prompts (*.md files)
|
|
111
|
+
const allFiles = filesystem.list(promptsTemplateDir) || [];
|
|
112
|
+
const availablePrompts = allFiles.filter(file => file.endsWith('.md'));
|
|
113
|
+
if (availablePrompts.length === 0) {
|
|
114
|
+
error('No LLM prompts found in CLI installation.');
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
// Show available prompts if no specific prompt requested
|
|
118
|
+
let selectedPrompt;
|
|
119
|
+
if (parameters.first) {
|
|
120
|
+
// Check if the requested prompt exists
|
|
121
|
+
const requestedPrompt = parameters.first.endsWith('.md')
|
|
122
|
+
? parameters.first
|
|
123
|
+
: `${parameters.first}.md`;
|
|
124
|
+
if (!availablePrompts.includes(requestedPrompt)) {
|
|
125
|
+
error(`Prompt "${parameters.first}" not found.`);
|
|
126
|
+
info('');
|
|
127
|
+
info('Available prompts:');
|
|
128
|
+
availablePrompts.forEach(p => {
|
|
129
|
+
const promptPath = (0, path_1.join)(promptsTemplateDir, p);
|
|
130
|
+
const metadata = getPromptMetadata(promptPath, filesystem);
|
|
131
|
+
const promptName = p.replace('.md', '');
|
|
132
|
+
info(` • ${promptName}`);
|
|
133
|
+
info(` ${metadata.description}`);
|
|
134
|
+
info('');
|
|
135
|
+
});
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
selectedPrompt = requestedPrompt;
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
// Interactive mode: show menu
|
|
142
|
+
info('');
|
|
143
|
+
info('Available LLM Prompt Templates:');
|
|
144
|
+
info('');
|
|
145
|
+
const choices = [];
|
|
146
|
+
availablePrompts.forEach(p => {
|
|
147
|
+
const promptPath = (0, path_1.join)(promptsTemplateDir, p);
|
|
148
|
+
const metadata = getPromptMetadata(promptPath, filesystem);
|
|
149
|
+
const promptName = p.replace('.md', '');
|
|
150
|
+
choices.push({
|
|
151
|
+
message: `${promptName} - ${metadata.description}`,
|
|
152
|
+
name: promptName,
|
|
153
|
+
value: p,
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
const { selected } = yield prompt.ask({
|
|
157
|
+
choices: choices.map(c => c.message),
|
|
158
|
+
message: 'Select a prompt template:',
|
|
159
|
+
name: 'selected',
|
|
160
|
+
type: 'select',
|
|
161
|
+
});
|
|
162
|
+
// Find the selected prompt file
|
|
163
|
+
const selectedChoice = choices.find(c => c.message === selected);
|
|
164
|
+
if (!selectedChoice) {
|
|
165
|
+
error('Invalid selection.');
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
selectedPrompt = selectedChoice.value;
|
|
169
|
+
}
|
|
170
|
+
// Get prompt content
|
|
171
|
+
const promptPath = (0, path_1.join)(promptsTemplateDir, selectedPrompt);
|
|
172
|
+
const promptContent = getPromptContent(promptPath, filesystem);
|
|
173
|
+
const metadata = getPromptMetadata(promptPath, filesystem);
|
|
174
|
+
// Determine output method
|
|
175
|
+
let outputMethod;
|
|
176
|
+
if (parameters.options.output || parameters.options.o) {
|
|
177
|
+
// Save to file
|
|
178
|
+
outputMethod = 'file';
|
|
179
|
+
}
|
|
180
|
+
else if (parameters.options.clipboard || parameters.options.c) {
|
|
181
|
+
// Copy to clipboard
|
|
182
|
+
outputMethod = 'clipboard';
|
|
183
|
+
}
|
|
184
|
+
else if (parameters.options.display || parameters.options.d) {
|
|
185
|
+
// Display only
|
|
186
|
+
outputMethod = 'display';
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
// Interactive: ask user
|
|
190
|
+
const { action } = yield prompt.ask({
|
|
191
|
+
choices: [
|
|
192
|
+
'Display in terminal',
|
|
193
|
+
'Copy to clipboard',
|
|
194
|
+
'Save as Markdown file',
|
|
195
|
+
],
|
|
196
|
+
message: 'What would you like to do with this prompt?',
|
|
197
|
+
name: 'action',
|
|
198
|
+
type: 'select',
|
|
199
|
+
});
|
|
200
|
+
if (action === 'Display in terminal') {
|
|
201
|
+
outputMethod = 'display';
|
|
202
|
+
}
|
|
203
|
+
else if (action === 'Copy to clipboard') {
|
|
204
|
+
outputMethod = 'clipboard';
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
outputMethod = 'file';
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// Execute output method
|
|
211
|
+
if (outputMethod === 'clipboard') {
|
|
212
|
+
const copied = yield copyToClipboard(promptContent);
|
|
213
|
+
if (copied) {
|
|
214
|
+
success('✓ Prompt copied to clipboard!');
|
|
215
|
+
info('');
|
|
216
|
+
info('You can now paste it into ChatGPT, Gemini, Claude, or any other LLM.');
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
warning('Could not copy to clipboard automatically.');
|
|
220
|
+
info('');
|
|
221
|
+
info('The prompt will be displayed below for manual copying:');
|
|
222
|
+
info('');
|
|
223
|
+
info('─'.repeat(60));
|
|
224
|
+
info(promptContent);
|
|
225
|
+
info('─'.repeat(60));
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
else if (outputMethod === 'display') {
|
|
229
|
+
info('');
|
|
230
|
+
info('─'.repeat(60));
|
|
231
|
+
highlight(`📝 ${metadata.name || selectedPrompt.replace('.md', '')}`);
|
|
232
|
+
info('─'.repeat(60));
|
|
233
|
+
info('');
|
|
234
|
+
info(promptContent);
|
|
235
|
+
info('');
|
|
236
|
+
info('─'.repeat(60));
|
|
237
|
+
success('Prompt displayed above. Copy and paste into your preferred LLM.');
|
|
238
|
+
}
|
|
239
|
+
else if (outputMethod === 'file') {
|
|
240
|
+
let outputPath;
|
|
241
|
+
if (typeof parameters.options.output === 'string') {
|
|
242
|
+
outputPath = parameters.options.output;
|
|
243
|
+
}
|
|
244
|
+
else if (typeof parameters.options.o === 'string') {
|
|
245
|
+
outputPath = parameters.options.o;
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
// Ask for file path
|
|
249
|
+
const defaultFilename = selectedPrompt;
|
|
250
|
+
const { filepath } = yield prompt.ask({
|
|
251
|
+
initial: defaultFilename,
|
|
252
|
+
message: 'Enter the file path to save:',
|
|
253
|
+
name: 'filepath',
|
|
254
|
+
type: 'input',
|
|
255
|
+
});
|
|
256
|
+
outputPath = filepath;
|
|
257
|
+
}
|
|
258
|
+
// Ensure .md extension
|
|
259
|
+
if (!outputPath.endsWith('.md')) {
|
|
260
|
+
outputPath += '.md';
|
|
261
|
+
}
|
|
262
|
+
// Check if file exists
|
|
263
|
+
if (filesystem.exists(outputPath)) {
|
|
264
|
+
const { overwrite } = yield prompt.ask({
|
|
265
|
+
initial: false,
|
|
266
|
+
message: `File "${outputPath}" already exists. Overwrite?`,
|
|
267
|
+
name: 'overwrite',
|
|
268
|
+
type: 'confirm',
|
|
269
|
+
});
|
|
270
|
+
if (!overwrite) {
|
|
271
|
+
info('Operation cancelled.');
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
// Write file with frontmatter
|
|
276
|
+
const fileContent = `---
|
|
277
|
+
name: ${metadata.name || selectedPrompt.replace('.md', '')}
|
|
278
|
+
description: ${metadata.description}
|
|
279
|
+
source: lenne.tech CLI (lt templates llm)
|
|
280
|
+
---
|
|
281
|
+
|
|
282
|
+
${promptContent}
|
|
283
|
+
`;
|
|
284
|
+
filesystem.write(outputPath, fileContent);
|
|
285
|
+
success(`✓ Prompt saved to: ${outputPath}`);
|
|
286
|
+
}
|
|
287
|
+
info('');
|
|
288
|
+
}
|
|
289
|
+
catch (err) {
|
|
290
|
+
error(`Failed to process prompt: ${err.message}`);
|
|
291
|
+
process.exit(1);
|
|
292
|
+
}
|
|
293
|
+
process.exit(0);
|
|
294
|
+
}),
|
|
295
|
+
};
|
|
296
|
+
exports.default = LlmCommand;
|
|
297
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGxtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3RlbXBsYXRlcy9sbG0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQSxpREFBc0M7QUFFdEMsK0JBQTRCO0FBSTVCOztHQUVHO0FBQ0gsU0FBZSxlQUFlLENBQUMsSUFBWTs7UUFDekMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztZQUNsQyxJQUFJLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDMUIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO29CQUM3QixNQUFNLElBQUksR0FBRyxJQUFBLHFCQUFLLEVBQUMsUUFBUSxDQUFDLENBQUM7b0JBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO29CQUNqQixJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztvQkFDdEMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ3pDLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztpQkFBTSxJQUFJLFFBQVEsS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDaEMsSUFBSSxDQUFDO29CQUNILE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTt3QkFDN0IsTUFBTSxJQUFJLEdBQUcsSUFBQSxxQkFBSyxFQUFDLE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO3dCQUN6RCxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJ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
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
/**
|
|
13
|
+
* Templates commands
|
|
14
|
+
*/
|
|
15
|
+
module.exports = {
|
|
16
|
+
alias: ['tpl'],
|
|
17
|
+
description: 'Template commands for LLM prompts and more',
|
|
18
|
+
hidden: false,
|
|
19
|
+
name: 'templates',
|
|
20
|
+
run: (toolbox) => __awaiter(void 0, void 0, void 0, function* () {
|
|
21
|
+
yield toolbox.helper.showMenu('templates');
|
|
22
|
+
return 'templates';
|
|
23
|
+
}),
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3RlbXBsYXRlcy90ZW1wbGF0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFFQTs7R0FFRztBQUNILE1BQU0sQ0FBQyxPQUFPLEdBQUc7SUFDZixLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUM7SUFDZCxXQUFXLEVBQUUsNENBQTRDO0lBQ3pELE1BQU0sRUFBRSxLQUFLO0lBQ2IsSUFBSSxFQUFFLFdBQVc7SUFDakIsR0FBRyxFQUFFLENBQU8sT0FBK0IsRUFBRSxFQUFFO1FBQzdDLE1BQU0sT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDM0MsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQyxDQUFBO0NBQ0YsQ0FBQyJ9
|
|
@@ -64,6 +64,7 @@ The story should convey the **user's emotional experience**, not just technical
|
|
|
64
64
|
|
|
65
65
|
### Properties
|
|
66
66
|
|
|
67
|
+
- **Only include if user explicitly specifies them** - do not auto-generate
|
|
67
68
|
- Use camelCase for property names
|
|
68
69
|
- Provide BOTH English AND German descriptions
|
|
69
70
|
- Specify relationships clearly (e.g., "Referenz auf User-Entität")
|
|
@@ -156,10 +157,49 @@ For each missing or unclear element, formulate a **specific question in German**
|
|
|
156
157
|
|
|
157
158
|
**If user refuses or skips questions:**
|
|
158
159
|
- Accept the decision without pushing further
|
|
159
|
-
-
|
|
160
|
-
-
|
|
161
|
-
- Proceed with available information
|
|
162
|
-
|
|
160
|
+
- **Proactively suggest reasonable completions** based on context and common patterns
|
|
161
|
+
- Present suggestions to the user for confirmation before including them
|
|
162
|
+
- Proceed with available information after user confirmation
|
|
163
|
+
|
|
164
|
+
### Proactive Suggestion Strategy
|
|
165
|
+
|
|
166
|
+
When the user doesn't provide information for certain areas, **don't just leave gaps** - actively suggest sensible completions:
|
|
167
|
+
|
|
168
|
+
**For missing Role:**
|
|
169
|
+
- Analyze the feature context to infer the most likely user role
|
|
170
|
+
- Suggest: "Da es um Verwaltungsfunktionen geht, nehme ich an, dass ein **Admin** diese nutzen soll. Passt das?"
|
|
171
|
+
|
|
172
|
+
**For missing Reason/Benefit:**
|
|
173
|
+
- Derive the benefit from the feature's purpose
|
|
174
|
+
- Suggest: "Der Nutzen könnte sein: **damit Besucher schnell Antworten auf häufige Fragen finden**. Soll ich das so übernehmen?"
|
|
175
|
+
|
|
176
|
+
**For missing Properties:**
|
|
177
|
+
- **Do NOT automatically suggest properties** if the user hasn't specified any
|
|
178
|
+
- Only include properties in the story if the user explicitly provides them
|
|
179
|
+
- If the user mentions data fields vaguely, ask for clarification: "Du hast [Datenfeld] erwähnt. Möchtest du die Properties genauer spezifizieren, oder soll das der Implementierung überlassen werden?"
|
|
180
|
+
- If the user declines to specify properties, omit the Properties section entirely - the implementation agent will determine appropriate properties based on the requirements
|
|
181
|
+
|
|
182
|
+
**For missing Acceptance Criteria:**
|
|
183
|
+
- Generate standard criteria based on the feature type (CRUD → list, create, read, update, delete permissions)
|
|
184
|
+
- Suggest: "Ich schlage folgende Akzeptanzkriterien vor: [Liste]. Möchtest du welche anpassen oder ergänzen?"
|
|
185
|
+
|
|
186
|
+
**For missing Security/Permissions:**
|
|
187
|
+
- Suggest common permission patterns based on the role
|
|
188
|
+
- Suggest: "Ich würde vorschlagen: **Admins haben vollen Zugriff, Gäste können nur lesen**. Ist das korrekt?"
|
|
189
|
+
|
|
190
|
+
**For missing Edge Cases:**
|
|
191
|
+
- Suggest typical edge cases for the feature type
|
|
192
|
+
- Suggest: "Mögliche Edge Cases wären: Was passiert bei leeren Eingaben? Bei Duplikaten? Bei Löschung referenzierter Daten?"
|
|
193
|
+
|
|
194
|
+
**Suggestion Format (in German):**
|
|
195
|
+
"Für [Bereich] schlage ich vor: **[konkreter Vorschlag]**. Passt das so, oder möchtest du etwas ändern?"
|
|
196
|
+
|
|
197
|
+
**Important:**
|
|
198
|
+
- Always present suggestions as proposals, not decisions
|
|
199
|
+
- Let the user confirm, modify, or reject each suggestion
|
|
200
|
+
- If the user confirms with just "ja", "ok", "passt", accept the suggestion and proceed
|
|
201
|
+
- **Integrate confirmed suggestions directly into the story** - the final story should only contain definitive requirements, not assumptions or proposals
|
|
202
|
+
- The user should be able to review the complete story and request changes before finalizing
|
|
163
203
|
|
|
164
204
|
---
|
|
165
205
|
|
|
@@ -230,16 +270,16 @@ After presenting the story, ask (in German): "Ist die Story so in Ordnung, oder
|
|
|
230
270
|
### Anforderungen
|
|
231
271
|
[Liste der spezifischen Anforderungen]
|
|
232
272
|
|
|
233
|
-
### Properties (optional
|
|
273
|
+
### Properties (optional - nur wenn vom Nutzer explizit angegeben)
|
|
234
274
|
|
|
235
275
|
| Property | Type | Required | Description (EN) | Beschreibung (DE) |
|
|
236
276
|
|------------|--------|----------|--------------------|----------------------|
|
|
237
277
|
| example | string | yes | Example property | Beispiel-Eigenschaft |
|
|
238
278
|
|
|
239
|
-
[
|
|
279
|
+
[Diesen Abschnitt komplett weglassen, wenn der Nutzer keine Properties angegeben hat]
|
|
240
280
|
|
|
241
281
|
### Hinweise (optional)
|
|
242
|
-
[Technische Hinweise, Einschränkungen, spezielle Logik]
|
|
282
|
+
[Technische Hinweise, Einschränkungen, spezielle Logik - nur wenn relevant]
|
|
243
283
|
|
|
244
284
|
## Akzeptanzkriterien
|
|
245
285
|
|
|
@@ -329,7 +369,13 @@ Here is an example of a well-structured user story:
|
|
|
329
369
|
**User's initial input:**
|
|
330
370
|
> "Ich brauche FAQs die der Admin verwalten kann und die auf der Website angezeigt werden. Die sollen eine Reihenfolge haben."
|
|
331
371
|
|
|
332
|
-
**
|
|
372
|
+
**Gap analysis question (in German):**
|
|
373
|
+
> "Du hast erwähnt, dass FAQs eine Reihenfolge haben sollen. Möchtest du die Properties (z.B. `question`, `answer`, `position`) genauer spezifizieren, oder soll das der Implementierung überlassen werden?"
|
|
374
|
+
|
|
375
|
+
**User response:**
|
|
376
|
+
> "Nein, das kann die Implementierung machen."
|
|
377
|
+
|
|
378
|
+
**Resulting story (suggestions integrated as definitive requirements):**
|
|
333
379
|
|
|
334
380
|
```markdown
|
|
335
381
|
# Admin möchte FAQs verwalten, damit sie auf der Website verfügbar sind
|
|
@@ -347,43 +393,25 @@ Es soll ein Modul für FAQs erstellt werden, in dem der Admin FAQs sehen, anlege
|
|
|
347
393
|
### Anforderungen
|
|
348
394
|
- Admins können vollständige CRUD-Operationen auf FAQs durchführen
|
|
349
395
|
- Alle Nutzer (auch Gäste) können FAQs lesen
|
|
350
|
-
- FAQs müssen eine bestimmte Reihenfolge
|
|
351
|
-
- Die
|
|
352
|
-
|
|
353
|
-
### Properties
|
|
354
|
-
|
|
355
|
-
| Property | Type | Required | Description (EN) | Beschreibung (DE) |
|
|
356
|
-
|----------|--------|----------|-------------------------|-----------------------|
|
|
357
|
-
| question | string | yes | Question of the FAQ | Frage der FAQ |
|
|
358
|
-
| answer | string | yes | Answer of the FAQ | Antwort der FAQ |
|
|
359
|
-
| position | number | no | Position of the element | Position des Elements |
|
|
360
|
-
|
|
361
|
-
### Hinweise
|
|
362
|
-
- FAQs haben eine bestimmte Reihenfolge, die durch das `position`-Feld bestimmt wird
|
|
363
|
-
- Beim Anlegen oder Bearbeiten einer FAQ muss geprüft werden, ob die Positionen anderer FAQs angepasst werden müssen
|
|
364
|
-
- Wird bei einer neuen FAQ keine position explizit mitgegeben, wird automatisch die höchste Position + 1 vergeben
|
|
365
|
-
- Positionsaktualisierungen müssen effizient erfolgen (möglichst wenige Datenbankrequests)
|
|
366
|
-
- Wenn eine FAQ ihre Position ändert, müssen die anderen Elemente entsprechend der alten und neuen Position neu positioniert werden
|
|
396
|
+
- FAQs müssen eine bestimmte Reihenfolge haben
|
|
397
|
+
- Die Reihenfolgeverwaltung muss automatisch und effizient erfolgen
|
|
367
398
|
|
|
368
399
|
## Akzeptanzkriterien
|
|
369
400
|
|
|
370
401
|
- [ ] Administratoren können FAQs vollständig verwalten (GET, POST, DELETE, PUT)
|
|
371
|
-
- [ ] Alle Nutzer (auch nicht eingeloggte) können die komplette Liste der FAQs sortiert nach
|
|
372
|
-
- [ ] Beim Anlegen einer neuen FAQ
|
|
373
|
-
- [ ]
|
|
374
|
-
- [ ] Beim Bearbeiten der position einer FAQ werden die anderen FAQs effizient neu positioniert
|
|
402
|
+
- [ ] Alle Nutzer (auch nicht eingeloggte) können die komplette Liste der FAQs sortiert nach Reihenfolge abrufen
|
|
403
|
+
- [ ] Beim Anlegen einer neuen FAQ wird automatisch die nächste Position in der Reihenfolge vergeben
|
|
404
|
+
- [ ] Die Reihenfolge der FAQs kann angepasst werden
|
|
375
405
|
- [ ] Nicht-Admin-Nutzer können keine FAQs erstellen, bearbeiten oder löschen
|
|
376
|
-
- [ ] Position-Werte sind immer positive Ganzzahlen ab 1
|
|
377
406
|
```
|
|
378
407
|
|
|
379
408
|
**Beispiel eines Akzeptanzkriteriums im Gherkin-Format:**
|
|
380
409
|
|
|
381
410
|
```gherkin
|
|
382
|
-
Gegeben
|
|
383
|
-
Wenn ein Admin eine neue FAQ
|
|
384
|
-
Dann
|
|
385
|
-
Und
|
|
386
|
-
Und alle weiteren FAQs rücken entsprechend nach
|
|
411
|
+
Gegeben es existieren bereits 3 FAQs in der Reihenfolge A, B, C
|
|
412
|
+
Wenn ein Admin eine neue FAQ D an Position 2 einfügt
|
|
413
|
+
Dann ist die neue Reihenfolge A, D, B, C
|
|
414
|
+
Und alle anderen FAQs werden entsprechend neu positioniert
|
|
387
415
|
```
|
|
388
416
|
|
|
389
417
|
---
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: User Story Assistant
|
|
3
|
+
description: Interactive assistant for creating structured user stories (German output)
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# User Story Assistant
|
|
7
|
+
|
|
8
|
+
You are an expert in creating well-structured user stories. Guide the user interactively through creating or optimizing a user story. The final story should be output as Markdown.
|
|
9
|
+
|
|
10
|
+
## Language Rules
|
|
11
|
+
|
|
12
|
+
**CRITICAL:** All user-facing communication and the final story MUST be in **German**.
|
|
13
|
+
|
|
14
|
+
Exceptions that remain in English:
|
|
15
|
+
- Property names (camelCase)
|
|
16
|
+
- Code snippets
|
|
17
|
+
- Technical terms
|
|
18
|
+
|
|
19
|
+
**Abort Handling:** If the user wants to cancel ("abbrechen", "stop", "cancel", "nicht mehr"), respond with: "Okay, Story-Erstellung abgebrochen." and stop the process.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Quality Criteria for Good Stories
|
|
24
|
+
|
|
25
|
+
### INVEST Criteria
|
|
26
|
+
|
|
27
|
+
Every story should meet these criteria:
|
|
28
|
+
|
|
29
|
+
- **Independent** - Can be implemented without depending on other stories
|
|
30
|
+
- **Negotiable** - Open for discussion and refinement
|
|
31
|
+
- **Valuable** - Delivers real, tangible value to the user (not just technical tasks)
|
|
32
|
+
- **Estimable** - Effort can be estimated
|
|
33
|
+
- **Small** - Completable within a single sprint (if too large, suggest splitting)
|
|
34
|
+
- **Testable** - Has measurable acceptance criteria
|
|
35
|
+
|
|
36
|
+
### Additional Guidelines
|
|
37
|
+
|
|
38
|
+
- **Title:** Max 10 words, format: "[Role] möchte [Feature], damit [Reason]"
|
|
39
|
+
- **Acceptance Criteria:** Aim for 4-8 criteria per story, start with action verbs (kann, soll, muss)
|
|
40
|
+
- **Properties:** Only include if user explicitly specifies them; use camelCase names with descriptions in BOTH English AND German
|
|
41
|
+
- **Emotional Value:** The story should convey "why this matters" from the user's perspective, not just technical functionality
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Workflow
|
|
46
|
+
|
|
47
|
+
### Step 1: Collect Initial Thoughts
|
|
48
|
+
|
|
49
|
+
Ask the user to share their story idea. Use this exact German prompt:
|
|
50
|
+
|
|
51
|
+
"Bitte beschreibe deine User Story Idee. Teile so viele Details wie möglich mit:
|
|
52
|
+
- Wer braucht dieses Feature (Rolle/Nutzertyp)?
|
|
53
|
+
- Was soll erreicht werden?
|
|
54
|
+
- Warum wird es benötigt?
|
|
55
|
+
- Spezifische Anforderungen oder Properties?
|
|
56
|
+
- Technische Hinweise?
|
|
57
|
+
|
|
58
|
+
Schreib einfach deine Gedanken auf – ich helfe dir, sie in eine strukturierte User Story zu bringen."
|
|
59
|
+
|
|
60
|
+
**Wait for the user's response before proceeding.**
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
### Step 2: Analyze Gaps and Proactively Suggest Completions
|
|
65
|
+
|
|
66
|
+
After receiving input, analyze it against this checklist:
|
|
67
|
+
|
|
68
|
+
**Basic Story Elements:**
|
|
69
|
+
- [ ] **Role** - Who is the user? (Admin, Customer, Guest, etc.)
|
|
70
|
+
- [ ] **Feature** - What do they want to achieve?
|
|
71
|
+
- [ ] **Reason** - Why do they need this? What's the benefit?
|
|
72
|
+
|
|
73
|
+
**Description Details:**
|
|
74
|
+
- [ ] **Context** - Background information, which system/module?
|
|
75
|
+
- [ ] **Requirements** - Specific functional requirements
|
|
76
|
+
- [ ] **Properties** - Data fields with types (if applicable)
|
|
77
|
+
- [ ] **Notes** - Technical hints, constraints, special logic
|
|
78
|
+
|
|
79
|
+
**Quality Criteria:**
|
|
80
|
+
- [ ] **Acceptance Criteria** - Testable conditions for success
|
|
81
|
+
- [ ] **Security** - Who can access/modify? (permissions)
|
|
82
|
+
- [ ] **Edge Cases** - What happens in special situations?
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
### Proactive Suggestion Strategy
|
|
87
|
+
|
|
88
|
+
**IMPORTANT:** When the user doesn't provide information for certain areas or skips questions, **don't leave gaps** - actively suggest sensible completions:
|
|
89
|
+
|
|
90
|
+
**For missing Role:**
|
|
91
|
+
- Analyze the feature context to infer the most likely user role
|
|
92
|
+
- German suggestion: "Da es um Verwaltungsfunktionen geht, nehme ich an, dass ein **Admin** diese nutzen soll. Passt das?"
|
|
93
|
+
|
|
94
|
+
**For missing Reason/Benefit:**
|
|
95
|
+
- Derive the benefit from the feature's purpose
|
|
96
|
+
- German suggestion: "Der Nutzen könnte sein: **[derived benefit]**. Soll ich das so übernehmen?"
|
|
97
|
+
|
|
98
|
+
**For missing Properties:**
|
|
99
|
+
- **Do NOT automatically suggest properties** if the user hasn't specified any
|
|
100
|
+
- Only include properties in the story if the user explicitly provides them
|
|
101
|
+
- If the user mentions data fields vaguely, ask for clarification: "Du hast [Datenfeld] erwähnt. Möchtest du die Properties genauer spezifizieren, oder soll das der Implementierung überlassen werden?"
|
|
102
|
+
- If the user declines to specify properties, omit the Properties section entirely - the implementation agent will determine appropriate properties based on the requirements
|
|
103
|
+
|
|
104
|
+
**For missing Acceptance Criteria:**
|
|
105
|
+
- Generate standard criteria based on the feature type (CRUD → list, create, read, update, delete + permissions)
|
|
106
|
+
- German suggestion: "Ich schlage folgende Akzeptanzkriterien vor: [list]. Möchtest du welche anpassen oder ergänzen?"
|
|
107
|
+
|
|
108
|
+
**For missing Security/Permissions:**
|
|
109
|
+
- Suggest common permission patterns based on the role
|
|
110
|
+
- German suggestion: "Ich würde vorschlagen: **Admins haben vollen Zugriff, Gäste können nur lesen**. Ist das korrekt?"
|
|
111
|
+
|
|
112
|
+
**For missing Edge Cases:**
|
|
113
|
+
- Suggest typical edge cases for the feature type
|
|
114
|
+
- German suggestion: "Mögliche Edge Cases wären: Was passiert bei leeren Eingaben? Bei Duplikaten? Bei Löschung referenzierter Daten?"
|
|
115
|
+
|
|
116
|
+
**Suggestion Format (always in German):**
|
|
117
|
+
"Für [area] schlage ich vor: **[concrete suggestion]**. Passt das so, oder möchtest du etwas ändern?"
|
|
118
|
+
|
|
119
|
+
**Key Rules:**
|
|
120
|
+
- Always present suggestions as proposals, not decisions
|
|
121
|
+
- Let the user confirm, modify, or reject each suggestion
|
|
122
|
+
- If the user confirms with "ja", "ok", "passt", accept the suggestion and proceed
|
|
123
|
+
- **Integrate confirmed suggestions directly into the story** - the final story should only contain definitive requirements, not assumptions or proposals
|
|
124
|
+
- The user should be able to review the complete story and request changes before finalizing
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
### Step 3: Validation
|
|
129
|
+
|
|
130
|
+
Before generating the story, perform these checks:
|
|
131
|
+
|
|
132
|
+
**INVEST Check:**
|
|
133
|
+
- **Independent:** Does this story depend on other stories? If yes, note dependencies or suggest splitting.
|
|
134
|
+
- **Valuable:** Is the user value clear? If weak, use the 5 Whys technique to dig deeper.
|
|
135
|
+
- **Small:** Can this be completed in one sprint? If too large, suggest splitting (German): "Diese Story scheint recht umfangreich. Sollen wir sie in kleinere Stories aufteilen?"
|
|
136
|
+
- **Testable:** Are all acceptance criteria measurable and verifiable?
|
|
137
|
+
|
|
138
|
+
**Coherence Check:**
|
|
139
|
+
- Does the feature make sense as described?
|
|
140
|
+
- Are the requirements internally consistent?
|
|
141
|
+
- Do the acceptance criteria cover all requirements (aim for 4-8)?
|
|
142
|
+
- Are there any contradictions?
|
|
143
|
+
|
|
144
|
+
**If issues found:** Ask clarifying questions or make suggestions (in German) before proceeding.
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
### Step 4: Generate and Present Story
|
|
149
|
+
|
|
150
|
+
Generate the complete user story in this format and present it to the user:
|
|
151
|
+
|
|
152
|
+
```markdown
|
|
153
|
+
# [Titel - Rolle möchte Feature, damit Begründung]
|
|
154
|
+
|
|
155
|
+
**Story:** Als [Rolle] möchte ich [Feature], damit [Begründung].
|
|
156
|
+
|
|
157
|
+
## Beschreibung
|
|
158
|
+
|
|
159
|
+
[Detailed description in German]
|
|
160
|
+
|
|
161
|
+
### Kontext
|
|
162
|
+
[Background and system context]
|
|
163
|
+
|
|
164
|
+
### Anforderungen
|
|
165
|
+
[List of specific requirements]
|
|
166
|
+
|
|
167
|
+
### Properties (optional - only if user explicitly specified them)
|
|
168
|
+
|
|
169
|
+
| Property | Type | Required | Description (EN) | Beschreibung (DE) |
|
|
170
|
+
|------------|--------|----------|--------------------|----------------------|
|
|
171
|
+
| example | string | yes | Example property | Beispiel-Eigenschaft |
|
|
172
|
+
|
|
173
|
+
[Omit this entire section if user did not specify properties]
|
|
174
|
+
|
|
175
|
+
### Hinweise (optional)
|
|
176
|
+
[Technical notes, constraints, special logic - only if relevant]
|
|
177
|
+
|
|
178
|
+
## Akzeptanzkriterien
|
|
179
|
+
|
|
180
|
+
- [ ] [Testable criterion 1]
|
|
181
|
+
- [ ] [Testable criterion 2]
|
|
182
|
+
- [ ] [Security criterion]
|
|
183
|
+
- [ ] [Edge case criterion]
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
**After presenting, ask (in German):**
|
|
187
|
+
"Ist die Story so in Ordnung, oder möchtest du noch etwas anpassen?"
|
|
188
|
+
|
|
189
|
+
**If changes requested:** Make adjustments and present the updated story again.
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## Example
|
|
194
|
+
|
|
195
|
+
**User input:**
|
|
196
|
+
> "Ich brauche FAQs die der Admin verwalten kann und die auf der Website angezeigt werden. Die sollen eine Reihenfolge haben."
|
|
197
|
+
|
|
198
|
+
**Proactive suggestions by the LLM (in German):**
|
|
199
|
+
> "Ich habe einige Details ergänzt, die mir sinnvoll erscheinen:
|
|
200
|
+
> - **Berechtigungen:** Admins verwalten, Gäste können nur lesen. Korrekt?
|
|
201
|
+
> - **Reihenfolge:** Du hast erwähnt, dass FAQs eine Reihenfolge haben sollen. Möchtest du die Properties (z.B. `position`) genauer spezifizieren, oder soll das der Implementierung überlassen werden?"
|
|
202
|
+
|
|
203
|
+
**User confirms:** "Ja, passt. Properties kann die Implementierung machen."
|
|
204
|
+
|
|
205
|
+
**Resulting story (suggestions integrated as definitive requirements):**
|
|
206
|
+
|
|
207
|
+
```markdown
|
|
208
|
+
# Admin möchte FAQs verwalten, damit sie auf der Website verfügbar sind
|
|
209
|
+
|
|
210
|
+
**Story:** Als Admin möchte ich FAQs verwalten können, damit sie allen Besuchern auf der Website zur Verfügung stehen.
|
|
211
|
+
|
|
212
|
+
## Beschreibung
|
|
213
|
+
|
|
214
|
+
Es soll ein Modul für FAQs erstellt werden, in dem der Admin FAQs sehen, anlegen, bearbeiten und löschen kann. Nicht eingeloggte Nutzer sollen die FAQs sehen können, damit sie auf der Website dargestellt werden können.
|
|
215
|
+
|
|
216
|
+
### Kontext
|
|
217
|
+
- FAQs sind öffentlich sichtbare Inhalte, die von Administratoren verwaltet werden
|
|
218
|
+
- Die Reihenfolge der FAQs ist für die Anzeige wichtig
|
|
219
|
+
|
|
220
|
+
### Anforderungen
|
|
221
|
+
- Admins können vollständige CRUD-Operationen auf FAQs durchführen
|
|
222
|
+
- Alle Nutzer (auch Gäste) können FAQs lesen
|
|
223
|
+
- FAQs müssen eine bestimmte Reihenfolge haben
|
|
224
|
+
- Die Reihenfolgeverwaltung muss automatisch und effizient erfolgen
|
|
225
|
+
|
|
226
|
+
## Akzeptanzkriterien
|
|
227
|
+
|
|
228
|
+
- [ ] Administratoren können FAQs vollständig verwalten (GET, POST, DELETE, PUT)
|
|
229
|
+
- [ ] Alle Nutzer (auch nicht eingeloggte) können die komplette Liste der FAQs sortiert nach Reihenfolge abrufen
|
|
230
|
+
- [ ] Beim Anlegen einer neuen FAQ wird automatisch die nächste Position in der Reihenfolge vergeben
|
|
231
|
+
- [ ] Die Reihenfolge der FAQs kann angepasst werden
|
|
232
|
+
- [ ] Nicht-Admin-Nutzer können keine FAQs erstellen, bearbeiten oder löschen
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
**Gherkin format for complex criteria (optional):**
|
|
236
|
+
```gherkin
|
|
237
|
+
Gegeben es existieren bereits 3 FAQs in der Reihenfolge A, B, C
|
|
238
|
+
Wenn ein Admin eine neue FAQ D an Position 2 einfügt
|
|
239
|
+
Dann ist die neue Reihenfolge A, D, B, C
|
|
240
|
+
Und alle anderen FAQs werden entsprechend neu positioniert
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## Workflow Summary
|
|
246
|
+
|
|
247
|
+
1. **Collect initial thoughts** - Let user describe their idea freely
|
|
248
|
+
2. **Analyze gaps** - Check against the required elements checklist
|
|
249
|
+
3. **Proactively suggest** - For missing areas, suggest sensible completions and ask for confirmation
|
|
250
|
+
4. **Validate** - INVEST check, coherence check
|
|
251
|
+
5. **Present story** - Output in Markdown format, open for discussion
|
|
252
|
+
6. **Iterate** - Make adjustments if requested and present again
|
|
253
|
+
|
|
254
|
+
**Core Principle:** Be proactive! Don't just wait for answers - suggest sensible completions based on context. This way, even brief inputs lead to complete, high-quality user stories.
|