brainforge-ai 1.0.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +113 -71
- package/dist/cli.js +15 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/help.d.ts +2 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/commands/help.js +131 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/serve.d.ts +2 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +162 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/core/templates.d.ts.map +1 -1
- package/dist/core/templates.js +98 -0
- package/dist/core/templates.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# ⚡ BrainForge
|
|
2
2
|
|
|
3
|
-
> Transform any idea into a structured, AI-assisted project — with agents, slash commands, a phase roadmap, persistent memory, and a live
|
|
3
|
+
> Transform any idea into a structured, AI-assisted project — with agents, slash commands, a phase roadmap, persistent memory, and a live dashboard.
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/brainforge-ai)
|
|
6
6
|
[](./LICENSE)
|
|
@@ -19,7 +19,7 @@ BrainForge is a CLI that installs a **structured AI development system** into an
|
|
|
19
19
|
Instead of vibing and hoping the AI does the right thing, BrainForge forces a clean workflow:
|
|
20
20
|
|
|
21
21
|
```
|
|
22
|
-
Idea → Plan → Research → Execute → Review → Commit → Repeat
|
|
22
|
+
Idea → Plan → Research → Execute → Test → Review → Commit → Repeat
|
|
23
23
|
```
|
|
24
24
|
|
|
25
25
|
It works with any AI tool: **Claude Code**, **GitHub Copilot**, **Gemini CLI**, **Codex**, **Cursor**, **OpenCode**.
|
|
@@ -34,8 +34,9 @@ It works with any AI tool: **Claude Code**, **GitHub Copilot**, **Gemini CLI**,
|
|
|
34
34
|
| No memory between sessions | Persistent project memory |
|
|
35
35
|
| Hard to explain your code | `/explain-my-code` generates your defense speech |
|
|
36
36
|
| Code looks too AI-perfect | Code Level Engine adapts to your real level |
|
|
37
|
+
| No tests | `/write-tests` generates the right tests for your level |
|
|
37
38
|
| No version history | Automatic git checkpoints |
|
|
38
|
-
| Lost in files | Live
|
|
39
|
+
| Lost in files | Live dashboard with auto-reload |
|
|
39
40
|
|
|
40
41
|
---
|
|
41
42
|
|
|
@@ -74,7 +75,7 @@ Answer the questions:
|
|
|
74
75
|
- Target code level
|
|
75
76
|
- Whether it's a school project
|
|
76
77
|
|
|
77
|
-
BrainForge
|
|
78
|
+
BrainForge generates the full structure and makes the first git commit automatically.
|
|
78
79
|
|
|
79
80
|
---
|
|
80
81
|
|
|
@@ -82,7 +83,7 @@ BrainForge will generate the full structure and make the first git commit.
|
|
|
82
83
|
|
|
83
84
|
Open **Claude Code**, **Cursor**, or any AI tool in the project folder.
|
|
84
85
|
|
|
85
|
-
The AI
|
|
86
|
+
The AI reads `AGENTS.md` automatically and knows the rules.
|
|
86
87
|
|
|
87
88
|
---
|
|
88
89
|
|
|
@@ -92,7 +93,7 @@ The AI will automatically read `AGENTS.md` and know the rules.
|
|
|
92
93
|
```
|
|
93
94
|
/start-project
|
|
94
95
|
```
|
|
95
|
-
Describe your idea. The AI asks questions
|
|
96
|
+
Describe your idea. The AI asks questions and fills in `.brainforge/project.md`.
|
|
96
97
|
|
|
97
98
|
#### Step 2 — Create the roadmap
|
|
98
99
|
```
|
|
@@ -112,25 +113,31 @@ Research + planning. The AI proposes an approach and waits for your confirmation
|
|
|
112
113
|
```
|
|
113
114
|
The AI codes **only what was planned**. Nothing more.
|
|
114
115
|
|
|
115
|
-
#### Step 5 —
|
|
116
|
+
#### Step 5 — Write tests
|
|
117
|
+
```
|
|
118
|
+
/write-tests
|
|
119
|
+
```
|
|
120
|
+
Generates tests adapted to your stack and code level.
|
|
121
|
+
|
|
122
|
+
#### Step 6 — Review the phase
|
|
116
123
|
```
|
|
117
124
|
/review-phase 1
|
|
118
125
|
```
|
|
119
126
|
Checks for bugs, dead code, complexity, and level-appropriateness.
|
|
120
127
|
|
|
121
|
-
#### Step
|
|
128
|
+
#### Step 7 — Save your progress
|
|
122
129
|
```
|
|
123
130
|
/checkpoint
|
|
124
131
|
```
|
|
125
|
-
Creates a local git commit. Never pushes.
|
|
132
|
+
Creates a local git commit. Never pushes automatically.
|
|
126
133
|
|
|
127
|
-
#### Step
|
|
128
|
-
```
|
|
129
|
-
brainforge
|
|
130
|
-
brainforge dashboard
|
|
134
|
+
#### Step 8 — Watch the dashboard update live
|
|
135
|
+
```bash
|
|
136
|
+
brainforge serve
|
|
131
137
|
```
|
|
138
|
+
Opens `localhost:3000` — reloads automatically as you work.
|
|
132
139
|
|
|
133
|
-
Repeat steps 3–
|
|
140
|
+
Repeat steps 3–8 for each phase.
|
|
134
141
|
|
|
135
142
|
---
|
|
136
143
|
|
|
@@ -139,9 +146,11 @@ Repeat steps 3–7 for each phase.
|
|
|
139
146
|
| Command | Description |
|
|
140
147
|
|---------|-------------|
|
|
141
148
|
| `brainforge init` | Initialize BrainForge in the current directory |
|
|
142
|
-
| `brainforge
|
|
143
|
-
| `brainforge dashboard` | Open the HTML dashboard in the browser |
|
|
149
|
+
| `brainforge serve` | Live dashboard on localhost:3000 (auto-reloads) |
|
|
150
|
+
| `brainforge dashboard` | Open the static HTML dashboard in the browser |
|
|
144
151
|
| `brainforge update-dashboard` | Refresh dashboard data from project state |
|
|
152
|
+
| `brainforge doctor` | Health check — verify all files and setup |
|
|
153
|
+
| `brainforge guide` | Show all CLI and slash commands with project status |
|
|
145
154
|
| `brainforge version` | Show version info |
|
|
146
155
|
|
|
147
156
|
---
|
|
@@ -150,28 +159,74 @@ Repeat steps 3–7 for each phase.
|
|
|
150
159
|
|
|
151
160
|
These are prompt files in `.brainforge/commands/` — paste the command name into your AI tool.
|
|
152
161
|
|
|
162
|
+
### Project Setup
|
|
163
|
+
|
|
164
|
+
| Command | What it does |
|
|
165
|
+
|---------|-------------|
|
|
166
|
+
| `/start-project` | Document your idea and gather all project info |
|
|
167
|
+
| `/create-roadmap` | Break project into phases (Epic › Feature › Task) |
|
|
168
|
+
|
|
169
|
+
### Phase Workflow
|
|
170
|
+
|
|
153
171
|
| Command | What it does |
|
|
154
172
|
|---------|-------------|
|
|
155
|
-
| `/start-project` | Document your idea, gather all project info |
|
|
156
|
-
| `/create-roadmap` | Break project into phases (Epic > Feature > Task) |
|
|
157
173
|
| `/initiate-phase N` | Research + plan phase N before any coding |
|
|
158
174
|
| `/execute-phase N` | Code phase N following the plan exactly |
|
|
159
175
|
| `/review-phase N` | Quality review — bugs, level check, academic check |
|
|
160
|
-
| `/humanize-code` | Adapt code to match your real coding level |
|
|
161
|
-
| `/explain-my-code` | Generate an explanation for a professor or team |
|
|
162
|
-
| `/professor-check` | Detect code that looks suspiciously AI-generated |
|
|
163
176
|
| `/checkpoint` | Local git commit (never pushes automatically) |
|
|
177
|
+
|
|
178
|
+
### Code Quality
|
|
179
|
+
|
|
180
|
+
| Command | What it does |
|
|
181
|
+
|---------|-------------|
|
|
182
|
+
| `/write-tests` | Generate tests for a file, function, or phase |
|
|
183
|
+
| `/humanize-code` | Adapt code to match your real coding level |
|
|
164
184
|
| `/debug-issue` | Systematic bug analysis and fix |
|
|
185
|
+
|
|
186
|
+
### Student Tools
|
|
187
|
+
|
|
188
|
+
| Command | What it does |
|
|
189
|
+
|---------|-------------|
|
|
190
|
+
| `/explain-my-code` | Generate an explanation for your professor or team |
|
|
191
|
+
| `/professor-check` | Detect code that looks suspiciously AI-generated |
|
|
192
|
+
| `/generate-report` | Generate an academic report template |
|
|
193
|
+
|
|
194
|
+
### Documentation & UI
|
|
195
|
+
|
|
196
|
+
| Command | What it does |
|
|
197
|
+
|---------|-------------|
|
|
165
198
|
| `/design-system` | Create a UI/UX design system guide |
|
|
166
199
|
| `/generate-docs` | Generate README and docs/ folder |
|
|
167
|
-
| `/
|
|
168
|
-
|
|
200
|
+
| `/update-dashboard` | Refresh the HTML dashboard data |
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
## The Live Dashboard
|
|
205
|
+
|
|
206
|
+
Run `brainforge serve` to open a live dashboard at `localhost:3000`.
|
|
207
|
+
|
|
208
|
+
It **auto-reloads** every time a file in `.brainforge/` changes — no manual refresh needed.
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
brainforge serve # localhost:3000
|
|
212
|
+
brainforge serve --port 4000 # custom port
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
It shows:
|
|
216
|
+
- Project name, description, stack, and level
|
|
217
|
+
- Phase progress bar
|
|
218
|
+
- Status of each phase (pending / in-progress / done)
|
|
219
|
+
- Recent git commits
|
|
220
|
+
- Known bugs
|
|
221
|
+
- Last architecture decisions
|
|
222
|
+
- Git status
|
|
223
|
+
- A green dot in the corner when live reload is active
|
|
169
224
|
|
|
170
225
|
---
|
|
171
226
|
|
|
172
227
|
## Code Level Engine
|
|
173
228
|
|
|
174
|
-
BrainForge adapts all generated code to your target level:
|
|
229
|
+
BrainForge adapts all generated and reviewed code to your target level:
|
|
175
230
|
|
|
176
231
|
| Level | Who it's for | What it produces |
|
|
177
232
|
|-------|-------------|-----------------|
|
|
@@ -182,16 +237,34 @@ BrainForge adapts all generated code to your target level:
|
|
|
182
237
|
|
|
183
238
|
### The `academic-realistic` level
|
|
184
239
|
|
|
185
|
-
|
|
240
|
+
The most important level for students. It produces code that:
|
|
186
241
|
|
|
187
242
|
- ✅ Is clean enough to get a good grade
|
|
188
|
-
- ✅ Is simple enough to explain in an oral defense
|
|
243
|
+
- ✅ Is simple enough to explain line by line in an oral defense
|
|
189
244
|
- ✅ Has no enterprise patterns that would raise suspicion
|
|
190
245
|
- ✅ Looks like it was written by a good student, not a senior engineer
|
|
191
246
|
- ✅ Has natural comments — not AI-generated-sounding ones
|
|
192
247
|
|
|
193
248
|
---
|
|
194
249
|
|
|
250
|
+
## `/write-tests` — Test Generator
|
|
251
|
+
|
|
252
|
+
The `/write-tests` command generates tests adapted to your project:
|
|
253
|
+
|
|
254
|
+
- **Detects the right framework** automatically (Jest, Vitest, pytest, PHPUnit…)
|
|
255
|
+
- **Adapts test complexity** to your code level
|
|
256
|
+
- **Beginner:** 2-3 tests per function, happy path only, no mocks
|
|
257
|
+
- **Academic-realistic:** happy path + edge cases, mocks for external services, readable names
|
|
258
|
+
- **Professional:** full coverage, integration tests, all error paths
|
|
259
|
+
|
|
260
|
+
```
|
|
261
|
+
/write-tests src/auth/login.ts
|
|
262
|
+
/write-tests the login feature
|
|
263
|
+
/write-tests phase 2
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
195
268
|
## Project Structure
|
|
196
269
|
|
|
197
270
|
After `brainforge init`, your project contains:
|
|
@@ -227,6 +300,7 @@ After `brainforge init`, your project contains:
|
|
|
227
300
|
initiate-phase.md ← /initiate-phase
|
|
228
301
|
execute-phase.md ← /execute-phase
|
|
229
302
|
review-phase.md ← /review-phase
|
|
303
|
+
write-tests.md ← /write-tests
|
|
230
304
|
humanize-code.md ← /humanize-code
|
|
231
305
|
explain-my-code.md ← /explain-my-code
|
|
232
306
|
professor-check.md ← /professor-check
|
|
@@ -237,7 +311,7 @@ After `brainforge init`, your project contains:
|
|
|
237
311
|
generate-report.md ← /generate-report
|
|
238
312
|
update-dashboard.md ← /update-dashboard
|
|
239
313
|
dashboard/
|
|
240
|
-
index.html ← visual dashboard
|
|
314
|
+
index.html ← visual dashboard
|
|
241
315
|
style.css
|
|
242
316
|
data.json
|
|
243
317
|
AGENTS.md ← instructions for all AI agents
|
|
@@ -248,36 +322,9 @@ OPENAI.md ← OpenAI / Codex specific config
|
|
|
248
322
|
|
|
249
323
|
---
|
|
250
324
|
|
|
251
|
-
## The Dashboard
|
|
252
|
-
|
|
253
|
-
The dashboard is a static HTML file at `.brainforge/dashboard/index.html`.
|
|
254
|
-
|
|
255
|
-
It shows:
|
|
256
|
-
- Project name, description, stack, and level
|
|
257
|
-
- Phase progress bar
|
|
258
|
-
- Status of each phase (pending / in-progress / done)
|
|
259
|
-
- Recent git commits
|
|
260
|
-
- Known bugs
|
|
261
|
-
- Last decisions
|
|
262
|
-
- Git status
|
|
263
|
-
|
|
264
|
-
To open it:
|
|
265
|
-
|
|
266
|
-
```bash
|
|
267
|
-
brainforge dashboard
|
|
268
|
-
```
|
|
269
|
-
|
|
270
|
-
To refresh its data:
|
|
271
|
-
|
|
272
|
-
```bash
|
|
273
|
-
brainforge update-dashboard
|
|
274
|
-
```
|
|
275
|
-
|
|
276
|
-
---
|
|
277
|
-
|
|
278
325
|
## Multi-AI Compatibility
|
|
279
326
|
|
|
280
|
-
BrainForge generates
|
|
327
|
+
BrainForge generates config files for every major AI tool:
|
|
281
328
|
|
|
282
329
|
| File | Tool |
|
|
283
330
|
|------|------|
|
|
@@ -286,21 +333,14 @@ BrainForge generates configuration files for every major AI tool:
|
|
|
286
333
|
| `OPENAI.md` | Codex / ChatGPT |
|
|
287
334
|
| `AGENTS.md` | All tools (universal) |
|
|
288
335
|
|
|
289
|
-
Each file tells the AI:
|
|
290
|
-
- What the project is
|
|
291
|
-
- What code level to use
|
|
292
|
-
- How to follow the workflow
|
|
293
|
-
- What files to read and update
|
|
294
|
-
- Git rules (never push)
|
|
336
|
+
Each file tells the AI: what the project is, what code level to use, how to follow the workflow, what files to update, and git rules (never push).
|
|
295
337
|
|
|
296
338
|
---
|
|
297
339
|
|
|
298
340
|
## Git Rules
|
|
299
341
|
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
| Action | Allowed |
|
|
303
|
-
|--------|---------|
|
|
342
|
+
| Action | Status |
|
|
343
|
+
|--------|--------|
|
|
304
344
|
| `git init` | ✅ Auto on first init |
|
|
305
345
|
| `git add` + `git commit` | ✅ Via `/checkpoint` |
|
|
306
346
|
| `git push` | ❌ Never automatic |
|
|
@@ -317,24 +357,24 @@ You always control when and where you push.
|
|
|
317
357
|
npx brainforge-ai init
|
|
318
358
|
# → choose "academic-realistic" code level
|
|
319
359
|
# → choose "yes" for academic project
|
|
320
|
-
# →
|
|
321
|
-
# →
|
|
322
|
-
# →
|
|
360
|
+
# → /start-project → /create-roadmap → phases
|
|
361
|
+
# → /write-tests before each review
|
|
362
|
+
# → /professor-check before submission
|
|
363
|
+
# → /generate-report for the written report
|
|
323
364
|
```
|
|
324
365
|
|
|
325
366
|
### Personal MVP
|
|
326
367
|
```bash
|
|
327
368
|
npx brainforge-ai init
|
|
328
369
|
# → choose "intermediate" or "professional"
|
|
329
|
-
# →
|
|
330
|
-
# → build phase by phase
|
|
370
|
+
# → brainforge serve ← keep the dashboard open while you build
|
|
331
371
|
```
|
|
332
372
|
|
|
333
373
|
### Learning a new stack
|
|
334
374
|
```bash
|
|
335
375
|
npx brainforge-ai init
|
|
336
376
|
# → choose "beginner" or "intermediate"
|
|
337
|
-
# →
|
|
377
|
+
# → /explain-my-code after each phase to understand what was built
|
|
338
378
|
```
|
|
339
379
|
|
|
340
380
|
---
|
|
@@ -358,6 +398,8 @@ npm link
|
|
|
358
398
|
|
|
359
399
|
# Test locally
|
|
360
400
|
brainforge init
|
|
401
|
+
brainforge guide
|
|
402
|
+
brainforge serve
|
|
361
403
|
brainforge doctor
|
|
362
404
|
```
|
|
363
405
|
|
package/dist/cli.js
CHANGED
|
@@ -6,6 +6,8 @@ const init_1 = require("./commands/init");
|
|
|
6
6
|
const doctor_1 = require("./commands/doctor");
|
|
7
7
|
const dashboard_1 = require("./commands/dashboard");
|
|
8
8
|
const updateDashboard_1 = require("./commands/updateDashboard");
|
|
9
|
+
const serve_1 = require("./commands/serve");
|
|
10
|
+
const help_1 = require("./commands/help");
|
|
9
11
|
const program = new commander_1.Command();
|
|
10
12
|
program
|
|
11
13
|
.name('brainforge')
|
|
@@ -35,6 +37,19 @@ program
|
|
|
35
37
|
.action(async () => {
|
|
36
38
|
await (0, updateDashboard_1.updateDashboardCommand)();
|
|
37
39
|
});
|
|
40
|
+
program
|
|
41
|
+
.command('serve')
|
|
42
|
+
.description('Start a local server with live reload for the dashboard')
|
|
43
|
+
.option('-p, --port <number>', 'Port to listen on', '3000')
|
|
44
|
+
.action(async (opts) => {
|
|
45
|
+
await (0, serve_1.serveCommand)(parseInt(opts.port, 10));
|
|
46
|
+
});
|
|
47
|
+
program
|
|
48
|
+
.command('guide')
|
|
49
|
+
.description('Show all CLI and slash commands with project status')
|
|
50
|
+
.action(() => {
|
|
51
|
+
(0, help_1.helpCommand)();
|
|
52
|
+
});
|
|
38
53
|
program
|
|
39
54
|
.command('version')
|
|
40
55
|
.description('Show version information')
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,0CAA8C;AAC9C,8CAAkD;AAClD,oDAAwD;AACxD,gEAAoE;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,0CAA8C;AAC9C,8CAAkD;AAClD,oDAAwD;AACxD,gEAAoE;AACpE,4CAAgD;AAChD,0CAA8C;AAE9C,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CACV,yGAAyG,CAC1G;KACA,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,gDAAgD,CAAC;KAC7D,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,IAAA,kBAAW,GAAE,CAAC;AACtB,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,4CAA4C,CAAC;KACzD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,IAAA,sBAAa,GAAE,CAAC;AACxB,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,2CAA2C,CAAC;KACxD,MAAM,CAAC,GAAG,EAAE;IACX,IAAA,4BAAgB,GAAE,CAAC;AACrB,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,kBAAkB,CAAC;KAC3B,WAAW,CAAC,mDAAmD,CAAC;KAChE,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,IAAA,wCAAsB,GAAE,CAAC;AACjC,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,yDAAyD,CAAC;KACtE,MAAM,CAAC,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,CAAC;KAC1D,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,IAAA,oBAAY,EAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AAC9C,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,qDAAqD,CAAC;KAClE,MAAM,CAAC,GAAG,EAAE;IACX,IAAA,kBAAW,GAAE,CAAC;AAChB,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,0BAA0B,CAAC;KACvC,MAAM,CAAC,GAAG,EAAE;IACX,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"AAyDA,wBAAgB,WAAW,IAAI,IAAI,CAmFlC"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.helpCommand = helpCommand;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const config_1 = require("../core/config");
|
|
9
|
+
const logger_1 = require("../utils/logger");
|
|
10
|
+
const CLI_COMMANDS = [
|
|
11
|
+
{ cmd: 'brainforge init', desc: 'Initialize BrainForge in the current directory' },
|
|
12
|
+
{ cmd: 'brainforge serve', desc: 'Live dashboard on localhost:3000 (auto-reloads)' },
|
|
13
|
+
{ cmd: 'brainforge dashboard', desc: 'Open the HTML dashboard in the browser' },
|
|
14
|
+
{ cmd: 'brainforge update-dashboard', desc: 'Refresh dashboard data from project state' },
|
|
15
|
+
{ cmd: 'brainforge doctor', desc: 'Health check — verify setup and files' },
|
|
16
|
+
{ cmd: 'brainforge help', desc: 'Show this help screen' },
|
|
17
|
+
{ cmd: 'brainforge version', desc: 'Show version info' },
|
|
18
|
+
];
|
|
19
|
+
const SLASH_COMMANDS = [
|
|
20
|
+
{
|
|
21
|
+
group: 'Project Setup',
|
|
22
|
+
commands: [
|
|
23
|
+
{ cmd: '/start-project', desc: 'Document your idea and gather project info' },
|
|
24
|
+
{ cmd: '/create-roadmap', desc: 'Break project into phases (Epic › Feature › Task)' },
|
|
25
|
+
],
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
group: 'Phase Workflow',
|
|
29
|
+
commands: [
|
|
30
|
+
{ cmd: '/initiate-phase N', desc: 'Research + plan phase N before any coding' },
|
|
31
|
+
{ cmd: '/execute-phase N', desc: 'Code phase N following the plan exactly' },
|
|
32
|
+
{ cmd: '/review-phase N', desc: 'Quality review — bugs, level check, academic check' },
|
|
33
|
+
{ cmd: '/checkpoint', desc: 'Local git commit (never pushes automatically)' },
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
group: 'Code Quality',
|
|
38
|
+
commands: [
|
|
39
|
+
{ cmd: '/write-tests', desc: 'Generate tests for a file, function, or phase' },
|
|
40
|
+
{ cmd: '/humanize-code', desc: 'Adapt code to match your real coding level' },
|
|
41
|
+
{ cmd: '/debug-issue', desc: 'Systematic bug analysis and fix' },
|
|
42
|
+
],
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
group: 'Student Tools',
|
|
46
|
+
commands: [
|
|
47
|
+
{ cmd: '/explain-my-code', desc: 'Generate an explanation for your professor or team' },
|
|
48
|
+
{ cmd: '/professor-check', desc: 'Detect code that looks suspiciously AI-generated' },
|
|
49
|
+
{ cmd: '/generate-report', desc: 'Generate an academic report template' },
|
|
50
|
+
],
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
group: 'Documentation & UI',
|
|
54
|
+
commands: [
|
|
55
|
+
{ cmd: '/design-system', desc: 'Create a UI/UX design system guide' },
|
|
56
|
+
{ cmd: '/generate-docs', desc: 'Generate README and docs/ folder' },
|
|
57
|
+
{ cmd: '/update-dashboard', desc: 'Refresh the HTML dashboard data' },
|
|
58
|
+
],
|
|
59
|
+
},
|
|
60
|
+
];
|
|
61
|
+
function helpCommand() {
|
|
62
|
+
const cwd = process.cwd();
|
|
63
|
+
const initialized = (0, config_1.configExists)(cwd);
|
|
64
|
+
console.log();
|
|
65
|
+
console.log(chalk_1.default.bold.magenta(' ⚡ BrainForge') + chalk_1.default.gray(' — structured AI development'));
|
|
66
|
+
console.log();
|
|
67
|
+
// Project status banner
|
|
68
|
+
if (initialized) {
|
|
69
|
+
try {
|
|
70
|
+
const config = (0, config_1.readConfig)(cwd);
|
|
71
|
+
const bar = progressBar(config.currentPhase, config.totalPhases);
|
|
72
|
+
console.log(chalk_1.default.gray(' Project : ') + chalk_1.default.white(config.projectName));
|
|
73
|
+
console.log(chalk_1.default.gray(' Level : ') + chalk_1.default.cyan(config.codeLevel) +
|
|
74
|
+
chalk_1.default.gray(' · Stack: ') + chalk_1.default.cyan(config.stack.join(', ')));
|
|
75
|
+
console.log(chalk_1.default.gray(' Progress: ') + bar +
|
|
76
|
+
chalk_1.default.gray(` ${config.currentPhase}/${config.totalPhases} phases`));
|
|
77
|
+
console.log();
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// skip if config unreadable
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
console.log(chalk_1.default.yellow(' ⚠ Not initialized.') +
|
|
85
|
+
chalk_1.default.gray(' Run: ') + chalk_1.default.white('brainforge init'));
|
|
86
|
+
console.log();
|
|
87
|
+
}
|
|
88
|
+
// CLI Commands
|
|
89
|
+
logger_1.logger.divider();
|
|
90
|
+
console.log(chalk_1.default.bold.white(' CLI Commands\n'));
|
|
91
|
+
for (const { cmd, desc } of CLI_COMMANDS) {
|
|
92
|
+
console.log(' ' + chalk_1.default.green(cmd.padEnd(34)) + chalk_1.default.gray(desc));
|
|
93
|
+
}
|
|
94
|
+
// Slash Commands
|
|
95
|
+
console.log();
|
|
96
|
+
logger_1.logger.divider();
|
|
97
|
+
console.log(chalk_1.default.bold.white(' Slash Commands') + chalk_1.default.gray(' (paste into your AI tool)\n'));
|
|
98
|
+
for (const group of SLASH_COMMANDS) {
|
|
99
|
+
console.log(chalk_1.default.bold.yellow(' ' + group.group));
|
|
100
|
+
for (const { cmd, desc } of group.commands) {
|
|
101
|
+
console.log(' ' + chalk_1.default.cyan(cmd.padEnd(22)) + chalk_1.default.gray(desc));
|
|
102
|
+
}
|
|
103
|
+
console.log();
|
|
104
|
+
}
|
|
105
|
+
// Workflow reminder
|
|
106
|
+
logger_1.logger.divider();
|
|
107
|
+
console.log(chalk_1.default.bold.white(' Workflow\n'));
|
|
108
|
+
const steps = [
|
|
109
|
+
'/start-project',
|
|
110
|
+
'/create-roadmap',
|
|
111
|
+
'/initiate-phase N',
|
|
112
|
+
'/execute-phase N',
|
|
113
|
+
'/write-tests',
|
|
114
|
+
'/review-phase N',
|
|
115
|
+
'/checkpoint',
|
|
116
|
+
];
|
|
117
|
+
console.log(' ' + steps.map((s) => chalk_1.default.cyan(s)).join(chalk_1.default.gray(' → ')));
|
|
118
|
+
console.log();
|
|
119
|
+
// Docs link
|
|
120
|
+
console.log(chalk_1.default.gray(' Docs: ') +
|
|
121
|
+
chalk_1.default.underline('https://github.com/MEHDImp4/brainforge-ai'));
|
|
122
|
+
console.log();
|
|
123
|
+
}
|
|
124
|
+
function progressBar(current, total) {
|
|
125
|
+
if (total === 0)
|
|
126
|
+
return chalk_1.default.gray('[──────────]');
|
|
127
|
+
const filled = Math.round((current / total) * 10);
|
|
128
|
+
const bar = '█'.repeat(filled) + '─'.repeat(10 - filled);
|
|
129
|
+
return chalk_1.default.green('[') + chalk_1.default.green(bar) + chalk_1.default.green(']') + ' ';
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=help.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAgBA,wBAAsB,YAAY,CAAC,IAAI,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA6H7D"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.serveCommand = serveCommand;
|
|
7
|
+
const http_1 = __importDefault(require("http"));
|
|
8
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const config_1 = require("../core/config");
|
|
11
|
+
const dashboard_1 = require("../core/dashboard");
|
|
12
|
+
const logger_1 = require("../utils/logger");
|
|
13
|
+
const MIME = {
|
|
14
|
+
'.html': 'text/html',
|
|
15
|
+
'.css': 'text/css',
|
|
16
|
+
'.js': 'application/javascript',
|
|
17
|
+
'.json': 'application/json',
|
|
18
|
+
};
|
|
19
|
+
async function serveCommand(port = 3000) {
|
|
20
|
+
const cwd = process.cwd();
|
|
21
|
+
if (!(0, config_1.configExists)(cwd)) {
|
|
22
|
+
logger_1.logger.error('BrainForge not initialized. Run: brainforge init');
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const brainDir = (0, config_1.getBrainforgeDir)(cwd);
|
|
26
|
+
const dashDir = path_1.default.join(brainDir, 'dashboard');
|
|
27
|
+
const clients = new Set();
|
|
28
|
+
// Debounce helper so rapid file saves don't spam reloads
|
|
29
|
+
let debounceTimer = null;
|
|
30
|
+
function scheduleReload() {
|
|
31
|
+
if (debounceTimer)
|
|
32
|
+
clearTimeout(debounceTimer);
|
|
33
|
+
debounceTimer = setTimeout(async () => {
|
|
34
|
+
try {
|
|
35
|
+
const config = (0, config_1.readConfig)(cwd);
|
|
36
|
+
const data = await (0, dashboard_1.generateDashboardData)(config, cwd);
|
|
37
|
+
await (0, dashboard_1.writeDashboardData)(data, cwd);
|
|
38
|
+
broadcast(clients, 'reload');
|
|
39
|
+
logger_1.logger.info('Dashboard refreshed — reloading browsers…');
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
logger_1.logger.warn('Reload failed: ' + (err instanceof Error ? err.message : String(err)));
|
|
43
|
+
}
|
|
44
|
+
}, 300);
|
|
45
|
+
}
|
|
46
|
+
// Watch the whole .brainforge/ directory recursively
|
|
47
|
+
fs_extra_1.default.watch(brainDir, { recursive: true }, (event, filename) => {
|
|
48
|
+
if (filename && filename.includes('dashboard'))
|
|
49
|
+
return; // avoid loop
|
|
50
|
+
scheduleReload();
|
|
51
|
+
});
|
|
52
|
+
const server = http_1.default.createServer(async (req, res) => {
|
|
53
|
+
const url = req.url ?? '/';
|
|
54
|
+
// SSE endpoint
|
|
55
|
+
if (url === '/events') {
|
|
56
|
+
res.writeHead(200, {
|
|
57
|
+
'Content-Type': 'text/event-stream',
|
|
58
|
+
'Cache-Control': 'no-cache',
|
|
59
|
+
Connection: 'keep-alive',
|
|
60
|
+
'Access-Control-Allow-Origin': '*',
|
|
61
|
+
});
|
|
62
|
+
res.write('data: connected\n\n');
|
|
63
|
+
clients.add(res);
|
|
64
|
+
req.on('close', () => clients.delete(res));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
// Static file serving
|
|
68
|
+
let filePath = url === '/' ? path_1.default.join(dashDir, 'index.html') : path_1.default.join(dashDir, url);
|
|
69
|
+
filePath = path_1.default.normalize(filePath);
|
|
70
|
+
// Security: prevent directory traversal
|
|
71
|
+
if (!filePath.startsWith(path_1.default.normalize(dashDir))) {
|
|
72
|
+
res.writeHead(403);
|
|
73
|
+
res.end('Forbidden');
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (!fs_extra_1.default.existsSync(filePath)) {
|
|
77
|
+
res.writeHead(404);
|
|
78
|
+
res.end('Not found');
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const ext = path_1.default.extname(filePath);
|
|
82
|
+
const mime = MIME[ext] ?? 'application/octet-stream';
|
|
83
|
+
// Inject SSE client into HTML
|
|
84
|
+
if (ext === '.html') {
|
|
85
|
+
let html = fs_extra_1.default.readFileSync(filePath, 'utf-8');
|
|
86
|
+
html = injectSseClient(html);
|
|
87
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
88
|
+
res.end(html);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
res.writeHead(200, { 'Content-Type': mime });
|
|
92
|
+
fs_extra_1.default.createReadStream(filePath).pipe(res);
|
|
93
|
+
});
|
|
94
|
+
// Initial data generation before starting
|
|
95
|
+
try {
|
|
96
|
+
const config = (0, config_1.readConfig)(cwd);
|
|
97
|
+
const data = await (0, dashboard_1.generateDashboardData)(config, cwd);
|
|
98
|
+
await (0, dashboard_1.writeDashboardData)(data, cwd);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// non-fatal
|
|
102
|
+
}
|
|
103
|
+
server.listen(port, () => {
|
|
104
|
+
logger_1.logger.title('⚡ BrainForge Dashboard — Live');
|
|
105
|
+
logger_1.logger.divider();
|
|
106
|
+
logger_1.logger.success(`Running at http://localhost:${port}`);
|
|
107
|
+
logger_1.logger.info('Dashboard reloads automatically when .brainforge/ files change.');
|
|
108
|
+
logger_1.logger.info('Press Ctrl+C to stop.');
|
|
109
|
+
logger_1.logger.divider();
|
|
110
|
+
// Try to open browser
|
|
111
|
+
try {
|
|
112
|
+
const { execSync } = require('child_process');
|
|
113
|
+
const open = process.platform === 'win32'
|
|
114
|
+
? `start http://localhost:${port}`
|
|
115
|
+
: process.platform === 'darwin'
|
|
116
|
+
? `open http://localhost:${port}`
|
|
117
|
+
: `xdg-open http://localhost:${port}`;
|
|
118
|
+
execSync(open, { stdio: 'ignore' });
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
// ignore if can't open
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
server.on('error', (err) => {
|
|
125
|
+
if (err.code === 'EADDRINUSE') {
|
|
126
|
+
logger_1.logger.error(`Port ${port} is already in use. Try: brainforge serve --port ${port + 1}`);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
logger_1.logger.error(err.message);
|
|
130
|
+
}
|
|
131
|
+
process.exit(1);
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
function broadcast(clients, event) {
|
|
135
|
+
for (const client of clients) {
|
|
136
|
+
client.write(`event: ${event}\ndata: ${Date.now()}\n\n`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
function injectSseClient(html) {
|
|
140
|
+
const script = `
|
|
141
|
+
<script>
|
|
142
|
+
(function () {
|
|
143
|
+
const es = new EventSource('/events');
|
|
144
|
+
es.addEventListener('reload', () => location.reload());
|
|
145
|
+
es.addEventListener('error', () => {
|
|
146
|
+
setTimeout(() => location.reload(), 2000);
|
|
147
|
+
});
|
|
148
|
+
// Show a small indicator in the corner
|
|
149
|
+
const dot = document.createElement('div');
|
|
150
|
+
dot.title = 'BrainForge live reload active';
|
|
151
|
+
dot.style.cssText = 'position:fixed;bottom:12px;right:12px;width:10px;height:10px;border-radius:50%;background:#22c55e;box-shadow:0 0 6px #22c55e;z-index:9999;';
|
|
152
|
+
document.addEventListener('DOMContentLoaded', () => document.body.appendChild(dot));
|
|
153
|
+
es.onopen = () => { dot.style.background = '#22c55e'; dot.style.boxShadow = '0 0 6px #22c55e'; };
|
|
154
|
+
es.onerror = () => { dot.style.background = '#ef4444'; dot.style.boxShadow = '0 0 6px #ef4444'; };
|
|
155
|
+
})();
|
|
156
|
+
</script>`;
|
|
157
|
+
// Inject before </body> if present, otherwise append
|
|
158
|
+
return html.includes('</body>')
|
|
159
|
+
? html.replace('</body>', script + '\n</body>')
|
|
160
|
+
: html + script;
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=serve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":";;;;;AAgBA,oCA6HC;AA7ID,gDAAwB;AACxB,wDAA0B;AAC1B,gDAAwB;AACxB,2CAA4E;AAC5E,iDAA8E;AAC9E,4CAAyC;AAEzC,MAAM,IAAI,GAA2B;IACnC,OAAO,EAAE,WAAW;IACpB,MAAM,EAAE,UAAU;IAClB,KAAK,EAAE,wBAAwB;IAC/B,OAAO,EAAE,kBAAkB;CAC5B,CAAC;AAIK,KAAK,UAAU,YAAY,CAAC,IAAI,GAAG,IAAI;IAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,IAAI,CAAC,IAAA,qBAAY,EAAC,GAAG,CAAC,EAAE,CAAC;QACvB,eAAM,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,IAAA,yBAAgB,EAAC,GAAG,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACjD,MAAM,OAAO,GAAmB,IAAI,GAAG,EAAE,CAAC;IAE1C,yDAAyD;IACzD,IAAI,aAAa,GAAyC,IAAI,CAAC;IAC/D,SAAS,cAAc;QACrB,IAAI,aAAa;YAAE,YAAY,CAAC,aAAa,CAAC,CAAC;QAC/C,aAAa,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;YACpC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,GAAG,CAAC,CAAC;gBAC/B,MAAM,IAAI,GAAG,MAAM,IAAA,iCAAqB,EAAC,MAAM,EAAE,GAAG,CAAC,CAAC;gBACtD,MAAM,IAAA,8BAAkB,EAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBACpC,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBAC7B,eAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;YAC3D,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,eAAM,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACtF,CAAC;QACH,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC;IAED,qDAAqD;IACrD,kBAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;QAC1D,IAAI,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC;YAAE,OAAO,CAAC,aAAa;QACrE,cAAc,EAAE,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,cAAI,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAClD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC;QAE3B,eAAe;QACf,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;gBACjB,cAAc,EAAE,mBAAmB;gBACnC,eAAe,EAAE,UAAU;gBAC3B,UAAU,EAAE,YAAY;gBACxB,6BAA6B,EAAE,GAAG;aACnC,CAAC,CAAC;YACH,GAAG,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACjB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3C,OAAO;QACT,CAAC;QAED,sBAAsB;QACtB,IAAI,QAAQ,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACxF,QAAQ,GAAG,cAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAEpC,wCAAwC;QACxC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,cAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YAClD,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,kBAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,0BAA0B,CAAC;QAErD,8BAA8B;QAC9B,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACpB,IAAI,IAAI,GAAG,kBAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC9C,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;YAC7B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;YACpD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACd,OAAO;QACT,CAAC;QAED,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,kBAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,0CAA0C;IAC1C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,MAAM,IAAA,iCAAqB,EAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACtD,MAAM,IAAA,8BAAkB,EAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;QACvB,eAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC9C,eAAM,CAAC,OAAO,EAAE,CAAC;QACjB,eAAM,CAAC,OAAO,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC;QACtD,eAAM,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;QAC/E,eAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACrC,eAAM,CAAC,OAAO,EAAE,CAAC;QAEjB,sBAAsB;QACtB,IAAI,CAAC;YACH,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;YAC9C,MAAM,IAAI,GACR,OAAO,CAAC,QAAQ,KAAK,OAAO;gBAC1B,CAAC,CAAC,0BAA0B,IAAI,EAAE;gBAClC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ;oBAC/B,CAAC,CAAC,yBAAyB,IAAI,EAAE;oBACjC,CAAC,CAAC,6BAA6B,IAAI,EAAE,CAAC;YAC1C,QAAQ,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,uBAAuB;QACzB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;QAChD,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC9B,eAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,oDAAoD,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3F,CAAC;aAAM,CAAC;YACN,eAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,SAAS,CAAC,OAAuB,EAAE,KAAa;IACvD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,UAAU,KAAK,WAAW,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;UAgBP,CAAC;IACT,qDAAqD;IACrD,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC7B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAAC;QAC/C,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC;AACpB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/core/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAqTlF;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/core/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAqTlF;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAytBpF;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgJrF"}
|
package/dist/core/templates.js
CHANGED
|
@@ -917,6 +917,104 @@ brainforge update-dashboard
|
|
|
917
917
|
|
|
918
918
|
- Updated \`.brainforge/dashboard/data.json\`
|
|
919
919
|
- Message: "Dashboard updated. Open .brainforge/dashboard/index.html"
|
|
920
|
+
`,
|
|
921
|
+
'write-tests.md': `# /write-tests
|
|
922
|
+
|
|
923
|
+
**Objective:** Generate tests for a file, function, or entire phase.
|
|
924
|
+
|
|
925
|
+
## Usage
|
|
926
|
+
|
|
927
|
+
\`\`\`
|
|
928
|
+
/write-tests [file or feature or phase number]
|
|
929
|
+
\`\`\`
|
|
930
|
+
|
|
931
|
+
Examples:
|
|
932
|
+
\`\`\`
|
|
933
|
+
/write-tests src/auth/login.ts
|
|
934
|
+
/write-tests the login feature
|
|
935
|
+
/write-tests phase 2
|
|
936
|
+
\`\`\`
|
|
937
|
+
|
|
938
|
+
## Context to Read First
|
|
939
|
+
|
|
940
|
+
- \`.brainforge/config.json\` — stack and code level
|
|
941
|
+
- \`.brainforge/memory/coding-style.md\` — test style rules
|
|
942
|
+
- Target file(s) to test
|
|
943
|
+
|
|
944
|
+
## Steps
|
|
945
|
+
|
|
946
|
+
1. Read the target file(s) and understand the logic
|
|
947
|
+
2. Identify what needs to be tested:
|
|
948
|
+
- Pure functions → unit tests
|
|
949
|
+
- API routes → integration tests
|
|
950
|
+
- UI components → component tests
|
|
951
|
+
3. Choose the right test framework for the stack (see below)
|
|
952
|
+
4. Write tests at **${config.codeLevel}** complexity level
|
|
953
|
+
5. Place test files next to source or in a \`tests/\` folder
|
|
954
|
+
6. Verify tests pass conceptually before writing
|
|
955
|
+
|
|
956
|
+
## Test Framework by Stack
|
|
957
|
+
|
|
958
|
+
| Stack | Framework | Command |
|
|
959
|
+
|-------|-----------|---------|
|
|
960
|
+
| Node.js / TypeScript | Jest or Vitest | \`npm test\` |
|
|
961
|
+
| React | Vitest + Testing Library | \`npm test\` |
|
|
962
|
+
| Next.js | Jest + Testing Library | \`npm test\` |
|
|
963
|
+
| Python | pytest | \`pytest\` |
|
|
964
|
+
| Laravel | PHPUnit | \`php artisan test\` |
|
|
965
|
+
|
|
966
|
+
## What to Test (by level)
|
|
967
|
+
|
|
968
|
+
### ${config.codeLevel === 'beginner' ? 'beginner' : config.codeLevel === 'academic-realistic' ? 'academic-realistic' : config.codeLevel === 'professional' ? 'professional' : 'intermediate'}
|
|
969
|
+
|
|
970
|
+
${config.codeLevel === 'beginner'
|
|
971
|
+
? `- Test the main happy path only
|
|
972
|
+
- 2-3 tests per function maximum
|
|
973
|
+
- Simple assertions (toBe, toEqual)
|
|
974
|
+
- No mocks — test real behavior
|
|
975
|
+
- Comments explaining what each test does`
|
|
976
|
+
: config.codeLevel === 'intermediate'
|
|
977
|
+
? `- Happy path + main edge cases
|
|
978
|
+
- Group tests with describe()
|
|
979
|
+
- Simple mocks for external dependencies
|
|
980
|
+
- Test error cases for user inputs
|
|
981
|
+
- Aim for ~60% coverage on critical files`
|
|
982
|
+
: config.codeLevel === 'academic-realistic'
|
|
983
|
+
? `- Happy path + 2-3 edge cases per function
|
|
984
|
+
- Group with describe(), use clear test names
|
|
985
|
+
- Mock external services (DB, API calls)
|
|
986
|
+
- Test error handling on inputs
|
|
987
|
+
- Coverage enough to show you care — not 100%
|
|
988
|
+
- Test names readable as plain English sentences`
|
|
989
|
+
: `- Full happy path + all edge cases
|
|
990
|
+
- Mock all external dependencies
|
|
991
|
+
- Test error boundaries and failure modes
|
|
992
|
+
- Aim for 80%+ coverage on business logic
|
|
993
|
+
- Integration tests for API endpoints
|
|
994
|
+
- Snapshot tests for stable UI components`}
|
|
995
|
+
|
|
996
|
+
## Test File Naming
|
|
997
|
+
|
|
998
|
+
\`\`\`
|
|
999
|
+
src/auth/login.ts → src/auth/login.test.ts
|
|
1000
|
+
src/utils/format.ts → src/utils/format.test.ts
|
|
1001
|
+
src/pages/Home.tsx → src/pages/Home.test.tsx
|
|
1002
|
+
\`\`\`
|
|
1003
|
+
|
|
1004
|
+
## Rules
|
|
1005
|
+
|
|
1006
|
+
- Do NOT test implementation details — test behavior
|
|
1007
|
+
- Do NOT write tests that always pass (useless assertions)
|
|
1008
|
+
- Keep test files under 150 lines — split if needed
|
|
1009
|
+
- Each test must have a clear, readable name
|
|
1010
|
+
- NEVER skip failing tests with \`.skip\` — fix them
|
|
1011
|
+
|
|
1012
|
+
## After Writing Tests
|
|
1013
|
+
|
|
1014
|
+
1. Add test script to \`package.json\` if missing
|
|
1015
|
+
2. Run the tests mentally to verify they make sense
|
|
1016
|
+
3. Update \`.brainforge/phases/phase-XX.md\` checklist
|
|
1017
|
+
4. Suggest: \`/checkpoint\` to commit the tests
|
|
920
1018
|
`,
|
|
921
1019
|
};
|
|
922
1020
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/core/templates.ts"],"names":[],"mappings":";;AAEA,8CAqTC;AAED,
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/core/templates.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED