devsmind-mcp 1.0.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.
@@ -0,0 +1,297 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.handlePrune = handlePrune;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const prompts_1 = __importDefault(require("prompts"));
43
+ const database_1 = require("../db/database");
44
+ function findDevmindDir(startDir) {
45
+ let current = path.resolve(startDir);
46
+ while (true) {
47
+ const candidate = path.join(current, '.devmind');
48
+ if (fs.existsSync(path.join(candidate, 'config.json'))) {
49
+ return candidate;
50
+ }
51
+ const parent = path.dirname(current);
52
+ if (parent === current)
53
+ return null;
54
+ current = parent;
55
+ }
56
+ }
57
+ async function handlePrune(opts) {
58
+ const cwd = process.cwd();
59
+ let devmindDir;
60
+ if (opts.path) {
61
+ const resolved = path.resolve(opts.path);
62
+ devmindDir = fs.existsSync(path.join(resolved, 'config.json')) ? resolved : null;
63
+ }
64
+ else {
65
+ devmindDir = findDevmindDir(cwd);
66
+ }
67
+ if (!devmindDir) {
68
+ console.error(`āŒ No .devmind directory found.\n` +
69
+ ` Run from inside a DevsMind brain folder, or pass --path <devmind_path>.`);
70
+ process.exit(1);
71
+ }
72
+ const dbFile = path.join(devmindDir, 'brain.db');
73
+ console.log(`\n🧠 Opening DevsMind database: ${dbFile}\n`);
74
+ const db = new database_1.DevMindDatabase(dbFile);
75
+ try {
76
+ await runPruneLoop(db);
77
+ }
78
+ catch (err) {
79
+ console.error(`āŒ Pruning failed: ${err.message}`);
80
+ }
81
+ finally {
82
+ db.close();
83
+ }
84
+ }
85
+ async function runPruneLoop(db) {
86
+ while (true) {
87
+ const nodes = db.getAllNodes();
88
+ if (nodes.length === 0) {
89
+ console.log('šŸ“ The database is empty. No nodes found.');
90
+ return;
91
+ }
92
+ const deprecatedCount = nodes.filter(n => n.deprecated === 1).length;
93
+ console.log(`šŸ“Š Database Stats: ${nodes.length} total node(s) (${deprecatedCount} deprecated)`);
94
+ const choices = [
95
+ {
96
+ title: 'āŒ DELETE ALL NODES (Clear database permanently)',
97
+ value: 'delete_all'
98
+ },
99
+ {
100
+ title: `🧹 Prune all deprecated nodes (${deprecatedCount} node(s))`,
101
+ value: 'prune_deprecated'
102
+ },
103
+ {
104
+ title: '🚪 Exit Pruning',
105
+ value: 'exit'
106
+ },
107
+ {
108
+ title: '------------------------------------------------',
109
+ value: 'divider',
110
+ disabled: true
111
+ }
112
+ ];
113
+ // Add nodes to choices
114
+ for (const node of nodes) {
115
+ const statusLabel = node.deprecated === 1 ? ' [DEPRECATED]' : '';
116
+ choices.push({
117
+ title: `${node.name} (${node.id})${statusLabel}`,
118
+ value: `node:${node.id}`
119
+ });
120
+ }
121
+ const response = await (0, prompts_1.default)({
122
+ type: 'select',
123
+ name: 'action',
124
+ message: 'Select a node to inspect/delete, or choose a bulk action:',
125
+ choices,
126
+ initial: 2 // Exit is index 2
127
+ });
128
+ if (!response.action || response.action === 'exit') {
129
+ console.log('🚪 Exiting pruning. Goodbye!');
130
+ break;
131
+ }
132
+ if (response.action === 'delete_all') {
133
+ const confirm = await (0, prompts_1.default)({
134
+ type: 'confirm',
135
+ name: 'yes',
136
+ message: '🚨 WARNING: This will permanently delete ALL nodes, connections, and history records. Are you absolutely sure?',
137
+ initial: false
138
+ });
139
+ if (confirm.yes) {
140
+ const allNodes = db.getAllNodes();
141
+ const tx = db.db.transaction(() => {
142
+ for (const n of allNodes) {
143
+ db.deleteNode(n.id);
144
+ }
145
+ });
146
+ tx();
147
+ console.log('šŸ’„ All nodes and history records deleted successfully.');
148
+ }
149
+ continue;
150
+ }
151
+ if (response.action === 'prune_deprecated') {
152
+ const deprecatedNodes = nodes.filter(n => n.deprecated === 1);
153
+ if (deprecatedNodes.length === 0) {
154
+ console.log('ā„¹ļø No deprecated nodes to prune.');
155
+ continue;
156
+ }
157
+ const confirm = await (0, prompts_1.default)({
158
+ type: 'confirm',
159
+ name: 'yes',
160
+ message: `Are you sure you want to permanently delete all ${deprecatedNodes.length} deprecated nodes and their history?`,
161
+ initial: false
162
+ });
163
+ if (confirm.yes) {
164
+ const tx = db.db.transaction(() => {
165
+ for (const n of deprecatedNodes) {
166
+ db.deleteNode(n.id);
167
+ }
168
+ });
169
+ tx();
170
+ console.log(`🧹 Successfully pruned ${deprecatedNodes.length} deprecated node(s).`);
171
+ }
172
+ continue;
173
+ }
174
+ if (response.action.startsWith('node:')) {
175
+ const nodeId = response.action.substring(5);
176
+ const node = db.getNode(nodeId);
177
+ if (node) {
178
+ await handleNodeMenu(db, node);
179
+ }
180
+ }
181
+ }
182
+ }
183
+ async function handleNodeMenu(db, node) {
184
+ while (true) {
185
+ const freshNode = db.getNode(node.id);
186
+ if (!freshNode) {
187
+ // Node was deleted
188
+ break;
189
+ }
190
+ console.log(`\n==================================================`);
191
+ console.log(`šŸ” Node Details: ${freshNode.name}`);
192
+ console.log(`==================================================`);
193
+ console.log(`šŸ†” ID: ${freshNode.id}`);
194
+ console.log(`šŸ“ File: ${freshNode.file_path}`);
195
+ console.log(`šŸ·ļø Type: ${freshNode.type}`);
196
+ console.log(`šŸ“ Signature: ${freshNode.signature || 'None'}`);
197
+ console.log(`āš ļø Status: ${freshNode.deprecated === 1 ? 'šŸ”“ DEPRECATED' : '🟢 ACTIVE'}`);
198
+ console.log(`šŸ“… Created: ${freshNode.created_at}`);
199
+ const response = await (0, prompts_1.default)({
200
+ type: 'select',
201
+ name: 'action',
202
+ message: 'What would you like to do with this node?',
203
+ choices: [
204
+ { title: 'šŸ“„ View Current Code Snapshot', value: 'view_code' },
205
+ { title: 'šŸ“œ View Change History (Interactive)', value: 'view_history' },
206
+ { title: 'āŒ Delete Node (Permanently prune)', value: 'delete' },
207
+ { title: 'ā¬…ļø Back to list', value: 'back' }
208
+ ]
209
+ });
210
+ if (!response.action || response.action === 'back') {
211
+ break;
212
+ }
213
+ if (response.action === 'view_code') {
214
+ const history = db.getFullHistory(freshNode.id);
215
+ if (history.length === 0) {
216
+ console.log('\nāŒ No code snapshots found for this node.');
217
+ }
218
+ else {
219
+ console.log(`\nšŸ’» Latest Code Snapshot for ${freshNode.name}:\n`);
220
+ console.log(history[0].code_snapshot);
221
+ }
222
+ await (0, prompts_1.default)({ type: 'text', name: 'ok', message: '\nPress Enter to continue...' });
223
+ }
224
+ if (response.action === 'view_history') {
225
+ const history = db.getFullHistory(freshNode.id);
226
+ if (history.length === 0) {
227
+ console.log('\nāŒ No history entries found for this node.');
228
+ await (0, prompts_1.default)({ type: 'text', name: 'ok', message: '\nPress Enter to continue...' });
229
+ }
230
+ else {
231
+ await runHistoryPager(history);
232
+ }
233
+ }
234
+ if (response.action === 'delete') {
235
+ const confirm = await (0, prompts_1.default)({
236
+ type: 'confirm',
237
+ name: 'yes',
238
+ message: `🚨 Are you sure you want to permanently delete "${freshNode.name}" and all its history logs?`,
239
+ initial: false
240
+ });
241
+ if (confirm.yes) {
242
+ db.deleteNode(freshNode.id);
243
+ console.log(`šŸ—‘ļø Node "${freshNode.name}" deleted.`);
244
+ break; // break node menu loop and return to list
245
+ }
246
+ }
247
+ }
248
+ }
249
+ async function runHistoryPager(history) {
250
+ let index = 0;
251
+ while (true) {
252
+ const entry = history[index];
253
+ console.log(`\n==================================================`);
254
+ console.log(`šŸ“œ History Entry ${index + 1} of ${history.length}`);
255
+ console.log(`šŸ“… Date: ${entry.created_at} (Updated: ${entry.updated_at})`);
256
+ console.log(`šŸ†” Session: ${entry.session_id}`);
257
+ console.log(`==================================================`);
258
+ try {
259
+ const parsedReasoning = JSON.parse(entry.reasoning);
260
+ console.log((0, database_1.formatReasoning)(parsedReasoning));
261
+ }
262
+ catch {
263
+ console.log(entry.reasoning);
264
+ }
265
+ const choices = [
266
+ { title: 'šŸ“„ View Code Snapshot for this version', value: 'view_code' }
267
+ ];
268
+ if (index < history.length - 1) {
269
+ choices.push({ title: 'āž”ļø Next Entry', value: 'next' });
270
+ }
271
+ if (index > 0) {
272
+ choices.push({ title: 'ā¬…ļø Previous Entry', value: 'prev' });
273
+ }
274
+ choices.push({ title: 'šŸ”™ Back to Node Details', value: 'back' });
275
+ const response = await (0, prompts_1.default)({
276
+ type: 'select',
277
+ name: 'action',
278
+ message: 'Choose navigation option:',
279
+ choices
280
+ });
281
+ if (!response.action || response.action === 'back') {
282
+ break;
283
+ }
284
+ if (response.action === 'view_code') {
285
+ console.log(`\nšŸ’» Code Snapshot (Version ${index + 1}):\n`);
286
+ console.log(entry.code_snapshot);
287
+ await (0, prompts_1.default)({ type: 'text', name: 'ok', message: '\nPress Enter to continue...' });
288
+ }
289
+ else if (response.action === 'next') {
290
+ index++;
291
+ }
292
+ else if (response.action === 'prev') {
293
+ index--;
294
+ }
295
+ }
296
+ }
297
+ //# sourceMappingURL=prune.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prune.js","sourceRoot":"","sources":["../../src/cli/prune.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function handleRule(opts: {
2
+ path?: string;
3
+ }): void;
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.handleRule = handleRule;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ function findDevmindDir(startDir) {
40
+ let current = path.resolve(startDir);
41
+ while (true) {
42
+ const candidate = path.join(current, '.devmind');
43
+ if (fs.existsSync(path.join(candidate, 'config.json'))) {
44
+ return candidate;
45
+ }
46
+ const parent = path.dirname(current);
47
+ if (parent === current)
48
+ return null;
49
+ current = parent;
50
+ }
51
+ }
52
+ function handleRule(opts) {
53
+ const cwd = process.cwd();
54
+ let devmindDir;
55
+ if (opts.path) {
56
+ const resolved = path.resolve(opts.path);
57
+ devmindDir = fs.existsSync(path.join(resolved, 'config.json')) ? resolved : null;
58
+ }
59
+ else {
60
+ devmindDir = findDevmindDir(cwd);
61
+ }
62
+ if (!devmindDir) {
63
+ console.error(`āŒ No .devmind directory found.\n` +
64
+ ` Run from inside a DevsMind brain folder, or pass --path <devmind_path>.`);
65
+ process.exit(1);
66
+ }
67
+ const configPath = path.join(devmindDir, 'config.json');
68
+ let config;
69
+ try {
70
+ config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
71
+ }
72
+ catch {
73
+ console.error(`āŒ Failed to read config.json at ${configPath}`);
74
+ process.exit(1);
75
+ }
76
+ const projectName = config.project_name;
77
+ const mode = config.mode;
78
+ const notes = config.notes;
79
+ const tech = config.tech_stack;
80
+ const repos = config.repos;
81
+ const repoLines = repos
82
+ .map(r => ('relative_path' in r ? `${r.name} → ${r.relative_path}` : `${r.name} → env:${r.path_key}`))
83
+ .join(', ');
84
+ const techLine = tech
85
+ ? [...(tech.languages || []), ...(tech.frameworks || [])].join(', ')
86
+ : 'Not specified';
87
+ const timeout = config.session_timeout_minutes ?? 60;
88
+ const safeDevmindDir = devmindDir.replace(/\\/g, '/');
89
+ const bt = '`';
90
+ const lines = [
91
+ '## DevsMind — AI Brain',
92
+ '',
93
+ `**DEVMIND_PATH**: ${bt}${safeDevmindDir}${bt}`,
94
+ `**Project**: ${projectName} | **Mode**: ${mode} | **Tech**: ${techLine} | **Session timeout**: ${timeout}min`,
95
+ `**Repos**: ${repoLines}`,
96
+ notes ? `**Notes**: ${notes}` : '',
97
+ '',
98
+ '### Tool Triggers',
99
+ '',
100
+ '| Situation | Tool |',
101
+ '|-----------|------|',
102
+ `| Searching for a module, feature, or concept | ${bt}search_nodes${bt} |`,
103
+ `| Want to list/discover all nodes for a component or directory | ${bt}list_nodes${bt} |`,
104
+ `| Need to read the code of a specific function/class | ${bt}get_node_code${bt} |`,
105
+ `| Working on / debugging a specific function or class | ${bt}get_node_summary${bt} → ${bt}get_node_history${bt} → ${bt}get_node_graph${bt} |`,
106
+ `| After finishing code edits to a function/class | ${bt}update_history${bt} (once per session, not per message) |`,
107
+ `| Function/class is renamed | ${bt}rename_node${bt} |`,
108
+ `| Function/class is removed from codebase | ${bt}deprecate_node${bt} |`,
109
+ '',
110
+ '### Critical Rules',
111
+ '',
112
+ `1. **Never guess dependencies** — call ${bt}get_node_graph${bt} before touching any function signature.`,
113
+ `2. **Always read history first** — call ${bt}get_node_history${bt} before refactoring to understand past decisions.`,
114
+ `3. **No deletions** — never delete nodes. Use ${bt}deprecate_node${bt} to preserve history.`,
115
+ `4. **Resurrecting nodes** — calling ${bt}update_history${bt} or ${bt}add_node${bt} on a deprecated node automatically re-activates it.`,
116
+ `5. **Search before grep** — use ${bt}search_nodes${bt} before any filesystem search.`,
117
+ `6. **Code snapshots — populate if missing** — always call ${bt}get_node_code${bt} before reading a source file. If no snapshot exists, read the file, then immediately call ${bt}update_history${bt} with the current code. Do not skip this — it caches the code for all future agents.`,
118
+ `7. **Code snapshots — refresh if stale** — if you open a source file and notice the stored snapshot differs from the actual file, call ${bt}update_history${bt} with the fresh code before making any changes. Stale snapshots must be corrected first.`,
119
+ '',
120
+ '### Available Tools',
121
+ '',
122
+ '| Tool | Use when |',
123
+ '|------|----------|',
124
+ `| ${bt}search_nodes${bt} | Find nodes by name, keyword, or reasoning text |`,
125
+ `| ${bt}list_nodes${bt} | List nodes in the graph with optional filters (type, file path, etc.) |`,
126
+ `| ${bt}get_node_summary${bt} | Get file location, connection count, history count for a node |`,
127
+ `| ${bt}get_node_code${bt} | Get latest stored code snapshot for a node (check before reading file) |`,
128
+ `| ${bt}get_node_graph${bt} | See all callers/dependencies of a node up to N levels deep |`,
129
+ `| ${bt}get_node_history${bt} | Read all past snapshots and reasoning logs for a node |`,
130
+ `| ${bt}update_history${bt} | Save a code snapshot + reasoning after editing a function/class |`,
131
+ `| ${bt}add_node${bt} | Register a new function, class, or entity in the graph |`,
132
+ `| ${bt}add_connection${bt} | Link two nodes with a caller → callee dependency |`,
133
+ `| ${bt}rename_node${bt} | Rename a node ID and update all its connections/history |`,
134
+ `| ${bt}deprecate_node${bt} | Mark a removed function/class as deprecated (preserves history) |`,
135
+ `| ${bt}get_recent_changes${bt} | List nodes modified in the last N hours across the project |`,
136
+ `| ${bt}get_developer_activity${bt} | List recent changes made by a specific developer |`,
137
+ `| ${bt}get_changes_by_requirement${bt} | Find all changes linked to a ticket or requirement ID |`,
138
+ `| ${bt}search_decisions${bt} | Search architectural reasoning and decision logs by keyword |`,
139
+ `| ${bt}get_orphaned_nodes${bt} | Find nodes with no connections (dead code / stale entries) |`,
140
+ `| ${bt}recheck_graph${bt} | Scan files, deprecate nodes for deleted files, clean primitives |`,
141
+ `| ${bt}get_visualizer_url${bt} | Get URL to open the interactive 2D/3D graph visualizer |`,
142
+ '',
143
+ '> All tool argument schemas are exposed automatically by the MCP server.'
144
+ ];
145
+ const rule = lines.filter(l => l !== null).join('\n');
146
+ const divider = '═'.repeat(70);
147
+ console.log(`\n${divider}`);
148
+ console.log(` DevsMind Workspace Rule — "${projectName}"`);
149
+ console.log(` Copy the block below into your AI workspace rules file`);
150
+ console.log(`${divider}\n`);
151
+ console.log(rule);
152
+ console.log(`\n${divider}`);
153
+ console.log(` šŸ’” Tip: save this to .agents/AGENTS.md in your workspace root`);
154
+ console.log(` or paste directly into your IDE's AI rules/instructions panel.`);
155
+ console.log(`${divider}\n`);
156
+ }
157
+ //# sourceMappingURL=rule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule.js","sourceRoot":"","sources":["../../src/cli/rule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function handleView(opts: {
2
+ path?: string;
3
+ port: string;
4
+ }): Promise<void>;
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.handleView = handleView;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const child_process_1 = require("child_process");
40
+ const server_1 = require("../mcp/server");
41
+ /**
42
+ * Walk up from `startDir` until we find a `.devmind/config.json`,
43
+ * or return null if not found.
44
+ */
45
+ function findDevmindDir(startDir) {
46
+ let current = path.resolve(startDir);
47
+ while (true) {
48
+ const candidate = path.join(current, '.devmind');
49
+ if (fs.existsSync(path.join(candidate, 'config.json'))) {
50
+ return candidate;
51
+ }
52
+ const parent = path.dirname(current);
53
+ if (parent === current)
54
+ return null; // filesystem root
55
+ current = parent;
56
+ }
57
+ }
58
+ async function handleView(opts) {
59
+ const cwd = process.cwd();
60
+ let devmindDir;
61
+ if (opts.path) {
62
+ const resolved = path.resolve(opts.path);
63
+ devmindDir = fs.existsSync(path.join(resolved, 'config.json')) ? resolved : null;
64
+ }
65
+ else {
66
+ devmindDir = findDevmindDir(cwd);
67
+ }
68
+ if (!devmindDir) {
69
+ console.error(`āŒ No .devmind directory found.\n` +
70
+ ` Run from inside a DevsMind brain folder, or pass --path <devmind_path>.`);
71
+ process.exit(1);
72
+ }
73
+ const port = parseInt(opts.port, 10);
74
+ if (isNaN(port) || port < 1 || port > 65535) {
75
+ console.error(`āŒ Invalid port: ${opts.port}`);
76
+ process.exit(1);
77
+ }
78
+ console.log(`🧠 Starting DevsMind Graph Visualizer server on port ${port}...`);
79
+ try {
80
+ // Start Express server (resolves once server is listening)
81
+ await (0, server_1.runHttpMcpServer)(port);
82
+ // Open default browser
83
+ const url = `http://localhost:${port}/?path=${encodeURIComponent(devmindDir)}`;
84
+ console.log(`🌐 Opening visualizer in your browser: ${url}`);
85
+ const openCmd = process.platform === 'win32'
86
+ ? `start "" "${url}"`
87
+ : process.platform === 'darwin'
88
+ ? `open "${url}"`
89
+ : `xdg-open "${url}"`;
90
+ (0, child_process_1.exec)(openCmd, (err) => {
91
+ if (err) {
92
+ console.log(`šŸ’” Click or copy this link if it didn't open automatically: ${url}`);
93
+ }
94
+ });
95
+ }
96
+ catch (err) {
97
+ const msg = err.message;
98
+ if (err.code === 'EADDRINUSE') {
99
+ console.error(`āŒ Port ${port} is already in use. Try starting with a different port: devsmind view --port <other>`);
100
+ }
101
+ else {
102
+ console.error(`āŒ Visualizer failed to start: ${msg}`);
103
+ }
104
+ process.exit(1);
105
+ }
106
+ }
107
+ //# sourceMappingURL=view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.js","sourceRoot":"","sources":["../../src/cli/view.ts"],"names":[],"mappings":"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"}