@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.
Files changed (134) hide show
  1. package/.claude/commands/mastermind/createorg.md +2 -2
  2. package/.claude/commands/mastermind/help.md +5 -11
  3. package/.claude/commands/mastermind/master.md +1 -2
  4. package/.claude/commands/mastermind/orgs.md +1 -1
  5. package/.claude/commands/mastermind/orgstatus.md +1 -1
  6. package/.claude/commands/mastermind/runorg.md +2 -2
  7. package/.claude/commands/mastermind/stoporg.md +7 -11
  8. package/.claude/helpers/agent-registry.cjs +434 -0
  9. package/.claude/helpers/handlers/pick-core.cjs +20 -2
  10. package/.claude/helpers/handlers/session-restore-handler.cjs +4 -1
  11. package/.claude/helpers/jev-catalog.cjs +7 -3
  12. package/.claude/helpers/jev-picker.cjs +3 -1
  13. package/.claude/helpers/pick-rank.cjs +90 -4
  14. package/.claude/skills/mastermind-agents/SKILL.md +31 -38
  15. package/.claude/skills/mastermind-createorg/SKILL.md +3 -3
  16. package/.claude/skills/mastermind-env/SKILL.md +4 -18
  17. package/.claude/skills/mastermind-inbox/SKILL.md +31 -52
  18. package/.claude/skills/mastermind-instance/SKILL.md +7 -5
  19. package/.claude/skills/mastermind-new-agent/SKILL.md +3 -3
  20. package/.claude/skills/mastermind-org-settings/SKILL.md +3 -4
  21. package/.claude/skills/mastermind-orgs/SKILL.md +26 -32
  22. package/.claude/skills/mastermind-orgstatus/SKILL.md +49 -140
  23. package/.claude/skills/mastermind-runorg/SKILL.md +13 -13
  24. package/.claude/skills/mastermind-stoporg/SKILL.md +7 -62
  25. package/.claude/skills/mastermind-tasks/SKILL.md +6 -8
  26. package/README.md +28 -43
  27. package/dist/src/agents/registry-builder.d.ts +57 -21
  28. package/dist/src/agents/registry-builder.d.ts.map +1 -1
  29. package/dist/src/agents/registry-builder.js +41 -341
  30. package/dist/src/agents/registry-builder.js.map +1 -1
  31. package/dist/src/agents/registry-freshness.d.ts +4 -4
  32. package/dist/src/agents/registry-freshness.d.ts.map +1 -1
  33. package/dist/src/agents/registry-freshness.js +11 -60
  34. package/dist/src/agents/registry-freshness.js.map +1 -1
  35. package/dist/src/commands/doc.d.ts.map +1 -1
  36. package/dist/src/commands/doc.js +6 -15
  37. package/dist/src/commands/doc.js.map +1 -1
  38. package/dist/src/commands/doctor-pick-checks.d.ts.map +1 -1
  39. package/dist/src/commands/doctor-pick-checks.js +9 -41
  40. package/dist/src/commands/doctor-pick-checks.js.map +1 -1
  41. package/dist/src/commands/doctor-project-checks.d.ts.map +1 -1
  42. package/dist/src/commands/doctor-project-checks.js +7 -5
  43. package/dist/src/commands/doctor-project-checks.js.map +1 -1
  44. package/dist/src/commands/hooks-routing-commands.d.ts.map +1 -1
  45. package/dist/src/commands/hooks-routing-commands.js +4 -3
  46. package/dist/src/commands/hooks-routing-commands.js.map +1 -1
  47. package/dist/src/commands/init-upgrade.d.ts.map +1 -1
  48. package/dist/src/commands/init-upgrade.js +4 -0
  49. package/dist/src/commands/init-upgrade.js.map +1 -1
  50. package/dist/src/commands/init-wizard.d.ts.map +1 -1
  51. package/dist/src/commands/init-wizard.js +7 -2
  52. package/dist/src/commands/init-wizard.js.map +1 -1
  53. package/dist/src/commands/init.d.ts.map +1 -1
  54. package/dist/src/commands/init.js +16 -27
  55. package/dist/src/commands/init.js.map +1 -1
  56. package/dist/src/commands/monograph.d.ts.map +1 -1
  57. package/dist/src/commands/monograph.js +16 -21
  58. package/dist/src/commands/monograph.js.map +1 -1
  59. package/dist/src/commands/org.js +1 -1
  60. package/dist/src/commands/org.js.map +1 -1
  61. package/dist/src/decision/jev.d.ts +4 -0
  62. package/dist/src/decision/jev.d.ts.map +1 -1
  63. package/dist/src/decision/jev.js.map +1 -1
  64. package/dist/src/decision/pick-real.d.ts +93 -0
  65. package/dist/src/decision/pick-real.d.ts.map +1 -0
  66. package/dist/src/decision/pick-real.js +253 -0
  67. package/dist/src/decision/pick-real.js.map +1 -0
  68. package/dist/src/decision/picks.d.ts +1 -0
  69. package/dist/src/decision/picks.d.ts.map +1 -1
  70. package/dist/src/decision/picks.js +1 -0
  71. package/dist/src/decision/picks.js.map +1 -1
  72. package/dist/src/init/embeddings-step.d.ts +23 -0
  73. package/dist/src/init/embeddings-step.d.ts.map +1 -0
  74. package/dist/src/init/embeddings-step.js +53 -0
  75. package/dist/src/init/embeddings-step.js.map +1 -0
  76. package/dist/src/init/executor.d.ts.map +1 -1
  77. package/dist/src/init/executor.js +9 -1
  78. package/dist/src/init/executor.js.map +1 -1
  79. package/dist/src/init/helpers-generator.d.ts.map +1 -1
  80. package/dist/src/init/helpers-generator.js +4 -0
  81. package/dist/src/init/helpers-generator.js.map +1 -1
  82. package/dist/src/init/project-indexes.d.ts +19 -0
  83. package/dist/src/init/project-indexes.d.ts.map +1 -0
  84. package/dist/src/init/project-indexes.js +44 -0
  85. package/dist/src/init/project-indexes.js.map +1 -0
  86. package/dist/src/init/shared.d.ts +7 -2
  87. package/dist/src/init/shared.d.ts.map +1 -1
  88. package/dist/src/init/shared.js +7 -6
  89. package/dist/src/init/shared.js.map +1 -1
  90. package/dist/src/init/types.d.ts +13 -2
  91. package/dist/src/init/types.d.ts.map +1 -1
  92. package/dist/src/init/types.js +11 -3
  93. package/dist/src/init/types.js.map +1 -1
  94. package/dist/src/init/upgrade.d.ts +3 -0
  95. package/dist/src/init/upgrade.d.ts.map +1 -1
  96. package/dist/src/init/upgrade.js +21 -6
  97. package/dist/src/init/upgrade.js.map +1 -1
  98. package/dist/src/init/write-antigravity.d.ts +1 -0
  99. package/dist/src/init/write-antigravity.d.ts.map +1 -1
  100. package/dist/src/init/write-antigravity.js +19 -1
  101. package/dist/src/init/write-antigravity.js.map +1 -1
  102. package/dist/src/init/write-claude.d.ts.map +1 -1
  103. package/dist/src/init/write-claude.js +8 -5
  104. package/dist/src/init/write-claude.js.map +1 -1
  105. package/dist/src/mcp-tools/embeddings-tools.d.ts.map +1 -1
  106. package/dist/src/mcp-tools/embeddings-tools.js +14 -5
  107. package/dist/src/mcp-tools/embeddings-tools.js.map +1 -1
  108. package/dist/src/mcp-tools/hooks-routing.d.ts.map +1 -1
  109. package/dist/src/mcp-tools/hooks-routing.js +4 -3
  110. package/dist/src/mcp-tools/hooks-routing.js.map +1 -1
  111. package/dist/src/mcp-tools/monograph/build-tools.d.ts.map +1 -1
  112. package/dist/src/mcp-tools/monograph/build-tools.js +16 -9
  113. package/dist/src/mcp-tools/monograph/build-tools.js.map +1 -1
  114. package/dist/src/memory/embedding-operations.d.ts +0 -4
  115. package/dist/src/memory/embedding-operations.d.ts.map +1 -1
  116. package/dist/src/memory/embedding-operations.js +11 -85
  117. package/dist/src/memory/embedding-operations.js.map +1 -1
  118. package/dist/src/memory/memory-bridge.d.ts +7 -0
  119. package/dist/src/memory/memory-bridge.d.ts.map +1 -1
  120. package/dist/src/memory/memory-bridge.js +15 -0
  121. package/dist/src/memory/memory-bridge.js.map +1 -1
  122. package/dist/src/orgrt/bash-timeout.d.ts +17 -0
  123. package/dist/src/orgrt/bash-timeout.d.ts.map +1 -1
  124. package/dist/src/orgrt/bash-timeout.js +15 -0
  125. package/dist/src/orgrt/bash-timeout.js.map +1 -1
  126. package/dist/src/orgrt/session.d.ts.map +1 -1
  127. package/dist/src/orgrt/session.js +5 -2
  128. package/dist/src/orgrt/session.js.map +1 -1
  129. package/dist/src/orgrt/task-match.d.ts +3 -1
  130. package/dist/src/orgrt/task-match.d.ts.map +1 -1
  131. package/dist/src/orgrt/task-match.js +12 -4
  132. package/dist/src/orgrt/task-match.js.map +1 -1
  133. package/dist/tsconfig.tsbuildinfo +1 -1
  134. 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
- * and produces a unified AgentRegistry JSON.
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 { readdirSync, readFileSync, renameSync, statSync, writeFileSync } from 'node:fs';
8
- import { basename, extname, isAbsolute, join, relative } from 'node:path';
9
- /** Directories to skip during recursive scan. `reengineer-squad` is a
10
- * repo-only squad the package does not ship (package.json `files`), and its
11
- * `tester` would shadow the core tester. */
12
- const SKIP_DIRS = new Set(['schemas', 'ephemeral', 'reengineer-squad']);
13
- /**
14
- * Recursively collect all `.md` files under `root`, skipping SKIP_DIRS.
15
- */
16
- function collectMdFiles(root, base = root) {
17
- const results = [];
18
- let entries;
19
- try {
20
- entries = readdirSync(root);
21
- }
22
- catch {
23
- return results;
24
- }
25
- for (const entry of entries) {
26
- const full = join(root, entry);
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 (or array of directories) to scan.
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
- * Compute the ordered list of agent-definition roots for `cwd`: extras
244
- * (canonical, from MONOMIND_EXTRA_AGENT_PATHS or a sibling `agency-agents`
245
- * dir) first, then the project's `.claude/agents`. Shared by CLI startup
246
- * and `monomind doctor` so both build the registry the same way.
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
- const devAgentsRoot = join(cwd, '.claude', 'agents');
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 root directories, deduplicating
267
- * by slug. When the same slug appears in more than one root, the entry from the
268
- * **first** root in the array wins (earlier roots are considered canonical).
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
- * ```ts
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
- const now = new Date().toISOString();
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
- if (registry.agents.length === 0 && agentCountOnDisk(file) > 0)
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,EAAE,KAAK,aAAa,EAA2C,MAAM,uBAAuB,CAAC;AAEpG;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,MAAkB,GAAG,MAAM,GAAG,IAAI,CAYpF;AAED;+EAC+E;AAC/E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAwBxD;AAED,eAAO,MAAM,YAAY,SAAU,MAAM,KAAG,MAAkD,CAAC;AAE/F,gFAAgF;AAChF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQrD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAQjE"}
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 (an mtime scan, no parsing).
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 { dirname, extname, join, resolve } from 'node:path';
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
- const stopAt = resolve(home);
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
- let newest = 0;
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) => join(root, '.monomind', 'registry.json');
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
- let at;
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
- if (!registryIsStale(root))
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":"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"}
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;AAmxB1E,eAAO,MAAM,UAAU,EAAE,OAyDxB,CAAC;eAEa,UAAU"}
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"}
@@ -25,9 +25,8 @@ const ingestCommand = {
25
25
  },
26
26
  {
27
27
  name: 'embedder',
28
- description: 'Embedding model for this ingest: minilm (default, 384d) or bge-m3 (1024d, 8192-token context, 100+ languages; ~600MB+ download on first use)',
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
- // P2-6: Wire embedder override before any embedding work happens.
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
- const { setEmbedderOverride } = await import('../memory/embedding-operations.js');
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');