swarmdo 1.58.15 → 1.58.23

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 (192) hide show
  1. package/.claude/agents/base-template-generator.md +1 -1
  2. package/.claude/agents/goal/code-goal-planner.md +1 -1
  3. package/.claude/helpers/agent-bridge-hook.cjs +174 -0
  4. package/.claude/helpers/hook-handler.cjs +34 -8
  5. package/.claude/settings.json +16 -0
  6. package/.claude/settings.local.json +7 -0
  7. package/README.md +2 -2
  8. package/package.json +1 -1
  9. package/v3/@swarmdo/cli/.claude/helpers/agent-bridge-hook.cjs +174 -0
  10. package/v3/@swarmdo/cli/.claude/helpers/auto-memory-hook.mjs +274 -27
  11. package/v3/@swarmdo/cli/.claude/helpers/hook-handler.cjs +150 -107
  12. package/v3/@swarmdo/cli/.claude/helpers/intelligence.cjs +196 -989
  13. package/v3/@swarmdo/cli/.claude/helpers/{memory.js → memory.cjs} +10 -9
  14. package/v3/@swarmdo/cli/.claude/helpers/router.cjs +88 -0
  15. package/v3/@swarmdo/cli/.claude/helpers/session.cjs +125 -0
  16. package/v3/@swarmdo/cli/.claude/settings.json +22 -10
  17. package/v3/@swarmdo/cli/dist/src/commands/config.js +5 -4
  18. package/v3/@swarmdo/cli/dist/src/init/executor.d.ts +15 -0
  19. package/v3/@swarmdo/cli/dist/src/init/executor.js +24 -1
  20. package/v3/@swarmdo/cli/dist/src/init/settings-generator.js +33 -5
  21. package/v3/@swarmdo/cli/dist/src/mcp-tools/agent-tools.js +1 -1
  22. package/v3/@swarmdo/cli/dist/src/mcp-tools/neural-tools.d.ts +1 -0
  23. package/v3/@swarmdo/cli/dist/src/mcp-tools/neural-tools.js +132 -78
  24. package/v3/@swarmdo/cli/package.json +1 -1
  25. package/v3/@swarmdo/cli-core/dist/src/index.js +1 -1
  26. package/v3/@swarmdo/codex/dist/cli.js +0 -0
  27. package/v3/@swarmdo/hooks/dist/cli/guidance-cli.js +0 -0
  28. package/v3/@swarmdo/hooks/dist/statusline/index.d.ts +3 -3
  29. package/v3/@swarmdo/hooks/dist/statusline/index.js +3 -3
  30. package/v3/@swarmdo/integration/dist/__tests__/agentic-flow-agent.test.js +1 -4
  31. package/v3/@swarmdo/neural/dist/flash-attention.d.ts +1 -1
  32. package/v3/@swarmdo/neural/dist/flash-attention.js +1 -1
  33. package/v3/@swarmdo/plugin-agent-federation/dist/plugin.js +1 -1
  34. package/v3/@swarmdo/plugin-agent-federation/dist/transport/midstream-aware-loader.js +2 -2
  35. package/v3/@swarmdo/plugin-iot-cognitum/dist/application/index.d.ts +2 -0
  36. package/v3/@swarmdo/plugin-iot-cognitum/dist/application/index.js +2 -0
  37. package/v3/@swarmdo/plugin-iot-cognitum/dist/application/iot-coordinator.d.ts +138 -0
  38. package/v3/@swarmdo/plugin-iot-cognitum/dist/application/iot-coordinator.js +418 -0
  39. package/v3/@swarmdo/plugin-iot-cognitum/dist/bin.d.ts +15 -0
  40. package/v3/@swarmdo/plugin-iot-cognitum/dist/bin.js +240 -0
  41. package/v3/@swarmdo/plugin-iot-cognitum/dist/cli-commands.d.ts +7 -0
  42. package/v3/@swarmdo/plugin-iot-cognitum/dist/cli-commands.js +508 -0
  43. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-agent.d.ts +54 -0
  44. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-agent.js +2 -0
  45. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-fleet.d.ts +46 -0
  46. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-fleet.js +2 -0
  47. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-trust-level.d.ts +18 -0
  48. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-trust-level.js +28 -0
  49. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/index.d.ts +5 -0
  50. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/index.js +2 -0
  51. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/telemetry.d.ts +35 -0
  52. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/telemetry.js +2 -0
  53. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/device-repository.d.ts +11 -0
  54. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/device-repository.js +2 -0
  55. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/fleet-repository.d.ts +9 -0
  56. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/fleet-repository.js +2 -0
  57. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/index.d.ts +5 -0
  58. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/index.js +2 -0
  59. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/telemetry-repository.d.ts +12 -0
  60. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/telemetry-repository.js +2 -0
  61. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/trust-history-repository.d.ts +19 -0
  62. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/trust-history-repository.js +2 -0
  63. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/anomaly-detection-service.d.ts +44 -0
  64. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/anomaly-detection-service.js +117 -0
  65. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/device-lifecycle-service.d.ts +70 -0
  66. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/device-lifecycle-service.js +194 -0
  67. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/firmware-orchestration-service.d.ts +69 -0
  68. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/firmware-orchestration-service.js +139 -0
  69. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/fleet-topology-service.d.ts +34 -0
  70. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/fleet-topology-service.js +101 -0
  71. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/index.d.ts +10 -0
  72. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/index.js +10 -0
  73. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/mesh-service.d.ts +64 -0
  74. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/mesh-service.js +70 -0
  75. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/sona-integration-service.d.ts +44 -0
  76. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/sona-integration-service.js +79 -0
  77. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/telemetry-ingestion-service.d.ts +37 -0
  78. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/telemetry-ingestion-service.js +39 -0
  79. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/telemetry-service.d.ts +67 -0
  80. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/telemetry-service.js +58 -0
  81. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/witness-verification-service.d.ts +45 -0
  82. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/witness-verification-service.js +63 -0
  83. package/v3/@swarmdo/plugin-iot-cognitum/dist/index.d.ts +26 -0
  84. package/v3/@swarmdo/plugin-iot-cognitum/dist/index.js +17 -0
  85. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/agentdb-telemetry-repository.d.ts +51 -0
  86. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/agentdb-telemetry-repository.js +110 -0
  87. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-device-repository.d.ts +13 -0
  88. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-device-repository.js +25 -0
  89. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-fleet-repository.d.ts +11 -0
  90. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-fleet-repository.js +19 -0
  91. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-trust-history-repository.d.ts +11 -0
  92. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-trust-history-repository.js +27 -0
  93. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/index.d.ts +6 -0
  94. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/index.js +6 -0
  95. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/seed-client-factory.d.ts +41 -0
  96. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/seed-client-factory.js +64 -0
  97. package/v3/@swarmdo/plugin-iot-cognitum/dist/mcp-tools.d.ts +8 -0
  98. package/v3/@swarmdo/plugin-iot-cognitum/dist/mcp-tools.js +703 -0
  99. package/v3/@swarmdo/plugin-iot-cognitum/dist/plugin.d.ts +23 -0
  100. package/v3/@swarmdo/plugin-iot-cognitum/dist/plugin.js +239 -0
  101. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/anomaly-scan-worker.d.ts +17 -0
  102. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/anomaly-scan-worker.js +42 -0
  103. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/firmware-watch-worker.d.ts +18 -0
  104. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/firmware-watch-worker.js +45 -0
  105. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/health-probe-worker.d.ts +19 -0
  106. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/health-probe-worker.js +50 -0
  107. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/mesh-sync-worker.d.ts +19 -0
  108. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/mesh-sync-worker.js +47 -0
  109. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/telemetry-ingest-worker.d.ts +17 -0
  110. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/telemetry-ingest-worker.js +40 -0
  111. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/witness-audit-worker.d.ts +18 -0
  112. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/witness-audit-worker.js +51 -0
  113. package/v3/@swarmdo/providers/dist/swarmvector-provider.d.ts +1 -1
  114. package/v3/@swarmdo/providers/dist/swarmvector-provider.js +1 -1
  115. package/v3/@swarmdo/security/dist/input-validator.d.ts +6 -6
  116. package/v3/@swarmdo/shared/dist/hooks/safety/git-commit.js +1 -1
  117. package/v3/@swarmdo/shared/dist/mcp/transport/http.js +1 -8
  118. package/v3/@swarmdo/testing/dist/fixtures/agent-fixtures.d.ts +214 -0
  119. package/v3/@swarmdo/testing/dist/fixtures/agent-fixtures.js +595 -0
  120. package/v3/@swarmdo/testing/dist/fixtures/agents.d.ts +76 -0
  121. package/v3/@swarmdo/testing/dist/fixtures/agents.js +158 -0
  122. package/v3/@swarmdo/testing/dist/fixtures/configurations.d.ts +157 -0
  123. package/v3/@swarmdo/testing/dist/fixtures/configurations.js +337 -0
  124. package/v3/@swarmdo/testing/dist/fixtures/index.d.ts +10 -0
  125. package/v3/@swarmdo/testing/dist/fixtures/index.js +17 -0
  126. package/v3/@swarmdo/testing/dist/fixtures/mcp-fixtures.d.ts +329 -0
  127. package/v3/@swarmdo/testing/dist/fixtures/mcp-fixtures.js +714 -0
  128. package/v3/@swarmdo/testing/dist/fixtures/memory-entries.d.ts +159 -0
  129. package/v3/@swarmdo/testing/dist/fixtures/memory-entries.js +262 -0
  130. package/v3/@swarmdo/testing/dist/fixtures/memory-fixtures.d.ts +290 -0
  131. package/v3/@swarmdo/testing/dist/fixtures/memory-fixtures.js +547 -0
  132. package/v3/@swarmdo/testing/dist/fixtures/swarm-fixtures.d.ts +289 -0
  133. package/v3/@swarmdo/testing/dist/fixtures/swarm-fixtures.js +534 -0
  134. package/v3/@swarmdo/testing/dist/fixtures/tasks.d.ts +106 -0
  135. package/v3/@swarmdo/testing/dist/fixtures/tasks.js +229 -0
  136. package/v3/@swarmdo/testing/dist/helpers/assertion-helpers.d.ts +213 -0
  137. package/v3/@swarmdo/testing/dist/helpers/assertion-helpers.js +435 -0
  138. package/v3/@swarmdo/testing/dist/helpers/assertions.d.ts +135 -0
  139. package/v3/@swarmdo/testing/dist/helpers/assertions.js +217 -0
  140. package/v3/@swarmdo/testing/dist/helpers/create-mock.d.ts +96 -0
  141. package/v3/@swarmdo/testing/dist/helpers/create-mock.js +164 -0
  142. package/v3/@swarmdo/testing/dist/helpers/index.d.ts +14 -0
  143. package/v3/@swarmdo/testing/dist/helpers/index.js +22 -0
  144. package/v3/@swarmdo/testing/dist/helpers/mock-factory.d.ts +323 -0
  145. package/v3/@swarmdo/testing/dist/helpers/mock-factory.js +350 -0
  146. package/v3/@swarmdo/testing/dist/helpers/setup-teardown.d.ts +271 -0
  147. package/v3/@swarmdo/testing/dist/helpers/setup-teardown.js +446 -0
  148. package/v3/@swarmdo/testing/dist/helpers/swarm-instance.d.ts +142 -0
  149. package/v3/@swarmdo/testing/dist/helpers/swarm-instance.js +205 -0
  150. package/v3/@swarmdo/testing/dist/helpers/test-application.d.ts +190 -0
  151. package/v3/@swarmdo/testing/dist/helpers/test-application.js +138 -0
  152. package/v3/@swarmdo/testing/dist/helpers/test-utils.d.ts +274 -0
  153. package/v3/@swarmdo/testing/dist/helpers/test-utils.js +456 -0
  154. package/v3/@swarmdo/testing/dist/index.d.ts +42 -0
  155. package/v3/@swarmdo/testing/dist/index.js +66 -0
  156. package/v3/@swarmdo/testing/dist/mocks/index.d.ts +8 -0
  157. package/v3/@swarmdo/testing/dist/mocks/index.js +10 -0
  158. package/v3/@swarmdo/testing/dist/mocks/mock-mcp-client.d.ts +206 -0
  159. package/v3/@swarmdo/testing/dist/mocks/mock-mcp-client.js +575 -0
  160. package/v3/@swarmdo/testing/dist/mocks/mock-services.d.ts +287 -0
  161. package/v3/@swarmdo/testing/dist/mocks/mock-services.js +563 -0
  162. package/v3/@swarmdo/testing/dist/regression/api-contract.d.ts +109 -0
  163. package/v3/@swarmdo/testing/dist/regression/api-contract.js +374 -0
  164. package/v3/@swarmdo/testing/dist/regression/index.d.ts +18 -0
  165. package/v3/@swarmdo/testing/dist/regression/index.js +18 -0
  166. package/v3/@swarmdo/testing/dist/regression/integration-regression.d.ts +67 -0
  167. package/v3/@swarmdo/testing/dist/regression/integration-regression.js +334 -0
  168. package/v3/@swarmdo/testing/dist/regression/performance-baseline.d.ts +106 -0
  169. package/v3/@swarmdo/testing/dist/regression/performance-baseline.js +268 -0
  170. package/v3/@swarmdo/testing/dist/regression/regression-runner.d.ts +124 -0
  171. package/v3/@swarmdo/testing/dist/regression/regression-runner.js +227 -0
  172. package/v3/@swarmdo/testing/dist/regression/security-regression.d.ts +73 -0
  173. package/v3/@swarmdo/testing/dist/regression/security-regression.js +258 -0
  174. package/v3/@swarmdo/testing/dist/setup.d.ts +43 -0
  175. package/v3/@swarmdo/testing/dist/setup.js +91 -0
  176. package/v3/@swarmdo/testing/dist/v2-compat/api-compat.test.d.ts +10 -0
  177. package/v3/@swarmdo/testing/dist/v2-compat/api-compat.test.js +433 -0
  178. package/v3/@swarmdo/testing/dist/v2-compat/cli-compat.test.d.ts +10 -0
  179. package/v3/@swarmdo/testing/dist/v2-compat/cli-compat.test.js +352 -0
  180. package/v3/@swarmdo/testing/dist/v2-compat/compatibility-validator.d.ts +206 -0
  181. package/v3/@swarmdo/testing/dist/v2-compat/compatibility-validator.js +839 -0
  182. package/v3/@swarmdo/testing/dist/v2-compat/hooks-compat.test.d.ts +10 -0
  183. package/v3/@swarmdo/testing/dist/v2-compat/hooks-compat.test.js +428 -0
  184. package/v3/@swarmdo/testing/dist/v2-compat/index.d.ts +38 -0
  185. package/v3/@swarmdo/testing/dist/v2-compat/index.js +41 -0
  186. package/v3/@swarmdo/testing/dist/v2-compat/mcp-compat.test.d.ts +10 -0
  187. package/v3/@swarmdo/testing/dist/v2-compat/mcp-compat.test.js +419 -0
  188. package/v3/@swarmdo/testing/dist/v2-compat/report-generator.d.ts +34 -0
  189. package/v3/@swarmdo/testing/dist/v2-compat/report-generator.js +372 -0
  190. package/v3/@swarmdo/cli/.claude/helpers/router.js +0 -105
  191. package/v3/@swarmdo/cli/.claude/helpers/session.js +0 -157
  192. package/v3/@swarmdo/cli/.claude/helpers/statusline.js +0 -352
@@ -34,9 +34,9 @@ const dim = (msg) => console.log(` ${DIM}${msg}${RESET}`);
34
34
  const DEBUG = !!(process.env.SWARMDO_DEBUG || process.env.DEBUG);
35
35
 
36
36
  // ── Graceful shutdown (FIX 3) ───────────────────────────────────────────────
37
- // Track the backend in use so a SIGTERM/SIGINT mid-run can still flush it
38
- // (the JSON backend persists; a SQLite-backed one closes/flushes WAL) instead
39
- // of leaving a half-written store or a stale lock behind.
37
+ // Track the backend currently in use so a SIGTERM/SIGINT mid-run can still
38
+ // flush it (the JSON backend persists, a SQLite-backed one closes/flushes WAL)
39
+ // instead of leaving a half-written store or a stale lock behind.
40
40
  let activeBackend = null;
41
41
  let shuttingDown = false;
42
42
  function trackBackend(b) { activeBackend = b; return b; }
@@ -177,16 +177,77 @@ class JsonFileBackend {
177
177
  // Resolve memory package path (local dev or npm installed)
178
178
  // ============================================================================
179
179
 
180
+ /**
181
+ * Resolve a bundled package file (`<pkg>/<relativeFile>`) by trying, in order:
182
+ * 1. PROJECT_ROOT/v3/<pkg>/<relativeFile> (monorepo dev layout)
183
+ * 2. CWD/node_modules/<pkg>/<relativeFile> (user's project deps)
184
+ * 3. node_modules walk-up from PROJECT_ROOT
185
+ * 4. node_modules walk-up from CWD
186
+ * 5. Global npm prefix — checks the swarmdo / swarmdo / @swarmdo/cli
187
+ * bundles, AND the package installed globally on its own
188
+ *
189
+ * Returns the resolved absolute path, or null. See issue #2285.
190
+ */
191
+ async function resolveBundledFile(pkg, relativeFile) {
192
+ const monorepo = join(PROJECT_ROOT, 'v3', pkg, relativeFile);
193
+ if (existsSync(monorepo)) return monorepo;
194
+
195
+ const cwd = process.env.SWARMDO_CWD || process.cwd();
196
+ const inCwd = join(cwd, 'node_modules', pkg, relativeFile);
197
+ if (existsSync(inCwd)) return inCwd;
198
+
199
+ const walkUp = (start) => {
200
+ let dir = start;
201
+ while (dir && dir !== dirname(dir)) {
202
+ const candidate = join(dir, 'node_modules', pkg, relativeFile);
203
+ if (existsSync(candidate)) return candidate;
204
+ dir = dirname(dir);
205
+ }
206
+ return null;
207
+ };
208
+
209
+ const fromProject = walkUp(PROJECT_ROOT);
210
+ if (fromProject) return fromProject;
211
+
212
+ const fromCwd = walkUp(cwd);
213
+ if (fromCwd) return fromCwd;
214
+
215
+ // Global npm prefix fallback — handles `npm i -g swarmdo` and friends, where
216
+ // the marketplace clone (PROJECT_ROOT) has no access to the bundled deps.
217
+ try {
218
+ const { execSync } = await import('child_process');
219
+ const npmPrefix = execSync('npm prefix -g', {
220
+ encoding: 'utf-8',
221
+ stdio: ['ignore', 'pipe', 'ignore'],
222
+ }).trim();
223
+ if (npmPrefix) {
224
+ // Both Unix (<prefix>/lib/node_modules) and Windows (<prefix>/node_modules)
225
+ const roots = [join(npmPrefix, 'lib', 'node_modules'), join(npmPrefix, 'node_modules')];
226
+ const wrappers = ['swarmdo', 'swarmdo', join('@swarmdo', 'cli')];
227
+ for (const root of roots) {
228
+ for (const wrapper of wrappers) {
229
+ const candidate = join(root, wrapper, 'node_modules', pkg, relativeFile);
230
+ if (existsSync(candidate)) return candidate;
231
+ }
232
+ const direct = join(root, pkg, relativeFile);
233
+ if (existsSync(direct)) return direct;
234
+ }
235
+ }
236
+ } catch { /* npm not on PATH or no global install */ }
237
+
238
+ return null;
239
+ }
240
+
180
241
  async function loadMemoryPackage() {
181
- // Strategy 1: Local dev (built dist)
182
- const localDist = join(PROJECT_ROOT, 'v3/@swarmdo/memory/dist/index.js');
183
- if (existsSync(localDist)) {
242
+ // Strategy 1-5: locate dist/index.js across dev/installed/global layouts
243
+ const resolved = await resolveBundledFile('@swarmdo/memory', 'dist/index.js');
244
+ if (resolved) {
184
245
  try {
185
- return await import(`file://${localDist}`);
246
+ return await import(`file://${resolved}`);
186
247
  } catch { /* fall through */ }
187
248
  }
188
249
 
189
- // Strategy 2: Use createRequire for CJS-style resolution (handles nested node_modules
250
+ // Strategy 6: Use createRequire for CJS-style resolution (handles nested node_modules
190
251
  // when installed as a transitive dependency via npx swarmdo / npx swarmdo)
191
252
  try {
192
253
  const { createRequire } = await import('module');
@@ -194,24 +255,11 @@ async function loadMemoryPackage() {
194
255
  return require('@swarmdo/memory');
195
256
  } catch { /* fall through */ }
196
257
 
197
- // Strategy 3: ESM import (works when @swarmdo/memory is a direct dependency)
258
+ // Strategy 7: ESM import (works when @swarmdo/memory is a direct dependency)
198
259
  try {
199
260
  return await import('@swarmdo/memory');
200
261
  } catch { /* fall through */ }
201
262
 
202
- // Strategy 4: Walk up from PROJECT_ROOT looking for @swarmdo/memory in any node_modules
203
- let searchDir = PROJECT_ROOT;
204
- const { parse } = await import('path');
205
- while (searchDir !== parse(searchDir).root) {
206
- const candidate = join(searchDir, 'node_modules', '@swarmdo', 'memory', 'dist', 'index.js');
207
- if (existsSync(candidate)) {
208
- try {
209
- return await import(`file://${candidate}`);
210
- } catch { /* fall through */ }
211
- }
212
- searchDir = dirname(searchDir);
213
- }
214
-
215
263
  return null;
216
264
  }
217
265
 
@@ -270,7 +318,10 @@ async function doImport() {
270
318
  await backend.initialize();
271
319
 
272
320
  const bridgeConfig = {
273
- workingDir: PROJECT_ROOT,
321
+ // Use Claude Code's invocation cwd (the user's project), not PROJECT_ROOT
322
+ // — PROJECT_ROOT resolves to the plugin clone when this hook runs from
323
+ // ~/.claude/plugins/marketplaces/swarmdo/. See issue #2284.
324
+ workingDir: process.env.SWARMDO_CWD || process.cwd(),
274
325
  syncMode: 'on-session-end',
275
326
  };
276
327
 
@@ -302,6 +353,36 @@ async function doImport() {
302
353
  dim(`├─ Learning: ${config.learningBridge.enabled ? 'active' : 'disabled'}`);
303
354
  dim(`├─ Graph: ${config.memoryGraph.enabled ? 'active' : 'disabled'}`);
304
355
  dim(`└─ Agent scopes: ${config.agentScopes.enabled ? 'active' : 'disabled'}`);
356
+
357
+ // Bridge to AgentDB: store entries with ONNX vector embeddings for semantic search
358
+ let vectorized = 0;
359
+ try {
360
+ const cliDistPath = await resolveBundledFile('@swarmdo/cli', 'dist/src/memory/memory-initializer.js');
361
+ if (cliDistPath) {
362
+ const memInit = await import(`file://${cliDistPath}`);
363
+ await memInit.initializeMemoryDatabase({ force: false, verbose: false });
364
+
365
+ const entries = await backend.query({});
366
+ for (const entry of entries) {
367
+ if (!entry.content || entry.content.length < 10) continue;
368
+ try {
369
+ await memInit.storeEntry({
370
+ key: entry.key || entry.id,
371
+ value: entry.content,
372
+ namespace: entry.namespace || 'auto-memory',
373
+ generateEmbeddingFlag: true,
374
+ });
375
+ vectorized++;
376
+ } catch { /* skip entries that fail to embed */ }
377
+ }
378
+
379
+ if (vectorized > 0) {
380
+ success(`Vectorized ${vectorized} entries into AgentDB (ONNX 384-dim)`);
381
+ }
382
+ }
383
+ } catch (vecErr) {
384
+ dim(`AgentDB vectorization skipped: ${vecErr.message?.slice(0, 60)}`);
385
+ }
305
386
  } catch (err) {
306
387
  dim(`Import failed (non-critical): ${err.message}`);
307
388
  }
@@ -330,7 +411,8 @@ async function doSync() {
330
411
  }
331
412
 
332
413
  const bridgeConfig = {
333
- workingDir: PROJECT_ROOT,
414
+ // See doImport — must reflect the user's project, not PROJECT_ROOT (#2284)
415
+ workingDir: process.env.SWARMDO_CWD || process.cwd(),
334
416
  syncMode: 'on-session-end',
335
417
  };
336
418
 
@@ -360,6 +442,21 @@ async function doSync() {
360
442
  // Curate MEMORY.md index with graph-aware ordering
361
443
  await bridge.curateIndex();
362
444
  success('Curated MEMORY.md index');
445
+
446
+ // Flush intelligence patterns to disk (SONA + ReasoningBank)
447
+ try {
448
+ const intPath = await resolveBundledFile('@swarmdo/cli', 'dist/src/memory/intelligence.js');
449
+ if (intPath) {
450
+ const intelligence = await import(`file://${intPath}`);
451
+ if (intelligence.flushPatterns) {
452
+ intelligence.flushPatterns();
453
+ const stats = intelligence.getIntelligenceStats?.();
454
+ if (stats && stats.patternsLearned > 0) {
455
+ success(`Flushed ${stats.patternsLearned} learned patterns to disk`);
456
+ }
457
+ }
458
+ }
459
+ } catch { /* non-critical */ }
363
460
  } catch (err) {
364
461
  dim(`Sync failed (non-critical): ${err.message}`);
365
462
  }
@@ -386,9 +483,158 @@ async function doStatus() {
386
483
  } catch { /* ignore */ }
387
484
  }
388
485
 
486
+ // AgentDB vector status
487
+ try {
488
+ const dbPath = join(PROJECT_ROOT, '.swarmdo', 'memory', 'memory.db');
489
+ const swarmDbPath = join(PROJECT_ROOT, '.swarm', 'memory.db');
490
+ const hasDb = existsSync(dbPath) || existsSync(swarmDbPath);
491
+ console.log(` AgentDB: ${hasDb ? '✅ sql.js database exists' : '⏸ Not initialized'}`);
492
+
493
+ const intPath = await resolveBundledFile('@swarmdo/cli', 'dist/src/memory/intelligence.js');
494
+ if (intPath) {
495
+ const intelligence = await import(`file://${intPath}`);
496
+ const stats = intelligence.getIntelligenceStats?.();
497
+ if (stats) {
498
+ console.log(` SONA: ${stats.sonaEnabled ? '✅ Active' : '⏸ Not initialized'}`);
499
+ console.log(` Patterns: ${stats.patternsLearned} learned`);
500
+ console.log(` Trajectories: ${stats.trajectoriesRecorded} recorded`);
501
+ }
502
+ }
503
+ } catch { /* ignore */ }
504
+
389
505
  console.log('');
390
506
  }
391
507
 
508
+ // ============================================================================
509
+ // Import ALL Claude Code memories from all projects into AgentDB
510
+ // ============================================================================
511
+
512
+ async function doImportAll() {
513
+ log('Importing ALL Claude Code memories into AgentDB...');
514
+
515
+ const { homedir } = await import('os');
516
+ const { readdirSync } = await import('fs');
517
+ const claudeProjectsDir = join(homedir(), '.claude', 'projects');
518
+
519
+ if (!existsSync(claudeProjectsDir)) {
520
+ dim('No Claude Code projects found at ' + claudeProjectsDir);
521
+ return;
522
+ }
523
+
524
+ // Find all memory files across all projects
525
+ const memoryFiles = [];
526
+ try {
527
+ const projects = readdirSync(claudeProjectsDir, { withFileTypes: true });
528
+ for (const project of projects) {
529
+ if (!project.isDirectory()) continue;
530
+ const memDir = join(claudeProjectsDir, project.name, 'memory');
531
+ if (!existsSync(memDir)) continue;
532
+ const files = readdirSync(memDir).filter(f => f.endsWith('.md'));
533
+ for (const file of files) {
534
+ memoryFiles.push({
535
+ path: join(memDir, file),
536
+ project: project.name,
537
+ file,
538
+ });
539
+ }
540
+ }
541
+ } catch (err) {
542
+ dim('Error scanning projects: ' + err.message);
543
+ return;
544
+ }
545
+
546
+ if (memoryFiles.length === 0) {
547
+ dim('No memory files found');
548
+ return;
549
+ }
550
+
551
+ log(`Found ${memoryFiles.length} memory files across ${new Set(memoryFiles.map(f => f.project)).size} projects`);
552
+
553
+ // Load memory-initializer for vectorized storage
554
+ let memInit = null;
555
+ try {
556
+ const cliDistPath = await resolveBundledFile('@swarmdo/cli', 'dist/src/memory/memory-initializer.js');
557
+ if (cliDistPath) {
558
+ memInit = await import(`file://${cliDistPath}`);
559
+ await memInit.initializeMemoryDatabase({ force: false, verbose: false });
560
+ }
561
+ } catch (err) {
562
+ dim('Memory initializer not available: ' + err.message?.slice(0, 60));
563
+ }
564
+
565
+ if (!memInit) {
566
+ dim('Cannot vectorize without memory-initializer. Run: cd v3/@swarmdo/cli && npm run build');
567
+ return;
568
+ }
569
+
570
+ let imported = 0;
571
+ let skipped = 0;
572
+
573
+ for (const memFile of memoryFiles) {
574
+ try {
575
+ const content = readFileSync(memFile.path, 'utf-8');
576
+
577
+ // Parse YAML frontmatter + body
578
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
579
+ let name = memFile.file.replace('.md', '');
580
+ let description = '';
581
+ let type = 'auto-memory';
582
+ let body = content;
583
+
584
+ if (frontmatterMatch) {
585
+ const yaml = frontmatterMatch[1];
586
+ body = frontmatterMatch[2].trim();
587
+ const nameMatch = yaml.match(/^name:\s*(.+)$/m);
588
+ const descMatch = yaml.match(/^description:\s*(.+)$/m);
589
+ const typeMatch = yaml.match(/^type:\s*(.+)$/m);
590
+ if (nameMatch) name = nameMatch[1].trim();
591
+ if (descMatch) description = descMatch[1].trim();
592
+ if (typeMatch) type = typeMatch[1].trim();
593
+ }
594
+
595
+ // Split body into sections (## headers) for granular entries
596
+ const sections = body.split(/^(?=## )/m).filter(s => s.trim().length > 20);
597
+
598
+ if (sections.length === 0) {
599
+ // Store whole file as one entry
600
+ if (body.length > 10) {
601
+ await memInit.storeEntry({
602
+ key: `claude-memory:${memFile.project}:${name}`,
603
+ value: body.slice(0, 4096),
604
+ namespace: 'claude-memories',
605
+ generateEmbeddingFlag: true,
606
+ });
607
+ imported++;
608
+ }
609
+ } else {
610
+ // Store each section separately for better search granularity
611
+ for (const section of sections) {
612
+ const titleMatch = section.match(/^##\s+(.+)/);
613
+ const sectionTitle = titleMatch ? titleMatch[1].trim() : name;
614
+ const sectionBody = section.replace(/^##\s+.+\n/, '').trim();
615
+ if (sectionBody.length < 10) continue;
616
+
617
+ await memInit.storeEntry({
618
+ key: `claude-memory:${memFile.project}:${name}:${sectionTitle.slice(0, 50)}`,
619
+ value: sectionBody.slice(0, 4096),
620
+ namespace: 'claude-memories',
621
+ generateEmbeddingFlag: true,
622
+ });
623
+ imported++;
624
+ }
625
+ }
626
+
627
+ dim(` ✓ ${memFile.project}/${memFile.file} (${sections.length || 1} entries)`);
628
+ } catch (err) {
629
+ dim(` ✗ ${memFile.project}/${memFile.file}: ${err.message?.slice(0, 60)}`);
630
+ skipped++;
631
+ }
632
+ }
633
+
634
+ success(`Imported ${imported} entries from ${memoryFiles.length} files (${skipped} skipped)`);
635
+ success('All Claude Code memories now searchable via AgentDB vector search');
636
+ }
637
+
392
638
  // ============================================================================
393
639
  // Main
394
640
  // ============================================================================
@@ -417,17 +663,18 @@ if (import.meta.url === pathToFileURL(process.argv[1] || '').href) {
417
663
  try {
418
664
  switch (command) {
419
665
  case 'import': await doImport(); break;
666
+ case 'import-all': await doImportAll(); break;
420
667
  case 'sync': await doSync(); break;
421
668
  case 'status': await doStatus(); break;
422
669
  default:
423
670
  console.log('Usage: auto-memory-hook.mjs <import|sync|status>');
424
- break;
671
+ process.exit(1);
425
672
  }
426
673
  } catch (err) {
427
674
  // Hooks must never crash Claude Code - fail silently
428
- try { dim(`Error (non-critical): ${err.message}`); } catch (_) {}
675
+ dim(`Error (non-critical): ${err.message}`);
429
676
  }
430
- // Force clean exit process.exitCode alone isn't enough if async errors override it
677
+ // Ensure clean exit for Claude Code hooks (exit 0 = success, no stderr = no error)
431
678
  process.exit(0);
432
679
  }
433
680