@monoes/monomindcli 2.16.3 → 2.16.4
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/.claude/commands/mastermind/createorg.md +2 -2
- package/.claude/commands/mastermind/help.md +5 -11
- package/.claude/commands/mastermind/master.md +1 -2
- package/.claude/commands/mastermind/orgs.md +1 -1
- package/.claude/commands/mastermind/orgstatus.md +1 -1
- package/.claude/commands/mastermind/runorg.md +2 -2
- package/.claude/commands/mastermind/stoporg.md +7 -11
- package/.claude/helpers/agent-registry.cjs +434 -0
- package/.claude/helpers/handlers/pick-core.cjs +20 -2
- package/.claude/helpers/handlers/session-restore-handler.cjs +4 -1
- package/.claude/helpers/jev-catalog.cjs +7 -3
- package/.claude/helpers/jev-picker.cjs +3 -1
- package/.claude/helpers/pick-rank.cjs +90 -4
- package/.claude/skills/mastermind-agents/SKILL.md +31 -38
- package/.claude/skills/mastermind-createorg/SKILL.md +3 -3
- package/.claude/skills/mastermind-env/SKILL.md +4 -18
- package/.claude/skills/mastermind-inbox/SKILL.md +31 -52
- package/.claude/skills/mastermind-instance/SKILL.md +7 -5
- package/.claude/skills/mastermind-new-agent/SKILL.md +3 -3
- package/.claude/skills/mastermind-org-settings/SKILL.md +3 -4
- package/.claude/skills/mastermind-orgs/SKILL.md +26 -32
- package/.claude/skills/mastermind-orgstatus/SKILL.md +49 -140
- package/.claude/skills/mastermind-runorg/SKILL.md +13 -13
- package/.claude/skills/mastermind-stoporg/SKILL.md +7 -62
- package/.claude/skills/mastermind-tasks/SKILL.md +6 -8
- package/README.md +28 -43
- package/dist/src/agents/registry-builder.d.ts +57 -21
- package/dist/src/agents/registry-builder.d.ts.map +1 -1
- package/dist/src/agents/registry-builder.js +41 -341
- package/dist/src/agents/registry-builder.js.map +1 -1
- package/dist/src/agents/registry-freshness.d.ts +4 -4
- package/dist/src/agents/registry-freshness.d.ts.map +1 -1
- package/dist/src/agents/registry-freshness.js +11 -60
- package/dist/src/agents/registry-freshness.js.map +1 -1
- package/dist/src/commands/doc.d.ts.map +1 -1
- package/dist/src/commands/doc.js +6 -15
- package/dist/src/commands/doc.js.map +1 -1
- package/dist/src/commands/doctor-pick-checks.d.ts.map +1 -1
- package/dist/src/commands/doctor-pick-checks.js +9 -41
- package/dist/src/commands/doctor-pick-checks.js.map +1 -1
- package/dist/src/commands/doctor-project-checks.d.ts.map +1 -1
- package/dist/src/commands/doctor-project-checks.js +7 -5
- package/dist/src/commands/doctor-project-checks.js.map +1 -1
- package/dist/src/commands/hooks-routing-commands.d.ts.map +1 -1
- package/dist/src/commands/hooks-routing-commands.js +4 -3
- package/dist/src/commands/hooks-routing-commands.js.map +1 -1
- package/dist/src/commands/init-upgrade.d.ts.map +1 -1
- package/dist/src/commands/init-upgrade.js +4 -0
- package/dist/src/commands/init-upgrade.js.map +1 -1
- package/dist/src/commands/init-wizard.d.ts.map +1 -1
- package/dist/src/commands/init-wizard.js +7 -2
- package/dist/src/commands/init-wizard.js.map +1 -1
- package/dist/src/commands/init.d.ts.map +1 -1
- package/dist/src/commands/init.js +16 -27
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/monograph.d.ts.map +1 -1
- package/dist/src/commands/monograph.js +16 -21
- package/dist/src/commands/monograph.js.map +1 -1
- package/dist/src/commands/org.js +1 -1
- package/dist/src/commands/org.js.map +1 -1
- package/dist/src/decision/jev.d.ts +4 -0
- package/dist/src/decision/jev.d.ts.map +1 -1
- package/dist/src/decision/jev.js.map +1 -1
- package/dist/src/decision/pick-real.d.ts +93 -0
- package/dist/src/decision/pick-real.d.ts.map +1 -0
- package/dist/src/decision/pick-real.js +253 -0
- package/dist/src/decision/pick-real.js.map +1 -0
- package/dist/src/decision/picks.d.ts +1 -0
- package/dist/src/decision/picks.d.ts.map +1 -1
- package/dist/src/decision/picks.js +1 -0
- package/dist/src/decision/picks.js.map +1 -1
- package/dist/src/init/embeddings-step.d.ts +23 -0
- package/dist/src/init/embeddings-step.d.ts.map +1 -0
- package/dist/src/init/embeddings-step.js +53 -0
- package/dist/src/init/embeddings-step.js.map +1 -0
- package/dist/src/init/executor.d.ts.map +1 -1
- package/dist/src/init/executor.js +9 -1
- package/dist/src/init/executor.js.map +1 -1
- package/dist/src/init/helpers-generator.d.ts.map +1 -1
- package/dist/src/init/helpers-generator.js +4 -0
- package/dist/src/init/helpers-generator.js.map +1 -1
- package/dist/src/init/project-indexes.d.ts +19 -0
- package/dist/src/init/project-indexes.d.ts.map +1 -0
- package/dist/src/init/project-indexes.js +44 -0
- package/dist/src/init/project-indexes.js.map +1 -0
- package/dist/src/init/shared.d.ts +7 -2
- package/dist/src/init/shared.d.ts.map +1 -1
- package/dist/src/init/shared.js +7 -6
- package/dist/src/init/shared.js.map +1 -1
- package/dist/src/init/types.d.ts +13 -2
- package/dist/src/init/types.d.ts.map +1 -1
- package/dist/src/init/types.js +11 -3
- package/dist/src/init/types.js.map +1 -1
- package/dist/src/init/upgrade.d.ts +3 -0
- package/dist/src/init/upgrade.d.ts.map +1 -1
- package/dist/src/init/upgrade.js +21 -6
- package/dist/src/init/upgrade.js.map +1 -1
- package/dist/src/init/write-antigravity.d.ts +1 -0
- package/dist/src/init/write-antigravity.d.ts.map +1 -1
- package/dist/src/init/write-antigravity.js +19 -1
- package/dist/src/init/write-antigravity.js.map +1 -1
- package/dist/src/init/write-claude.d.ts.map +1 -1
- package/dist/src/init/write-claude.js +8 -5
- package/dist/src/init/write-claude.js.map +1 -1
- package/dist/src/mcp-tools/embeddings-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/embeddings-tools.js +14 -5
- package/dist/src/mcp-tools/embeddings-tools.js.map +1 -1
- package/dist/src/mcp-tools/hooks-routing.d.ts.map +1 -1
- package/dist/src/mcp-tools/hooks-routing.js +4 -3
- package/dist/src/mcp-tools/hooks-routing.js.map +1 -1
- package/dist/src/mcp-tools/monograph/build-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/monograph/build-tools.js +16 -9
- package/dist/src/mcp-tools/monograph/build-tools.js.map +1 -1
- package/dist/src/memory/embedding-operations.d.ts +0 -4
- package/dist/src/memory/embedding-operations.d.ts.map +1 -1
- package/dist/src/memory/embedding-operations.js +11 -85
- package/dist/src/memory/embedding-operations.js.map +1 -1
- package/dist/src/memory/memory-bridge.d.ts +7 -0
- package/dist/src/memory/memory-bridge.d.ts.map +1 -1
- package/dist/src/memory/memory-bridge.js +15 -0
- package/dist/src/memory/memory-bridge.js.map +1 -1
- package/dist/src/orgrt/bash-timeout.d.ts +17 -0
- package/dist/src/orgrt/bash-timeout.d.ts.map +1 -1
- package/dist/src/orgrt/bash-timeout.js +15 -0
- package/dist/src/orgrt/bash-timeout.js.map +1 -1
- package/dist/src/orgrt/session.d.ts.map +1 -1
- package/dist/src/orgrt/session.js +5 -2
- package/dist/src/orgrt/session.js.map +1 -1
- package/dist/src/orgrt/task-match.d.ts +3 -1
- package/dist/src/orgrt/task-match.d.ts.map +1 -1
- package/dist/src/orgrt/task-match.js +12 -4
- package/dist/src/orgrt/task-match.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -5
|
@@ -1,238 +1,38 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Registry Builder (Task 30)
|
|
3
3
|
*
|
|
4
|
-
* Scans agent definition .md files, parses YAML frontmatter,
|
|
5
|
-
*
|
|
4
|
+
* Scans agent definition .md files, parses YAML frontmatter, and produces a
|
|
5
|
+
* unified AgentRegistry JSON. The implementation lives in
|
|
6
|
+
* .claude/helpers/agent-registry.cjs — shared with the SessionStart hook,
|
|
7
|
+
* which cannot import TypeScript — and this module is its typed interface.
|
|
6
8
|
*/
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
let stat;
|
|
28
|
-
try {
|
|
29
|
-
stat = statSync(full);
|
|
30
|
-
}
|
|
31
|
-
catch {
|
|
32
|
-
continue;
|
|
33
|
-
}
|
|
34
|
-
if (stat.isDirectory()) {
|
|
35
|
-
if (SKIP_DIRS.has(entry))
|
|
36
|
-
continue;
|
|
37
|
-
results.push(...collectMdFiles(full, base));
|
|
38
|
-
}
|
|
39
|
-
else if (stat.isFile() && extname(entry) === '.md' && !entry.startsWith('._')) {
|
|
40
|
-
results.push(full);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
return results;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Parse nested YAML list items (lines starting with `- `) under a parent key
|
|
47
|
-
* whose value was empty on its own line (e.g. `triggers:\n - pattern: ...`).
|
|
48
|
-
*
|
|
49
|
-
* Returns simple `string[]` when every item is a plain scalar, or
|
|
50
|
-
* `Record<string, string>[]` when items contain key-value pairs.
|
|
51
|
-
* Returns `null` when no list items were found (the caller falls through to
|
|
52
|
-
* existing flat-value handling).
|
|
53
|
-
*/
|
|
54
|
-
function parseNestedYamlList(lines, startIdx, parentIndent) {
|
|
55
|
-
const objects = [];
|
|
56
|
-
const simpleItems = [];
|
|
57
|
-
let current = null;
|
|
58
|
-
let consumed = 0;
|
|
59
|
-
let hasObjects = false;
|
|
60
|
-
for (let i = startIdx; i < lines.length; i++) {
|
|
61
|
-
const line = lines[i];
|
|
62
|
-
const trimmed = line.trim();
|
|
63
|
-
// Skip blank lines and comments within the nested block
|
|
64
|
-
if (!trimmed || trimmed.startsWith('#')) {
|
|
65
|
-
consumed++;
|
|
66
|
-
continue;
|
|
67
|
-
}
|
|
68
|
-
const indent = line.length - line.trimStart().length;
|
|
69
|
-
// Stop when we return to the parent indent level or shallower
|
|
70
|
-
if (indent <= parentIndent)
|
|
71
|
-
break;
|
|
72
|
-
if (trimmed.startsWith('- ')) {
|
|
73
|
-
const itemContent = trimmed.slice(2);
|
|
74
|
-
const colonSpaceIdx = itemContent.indexOf(': ');
|
|
75
|
-
if (colonSpaceIdx !== -1) {
|
|
76
|
-
// Object list item: `- key: value`
|
|
77
|
-
hasObjects = true;
|
|
78
|
-
current = {};
|
|
79
|
-
const k = itemContent.slice(0, colonSpaceIdx).trim();
|
|
80
|
-
let v = itemContent.slice(colonSpaceIdx + 2).trim();
|
|
81
|
-
if ((v.startsWith('"') && v.endsWith('"')) || (v.startsWith("'") && v.endsWith("'"))) {
|
|
82
|
-
v = v.slice(1, -1);
|
|
83
|
-
}
|
|
84
|
-
current[k] = v;
|
|
85
|
-
objects.push(current);
|
|
86
|
-
}
|
|
87
|
-
else {
|
|
88
|
-
// Simple string item: `- value`
|
|
89
|
-
let v = itemContent.trim();
|
|
90
|
-
if ((v.startsWith('"') && v.endsWith('"')) || (v.startsWith("'") && v.endsWith("'"))) {
|
|
91
|
-
v = v.slice(1, -1);
|
|
92
|
-
}
|
|
93
|
-
simpleItems.push(v);
|
|
94
|
-
}
|
|
95
|
-
consumed++;
|
|
96
|
-
}
|
|
97
|
-
else if (current && hasObjects) {
|
|
98
|
-
// Continuation line for the current object item: `key: value`
|
|
99
|
-
const colonSpaceIdx = trimmed.indexOf(': ');
|
|
100
|
-
if (colonSpaceIdx !== -1) {
|
|
101
|
-
const k = trimmed.slice(0, colonSpaceIdx).trim();
|
|
102
|
-
let v = trimmed.slice(colonSpaceIdx + 2).trim();
|
|
103
|
-
if ((v.startsWith('"') && v.endsWith('"')) || (v.startsWith("'") && v.endsWith("'"))) {
|
|
104
|
-
v = v.slice(1, -1);
|
|
105
|
-
}
|
|
106
|
-
current[k] = v;
|
|
107
|
-
}
|
|
108
|
-
consumed++;
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
// Non-list indented content (e.g. nested key-value block) — stop
|
|
112
|
-
break;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
if (hasObjects && objects.length > 0) {
|
|
116
|
-
return { value: objects, consumed };
|
|
117
|
-
}
|
|
118
|
-
if (simpleItems.length > 0) {
|
|
119
|
-
return { value: simpleItems, consumed };
|
|
120
|
-
}
|
|
121
|
-
return { value: null, consumed };
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Parse YAML frontmatter from markdown content using simple regex.
|
|
125
|
-
* Returns key-value pairs from the `---` delimited block.
|
|
126
|
-
*/
|
|
127
|
-
function parseFrontmatter(content) {
|
|
128
|
-
const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
129
|
-
if (!match)
|
|
130
|
-
return {};
|
|
131
|
-
const block = match[1];
|
|
132
|
-
const result = {};
|
|
133
|
-
const lines = block.split('\n');
|
|
134
|
-
for (let i = 0; i < lines.length; i++) {
|
|
135
|
-
const line = lines[i];
|
|
136
|
-
const trimmed = line.trim();
|
|
137
|
-
if (!trimmed || trimmed.startsWith('#'))
|
|
138
|
-
continue;
|
|
139
|
-
const colonIdx = trimmed.indexOf(':');
|
|
140
|
-
if (colonIdx === -1)
|
|
141
|
-
continue;
|
|
142
|
-
const key = trimmed.slice(0, colonIdx).trim();
|
|
143
|
-
let value = trimmed.slice(colonIdx + 1).trim();
|
|
144
|
-
// Block scalar (`description: |` or `>-`): the more-indented lines below are the value
|
|
145
|
-
const blockScalar = /^([|>])[+-]?$/.exec(value);
|
|
146
|
-
if (blockScalar) {
|
|
147
|
-
const parentIndent = line.length - line.trimStart().length;
|
|
148
|
-
const body = [];
|
|
149
|
-
while (i + 1 < lines.length) {
|
|
150
|
-
const next = lines[i + 1];
|
|
151
|
-
if (next.trim() && next.length - next.trimStart().length <= parentIndent)
|
|
152
|
-
break;
|
|
153
|
-
body.push(next.trim());
|
|
154
|
-
i++;
|
|
155
|
-
}
|
|
156
|
-
result[key] = body.join(blockScalar[1] === '|' ? '\n' : ' ').trim();
|
|
157
|
-
continue;
|
|
158
|
-
}
|
|
159
|
-
// When the value is empty, look ahead for nested YAML list items
|
|
160
|
-
if (value === '') {
|
|
161
|
-
const parentIndent = line.length - line.trimStart().length;
|
|
162
|
-
const nested = parseNestedYamlList(lines, i + 1, parentIndent);
|
|
163
|
-
if (nested.value !== null) {
|
|
164
|
-
result[key] = nested.value;
|
|
165
|
-
i += nested.consumed;
|
|
166
|
-
continue;
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
// Handle YAML arrays written as "[a, b, c]"
|
|
170
|
-
if (typeof value === 'string' && value.startsWith('[') && value.endsWith(']')) {
|
|
171
|
-
value = value
|
|
172
|
-
.slice(1, -1)
|
|
173
|
-
.split(',')
|
|
174
|
-
.map((s) => s.trim().replace(/^["']|["']$/g, ''))
|
|
175
|
-
.filter(Boolean);
|
|
176
|
-
}
|
|
177
|
-
// Handle booleans
|
|
178
|
-
else if (value === 'true')
|
|
179
|
-
value = true;
|
|
180
|
-
else if (value === 'false')
|
|
181
|
-
value = false;
|
|
182
|
-
// Handle quoted strings
|
|
183
|
-
else if (typeof value === 'string' &&
|
|
184
|
-
((value.startsWith('"') && value.endsWith('"')) ||
|
|
185
|
-
(value.startsWith("'") && value.endsWith("'")))) {
|
|
186
|
-
value = value.slice(1, -1);
|
|
187
|
-
}
|
|
188
|
-
result[key] = value;
|
|
189
|
-
}
|
|
190
|
-
return result;
|
|
191
|
-
}
|
|
192
|
-
/** Coerce a value into a string array. */
|
|
193
|
-
function toStringArray(val) {
|
|
194
|
-
if (Array.isArray(val))
|
|
195
|
-
return val.map(String);
|
|
196
|
-
if (typeof val === 'string' && val.length > 0)
|
|
197
|
-
return [val];
|
|
198
|
-
return [];
|
|
199
|
-
}
|
|
200
|
-
/** Parse trigger patterns from frontmatter value. */
|
|
201
|
-
function parseTriggers(val) {
|
|
202
|
-
if (!val)
|
|
203
|
-
return [];
|
|
204
|
-
const arr = Array.isArray(val) ? val : [val];
|
|
205
|
-
return arr.map((t) => {
|
|
206
|
-
if (typeof t === 'object' && t !== null && 'pattern' in t) {
|
|
207
|
-
return {
|
|
208
|
-
pattern: String(t.pattern),
|
|
209
|
-
mode: String(t.mode ?? 'glob'),
|
|
210
|
-
};
|
|
211
|
-
}
|
|
212
|
-
return { pattern: String(t), mode: 'glob' };
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
/**
|
|
216
|
-
* Derive a slug from a filename: remove extension, lowercase, replace spaces with hyphens.
|
|
217
|
-
*/
|
|
218
|
-
function slugFromFilename(filename) {
|
|
219
|
-
return basename(filename, extname(filename))
|
|
220
|
-
.toLowerCase()
|
|
221
|
-
.replace(/\s+/g, '-')
|
|
222
|
-
.replace(/[^a-z0-9-]/g, '');
|
|
223
|
-
}
|
|
224
|
-
/**
|
|
225
|
-
* Derive category from the parent directory name relative to agents root.
|
|
226
|
-
*/
|
|
227
|
-
function categoryFromPath(filePath, agentsRoot) {
|
|
228
|
-
const rel = relative(agentsRoot, filePath);
|
|
229
|
-
const parts = rel.split('/');
|
|
230
|
-
return parts.length > 1 ? parts[0] : 'default';
|
|
9
|
+
import { existsSync } from 'node:fs';
|
|
10
|
+
import { createRequire } from 'node:module';
|
|
11
|
+
import { dirname, join } from 'node:path';
|
|
12
|
+
import { fileURLToPath } from 'node:url';
|
|
13
|
+
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
14
|
+
/** src/agents → ../.. is the package root; dist/src/agents → ../../.. */
|
|
15
|
+
const HELPER_CANDIDATES = [
|
|
16
|
+
join(HERE, '..', '..', '.claude', 'helpers', 'agent-registry.cjs'),
|
|
17
|
+
join(HERE, '..', '..', '..', '.claude', 'helpers', 'agent-registry.cjs'),
|
|
18
|
+
];
|
|
19
|
+
let loaded;
|
|
20
|
+
/** The shared CommonJS implementation; throws on an install without it. */
|
|
21
|
+
export function agentRegistryModule() {
|
|
22
|
+
if (loaded)
|
|
23
|
+
return loaded;
|
|
24
|
+
const file = HELPER_CANDIDATES.find((p) => existsSync(p));
|
|
25
|
+
if (!file)
|
|
26
|
+
throw new Error('agent-registry.cjs not found in the monomind package');
|
|
27
|
+
loaded = createRequire(import.meta.url)(file);
|
|
28
|
+
return loaded;
|
|
231
29
|
}
|
|
30
|
+
/** `~/.claude/agents` — how user agents' filePaths are recorded. */
|
|
31
|
+
export const USER_AGENTS_LABEL = '~/.claude/agents';
|
|
232
32
|
/**
|
|
233
33
|
* Build the agent registry by scanning `.md` files under `agentsRoot`.
|
|
234
34
|
*
|
|
235
|
-
* @param agentsRoot - Root directory
|
|
35
|
+
* @param agentsRoot - Root directory to scan.
|
|
236
36
|
* @param outputPath - Optional path to write the registry JSON file.
|
|
237
37
|
* @returns The built AgentRegistry object.
|
|
238
38
|
*/
|
|
@@ -240,122 +40,27 @@ export function buildRegistry(agentsRoot, outputPath) {
|
|
|
240
40
|
return buildUnifiedRegistry([agentsRoot], outputPath);
|
|
241
41
|
}
|
|
242
42
|
/**
|
|
243
|
-
*
|
|
244
|
-
*
|
|
245
|
-
*
|
|
246
|
-
*
|
|
43
|
+
* The ordered agent-definition roots for `cwd`: extras (canonical, from
|
|
44
|
+
* MONOMIND_EXTRA_AGENT_PATHS or a sibling `agency-agents` dir), the project's
|
|
45
|
+
* `.claude/agents`, then the user's `~/.claude/agents` (`opts.user: false`
|
|
46
|
+
* leaves it out, `opts.home` overrides the home directory). Shared by CLI
|
|
47
|
+
* startup, pick and `monomind doctor` so all build the registry the same way.
|
|
247
48
|
*/
|
|
248
|
-
export function computeAgentRoots(cwd) {
|
|
249
|
-
|
|
250
|
-
const extraPaths = process.env.MONOMIND_EXTRA_AGENT_PATHS
|
|
251
|
-
? process.env.MONOMIND_EXTRA_AGENT_PATHS.split(':').filter(Boolean)
|
|
252
|
-
: [];
|
|
253
|
-
const siblingExtraPath = join(cwd, '..', 'agency-agents');
|
|
254
|
-
if (extraPaths.length === 0) {
|
|
255
|
-
try {
|
|
256
|
-
if (statSync(siblingExtraPath).isDirectory())
|
|
257
|
-
extraPaths.push(siblingExtraPath);
|
|
258
|
-
}
|
|
259
|
-
catch {
|
|
260
|
-
/* sibling path doesn't exist */
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
return [...extraPaths, devAgentsRoot];
|
|
49
|
+
export function computeAgentRoots(cwd, opts) {
|
|
50
|
+
return agentRegistryModule().computeAgentRoots(cwd, opts);
|
|
264
51
|
}
|
|
265
52
|
/**
|
|
266
|
-
* Build a unified agent registry from multiple
|
|
267
|
-
*
|
|
268
|
-
*
|
|
269
|
-
*
|
|
270
|
-
* Typical usage — extras (agency-agents) listed first so they take precedence
|
|
271
|
-
* over any locally duplicated copies in `.claude/agents/`:
|
|
53
|
+
* Build a unified agent registry from multiple roots, deduplicating by slug:
|
|
54
|
+
* the first root in the array wins (a plain path counts as a project root).
|
|
55
|
+
* A `user` agent also loses to an earlier agent with the same frontmatter
|
|
56
|
+
* `name` — Claude Code gives project agents precedence over user agents.
|
|
272
57
|
*
|
|
273
|
-
*
|
|
274
|
-
* buildUnifiedRegistry([
|
|
275
|
-
* '/path/to/agency-agents', // canonical source — wins on conflict
|
|
276
|
-
* '.claude/agents', // dev copies — used only for unique slugs
|
|
277
|
-
* ], '.monomind/registry.json');
|
|
278
|
-
* ```
|
|
279
|
-
*
|
|
280
|
-
* @param roots - Ordered list of directories to scan (first-wins on slug conflict).
|
|
58
|
+
* @param roots - Ordered list of roots to scan (first-wins on slug conflict).
|
|
281
59
|
* @param outputPath - Optional path to write the merged registry JSON file.
|
|
282
60
|
* @returns The deduplicated AgentRegistry.
|
|
283
61
|
*/
|
|
284
62
|
export function buildUnifiedRegistry(roots, outputPath, opts = {}) {
|
|
285
|
-
|
|
286
|
-
const base = opts.base ?? process.cwd();
|
|
287
|
-
/** Slug → first-seen entry (first root wins). */
|
|
288
|
-
const seen = new Map();
|
|
289
|
-
const dupes = new Map();
|
|
290
|
-
for (const root of roots) {
|
|
291
|
-
const files = collectMdFiles(root);
|
|
292
|
-
for (const file of files) {
|
|
293
|
-
let content;
|
|
294
|
-
try {
|
|
295
|
-
if (statSync(file).size > 512 * 1024)
|
|
296
|
-
continue; // skip files > 512 KB
|
|
297
|
-
content = readFileSync(file, 'utf-8');
|
|
298
|
-
}
|
|
299
|
-
catch {
|
|
300
|
-
continue;
|
|
301
|
-
}
|
|
302
|
-
const fm = parseFrontmatter(content);
|
|
303
|
-
const slug = (typeof fm.slug === 'string' ? fm.slug : undefined) || slugFromFilename(file);
|
|
304
|
-
const filePath = isAbsolute(file) ? relative(base, file) : file;
|
|
305
|
-
// Duplicates: first root wins, and the loser is recorded (doctor warns)
|
|
306
|
-
const prior = seen.get(slug);
|
|
307
|
-
if (prior) {
|
|
308
|
-
const d = dupes.get(slug) ?? { slug, kept: prior.filePath, dropped: [] };
|
|
309
|
-
d.dropped.push(filePath);
|
|
310
|
-
dupes.set(slug, d);
|
|
311
|
-
continue;
|
|
312
|
-
}
|
|
313
|
-
const str = (v) => (typeof v === 'string' ? v : undefined);
|
|
314
|
-
seen.set(slug, {
|
|
315
|
-
slug,
|
|
316
|
-
name: (typeof fm.name === 'string' ? fm.name : undefined) || slug,
|
|
317
|
-
version: (typeof fm.version === 'string' ? fm.version : undefined) || '0.0.0',
|
|
318
|
-
category: (typeof fm.category === 'string' ? fm.category : undefined) ||
|
|
319
|
-
categoryFromPath(file, root),
|
|
320
|
-
description: typeof fm.description === 'string' ? fm.description : '',
|
|
321
|
-
whenToUse: str(fm.when_to_use ?? fm.whenToUse),
|
|
322
|
-
tags: toStringArray(fm.tags),
|
|
323
|
-
vibe: str(fm.vibe),
|
|
324
|
-
// A `capability:` block is read flattened, so its `expertise:` list lands top-level
|
|
325
|
-
capabilities: toStringArray(fm.capabilities ?? fm.expertise),
|
|
326
|
-
taskTypes: toStringArray(fm.taskTypes ?? fm['task-types'] ?? fm.task_types),
|
|
327
|
-
tools: toStringArray(fm.tools),
|
|
328
|
-
triggers: parseTriggers(fm.triggers),
|
|
329
|
-
deprecated: fm.deprecated === true,
|
|
330
|
-
deprecatedBy: typeof fm.deprecatedBy === 'string' ? fm.deprecatedBy : undefined,
|
|
331
|
-
dependencies: toStringArray(fm.dependencies),
|
|
332
|
-
filePath,
|
|
333
|
-
registeredAt: now,
|
|
334
|
-
lastUpdated: now,
|
|
335
|
-
});
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
const agents = Array.from(seen.values());
|
|
339
|
-
const registry = {
|
|
340
|
-
version: '1.0.0',
|
|
341
|
-
generatedAt: now,
|
|
342
|
-
totalAgents: agents.length,
|
|
343
|
-
agents,
|
|
344
|
-
duplicates: [...dupes.values()],
|
|
345
|
-
};
|
|
346
|
-
if (outputPath)
|
|
347
|
-
writeRegistryFile(outputPath, registry);
|
|
348
|
-
return registry;
|
|
349
|
-
}
|
|
350
|
-
/** Agents already recorded in a registry file; 0 when missing or unreadable. */
|
|
351
|
-
function agentCountOnDisk(file) {
|
|
352
|
-
try {
|
|
353
|
-
const reg = JSON.parse(readFileSync(file, 'utf-8'));
|
|
354
|
-
return Array.isArray(reg.agents) ? reg.agents.length : 0;
|
|
355
|
-
}
|
|
356
|
-
catch {
|
|
357
|
-
return 0;
|
|
358
|
-
}
|
|
63
|
+
return agentRegistryModule().buildUnifiedRegistry(roots, outputPath, opts);
|
|
359
64
|
}
|
|
360
65
|
/**
|
|
361
66
|
* Atomically writes `registry` to `file` — except an empty registry never
|
|
@@ -363,11 +68,6 @@ function agentCountOnDisk(file) {
|
|
|
363
68
|
* not wipe the project's catalog). Returns whether the file was written.
|
|
364
69
|
*/
|
|
365
70
|
export function writeRegistryFile(file, registry) {
|
|
366
|
-
|
|
367
|
-
return false;
|
|
368
|
-
const tmp = `${file}.${process.pid}.tmp`;
|
|
369
|
-
writeFileSync(tmp, JSON.stringify(registry, null, 2), 'utf-8');
|
|
370
|
-
renameSync(tmp, file);
|
|
371
|
-
return true;
|
|
71
|
+
return agentRegistryModule().writeRegistryFile(file, registry);
|
|
372
72
|
}
|
|
373
73
|
//# sourceMappingURL=registry-builder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry-builder.js","sourceRoot":"","sources":["../../../src/agents/registry-builder.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"registry-builder.js","sourceRoot":"","sources":["../../../src/agents/registry-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAmEzC,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACrD,yEAAyE;AACzE,MAAM,iBAAiB,GAAG;IACxB,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,oBAAoB,CAAC;IAClE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,oBAAoB,CAAC;CACzE,CAAC;AAEF,IAAI,MAAuC,CAAC;AAE5C,2EAA2E;AAC3E,MAAM,UAAU,mBAAmB;IACjC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IACnF,MAAM,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAwB,CAAC;IACrE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,oEAAoE;AACpE,MAAM,CAAC,MAAM,iBAAiB,GAAG,kBAAkB,CAAC;AAEpD;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,UAAkB,EAAE,UAAmB;IACnE,OAAO,oBAAoB,CAAC,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC;AACxD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAW,EAAE,IAAuB;IACpE,OAAO,mBAAmB,EAAE,CAAC,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAC5D,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAA6B,EAC7B,UAAmB,EACnB,IAAI,GAAsB,EAAE;IAE5B,OAAO,mBAAmB,EAAE,CAAC,oBAAoB,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;AAC7E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,QAAuB;IACrE,OAAO,mBAAmB,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACjE,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type AgentRegistry } from './registry-builder.js';
|
|
1
|
+
import { type AgentRegistry, type AgentRoot, type AgentRootOptions } from './registry-builder.js';
|
|
2
2
|
/**
|
|
3
3
|
* The nearest directory at or above `cwd` holding `.claude/agents` or
|
|
4
4
|
* `.monomind`. The walk stops at the git root (inclusive) and never looks at
|
|
@@ -8,14 +8,14 @@ import { type AgentRegistry } from './registry-builder.js';
|
|
|
8
8
|
export declare function findProjectRoot(cwd: string, home?: string): string | null;
|
|
9
9
|
/** Newest mtime (ms) of any agent `.md` under `roots` (directories count too,
|
|
10
10
|
* so a deleted file also marks the registry stale). 0 when there are none. */
|
|
11
|
-
export declare function newestAgentMtime(roots: string[]): number;
|
|
11
|
+
export declare function newestAgentMtime(roots: (string | AgentRoot)[]): number;
|
|
12
12
|
export declare const registryPath: (root: string) => string;
|
|
13
13
|
/** True when `root`'s registry is missing or older than an agent definition. */
|
|
14
|
-
export declare function registryIsStale(root: string): boolean;
|
|
14
|
+
export declare function registryIsStale(root: string, opts?: AgentRootOptions): boolean;
|
|
15
15
|
/**
|
|
16
16
|
* Rebuilds `root`'s registry when stale, synchronously, so a caller that reads
|
|
17
17
|
* it next (`monomind pick`, MCP pick) never races a fire-and-forget build.
|
|
18
18
|
* Returns the built registry, or null when it was already fresh. Never throws.
|
|
19
19
|
*/
|
|
20
|
-
export declare function ensureRegistry(root: string): AgentRegistry | null;
|
|
20
|
+
export declare function ensureRegistry(root: string, opts?: AgentRootOptions): AgentRegistry | null;
|
|
21
21
|
//# sourceMappingURL=registry-freshness.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry-freshness.d.ts","sourceRoot":"","sources":["../../../src/agents/registry-freshness.ts"],"names":[],"mappings":"AAWA,OAAO,
|
|
1
|
+
{"version":3,"file":"registry-freshness.d.ts","sourceRoot":"","sources":["../../../src/agents/registry-freshness.ts"],"names":[],"mappings":"AAWA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,gBAAgB,EAEtB,MAAM,uBAAuB,CAAC;AAE/B;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,MAAkB,GAAG,MAAM,GAAG,IAAI,CAEpF;AAED;+EAC+E;AAC/E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,GAAG,MAAM,CAEtE;AAED,eAAO,MAAM,YAAY,SAAU,MAAM,KAAG,MAAkD,CAAC;AAE/F,gFAAgF;AAChF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAE9E;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,aAAa,GAAG,IAAI,CAM1F"}
|
|
@@ -4,12 +4,12 @@
|
|
|
4
4
|
* `.monomind/registry.json` belongs to the PROJECT, not to whatever directory
|
|
5
5
|
* the CLI happens to run in: `findProjectRoot` walks up from cwd, and
|
|
6
6
|
* `ensureRegistry` rebuilds synchronously only when the file is missing or
|
|
7
|
-
* older than the newest agent definition
|
|
7
|
+
* older than the newest agent definition — project, user (~/.claude/agents)
|
|
8
|
+
* or extra — an mtime scan, no parsing. Implemented in
|
|
9
|
+
* .claude/helpers/agent-registry.cjs, which the SessionStart hook shares.
|
|
8
10
|
*/
|
|
9
|
-
import { existsSync, mkdirSync, readdirSync, statSync } from 'node:fs';
|
|
10
11
|
import { homedir } from 'node:os';
|
|
11
|
-
import {
|
|
12
|
-
import { buildUnifiedRegistry, computeAgentRoots } from './registry-builder.js';
|
|
12
|
+
import { agentRegistryModule, } from './registry-builder.js';
|
|
13
13
|
/**
|
|
14
14
|
* The nearest directory at or above `cwd` holding `.claude/agents` or
|
|
15
15
|
* `.monomind`. The walk stops at the git root (inclusive) and never looks at
|
|
@@ -17,75 +17,26 @@ import { buildUnifiedRegistry, computeAgentRoots } from './registry-builder.js';
|
|
|
17
17
|
* not a project. Null when no project is found.
|
|
18
18
|
*/
|
|
19
19
|
export function findProjectRoot(cwd, home = homedir()) {
|
|
20
|
-
|
|
21
|
-
let dir = resolve(cwd);
|
|
22
|
-
for (;;) {
|
|
23
|
-
if (dir === stopAt)
|
|
24
|
-
return null;
|
|
25
|
-
if (existsSync(join(dir, '.claude', 'agents')) || existsSync(join(dir, '.monomind')))
|
|
26
|
-
return dir;
|
|
27
|
-
if (existsSync(join(dir, '.git')))
|
|
28
|
-
return null;
|
|
29
|
-
const parent = dirname(dir);
|
|
30
|
-
if (parent === dir)
|
|
31
|
-
return null;
|
|
32
|
-
dir = parent;
|
|
33
|
-
}
|
|
20
|
+
return agentRegistryModule().findProjectRoot(cwd, home);
|
|
34
21
|
}
|
|
35
22
|
/** Newest mtime (ms) of any agent `.md` under `roots` (directories count too,
|
|
36
23
|
* so a deleted file also marks the registry stale). 0 when there are none. */
|
|
37
24
|
export function newestAgentMtime(roots) {
|
|
38
|
-
|
|
39
|
-
const walk = (dir) => {
|
|
40
|
-
let entries;
|
|
41
|
-
try {
|
|
42
|
-
newest = Math.max(newest, statSync(dir).mtimeMs);
|
|
43
|
-
entries = readdirSync(dir, { withFileTypes: true });
|
|
44
|
-
}
|
|
45
|
-
catch {
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
for (const e of entries) {
|
|
49
|
-
const full = join(dir, e.name);
|
|
50
|
-
if (e.isDirectory())
|
|
51
|
-
walk(full);
|
|
52
|
-
else if (e.isFile() && extname(e.name) === '.md') {
|
|
53
|
-
try {
|
|
54
|
-
newest = Math.max(newest, statSync(full).mtimeMs);
|
|
55
|
-
}
|
|
56
|
-
catch {
|
|
57
|
-
/* vanished mid-scan */
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
};
|
|
62
|
-
for (const root of roots)
|
|
63
|
-
walk(root);
|
|
64
|
-
return newest;
|
|
25
|
+
return agentRegistryModule().newestAgentMtime(roots);
|
|
65
26
|
}
|
|
66
|
-
export const registryPath = (root) =>
|
|
27
|
+
export const registryPath = (root) => agentRegistryModule().registryPath(root);
|
|
67
28
|
/** True when `root`'s registry is missing or older than an agent definition. */
|
|
68
|
-
export function registryIsStale(root) {
|
|
69
|
-
|
|
70
|
-
try {
|
|
71
|
-
at = statSync(registryPath(root)).mtimeMs;
|
|
72
|
-
}
|
|
73
|
-
catch {
|
|
74
|
-
return true;
|
|
75
|
-
}
|
|
76
|
-
return newestAgentMtime(computeAgentRoots(root)) > at;
|
|
29
|
+
export function registryIsStale(root, opts) {
|
|
30
|
+
return agentRegistryModule().isStale(root, opts);
|
|
77
31
|
}
|
|
78
32
|
/**
|
|
79
33
|
* Rebuilds `root`'s registry when stale, synchronously, so a caller that reads
|
|
80
34
|
* it next (`monomind pick`, MCP pick) never races a fire-and-forget build.
|
|
81
35
|
* Returns the built registry, or null when it was already fresh. Never throws.
|
|
82
36
|
*/
|
|
83
|
-
export function ensureRegistry(root) {
|
|
37
|
+
export function ensureRegistry(root, opts) {
|
|
84
38
|
try {
|
|
85
|
-
|
|
86
|
-
return null;
|
|
87
|
-
mkdirSync(join(root, '.monomind'), { recursive: true });
|
|
88
|
-
return buildUnifiedRegistry(computeAgentRoots(root), registryPath(root), { base: root });
|
|
39
|
+
return agentRegistryModule().ensure(root, opts);
|
|
89
40
|
}
|
|
90
41
|
catch {
|
|
91
42
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry-freshness.js","sourceRoot":"","sources":["../../../src/agents/registry-freshness.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"registry-freshness.js","sourceRoot":"","sources":["../../../src/agents/registry-freshness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAIL,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAE/B;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,IAAI,GAAW,OAAO,EAAE;IACnE,OAAO,mBAAmB,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAC1D,CAAC;AAED;+EAC+E;AAC/E,MAAM,UAAU,gBAAgB,CAAC,KAA6B;IAC5D,OAAO,mBAAmB,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,mBAAmB,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AAE/F,gFAAgF;AAChF,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,IAAuB;IACnE,OAAO,mBAAmB,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACnD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,IAAuB;IAClE,IAAI,CAAC;QACH,OAAO,mBAAmB,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doc.d.ts","sourceRoot":"","sources":["../../../src/commands/doc.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAiC,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"doc.d.ts","sourceRoot":"","sources":["../../../src/commands/doc.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAiC,MAAM,aAAa,CAAC;AA2wB1E,eAAO,MAAM,UAAU,EAAE,OAyDxB,CAAC;eAEa,UAAU"}
|
package/dist/src/commands/doc.js
CHANGED
|
@@ -25,9 +25,8 @@ const ingestCommand = {
|
|
|
25
25
|
},
|
|
26
26
|
{
|
|
27
27
|
name: 'embedder',
|
|
28
|
-
description: '
|
|
28
|
+
description: 'Deprecated, has no effect: the knowledge base always embeds with Alibaba-NLP/gte-modernbert-base (768d), so every stored and searched vector shares one model. "minilm" (the legacy default) means that same model; any other value is ignored with a warning',
|
|
29
29
|
type: 'string',
|
|
30
|
-
default: 'minilm',
|
|
31
30
|
},
|
|
32
31
|
],
|
|
33
32
|
examples: [
|
|
@@ -37,24 +36,16 @@ const ingestCommand = {
|
|
|
37
36
|
description: 'Ingest into the global brain (auto-detected for paths outside the project)',
|
|
38
37
|
},
|
|
39
38
|
{ command: 'monomind doc ingest report.pdf', description: 'Ingest a single file' },
|
|
40
|
-
{
|
|
41
|
-
command: 'monomind doc ingest ./docs --embedder bge-m3',
|
|
42
|
-
description: 'Ingest using BGE-M3 (higher quality, larger model)',
|
|
43
|
-
},
|
|
44
39
|
],
|
|
45
40
|
action: async (ctx) => {
|
|
46
41
|
const target = ctx.args[0] || '.';
|
|
47
|
-
//
|
|
42
|
+
// --embedder is kept only so existing scripts don't break. Chunks are stored
|
|
43
|
+
// through the memory bridge, which always embeds with its own model; an
|
|
44
|
+
// override here never reached it (it only swapped embedding-operations'
|
|
45
|
+
// model), and a different-dimension model could not share the 768d store.
|
|
48
46
|
const embedder = ctx.flags.embedder;
|
|
49
47
|
if (embedder && embedder !== 'minilm') {
|
|
50
|
-
|
|
51
|
-
try {
|
|
52
|
-
setEmbedderOverride(embedder);
|
|
53
|
-
output.writeln(output.dim(` Using embedder: ${embedder}`));
|
|
54
|
-
}
|
|
55
|
-
catch (_e) {
|
|
56
|
-
output.printWarning(`Unknown embedder '${embedder}'. Available: minilm, bge-m3. Using default.`);
|
|
57
|
-
}
|
|
48
|
+
output.printWarning(`--embedder ${embedder} is ignored: documents are always embedded with Alibaba-NLP/gte-modernbert-base (768d).`);
|
|
58
49
|
}
|
|
59
50
|
const { ingestDocument, ingestDirectory } = await import('../knowledge/document-pipeline.js');
|
|
60
51
|
const fs = await import('node:fs');
|