@bassfish/cli 0.1.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 (69) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +153 -0
  3. package/dist/api.d.ts +365 -0
  4. package/dist/api.js +113 -0
  5. package/dist/api.js.map +1 -0
  6. package/dist/cli.d.ts +2 -0
  7. package/dist/cli.js +217 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/config.d.ts +20 -0
  10. package/dist/config.js +68 -0
  11. package/dist/config.js.map +1 -0
  12. package/dist/daemon.d.ts +4 -0
  13. package/dist/daemon.js +220 -0
  14. package/dist/daemon.js.map +1 -0
  15. package/dist/domain.d.ts +393 -0
  16. package/dist/domain.js +75 -0
  17. package/dist/domain.js.map +1 -0
  18. package/dist/export.d.ts +7 -0
  19. package/dist/export.js +37 -0
  20. package/dist/export.js.map +1 -0
  21. package/dist/ipc.d.ts +14 -0
  22. package/dist/ipc.js +125 -0
  23. package/dist/ipc.js.map +1 -0
  24. package/dist/lock.d.ts +2 -0
  25. package/dist/lock.js +18 -0
  26. package/dist/lock.js.map +1 -0
  27. package/dist/mcp.d.ts +16 -0
  28. package/dist/mcp.js +200 -0
  29. package/dist/mcp.js.map +1 -0
  30. package/dist/note-cli.d.ts +28 -0
  31. package/dist/note-cli.js +204 -0
  32. package/dist/note-cli.js.map +1 -0
  33. package/dist/note.d.ts +12 -0
  34. package/dist/note.js +181 -0
  35. package/dist/note.js.map +1 -0
  36. package/dist/repository.d.ts +1 -0
  37. package/dist/repository.js +21 -0
  38. package/dist/repository.js.map +1 -0
  39. package/dist/runtime.d.ts +12 -0
  40. package/dist/runtime.js +32 -0
  41. package/dist/runtime.js.map +1 -0
  42. package/dist/service.d.ts +106 -0
  43. package/dist/service.js +1185 -0
  44. package/dist/service.js.map +1 -0
  45. package/dist/setup.d.ts +21 -0
  46. package/dist/setup.js +108 -0
  47. package/dist/setup.js.map +1 -0
  48. package/dist/sql-worker.d.ts +6 -0
  49. package/dist/sql-worker.js +76 -0
  50. package/dist/sql-worker.js.map +1 -0
  51. package/dist/storage/control.d.ts +10 -0
  52. package/dist/storage/control.js +160 -0
  53. package/dist/storage/control.js.map +1 -0
  54. package/dist/storage/dolt.d.ts +32 -0
  55. package/dist/storage/dolt.js +494 -0
  56. package/dist/storage/dolt.js.map +1 -0
  57. package/dist/storage/search.d.ts +22 -0
  58. package/dist/storage/search.js +75 -0
  59. package/dist/storage/search.js.map +1 -0
  60. package/dist/supervisor.d.ts +11 -0
  61. package/dist/supervisor.js +97 -0
  62. package/dist/supervisor.js.map +1 -0
  63. package/dist/tasks.d.ts +52 -0
  64. package/dist/tasks.js +33 -0
  65. package/dist/tasks.js.map +1 -0
  66. package/dist/thread-cli.d.ts +2 -0
  67. package/dist/thread-cli.js +64 -0
  68. package/dist/thread-cli.js.map +1 -0
  69. package/package.json +64 -0
@@ -0,0 +1,75 @@
1
+ import { DatabaseSync } from 'node:sqlite';
2
+ import { mkdirSync } from 'node:fs';
3
+ import { dirname } from 'node:path';
4
+ /** Disposable current-state index. A head mismatch always triggers a full rebuild from Dolt. */
5
+ export class NoteSearchIndex {
6
+ db;
7
+ constructor(path) {
8
+ mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
9
+ this.db = new DatabaseSync(path);
10
+ this.db.exec(`PRAGMA journal_mode=WAL; PRAGMA synchronous=FULL;
11
+ CREATE TABLE IF NOT EXISTS indexedProjects(projectId TEXT PRIMARY KEY, doltHead TEXT NOT NULL);
12
+ CREATE TABLE IF NOT EXISTS indexedHistoryProjects(projectId TEXT PRIMARY KEY, doltHead TEXT NOT NULL);
13
+ CREATE VIRTUAL TABLE IF NOT EXISTS noteIndex USING fts5(projectId UNINDEXED,noteId UNINDEXED,revision UNINDEXED,path,title,labels,noteKind,body,state UNINDEXED);
14
+ CREATE VIRTUAL TABLE IF NOT EXISTS noteHistoryIndex USING fts5(projectId UNINDEXED,noteId UNINDEXED,revision UNINDEXED,doltCommit UNINDEXED,changedAt UNINDEXED,path,title,labels,noteKind,body,state UNINDEXED);`);
15
+ }
16
+ ensure(projectId, head, notes) {
17
+ const row = this.db.prepare('SELECT doltHead FROM indexedProjects WHERE projectId=?').get(projectId);
18
+ if (row?.doltHead === head)
19
+ return;
20
+ this.db.exec('BEGIN IMMEDIATE');
21
+ try {
22
+ this.db.prepare('DELETE FROM noteIndex WHERE projectId=?').run(projectId);
23
+ const insert = this.db.prepare('INSERT INTO noteIndex VALUES(?,?,?,?,?,?,?,?,?)');
24
+ for (const note of notes)
25
+ insert.run(projectId, note.id, note.revision, note.path, note.title, note.labels.join(' '), note.kind ?? '', note.body, note.state);
26
+ this.db.prepare('INSERT INTO indexedProjects VALUES(?,?) ON CONFLICT(projectId) DO UPDATE SET doltHead=excluded.doltHead').run(projectId, head);
27
+ this.db.exec('COMMIT');
28
+ }
29
+ catch (error) {
30
+ this.db.exec('ROLLBACK');
31
+ throw error;
32
+ }
33
+ }
34
+ search(projectId, query, states, limit, offset) {
35
+ const placeholders = states.map(() => '?').join(',');
36
+ const rows = this.db.prepare(`SELECT noteId,path,revision,snippet(noteIndex,7,'[',']','…',16) AS snippet FROM noteIndex
37
+ WHERE projectId=? AND noteIndex MATCH ? AND state IN (${placeholders}) ORDER BY rank,path,noteId LIMIT ? OFFSET ?`).all(projectId, query, ...states, limit, offset);
38
+ return rows.map(row => ({ noteId: String(row.noteId), path: String(row.path), revision: String(row.revision), snippet: Buffer.from(String(row.snippet)).subarray(0, 512).toString('utf8') }));
39
+ }
40
+ ensureHistory(projectId, head, notes) {
41
+ const row = this.db.prepare('SELECT doltHead FROM indexedHistoryProjects WHERE projectId=?').get(projectId);
42
+ if (row?.doltHead === head)
43
+ return;
44
+ this.db.exec('BEGIN IMMEDIATE');
45
+ try {
46
+ this.db.prepare('DELETE FROM noteHistoryIndex WHERE projectId=?').run(projectId);
47
+ const insert = this.db.prepare('INSERT INTO noteHistoryIndex VALUES(?,?,?,?,?,?,?,?,?,?,?)');
48
+ const seen = new Set();
49
+ for (const entry of notes) {
50
+ const note = entry.note;
51
+ const key = `${note.id}:${note.revision}`;
52
+ if (seen.has(key))
53
+ continue;
54
+ seen.add(key);
55
+ insert.run(projectId, note.id, note.revision, entry.doltCommit, entry.changedAt, note.path, note.title, note.labels.join(' '), note.kind ?? '', note.body, note.state);
56
+ }
57
+ this.db.prepare('INSERT INTO indexedHistoryProjects VALUES(?,?) ON CONFLICT(projectId) DO UPDATE SET doltHead=excluded.doltHead').run(projectId, head);
58
+ this.db.exec('COMMIT');
59
+ }
60
+ catch (error) {
61
+ this.db.exec('ROLLBACK');
62
+ throw error;
63
+ }
64
+ }
65
+ searchHistory(projectId, query, states, noteId, limit, offset) {
66
+ const placeholders = states.map(() => '?').join(',');
67
+ const rows = this.db.prepare(`SELECT noteId,path,revision,doltCommit,changedAt,state,snippet(noteHistoryIndex,9,'[',']','…',16) AS snippet FROM noteHistoryIndex
68
+ WHERE projectId=? AND noteHistoryIndex MATCH ? AND state IN (${placeholders}) ${noteId ? 'AND noteId=?' : ''}
69
+ ORDER BY rank,changedAt DESC,noteId,revision LIMIT ? OFFSET ?`).all(projectId, query, ...states, ...(noteId ? [noteId] : []), limit, offset);
70
+ return rows.map(row => ({ noteId: String(row.noteId), path: String(row.path), revision: String(row.revision), doltCommit: String(row.doltCommit),
71
+ changedAt: String(row.changedAt), state: String(row.state), snippet: Buffer.from(String(row.snippet)).subarray(0, 512).toString('utf8') }));
72
+ }
73
+ close() { this.db.close(); }
74
+ }
75
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/storage/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { SqlEndpoint } from './sql-worker.js';
2
+ export declare function entryArgs(command: string, ...args: string[]): string[];
3
+ export interface SupervisedSql {
4
+ endpoint: SqlEndpoint;
5
+ guardianPid: number;
6
+ alive: () => boolean;
7
+ ended: Promise<void>;
8
+ close: () => Promise<void>;
9
+ }
10
+ export declare function requireDolt(binary: string): Promise<string>;
11
+ export declare function startSql(dataDir: string, binary: string): Promise<SupervisedSql>;
@@ -0,0 +1,97 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { createInterface } from 'node:readline';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { setTimeout as delay } from 'node:timers/promises';
5
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
6
+ import { join } from 'node:path';
7
+ import mysql from 'mysql2/promise';
8
+ import { BassfishError } from './domain.js';
9
+ import { DOLT_VERSION, readDoltVersion } from './setup.js';
10
+ export function entryArgs(command, ...args) {
11
+ const entry = fileURLToPath(new URL('./cli.js', import.meta.url));
12
+ return import.meta.url.endsWith('.ts') ? ['--import', 'tsx', entry.replace(/\.js$/, '.ts'), command, ...args] : [entry, command, ...args];
13
+ }
14
+ export async function requireDolt(binary) {
15
+ const version = await readDoltVersion(binary);
16
+ if (!version)
17
+ throw new BassfishError('DOLT_UNAVAILABLE', `Run bassfish setup to install Dolt ${DOLT_VERSION}, or set BASSFISH_DOLT_BIN.`);
18
+ if (version !== DOLT_VERSION)
19
+ throw new BassfishError('DOLT_VERSION', `Bassfish requires Dolt ${DOLT_VERSION}. Run bassfish setup or correct BASSFISH_DOLT_BIN.`);
20
+ return version;
21
+ }
22
+ export async function startSql(dataDir, binary) {
23
+ const isolatedConfig = join(dataDir, 'dolt-config', '.dolt');
24
+ await mkdir(isolatedConfig, { recursive: true, mode: 0o700 });
25
+ const configPath = join(isolatedConfig, 'config_global.json');
26
+ let config = {};
27
+ try {
28
+ config = JSON.parse(await readFile(configPath, 'utf8'));
29
+ }
30
+ catch (error) {
31
+ if (error.code !== 'ENOENT')
32
+ throw error;
33
+ }
34
+ // This is Bassfish's own Dolt configuration, never the user's global Dolt config.
35
+ if (config['metrics.disabled'] !== 'true')
36
+ await writeFile(configPath, JSON.stringify({ ...config, 'metrics.disabled': 'true' }), { mode: 0o600 });
37
+ await requireDolt(binary);
38
+ const child = spawn(process.execPath, entryArgs('sql-worker', dataDir, binary), { cwd: fileURLToPath(new URL('..', import.meta.url)), stdio: ['pipe', 'pipe', 'pipe'], detached: process.platform !== 'win32' });
39
+ let stderr = '';
40
+ child.stderr.on('data', data => { stderr = (stderr + String(data)).slice(-4000); });
41
+ child.stdin.on('error', () => { });
42
+ let closing = false;
43
+ const ended = new Promise(resolve => child.once('exit', () => {
44
+ if (!closing && process.platform !== 'win32' && child.pid) {
45
+ // The guardian and Dolt share a private process group. If the guardian itself
46
+ // dies, kill any orphaned SQL process before the daemon can continue.
47
+ try {
48
+ process.kill(-child.pid, 'SIGKILL');
49
+ }
50
+ catch { }
51
+ }
52
+ resolve();
53
+ }));
54
+ const close = async () => { closing = true; child.stdin.end(); await reap(child); };
55
+ try {
56
+ const endpoint = await new Promise((resolve, reject) => {
57
+ const lines = createInterface({ input: child.stdout });
58
+ const timer = setTimeout(() => reject(new Error('SQL guardian readiness timeout')), 15_000);
59
+ lines.once('line', line => { clearTimeout(timer); try {
60
+ resolve(JSON.parse(line));
61
+ }
62
+ catch (error) {
63
+ reject(error);
64
+ } });
65
+ child.once('error', error => { clearTimeout(timer); reject(error); });
66
+ child.once('exit', () => { clearTimeout(timer); reject(new Error(`SQL guardian exited: ${stderr}`)); });
67
+ });
68
+ const deadline = performance.now() + 20_000;
69
+ while (true) {
70
+ if (child.exitCode !== null)
71
+ throw new Error(`Dolt failed to start: ${stderr}`);
72
+ try {
73
+ const connection = await mysql.createConnection({ ...endpoint, user: 'root', connectTimeout: 500 });
74
+ await connection.ping();
75
+ await connection.end();
76
+ break;
77
+ }
78
+ catch (error) {
79
+ if (performance.now() >= deadline)
80
+ throw new Error(`Dolt readiness failed: ${String(error)} ${stderr}`);
81
+ await delay(100);
82
+ }
83
+ }
84
+ return { endpoint, guardianPid: child.pid, alive: () => child.exitCode === null && child.signalCode === null, ended, close };
85
+ }
86
+ catch (error) {
87
+ await close();
88
+ throw error;
89
+ }
90
+ }
91
+ async function reap(child) {
92
+ if (child.exitCode !== null || child.signalCode !== null)
93
+ return;
94
+ // Never force-kill the guardian: it owns the exclusion lock until Dolt has actually exited.
95
+ await new Promise(resolve => child.once('exit', () => resolve()));
96
+ }
97
+ //# sourceMappingURL=supervisor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../src/supervisor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { z } from 'zod';
2
+ /** Immutable Bassfish runtime subset of io.modelcontextprotocol/tasks@2026-07-28. */
3
+ export declare const tasksExtensionId: 'io.modelcontextprotocol/tasks';
4
+ export declare const getTaskParams: z.ZodObject<{
5
+ taskId: z.ZodString;
6
+ }, z.core.$strict>;
7
+ export declare const cancelTaskParams: z.ZodObject<{
8
+ taskId: z.ZodString;
9
+ }, z.core.$strict>;
10
+ export declare const updateTaskParams: z.ZodObject<{
11
+ taskId: z.ZodString;
12
+ inputResponses: z.ZodRecord<z.ZodString, z.ZodUnknown>;
13
+ }, z.core.$strict>;
14
+ export declare const taskResult: z.ZodObject<{
15
+ taskId: z.ZodString;
16
+ status: z.ZodEnum<{
17
+ cancelled: "cancelled";
18
+ completed: "completed";
19
+ failed: "failed";
20
+ input_required: "input_required";
21
+ working: "working";
22
+ }>;
23
+ statusMessage: z.ZodOptional<z.ZodString>;
24
+ createdAt: z.ZodString;
25
+ lastUpdatedAt: z.ZodString;
26
+ ttlMs: z.ZodNullable<z.ZodNumber>;
27
+ pollIntervalMs: z.ZodOptional<z.ZodNumber>;
28
+ resultType: z.ZodLiteral<"complete">;
29
+ }, z.core.$loose>;
30
+ export declare const createTaskResult: z.ZodObject<{
31
+ taskId: z.ZodString;
32
+ status: z.ZodEnum<{
33
+ cancelled: "cancelled";
34
+ completed: "completed";
35
+ failed: "failed";
36
+ input_required: "input_required";
37
+ working: "working";
38
+ }>;
39
+ statusMessage: z.ZodOptional<z.ZodString>;
40
+ createdAt: z.ZodString;
41
+ lastUpdatedAt: z.ZodString;
42
+ ttlMs: z.ZodNullable<z.ZodNumber>;
43
+ pollIntervalMs: z.ZodOptional<z.ZodNumber>;
44
+ resultType: z.ZodLiteral<"task">;
45
+ }, z.core.$loose>;
46
+ export declare const taskAck: z.ZodObject<{
47
+ resultType: z.ZodLiteral<"complete">;
48
+ }, z.core.$loose>;
49
+ export declare function hasTasksCapability(envelope: unknown): boolean;
50
+ export declare function toolResult(value: unknown): Record<string, unknown>;
51
+ export declare function wireTask(value: Record<string, unknown>, resultType: 'task' | 'complete'): Record<string, unknown>;
52
+ export declare function wireTaskNotification(value: Record<string, unknown>): Record<string, unknown>;
package/dist/tasks.js ADDED
@@ -0,0 +1,33 @@
1
+ import { z } from 'zod';
2
+ /** Immutable Bassfish runtime subset of io.modelcontextprotocol/tasks@2026-07-28. */
3
+ export const tasksExtensionId = 'io.modelcontextprotocol/tasks';
4
+ const taskId = z.string().min(1).max(200);
5
+ const baseTask = z.object({ taskId, status: z.enum(['working', 'input_required', 'completed', 'failed', 'cancelled']), statusMessage: z.string().optional(),
6
+ createdAt: z.string().datetime(), lastUpdatedAt: z.string().datetime(), ttlMs: z.number().int().nonnegative().nullable(), pollIntervalMs: z.number().int().nonnegative().optional() }).passthrough();
7
+ export const getTaskParams = z.object({ taskId }).strict();
8
+ export const cancelTaskParams = z.object({ taskId }).strict();
9
+ export const updateTaskParams = z.object({ taskId, inputResponses: z.record(z.string(), z.unknown()) }).strict();
10
+ export const taskResult = baseTask.extend({ resultType: z.literal('complete') }).passthrough();
11
+ export const createTaskResult = baseTask.extend({ resultType: z.literal('task') }).passthrough();
12
+ export const taskAck = z.object({ resultType: z.literal('complete') }).passthrough();
13
+ export function hasTasksCapability(envelope) {
14
+ const value = envelope;
15
+ const capabilities = (value?.clientCapabilities ?? value?.['io.modelcontextprotocol/clientCapabilities']);
16
+ return Boolean(capabilities?.extensions && Object.hasOwn(capabilities.extensions, tasksExtensionId));
17
+ }
18
+ export function toolResult(value) {
19
+ return { content: [{ type: 'text', text: JSON.stringify(value) }], structuredContent: value };
20
+ }
21
+ export function wireTask(value, resultType) {
22
+ const output = { ...value, resultType };
23
+ if (value.status === 'completed' && value.result)
24
+ output.result = toolResult(value.result);
25
+ return output;
26
+ }
27
+ export function wireTaskNotification(value) {
28
+ const output = { ...value };
29
+ if (value.status === 'completed' && value.result)
30
+ output.result = toolResult(value.result);
31
+ return output;
32
+ }
33
+ //# sourceMappingURL=tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../src/tasks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Call } from './note-cli.js';
2
+ export declare function runThreadCli(action: string | undefined, args: string[], call: Call): Promise<unknown>;
@@ -0,0 +1,64 @@
1
+ import { BassfishError, requireThat } from './domain.js';
2
+ import { acquire, booleanFlag, mutation, release, take } from './note-cli.js';
3
+ function threadState(args) {
4
+ const archived = booleanFlag(args, '--archived');
5
+ const deleted = booleanFlag(args, '--deleted');
6
+ requireThat(!(archived && deleted), 'INVALID_ARGUMENT', 'Choose at most one of --archived or --deleted.');
7
+ return archived ? 'archived' : deleted ? 'deleted' : 'active';
8
+ }
9
+ function limit(args) {
10
+ const raw = take(args, '--limit');
11
+ if (raw === undefined)
12
+ return undefined;
13
+ requireThat(/^[1-9][0-9]*$/.test(raw), 'INVALID_ARGUMENT', '--limit takes a positive integer.');
14
+ return Number(raw);
15
+ }
16
+ export async function runThreadCli(action, args, call) {
17
+ if (action === 'list') {
18
+ const state = threadState(args);
19
+ const input = { state, limit: limit(args), cursor: take(args, '--cursor'), creatorIdentityId: take(args, '--creator'), titlePrefix: take(args, '--title-prefix') };
20
+ requireThat(args.length === 0, 'INVALID_ARGUMENT', 'Unknown thread list argument.');
21
+ return call('listThreads', input);
22
+ }
23
+ if (action === 'create') {
24
+ const description = take(args, '--description') ?? '';
25
+ const title = args.shift();
26
+ requireThat(title && args.length === 0, 'INVALID_ARGUMENT', 'Pass one quoted thread title.');
27
+ return call('createThread', { title, description });
28
+ }
29
+ if (action === 'search') {
30
+ const query = args.shift();
31
+ const state = threadState(args);
32
+ const input = { query, state, limit: limit(args) };
33
+ requireThat(query && args.length === 0, 'INVALID_ARGUMENT', 'Use thread search QUERY [--archived|--deleted] [--limit N].');
34
+ return call('searchThreads', input);
35
+ }
36
+ const id = args.shift();
37
+ requireThat(id, 'INVALID_ARGUMENT', 'Pass a thread ID.');
38
+ if (action === 'get') {
39
+ requireThat(args.length === 0, 'INVALID_ARGUMENT', 'Unknown thread get argument.');
40
+ return call('getThread', { threadId: id });
41
+ }
42
+ if (action === 'show') {
43
+ requireThat(args.length === 0, 'INVALID_ARGUMENT', 'Unknown thread show argument.');
44
+ const floor = await acquire(call, 'thread', id);
45
+ try {
46
+ return floor;
47
+ }
48
+ finally {
49
+ await release(call, floor);
50
+ }
51
+ }
52
+ if (action === 'describe') {
53
+ const description = take(args, '--description');
54
+ const clear = booleanFlag(args, '--clear');
55
+ requireThat((description !== undefined) !== clear && args.length === 0, 'INVALID_ARGUMENT', 'Use thread describe THREAD_ID (--description TEXT | --clear).');
56
+ return mutation(call, 'thread', id, { kind: 'setThreadDescription', description: description ?? '' });
57
+ }
58
+ if (action === 'delete') {
59
+ requireThat(args.length === 0, 'INVALID_ARGUMENT', 'Unknown thread delete argument.');
60
+ return mutation(call, 'thread', id, { kind: 'deleteThread' });
61
+ }
62
+ throw new BassfishError('INVALID_ARGUMENT', 'Unknown thread command.');
63
+ }
64
+ //# sourceMappingURL=thread-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-cli.js","sourceRoot":"","sources":["../src/thread-cli.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "@bassfish/cli",
3
+ "version": "0.1.0",
4
+ "description": "Local agent communication with persistent exclusive floors and Dolt content history",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/tfukaza/bassfish.git"
9
+ },
10
+ "homepage": "https://github.com/tfukaza/bassfish#readme",
11
+ "bugs": {
12
+ "url": "https://github.com/tfukaza/bassfish/issues"
13
+ },
14
+ "keywords": [
15
+ "agents",
16
+ "mcp",
17
+ "model-context-protocol",
18
+ "collaboration",
19
+ "dolt"
20
+ ],
21
+ "type": "module",
22
+ "engines": {
23
+ "node": ">=24.12.0 <25"
24
+ },
25
+ "bin": {
26
+ "bassfish": "dist/cli.js"
27
+ },
28
+ "files": [
29
+ "dist",
30
+ "README.md",
31
+ "LICENSE"
32
+ ],
33
+ "publishConfig": {
34
+ "access": "public",
35
+ "registry": "https://registry.npmjs.org/"
36
+ },
37
+ "scripts": {
38
+ "build": "tsc -p tsconfig.build.json",
39
+ "check": "tsc --noEmit",
40
+ "test": "node --import tsx --test test/*.test.ts",
41
+ "test:integration": "node --import tsx --test --test-concurrency=1 test/integration/*.test.ts",
42
+ "test:hosts": "node scripts/host-smoke.mjs",
43
+ "test:soak": "node scripts/soak.mjs",
44
+ "package:check": "node scripts/package-smoke.mjs",
45
+ "release:check": "npm run ci && npm run package:check && npm run test:hosts",
46
+ "ci": "npm run check && npm test && npm run build && npm run test:integration",
47
+ "dev": "tsx src/cli.ts",
48
+ "setup:dolt": "tsx src/cli.ts setup",
49
+ "prepack": "npm run build"
50
+ },
51
+ "dependencies": {
52
+ "@modelcontextprotocol/server": "2.0.0",
53
+ "fflate": "^0.8.2",
54
+ "mysql2": "3.24.3",
55
+ "re2-wasm": "^1.0.2",
56
+ "zod": "4.5.4"
57
+ },
58
+ "devDependencies": {
59
+ "@modelcontextprotocol/client": "2.0.0",
60
+ "@types/node": "24.13.3",
61
+ "tsx": "4.23.13",
62
+ "typescript": "7.0.2"
63
+ }
64
+ }