devsmind-mcp 2.2.0 → 2.3.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.
Files changed (51) hide show
  1. package/README.md +234 -527
  2. package/dist/cli/analyze.d.ts +13 -0
  3. package/dist/cli/analyze.js +143 -0
  4. package/dist/cli/analyze.js.map +1 -0
  5. package/dist/cli/index.js +76 -0
  6. package/dist/cli/index.js.map +1 -1
  7. package/dist/cli/integrations/memory.d.ts +11 -0
  8. package/dist/cli/integrations/memory.js +156 -0
  9. package/dist/cli/integrations/memory.js.map +1 -0
  10. package/dist/cli/integrations/prompt.d.ts +5 -1
  11. package/dist/cli/integrations/prompt.js +29 -7
  12. package/dist/cli/integrations/prompt.js.map +1 -1
  13. package/dist/cli/integrations/registry.d.ts +35 -0
  14. package/dist/cli/integrations/registry.js +59 -0
  15. package/dist/cli/integrations/registry.js.map +1 -1
  16. package/dist/cli/rule.js +37 -46
  17. package/dist/cli/rule.js.map +1 -1
  18. package/dist/cli/sync.d.ts +7 -0
  19. package/dist/cli/sync.js +40 -7
  20. package/dist/cli/sync.js.map +1 -1
  21. package/dist/cli/workflow.d.ts +8 -0
  22. package/dist/cli/workflow.js +156 -0
  23. package/dist/cli/workflow.js.map +1 -0
  24. package/dist/db/analyze.d.ts +67 -0
  25. package/dist/db/analyze.js +163 -0
  26. package/dist/db/analyze.js.map +1 -0
  27. package/dist/db/database.d.ts +166 -3
  28. package/dist/db/database.js +700 -64
  29. package/dist/db/database.js.map +1 -1
  30. package/dist/db/schema.d.ts +28 -1
  31. package/dist/db/schema.js +34 -0
  32. package/dist/db/schema.js.map +1 -1
  33. package/dist/db/staging.d.ts +4 -0
  34. package/dist/db/staging.js +16 -2
  35. package/dist/db/staging.js.map +1 -1
  36. package/dist/db/workflow-import.d.ts +22 -0
  37. package/dist/db/workflow-import.js +116 -0
  38. package/dist/db/workflow-import.js.map +1 -0
  39. package/dist/mcp/server.d.ts +9 -0
  40. package/dist/mcp/server.js +417 -27
  41. package/dist/mcp/server.js.map +1 -1
  42. package/dist/utils/config.d.ts +2 -0
  43. package/dist/utils/config.js +11 -0
  44. package/dist/utils/config.js.map +1 -1
  45. package/dist/utils/git.d.ts +14 -0
  46. package/dist/utils/git.js +43 -0
  47. package/dist/utils/git.js.map +1 -0
  48. package/dist/utils/scanner.d.ts +7 -0
  49. package/dist/utils/scanner.js +9 -3
  50. package/dist/utils/scanner.js.map +1 -1
  51. package/package.json +1 -1
@@ -0,0 +1,13 @@
1
+ import { AnalysisReport } from '../db/analyze';
2
+ /**
3
+ * `devsmind analyze` — local, zero-AI graph health check (Phase 1 of the roadmap's
4
+ * `analyze_graph`). Pure SQLite queries, filesystem checks, and `git log` — no LLM
5
+ * calls, no tokens spent. `--fix` applies only the safe/reversible fixes; everything
6
+ * else is report-only and needs a human or AI to decide what to do about it.
7
+ */
8
+ export declare function handleAnalyze(opts: {
9
+ path?: string;
10
+ fix?: boolean;
11
+ godEntityThreshold?: string;
12
+ }): Promise<void>;
13
+ export declare function printReport(report: AnalysisReport): void;
@@ -0,0 +1,143 @@
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.handleAnalyze = handleAnalyze;
37
+ exports.printReport = printReport;
38
+ const path = __importStar(require("path"));
39
+ const config_1 = require("../utils/config");
40
+ const database_1 = require("../db/database");
41
+ const analyze_1 = require("../db/analyze");
42
+ /**
43
+ * `devsmind analyze` — local, zero-AI graph health check (Phase 1 of the roadmap's
44
+ * `analyze_graph`). Pure SQLite queries, filesystem checks, and `git log` — no LLM
45
+ * calls, no tokens spent. `--fix` applies only the safe/reversible fixes; everything
46
+ * else is report-only and needs a human or AI to decide what to do about it.
47
+ */
48
+ async function handleAnalyze(opts) {
49
+ const devmindDir = (0, config_1.resolveDevmindDir)(opts.path);
50
+ if (!devmindDir) {
51
+ console.error(`❌ No .devmind directory found.\n` +
52
+ ` Run from inside a DevsMind brain folder, or pass --path <devmind_path>.`);
53
+ process.exit(1);
54
+ }
55
+ const workspaceRoot = path.dirname(devmindDir);
56
+ const dbPath = path.join(devmindDir, 'brain.db');
57
+ const godEntityThreshold = opts.godEntityThreshold ? parseInt(opts.godEntityThreshold, 10) : undefined;
58
+ console.log(`\n🩺 DevsMind — Analyze graph health${opts.fix ? ' (--fix)' : ''}`);
59
+ console.log(` Brain : ${devmindDir.replace(/\\/g, '/')}`);
60
+ const db = new database_1.DevMindDatabase(dbPath);
61
+ try {
62
+ const report = (0, analyze_1.runAnalysis)(db, workspaceRoot, { fix: opts.fix === true, godEntityThreshold });
63
+ printReport(report);
64
+ }
65
+ finally {
66
+ db.close();
67
+ }
68
+ }
69
+ const SECTIONS = [
70
+ { key: 'god_entities', label: 'God entities (high fan-in/out)', fixable: false },
71
+ { key: 'circular_dependencies', label: 'Circular dependency cycles', fixable: false },
72
+ { key: 'orphaned_nodes', label: 'Orphaned nodes (zero connections)', fixable: true },
73
+ { key: 'dangling_edges', label: 'Dangling edges (broken references)', fixable: true },
74
+ { key: 'duplicate_ids', label: 'Duplicate/case-collision node ids', fixable: false },
75
+ { key: 'missing_developer_attribution', label: 'History missing developer attribution', fixable: false },
76
+ { key: 'empty_code_snapshots', label: 'Empty code snapshots', fixable: false },
77
+ { key: 'spurious_nodes', label: 'Spurious/built-in nodes', fixable: true },
78
+ { key: 'missing_files', label: 'Nodes with missing files', fixable: true },
79
+ { key: 'renamed_files', label: 'Renamed files (git-detected)', fixable: true },
80
+ { key: 'untracked_files', label: 'Git-tracked files with zero graph nodes', fixable: false },
81
+ ];
82
+ const MAX_ROWS = 20;
83
+ function printReport(report) {
84
+ const totalIssues = Object.values(report.summary).reduce((a, b) => a + b, 0);
85
+ console.log(`\n${totalIssues === 0 ? '✅ Graph is clean — no issues found.' : `Found ${totalIssues} issue(s):`}\n`);
86
+ for (const s of SECTIONS) {
87
+ const count = report.summary[s.key];
88
+ if (count === 0)
89
+ continue;
90
+ const fixNote = s.fixable ? (report.fixed ? ' — fixed' : ' (fixable with --fix)') : ' (report only — needs human/AI review)';
91
+ console.log(` ${s.label}: ${count}${fixNote}`);
92
+ }
93
+ if (totalIssues === 0) {
94
+ console.log();
95
+ return;
96
+ }
97
+ console.log(`\n${'─'.repeat(60)}`);
98
+ for (const s of SECTIONS) {
99
+ const rows = report[s.key];
100
+ if (!rows || rows.length === 0)
101
+ continue;
102
+ console.log(`\n${s.label} (${rows.length}):`);
103
+ for (const row of rows.slice(0, MAX_ROWS)) {
104
+ console.log(` ${formatRow(s.key, row)}`);
105
+ }
106
+ if (rows.length > MAX_ROWS) {
107
+ console.log(` … +${rows.length - MAX_ROWS} more`);
108
+ }
109
+ }
110
+ console.log();
111
+ if (!report.fixed) {
112
+ const anyFixable = SECTIONS.some(s => s.fixable && report.summary[s.key] > 0);
113
+ if (anyFixable) {
114
+ console.log(`Run with --fix to soft-deprecate dead nodes, remove dangling edges, and migrate detected renames.\n`);
115
+ }
116
+ }
117
+ }
118
+ function formatRow(key, row) {
119
+ switch (key) {
120
+ case 'god_entities':
121
+ return `${row.name} (${row.id}) — degree ${row.degree}`;
122
+ case 'circular_dependencies':
123
+ return row.join(' → ');
124
+ case 'orphaned_nodes':
125
+ case 'spurious_nodes':
126
+ case 'missing_files':
127
+ return `${row.name} (${row.id}) — ${row.file_path || 'no file'}`;
128
+ case 'dangling_edges':
129
+ return `${row.source_node_id} → ${row.target_node_id}`;
130
+ case 'duplicate_ids':
131
+ return row.ids.join(' | ');
132
+ case 'missing_developer_attribution':
133
+ case 'empty_code_snapshots':
134
+ return `${row.node_id} (history ${row.id}, ${row.updated_at})`;
135
+ case 'renamed_files':
136
+ return `[${row.repo}] ${row.from} → ${row.to}${row.migrated ? ' (migrated)' : ''}`;
137
+ case 'untracked_files':
138
+ return `[${row.repo}] ${row.file}`;
139
+ default:
140
+ return JSON.stringify(row);
141
+ }
142
+ }
143
+ //# sourceMappingURL=analyze.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/cli/analyze.ts"],"names":[],"mappings":"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"}
package/dist/cli/index.js CHANGED
@@ -7,7 +7,10 @@ const rule_1 = require("./rule");
7
7
  const view_1 = require("./view");
8
8
  const prune_1 = require("./prune");
9
9
  const sync_1 = require("./sync");
10
+ const analyze_1 = require("./analyze");
11
+ const workflow_1 = require("./workflow");
10
12
  const mcp_1 = require("./integrations/mcp");
13
+ const memory_1 = require("./integrations/memory");
11
14
  const runner_1 = require("./runner");
12
15
  const server_1 = require("../mcp/server");
13
16
  const program = new commander_1.Command();
@@ -34,7 +37,23 @@ program
34
37
  ` IDEs connect via: http://localhost:${server_1.DEVSMIND_PORT}/mcp`)
35
38
  .option('--stdio', 'Use stdio transport instead of HTTP (for direct IDE process injection)')
36
39
  .option('-p, --port <number>', `HTTP port to listen on (default: ${server_1.DEVSMIND_PORT})`, String(server_1.DEVSMIND_PORT))
40
+ .option('--path <devmind_path>', 'Explicit path to the .devmind directory (auto-detected from cwd by default) — used only for --sync/--analyze below')
41
+ .option('--sync', 'Run devsmind sync before starting the server')
42
+ .option('--analyze', 'Run devsmind analyze before starting the server')
43
+ .option('--fix', 'With --analyze, also apply safe automatic fixes')
37
44
  .action(async (opts) => {
45
+ if (opts.sync || opts.analyze) {
46
+ try {
47
+ // Both flags share the same "sync" entrypoint — --analyze without --sync still
48
+ // needs a synced DB to analyze against, and handleSync's own syncFromDisk() is a
49
+ // no-op cost-wise if the DB is already current, so requesting either one syncs.
50
+ await (0, sync_1.handleSync)({ path: opts.path, analyze: opts.analyze, fix: opts.fix });
51
+ }
52
+ catch (err) {
53
+ console.error(`❌ Pre-start ${opts.analyze ? 'analyze' : 'sync'} failed: ${err.message}`);
54
+ process.exit(1);
55
+ }
56
+ }
38
57
  if (opts.stdio) {
39
58
  // Stdio mode: IDE manages the process directly
40
59
  (0, server_1.runStdioMcpServer)();
@@ -88,10 +107,26 @@ program
88
107
  process.exit(1);
89
108
  }
90
109
  });
110
+ program
111
+ .command('memory')
112
+ .description('Seed a tool\'s own persistent agent-memory/skills store (guided, per-tool)')
113
+ .option('-p, --path <devmind_path>', 'Explicit path to the .devmind directory (auto-detected from cwd by default)')
114
+ .action(async (opts) => {
115
+ try {
116
+ await (0, memory_1.handleMemory)(opts);
117
+ }
118
+ catch (err) {
119
+ console.error(`❌ Memory setup failed: ${err.message}`);
120
+ process.exit(1);
121
+ }
122
+ });
91
123
  program
92
124
  .command('sync')
93
125
  .description('Sync the committed graph + history from disk into the local brain.db')
94
126
  .option('-p, --path <devmind_path>', 'Explicit path to the .devmind directory (auto-detected from cwd by default)')
127
+ .option('--analyze', 'Run devsmind analyze immediately after syncing')
128
+ .option('--fix', 'With --analyze, also apply safe automatic fixes')
129
+ .option('--god-entity-threshold <n>', 'With --analyze, degree threshold for god-entity detection (default 15)')
95
130
  .action(async (opts) => {
96
131
  try {
97
132
  await (0, sync_1.handleSync)(opts);
@@ -101,6 +136,47 @@ program
101
136
  process.exit(1);
102
137
  }
103
138
  });
139
+ program
140
+ .command('analyze')
141
+ .description('Local, zero-AI graph health check (god entities, cycles, orphans, dangling edges, renames, and more)')
142
+ .option('-p, --path <devmind_path>', 'Explicit path to the .devmind directory (auto-detected from cwd by default)')
143
+ .option('--fix', 'Apply safe automatic fixes (deprecate dead nodes, delete dangling edges, migrate renames)')
144
+ .option('--god-entity-threshold <n>', 'Degree threshold for god-entity detection (default 15)')
145
+ .action(async (opts) => {
146
+ try {
147
+ await (0, analyze_1.handleAnalyze)(opts);
148
+ }
149
+ catch (err) {
150
+ console.error(`❌ Analyze failed: ${err.message}`);
151
+ process.exit(1);
152
+ }
153
+ });
154
+ program
155
+ .command('workflow')
156
+ .description('List, view, pause, and resume persistent feature workflows (interactive)')
157
+ .option('-p, --path <devmind_path>', 'Explicit path to the .devmind directory (auto-detected from cwd by default)')
158
+ .action(async (opts) => {
159
+ try {
160
+ await (0, workflow_1.handleWorkflow)(opts);
161
+ }
162
+ catch (err) {
163
+ console.error(`❌ Workflow command failed: ${err.message}`);
164
+ process.exit(1);
165
+ }
166
+ });
167
+ program
168
+ .command('workflow-import <path>')
169
+ .description('Import a folder of .md flow docs (or a single file) as paused, resumable workflows')
170
+ .option('-p, --path <devmind_path>', 'Explicit path to the .devmind directory (auto-detected from cwd by default)')
171
+ .action(async (pathArg, opts) => {
172
+ try {
173
+ await (0, workflow_1.handleWorkflowImport)(pathArg, opts);
174
+ }
175
+ catch (err) {
176
+ console.error(`❌ Workflow import failed: ${err.message}`);
177
+ process.exit(1);
178
+ }
179
+ });
104
180
  program
105
181
  .command('view')
106
182
  .description('Open the interactive D3.js code graph visualizer in your browser')
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,iCAAoC;AACpC,iCAAoC;AACpC,iCAAoC;AACpC,mCAAsC;AACtC,iCAAoC;AACpC,uCAA0C;AAC1C,yCAAkE;AAClE,4CAA+C;AAC/C,kDAAqD;AACrD,qCAA0E;AAC1E,0CAAmF;AAEnF,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,8BAA8B,CAAC;KAC3C,OAAO,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;AAErC,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,4DAA4D,CAAC;KACzE,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,IAAA,iBAAU,GAAE,CAAC;IACrB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,4BAA6B,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CACV,iCAAiC;IACjC,2BAA2B,sBAAa,iCAAiC;IACzE,wCAAwC,sBAAa,MAAM,CAC5D;KACA,MAAM,CAAC,SAAS,EAAE,wEAAwE,CAAC;KAC3F,MAAM,CAAC,qBAAqB,EAAE,oCAAoC,sBAAa,GAAG,EAAE,MAAM,CAAC,sBAAa,CAAC,CAAC;KAC1G,MAAM,CAAC,uBAAuB,EAAE,oHAAoH,CAAC;KACrJ,MAAM,CAAC,QAAQ,EAAE,8CAA8C,CAAC;KAChE,MAAM,CAAC,WAAW,EAAE,iDAAiD,CAAC;KACtE,MAAM,CAAC,OAAO,EAAE,iDAAiD,CAAC;KAClE,MAAM,CAAC,KAAK,EAAE,IAAwG,EAAE,EAAE;IACzH,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,+EAA+E;YAC/E,iFAAiF;YACjF,gFAAgF;YAChF,MAAM,IAAA,iBAAU,EAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC9E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,eAAe,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,YAAa,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACpG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,+CAA+C;QAC/C,IAAA,0BAAiB,GAAE,CAAC;IACtB,CAAC;SAAM,CAAC;QACN,2CAA2C;QAC3C,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACrC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;YAC5C,OAAO,CAAC,KAAK,CAAC,mBAAmB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,CAAC;YACH,MAAM,IAAA,yBAAgB,EAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAI,GAA6B,CAAC,OAAO,CAAC;YACnD,IAAK,GAA6B,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBACzD,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,wDAAwD,CAAC,CAAC;YACxF,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAC;YACxD,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,2EAA2E,CAAC;KACxF,MAAM,CAAC,2BAA2B,EAAE,6EAA6E,CAAC;KAClH,MAAM,CAAC,SAAS,EAAE,0DAA0D,CAAC;KAC7E,MAAM,CAAC,KAAK,EAAE,IAAwC,EAAE,EAAE;IACzD,IAAI,CAAC;QACH,MAAM,IAAA,iBAAU,EAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,kBAAmB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,qEAAqE,CAAC;KAClF,MAAM,CAAC,2BAA2B,EAAE,6EAA6E,CAAC;KAClH,MAAM,CAAC,KAAK,EAAE,IAAuB,EAAE,EAAE;IACxC,IAAI,CAAC;QACH,MAAM,IAAA,eAAS,EAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,uBAAwB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,4EAA4E,CAAC;KACzF,MAAM,CAAC,2BAA2B,EAAE,6EAA6E,CAAC;KAClH,MAAM,CAAC,KAAK,EAAE,IAAuB,EAAE,EAAE;IACxC,IAAI,CAAC;QACH,MAAM,IAAA,qBAAY,EAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,0BAA2B,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,sEAAsE,CAAC;KACnF,MAAM,CAAC,2BAA2B,EAAE,6EAA6E,CAAC;KAClH,MAAM,CAAC,WAAW,EAAE,gDAAgD,CAAC;KACrE,MAAM,CAAC,OAAO,EAAE,iDAAiD,CAAC;KAClE,MAAM,CAAC,4BAA4B,EAAE,wEAAwE,CAAC;KAC9G,MAAM,CAAC,KAAK,EAAE,IAAsF,EAAE,EAAE;IACvG,IAAI,CAAC;QACH,MAAM,IAAA,iBAAU,EAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,kBAAmB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,sGAAsG,CAAC;KACnH,MAAM,CAAC,2BAA2B,EAAE,6EAA6E,CAAC;KAClH,MAAM,CAAC,OAAO,EAAE,2FAA2F,CAAC;KAC5G,MAAM,CAAC,4BAA4B,EAAE,wDAAwD,CAAC;KAC9F,MAAM,CAAC,KAAK,EAAE,IAAmE,EAAE,EAAE;IACpF,IAAI,CAAC;QACH,MAAM,IAAA,uBAAa,EAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,qBAAsB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,0EAA0E,CAAC;KACvF,MAAM,CAAC,2BAA2B,EAAE,6EAA6E,CAAC;KAClH,MAAM,CAAC,KAAK,EAAE,IAAuB,EAAE,EAAE;IACxC,IAAI,CAAC;QACH,MAAM,IAAA,yBAAc,EAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,8BAA+B,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,wBAAwB,CAAC;KACjC,WAAW,CAAC,oFAAoF,CAAC;KACjG,MAAM,CAAC,2BAA2B,EAAE,6EAA6E,CAAC;KAClH,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,IAAuB,EAAE,EAAE;IACzD,IAAI,CAAC;QACH,MAAM,IAAA,+BAAoB,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,6BAA8B,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,kEAAkE,CAAC;KAC/E,MAAM,CAAC,2BAA2B,EAAE,oEAAoE,CAAC;KACzG,MAAM,CAAC,qBAAqB,EAAE,oCAAoC,sBAAa,GAAG,EAAE,MAAM,CAAC,sBAAa,CAAC,CAAC;KAC1G,MAAM,CAAC,KAAK,EAAE,IAAqC,EAAE,EAAE;IACtD,MAAM,IAAA,iBAAU,EAAC,IAAI,CAAC,CAAC;AACzB,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,gEAAgE,CAAC;KAC7E,MAAM,CAAC,2BAA2B,EAAE,2DAA2D,CAAC;KAChG,MAAM,CAAC,OAAO,EAAE,6DAA6D,CAAC;KAC9E,MAAM,CAAC,uBAAuB,EAAE,+CAA+C,EAAE,QAAQ,CAAC;KAC1F,MAAM,CAAC,gBAAgB,EAAE,wFAAwF,CAAC;KAClH,MAAM,CAAC,iBAAiB,EAAE,kGAAkG,CAAC;KAC7H,MAAM,CAAC,aAAa,EAAE,4DAA4D,CAAC;KACnF,MAAM,CAAC,sBAAsB,EAAE,uIAAuI,CAAC;KACvK,MAAM,CAAC,yBAAyB,EAAE,gFAAgF,CAAC;KACnH,MAAM,CAAC,eAAe,EAAE,2HAA2H,CAAC;KACpJ,MAAM,CAAC,gBAAgB,EAAE,wIAAwI,CAAC;KAClK,MAAM,CAAC,cAAc,EAAE,+EAA+E,CAAC;KACvG,MAAM,CAAC,cAAc,EAAE,yJAAyJ,CAAC;KACjL,MAAM,CAAC,iBAAiB,EAAE,iKAAiK,CAAC;KAC5L,MAAM,CAAC,gBAAgB,EAAE,iHAAiH,CAAC;KAC3I,MAAM,CAAC,OAAO,EAAE,iDAAiD,CAAC;KAClE,MAAM,CAAC,KAAK,EAAE,IAgBd,EAAE,EAAE;IACH,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,IAAI,UAAU,CAAC;IAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAEtD,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACrC,OAAO,CAAC,KAAK,CAAC,kGAAkG,CAAC,CAAC;YAClH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,uOAAuO,CAAC,CAAC;YACvP,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,CAAC;YACH,MAAM,IAAA,8BAAqB,EAAC;gBAC1B,WAAW;gBACX,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;gBACpE,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;gBAC7E,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU;gBAC7B,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW;gBAC/B,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS;gBAC3B,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS;gBAC3B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;gBACxF,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;gBAClD,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG;aAChB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,iCAAkC,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,cAAc,QAAQ,EAAE,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,qDAAqD,QAAQ,GAAG,CAAC,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,kGAAkG,CAAC,CAAC;QAChH,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,0EAA0E,CAAC,CAAC;QACxF,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;QAC/E,OAAO,CAAC,GAAG,CAAC,gIAAgI,CAAC,CAAC;QAC9I,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;QAC/E,OAAO,CAAC,GAAG,CAAC,8EAA8E,CAAC,CAAC;QAC5F,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,gFAAgF,CAAC,CAAC;QAC9F,OAAO,CAAC,GAAG,CAAC,0EAA0E,CAAC,CAAC;QACxF,OAAO,CAAC,GAAG,CAAC,2FAA2F,CAAC,CAAC;IAC3G,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,uFAAuF,CAAC;KACpG,MAAM,CAAC,2BAA2B,EAAE,2DAA2D,CAAC;KAChG,MAAM,CAAC,uBAAuB,EAAE,+CAA+C,EAAE,QAAQ,CAAC;KAC1F,MAAM,CAAC,gBAAgB,EAAE,wFAAwF,CAAC;KAClH,MAAM,CAAC,iBAAiB,EAAE,kGAAkG,CAAC;KAC7H,MAAM,CAAC,aAAa,EAAE,4DAA4D,CAAC;KACnF,MAAM,CAAC,sBAAsB,EAAE,uIAAuI,CAAC;KACvK,MAAM,CAAC,yBAAyB,EAAE,gFAAgF,CAAC;KACnH,MAAM,CAAC,eAAe,EAAE,2HAA2H,CAAC;KACpJ,MAAM,CAAC,gBAAgB,EAAE,iHAAiH,CAAC;KAC3I,MAAM,CAAC,aAAa,EAAE,ySAAyS,CAAC;KAChU,MAAM,CAAC,KAAK,EAAE,IAWd,EAAE,EAAE;IACH,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,IAAI,UAAU,CAAC;IAC5C,IAAI,CAAC;QACH,MAAM,IAAA,gCAAuB,EAAC;YAC5B,WAAW;YACX,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;YACpE,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;YAC7E,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU;YAC7B,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;YAClD,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ;SAC1B,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,wBAAyB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,wEAAwE,CAAC;KACrF,MAAM,CAAC,2BAA2B,EAAE,oEAAoE,CAAC;KACzG,MAAM,CAAC,KAAK,EAAE,IAAuB,EAAE,EAAE;IACxC,IAAI,CAAC;QACH,MAAM,IAAA,mBAAW,EAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,qBAAsB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * `devsmind memory` — seed a tool's own persistent agent-memory/skills store
3
+ * (distinct from `devsmind rule`'s static rule file) with the same workflow
4
+ * contract carried by the MCP `instructions` field, for the handful of tools
5
+ * confirmed to actually read back a file they didn't create themselves. For
6
+ * every other tool this prints honest guidance instead of writing a file that
7
+ * might silently do nothing (or get overwritten by the tool's own background job).
8
+ */
9
+ export declare function handleMemory(opts: {
10
+ path?: string;
11
+ }): Promise<void>;
@@ -0,0 +1,156 @@
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.handleMemory = handleMemory;
37
+ const path = __importStar(require("path"));
38
+ const config_1 = require("../../utils/config");
39
+ const server_1 = require("../../mcp/server");
40
+ const registry_1 = require("./registry");
41
+ const prompt_1 = require("./prompt");
42
+ const MEMORY_FILE_HEADER = '<!-- Seeded by `devsmind memory` — the DevsMind team code-graph MCP server -->\n\n';
43
+ /**
44
+ * `devsmind memory` — seed a tool's own persistent agent-memory/skills store
45
+ * (distinct from `devsmind rule`'s static rule file) with the same workflow
46
+ * contract carried by the MCP `instructions` field, for the handful of tools
47
+ * confirmed to actually read back a file they didn't create themselves. For
48
+ * every other tool this prints honest guidance instead of writing a file that
49
+ * might silently do nothing (or get overwritten by the tool's own background job).
50
+ */
51
+ async function handleMemory(opts) {
52
+ if (!process.stdin.isTTY || !process.stdout.isTTY) {
53
+ console.error(`❌ \`devsmind memory\` is interactive and needs a terminal.\n` +
54
+ ` Run it directly in your shell (not piped/redirected).`);
55
+ process.exit(1);
56
+ }
57
+ const devmindDir = (0, config_1.resolveDevmindDir)(opts.path);
58
+ const workspaceRoot = devmindDir ? path.dirname(devmindDir) : process.cwd();
59
+ try {
60
+ const target = await (0, prompt_1.pickTarget)();
61
+ const mem = target.memory;
62
+ if (!mem.supported) {
63
+ const divider = '─'.repeat(70);
64
+ console.log(`\n${divider}`);
65
+ console.log(` ${target.label} — ${mem.featureName}`);
66
+ console.log(`${divider}\n`);
67
+ console.log(`⚠️ Nothing written — there's no safe way to pre-seed this.\n`);
68
+ console.log(mem.note);
69
+ console.log('');
70
+ return;
71
+ }
72
+ console.log(`\nℹ️ ${target.label} calls this "${mem.featureName}".`);
73
+ console.log(` ${mem.note}`);
74
+ const mode = await (0, prompt_1.pickMode)();
75
+ const scope = await (0, prompt_1.pickMemoryScope)(target);
76
+ const content = MEMORY_FILE_HEADER + server_1.DEVSMIND_INSTRUCTIONS;
77
+ const wrapped = scope.format === 'skill-md' && target.memory.wrap ? target.memory.wrap(content) : content;
78
+ if (mode === 'manual') {
79
+ printManual(target.label, scope, workspaceRoot);
80
+ console.log(`\nContent to place in that file:\n`);
81
+ console.log(indent(wrapped));
82
+ if (mem.pointerFile) {
83
+ console.log(`\n💡 Also add one pointer line into ${mem.pointerFile.file} in the same folder`);
84
+ console.log(` (e.g. "See devsmind.md for the DevsMind workflow.") — it loads on demand only.`);
85
+ }
86
+ return;
87
+ }
88
+ // Automatic mode.
89
+ const targetDir = await resolveMemoryDir(scope, target.label, workspaceRoot);
90
+ const filePath = path.join(targetDir, scope.file);
91
+ const merged = (0, prompt_1.mergeRuleFile)(filePath, wrapped, 'standalone');
92
+ console.log(`\n📝 Target: ${filePath.replace(/\\/g, '/')} (${merged.existed ? 'overwrite our own file' : 'create new'})`);
93
+ console.log(`\nContent to be written:\n`);
94
+ console.log(indent(merged.content));
95
+ const ok = await (0, prompt_1.confirmPrompt)('Write this?', true);
96
+ if (!ok) {
97
+ console.log('\nAborted — nothing written.');
98
+ return;
99
+ }
100
+ (0, prompt_1.writeConfigFile)(filePath, merged.content);
101
+ console.log(`\n✅ Seeded ${target.label}'s ${mem.featureName} at ${filePath.replace(/\\/g, '/')}`);
102
+ if (mem.pointerFile) {
103
+ const pointerConfirm = await (0, prompt_1.confirmPrompt)(`\nAlso append a one-line pointer into ${mem.pointerFile.file} in the same folder, so this gets found ` +
104
+ `(it only loads "on demand" otherwise)?`, true);
105
+ if (pointerConfirm) {
106
+ const pointerPath = path.join(targetDir, mem.pointerFile.file);
107
+ const pointerBody = `See \`${scope.file}\` in this folder for the DevsMind workflow contract — search before grep, ` +
108
+ `\`stage_change\` + \`commit_changes\` after every code change.`;
109
+ const pointerMerged = (0, prompt_1.mergeRuleFile)(pointerPath, pointerBody, 'append-section');
110
+ if (pointerMerged.error) {
111
+ console.error(`❌ ${pointerMerged.error}`);
112
+ }
113
+ else {
114
+ (0, prompt_1.writeConfigFile)(pointerPath, pointerMerged.content);
115
+ console.log(`✅ Pointer added to ${pointerPath.replace(/\\/g, '/')}`);
116
+ }
117
+ }
118
+ }
119
+ }
120
+ catch (err) {
121
+ if (err instanceof prompt_1.CancelledError) {
122
+ console.log('\nCancelled.');
123
+ return;
124
+ }
125
+ throw err;
126
+ }
127
+ }
128
+ /** Resolve the directory to write into, prompting the user to navigate when the exact path isn't knowable. */
129
+ async function resolveMemoryDir(scope, label, workspaceRoot) {
130
+ if (scope.needsUserConfirmedDir) {
131
+ const start = (0, registry_1.resolveOsPath)(scope.dir);
132
+ return (0, prompt_1.pickDirectory)(start, `Navigate to the correct folder for ${label} (e.g. .../projects/<your-project-hash>/memory)`);
133
+ }
134
+ if (scope.scope === 'project') {
135
+ const base = await (0, prompt_1.pickDirectory)(workspaceRoot, `Where is the project root for ${label}?`);
136
+ return path.join(base, (0, registry_1.resolveOsPath)(scope.dir));
137
+ }
138
+ return (0, registry_1.resolveScopeFile)(scope.dir, 'global', workspaceRoot);
139
+ }
140
+ function printManual(label, scope, workspaceRoot) {
141
+ const divider = '─'.repeat(70);
142
+ const dirHint = scope.needsUserConfirmedDir
143
+ ? `${(0, registry_1.resolveOsPath)(scope.dir)}/<your-project-hash>/...`
144
+ : scope.scope === 'project'
145
+ ? path.join(workspaceRoot, (0, registry_1.resolveOsPath)(scope.dir)).replace(/\\/g, '/')
146
+ : (0, registry_1.resolveOsPath)(scope.dir);
147
+ console.log(`\n${divider}`);
148
+ console.log(` Seed DevsMind into ${label}`);
149
+ console.log(`${divider}`);
150
+ console.log(`\n1. Create this file:`);
151
+ console.log(` ${dirHint.replace(/\\/g, '/')}/${scope.file}`);
152
+ }
153
+ function indent(text) {
154
+ return text.split('\n').map(l => ' ' + l).join('\n');
155
+ }
156
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/cli/integrations/memory.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { IdeTarget, Transport, McpScope, RuleScope, ConfigFormat } from './registry';
1
+ import { IdeTarget, Transport, McpScope, RuleScope, MemoryScope, ConfigFormat } from './registry';
2
2
  /** Thrown when the user cancels a prompt (Esc / Ctrl-C). Callers treat it as a clean abort. */
3
3
  export declare class CancelledError extends Error {
4
4
  constructor();
@@ -13,6 +13,8 @@ export declare function pickTarget(): Promise<IdeTarget>;
13
13
  export declare function pickTransport(target: IdeTarget): Promise<Transport>;
14
14
  export declare function pickMcpScope(target: IdeTarget): Promise<McpScope>;
15
15
  export declare function pickRuleScope(target: IdeTarget): Promise<RuleScope>;
16
+ /** Assumes `target.memory.supported` and `scopes` are already checked by the caller. */
17
+ export declare function pickMemoryScope(target: IdeTarget): Promise<MemoryScope>;
16
18
  export type Mode = 'auto' | 'manual';
17
19
  export declare function pickMode(): Promise<Mode>;
18
20
  /**
@@ -32,6 +34,8 @@ export interface MergeResult {
32
34
  existed: boolean;
33
35
  /** Human-readable preview of what will be written (for confirmation). */
34
36
  preview: string;
37
+ /** Set when the file is corrupted in a way that makes a safe merge impossible — callers must not write `content` when this is set. */
38
+ error?: string;
35
39
  }
36
40
  /**
37
41
  * Merge a single named server entry into an MCP config file, without clobbering
@@ -43,6 +43,7 @@ exports.pickTarget = pickTarget;
43
43
  exports.pickTransport = pickTransport;
44
44
  exports.pickMcpScope = pickMcpScope;
45
45
  exports.pickRuleScope = pickRuleScope;
46
+ exports.pickMemoryScope = pickMemoryScope;
46
47
  exports.pickMode = pickMode;
47
48
  exports.pickDirectory = pickDirectory;
48
49
  exports.mergeMcpConfig = mergeMcpConfig;
@@ -90,13 +91,16 @@ async function pickTarget() {
90
91
  for (const t of clis)
91
92
  choices.push({ title: ` ${t.label}`, value: t });
92
93
  }
93
- // Skip the non-selectable header rows if one is chosen.
94
- const picked = await selectPrompt('What are you working in?', choices, 1);
95
- if (!picked) {
96
- // Header row selected — re-ask.
97
- return pickTarget();
94
+ // Skip the non-selectable header rows if one is chosen. Bounded like pickDirectory's
95
+ // loop a non-interactive/piped stdin that keeps returning the header value would
96
+ // otherwise recurse without limit.
97
+ let guard = 0;
98
+ while (guard++ < 5000) {
99
+ const picked = await selectPrompt('What are you working in?', choices, 1);
100
+ if (picked)
101
+ return picked;
98
102
  }
99
- return picked;
103
+ throw new CancelledError();
100
104
  }
101
105
  async function pickTransport(target) {
102
106
  const transports = target.mcp.transports;
@@ -120,6 +124,13 @@ async function pickRuleScope(target) {
120
124
  return scopes[0];
121
125
  return pickScopeGeneric(scopes, s => s.scope);
122
126
  }
127
+ /** Assumes `target.memory.supported` and `scopes` are already checked by the caller. */
128
+ async function pickMemoryScope(target) {
129
+ const scopes = target.memory.scopes ?? [];
130
+ if (scopes.length === 1)
131
+ return scopes[0];
132
+ return pickScopeGeneric(scopes, s => s.scope);
133
+ }
123
134
  async function pickScopeGeneric(scopes, scopeOf) {
124
135
  const label = {
125
136
  project: 'This project only',
@@ -329,8 +340,19 @@ function mergeRuleFile(filePath, ruleBody, style, wrap) {
329
340
  const existing = existed ? safeRead(filePath) : '';
330
341
  const startIdx = existing.indexOf(exports.RULE_START);
331
342
  const endIdx = existing.indexOf(exports.RULE_END);
343
+ // A start marker with no matching end (or an end before start) means the block was
344
+ // hand-edited or a prior write was interrupted — appending a fresh block on top would
345
+ // leave the orphaned marker behind forever and the file would grow every run.
346
+ if (startIdx !== -1 && (endIdx === -1 || endIdx < startIdx)) {
347
+ return {
348
+ content: existing,
349
+ existed,
350
+ preview: '',
351
+ error: `Found "${exports.RULE_START}" without a matching "${exports.RULE_END}" in ${filePath} — the DevsMind block looks corrupted (hand-edited or an interrupted write). Remove both markers manually and re-run this command.`
352
+ };
353
+ }
332
354
  let content;
333
- if (startIdx !== -1 && endIdx !== -1 && endIdx > startIdx) {
355
+ if (startIdx !== -1 && endIdx !== -1) {
334
356
  content = existing.slice(0, startIdx) + block + existing.slice(endIdx + exports.RULE_END.length);
335
357
  }
336
358
  else {