brainforge-ai 1.1.1 → 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.
@@ -3,326 +3,326 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getDashboardHtml = getDashboardHtml;
4
4
  exports.getDashboardCss = getDashboardCss;
5
5
  function getDashboardHtml() {
6
- return `<!DOCTYPE html>
7
- <html lang="en">
8
- <head>
9
- <meta charset="UTF-8" />
10
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
11
- <title>BrainForge Dashboard</title>
12
- <link rel="stylesheet" href="style.css" />
13
- </head>
14
- <body>
15
- <div class="container">
16
- <header class="header">
17
- <div class="logo">⚡ BrainForge</div>
18
- <div id="updated-at" class="updated-at"></div>
19
- </header>
20
-
21
- <section class="project-card">
22
- <h1 id="project-name"></h1>
23
- <p id="project-description" class="description"></p>
24
- <div class="meta-grid">
25
- <div class="meta-item"><span class="label">Type</span><span id="project-type"></span></div>
26
- <div class="meta-item"><span class="label">Stack</span><span id="project-stack"></span></div>
27
- <div class="meta-item"><span class="label">User Level</span><span id="user-level"></span></div>
28
- <div class="meta-item"><span class="label">Code Level</span><span id="code-level" class="badge"></span></div>
29
- <div class="meta-item"><span class="label">Git</span><span id="git-status"></span></div>
30
- </div>
31
- </section>
32
-
33
- <section class="progress-section">
34
- <div class="section-header">
35
- <h2>Phases</h2>
36
- <span id="phase-counter" class="counter"></span>
37
- </div>
38
- <div class="progress-bar-wrap">
39
- <div id="progress-bar" class="progress-bar"></div>
40
- </div>
41
- <div id="phases-list" class="phases-list"></div>
42
- </section>
43
-
44
- <div class="two-col">
45
- <section class="card">
46
- <h2>Recent Commits</h2>
47
- <ul id="commits-list" class="list"></ul>
48
- </section>
49
-
50
- <section class="card">
51
- <h2>Known Bugs</h2>
52
- <ul id="bugs-list" class="list"></ul>
53
- </section>
54
- </div>
55
-
56
- <section class="card">
57
- <h2>Last Decisions</h2>
58
- <ul id="decisions-list" class="list"></ul>
59
- </section>
60
-
61
- <footer class="footer">
62
- Powered by <strong>BrainForge</strong> — structured AI development
63
- </footer>
64
- </div>
65
-
66
- <script>
67
- async function loadData() {
68
- try {
69
- // Use inlined data (file:// mode) or fetch (http:// mode via brainforge serve)
70
- let d = window.__BRAINFORGE_DATA__;
71
- if (!d) {
72
- const res = await fetch('data.json?t=' + Date.now());
73
- d = await res.json();
74
- }
75
-
76
- document.title = 'BrainForge — ' + d.projectName;
77
- document.getElementById('project-name').textContent = d.projectName;
78
- document.getElementById('project-description').textContent = d.description || 'No description yet.';
79
- document.getElementById('project-type').textContent = d.projectType || '—';
80
- document.getElementById('project-stack').textContent = (d.stack || []).join(', ') || '—';
81
- document.getElementById('user-level').textContent = d.userLevel || '—';
82
- document.getElementById('code-level').textContent = d.codeLevel || '—';
83
- document.getElementById('git-status').textContent = d.gitStatus || '—';
84
- document.getElementById('updated-at').textContent = 'Updated: ' + new Date(d.updatedAt).toLocaleString();
85
-
86
- const done = (d.phases || []).filter(p => p.status === 'done').length;
87
- const total = d.totalPhases || d.phases?.length || 0;
88
- document.getElementById('phase-counter').textContent = done + ' / ' + total + ' done';
89
- const pct = total > 0 ? Math.round((done / total) * 100) : 0;
90
- document.getElementById('progress-bar').style.width = pct + '%';
91
- document.getElementById('progress-bar').textContent = pct + '%';
92
-
93
- const phasesList = document.getElementById('phases-list');
94
- (d.phases || []).forEach(p => {
95
- const div = document.createElement('div');
96
- div.className = 'phase-item ' + p.status;
97
- div.innerHTML = '<span class="phase-num">' + String(p.id).padStart(2,'0') + '</span>'
98
- + '<span class="phase-title">' + p.title + '</span>'
99
- + '<span class="phase-status ' + p.status + '">' + p.status + '</span>';
100
- phasesList.appendChild(div);
101
- });
102
-
103
- renderList('commits-list', d.recentCommits, 'No commits yet.');
104
- renderList('bugs-list', d.knownBugs, 'No bugs tracked.');
105
- renderList('decisions-list', d.decisions, 'No decisions recorded.');
106
- } catch (e) {
107
- document.body.innerHTML += '<p style="color:red;padding:1rem">Error loading data.json: ' + e.message + '</p>';
108
- }
109
- }
110
-
111
- function renderList(id, items, empty) {
112
- const el = document.getElementById(id);
113
- if (!items || items.length === 0) {
114
- el.innerHTML = '<li class="empty">' + empty + '</li>';
115
- return;
116
- }
117
- el.innerHTML = items.map(i => '<li>' + i + '</li>').join('');
118
- }
119
-
120
- loadData();
121
- </script>
122
- </body>
6
+ return `<!DOCTYPE html>
7
+ <html lang="en">
8
+ <head>
9
+ <meta charset="UTF-8" />
10
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
11
+ <title>BrainForge Dashboard</title>
12
+ <link rel="stylesheet" href="style.css" />
13
+ </head>
14
+ <body>
15
+ <div class="container">
16
+ <header class="header">
17
+ <div class="logo">⚡ BrainForge</div>
18
+ <div id="updated-at" class="updated-at"></div>
19
+ </header>
20
+
21
+ <section class="project-card">
22
+ <h1 id="project-name"></h1>
23
+ <p id="project-description" class="description"></p>
24
+ <div class="meta-grid">
25
+ <div class="meta-item"><span class="label">Type</span><span id="project-type"></span></div>
26
+ <div class="meta-item"><span class="label">Stack</span><span id="project-stack"></span></div>
27
+ <div class="meta-item"><span class="label">User Level</span><span id="user-level"></span></div>
28
+ <div class="meta-item"><span class="label">Code Level</span><span id="code-level" class="badge"></span></div>
29
+ <div class="meta-item"><span class="label">Git</span><span id="git-status"></span></div>
30
+ </div>
31
+ </section>
32
+
33
+ <section class="progress-section">
34
+ <div class="section-header">
35
+ <h2>Phases</h2>
36
+ <span id="phase-counter" class="counter"></span>
37
+ </div>
38
+ <div class="progress-bar-wrap">
39
+ <div id="progress-bar" class="progress-bar"></div>
40
+ </div>
41
+ <div id="phases-list" class="phases-list"></div>
42
+ </section>
43
+
44
+ <div class="two-col">
45
+ <section class="card">
46
+ <h2>Recent Commits</h2>
47
+ <ul id="commits-list" class="list"></ul>
48
+ </section>
49
+
50
+ <section class="card">
51
+ <h2>Known Bugs</h2>
52
+ <ul id="bugs-list" class="list"></ul>
53
+ </section>
54
+ </div>
55
+
56
+ <section class="card">
57
+ <h2>Last Decisions</h2>
58
+ <ul id="decisions-list" class="list"></ul>
59
+ </section>
60
+
61
+ <footer class="footer">
62
+ Powered by <strong>BrainForge</strong> — structured AI development
63
+ </footer>
64
+ </div>
65
+
66
+ <script>
67
+ async function loadData() {
68
+ try {
69
+ // Use inlined data (file:// mode) or fetch (http:// mode via brainforge serve)
70
+ let d = window.__BRAINFORGE_DATA__;
71
+ if (!d) {
72
+ const res = await fetch('data.json?t=' + Date.now());
73
+ d = await res.json();
74
+ }
75
+
76
+ document.title = 'BrainForge — ' + d.projectName;
77
+ document.getElementById('project-name').textContent = d.projectName;
78
+ document.getElementById('project-description').textContent = d.description || 'No description yet.';
79
+ document.getElementById('project-type').textContent = d.projectType || '—';
80
+ document.getElementById('project-stack').textContent = (d.stack || []).join(', ') || '—';
81
+ document.getElementById('user-level').textContent = d.userLevel || '—';
82
+ document.getElementById('code-level').textContent = d.codeLevel || '—';
83
+ document.getElementById('git-status').textContent = d.gitStatus || '—';
84
+ document.getElementById('updated-at').textContent = 'Updated: ' + new Date(d.updatedAt).toLocaleString();
85
+
86
+ const done = (d.phases || []).filter(p => p.status === 'done').length;
87
+ const total = d.totalPhases || d.phases?.length || 0;
88
+ document.getElementById('phase-counter').textContent = done + ' / ' + total + ' done';
89
+ const pct = total > 0 ? Math.round((done / total) * 100) : 0;
90
+ document.getElementById('progress-bar').style.width = pct + '%';
91
+ document.getElementById('progress-bar').textContent = pct + '%';
92
+
93
+ const phasesList = document.getElementById('phases-list');
94
+ (d.phases || []).forEach(p => {
95
+ const div = document.createElement('div');
96
+ div.className = 'phase-item ' + p.status;
97
+ div.innerHTML = '<span class="phase-num">' + String(p.id).padStart(2,'0') + '</span>'
98
+ + '<span class="phase-title">' + p.title + '</span>'
99
+ + '<span class="phase-status ' + p.status + '">' + p.status + '</span>';
100
+ phasesList.appendChild(div);
101
+ });
102
+
103
+ renderList('commits-list', d.recentCommits, 'No commits yet.');
104
+ renderList('bugs-list', d.knownBugs, 'No bugs tracked.');
105
+ renderList('decisions-list', d.decisions, 'No decisions recorded.');
106
+ } catch (e) {
107
+ document.body.innerHTML += '<p style="color:red;padding:1rem">Error loading data.json: ' + e.message + '</p>';
108
+ }
109
+ }
110
+
111
+ function renderList(id, items, empty) {
112
+ const el = document.getElementById(id);
113
+ if (!items || items.length === 0) {
114
+ el.innerHTML = '<li class="empty">' + empty + '</li>';
115
+ return;
116
+ }
117
+ el.innerHTML = items.map(i => '<li>' + i + '</li>').join('');
118
+ }
119
+
120
+ loadData();
121
+ </script>
122
+ </body>
123
123
  </html>`;
124
124
  }
125
125
  function getDashboardCss() {
126
- return `*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
127
-
128
- :root {
129
- --bg: #0f172a;
130
- --surface: #1e293b;
131
- --surface2: #273549;
132
- --primary: #6366f1;
133
- --primary-light: #818cf8;
134
- --success: #22c55e;
135
- --warning: #f59e0b;
136
- --error: #ef4444;
137
- --text: #f1f5f9;
138
- --muted: #94a3b8;
139
- --border: #334155;
140
- --radius: 10px;
141
- }
142
-
143
- body {
144
- background: var(--bg);
145
- color: var(--text);
146
- font-family: 'Inter', system-ui, -apple-system, sans-serif;
147
- font-size: 15px;
148
- line-height: 1.6;
149
- min-height: 100vh;
150
- }
151
-
152
- .container {
153
- max-width: 1100px;
154
- margin: 0 auto;
155
- padding: 2rem 1.5rem;
156
- }
157
-
158
- .header {
159
- display: flex;
160
- justify-content: space-between;
161
- align-items: center;
162
- margin-bottom: 2rem;
163
- }
164
-
165
- .logo {
166
- font-size: 1.4rem;
167
- font-weight: 700;
168
- color: var(--primary-light);
169
- letter-spacing: -0.5px;
170
- }
171
-
172
- .updated-at { color: var(--muted); font-size: 0.8rem; }
173
-
174
- .project-card {
175
- background: var(--surface);
176
- border: 1px solid var(--border);
177
- border-radius: var(--radius);
178
- padding: 1.75rem;
179
- margin-bottom: 1.5rem;
180
- }
181
-
182
- h1 { font-size: 1.6rem; font-weight: 700; margin-bottom: 0.4rem; }
183
- h2 { font-size: 1.05rem; font-weight: 600; margin-bottom: 1rem; color: var(--primary-light); }
184
-
185
- .description { color: var(--muted); margin-bottom: 1.25rem; }
186
-
187
- .meta-grid {
188
- display: grid;
189
- grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
190
- gap: 0.75rem;
191
- }
192
-
193
- .meta-item {
194
- background: var(--surface2);
195
- border-radius: 8px;
196
- padding: 0.6rem 0.9rem;
197
- display: flex;
198
- flex-direction: column;
199
- gap: 2px;
200
- }
201
-
202
- .label { font-size: 0.72rem; color: var(--muted); text-transform: uppercase; letter-spacing: 0.5px; }
203
-
204
- .badge {
205
- display: inline-block;
206
- background: var(--primary);
207
- color: #fff;
208
- border-radius: 20px;
209
- padding: 1px 10px;
210
- font-size: 0.8rem;
211
- font-weight: 600;
212
- width: fit-content;
213
- }
214
-
215
- .progress-section {
216
- background: var(--surface);
217
- border: 1px solid var(--border);
218
- border-radius: var(--radius);
219
- padding: 1.5rem;
220
- margin-bottom: 1.5rem;
221
- }
222
-
223
- .section-header {
224
- display: flex;
225
- justify-content: space-between;
226
- align-items: center;
227
- margin-bottom: 0.75rem;
228
- }
229
-
230
- .counter { color: var(--muted); font-size: 0.85rem; }
231
-
232
- .progress-bar-wrap {
233
- background: var(--surface2);
234
- border-radius: 20px;
235
- height: 22px;
236
- overflow: hidden;
237
- margin-bottom: 1.25rem;
238
- }
239
-
240
- .progress-bar {
241
- background: linear-gradient(90deg, var(--primary), var(--primary-light));
242
- height: 100%;
243
- border-radius: 20px;
244
- display: flex;
245
- align-items: center;
246
- justify-content: center;
247
- font-size: 0.75rem;
248
- font-weight: 600;
249
- color: #fff;
250
- min-width: 2rem;
251
- transition: width 0.5s ease;
252
- }
253
-
254
- .phases-list { display: flex; flex-direction: column; gap: 0.5rem; }
255
-
256
- .phase-item {
257
- display: flex;
258
- align-items: center;
259
- gap: 0.75rem;
260
- padding: 0.6rem 0.9rem;
261
- background: var(--surface2);
262
- border-radius: 8px;
263
- border-left: 3px solid var(--border);
264
- }
265
-
266
- .phase-item.done { border-left-color: var(--success); }
267
- .phase-item.in-progress { border-left-color: var(--primary); }
268
- .phase-item.pending { border-left-color: var(--border); }
269
-
270
- .phase-num { color: var(--muted); font-size: 0.8rem; font-weight: 600; min-width: 24px; }
271
- .phase-title { flex: 1; font-size: 0.9rem; }
272
-
273
- .phase-status {
274
- font-size: 0.72rem;
275
- font-weight: 600;
276
- padding: 2px 8px;
277
- border-radius: 20px;
278
- text-transform: capitalize;
279
- }
280
- .phase-status.done { background: #14532d; color: var(--success); }
281
- .phase-status.in-progress { background: #1e1b4b; color: var(--primary-light); }
282
- .phase-status.pending { background: var(--surface); color: var(--muted); }
283
-
284
- .two-col {
285
- display: grid;
286
- grid-template-columns: 1fr 1fr;
287
- gap: 1.5rem;
288
- margin-bottom: 1.5rem;
289
- }
290
-
291
- @media (max-width: 640px) { .two-col { grid-template-columns: 1fr; } }
292
-
293
- .card {
294
- background: var(--surface);
295
- border: 1px solid var(--border);
296
- border-radius: var(--radius);
297
- padding: 1.5rem;
298
- margin-bottom: 1.5rem;
299
- }
300
-
301
- .list {
302
- list-style: none;
303
- display: flex;
304
- flex-direction: column;
305
- gap: 0.4rem;
306
- }
307
-
308
- .list li {
309
- padding: 0.4rem 0.6rem;
310
- background: var(--surface2);
311
- border-radius: 6px;
312
- font-size: 0.85rem;
313
- color: var(--text);
314
- }
315
-
316
- .list li.empty { color: var(--muted); font-style: italic; background: none; padding: 0; }
317
-
318
- .footer {
319
- text-align: center;
320
- color: var(--muted);
321
- font-size: 0.8rem;
322
- padding-top: 1.5rem;
323
- border-top: 1px solid var(--border);
324
- margin-top: 1rem;
325
- }
126
+ return `*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
127
+
128
+ :root {
129
+ --bg: #0f172a;
130
+ --surface: #1e293b;
131
+ --surface2: #273549;
132
+ --primary: #6366f1;
133
+ --primary-light: #818cf8;
134
+ --success: #22c55e;
135
+ --warning: #f59e0b;
136
+ --error: #ef4444;
137
+ --text: #f1f5f9;
138
+ --muted: #94a3b8;
139
+ --border: #334155;
140
+ --radius: 10px;
141
+ }
142
+
143
+ body {
144
+ background: var(--bg);
145
+ color: var(--text);
146
+ font-family: 'Inter', system-ui, -apple-system, sans-serif;
147
+ font-size: 15px;
148
+ line-height: 1.6;
149
+ min-height: 100vh;
150
+ }
151
+
152
+ .container {
153
+ max-width: 1100px;
154
+ margin: 0 auto;
155
+ padding: 2rem 1.5rem;
156
+ }
157
+
158
+ .header {
159
+ display: flex;
160
+ justify-content: space-between;
161
+ align-items: center;
162
+ margin-bottom: 2rem;
163
+ }
164
+
165
+ .logo {
166
+ font-size: 1.4rem;
167
+ font-weight: 700;
168
+ color: var(--primary-light);
169
+ letter-spacing: -0.5px;
170
+ }
171
+
172
+ .updated-at { color: var(--muted); font-size: 0.8rem; }
173
+
174
+ .project-card {
175
+ background: var(--surface);
176
+ border: 1px solid var(--border);
177
+ border-radius: var(--radius);
178
+ padding: 1.75rem;
179
+ margin-bottom: 1.5rem;
180
+ }
181
+
182
+ h1 { font-size: 1.6rem; font-weight: 700; margin-bottom: 0.4rem; }
183
+ h2 { font-size: 1.05rem; font-weight: 600; margin-bottom: 1rem; color: var(--primary-light); }
184
+
185
+ .description { color: var(--muted); margin-bottom: 1.25rem; }
186
+
187
+ .meta-grid {
188
+ display: grid;
189
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
190
+ gap: 0.75rem;
191
+ }
192
+
193
+ .meta-item {
194
+ background: var(--surface2);
195
+ border-radius: 8px;
196
+ padding: 0.6rem 0.9rem;
197
+ display: flex;
198
+ flex-direction: column;
199
+ gap: 2px;
200
+ }
201
+
202
+ .label { font-size: 0.72rem; color: var(--muted); text-transform: uppercase; letter-spacing: 0.5px; }
203
+
204
+ .badge {
205
+ display: inline-block;
206
+ background: var(--primary);
207
+ color: #fff;
208
+ border-radius: 20px;
209
+ padding: 1px 10px;
210
+ font-size: 0.8rem;
211
+ font-weight: 600;
212
+ width: fit-content;
213
+ }
214
+
215
+ .progress-section {
216
+ background: var(--surface);
217
+ border: 1px solid var(--border);
218
+ border-radius: var(--radius);
219
+ padding: 1.5rem;
220
+ margin-bottom: 1.5rem;
221
+ }
222
+
223
+ .section-header {
224
+ display: flex;
225
+ justify-content: space-between;
226
+ align-items: center;
227
+ margin-bottom: 0.75rem;
228
+ }
229
+
230
+ .counter { color: var(--muted); font-size: 0.85rem; }
231
+
232
+ .progress-bar-wrap {
233
+ background: var(--surface2);
234
+ border-radius: 20px;
235
+ height: 22px;
236
+ overflow: hidden;
237
+ margin-bottom: 1.25rem;
238
+ }
239
+
240
+ .progress-bar {
241
+ background: linear-gradient(90deg, var(--primary), var(--primary-light));
242
+ height: 100%;
243
+ border-radius: 20px;
244
+ display: flex;
245
+ align-items: center;
246
+ justify-content: center;
247
+ font-size: 0.75rem;
248
+ font-weight: 600;
249
+ color: #fff;
250
+ min-width: 2rem;
251
+ transition: width 0.5s ease;
252
+ }
253
+
254
+ .phases-list { display: flex; flex-direction: column; gap: 0.5rem; }
255
+
256
+ .phase-item {
257
+ display: flex;
258
+ align-items: center;
259
+ gap: 0.75rem;
260
+ padding: 0.6rem 0.9rem;
261
+ background: var(--surface2);
262
+ border-radius: 8px;
263
+ border-left: 3px solid var(--border);
264
+ }
265
+
266
+ .phase-item.done { border-left-color: var(--success); }
267
+ .phase-item.in-progress { border-left-color: var(--primary); }
268
+ .phase-item.pending { border-left-color: var(--border); }
269
+
270
+ .phase-num { color: var(--muted); font-size: 0.8rem; font-weight: 600; min-width: 24px; }
271
+ .phase-title { flex: 1; font-size: 0.9rem; }
272
+
273
+ .phase-status {
274
+ font-size: 0.72rem;
275
+ font-weight: 600;
276
+ padding: 2px 8px;
277
+ border-radius: 20px;
278
+ text-transform: capitalize;
279
+ }
280
+ .phase-status.done { background: #14532d; color: var(--success); }
281
+ .phase-status.in-progress { background: #1e1b4b; color: var(--primary-light); }
282
+ .phase-status.pending { background: var(--surface); color: var(--muted); }
283
+
284
+ .two-col {
285
+ display: grid;
286
+ grid-template-columns: 1fr 1fr;
287
+ gap: 1.5rem;
288
+ margin-bottom: 1.5rem;
289
+ }
290
+
291
+ @media (max-width: 640px) { .two-col { grid-template-columns: 1fr; } }
292
+
293
+ .card {
294
+ background: var(--surface);
295
+ border: 1px solid var(--border);
296
+ border-radius: var(--radius);
297
+ padding: 1.5rem;
298
+ margin-bottom: 1.5rem;
299
+ }
300
+
301
+ .list {
302
+ list-style: none;
303
+ display: flex;
304
+ flex-direction: column;
305
+ gap: 0.4rem;
306
+ }
307
+
308
+ .list li {
309
+ padding: 0.4rem 0.6rem;
310
+ background: var(--surface2);
311
+ border-radius: 6px;
312
+ font-size: 0.85rem;
313
+ color: var(--text);
314
+ }
315
+
316
+ .list li.empty { color: var(--muted); font-style: italic; background: none; padding: 0; }
317
+
318
+ .footer {
319
+ text-align: center;
320
+ color: var(--muted);
321
+ font-size: 0.8rem;
322
+ padding-top: 1.5rem;
323
+ border-top: 1px solid var(--border);
324
+ margin-top: 1rem;
325
+ }
326
326
  `;
327
327
  }
328
328
  //# sourceMappingURL=dashboardTemplate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fileSystem.d.ts","sourceRoot":"","sources":["../../src/core/fileSystem.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAoB,MAAM,UAAU,CAAC;AAI9D,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,gBAAgB,EACxB,GAAG,SAAgB,GAClB,OAAO,CAAC,IAAI,CAAC,CAgHf"}
1
+ {"version":3,"file":"fileSystem.d.ts","sourceRoot":"","sources":["../../src/core/fileSystem.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAoB,MAAM,UAAU,CAAC;AAI9D,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,gBAAgB,EACxB,GAAG,SAAgB,GAClB,OAAO,CAAC,IAAI,CAAC,CAwHf"}