@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,199 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* AGENTS.md Template Generator
|
|
3
|
-
*
|
|
4
|
-
* Generates AGENTS.md following the open standard for AI coding agents.
|
|
5
|
-
* Supported by: OpenAI Codex, Cursor, Amp, Jules (Google), Factory, Kilo Code
|
|
6
|
-
*
|
|
7
|
-
* Best practices from https://github.blog/ai-and-ml/github-copilot/how-to-write-a-great-agents-md-lessons-from-over-2500-repositories/
|
|
8
|
-
*
|
|
9
|
-
* @package bootspring
|
|
10
|
-
* @module generators/templates/agents
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Generate root AGENTS.md content from config
|
|
15
|
-
*/
|
|
16
|
-
function generate(config) {
|
|
17
|
-
const sections = [];
|
|
18
|
-
|
|
19
|
-
// Persona - Be specific, not vague
|
|
20
|
-
sections.push(`# ${config.project.name}`);
|
|
21
|
-
sections.push('');
|
|
22
|
-
sections.push(`You are a senior full-stack developer working on ${config.project.name}, a ${formatFramework(config.stack.framework)} application with ${config.stack.language}.`);
|
|
23
|
-
sections.push('');
|
|
24
|
-
|
|
25
|
-
// Commands - Put early
|
|
26
|
-
sections.push('## Commands');
|
|
27
|
-
sections.push('');
|
|
28
|
-
sections.push('```bash');
|
|
29
|
-
sections.push('# Development');
|
|
30
|
-
sections.push('npm run dev');
|
|
31
|
-
sections.push('');
|
|
32
|
-
sections.push('# Quality checks (run before committing)');
|
|
33
|
-
sections.push('npm run lint');
|
|
34
|
-
sections.push('npm run test');
|
|
35
|
-
sections.push('npm run typecheck');
|
|
36
|
-
sections.push('');
|
|
37
|
-
sections.push('# Build tasks');
|
|
38
|
-
sections.push('bootspring build next # Get next task');
|
|
39
|
-
sections.push('bootspring build task # Show current in-progress task');
|
|
40
|
-
sections.push('bootspring build done # Mark task complete');
|
|
41
|
-
sections.push('bootspring build status # Check progress');
|
|
42
|
-
sections.push('```');
|
|
43
|
-
sections.push('');
|
|
44
|
-
|
|
45
|
-
// Task System
|
|
46
|
-
sections.push('## Build Loop');
|
|
47
|
-
sections.push('');
|
|
48
|
-
sections.push('**Start building:**');
|
|
49
|
-
sections.push('```');
|
|
50
|
-
sections.push('bootspring build next');
|
|
51
|
-
sections.push('```');
|
|
52
|
-
sections.push('');
|
|
53
|
-
sections.push('This loops through all tasks:');
|
|
54
|
-
sections.push('1. Run `bootspring build task` (current task comes from `planning/BUILD_STATE.json`)');
|
|
55
|
-
sections.push('2. Read that task\'s acceptance criteria in `planning/TODO.md`');
|
|
56
|
-
sections.push('3. Implement and validate the task');
|
|
57
|
-
sections.push('4. Run `bootspring build done` (auto-queues next)');
|
|
58
|
-
sections.push('');
|
|
59
|
-
sections.push('**Keep looping until MVP complete.**');
|
|
60
|
-
sections.push('');
|
|
61
|
-
|
|
62
|
-
// Stack - Be specific about versions
|
|
63
|
-
sections.push('## Stack');
|
|
64
|
-
sections.push('');
|
|
65
|
-
sections.push(`- **Framework**: ${formatFramework(config.stack.framework)}`);
|
|
66
|
-
sections.push(`- **Language**: ${config.stack.language}`);
|
|
67
|
-
if (config.stack.database !== 'none') {
|
|
68
|
-
sections.push(`- **Database**: ${config.stack.database}`);
|
|
69
|
-
if (config.stack.orm) {
|
|
70
|
-
sections.push(`- **ORM**: ${config.stack.orm}`);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
sections.push('');
|
|
74
|
-
|
|
75
|
-
// Code Style
|
|
76
|
-
sections.push('## Code Style');
|
|
77
|
-
sections.push('');
|
|
78
|
-
if (config.stack.framework === 'nextjs') {
|
|
79
|
-
sections.push('- Use Server Components by default');
|
|
80
|
-
sections.push('- Use Server Actions for mutations (not API routes)');
|
|
81
|
-
}
|
|
82
|
-
sections.push('- Use Zod for input validation');
|
|
83
|
-
sections.push('- Keep files under 300 lines');
|
|
84
|
-
sections.push('- Use meaningful variable and function names');
|
|
85
|
-
sections.push('- Follow existing patterns in the codebase');
|
|
86
|
-
sections.push('');
|
|
87
|
-
|
|
88
|
-
// Git Workflow
|
|
89
|
-
sections.push('## Git Workflow');
|
|
90
|
-
sections.push('');
|
|
91
|
-
sections.push('- Conventional commits: `feat:`, `fix:`, `docs:`, `refactor:`');
|
|
92
|
-
sections.push('- Atomic commits - one logical change per commit');
|
|
93
|
-
sections.push('- Run quality checks before committing');
|
|
94
|
-
sections.push('- Never force push to main');
|
|
95
|
-
sections.push('- **Never add Co-Authored-By or AI attribution to commits**');
|
|
96
|
-
sections.push('');
|
|
97
|
-
|
|
98
|
-
// Boundaries - Critical
|
|
99
|
-
sections.push('## Boundaries');
|
|
100
|
-
sections.push('');
|
|
101
|
-
sections.push('**Never:**');
|
|
102
|
-
sections.push('- Commit secrets, API keys, or credentials');
|
|
103
|
-
sections.push('- Modify `.env` files with real values');
|
|
104
|
-
sections.push('- Delete or overwrite migration files');
|
|
105
|
-
sections.push('- Skip tests to make code compile');
|
|
106
|
-
sections.push('- Introduce breaking changes without discussion');
|
|
107
|
-
sections.push('');
|
|
108
|
-
sections.push('**Always:**');
|
|
109
|
-
sections.push('- Read existing code before modifying');
|
|
110
|
-
sections.push('- Run tests after changes');
|
|
111
|
-
sections.push('- Check for TypeScript errors');
|
|
112
|
-
sections.push('- Follow the acceptance criteria exactly');
|
|
113
|
-
sections.push('');
|
|
114
|
-
|
|
115
|
-
// Testing
|
|
116
|
-
sections.push('## Testing');
|
|
117
|
-
sections.push('');
|
|
118
|
-
sections.push('- Write tests for new features');
|
|
119
|
-
sections.push('- Ensure existing tests still pass');
|
|
120
|
-
sections.push('- Test edge cases and error conditions');
|
|
121
|
-
sections.push('');
|
|
122
|
-
|
|
123
|
-
return sections.join('\n');
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* Generate planning-specific AGENTS.md for the planning directory
|
|
128
|
-
*/
|
|
129
|
-
function generatePlanningAgents(_config) {
|
|
130
|
-
const sections = [];
|
|
131
|
-
|
|
132
|
-
sections.push('# Planning Directory');
|
|
133
|
-
sections.push('');
|
|
134
|
-
sections.push('You are working on build tasks for the MVP. This directory contains build planning files.');
|
|
135
|
-
sections.push('');
|
|
136
|
-
|
|
137
|
-
sections.push('## Current Task');
|
|
138
|
-
sections.push('');
|
|
139
|
-
sections.push('Run `bootspring build task` to get the current `in_progress` task from `BUILD_STATE.json`.');
|
|
140
|
-
sections.push('');
|
|
141
|
-
|
|
142
|
-
sections.push('## Commands');
|
|
143
|
-
sections.push('');
|
|
144
|
-
sections.push('```bash');
|
|
145
|
-
sections.push('bootspring build task # Show current task');
|
|
146
|
-
sections.push('bootspring build done # Mark task complete, get next');
|
|
147
|
-
sections.push('bootspring build skip # Skip task, get next');
|
|
148
|
-
sections.push('bootspring build status # View progress');
|
|
149
|
-
sections.push('```');
|
|
150
|
-
sections.push('');
|
|
151
|
-
|
|
152
|
-
sections.push('## Files');
|
|
153
|
-
sections.push('');
|
|
154
|
-
sections.push('| File | Purpose |');
|
|
155
|
-
sections.push('|------|---------|');
|
|
156
|
-
sections.push('| `TODO.md` | **Source of truth** — task checklist with acceptance criteria |');
|
|
157
|
-
sections.push('| `BUILD_STATE.json` | Build state and current task ID (do not edit) |');
|
|
158
|
-
sections.push('| `CONTEXT.md` | Build context summary |');
|
|
159
|
-
sections.push('');
|
|
160
|
-
|
|
161
|
-
sections.push('## Workflow');
|
|
162
|
-
sections.push('');
|
|
163
|
-
sections.push('1. Run `bootspring build task` to identify the current task ID');
|
|
164
|
-
sections.push('2. Read the matching task in `TODO.md` for acceptance criteria');
|
|
165
|
-
sections.push('3. Implement in the main codebase (not here)');
|
|
166
|
-
sections.push('4. Ensure acceptance criteria are met');
|
|
167
|
-
sections.push('5. Run `npm run lint && npm run test`');
|
|
168
|
-
sections.push('6. Commit changes');
|
|
169
|
-
sections.push('7. Run `bootspring build done`');
|
|
170
|
-
sections.push('');
|
|
171
|
-
|
|
172
|
-
sections.push('## Boundaries');
|
|
173
|
-
sections.push('');
|
|
174
|
-
sections.push('- Do NOT edit `BUILD_STATE.json` directly');
|
|
175
|
-
sections.push('- Do NOT skip quality checks');
|
|
176
|
-
sections.push('- Do NOT work on multiple tasks at once');
|
|
177
|
-
sections.push('');
|
|
178
|
-
|
|
179
|
-
return sections.join('\n');
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
// Helper functions
|
|
183
|
-
function formatFramework(framework) {
|
|
184
|
-
const names = {
|
|
185
|
-
'nextjs': 'Next.js 14+ (App Router)',
|
|
186
|
-
'remix': 'Remix',
|
|
187
|
-
'nuxt': 'Nuxt 3',
|
|
188
|
-
'sveltekit': 'SvelteKit',
|
|
189
|
-
'express': 'Express.js',
|
|
190
|
-
'fastify': 'Fastify',
|
|
191
|
-
'hono': 'Hono'
|
|
192
|
-
};
|
|
193
|
-
return names[framework] || framework;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
module.exports = {
|
|
197
|
-
generate,
|
|
198
|
-
generatePlanningAgents
|
|
199
|
-
};
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Assistant Context Template Adapter
|
|
3
|
-
*
|
|
4
|
-
* Derives assistant-specific guides (GEMINI.md, CODEX.md)
|
|
5
|
-
* from the generated CLAUDE.md baseline.
|
|
6
|
-
*
|
|
7
|
-
* @package bootspring
|
|
8
|
-
* @module generators/templates/assistant-context
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
const ASSISTANT_DOC_META = {
|
|
12
|
-
gemini: {
|
|
13
|
-
filename: 'GEMINI.md',
|
|
14
|
-
label: 'Gemini CLI'
|
|
15
|
-
},
|
|
16
|
-
codex: {
|
|
17
|
-
filename: 'CODEX.md',
|
|
18
|
-
label: 'Codex'
|
|
19
|
-
}
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
const ASSISTANT_DOC_TARGETS = ['gemini', 'codex'];
|
|
23
|
-
|
|
24
|
-
function getAssistantDocFilename(target) {
|
|
25
|
-
return ASSISTANT_DOC_META[target].filename;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
function buildNaturalLanguageRoutingSection(label) {
|
|
29
|
-
const lines = [];
|
|
30
|
-
lines.push('## Natural Language Bootspring Routing');
|
|
31
|
-
lines.push('');
|
|
32
|
-
lines.push(`Use this section in ${label} to map plain-English requests to Bootspring commands.`);
|
|
33
|
-
lines.push('');
|
|
34
|
-
lines.push('- If a user message already starts with `bootspring`, run it exactly as written.');
|
|
35
|
-
lines.push('- If a user asks in natural language, execute the matching command from the table below.');
|
|
36
|
-
lines.push('');
|
|
37
|
-
lines.push('| User request | Run command |');
|
|
38
|
-
lines.push('|--------------|-------------|');
|
|
39
|
-
lines.push('| "log in to bootspring" | `bootspring auth login` |');
|
|
40
|
-
lines.push('| "show auth status" | `bootspring auth status` |');
|
|
41
|
-
lines.push('| "start build loop" or "next task" | `bootspring build next` |');
|
|
42
|
-
lines.push('| "what task am I on?" | `bootspring build task` |');
|
|
43
|
-
lines.push('| "mark this task done" | `bootspring build done` |');
|
|
44
|
-
lines.push('| "show build progress" | `bootspring build status` |');
|
|
45
|
-
lines.push('| "refresh context files" | `bootspring generate --full` |');
|
|
46
|
-
lines.push('');
|
|
47
|
-
lines.push('When in doubt, prefer direct Bootspring CLI commands over paraphrasing.');
|
|
48
|
-
return lines.join('\n');
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function adaptBaseContent(claudeContent, target) {
|
|
52
|
-
const meta = ASSISTANT_DOC_META[target];
|
|
53
|
-
return claudeContent
|
|
54
|
-
.replace(/\bCLAUDE\.md\b/g, meta.filename)
|
|
55
|
-
.replace(/Claude Code context/g, `${meta.label} context`)
|
|
56
|
-
.replace(/Context for Claude Code/g, `Context for ${meta.label}`);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
function generateAssistantContext(claudeContent, target) {
|
|
60
|
-
const meta = ASSISTANT_DOC_META[target];
|
|
61
|
-
const adaptedContent = adaptBaseContent(claudeContent, target).trimEnd();
|
|
62
|
-
|
|
63
|
-
return `${adaptedContent}
|
|
64
|
-
|
|
65
|
-
---
|
|
66
|
-
|
|
67
|
-
${buildNaturalLanguageRoutingSection(meta.label)}
|
|
68
|
-
`;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
function generateAssistantContextFiles(claudeContent) {
|
|
72
|
-
return {
|
|
73
|
-
gemini: generateAssistantContext(claudeContent, 'gemini'),
|
|
74
|
-
codex: generateAssistantContext(claudeContent, 'codex')
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
module.exports = {
|
|
79
|
-
ASSISTANT_DOC_TARGETS,
|
|
80
|
-
getAssistantDocFilename,
|
|
81
|
-
generateAssistantContext,
|
|
82
|
-
generateAssistantContextFiles
|
|
83
|
-
};
|