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.
- package/.claude/agents/base-template-generator.md +1 -1
- package/.claude/agents/goal/code-goal-planner.md +1 -1
- package/.claude/helpers/agent-bridge-hook.cjs +174 -0
- package/.claude/helpers/hook-handler.cjs +34 -8
- package/.claude/settings.json +16 -0
- package/.claude/settings.local.json +7 -0
- package/README.md +2 -2
- package/package.json +1 -1
- package/v3/@swarmdo/cli/.claude/helpers/agent-bridge-hook.cjs +174 -0
- package/v3/@swarmdo/cli/.claude/helpers/auto-memory-hook.mjs +274 -27
- package/v3/@swarmdo/cli/.claude/helpers/hook-handler.cjs +150 -107
- package/v3/@swarmdo/cli/.claude/helpers/intelligence.cjs +196 -989
- package/v3/@swarmdo/cli/.claude/helpers/{memory.js → memory.cjs} +10 -9
- package/v3/@swarmdo/cli/.claude/helpers/router.cjs +88 -0
- package/v3/@swarmdo/cli/.claude/helpers/session.cjs +125 -0
- package/v3/@swarmdo/cli/.claude/settings.json +22 -10
- package/v3/@swarmdo/cli/dist/src/commands/config.js +5 -4
- package/v3/@swarmdo/cli/dist/src/init/executor.d.ts +15 -0
- package/v3/@swarmdo/cli/dist/src/init/executor.js +24 -1
- package/v3/@swarmdo/cli/dist/src/init/settings-generator.js +33 -5
- package/v3/@swarmdo/cli/dist/src/mcp-tools/agent-tools.js +1 -1
- package/v3/@swarmdo/cli/dist/src/mcp-tools/neural-tools.d.ts +1 -0
- package/v3/@swarmdo/cli/dist/src/mcp-tools/neural-tools.js +132 -78
- package/v3/@swarmdo/cli/package.json +1 -1
- package/v3/@swarmdo/cli-core/dist/src/index.js +1 -1
- package/v3/@swarmdo/codex/dist/cli.js +0 -0
- package/v3/@swarmdo/hooks/dist/cli/guidance-cli.js +0 -0
- package/v3/@swarmdo/hooks/dist/statusline/index.d.ts +3 -3
- package/v3/@swarmdo/hooks/dist/statusline/index.js +3 -3
- package/v3/@swarmdo/integration/dist/__tests__/agentic-flow-agent.test.js +1 -4
- package/v3/@swarmdo/neural/dist/flash-attention.d.ts +1 -1
- package/v3/@swarmdo/neural/dist/flash-attention.js +1 -1
- package/v3/@swarmdo/plugin-agent-federation/dist/plugin.js +1 -1
- package/v3/@swarmdo/plugin-agent-federation/dist/transport/midstream-aware-loader.js +2 -2
- package/v3/@swarmdo/plugin-iot-cognitum/dist/application/index.d.ts +2 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/application/index.js +2 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/application/iot-coordinator.d.ts +138 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/application/iot-coordinator.js +418 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/bin.d.ts +15 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/bin.js +240 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/cli-commands.d.ts +7 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/cli-commands.js +508 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-agent.d.ts +54 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-agent.js +2 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-fleet.d.ts +46 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-fleet.js +2 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-trust-level.d.ts +18 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-trust-level.js +28 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/index.d.ts +5 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/index.js +2 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/telemetry.d.ts +35 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/telemetry.js +2 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/device-repository.d.ts +11 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/device-repository.js +2 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/fleet-repository.d.ts +9 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/fleet-repository.js +2 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/index.d.ts +5 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/index.js +2 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/telemetry-repository.d.ts +12 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/telemetry-repository.js +2 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/trust-history-repository.d.ts +19 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/trust-history-repository.js +2 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/anomaly-detection-service.d.ts +44 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/anomaly-detection-service.js +117 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/device-lifecycle-service.d.ts +70 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/device-lifecycle-service.js +194 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/firmware-orchestration-service.d.ts +69 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/firmware-orchestration-service.js +139 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/fleet-topology-service.d.ts +34 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/fleet-topology-service.js +101 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/index.d.ts +10 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/index.js +10 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/mesh-service.d.ts +64 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/mesh-service.js +70 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/sona-integration-service.d.ts +44 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/sona-integration-service.js +79 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/telemetry-ingestion-service.d.ts +37 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/telemetry-ingestion-service.js +39 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/telemetry-service.d.ts +67 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/telemetry-service.js +58 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/witness-verification-service.d.ts +45 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/witness-verification-service.js +63 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/index.d.ts +26 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/index.js +17 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/agentdb-telemetry-repository.d.ts +51 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/agentdb-telemetry-repository.js +110 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-device-repository.d.ts +13 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-device-repository.js +25 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-fleet-repository.d.ts +11 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-fleet-repository.js +19 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-trust-history-repository.d.ts +11 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-trust-history-repository.js +27 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/index.d.ts +6 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/index.js +6 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/seed-client-factory.d.ts +41 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/seed-client-factory.js +64 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/mcp-tools.d.ts +8 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/mcp-tools.js +703 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/plugin.d.ts +23 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/plugin.js +239 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/anomaly-scan-worker.d.ts +17 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/anomaly-scan-worker.js +42 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/firmware-watch-worker.d.ts +18 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/firmware-watch-worker.js +45 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/health-probe-worker.d.ts +19 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/health-probe-worker.js +50 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/mesh-sync-worker.d.ts +19 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/mesh-sync-worker.js +47 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/telemetry-ingest-worker.d.ts +17 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/telemetry-ingest-worker.js +40 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/witness-audit-worker.d.ts +18 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/witness-audit-worker.js +51 -0
- package/v3/@swarmdo/providers/dist/swarmvector-provider.d.ts +1 -1
- package/v3/@swarmdo/providers/dist/swarmvector-provider.js +1 -1
- package/v3/@swarmdo/security/dist/input-validator.d.ts +6 -6
- package/v3/@swarmdo/shared/dist/hooks/safety/git-commit.js +1 -1
- package/v3/@swarmdo/shared/dist/mcp/transport/http.js +1 -8
- package/v3/@swarmdo/testing/dist/fixtures/agent-fixtures.d.ts +214 -0
- package/v3/@swarmdo/testing/dist/fixtures/agent-fixtures.js +595 -0
- package/v3/@swarmdo/testing/dist/fixtures/agents.d.ts +76 -0
- package/v3/@swarmdo/testing/dist/fixtures/agents.js +158 -0
- package/v3/@swarmdo/testing/dist/fixtures/configurations.d.ts +157 -0
- package/v3/@swarmdo/testing/dist/fixtures/configurations.js +337 -0
- package/v3/@swarmdo/testing/dist/fixtures/index.d.ts +10 -0
- package/v3/@swarmdo/testing/dist/fixtures/index.js +17 -0
- package/v3/@swarmdo/testing/dist/fixtures/mcp-fixtures.d.ts +329 -0
- package/v3/@swarmdo/testing/dist/fixtures/mcp-fixtures.js +714 -0
- package/v3/@swarmdo/testing/dist/fixtures/memory-entries.d.ts +159 -0
- package/v3/@swarmdo/testing/dist/fixtures/memory-entries.js +262 -0
- package/v3/@swarmdo/testing/dist/fixtures/memory-fixtures.d.ts +290 -0
- package/v3/@swarmdo/testing/dist/fixtures/memory-fixtures.js +547 -0
- package/v3/@swarmdo/testing/dist/fixtures/swarm-fixtures.d.ts +289 -0
- package/v3/@swarmdo/testing/dist/fixtures/swarm-fixtures.js +534 -0
- package/v3/@swarmdo/testing/dist/fixtures/tasks.d.ts +106 -0
- package/v3/@swarmdo/testing/dist/fixtures/tasks.js +229 -0
- package/v3/@swarmdo/testing/dist/helpers/assertion-helpers.d.ts +213 -0
- package/v3/@swarmdo/testing/dist/helpers/assertion-helpers.js +435 -0
- package/v3/@swarmdo/testing/dist/helpers/assertions.d.ts +135 -0
- package/v3/@swarmdo/testing/dist/helpers/assertions.js +217 -0
- package/v3/@swarmdo/testing/dist/helpers/create-mock.d.ts +96 -0
- package/v3/@swarmdo/testing/dist/helpers/create-mock.js +164 -0
- package/v3/@swarmdo/testing/dist/helpers/index.d.ts +14 -0
- package/v3/@swarmdo/testing/dist/helpers/index.js +22 -0
- package/v3/@swarmdo/testing/dist/helpers/mock-factory.d.ts +323 -0
- package/v3/@swarmdo/testing/dist/helpers/mock-factory.js +350 -0
- package/v3/@swarmdo/testing/dist/helpers/setup-teardown.d.ts +271 -0
- package/v3/@swarmdo/testing/dist/helpers/setup-teardown.js +446 -0
- package/v3/@swarmdo/testing/dist/helpers/swarm-instance.d.ts +142 -0
- package/v3/@swarmdo/testing/dist/helpers/swarm-instance.js +205 -0
- package/v3/@swarmdo/testing/dist/helpers/test-application.d.ts +190 -0
- package/v3/@swarmdo/testing/dist/helpers/test-application.js +138 -0
- package/v3/@swarmdo/testing/dist/helpers/test-utils.d.ts +274 -0
- package/v3/@swarmdo/testing/dist/helpers/test-utils.js +456 -0
- package/v3/@swarmdo/testing/dist/index.d.ts +42 -0
- package/v3/@swarmdo/testing/dist/index.js +66 -0
- package/v3/@swarmdo/testing/dist/mocks/index.d.ts +8 -0
- package/v3/@swarmdo/testing/dist/mocks/index.js +10 -0
- package/v3/@swarmdo/testing/dist/mocks/mock-mcp-client.d.ts +206 -0
- package/v3/@swarmdo/testing/dist/mocks/mock-mcp-client.js +575 -0
- package/v3/@swarmdo/testing/dist/mocks/mock-services.d.ts +287 -0
- package/v3/@swarmdo/testing/dist/mocks/mock-services.js +563 -0
- package/v3/@swarmdo/testing/dist/regression/api-contract.d.ts +109 -0
- package/v3/@swarmdo/testing/dist/regression/api-contract.js +374 -0
- package/v3/@swarmdo/testing/dist/regression/index.d.ts +18 -0
- package/v3/@swarmdo/testing/dist/regression/index.js +18 -0
- package/v3/@swarmdo/testing/dist/regression/integration-regression.d.ts +67 -0
- package/v3/@swarmdo/testing/dist/regression/integration-regression.js +334 -0
- package/v3/@swarmdo/testing/dist/regression/performance-baseline.d.ts +106 -0
- package/v3/@swarmdo/testing/dist/regression/performance-baseline.js +268 -0
- package/v3/@swarmdo/testing/dist/regression/regression-runner.d.ts +124 -0
- package/v3/@swarmdo/testing/dist/regression/regression-runner.js +227 -0
- package/v3/@swarmdo/testing/dist/regression/security-regression.d.ts +73 -0
- package/v3/@swarmdo/testing/dist/regression/security-regression.js +258 -0
- package/v3/@swarmdo/testing/dist/setup.d.ts +43 -0
- package/v3/@swarmdo/testing/dist/setup.js +91 -0
- package/v3/@swarmdo/testing/dist/v2-compat/api-compat.test.d.ts +10 -0
- package/v3/@swarmdo/testing/dist/v2-compat/api-compat.test.js +433 -0
- package/v3/@swarmdo/testing/dist/v2-compat/cli-compat.test.d.ts +10 -0
- package/v3/@swarmdo/testing/dist/v2-compat/cli-compat.test.js +352 -0
- package/v3/@swarmdo/testing/dist/v2-compat/compatibility-validator.d.ts +206 -0
- package/v3/@swarmdo/testing/dist/v2-compat/compatibility-validator.js +839 -0
- package/v3/@swarmdo/testing/dist/v2-compat/hooks-compat.test.d.ts +10 -0
- package/v3/@swarmdo/testing/dist/v2-compat/hooks-compat.test.js +428 -0
- package/v3/@swarmdo/testing/dist/v2-compat/index.d.ts +38 -0
- package/v3/@swarmdo/testing/dist/v2-compat/index.js +41 -0
- package/v3/@swarmdo/testing/dist/v2-compat/mcp-compat.test.d.ts +10 -0
- package/v3/@swarmdo/testing/dist/v2-compat/mcp-compat.test.js +419 -0
- package/v3/@swarmdo/testing/dist/v2-compat/report-generator.d.ts +34 -0
- package/v3/@swarmdo/testing/dist/v2-compat/report-generator.js +372 -0
- package/v3/@swarmdo/cli/.claude/helpers/router.js +0 -105
- package/v3/@swarmdo/cli/.claude/helpers/session.js +0 -157
- 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
|
|
38
|
-
// (the JSON backend persists
|
|
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:
|
|
182
|
-
const
|
|
183
|
-
if (
|
|
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://${
|
|
246
|
+
return await import(`file://${resolved}`);
|
|
186
247
|
} catch { /* fall through */ }
|
|
187
248
|
}
|
|
188
249
|
|
|
189
|
-
// Strategy
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
671
|
+
process.exit(1);
|
|
425
672
|
}
|
|
426
673
|
} catch (err) {
|
|
427
674
|
// Hooks must never crash Claude Code - fail silently
|
|
428
|
-
|
|
675
|
+
dim(`Error (non-critical): ${err.message}`);
|
|
429
676
|
}
|
|
430
|
-
//
|
|
677
|
+
// Ensure clean exit for Claude Code hooks (exit 0 = success, no stderr = no error)
|
|
431
678
|
process.exit(0);
|
|
432
679
|
}
|
|
433
680
|
|