v3/@claude-flow/cli-core/MIGRATION.md
@claude-flow/cli-coreStatus: alpha (3.7.0-alpha.5). This is an opt-in migration for plugin authors who want the cold-cache speedup today and accept the storage-format trade-off documented below.
alpha.5 adds two subpath exports (
./mcp-tools/types,./mcp-tools/validate-input) so@claude-flow/clican re-export those foundation modules from cli-core in a follow-up PR (eliminating ~1,229 LOC of byte-identical duplication). No behavior change for existing plugin scripts; this is groundwork for the cli-side metapackage refactor.
Each npx @claude-flow/cli@latest memory <subcommand> ... in a plugin script can be swapped for npx @claude-flow/cli-core@alpha memory <subcommand> .... Cold-cache wall-time drops from ~25s to ~2s.
What you trade for it:
.swarm/memory.db (SQLite + HNSW) to .swarm/memory.json (plain JSON). Existing data stays in the SQLite file; the cli-core backend doesn't read from it. Treat the migration as a soft-break for any namespace you care about.cli for that call site.hooks commands aren't migrated yet. alpha.2 ships definitions only. Handler dispatch lands in alpha.3+. For hooks_* calls, keep cli@latest.| Call shape | Cold-cache before | Cold-cache after | Backend change |
|---|---|---|---|
memory store | ~25 s | ~2 s | SQLite → JSON |
memory retrieve | ~25 s | ~2 s | SQLite → JSON |
memory list | ~25 s | ~2 s | SQLite → JSON |
memory delete | ~25 s | ~2 s | SQLite → JSON |
memory stats | ~25 s | ~2 s | SQLite → JSON |
memory search (substring OK) | ~25 s | ~2 s | SQLite → JSON, semantic → substring |
| Call shape | Why deferred | Tracked by |
|---|---|---|
memory search with smart=true / threshold | needs ONNX + HNSW | alpha.3+ unified backend |
hooks route / hooks model-outcome / etc. | handlers stay in cli | alpha.3 handler dispatch |
agent spawn / swarm init / task create | extras, not in cli-core | not planned (heavy by design) |
neural train / embeddings batch | ML-heavy | not planned |
Before:
const r = spawnSync('npx', [
'@claude-flow/cli@latest', 'memory', 'store',
'--namespace', 'cost-tracking',
'--key', `session-${id}`,
'--value', JSON.stringify(summary),
], { stdio: ['ignore', 'pipe', 'pipe'], encoding: 'utf-8' });
After:
const cliPkg = process.env.CLI_CORE === '1'
? '@claude-flow/cli-core@alpha' // lite path — JSON backend, fast cold cache
: '@claude-flow/cli@latest'; // heavy path — SQLite/HNSW, slow cold cache
const r = spawnSync('npx', [
cliPkg, 'memory', 'store',
'--namespace', 'cost-tracking',
'--key', `session-${id}`,
'--value', JSON.stringify(summary),
], { stdio: ['ignore', 'pipe', 'pipe'], encoding: 'utf-8' });
Setting CLI_CORE=1 opts into the lite path. Leaving it unset preserves the existing behavior. This pattern lets you A/B test before committing.
track.mjs) and apply the env-flag pattern above.cli@latest for the affected call sites and document the gap; ping us on issue #1760 so we can prioritize.CLI_CORE=1 in your scripts' env — done.Today, cli-core's JsonMemoryBackend writes .swarm/memory.json; cli's SqliteHnswMemoryBackend writes .swarm/memory.db. They DON'T share data.
Plans to converge:
.swarm/memory.db via a shared schema (still no semantic search, but the data is visible).If a switch breaks you:
# Revert: just delete the env override or remove the conditional.
unset CLI_CORE
Or replace the conditional with the bare '@claude-flow/cli@latest' and re-run. cli-core left no permanent footprint other than the JSON file (which you can delete: rm .swarm/memory.json).
cli-core is alpha — please file feedback at https://github.com/ruvnet/ruflo/issues with the label cli-core-alpha. Specifically helpful:
rm -rf ~/.npm/_npx; time npx -y @claude-flow/cli-core@alpha --version)@claude-flow/cli foundation re-export (post-alpha.5)The following 4 foundation modules are byte-identical between @claude-flow/cli and @claude-flow/cli-core (verified via diff -q):
| File | Lines | cli-core export |
|---|---|---|
cli/src/types.ts | 287 | @claude-flow/cli-core/types |
cli/src/output.ts | 640 | @claude-flow/cli-core/output |
cli/src/mcp-tools/types.ts | 46 | @claude-flow/cli-core/mcp-tools/types |
cli/src/mcp-tools/validate-input.ts | 256 | @claude-flow/cli-core/mcp-tools/validate-input |
| Total | 1,229 |
The follow-up PR will:
@claude-flow/cli-core: ^3.7.0-alpha.5 as a runtime dep in cli/package.json.// cli/src/types.ts (after)
export * from '@claude-flow/cli-core/types';
import './types.js' call sites inside cli stay unchanged — they hit the shim, which re-exports cli-core's authoritative defs. Zero runtime risk because the source files are already identical.This is intentionally not part of alpha.5 itself. The [email protected] tarball is 2.2 MB / 1146 files; touching its foundation files is a real PR with proper review, smoke tests, and a release. alpha.5 just lays the wiring (subpath exports) so the PR is mechanical when we cut it.
feat/cli-core-split — work in progress