devsmind-mcp 2.2.2 → 2.4.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 +234 -606
- package/dist/cli/analyze.d.ts +13 -0
- package/dist/cli/analyze.js +143 -0
- package/dist/cli/analyze.js.map +1 -0
- package/dist/cli/index.js +62 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.js +9 -0
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/integrations/memory.js +9 -3
- package/dist/cli/integrations/memory.js.map +1 -1
- package/dist/cli/integrations/prompt.d.ts +2 -0
- package/dist/cli/integrations/prompt.js +21 -7
- package/dist/cli/integrations/prompt.js.map +1 -1
- package/dist/cli/prune.js +4 -3
- package/dist/cli/prune.js.map +1 -1
- package/dist/cli/rule.js +43 -83
- package/dist/cli/rule.js.map +1 -1
- package/dist/cli/sync.d.ts +7 -0
- package/dist/cli/sync.js +40 -7
- package/dist/cli/sync.js.map +1 -1
- package/dist/cli/workflow.d.ts +8 -0
- package/dist/cli/workflow.js +156 -0
- package/dist/cli/workflow.js.map +1 -0
- package/dist/db/analyze.d.ts +67 -0
- package/dist/db/analyze.js +167 -0
- package/dist/db/analyze.js.map +1 -0
- package/dist/db/database.d.ts +195 -2
- package/dist/db/database.js +870 -74
- package/dist/db/database.js.map +1 -1
- package/dist/db/schema.d.ts +28 -1
- package/dist/db/schema.js +34 -0
- package/dist/db/schema.js.map +1 -1
- package/dist/db/staging.d.ts +4 -0
- package/dist/db/staging.js +16 -2
- package/dist/db/staging.js.map +1 -1
- package/dist/db/workflow-import.d.ts +22 -0
- package/dist/db/workflow-import.js +116 -0
- package/dist/db/workflow-import.js.map +1 -0
- package/dist/mcp/server.d.ts +1 -1
- package/dist/mcp/server.js +641 -48
- package/dist/mcp/server.js.map +1 -1
- package/dist/utils/ast.d.ts +98 -0
- package/dist/utils/ast.js +262 -10
- package/dist/utils/ast.js.map +1 -1
- package/dist/utils/config.d.ts +2 -0
- package/dist/utils/config.js +11 -0
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/edit.d.ts +41 -0
- package/dist/utils/edit.js +163 -0
- package/dist/utils/edit.js.map +1 -0
- package/dist/utils/git.d.ts +14 -0
- package/dist/utils/git.js +43 -0
- package/dist/utils/git.js.map +1 -0
- package/package.json +1 -1
package/dist/cli/prune.js
CHANGED
|
@@ -75,10 +75,11 @@ async function handlePrune(opts) {
|
|
|
75
75
|
try {
|
|
76
76
|
await runPruneLoop(db);
|
|
77
77
|
}
|
|
78
|
-
catch (err) {
|
|
79
|
-
console.error(`❌ Pruning failed: ${err.message}`);
|
|
80
|
-
}
|
|
81
78
|
finally {
|
|
79
|
+
// No catch here on purpose: index.ts's own action wrapper already catches, logs this
|
|
80
|
+
// exact "Pruning failed" message, and calls process.exit(1) — swallowing the error here
|
|
81
|
+
// (as this used to do) meant that outer handler never ran, so a genuine failure mid-prune
|
|
82
|
+
// still exited 0. db.close() only needs guaranteed cleanup, not error interception.
|
|
82
83
|
db.close();
|
|
83
84
|
}
|
|
84
85
|
}
|
package/dist/cli/prune.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prune.js","sourceRoot":"","sources":["../../src/cli/prune.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA,
|
|
1
|
+
{"version":3,"file":"prune.js","sourceRoot":"","sources":["../../src/cli/prune.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/rule.js
CHANGED
|
@@ -68,95 +68,51 @@ function buildRule(config, devmindDir) {
|
|
|
68
68
|
`**Repos**: ${repoLines}`,
|
|
69
69
|
notes ? `**Notes**: ${notes}` : '',
|
|
70
70
|
'',
|
|
71
|
-
'###
|
|
71
|
+
'### What This Is',
|
|
72
72
|
'',
|
|
73
|
-
|
|
74
|
-
'',
|
|
75
|
-
`**If you skip ${bt}stage_change${bt} + ${bt}commit_changes${bt}, you are not skipping a formality.** You are leaving the graph stale for every other developer's AI agent that queries this code later — tomorrow, next week, on a completely different task. And the reasoning behind your change (why it was made, what ticket drove it, what was broken before, what you tried and rejected) exists **only in this conversation, right now**. It is not in the diff. It is not in the commit message. If it isn't recorded this turn, it is gone forever — no reindex, no log, no ${bt}git blame${bt} can ever recover it.`,
|
|
76
|
-
'',
|
|
77
|
-
`* ${bt}get_node_graph${bt} fills the gap git can't: git shows you WHAT lines changed, never what depends on them. This gives you the live call graph instantly — every caller, every callee — so you find out what breaks BEFORE you change a signature, not after a teammate hits the bug.`,
|
|
78
|
-
`* ${bt}get_node_history${bt} fills a different gap: git blame tells you WHO and WHEN. It never tells you WHY. The actual decision — what was tried, what was rejected, what ticket demanded this, what was broken before — only exists here, written by whichever AI agent made the change. Skip it before refactoring and you risk silently re-breaking a bug that was already fixed once, or undoing a decision that had a reason you never saw.`,
|
|
79
|
-
'',
|
|
80
|
-
'### ⚠️ CRITICAL PRE-FLIGHT CHECK & FEW-SHOT EXAMPLE',
|
|
81
|
-
'',
|
|
82
|
-
'Before executing any filesystem search or reading any file contents, you MUST perform this check:',
|
|
83
|
-
`1. **Am I searching for code/modules/features?** -> You MUST use ${bt}search_nodes${bt} first — it searches names/reasoning AND falls back to full code-content search automatically if nothing matches, in the SAME call. DO NOT start with grep or native filesystem search.`,
|
|
84
|
-
`2. **Am I reading a source file?** -> You MUST call ${bt}get_node_code${bt} instead. It returns that one function/class parsed live from the file, not the whole file — far cheaper. Only read the raw file if the node genuinely isn't in the graph.`,
|
|
85
|
-
`3. **Am I tracing how something flows through the code?** -> You MUST call ${bt}get_node_graph${bt} with ${bt}direction: "out"${bt} and ${bt}include_code: true${bt}. This returns the entry point PLUS everything it transitively calls, each with its source, in ONE call. Do NOT chain ${bt}get_node_code${bt} calls one function at a time — that wastes a chat turn per function.`,
|
|
86
|
-
'',
|
|
87
|
-
'#### Correct Workflow Example (single entity):',
|
|
88
|
-
'* **User asks:** "Explain how rule generation works."',
|
|
89
|
-
`* **Step 1 (Search):** Call ${bt}search_nodes${bt} with query "rule".`,
|
|
90
|
-
`* **Step 2 (Get Code):** Call ${bt}get_node_code${bt} with node_id "${bt}{DevMinds}/src/cli/rule.ts#handleRule${bt}".`,
|
|
91
|
-
'* **Step 3 (Explain):** Explain the logic using the returned code.',
|
|
92
|
-
'',
|
|
93
|
-
'#### Correct Workflow Example (tracing a flow — DO THIS, it is 2 turns not 15):',
|
|
94
|
-
'* **User asks:** "How does an Alipay payment get processed end to end?"',
|
|
95
|
-
`* **Step 1 (Find the entry point):** Call ${bt}search_nodes${bt} with query "alipay".`,
|
|
96
|
-
`* **Step 2 (Pull the whole flow at once):** Call ${bt}get_node_graph${bt} with the entry node_id, ${bt}direction: "out"${bt}, ${bt}include_code: true${bt}, ${bt}max_depth: 3${bt}.`,
|
|
97
|
-
'* **Step 3 (Explain):** You now have every function in the call chain with its code. Explain the flow. Do NOT make further tool calls to fetch code you already have.',
|
|
73
|
+
`DevsMind is this team's shared code graph — every teammate's AI agent reads the same graph you write to, there is no "your copy." ${bt}get_node_graph${bt} shows what git can't (live callers/callees, before you break a signature). ${bt}get_node_history${bt} shows what git blame can't (why a change was made, not just who/when). Both are worthless if changes stop getting recorded — so recording is not optional, it's the product.`,
|
|
98
74
|
'',
|
|
99
75
|
'### Tool Triggers',
|
|
100
76
|
'',
|
|
101
77
|
'| Situation | Tool |',
|
|
102
78
|
'|-----------|------|',
|
|
103
|
-
`| Searching for a module, feature, concept, code fragment
|
|
104
|
-
`|
|
|
105
|
-
`|
|
|
106
|
-
`|
|
|
107
|
-
`|
|
|
108
|
-
`|
|
|
109
|
-
`|
|
|
110
|
-
`|
|
|
111
|
-
`|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
'
|
|
116
|
-
'',
|
|
117
|
-
|
|
118
|
-
'',
|
|
119
|
-
|
|
120
|
-
`
|
|
121
|
-
`
|
|
122
|
-
`
|
|
123
|
-
'
|
|
124
|
-
'
|
|
125
|
-
'',
|
|
126
|
-
|
|
127
|
-
`
|
|
128
|
-
`
|
|
129
|
-
`
|
|
130
|
-
`
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
`
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
'
|
|
138
|
-
'
|
|
139
|
-
|
|
140
|
-
'|------|----------|',
|
|
141
|
-
`| ${bt}search_nodes${bt} | Find code by name, keyword, or reasoning text — auto-falls-back to a regex/string code-content search if nothing matches |`,
|
|
142
|
-
`| ${bt}list_nodes${bt} | List nodes in the graph with optional filters (type, file path, etc.) |`,
|
|
143
|
-
`| ${bt}get_node_summary${bt} | Get file location, connection count, history count for a node |`,
|
|
144
|
-
`| ${bt}get_node_code${bt} | Get ONE node's current source, parsed live from its file (use instead of reading the file) |`,
|
|
145
|
-
`| ${bt}get_node_graph${bt} | See a node's callers/dependencies. With ${bt}direction:"out"${bt} + ${bt}include_code:true${bt}, returns an entire call flow WITH source code in a single call |`,
|
|
146
|
-
`| ${bt}get_node_history${bt} | Read all past snapshots and reasoning logs for a node |`,
|
|
147
|
-
`| ${bt}stage_change${bt} | Buffer one touched node after a code change (code + reasoning only; no edge reasoning) |`,
|
|
148
|
-
`| ${bt}commit_changes${bt} | Flush all staged changes: create nodes, save history, resolve all connections via AST |`,
|
|
149
|
-
`| ${bt}rename_node${bt} | Rename a node ID and update all its connections/history |`,
|
|
150
|
-
`| ${bt}deprecate_node${bt} | Mark a removed function/class as deprecated (preserves history) |`,
|
|
151
|
-
`| ${bt}get_recent_changes${bt} | List nodes modified in the last N hours across the project |`,
|
|
152
|
-
`| ${bt}get_developer_activity${bt} | List recent changes made by a specific developer |`,
|
|
153
|
-
`| ${bt}get_changes_by_requirement${bt} | Find all changes linked to a ticket or requirement ID |`,
|
|
154
|
-
`| ${bt}search_decisions${bt} | Search architectural reasoning and decision logs by keyword |`,
|
|
155
|
-
`| ${bt}get_orphaned_nodes${bt} | Find nodes with no connections (dead code / stale entries) |`,
|
|
156
|
-
`| ${bt}recheck_graph${bt} | Scan files, deprecate nodes for deleted files, clean primitives |`,
|
|
157
|
-
`| ${bt}get_visualizer_url${bt} | Get URL to open the interactive 2D/3D graph visualizer |`,
|
|
158
|
-
'',
|
|
159
|
-
'> All tool argument schemas are exposed automatically by the MCP server.'
|
|
79
|
+
`| Searching for a module, feature, concept, or code fragment | ${bt}search_nodes${bt} (name/reasoning match, auto-falls-back to code-content search) — never start with grep |`,
|
|
80
|
+
`| List/discover all nodes for a component or directory | ${bt}list_nodes${bt} |`,
|
|
81
|
+
`| Read the code of ONE function/class | ${bt}get_node_code${bt} (live-parsed, cheaper than opening the file) |`,
|
|
82
|
+
`| Trace a flow through MULTIPLE functions | ${bt}get_node_graph${bt} ${bt}direction:"out"${bt} + ${bt}include_code:true${bt} in ONE call — don't chain ${bt}get_node_code${bt} per function |`,
|
|
83
|
+
`| What would break if I change this? | ${bt}get_node_graph${bt} ${bt}direction:"in"${bt} (every caller) |`,
|
|
84
|
+
`| Before refactoring a function | ${bt}get_node_history${bt} first |`,
|
|
85
|
+
`| ANY edit to ANY file — ${bt}.ts${bt}, ${bt}.vue${bt}, ${bt}.css${bt}, ${bt}.json${bt}, ${bt}.xml${bt}, anything | ${bt}edit_node${bt} (${bt}file_path${bt} + ${bt}old_string${bt} + ${bt}new_string${bt} + ${bt}reasoning${bt}) — never your own edit tool. It never refuses a file type, and records what you changed for you |`,
|
|
86
|
+
`| Create a NEW file | ${bt}edit_node${bt} with ${bt}old_string: ""${bt} and the whole file as ${bt}new_string${bt} — never your own write tool |`,
|
|
87
|
+
`| You wrote a language with no parser (${bt}.py${bt}, ${bt}.go${bt}, ${bt}.java${bt}, …) | ${bt}stage_change${bt} for that node — immediately, not batched (${bt}edit_node${bt}'s response tells you when) |`,
|
|
88
|
+
`| Checkpoints during a long task, and before ending any turn with staged work | ${bt}commit_changes${bt} |`,
|
|
89
|
+
`| Function/class renamed | ${bt}rename_node${bt} |`,
|
|
90
|
+
`| Function/class removed | ${bt}deprecate_node${bt} (never delete — history is lost otherwise) |`,
|
|
91
|
+
'',
|
|
92
|
+
'### Recording Changes — Per Node, Not Per File, Not At The End',
|
|
93
|
+
'',
|
|
94
|
+
`${bt}stage_change${bt} is source code only (${Array.from(scanner_1.INDEXABLE_EXTENSIONS).sort().join(', ')}) — skip stylesheets, markup, config, docs, images.`,
|
|
95
|
+
'',
|
|
96
|
+
`1. ${bt}edit_node${bt} is the write path for **every** file — never your own edit/write tool, whatever the extension. Pass ${bt}file_path${bt} + ${bt}old_string${bt} + ${bt}new_string${bt} + ${bt}reasoning${bt}, exactly like an ordinary edit tool; to create a file, pass ${bt}old_string: ""${bt} and the whole file as ${bt}new_string${bt}. It traces where your text landed, records your reasoning against the function/class you actually changed, and answers with that node's callers. No ${bt}node_id${bt} to look up, no ${bt}code_snapshot${bt} to send back, no ${bt}stage_change${bt} call. Writes landing outside any function (markup, config, imports) record nothing — expected, not a failure.`,
|
|
97
|
+
`2. ${bt}stage_change${bt} is only for what no parser can read: a language with no AST support (${bt}.py${bt}, ${bt}.go${bt}, ${bt}.java${bt}, …). ${bt}edit_node${bt} still writes those files and tells you when it couldn't trace one. One call per **node**, the moment you finish it — a file with 3 changed functions is 3 calls, not saved up. Pass ${bt}node_id${bt}, ${bt}file_path${bt}, ${bt}code_snapshot${bt}, ${bt}reasoning${bt}. Never hand-guess connections — ${bt}commit_changes${bt} resolves them via AST.`,
|
|
98
|
+
`3. Call ${bt}commit_changes${bt} at natural checkpoints (a batch of related nodes, a context switch) — not saved for a single end-of-task call that's easy to skip when the task runs long. ${bt}edit_node${bt} and ${bt}stage_change${bt} both only stage; neither writes to the graph on its own. Always commit before ending a turn with anything staged.`,
|
|
99
|
+
`4. Don't print node/history data as text instead of calling the tools — that looks done but records nothing.`,
|
|
100
|
+
'',
|
|
101
|
+
'### Other Rules',
|
|
102
|
+
'',
|
|
103
|
+
`1. **No external scripts for indexing.** Use ${bt}index_start${bt} / ${bt}index_checkpoint${bt} / ${bt}index_continue${bt} / ${bt}index_complete${bt} natively so progress survives a context reset.`,
|
|
104
|
+
`2. **Don't pause mid-index** for confirmation — keep going until the workspace is indexed or the context limit is hit.`,
|
|
105
|
+
`3. **Drift signals** — ${bt}get_node_code${bt} returning ${bt}snapshot_outdated:true${bt} means the graph disagrees with disk. If you're about to edit that node anyway, an ${bt}edit_node${bt} call re-syncs it as a side effect — nothing extra to do. To force a resync with NO real code change, ${bt}edit_node${bt} can't help (it requires ${bt}old_string${bt} to actually differ from ${bt}new_string${bt}) — use ${bt}stage_change${bt} instead, passing the current on-disk code as ${bt}code_snapshot${bt}, then ${bt}commit_changes${bt}. ${bt}source:"cached"${bt} means the symbol wasn't found (renamed/moved/deleted) — verify, then ${bt}rename_node${bt} or ${bt}deprecate_node${bt}.`,
|
|
106
|
+
`4. **Before multi-day work**, call ${bt}workflow_list${bt} — if a paused workflow matches, offer to resume it (${bt}workflow_resume${bt} + ${bt}workflow_get_context${bt}) instead of starting fresh. While a workflow is active, ${bt}commit_changes${bt} auto-logs a step from what you staged — call ${bt}workflow_add_step${bt} directly only for something a commit doesn't cover (a decision with no code change, or a ${bt}pending_tasks${bt} note).`,
|
|
107
|
+
'',
|
|
108
|
+
'### A Few Less-Obvious Tools',
|
|
109
|
+
'',
|
|
110
|
+
`Every tool's own name/schema/description is already sent to you automatically by the MCP server — no need to list them all here. Just the ones worth knowing about ahead of time:`,
|
|
111
|
+
'',
|
|
112
|
+
`* ${bt}get_orphaned_nodes${bt} / ${bt}recheck_graph${bt} / ${bt}analyze_graph${bt} — maintenance, not day-to-day lookup. ${bt}analyze_graph${bt} is a zero-token local health check (god entities, cycles, dangling edges, renames); ${bt}fix:true${bt} applies only the safe automatic fixes.`,
|
|
113
|
+
`* ${bt}workflow_get_context${bt} — call right after ${bt}workflow_resume${bt} to load that workflow's full timeline + artifacts in one shot.`,
|
|
114
|
+
`* ${bt}workflow_sync_retroactive${bt} — backfills a workflow's timeline after a whole session went by without a step being recorded; takes already-extracted steps, not raw transcript text.`,
|
|
115
|
+
`* ${bt}workflow_import${bt} — turns existing flow/architecture docs into paused, resumable workflows.`,
|
|
160
116
|
];
|
|
161
117
|
return lines.filter(l => l !== null).join('\n');
|
|
162
118
|
}
|
|
@@ -231,6 +187,10 @@ async function handleRule(opts) {
|
|
|
231
187
|
filePath = (0, registry_1.resolveScopeFile)(scope.file, 'global', workspaceRoot);
|
|
232
188
|
}
|
|
233
189
|
const merged = (0, prompt_1.mergeRuleFile)(filePath, rule, target.rules.style, target.rules.wrap);
|
|
190
|
+
if (merged.error) {
|
|
191
|
+
console.error(`\n❌ ${merged.error}`);
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
234
194
|
console.log(`\n📝 Target: ${filePath.replace(/\\/g, '/')} (${merged.existed ? (target.rules.style === 'append-section' ? 'merge DevsMind block into existing' : 'overwrite dedicated file') : 'create new'})`);
|
|
235
195
|
console.log(`\n${target.rules.style === 'append-section' ? 'The DevsMind block to be written:' : 'File contents to be written:'}\n`);
|
|
236
196
|
console.log(merged.preview.split('\n').map(l => ' ' + l).join('\n'));
|
package/dist/cli/rule.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule.js","sourceRoot":"","sources":["../../src/cli/rule.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBA,
|
|
1
|
+
{"version":3,"file":"rule.js","sourceRoot":"","sources":["../../src/cli/rule.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/sync.d.ts
CHANGED
|
@@ -7,7 +7,14 @@
|
|
|
7
7
|
* trigger a sync, and the DB's constructor-time `syncFromDisk()` only runs once
|
|
8
8
|
* per process. So after a `git pull` the committed graph changes never reach the
|
|
9
9
|
* local DB without a restart. This command applies them on demand.
|
|
10
|
+
*
|
|
11
|
+
* `--analyze` (optionally with `--fix`) runs `devsmind analyze` immediately after,
|
|
12
|
+
* on the same connection — the natural place to catch drift a teammate's changes
|
|
13
|
+
* introduced, right when you pull them in.
|
|
10
14
|
*/
|
|
11
15
|
export declare function handleSync(opts: {
|
|
12
16
|
path?: string;
|
|
17
|
+
analyze?: boolean;
|
|
18
|
+
fix?: boolean;
|
|
19
|
+
godEntityThreshold?: string;
|
|
13
20
|
}): Promise<void>;
|
package/dist/cli/sync.js
CHANGED
|
@@ -42,6 +42,8 @@ const path = __importStar(require("path"));
|
|
|
42
42
|
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
43
43
|
const config_1 = require("../utils/config");
|
|
44
44
|
const database_1 = require("../db/database");
|
|
45
|
+
const analyze_1 = require("../db/analyze");
|
|
46
|
+
const analyze_2 = require("./analyze");
|
|
45
47
|
/**
|
|
46
48
|
* `devsmind sync` — force the on-disk graph (`graph/**`) and history
|
|
47
49
|
* (`history/*.json`) into the local `brain.db`.
|
|
@@ -51,6 +53,10 @@ const database_1 = require("../db/database");
|
|
|
51
53
|
* trigger a sync, and the DB's constructor-time `syncFromDisk()` only runs once
|
|
52
54
|
* per process. So after a `git pull` the committed graph changes never reach the
|
|
53
55
|
* local DB without a restart. This command applies them on demand.
|
|
56
|
+
*
|
|
57
|
+
* `--analyze` (optionally with `--fix`) runs `devsmind analyze` immediately after,
|
|
58
|
+
* on the same connection — the natural place to catch drift a teammate's changes
|
|
59
|
+
* introduced, right when you pull them in.
|
|
54
60
|
*/
|
|
55
61
|
async function handleSync(opts) {
|
|
56
62
|
const devmindDir = (0, config_1.resolveDevmindDir)(opts.path);
|
|
@@ -65,12 +71,20 @@ async function handleSync(opts) {
|
|
|
65
71
|
// Read the pre-sync counts straight from the existing brain.db file (if any),
|
|
66
72
|
// BEFORE DevMindDatabase's constructor runs syncFromDisk(). This lets us show
|
|
67
73
|
// an honest delta of what the sync actually pulled in.
|
|
68
|
-
|
|
74
|
+
let before;
|
|
75
|
+
try {
|
|
76
|
+
before = readRawCounts(dbPath);
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
console.error(`\n❌ ${err.message}`);
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
69
82
|
// Constructing the DB runs syncFromDisk() once; we call it again explicitly so
|
|
70
83
|
// the behaviour is obvious and robust even if the constructor changes later.
|
|
71
84
|
const db = new database_1.DevMindDatabase(dbPath);
|
|
72
85
|
try {
|
|
73
86
|
db.syncFromDisk();
|
|
87
|
+
db.syncToDisk();
|
|
74
88
|
const after = db.getCounts();
|
|
75
89
|
const delta = (a, b) => {
|
|
76
90
|
const d = b - a;
|
|
@@ -80,12 +94,24 @@ async function handleSync(opts) {
|
|
|
80
94
|
console.log(` Nodes : ${after.nodes}${delta(before.nodes, after.nodes)}`);
|
|
81
95
|
console.log(` Connections : ${after.connections}${delta(before.connections, after.connections)}`);
|
|
82
96
|
console.log(` History : ${after.history}${delta(before.history, after.history)}\n`);
|
|
97
|
+
if (opts.analyze) {
|
|
98
|
+
const godEntityThreshold = opts.godEntityThreshold ? parseInt(opts.godEntityThreshold, 10) : undefined;
|
|
99
|
+
console.log(`🩺 Running analyze${opts.fix ? ' (--fix)' : ''}...`);
|
|
100
|
+
const report = (0, analyze_1.runAnalysis)(db, path.dirname(devmindDir), { fix: opts.fix === true, godEntityThreshold });
|
|
101
|
+
(0, analyze_2.printReport)(report);
|
|
102
|
+
}
|
|
83
103
|
}
|
|
84
104
|
finally {
|
|
85
105
|
db.close();
|
|
86
106
|
}
|
|
87
107
|
}
|
|
88
|
-
/**
|
|
108
|
+
/**
|
|
109
|
+
* Count rows in an existing brain.db without triggering a sync. A missing file is a
|
|
110
|
+
* legitimate zero (first-ever sync). A file that exists but fails to OPEN (corrupt/
|
|
111
|
+
* truncated SQLite) is NOT a legitimate zero — that would print a misleading "+500"
|
|
112
|
+
* delta as if the DB were simply empty, masking real corruption. Per-table read
|
|
113
|
+
* failures (e.g. a table missing on an older schema) still fall back to 0.
|
|
114
|
+
*/
|
|
89
115
|
function readRawCounts(dbPath) {
|
|
90
116
|
const zero = { nodes: 0, connections: 0, history: 0 };
|
|
91
117
|
if (!fs.existsSync(dbPath))
|
|
@@ -93,6 +119,17 @@ function readRawCounts(dbPath) {
|
|
|
93
119
|
let raw = null;
|
|
94
120
|
try {
|
|
95
121
|
raw = new better_sqlite3_1.default(dbPath, { readonly: true });
|
|
122
|
+
// better-sqlite3 opens lazily — a garbage/truncated file doesn't throw until the
|
|
123
|
+
// first real read, so force one here to detect corruption up front rather than
|
|
124
|
+
// letting per-table reads below silently swallow it into a misleading zero.
|
|
125
|
+
raw.prepare('SELECT 1').get();
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
if (raw)
|
|
129
|
+
raw.close();
|
|
130
|
+
throw new Error(`brain.db exists but could not be read (${err.message}) — it may be corrupted. Investigate before syncing, or remove it to start fresh.`);
|
|
131
|
+
}
|
|
132
|
+
try {
|
|
96
133
|
const one = (sql) => {
|
|
97
134
|
try {
|
|
98
135
|
const row = raw.prepare(sql).get();
|
|
@@ -108,12 +145,8 @@ function readRawCounts(dbPath) {
|
|
|
108
145
|
history: one('SELECT COUNT(*) AS c FROM history'),
|
|
109
146
|
};
|
|
110
147
|
}
|
|
111
|
-
catch {
|
|
112
|
-
return zero;
|
|
113
|
-
}
|
|
114
148
|
finally {
|
|
115
|
-
|
|
116
|
-
raw.close();
|
|
149
|
+
raw.close();
|
|
117
150
|
}
|
|
118
151
|
}
|
|
119
152
|
//# sourceMappingURL=sync.js.map
|
package/dist/cli/sync.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/cli/sync.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/cli/sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** `devsmind workflow` — interactive list/view/pause/resume. Day-to-day creation and step-recording happens through the MCP tools the agent calls, not this command. */
|
|
2
|
+
export declare function handleWorkflow(opts: {
|
|
3
|
+
path?: string;
|
|
4
|
+
}): Promise<void>;
|
|
5
|
+
/** `devsmind workflow import <path>` — imports a folder of .md flow docs, or a single file, as paused workflows. */
|
|
6
|
+
export declare function handleWorkflowImport(pathArg: string, opts: {
|
|
7
|
+
path?: string;
|
|
8
|
+
}): 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
|
+
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.handleWorkflow = handleWorkflow;
|
|
40
|
+
exports.handleWorkflowImport = handleWorkflowImport;
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const prompts_1 = __importDefault(require("prompts"));
|
|
44
|
+
const config_1 = require("../utils/config");
|
|
45
|
+
const database_1 = require("../db/database");
|
|
46
|
+
const workflow_import_1 = require("../db/workflow-import");
|
|
47
|
+
function openDb(pathOpt) {
|
|
48
|
+
const devmindDir = (0, config_1.resolveDevmindDir)(pathOpt);
|
|
49
|
+
if (!devmindDir) {
|
|
50
|
+
console.error(`❌ No .devmind directory found.\n` +
|
|
51
|
+
` Run from inside a DevsMind brain folder, or pass --path <devmind_path>.`);
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
return { db: new database_1.DevMindDatabase(path.join(devmindDir, 'brain.db')), devmindDir };
|
|
55
|
+
}
|
|
56
|
+
/** `devsmind workflow` — interactive list/view/pause/resume. Day-to-day creation and step-recording happens through the MCP tools the agent calls, not this command. */
|
|
57
|
+
async function handleWorkflow(opts) {
|
|
58
|
+
const { db } = openDb(opts.path);
|
|
59
|
+
try {
|
|
60
|
+
await runWorkflowLoop(db);
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
db.close();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async function runWorkflowLoop(db) {
|
|
67
|
+
while (true) {
|
|
68
|
+
const workflows = db.listWorkflows();
|
|
69
|
+
if (workflows.length === 0) {
|
|
70
|
+
console.log('📝 No workflows yet. Create one via the workflow_create MCP tool, or import existing docs with `devsmind workflow import <path>`.');
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const statusEmoji = { active: '🟢', paused: '⏸️', completed: '✅' };
|
|
74
|
+
const choices = workflows.map(w => ({
|
|
75
|
+
title: `${statusEmoji[w.status] || ''} [${w.status}] ${w.name}`,
|
|
76
|
+
value: w.id
|
|
77
|
+
}));
|
|
78
|
+
choices.push({ title: '🚪 Exit', value: 'exit' });
|
|
79
|
+
const response = await (0, prompts_1.default)({
|
|
80
|
+
type: 'select',
|
|
81
|
+
name: 'id',
|
|
82
|
+
message: `Workflows (${workflows.length}):`,
|
|
83
|
+
choices
|
|
84
|
+
});
|
|
85
|
+
if (!response.id || response.id === 'exit') {
|
|
86
|
+
console.log('🚪 Goodbye!');
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
await showWorkflowMenu(db, response.id);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async function showWorkflowMenu(db, id) {
|
|
93
|
+
while (true) {
|
|
94
|
+
let workflow;
|
|
95
|
+
let steps, artifacts;
|
|
96
|
+
try {
|
|
97
|
+
({ workflow, steps, artifacts } = db.getWorkflowContext(id));
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
console.log(`\n==================================================`);
|
|
103
|
+
console.log(`📋 ${workflow.name} [${workflow.status}]`);
|
|
104
|
+
console.log(`==================================================`);
|
|
105
|
+
console.log(workflow.description);
|
|
106
|
+
console.log(`\nSteps (${steps.length}):`);
|
|
107
|
+
for (const s of steps) {
|
|
108
|
+
console.log(` ${s.step_index}. ${s.summary}${s.pending_tasks ? ` (pending: ${s.pending_tasks})` : ''}`);
|
|
109
|
+
}
|
|
110
|
+
console.log(`\nArtifacts (${artifacts.length}):`);
|
|
111
|
+
for (const a of artifacts) {
|
|
112
|
+
console.log(` - [${a.type}] ${a.source_name} → ${a.file_path.replace(/\\/g, '/')}`);
|
|
113
|
+
}
|
|
114
|
+
const choices = [];
|
|
115
|
+
if (workflow.status !== 'active')
|
|
116
|
+
choices.push({ title: '▶️ Resume (make active)', value: 'resume' });
|
|
117
|
+
if (workflow.status === 'active')
|
|
118
|
+
choices.push({ title: '⏸️ Pause', value: 'pause' });
|
|
119
|
+
if (workflow.status !== 'completed')
|
|
120
|
+
choices.push({ title: '✅ Mark completed', value: 'complete' });
|
|
121
|
+
choices.push({ title: '⬅️ Back to list', value: 'back' });
|
|
122
|
+
const response = await (0, prompts_1.default)({ type: 'select', name: 'action', message: 'Action:', choices });
|
|
123
|
+
if (!response.action || response.action === 'back')
|
|
124
|
+
return;
|
|
125
|
+
if (response.action === 'resume')
|
|
126
|
+
db.resumeWorkflow(id);
|
|
127
|
+
if (response.action === 'pause')
|
|
128
|
+
db.pauseWorkflow();
|
|
129
|
+
if (response.action === 'complete')
|
|
130
|
+
db.completeWorkflow(id);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/** `devsmind workflow import <path>` — imports a folder of .md flow docs, or a single file, as paused workflows. */
|
|
134
|
+
async function handleWorkflowImport(pathArg, opts) {
|
|
135
|
+
const { db } = openDb(opts.path);
|
|
136
|
+
try {
|
|
137
|
+
const resolved = path.resolve(pathArg);
|
|
138
|
+
const isDir = fs.existsSync(resolved) && fs.statSync(resolved).isDirectory();
|
|
139
|
+
const result = (0, workflow_import_1.importWorkflowDocs)(db, isDir ? resolved : undefined, isDir ? undefined : resolved);
|
|
140
|
+
console.log(`\n📥 Import complete.`);
|
|
141
|
+
if (result.created.length)
|
|
142
|
+
console.log(` Created (${result.created.length}): ${result.created.join(', ')}`);
|
|
143
|
+
if (result.updated.length)
|
|
144
|
+
console.log(` Updated (${result.updated.length}): ${result.updated.join(', ')}`);
|
|
145
|
+
if (result.skipped.length)
|
|
146
|
+
console.log(` Skipped (${result.skipped.length}): ${result.skipped.join(', ')}`);
|
|
147
|
+
if (!result.created.length && !result.updated.length && !result.skipped.length) {
|
|
148
|
+
console.log(' Nothing to import.');
|
|
149
|
+
}
|
|
150
|
+
console.log();
|
|
151
|
+
}
|
|
152
|
+
finally {
|
|
153
|
+
db.close();
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/cli/workflow.ts"],"names":[],"mappings":"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"}
|