moflo 4.8.40 → 4.8.42

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/bin/hooks.mjs CHANGED
@@ -27,7 +27,22 @@ import { createProcessManager } from './lib/process-manager.mjs';
27
27
 
28
28
  const __filename = fileURLToPath(import.meta.url);
29
29
  const __dirname = dirname(__filename);
30
- const projectRoot = resolve(__dirname, '../..');
30
+
31
+ // Detect project root by walking up from cwd to find package.json.
32
+ // IMPORTANT: Do NOT use resolve(__dirname, '..') or '../..' — this script lives
33
+ // in bin/ during development but gets synced to .claude/scripts/ in consumer
34
+ // projects, so __dirname-relative paths break. findProjectRoot() works everywhere.
35
+ function findProjectRoot() {
36
+ let dir = process.cwd();
37
+ const root = resolve(dir, '/');
38
+ while (dir !== root) {
39
+ if (existsSync(resolve(dir, 'package.json'))) return dir;
40
+ dir = dirname(dir);
41
+ }
42
+ return process.cwd();
43
+ }
44
+
45
+ const projectRoot = findProjectRoot();
31
46
  const logFile = resolve(projectRoot, '.swarm/hooks.log');
32
47
  const pm = createProcessManager(projectRoot);
33
48
 
package/bin/index-all.mjs CHANGED
@@ -15,7 +15,22 @@ import { fileURLToPath } from 'url';
15
15
  import { execFileSync } from 'child_process';
16
16
 
17
17
  const __dirname = dirname(fileURLToPath(import.meta.url));
18
- const projectRoot = resolve(__dirname, '..');
18
+
19
+ // Detect project root by walking up from cwd to find package.json.
20
+ // IMPORTANT: Do NOT use resolve(__dirname, '..') — this script lives in bin/
21
+ // during development but gets synced to .claude/scripts/ in consumer projects,
22
+ // so __dirname-relative paths break. findProjectRoot() works in both locations.
23
+ function findProjectRoot() {
24
+ let dir = process.cwd();
25
+ const root = resolve(dir, '/');
26
+ while (dir !== root) {
27
+ if (existsSync(resolve(dir, 'package.json'))) return dir;
28
+ dir = dirname(dir);
29
+ }
30
+ return process.cwd();
31
+ }
32
+
33
+ const projectRoot = findProjectRoot();
19
34
  const LOG_PATH = resolve(projectRoot, '.swarm/hooks.log');
20
35
 
21
36
  function log(msg) {
@@ -99,7 +114,7 @@ async function main() {
99
114
  if (isIndexEnabled('guidance')) {
100
115
  const guidanceScript = resolveBin('flo-index', 'index-guidance.mjs');
101
116
  if (guidanceScript) {
102
- runStep('guidance-index', 'node', [guidanceScript]);
117
+ runStep('guidance-index', 'node', [guidanceScript, '--no-embeddings']);
103
118
  } else {
104
119
  log('SKIP guidance-index (script not found)');
105
120
  }
@@ -111,7 +126,7 @@ async function main() {
111
126
  if (isIndexEnabled('code_map')) {
112
127
  const codeMapScript = resolveBin('flo-codemap', 'generate-code-map.mjs');
113
128
  if (codeMapScript) {
114
- runStep('code-map', 'node', [codeMapScript], 180_000);
129
+ runStep('code-map', 'node', [codeMapScript, '--no-embeddings'], 180_000);
115
130
  } else {
116
131
  log('SKIP code-map (script not found)');
117
132
  }
@@ -123,7 +138,7 @@ async function main() {
123
138
  if (isIndexEnabled('tests')) {
124
139
  const testScript = resolveBin('flo-testmap', 'index-tests.mjs');
125
140
  if (testScript) {
126
- runStep('test-index', 'node', [testScript]);
141
+ runStep('test-index', 'node', [testScript, '--no-embeddings']);
127
142
  } else {
128
143
  log('SKIP test-index (script not found)');
129
144
  }
@@ -151,7 +166,17 @@ async function main() {
151
166
  log('SKIP pretrain (CLI not found)');
152
167
  }
153
168
 
154
- // 6. HNSW rebuildMUST run last, after all writes are committed (#81)
169
+ // 6. Build embeddingssingle pass for ALL namespaces, after all indexers finish.
170
+ // Individual indexers are called with --no-embeddings to prevent background
171
+ // embedding spawns that race with this chain (sql.js last-write-wins).
172
+ const embeddingsScript = resolveBin('flo-embeddings', 'build-embeddings.mjs');
173
+ if (embeddingsScript) {
174
+ runStep('build-embeddings', 'node', [embeddingsScript], 300_000);
175
+ } else {
176
+ log('SKIP build-embeddings (script not found)');
177
+ }
178
+
179
+ // 7. HNSW rebuild — MUST run last, after all writes are committed (#81)
155
180
  if (localCli) {
156
181
  runStep('hnsw-rebuild', 'node', [localCli, 'memory', 'rebuild', '--force']);
157
182
  } else {
@@ -353,8 +353,15 @@ async function main() {
353
353
 
354
354
  // Trigger embedding generation in background
355
355
  try {
356
- const embeddingScript = resolve(projectRoot, 'node_modules/moflo/bin/build-embeddings.mjs');
357
- if (existsSync(embeddingScript)) {
356
+ // Check __dirname first (works in both dev bin/ and consumer .claude/scripts/),
357
+ // then fall back to node_modules/moflo/bin/ for consumer projects
358
+ const candidates = [
359
+ resolve(__dirname, 'build-embeddings.mjs'),
360
+ resolve(projectRoot, 'node_modules/moflo/bin/build-embeddings.mjs'),
361
+ resolve(projectRoot, '.claude/scripts/build-embeddings.mjs'),
362
+ ];
363
+ const embeddingScript = candidates.find(p => existsSync(p));
364
+ if (embeddingScript) {
358
365
  const child = spawn('node', [embeddingScript, '--namespace', NAMESPACE], {
359
366
  cwd: projectRoot,
360
367
  detached: true,
@@ -13,7 +13,22 @@ import { resolve, dirname } from 'path';
13
13
  import { fileURLToPath } from 'url';
14
14
 
15
15
  const __dirname = dirname(fileURLToPath(import.meta.url));
16
- const projectRoot = resolve(__dirname, '../..');
16
+
17
+ // Detect project root by walking up from cwd to find package.json.
18
+ // IMPORTANT: Do NOT use resolve(__dirname, '..') or '../..' — this script lives
19
+ // in bin/ during development but gets synced to .claude/scripts/ in consumer
20
+ // projects, so __dirname-relative paths break. findProjectRoot() works everywhere.
21
+ function findProjectRoot() {
22
+ let dir = process.cwd();
23
+ const root = resolve(dir, '/');
24
+ while (dir !== root) {
25
+ if (existsSync(resolve(dir, 'package.json'))) return dir;
26
+ dir = dirname(dir);
27
+ }
28
+ return process.cwd();
29
+ }
30
+
31
+ const projectRoot = findProjectRoot();
17
32
 
18
33
  // ── 1. Helper: fire-and-forget a background process ─────────────────────────
19
34
  function fireAndForget(cmd, args, label) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "moflo",
3
- "version": "4.8.40",
3
+ "version": "4.8.42",
4
4
  "description": "MoFlo — AI agent orchestration for Claude Code. Forked from ruflo/claude-flow with patches applied to source, plus feature-level orchestration.",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -89,7 +89,7 @@
89
89
  "@types/bcrypt": "^5.0.2",
90
90
  "@types/node": "^20.19.37",
91
91
  "eslint": "^8.0.0",
92
- "moflo": "^4.8.39",
92
+ "moflo": "^4.8.41",
93
93
  "tsx": "^4.21.0",
94
94
  "typescript": "^5.9.3",
95
95
  "vitest": "^4.0.0"
@@ -2,5 +2,5 @@
2
2
  * Auto-generated by build. Do not edit manually.
3
3
  * Source of truth: root package.json → scripts/sync-version.mjs
4
4
  */
5
- export const VERSION = '4.8.40';
5
+ export const VERSION = '4.8.42';
6
6
  //# sourceMappingURL=version.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moflo/cli",
3
- "version": "4.8.40",
3
+ "version": "4.8.42",
4
4
  "type": "module",
5
5
  "description": "MoFlo CLI — AI agent orchestration with specialized agents, swarm coordination, MCP server, self-learning hooks, and vector memory for Claude Code",
6
6
  "main": "dist/src/index.js",