brainforge-ai 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -137,22 +137,22 @@ function broadcast(clients, event) {
137
137
  }
138
138
  }
139
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
- })();
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
156
  </script>`;
157
157
  // Inject before </body> if present, otherwise append
158
158
  return html.includes('</body>')
@@ -0,0 +1,2 @@
1
+ export declare function updateCommand(): Promise<void>;
2
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAmBA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAuFnD"}
@@ -0,0 +1,99 @@
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.updateCommand = updateCommand;
7
+ const fs_extra_1 = __importDefault(require("fs-extra"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const ora_1 = __importDefault(require("ora"));
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ const config_1 = require("../core/config");
12
+ const templates_1 = require("../core/templates");
13
+ const dashboardTemplate_1 = require("../core/dashboardTemplate");
14
+ const logger_1 = require("../utils/logger");
15
+ // Files managed by BrainForge — safe to overwrite on update
16
+ // User data (project.md, phases/, memory/, decisions.md…) is never touched
17
+ const PROTECTED = new Set([
18
+ 'config.json',
19
+ 'project.md',
20
+ 'questions.md',
21
+ 'decisions.md',
22
+ 'roadmap.md',
23
+ ]);
24
+ async function updateCommand() {
25
+ const cwd = process.cwd();
26
+ if (!(0, config_1.configExists)(cwd)) {
27
+ logger_1.logger.error('BrainForge not initialized. Run: brainforge init');
28
+ return;
29
+ }
30
+ const config = (0, config_1.readConfig)(cwd);
31
+ const brainDir = (0, config_1.getBrainforgeDir)(cwd);
32
+ logger_1.logger.title('⚡ BrainForge Update');
33
+ logger_1.logger.divider();
34
+ logger_1.logger.info(`Project: ${chalk_1.default.white(config.projectName)}`);
35
+ console.log();
36
+ const spinner = (0, ora_1.default)('Updating templates…').start();
37
+ const updated = [];
38
+ const skipped = [];
39
+ // ── Agents ────────────────────────────────────────────────────────────────
40
+ const agents = (0, templates_1.getAgentTemplates)(config);
41
+ for (const [filename, content] of Object.entries(agents)) {
42
+ const dest = path_1.default.join(brainDir, 'agents', filename);
43
+ await fs_extra_1.default.ensureDir(path_1.default.dirname(dest));
44
+ await fs_extra_1.default.writeFile(dest, content);
45
+ updated.push(`agents/${filename}`);
46
+ }
47
+ // ── Slash commands ─────────────────────────────────────────────────────────
48
+ const commands = (0, templates_1.getCommandTemplates)(config);
49
+ for (const [filename, content] of Object.entries(commands)) {
50
+ const dest = path_1.default.join(brainDir, 'commands', filename);
51
+ await fs_extra_1.default.ensureDir(path_1.default.dirname(dest));
52
+ await fs_extra_1.default.writeFile(dest, content);
53
+ updated.push(`commands/${filename}`);
54
+ }
55
+ // ── Dashboard HTML + CSS ──────────────────────────────────────────────────
56
+ await fs_extra_1.default.ensureDir(path_1.default.join(brainDir, 'dashboard'));
57
+ await fs_extra_1.default.writeFile(path_1.default.join(brainDir, 'dashboard', 'index.html'), (0, dashboardTemplate_1.getDashboardHtml)());
58
+ await fs_extra_1.default.writeFile(path_1.default.join(brainDir, 'dashboard', 'style.css'), (0, dashboardTemplate_1.getDashboardCss)());
59
+ updated.push('dashboard/index.html', 'dashboard/style.css');
60
+ // ── Root files (AGENTS.md, CLAUDE.md, GEMINI.md, OPENAI.md) ──────────────
61
+ const rootFiles = (0, templates_1.getRootFileTemplates)(config);
62
+ for (const [filename, content] of Object.entries(rootFiles)) {
63
+ const dest = path_1.default.join(cwd, filename);
64
+ await fs_extra_1.default.writeFile(dest, content);
65
+ updated.push(filename);
66
+ }
67
+ // ── Claude Code Skills ─────────────────────────────────────────────────────
68
+ const skills = (0, templates_1.getSkillTemplates)(config);
69
+ const claudeSkillsDir = path_1.default.join(cwd, '.claude', 'skills');
70
+ await fs_extra_1.default.ensureDir(claudeSkillsDir);
71
+ for (const [filename, content] of Object.entries(skills)) {
72
+ const dest = path_1.default.join(claudeSkillsDir, filename);
73
+ await fs_extra_1.default.writeFile(dest, content);
74
+ updated.push(`.claude/skills/${filename}`);
75
+ }
76
+ // ── User data — never touched ──────────────────────────────────────────────
77
+ for (const f of PROTECTED) {
78
+ skipped.push(f);
79
+ }
80
+ // phases/ and memory/ are always preserved
81
+ skipped.push('phases/', 'memory/');
82
+ spinner.succeed('Update complete.');
83
+ console.log();
84
+ // Summary
85
+ logger_1.logger.success(`${updated.length} files updated:`);
86
+ for (const f of updated) {
87
+ console.log(chalk_1.default.gray(' ✔ .brainforge/') + f);
88
+ }
89
+ console.log();
90
+ logger_1.logger.info(`${skipped.length} user files preserved (untouched):`);
91
+ for (const f of skipped) {
92
+ console.log(chalk_1.default.gray(' ○ .brainforge/') + f);
93
+ }
94
+ console.log();
95
+ logger_1.logger.divider();
96
+ logger_1.logger.info('All agent prompts and slash commands are up to date.');
97
+ logger_1.logger.info('Run brainforge serve to see the refreshed dashboard.');
98
+ }
99
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"dashboardTemplate.d.ts","sourceRoot":"","sources":["../../src/core/dashboardTemplate.ts"],"names":[],"mappings":"AAAA,wBAAgB,gBAAgB,IAAI,MAAM,CAmHzC;AAED,wBAAgB,eAAe,IAAI,MAAM,CA0MxC"}
1
+ {"version":3,"file":"dashboardTemplate.d.ts","sourceRoot":"","sources":["../../src/core/dashboardTemplate.ts"],"names":[],"mappings":"AAAA,wBAAgB,gBAAgB,IAAI,MAAM,CAuHzC;AAED,wBAAgB,eAAe,IAAI,MAAM,CA0MxC"}