@livestore/cli 0.4.0-dev.8 → 0.4.0

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 (77) hide show
  1. package/dist/.tsbuildinfo +1 -0
  2. package/dist/__tests__/fixtures/mock-config.d.ts +65 -0
  3. package/dist/__tests__/fixtures/mock-config.d.ts.map +1 -0
  4. package/dist/__tests__/fixtures/mock-config.js +94 -0
  5. package/dist/__tests__/fixtures/mock-config.js.map +1 -0
  6. package/dist/__tests__/sync-operations.test.d.ts +2 -0
  7. package/dist/__tests__/sync-operations.test.d.ts.map +1 -0
  8. package/dist/__tests__/sync-operations.test.js +167 -0
  9. package/dist/__tests__/sync-operations.test.js.map +1 -0
  10. package/dist/bin.js.map +1 -1
  11. package/dist/cli.d.ts +16 -2
  12. package/dist/cli.d.ts.map +1 -1
  13. package/dist/cli.js +3 -4
  14. package/dist/cli.js.map +1 -1
  15. package/dist/commands/import-export.d.ts +34 -0
  16. package/dist/commands/import-export.d.ts.map +1 -0
  17. package/dist/commands/import-export.js +135 -0
  18. package/dist/commands/import-export.js.map +1 -0
  19. package/dist/commands/mcp-coach.d.ts +13 -5
  20. package/dist/commands/mcp-coach.d.ts.map +1 -1
  21. package/dist/commands/mcp-coach.js +41 -45
  22. package/dist/commands/mcp-coach.js.map +1 -1
  23. package/dist/commands/mcp-tool-handlers.d.ts +6 -0
  24. package/dist/commands/mcp-tool-handlers.d.ts.map +1 -0
  25. package/dist/commands/{mcp-tools.js → mcp-tool-handlers.js} +79 -45
  26. package/dist/commands/mcp-tool-handlers.js.map +1 -0
  27. package/dist/commands/mcp-tools-defs.d.ts +133 -0
  28. package/dist/commands/mcp-tools-defs.d.ts.map +1 -0
  29. package/dist/commands/mcp-tools-defs.js +278 -0
  30. package/dist/commands/mcp-tools-defs.js.map +1 -0
  31. package/dist/commands/mcp.d.ts.map +1 -1
  32. package/dist/commands/mcp.js +2 -1
  33. package/dist/commands/mcp.js.map +1 -1
  34. package/dist/commands/new-project.d.ts +9 -2
  35. package/dist/commands/new-project.d.ts.map +1 -1
  36. package/dist/commands/new-project.js +72 -32
  37. package/dist/commands/new-project.js.map +1 -1
  38. package/dist/mcp-runtime/runtime.d.ts +48 -0
  39. package/dist/mcp-runtime/runtime.d.ts.map +1 -0
  40. package/dist/mcp-runtime/runtime.js +107 -0
  41. package/dist/mcp-runtime/runtime.js.map +1 -0
  42. package/dist/module-loader.d.ts +22 -0
  43. package/dist/module-loader.d.ts.map +1 -0
  44. package/dist/module-loader.js +75 -0
  45. package/dist/module-loader.js.map +1 -0
  46. package/dist/package-manager.d.ts +38 -0
  47. package/dist/package-manager.d.ts.map +1 -0
  48. package/dist/package-manager.js +33 -0
  49. package/dist/package-manager.js.map +1 -0
  50. package/dist/package-manager.test.d.ts +2 -0
  51. package/dist/package-manager.test.d.ts.map +1 -0
  52. package/dist/package-manager.test.js +57 -0
  53. package/dist/package-manager.test.js.map +1 -0
  54. package/dist/sync-operations.d.ts +121 -0
  55. package/dist/sync-operations.d.ts.map +1 -0
  56. package/dist/sync-operations.js +180 -0
  57. package/dist/sync-operations.js.map +1 -0
  58. package/package.json +71 -15
  59. package/src/__tests__/fixtures/mock-config.ts +112 -0
  60. package/src/__tests__/sync-operations.test.ts +232 -0
  61. package/src/bin.ts +1 -0
  62. package/src/cli.ts +4 -5
  63. package/src/commands/import-export.ts +283 -0
  64. package/src/commands/mcp-coach.ts +67 -67
  65. package/src/commands/{mcp-tools.ts → mcp-tool-handlers.ts} +93 -57
  66. package/src/commands/mcp-tools-defs.ts +318 -0
  67. package/src/commands/mcp.ts +3 -2
  68. package/src/commands/new-project.ts +90 -36
  69. package/src/mcp-runtime/runtime.ts +147 -0
  70. package/src/module-loader.ts +94 -0
  71. package/src/package-manager.test.ts +66 -0
  72. package/src/package-manager.ts +44 -0
  73. package/src/sync-operations.ts +360 -0
  74. package/dist/commands/mcp-tools.d.ts +0 -58
  75. package/dist/commands/mcp-tools.d.ts.map +0 -1
  76. package/dist/commands/mcp-tools.js.map +0 -1
  77. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,48 @@
1
+ import { UnknownError } from '@livestore/common';
2
+ import type { Store } from '@livestore/livestore';
3
+ import { Effect, Option, Schema } from '@livestore/utils/effect';
4
+ /**
5
+ * Dynamically imports a module that exports a `makeStore({ storeId }): Promise<Store>` function,
6
+ * calls it with the provided storeId, and caches the Store instance for subsequent tool calls.
7
+ */
8
+ export declare const init: ({ configPath, storeId, clientId, sessionId, }: {
9
+ configPath: string;
10
+ storeId: string;
11
+ clientId?: string;
12
+ sessionId?: string;
13
+ }) => Effect.Effect<Store<any>, UnknownError>;
14
+ export declare const getStore: Effect.Effect<Option.Option<Store<any, {}>>, never, never>;
15
+ export declare const status: Effect.Effect<{
16
+ _tag: "disconnected";
17
+ storeId?: never;
18
+ clientId?: never;
19
+ sessionId?: never;
20
+ tableCounts?: never;
21
+ } | {
22
+ _tag: "connected";
23
+ storeId: string;
24
+ clientId: string;
25
+ sessionId: string;
26
+ tableCounts: Record<string, number>;
27
+ }, never, never>;
28
+ export declare const query: (args_0: {
29
+ sql: string;
30
+ bindValues?: readonly any[] | Record<string, unknown>;
31
+ }) => Effect.Effect<{
32
+ rows: {
33
+ [k: string]: Schema.JsonValue;
34
+ }[];
35
+ rowCount: number;
36
+ }, never, never>;
37
+ export declare const commit: (args_0: {
38
+ events: ReadonlyArray<{
39
+ name: string;
40
+ args: Schema.JsonValue;
41
+ }>;
42
+ }) => Effect.Effect<{
43
+ committed: number;
44
+ }, never, never>;
45
+ export declare const disconnect: Effect.Effect<{
46
+ _tag: "disconnected";
47
+ }, never, never>;
48
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/mcp-runtime/runtime.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAEjD,OAAO,EAAE,MAAM,EAA0B,MAAM,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAWxF;;;GAGG;AACH,eAAO,MAAM,IAAI,GAAI,+CAKlB;IACD,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,KAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,YAAY,CA2CuC,CAAA;AAEjF,eAAO,MAAM,QAAQ,4DAAgD,CAAA;AAErE,eAAO,MAAM,MAAM;;;;;;;;;;;;gBAyB2B,CAAA;AAE9C,eAAO,MAAM,KAAK;SAIX,MAAM;iBACE,SAAS,GAAG,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;gBAWrD,CAAA;AAEF,eAAO,MAAM,MAAM;YAGT,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,SAAS,CAAA;KAAE,CAAC;;;gBAW/D,CAAA;AAEF,eAAO,MAAM,UAAU;;gBAQ2B,CAAA"}
@@ -0,0 +1,107 @@
1
+ import { makeAdapter as makeNodeAdapter } from '@livestore/adapter-node';
2
+ import { UnknownError } from '@livestore/common';
3
+ import { LiveStoreEvent, SystemTables } from '@livestore/common/schema';
4
+ import { createStorePromise } from '@livestore/livestore';
5
+ import { Effect, FetchHttpClient, Layer, Option, Schema } from '@livestore/utils/effect';
6
+ import { PlatformNode } from '@livestore/utils/node';
7
+ import { loadModuleConfig } from "../module-loader.js";
8
+ /** Currently connected store */
9
+ let store;
10
+ /** Layer providing FileSystem and HttpClient for module loading */
11
+ const ModuleLoaderLayer = Layer.mergeAll(PlatformNode.NodeFileSystem.layer, FetchHttpClient.layer);
12
+ /**
13
+ * Dynamically imports a module that exports a `makeStore({ storeId }): Promise<Store>` function,
14
+ * calls it with the provided storeId, and caches the Store instance for subsequent tool calls.
15
+ */
16
+ export const init = ({ configPath, storeId, clientId, sessionId, }) => Effect.gen(function* () {
17
+ if (storeId === '' || typeof storeId !== 'string') {
18
+ return yield* UnknownError.make({ cause: new Error('Invalid storeId: expected a non-empty string') });
19
+ }
20
+ const { schema, syncBackendConstructor, syncPayloadSchema, syncPayload } = yield* loadModuleConfig({ configPath });
21
+ // Build Node adapter internally
22
+ const adapter = makeNodeAdapter({
23
+ storage: { type: 'in-memory' },
24
+ ...(clientId !== undefined && clientId !== '' ? { clientId } : {}),
25
+ ...(sessionId !== undefined && sessionId !== '' ? { sessionId } : {}),
26
+ sync: {
27
+ backend: syncBackendConstructor,
28
+ initialSyncOptions: { _tag: 'Blocking', timeout: 5000 },
29
+ onSyncError: 'shutdown',
30
+ },
31
+ });
32
+ // Create the store
33
+ const s = yield* Effect.promise(() => createStorePromise({
34
+ schema,
35
+ storeId,
36
+ adapter,
37
+ disableDevtools: true,
38
+ syncPayload,
39
+ syncPayloadSchema,
40
+ }));
41
+ // Replace existing store if any
42
+ if (store !== undefined) {
43
+ yield* Effect.promise(async () => {
44
+ try {
45
+ await store.shutdownPromise();
46
+ }
47
+ catch { }
48
+ });
49
+ }
50
+ store = s;
51
+ return store;
52
+ }).pipe(Effect.provide(ModuleLoaderLayer), Effect.withSpan('mcp-runtime:init'));
53
+ export const getStore = Effect.sync(() => Option.fromNullable(store));
54
+ export const status = Effect.gen(function* () {
55
+ const opt = yield* getStore;
56
+ if (opt._tag === 'None') {
57
+ return {
58
+ _tag: 'disconnected',
59
+ };
60
+ }
61
+ const s = opt.value;
62
+ const tableCounts = Array.from(s.schema.state.sqlite.tables.keys())
63
+ .filter((name) => !SystemTables.isStateSystemTable(name))
64
+ .reduce((acc, name) => {
65
+ acc[name] = s.query(s.schema.state.sqlite.tables.get(name).count());
66
+ return acc;
67
+ }, {});
68
+ return {
69
+ _tag: 'connected',
70
+ storeId: s.storeId,
71
+ clientId: s.clientId,
72
+ sessionId: s.sessionId,
73
+ tableCounts,
74
+ };
75
+ }).pipe(Effect.withSpan('mcp-runtime:status'));
76
+ export const query = Effect.fn('mcp-runtime:query')(function* ({ sql, bindValues, }) {
77
+ const opt = yield* getStore;
78
+ if (opt._tag === 'None') {
79
+ return yield* Effect.dieMessage('LiveStore not connected. Call livestore_instance_connect first.');
80
+ }
81
+ const s = opt.value;
82
+ const rows = s.query({ query: sql, bindValues: bindValues ?? [] });
83
+ const jsonRows = rows.map((r) => Object.fromEntries(Object.entries(r).map(([k, v]) => [k, v])));
84
+ return { rows: jsonRows, rowCount: jsonRows.length };
85
+ });
86
+ export const commit = Effect.fn('mcp-runtime:commit')(function* ({ events, }) {
87
+ const opt = yield* getStore;
88
+ if (opt._tag === 'None') {
89
+ return yield* Effect.dieMessage('LiveStore not connected. Call livestore_instance_connect first.');
90
+ }
91
+ const s = opt.value;
92
+ const InputEventSchema = LiveStoreEvent.Input.makeSchema(s.schema);
93
+ const decoded = events.map((e) => Schema.decodeSync(InputEventSchema)(e));
94
+ s.commit(...decoded);
95
+ return { committed: decoded.length };
96
+ });
97
+ export const disconnect = Effect.promise(async () => {
98
+ if (store !== undefined) {
99
+ try {
100
+ await store.shutdownPromise();
101
+ }
102
+ catch { }
103
+ store = undefined;
104
+ }
105
+ return { _tag: 'disconnected' };
106
+ }).pipe(Effect.withSpan('mcp-runtime:disconnect'));
107
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/mcp-runtime/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { SyncBackend } from '@livestore/common';
2
+ import { UnknownError } from '@livestore/common';
3
+ import { type LiveStoreSchema } from '@livestore/common/schema';
4
+ import { Effect, FileSystem, Schema } from '@livestore/utils/effect';
5
+ export interface ModuleConfig {
6
+ schema: LiveStoreSchema;
7
+ syncBackendConstructor: SyncBackend.SyncBackendConstructor;
8
+ syncPayloadSchema: Schema.Schema<any>;
9
+ syncPayload: unknown;
10
+ }
11
+ /**
12
+ * Loads and validates a user config module.
13
+ * The module must export:
14
+ * - `schema`: A valid LiveStore schema
15
+ * - `syncBackend`: A sync backend constructor function
16
+ * - `syncPayloadSchema` (optional): Schema for validating syncPayload
17
+ * - `syncPayload` (optional): Payload data for the sync backend
18
+ */
19
+ export declare const loadModuleConfig: ({ configPath, }: {
20
+ configPath: string;
21
+ }) => Effect.Effect<ModuleConfig, UnknownError, FileSystem.FileSystem>;
22
+ //# sourceMappingURL=module-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-loader.d.ts","sourceRoot":"","sources":["../src/module-loader.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAElF,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEpE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,eAAe,CAAA;IACvB,sBAAsB,EAAE,WAAW,CAAC,sBAAsB,CAAA;IAC1D,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IACrC,WAAW,EAAE,OAAO,CAAA;CACrB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,GAAI,iBAE9B;IACD,UAAU,EAAE,MAAM,CAAA;CACnB,KAAG,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,YAAY,EAAE,UAAU,CAAC,UAAU,CA6DP,CAAA"}
@@ -0,0 +1,75 @@
1
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
2
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
3
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
4
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
5
+ });
6
+ }
7
+ return path;
8
+ };
9
+ /**
10
+ * Shared module loading utility for CLI and MCP.
11
+ * Loads and validates user config modules that export schema, syncBackend, and optional syncPayload.
12
+ */
13
+ import path from 'node:path';
14
+ import { pathToFileURL } from 'node:url';
15
+ import { UnknownError } from '@livestore/common';
16
+ import { isLiveStoreSchema } from '@livestore/common/schema';
17
+ import { shouldNeverHappen } from '@livestore/utils';
18
+ import { Effect, FileSystem, Schema } from '@livestore/utils/effect';
19
+ /**
20
+ * Loads and validates a user config module.
21
+ * The module must export:
22
+ * - `schema`: A valid LiveStore schema
23
+ * - `syncBackend`: A sync backend constructor function
24
+ * - `syncPayloadSchema` (optional): Schema for validating syncPayload
25
+ * - `syncPayload` (optional): Payload data for the sync backend
26
+ */
27
+ export const loadModuleConfig = ({ configPath, }) => Effect.gen(function* () {
28
+ const abs = path.isAbsolute(configPath) === true ? configPath : path.resolve(process.cwd(), configPath);
29
+ const fs = yield* FileSystem.FileSystem;
30
+ const exists = yield* fs.exists(abs).pipe(UnknownError.mapToUnknownError);
31
+ if (exists === false) {
32
+ return yield* UnknownError.make({
33
+ cause: `Store module not found at ${abs}`,
34
+ note: 'Make sure the path points to a valid LiveStore module',
35
+ });
36
+ }
37
+ const mod = yield* Effect.tryPromise({
38
+ try: () => import(__rewriteRelativeImportExtension(pathToFileURL(abs).href)),
39
+ catch: (cause) => UnknownError.make({
40
+ cause,
41
+ note: `Failed to import module at ${abs}`,
42
+ }),
43
+ });
44
+ const schema = (mod)?.schema;
45
+ if (isLiveStoreSchema(schema) === false) {
46
+ return yield* UnknownError.make({
47
+ cause: `Module at ${abs} must export a valid LiveStore 'schema'`,
48
+ note: `Ex: export { schema } from './src/livestore/schema.ts'`,
49
+ });
50
+ }
51
+ const syncBackendConstructor = (mod)?.syncBackend;
52
+ if (typeof syncBackendConstructor !== 'function') {
53
+ return yield* UnknownError.make({
54
+ cause: `Module at ${abs} must export a 'syncBackend' constructor`,
55
+ note: `Ex: export const syncBackend = makeWsSync({ url })`,
56
+ });
57
+ }
58
+ const syncPayloadSchemaExport = (mod)?.syncPayloadSchema;
59
+ const syncPayloadSchema = syncPayloadSchemaExport === undefined
60
+ ? Schema.JsonValue
61
+ : Schema.isSchema(syncPayloadSchemaExport) === true
62
+ ? syncPayloadSchemaExport
63
+ : shouldNeverHappen(`Exported 'syncPayloadSchema' from ${abs} must be an Effect Schema (received ${typeof syncPayloadSchemaExport}).`);
64
+ const syncPayloadExport = (mod)?.syncPayload;
65
+ const syncPayload = yield* (syncPayloadExport === undefined
66
+ ? Effect.succeed(undefined)
67
+ : Schema.decodeUnknown(syncPayloadSchema)(syncPayloadExport)).pipe(UnknownError.mapToUnknownError);
68
+ return {
69
+ schema,
70
+ syncBackendConstructor,
71
+ syncPayloadSchema,
72
+ syncPayload,
73
+ };
74
+ }).pipe(Effect.withSpan('module-loader:loadModuleConfig'));
75
+ //# sourceMappingURL=module-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-loader.js","sourceRoot":"","sources":["../src/module-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Supported package managers for LiveStore projects.
3
+ * Yarn is explicitly not supported due to compatibility issues.
4
+ */
5
+ export type PackageManager = 'npm' | 'pnpm' | 'bun';
6
+ /**
7
+ * Result of package manager detection.
8
+ * Returns 'unsupported' for yarn to allow the CLI to show a warning message.
9
+ */
10
+ export type DetectPackageManagerResult = {
11
+ _tag: 'supported';
12
+ pm: PackageManager;
13
+ } | {
14
+ _tag: 'unsupported';
15
+ pm: 'yarn';
16
+ };
17
+ /**
18
+ * Detects the package manager used to invoke the CLI based on the `npm_config_user_agent`
19
+ * environment variable. This env var is set by npm, pnpm, yarn, and bun when running scripts.
20
+ *
21
+ * - Returns 'unsupported' for yarn so the CLI can show a recommendation to use bun instead
22
+ * - Falls back to 'bun' when detection fails (e.g., when run directly without a package manager)
23
+ */
24
+ export declare const detectPackageManager: (userAgent?: string) => DetectPackageManagerResult;
25
+ /** Package manager command templates */
26
+ export declare const pmCommands: {
27
+ readonly install: {
28
+ readonly npm: "npm install";
29
+ readonly pnpm: "pnpm install";
30
+ readonly bun: "bun install";
31
+ };
32
+ readonly run: {
33
+ readonly npm: (script: string) => string;
34
+ readonly pnpm: (script: string) => string;
35
+ readonly bun: (script: string) => string;
36
+ };
37
+ };
38
+ //# sourceMappingURL=package-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../src/package-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAA;AAEnD;;;GAGG;AACH,MAAM,MAAM,0BAA0B,GAAG;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,EAAE,EAAE,cAAc,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAA;AAExH;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAC/B,kBAAmD,KAClD,0BAQF,CAAA;AAED,wCAAwC;AACxC,eAAO,MAAM,UAAU;;;;;;;+BAOL,MAAM;gCACL,MAAM;+BACP,MAAM;;CAEd,CAAA"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Detects the package manager used to invoke the CLI based on the `npm_config_user_agent`
3
+ * environment variable. This env var is set by npm, pnpm, yarn, and bun when running scripts.
4
+ *
5
+ * - Returns 'unsupported' for yarn so the CLI can show a recommendation to use bun instead
6
+ * - Falls back to 'bun' when detection fails (e.g., when run directly without a package manager)
7
+ */
8
+ export const detectPackageManager = (userAgent = process.env.npm_config_user_agent ?? '') => {
9
+ if (userAgent.startsWith('bun/') === true)
10
+ return { _tag: 'supported', pm: 'bun' };
11
+ if (userAgent.startsWith('pnpm/') === true)
12
+ return { _tag: 'supported', pm: 'pnpm' };
13
+ if (userAgent.startsWith('npm/') === true)
14
+ return { _tag: 'supported', pm: 'npm' };
15
+ if (userAgent.startsWith('yarn/') === true)
16
+ return { _tag: 'unsupported', pm: 'yarn' };
17
+ // Default to bun when the package manager can't be detected
18
+ return { _tag: 'supported', pm: 'bun' };
19
+ };
20
+ /** Package manager command templates */
21
+ export const pmCommands = {
22
+ install: {
23
+ npm: 'npm install',
24
+ pnpm: 'pnpm install',
25
+ bun: 'bun install',
26
+ },
27
+ run: {
28
+ npm: (script) => `npm run ${script}`,
29
+ pnpm: (script) => `pnpm ${script}`,
30
+ bun: (script) => `bun ${script}`,
31
+ },
32
+ };
33
+ //# sourceMappingURL=package-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-manager.js","sourceRoot":"","sources":["../src/package-manager.ts"],"names":[],"mappings":"AAYA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,EACvB,EAAE;IAC9B,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,KAAK,EAAE,CAAA;IAClF,IAAI,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,CAAA;IACpF,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,KAAK,EAAE,CAAA;IAClF,IAAI,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,EAAE,CAAA;IAEtF,4DAA4D;IAC5D,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,KAAK,EAAE,CAAA;AACzC,CAAC,CAAA;AAED,wCAAwC;AACxC,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,OAAO,EAAE;QACP,GAAG,EAAE,aAAa;QAClB,IAAI,EAAE,cAAc;QACpB,GAAG,EAAE,aAAa;KACnB;IACD,GAAG,EAAE;QACH,GAAG,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,WAAW,MAAM,EAAE;QAC5C,IAAI,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,QAAQ,MAAM,EAAE;QAC1C,GAAG,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,OAAO,MAAM,EAAE;KACzC;CACO,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=package-manager.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-manager.test.d.ts","sourceRoot":"","sources":["../src/package-manager.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,57 @@
1
+ import { Vitest } from '@livestore/utils-dev/node-vitest';
2
+ import { detectPackageManager, pmCommands } from "./package-manager.js";
3
+ Vitest.describe('detectPackageManager', () => {
4
+ Vitest.it('detects npm from user agent', () => {
5
+ const result = detectPackageManager('npm/10.2.4 node/v20.11.0 darwin arm64 workspaces/false');
6
+ Vitest.expect(result).toEqual({ _tag: 'supported', pm: 'npm' });
7
+ });
8
+ Vitest.it('detects pnpm from user agent', () => {
9
+ const result = detectPackageManager('pnpm/9.0.6 npm/? node/v22.0.0 darwin arm64');
10
+ Vitest.expect(result).toEqual({ _tag: 'supported', pm: 'pnpm' });
11
+ });
12
+ Vitest.it('detects yarn as unsupported', () => {
13
+ const result = detectPackageManager('yarn/1.22.19 npm/? node/v20.11.0 darwin arm64');
14
+ Vitest.expect(result).toEqual({ _tag: 'unsupported', pm: 'yarn' });
15
+ });
16
+ Vitest.it('detects bun from user agent', () => {
17
+ const result = detectPackageManager('bun/1.1.7');
18
+ Vitest.expect(result).toEqual({ _tag: 'supported', pm: 'bun' });
19
+ });
20
+ Vitest.it('falls back to bun for empty user agent', () => {
21
+ const result = detectPackageManager('');
22
+ Vitest.expect(result).toEqual({ _tag: 'supported', pm: 'bun' });
23
+ });
24
+ Vitest.it('uses process.env.npm_config_user_agent when no argument provided', () => {
25
+ const originalEnv = process.env.npm_config_user_agent;
26
+ try {
27
+ process.env.npm_config_user_agent = 'pnpm/9.0.6';
28
+ const result = detectPackageManager();
29
+ Vitest.expect(result).toEqual({ _tag: 'supported', pm: 'pnpm' });
30
+ }
31
+ finally {
32
+ process.env.npm_config_user_agent = originalEnv;
33
+ }
34
+ });
35
+ Vitest.it('falls back to bun for unknown user agent', () => {
36
+ const result = detectPackageManager('some-unknown-tool/1.0.0');
37
+ Vitest.expect(result).toEqual({ _tag: 'supported', pm: 'bun' });
38
+ });
39
+ });
40
+ Vitest.describe('pmCommands', () => {
41
+ Vitest.it('provides correct install commands for each package manager', () => {
42
+ Vitest.expect(pmCommands.install.npm).toBe('npm install');
43
+ Vitest.expect(pmCommands.install.pnpm).toBe('pnpm install');
44
+ Vitest.expect(pmCommands.install.bun).toBe('bun install');
45
+ });
46
+ Vitest.it('provides correct run commands for dev script', () => {
47
+ Vitest.expect(pmCommands.run.npm('dev')).toBe('npm run dev');
48
+ Vitest.expect(pmCommands.run.pnpm('dev')).toBe('pnpm dev');
49
+ Vitest.expect(pmCommands.run.bun('dev')).toBe('bun dev');
50
+ });
51
+ Vitest.it('provides correct run commands for start script', () => {
52
+ Vitest.expect(pmCommands.run.npm('start')).toBe('npm run start');
53
+ Vitest.expect(pmCommands.run.pnpm('start')).toBe('pnpm start');
54
+ Vitest.expect(pmCommands.run.bun('start')).toBe('bun start');
55
+ });
56
+ });
57
+ //# sourceMappingURL=package-manager.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-manager.test.js","sourceRoot":"","sources":["../src/package-manager.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Shared sync operations for CLI and MCP.
3
+ * Contains the core logic for exporting and importing events from sync backends.
4
+ */
5
+ import type { SyncBackend } from '@livestore/common';
6
+ import { UnknownError } from '@livestore/common';
7
+ import { Effect, type FileSystem, type HttpClient, Schema, type Scope } from '@livestore/utils/effect';
8
+ /**
9
+ * Schema for the export file format.
10
+ * Contains metadata about the export and an array of events in global encoded format.
11
+ */
12
+ export declare const ExportFileSchema: Schema.Struct<{
13
+ /** Format version for future compatibility */
14
+ version: Schema.Literal<[1]>;
15
+ /** Store identifier */
16
+ storeId: typeof Schema.String;
17
+ /** ISO timestamp of when the export was created */
18
+ exportedAt: typeof Schema.String;
19
+ /** Total number of events in the export */
20
+ eventCount: typeof Schema.Number;
21
+ /** Array of events in global encoded format */
22
+ events: Schema.Array$<Schema.Struct<{
23
+ name: typeof Schema.String;
24
+ args: typeof Schema.Any;
25
+ seqNum: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">, number, never>;
26
+ parentSeqNum: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">, number, never>;
27
+ clientId: typeof Schema.String;
28
+ sessionId: typeof Schema.String;
29
+ }>>;
30
+ }>;
31
+ export type ExportFile = typeof ExportFileSchema.Type;
32
+ declare const ConnectionError_base: Schema.TaggedErrorClass<ConnectionError, "ConnectionError", {
33
+ readonly _tag: Schema.tag<"ConnectionError">;
34
+ } & {
35
+ cause: typeof Schema.Defect;
36
+ note: typeof Schema.String;
37
+ }>;
38
+ export declare class ConnectionError extends ConnectionError_base {
39
+ }
40
+ declare const ExportError_base: Schema.TaggedErrorClass<ExportError, "ExportError", {
41
+ readonly _tag: Schema.tag<"ExportError">;
42
+ } & {
43
+ cause: typeof Schema.Defect;
44
+ note: typeof Schema.String;
45
+ }>;
46
+ export declare class ExportError extends ExportError_base {
47
+ }
48
+ declare const ImportError_base: Schema.TaggedErrorClass<ImportError, "ImportError", {
49
+ readonly _tag: Schema.tag<"ImportError">;
50
+ } & {
51
+ cause: typeof Schema.Defect;
52
+ note: typeof Schema.String;
53
+ }>;
54
+ export declare class ImportError extends ImportError_base {
55
+ }
56
+ /**
57
+ * Creates a sync backend connection from a user module and verifies connectivity.
58
+ * This is a simplified version of the MCP runtime that only creates the sync backend.
59
+ */
60
+ export declare const makeSyncBackend: ({ configPath, storeId, clientId, }: {
61
+ /** Absolute or cwd-relative path to a module exporting `schema` and `syncBackend`. */
62
+ configPath: string;
63
+ /** Identifier to scope the backend connection. */
64
+ storeId: string;
65
+ /** Client identifier used when establishing the sync connection. */
66
+ clientId: string;
67
+ }) => Effect.Effect<SyncBackend.SyncBackend, UnknownError | ConnectionError, FileSystem.FileSystem | HttpClient.HttpClient | Scope.Scope>;
68
+ export interface ExportResult {
69
+ storeId: string;
70
+ eventCount: number;
71
+ exportedAt: string;
72
+ backendName: string;
73
+ /** The export data as JSON string (for MCP) or written to file (for CLI) */
74
+ data: ExportFile;
75
+ }
76
+ /**
77
+ * Core export operation - pulls all events from sync backend.
78
+ * Returns the export data structure without writing to file.
79
+ */
80
+ export declare const pullEventsFromSyncBackend: ({ configPath, storeId, clientId, }: {
81
+ configPath: string;
82
+ storeId: string;
83
+ clientId: string;
84
+ }) => Effect.Effect<ExportResult, ExportError | UnknownError | ConnectionError, FileSystem.FileSystem | HttpClient.HttpClient | Scope.Scope>;
85
+ export interface ImportResult {
86
+ storeId: string;
87
+ eventCount: number;
88
+ /** Whether this was a dry run */
89
+ dryRun: boolean;
90
+ backendName?: string;
91
+ }
92
+ export interface ImportValidationResult {
93
+ storeId: string;
94
+ eventCount: number;
95
+ sourceStoreId: string;
96
+ storeIdMismatch: boolean;
97
+ }
98
+ /**
99
+ * Validates an export file for import.
100
+ * Returns validation info without actually importing.
101
+ */
102
+ export declare const validateExportData: ({ data, targetStoreId, }: {
103
+ data: unknown;
104
+ targetStoreId: string;
105
+ }) => Effect.Effect<ImportValidationResult, ImportError>;
106
+ /**
107
+ * Core import operation - pushes events to sync backend.
108
+ * Validates that the backend is empty before importing.
109
+ */
110
+ export declare const pushEventsToSyncBackend: ({ configPath, storeId, clientId, data, force, dryRun, onProgress, }: {
111
+ configPath: string;
112
+ storeId: string;
113
+ clientId: string;
114
+ /** The export data to import (already parsed) */
115
+ data: unknown;
116
+ force: boolean;
117
+ dryRun: boolean;
118
+ onProgress?: (pushed: number, total: number) => Effect.Effect<void>;
119
+ }) => Effect.Effect<ImportResult, ImportError | UnknownError | ConnectionError, FileSystem.FileSystem | HttpClient.HttpClient | Scope.Scope>;
120
+ export {};
121
+ //# sourceMappingURL=sync-operations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-operations.d.ts","sourceRoot":"","sources":["../src/sync-operations.ts"],"names":[],"mappings":"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"}