@girardmedia/bootspring 2.5.0 → 2.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -403
- package/bin/bootspring.js +1 -96
- package/dist/cli/index.js +65134 -0
- package/dist/cli-launcher.js +92 -0
- package/dist/core/index.d.ts +2110 -5582
- package/dist/core/index.js +2 -0
- package/dist/core.js +21123 -5413
- package/dist/mcp/index.d.ts +357 -1
- package/dist/mcp/index.js +2 -0
- package/dist/mcp-server.js +51948 -1976
- package/package.json +27 -63
- package/scripts/postinstall.cjs +144 -0
- package/LICENSE +0 -29
- package/dist/cli/index.cjs +0 -20776
- package/generators/api-docs.js +0 -827
- package/generators/decisions.js +0 -655
- package/generators/generate.js +0 -595
- package/generators/health.js +0 -942
- package/generators/index.ts +0 -82
- package/generators/presets/full.js +0 -28
- package/generators/presets/index.js +0 -12
- package/generators/presets/minimal.js +0 -29
- package/generators/presets/standard.js +0 -28
- package/generators/questionnaire.js +0 -414
- package/generators/sections/advanced.js +0 -136
- package/generators/sections/ai.js +0 -106
- package/generators/sections/auth.js +0 -89
- package/generators/sections/backend.js +0 -146
- package/generators/sections/business.js +0 -118
- package/generators/sections/content.js +0 -300
- package/generators/sections/deployment.js +0 -139
- package/generators/sections/features.js +0 -122
- package/generators/sections/frontend.js +0 -118
- package/generators/sections/identity.js +0 -76
- package/generators/sections/index.js +0 -40
- package/generators/sections/instructions.js +0 -146
- package/generators/sections/payments.js +0 -104
- package/generators/sections/plugins.js +0 -142
- package/generators/sections/pre-build.js +0 -130
- package/generators/sections/security.js +0 -127
- package/generators/sections/technical.js +0 -171
- package/generators/sections/testing.js +0 -125
- package/generators/sections/workflow.js +0 -104
- package/generators/sprint.js +0 -675
- package/generators/templates/agents.template.js +0 -199
- package/generators/templates/assistant-context.template.js +0 -83
- package/generators/templates/build-planning.template.js +0 -708
- package/generators/templates/claude.template.js +0 -379
- package/generators/templates/content.template.js +0 -819
- package/generators/templates/index.js +0 -16
- package/generators/templates/planning.template.js +0 -515
- package/generators/templates/seed.template.js +0 -109
- package/generators/visual-doc-generator.js +0 -910
- package/scripts/postinstall.js +0 -197
- /package/{claude-commands → assets/claude-commands}/agent.md +0 -0
- /package/{claude-commands → assets/claude-commands}/bs.md +0 -0
- /package/{claude-commands → assets/claude-commands}/build.md +0 -0
- /package/{claude-commands → assets/claude-commands}/skill.md +0 -0
- /package/{claude-commands → assets/claude-commands}/todo.md +0 -0
|
@@ -1,379 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CLAUDE.md Template Generator
|
|
3
|
-
*
|
|
4
|
-
* Generates a rich CLAUDE.md from questionnaire answers.
|
|
5
|
-
*
|
|
6
|
-
* @package bootspring
|
|
7
|
-
* @module generators/templates/claude
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
const utils = require('../../core/utils');
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Generate CLAUDE.md content from config
|
|
14
|
-
*/
|
|
15
|
-
function generate(config) {
|
|
16
|
-
const date = utils.formatDate();
|
|
17
|
-
const sections = [];
|
|
18
|
-
|
|
19
|
-
// Header
|
|
20
|
-
sections.push(`# ${config.project.name} - AI Context`);
|
|
21
|
-
sections.push('');
|
|
22
|
-
sections.push(`**Generated by**: Bootspring v${require('../../package.json').version}`);
|
|
23
|
-
sections.push(`**Last Updated**: ${date}`);
|
|
24
|
-
sections.push('');
|
|
25
|
-
sections.push('---');
|
|
26
|
-
sections.push('');
|
|
27
|
-
|
|
28
|
-
// CRITICAL: Planning is the single source of truth
|
|
29
|
-
sections.push('## IMPORTANT: Planning First');
|
|
30
|
-
sections.push('');
|
|
31
|
-
sections.push('**The `/planning` folder is the SINGLE SOURCE OF TRUTH for all implementation.**');
|
|
32
|
-
sections.push('');
|
|
33
|
-
sections.push('### Before Writing ANY Code');
|
|
34
|
-
sections.push('1. Read `planning/MASTER_PLAN.md` - Overall vision and phases');
|
|
35
|
-
sections.push('2. Run `bootspring build task` - Current task ID comes from `planning/BUILD_STATE.json`');
|
|
36
|
-
sections.push('3. Read `planning/TODO.md` - Find the task ID and its acceptance criteria');
|
|
37
|
-
sections.push('4. Read `planning/CONTEXT.md` - Current build context');
|
|
38
|
-
sections.push('5. Understand the acceptance criteria before implementing');
|
|
39
|
-
sections.push('');
|
|
40
|
-
sections.push('### After Completing ANY Task');
|
|
41
|
-
sections.push('1. Update `planning/TODO.md` - Check off completed items');
|
|
42
|
-
sections.push('2. Run `bootspring build done` - Updates BUILD_STATE.json automatically');
|
|
43
|
-
sections.push('3. Document any architectural decisions or deviations');
|
|
44
|
-
sections.push('');
|
|
45
|
-
sections.push('**DO NOT skip reading planning docs. DO NOT skip updating them.**');
|
|
46
|
-
sections.push('');
|
|
47
|
-
sections.push('---');
|
|
48
|
-
sections.push('');
|
|
49
|
-
|
|
50
|
-
// Planning folder contents
|
|
51
|
-
sections.push('## Planning Folder (`/planning`)');
|
|
52
|
-
sections.push('');
|
|
53
|
-
sections.push('| File | Purpose | When to Read |');
|
|
54
|
-
sections.push('|------|---------|--------------|');
|
|
55
|
-
sections.push('| `MASTER_PLAN.md` | Overall vision, phases, success criteria | **Always read first** |');
|
|
56
|
-
sections.push('| `TODO.md` | **Source of truth** — all tasks with acceptance criteria | **Before each task** |');
|
|
57
|
-
sections.push('| `CONTEXT.md` | Current build context and decisions | Before each task |');
|
|
58
|
-
sections.push('| `BUILD_STATE.json` | Machine state - source of current task ID | Reference only |');
|
|
59
|
-
sections.push('');
|
|
60
|
-
sections.push('---');
|
|
61
|
-
sections.push('');
|
|
62
|
-
|
|
63
|
-
// Preseed docs - the source material
|
|
64
|
-
sections.push('## Source Documents (`.bootspring/preseed/`)');
|
|
65
|
-
sections.push('');
|
|
66
|
-
sections.push('These are the original specifications the planning was derived from:');
|
|
67
|
-
sections.push('');
|
|
68
|
-
sections.push('| File | Contains |');
|
|
69
|
-
sections.push('|------|----------|');
|
|
70
|
-
sections.push('| `VISION.md` | Product vision, problem/solution, goals |');
|
|
71
|
-
sections.push('| `AUDIENCE.md` | Target users, personas, ICP |');
|
|
72
|
-
sections.push('| `MARKET.md` | Market analysis, TAM/SAM/SOM |');
|
|
73
|
-
sections.push('| `COMPETITORS.md` | Competitive landscape, differentiation |');
|
|
74
|
-
sections.push('| `BUSINESS_MODEL.md` | Revenue model, pricing, unit economics |');
|
|
75
|
-
sections.push('| `PRD.md` | Product requirements, features, user stories |');
|
|
76
|
-
sections.push('| `TECHNICAL_SPEC.md` | Architecture, stack, data model, APIs |');
|
|
77
|
-
sections.push('| `ROADMAP.md` | Implementation phases, milestones |');
|
|
78
|
-
sections.push('');
|
|
79
|
-
sections.push('---');
|
|
80
|
-
sections.push('');
|
|
81
|
-
|
|
82
|
-
// Project Overview
|
|
83
|
-
sections.push('## Project Overview');
|
|
84
|
-
sections.push('');
|
|
85
|
-
if (config.project.description) {
|
|
86
|
-
sections.push(config.project.description);
|
|
87
|
-
} else {
|
|
88
|
-
sections.push(`${config.project.name} is a ${config.stack.framework} project.`);
|
|
89
|
-
}
|
|
90
|
-
sections.push('');
|
|
91
|
-
sections.push(`**Status**: ${config.project.status || 'development'}`);
|
|
92
|
-
sections.push(`**Version**: ${config.project.version || '0.1.0'}`);
|
|
93
|
-
sections.push('');
|
|
94
|
-
sections.push('---');
|
|
95
|
-
sections.push('');
|
|
96
|
-
|
|
97
|
-
// Tech Stack
|
|
98
|
-
sections.push('## Tech Stack');
|
|
99
|
-
sections.push('');
|
|
100
|
-
sections.push(`- **Framework**: ${formatFramework(config.stack.framework)}`);
|
|
101
|
-
sections.push(`- **Language**: ${config.stack.language}`);
|
|
102
|
-
if (config.stack.database !== 'none') {
|
|
103
|
-
sections.push(`- **Database**: ${config.stack.database}`);
|
|
104
|
-
if (config.stack.orm) {
|
|
105
|
-
sections.push(`- **ORM**: ${config.stack.orm}`);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
sections.push(`- **Hosting**: ${config.stack.hosting}`);
|
|
109
|
-
sections.push('');
|
|
110
|
-
sections.push('---');
|
|
111
|
-
sections.push('');
|
|
112
|
-
|
|
113
|
-
// Enabled Plugins
|
|
114
|
-
const enabledPlugins = Object.entries(config.plugins || {})
|
|
115
|
-
.filter(([_, p]) => p.enabled);
|
|
116
|
-
|
|
117
|
-
if (enabledPlugins.length > 0) {
|
|
118
|
-
sections.push('## Enabled Plugins');
|
|
119
|
-
sections.push('');
|
|
120
|
-
for (const [name, plugin] of enabledPlugins) {
|
|
121
|
-
sections.push(`### ${capitalize(name)}`);
|
|
122
|
-
sections.push(`- **Provider**: ${plugin.provider || 'default'}`);
|
|
123
|
-
if (plugin.features && plugin.features.length > 0) {
|
|
124
|
-
sections.push(`- **Features**: ${plugin.features.join(', ')}`);
|
|
125
|
-
}
|
|
126
|
-
sections.push('');
|
|
127
|
-
}
|
|
128
|
-
sections.push('---');
|
|
129
|
-
sections.push('');
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// Custom Instructions
|
|
133
|
-
if (config.instructions && Object.keys(config.instructions).length > 0) {
|
|
134
|
-
sections.push('## Development Guidelines');
|
|
135
|
-
sections.push('');
|
|
136
|
-
|
|
137
|
-
if (config.instructions.componentPreferences?.length > 0) {
|
|
138
|
-
sections.push('### Component Guidelines');
|
|
139
|
-
for (const pref of config.instructions.componentPreferences) {
|
|
140
|
-
sections.push(`- ${formatPreference(pref)}`);
|
|
141
|
-
}
|
|
142
|
-
sections.push('');
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
if (config.instructions.validationPreferences?.length > 0) {
|
|
146
|
-
sections.push('### Validation & Types');
|
|
147
|
-
for (const pref of config.instructions.validationPreferences) {
|
|
148
|
-
sections.push(`- ${formatPreference(pref)}`);
|
|
149
|
-
}
|
|
150
|
-
sections.push('');
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
if (config.instructions.securityRules?.length > 0) {
|
|
154
|
-
sections.push('### Security Rules');
|
|
155
|
-
for (const rule of config.instructions.securityRules) {
|
|
156
|
-
sections.push(`- ${formatPreference(rule)}`);
|
|
157
|
-
}
|
|
158
|
-
sections.push('');
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
if (config.instructions.testingRules?.length > 0) {
|
|
162
|
-
sections.push('### Testing Rules');
|
|
163
|
-
for (const rule of config.instructions.testingRules) {
|
|
164
|
-
sections.push(`- ${formatPreference(rule)}`);
|
|
165
|
-
}
|
|
166
|
-
sections.push('');
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
if (config.instructions.forbiddenPatterns?.length > 0) {
|
|
170
|
-
sections.push('### Forbidden Patterns');
|
|
171
|
-
sections.push('Never use these:');
|
|
172
|
-
for (const pattern of config.instructions.forbiddenPatterns) {
|
|
173
|
-
sections.push(`- ${pattern}`);
|
|
174
|
-
}
|
|
175
|
-
sections.push('');
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
if (config.instructions.additionalInstructions) {
|
|
179
|
-
sections.push('### Additional Instructions');
|
|
180
|
-
sections.push(config.instructions.additionalInstructions);
|
|
181
|
-
sections.push('');
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
sections.push('---');
|
|
185
|
-
sections.push('');
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
// Workflow
|
|
189
|
-
if (config.workflow) {
|
|
190
|
-
sections.push('## Development Workflow');
|
|
191
|
-
sections.push('');
|
|
192
|
-
sections.push(`- **Git Strategy**: ${formatGitStrategy(config.workflow.gitStrategy)}`);
|
|
193
|
-
sections.push(`- **Team Size**: ${config.workflow.teamSize}`);
|
|
194
|
-
sections.push(`- **Commit Style**: ${config.workflow.commitStyle}`);
|
|
195
|
-
sections.push('');
|
|
196
|
-
sections.push('---');
|
|
197
|
-
sections.push('');
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
// Business Context (if available)
|
|
201
|
-
if (config.business && config.business.model) {
|
|
202
|
-
sections.push('## Business Context');
|
|
203
|
-
sections.push('');
|
|
204
|
-
sections.push(`- **Model**: ${config.business.model}`);
|
|
205
|
-
if (config.business.pricing) {
|
|
206
|
-
sections.push(`- **Pricing**: ${config.business.pricing}`);
|
|
207
|
-
}
|
|
208
|
-
if (config.business.targetMarket) {
|
|
209
|
-
sections.push(`- **Target Market**: ${config.business.targetMarket}`);
|
|
210
|
-
}
|
|
211
|
-
sections.push('');
|
|
212
|
-
sections.push('---');
|
|
213
|
-
sections.push('');
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
// Autonomous Build System
|
|
217
|
-
sections.push('## Build Loop');
|
|
218
|
-
sections.push('');
|
|
219
|
-
sections.push('**To start building, run:**');
|
|
220
|
-
sections.push('');
|
|
221
|
-
sections.push('```');
|
|
222
|
-
sections.push('bootspring build next');
|
|
223
|
-
sections.push('```');
|
|
224
|
-
sections.push('');
|
|
225
|
-
sections.push('This starts an autonomous loop:');
|
|
226
|
-
sections.push('');
|
|
227
|
-
sections.push('```');
|
|
228
|
-
sections.push('┌─────────────────────────────────────────────────────────────┐');
|
|
229
|
-
sections.push('│ bootspring build next │');
|
|
230
|
-
sections.push('│ ↓ │');
|
|
231
|
-
sections.push('│ bootspring build task → get in_progress task ID │');
|
|
232
|
-
sections.push('│ ↓ │');
|
|
233
|
-
sections.push('│ Read planning/TODO.md for acceptance criteria │');
|
|
234
|
-
sections.push('│ ↓ │');
|
|
235
|
-
sections.push('│ Implement task (meet acceptance criteria) │');
|
|
236
|
-
sections.push('│ ↓ │');
|
|
237
|
-
sections.push('│ bootspring build done │');
|
|
238
|
-
sections.push('│ ↓ │');
|
|
239
|
-
sections.push('│ [Auto-queues next task] → Continue implementing... │');
|
|
240
|
-
sections.push('└─────────────────────────────────────────────────────────────┘');
|
|
241
|
-
sections.push('```');
|
|
242
|
-
sections.push('');
|
|
243
|
-
sections.push('**Keep looping until all tasks are complete.**');
|
|
244
|
-
sections.push('');
|
|
245
|
-
sections.push('### Commands');
|
|
246
|
-
sections.push('');
|
|
247
|
-
sections.push('| Command | What it does |');
|
|
248
|
-
sections.push('|---------|--------------|');
|
|
249
|
-
sections.push('| `bootspring build next` | **Start here** - queue next task |');
|
|
250
|
-
sections.push('| `bootspring build task` | Show current in-progress task |');
|
|
251
|
-
sections.push('| `bootspring build done` | Mark complete, auto-queue next |');
|
|
252
|
-
sections.push('| `bootspring build status` | View progress |');
|
|
253
|
-
sections.push('| `bootspring build skip` | Skip current task |');
|
|
254
|
-
sections.push('');
|
|
255
|
-
sections.push('---');
|
|
256
|
-
sections.push('');
|
|
257
|
-
|
|
258
|
-
// Rules
|
|
259
|
-
sections.push('## Rules');
|
|
260
|
-
sections.push('');
|
|
261
|
-
sections.push('1. **Always read before coding** - No implementation without reading MASTER_PLAN.md and checking `bootspring build task`');
|
|
262
|
-
sections.push('2. **Follow acceptance criteria exactly** - The task is not done until all criteria are met');
|
|
263
|
-
sections.push('3. **Update planning docs** - Check off TODO.md items, run `bootspring build done`');
|
|
264
|
-
sections.push('4. **One task at a time** - Complete current task before starting next');
|
|
265
|
-
sections.push('5. **Document decisions** - If you deviate from the plan, document why');
|
|
266
|
-
sections.push('');
|
|
267
|
-
sections.push('---');
|
|
268
|
-
sections.push('');
|
|
269
|
-
|
|
270
|
-
// Git Commits
|
|
271
|
-
sections.push('## Git Commits');
|
|
272
|
-
sections.push('');
|
|
273
|
-
sections.push('- Use conventional commit format: `feat:`, `fix:`, `docs:`, `refactor:`, `test:`, `chore:`');
|
|
274
|
-
sections.push('- Write clear, descriptive commit messages');
|
|
275
|
-
sections.push('- Keep commits atomic (one logical change per commit)');
|
|
276
|
-
sections.push('- **NEVER add Co-Authored-By or AI attribution to commits**');
|
|
277
|
-
sections.push('- Never commit secrets, API keys, or credentials');
|
|
278
|
-
sections.push('- Run quality checks before committing');
|
|
279
|
-
sections.push('');
|
|
280
|
-
sections.push('---');
|
|
281
|
-
sections.push('');
|
|
282
|
-
|
|
283
|
-
// Bootspring Slash Commands
|
|
284
|
-
sections.push('## Bootspring Commands');
|
|
285
|
-
sections.push('');
|
|
286
|
-
sections.push('**IMPORTANT: When the user types any of these commands, run them directly as CLI commands.**');
|
|
287
|
-
sections.push('Do NOT interpret them as natural language requests. Execute the exact command.');
|
|
288
|
-
sections.push('');
|
|
289
|
-
sections.push('### Available Commands');
|
|
290
|
-
sections.push('');
|
|
291
|
-
sections.push('| Command | Description |');
|
|
292
|
-
sections.push('|---------|-------------|');
|
|
293
|
-
sections.push('| `bootspring build` | Run production build for the project |');
|
|
294
|
-
sections.push('| `bootspring build next` | Queue and start the next build task |');
|
|
295
|
-
sections.push('| `bootspring build task` | Show current in-progress task |');
|
|
296
|
-
sections.push('| `bootspring build done` | Mark current task complete |');
|
|
297
|
-
sections.push('| `bootspring build status` | View build progress |');
|
|
298
|
-
sections.push('| `bootspring analyze` | Run deep codebase analysis |');
|
|
299
|
-
sections.push('| `bootspring generate` | Regenerate CLAUDE.md context |');
|
|
300
|
-
sections.push('| `bootspring plan` | Get planning recommendations |');
|
|
301
|
-
sections.push('| `bootspring todo` | Manage project todos |');
|
|
302
|
-
sections.push('| `bootspring skill search <query>` | Search code patterns |');
|
|
303
|
-
sections.push('| `bootspring auth` | Check authentication status |');
|
|
304
|
-
sections.push('');
|
|
305
|
-
sections.push('### Command Recognition');
|
|
306
|
-
sections.push('');
|
|
307
|
-
sections.push('When the user says any of these, run the bootspring CLI command:');
|
|
308
|
-
sections.push('- "bootspring build" → `bootspring build`');
|
|
309
|
-
sections.push('- "build" or "/build" → `bootspring build`');
|
|
310
|
-
sections.push('- "analyze" or "/analyze" → `bootspring analyze`');
|
|
311
|
-
sections.push('- "generate" or "/generate" → `bootspring generate`');
|
|
312
|
-
sections.push('- "plan" or "/plan" → `bootspring plan`');
|
|
313
|
-
sections.push('- "todo" or "/todo" → `bootspring todo`');
|
|
314
|
-
sections.push('');
|
|
315
|
-
sections.push('---');
|
|
316
|
-
sections.push('');
|
|
317
|
-
|
|
318
|
-
// Footer
|
|
319
|
-
sections.push('*Generated by [Bootspring](https://bootspring.com) - Development scaffolding with intelligence*');
|
|
320
|
-
|
|
321
|
-
return sections.join('\n');
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
// Helper functions
|
|
325
|
-
function capitalize(str) {
|
|
326
|
-
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
function formatFramework(framework) {
|
|
330
|
-
const names = {
|
|
331
|
-
'nextjs': 'Next.js',
|
|
332
|
-
'remix': 'Remix',
|
|
333
|
-
'nuxt': 'Nuxt',
|
|
334
|
-
'sveltekit': 'SvelteKit',
|
|
335
|
-
'express': 'Express',
|
|
336
|
-
'fastify': 'Fastify',
|
|
337
|
-
'hono': 'Hono'
|
|
338
|
-
};
|
|
339
|
-
return names[framework] || framework;
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
function formatGitStrategy(strategy) {
|
|
343
|
-
const names = {
|
|
344
|
-
'feature-branch': 'Feature Branch',
|
|
345
|
-
'trunk': 'Trunk-Based',
|
|
346
|
-
'gitflow': 'GitFlow',
|
|
347
|
-
'github-flow': 'GitHub Flow'
|
|
348
|
-
};
|
|
349
|
-
return names[strategy] || strategy;
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
function formatPreference(pref) {
|
|
353
|
-
const descriptions = {
|
|
354
|
-
'server-components': 'Use Server Components by default',
|
|
355
|
-
'server-actions': 'Use Server Actions for mutations',
|
|
356
|
-
'small-components': 'Keep components small and focused',
|
|
357
|
-
'colocate-styles': 'Colocate styles with components',
|
|
358
|
-
'composition': 'Prefer composition over inheritance',
|
|
359
|
-
'tailwind': 'Use Tailwind CSS for styling',
|
|
360
|
-
'css-modules': 'Use CSS Modules',
|
|
361
|
-
'mobile-first': 'Mobile-first responsive design',
|
|
362
|
-
'zod': 'Use Zod for all input validation',
|
|
363
|
-
'strict-ts': 'Strict TypeScript mode',
|
|
364
|
-
'api-validation': 'Validate at API boundaries',
|
|
365
|
-
'runtime-types': 'Runtime type checking',
|
|
366
|
-
'no-client-keys': 'Never expose API keys to client',
|
|
367
|
-
'env-secrets': 'Use environment variables for secrets',
|
|
368
|
-
'sanitize-input': 'Sanitize all user input',
|
|
369
|
-
'parameterized-queries': 'Use parameterized queries',
|
|
370
|
-
'rate-limiting': 'Implement rate limiting',
|
|
371
|
-
'test-new-features': 'Write tests for new features',
|
|
372
|
-
'coverage-80': 'Maintain 80%+ test coverage',
|
|
373
|
-
'test-edge-cases': 'Test edge cases explicitly',
|
|
374
|
-
'meaningful-names': 'Use meaningful test names'
|
|
375
|
-
};
|
|
376
|
-
return descriptions[pref] || pref;
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
module.exports = { generate };
|