traqr-memory-mcp 0.1.4 → 0.1.6

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.
@@ -0,0 +1,223 @@
1
+ /**
2
+ * --install — Interactive Setup Wizard
3
+ *
4
+ * Detects MCP client, asks 2-3 questions, writes config.
5
+ * Uses @clack/prompts for polished interactive UI.
6
+ *
7
+ * Usage: npx traqr-memory-mcp --install
8
+ */
9
+ import * as p from '@clack/prompts';
10
+ import { writeFileSync } from 'node:fs';
11
+ import { detectMcpClients, readClientConfig } from './detect-client.js';
12
+ import { buildMcpConfig, formatConfig } from './config-templates.js';
13
+ async function run() {
14
+ p.intro('TraqrDB Memory — Setup Wizard');
15
+ // Step 1: Detect MCP clients
16
+ const clients = detectMcpClients();
17
+ let targetClient = null;
18
+ if (clients.length === 1) {
19
+ p.log.info(`Detected ${clients[0].name} at ${clients[0].configPath}`);
20
+ targetClient = clients[0];
21
+ }
22
+ else if (clients.length > 1) {
23
+ const choice = await p.select({
24
+ message: 'Multiple MCP clients detected. Which one?',
25
+ options: [
26
+ ...clients.map(c => ({ label: c.name, value: c.configPath })),
27
+ { label: 'Print config to terminal (manual setup)', value: '__stdout__' },
28
+ ],
29
+ });
30
+ if (p.isCancel(choice)) {
31
+ p.cancel('Setup cancelled.');
32
+ process.exit(0);
33
+ }
34
+ if (choice !== '__stdout__') {
35
+ targetClient = clients.find(c => c.configPath === choice) || null;
36
+ }
37
+ }
38
+ else {
39
+ p.log.warn('No MCP client config detected. Config will be printed to terminal.');
40
+ }
41
+ // Step 2: Database provider
42
+ const db = await p.select({
43
+ message: 'Where is your database?',
44
+ options: [
45
+ { label: 'Supabase', value: 'supabase', hint: 'easiest — free tier at supabase.com' },
46
+ { label: 'Postgres', value: 'postgres', hint: 'RDS, Aurora, Docker, any Postgres 15+ with pgvector' },
47
+ { label: "I don't have one yet", value: 'none', hint: 'we\'ll help you set one up' },
48
+ ],
49
+ });
50
+ if (p.isCancel(db)) {
51
+ p.cancel('Setup cancelled.');
52
+ process.exit(0);
53
+ }
54
+ if (db === 'none') {
55
+ p.log.info('Create a free Supabase project at https://supabase.com');
56
+ p.log.info('Then run this wizard again with your project URL and service role key.');
57
+ p.outro('Come back when your database is ready!');
58
+ process.exit(0);
59
+ }
60
+ // Step 3: Collect DB credentials
61
+ const answers = { db: db, embedding: 'none' };
62
+ if (db === 'supabase') {
63
+ const url = await p.text({
64
+ message: 'Supabase project URL',
65
+ placeholder: 'https://xxx.supabase.co',
66
+ validate: (v) => v && !v.includes('supabase.co') ? 'Should be a Supabase URL (https://xxx.supabase.co)' : undefined,
67
+ });
68
+ if (p.isCancel(url)) {
69
+ p.cancel('Setup cancelled.');
70
+ process.exit(0);
71
+ }
72
+ answers.supabaseUrl = url;
73
+ const key = await p.text({
74
+ message: 'Supabase service role key',
75
+ placeholder: 'eyJ...',
76
+ validate: (v) => v && !v.startsWith('eyJ') ? 'Service role key starts with eyJ (not the anon key)' : undefined,
77
+ });
78
+ if (p.isCancel(key)) {
79
+ p.cancel('Setup cancelled.');
80
+ process.exit(0);
81
+ }
82
+ answers.supabaseKey = key;
83
+ }
84
+ else {
85
+ const url = await p.text({
86
+ message: 'Postgres connection string',
87
+ placeholder: 'postgresql://user:pass@host:5432/dbname',
88
+ validate: (v) => v && !v.startsWith('postgres') ? 'Should start with postgresql:// or postgres://' : undefined,
89
+ });
90
+ if (p.isCancel(url)) {
91
+ p.cancel('Setup cancelled.');
92
+ process.exit(0);
93
+ }
94
+ answers.databaseUrl = url;
95
+ }
96
+ // Step 4: Embedding provider
97
+ const embedding = await p.select({
98
+ message: 'Which embedding provider?',
99
+ options: [
100
+ { label: 'OpenAI', value: 'openai', hint: 'text-embedding-3-small — $0.02/1M tokens' },
101
+ { label: 'Gemini', value: 'gemini', hint: 'gemini-embedding-001 — free tier available' },
102
+ { label: 'Amazon Bedrock', value: 'bedrock', hint: 'Nova Embeddings — uses AWS credentials' },
103
+ { label: 'Ollama', value: 'ollama', hint: 'local models — no API key needed' },
104
+ { label: 'None', value: 'none', hint: 'BM25 keyword search only — no embeddings' },
105
+ ],
106
+ });
107
+ if (p.isCancel(embedding)) {
108
+ p.cancel('Setup cancelled.');
109
+ process.exit(0);
110
+ }
111
+ answers.embedding = embedding;
112
+ // Step 5: Collect embedding credentials
113
+ switch (embedding) {
114
+ case 'openai': {
115
+ const key = await p.text({
116
+ message: 'OpenAI API key',
117
+ placeholder: 'sk-...',
118
+ validate: (v) => v && !v.startsWith('sk-') ? 'OpenAI keys start with sk-' : undefined,
119
+ });
120
+ if (p.isCancel(key)) {
121
+ p.cancel('Setup cancelled.');
122
+ process.exit(0);
123
+ }
124
+ answers.openaiKey = key;
125
+ break;
126
+ }
127
+ case 'gemini': {
128
+ const key = await p.text({
129
+ message: 'Google API key',
130
+ placeholder: 'AIza...',
131
+ });
132
+ if (p.isCancel(key)) {
133
+ p.cancel('Setup cancelled.');
134
+ process.exit(0);
135
+ }
136
+ answers.googleKey = key;
137
+ break;
138
+ }
139
+ case 'bedrock': {
140
+ const region = await p.text({
141
+ message: 'AWS region',
142
+ placeholder: 'us-east-1',
143
+ initialValue: 'us-east-1',
144
+ });
145
+ if (p.isCancel(region)) {
146
+ p.cancel('Setup cancelled.');
147
+ process.exit(0);
148
+ }
149
+ answers.awsRegion = region;
150
+ p.log.info('Bedrock uses your AWS credentials (IAM role, env vars, or ~/.aws/credentials).');
151
+ p.log.info('Make sure the role has bedrock:InvokeModel permission.');
152
+ break;
153
+ }
154
+ case 'ollama': {
155
+ const url = await p.text({
156
+ message: 'Ollama URL',
157
+ placeholder: 'http://localhost:11434',
158
+ initialValue: 'http://localhost:11434',
159
+ });
160
+ if (p.isCancel(url)) {
161
+ p.cancel('Setup cancelled.');
162
+ process.exit(0);
163
+ }
164
+ answers.ollamaUrl = url;
165
+ break;
166
+ }
167
+ // 'none' needs no credentials
168
+ }
169
+ // Step 6: Build config
170
+ const config = buildMcpConfig(answers);
171
+ const configJson = formatConfig(config);
172
+ // Step 7: Write or print config
173
+ if (targetClient) {
174
+ const existingConfig = readClientConfig(targetClient);
175
+ const servers = existingConfig[targetClient.configKey] || {};
176
+ if (servers['traqr-memory']) {
177
+ const overwrite = await p.confirm({
178
+ message: 'traqr-memory already exists in your config. Overwrite?',
179
+ });
180
+ if (p.isCancel(overwrite) || !overwrite) {
181
+ p.log.info('Existing config preserved. Here\'s the new config for reference:');
182
+ console.log('\n' + configJson + '\n');
183
+ p.outro('Add it manually if needed.');
184
+ process.exit(0);
185
+ }
186
+ }
187
+ servers['traqr-memory'] = config['traqr-memory'];
188
+ existingConfig[targetClient.configKey] = servers;
189
+ try {
190
+ writeFileSync(targetClient.configPath, JSON.stringify(existingConfig, null, 2) + '\n');
191
+ p.log.success(`Written to ${targetClient.configPath}`);
192
+ }
193
+ catch (err) {
194
+ p.log.error(`Failed to write config: ${err instanceof Error ? err.message : err}`);
195
+ p.log.info('Add this to your MCP config manually:');
196
+ console.log('\n' + configJson + '\n');
197
+ }
198
+ }
199
+ else {
200
+ p.log.info('Add this to your MCP client config:');
201
+ console.log('\n' + configJson + '\n');
202
+ }
203
+ // Step 8: Next steps
204
+ p.log.step('Next steps:');
205
+ if (db === 'supabase') {
206
+ p.log.info('1. Run setup.sql in your Supabase SQL Editor');
207
+ p.log.info(' Get it: npx traqr-memory-mcp --setup');
208
+ }
209
+ else {
210
+ p.log.info('1. Run: npx traqr-memory-mcp --setup');
211
+ p.log.info(' This will create the schema in your Postgres database');
212
+ }
213
+ p.log.info('2. Restart your MCP client');
214
+ p.log.info('3. Run: npx traqr-memory-mcp --verify');
215
+ p.log.info('4. Optional: npx traqr-memory-mcp --print-instructions');
216
+ p.log.info(' Prints a CLAUDE.md section that teaches Claude how to use memory proactively');
217
+ p.outro('Setup complete! Restart your MCP client to connect.');
218
+ }
219
+ run().catch((err) => {
220
+ console.error('Setup failed:', err instanceof Error ? err.message : err);
221
+ process.exit(1);
222
+ });
223
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/cli/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * --print-instructions — Print MEMORY_INSTRUCTIONS.md to stdout
3
+ *
4
+ * Users paste this into their CLAUDE.md to teach Claude
5
+ * how to use memory proactively.
6
+ *
7
+ * Usage: npx traqr-memory-mcp --print-instructions
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=instructions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instructions.d.ts","sourceRoot":"","sources":["../../src/cli/instructions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * --print-instructions — Print MEMORY_INSTRUCTIONS.md to stdout
3
+ *
4
+ * Users paste this into their CLAUDE.md to teach Claude
5
+ * how to use memory proactively.
6
+ *
7
+ * Usage: npx traqr-memory-mcp --print-instructions
8
+ */
9
+ import { readFileSync } from 'node:fs';
10
+ import { fileURLToPath } from 'node:url';
11
+ import { dirname, join } from 'node:path';
12
+ const __dirname = dirname(fileURLToPath(import.meta.url));
13
+ try {
14
+ const content = readFileSync(join(__dirname, '..', 'MEMORY_INSTRUCTIONS.md'), 'utf-8');
15
+ console.log(content);
16
+ }
17
+ catch {
18
+ console.error('MEMORY_INSTRUCTIONS.md not found.');
19
+ console.error('If installed via npm, it should be at: node_modules/traqr-memory-mcp/MEMORY_INSTRUCTIONS.md');
20
+ process.exit(1);
21
+ }
22
+ //# sourceMappingURL=instructions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../src/cli/instructions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEzC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAEzD,IAAI,CAAC;IACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,wBAAwB,CAAC,EAAE,OAAO,CAAC,CAAA;IACtF,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;AACtB,CAAC;AAAC,MAAM,CAAC;IACP,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAA;IAClD,OAAO,CAAC,KAAK,CAAC,6FAA6F,CAAC,CAAA;IAC5G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * --setup — Run setup.sql on configured database
3
+ *
4
+ * For Postgres: executes setup.sql directly via pg.
5
+ * For Supabase: prints the SQL with instructions to paste into SQL Editor.
6
+ *
7
+ * Usage: npx traqr-memory-mcp --setup
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=setup-db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-db.d.ts","sourceRoot":"","sources":["../../src/cli/setup-db.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * --setup — Run setup.sql on configured database
3
+ *
4
+ * For Postgres: executes setup.sql directly via pg.
5
+ * For Supabase: prints the SQL with instructions to paste into SQL Editor.
6
+ *
7
+ * Usage: npx traqr-memory-mcp --setup
8
+ */
9
+ import { readFileSync } from 'node:fs';
10
+ import { fileURLToPath } from 'node:url';
11
+ import { dirname, join } from 'node:path';
12
+ import * as p from '@clack/prompts';
13
+ const __dirname = dirname(fileURLToPath(import.meta.url));
14
+ async function run() {
15
+ p.intro('TraqrDB Memory — Database Setup');
16
+ const setupSqlPath = join(__dirname, '..', 'setup.sql');
17
+ let setupSql;
18
+ try {
19
+ setupSql = readFileSync(setupSqlPath, 'utf-8');
20
+ }
21
+ catch {
22
+ p.log.error(`setup.sql not found at ${setupSqlPath}`);
23
+ p.log.info('If installed via npm, it should be at: node_modules/traqr-memory-mcp/setup.sql');
24
+ process.exit(1);
25
+ }
26
+ const databaseUrl = process.env.DATABASE_URL;
27
+ const supabaseUrl = process.env.SUPABASE_URL;
28
+ if (!databaseUrl && !supabaseUrl) {
29
+ p.log.error('No database configured.');
30
+ p.log.info('Set DATABASE_URL or SUPABASE_URL environment variable, then run again.');
31
+ p.log.info('Or run: npx traqr-memory-mcp --install');
32
+ process.exit(1);
33
+ }
34
+ if (databaseUrl) {
35
+ // Postgres: execute directly
36
+ p.log.info(`Connecting to Postgres...`);
37
+ let pg;
38
+ try {
39
+ pg = await Function('return import("pg")')();
40
+ }
41
+ catch {
42
+ p.log.error('The pg package is required for direct Postgres setup.');
43
+ p.log.info('Install it: npm install pg');
44
+ process.exit(1);
45
+ }
46
+ const Pool = pg.default?.Pool || pg.Pool;
47
+ const pool = new Pool({ connectionString: databaseUrl });
48
+ try {
49
+ // Check if schema already exists
50
+ try {
51
+ const result = await pool.query('SELECT version FROM schema_version ORDER BY version DESC LIMIT 1');
52
+ if (result.rows.length > 0) {
53
+ const version = result.rows[0].version;
54
+ p.log.success(`Schema v${version} already exists.`);
55
+ const proceed = await p.confirm({
56
+ message: 'Re-run setup.sql anyway? (safe — uses IF NOT EXISTS)',
57
+ });
58
+ if (p.isCancel(proceed) || !proceed) {
59
+ p.outro('Schema is up to date.');
60
+ await pool.end();
61
+ process.exit(0);
62
+ }
63
+ }
64
+ }
65
+ catch {
66
+ // schema_version doesn't exist — fresh database
67
+ p.log.info('Fresh database detected. Running setup.sql...');
68
+ }
69
+ const s = p.spinner();
70
+ s.start('Running setup.sql...');
71
+ await pool.query(setupSql);
72
+ s.stop('Schema created successfully!');
73
+ // Verify
74
+ const result = await pool.query('SELECT version FROM schema_version ORDER BY version DESC LIMIT 1');
75
+ if (result.rows.length > 0) {
76
+ p.log.success(`Schema v${result.rows[0].version} is ready.`);
77
+ }
78
+ await pool.end();
79
+ }
80
+ catch (err) {
81
+ p.log.error(`Failed to run setup.sql: ${err instanceof Error ? err.message : err}`);
82
+ p.log.info('Check your DATABASE_URL and ensure pgvector is enabled:');
83
+ p.log.info(' CREATE EXTENSION IF NOT EXISTS vector;');
84
+ await pool.end();
85
+ process.exit(1);
86
+ }
87
+ }
88
+ else {
89
+ // Supabase: print instructions
90
+ p.log.info('Supabase detected. Setup.sql must be run via the Supabase SQL Editor.');
91
+ p.log.step('Steps:');
92
+ p.log.info('1. Go to your Supabase project dashboard');
93
+ p.log.info('2. Open SQL Editor (left sidebar)');
94
+ p.log.info('3. Paste the contents of setup.sql');
95
+ p.log.info('4. Click "Run"');
96
+ p.log.info('');
97
+ p.log.info(`setup.sql location: ${setupSqlPath}`);
98
+ p.log.info('');
99
+ const print = await p.confirm({
100
+ message: 'Print setup.sql contents to terminal? (for easy copy-paste)',
101
+ });
102
+ if (!p.isCancel(print) && print) {
103
+ console.log('\n--- BEGIN setup.sql ---\n');
104
+ console.log(setupSql);
105
+ console.log('\n--- END setup.sql ---\n');
106
+ }
107
+ }
108
+ p.outro('Database setup complete! Run: npx traqr-memory-mcp --verify');
109
+ }
110
+ run().catch((err) => {
111
+ console.error('Setup failed:', err instanceof Error ? err.message : err);
112
+ process.exit(1);
113
+ });
114
+ //# sourceMappingURL=setup-db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-db.js","sourceRoot":"","sources":["../../src/cli/setup-db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * --verify — Health check + round trip test
3
+ *
4
+ * Verifies the complete setup: DB connection, schema, embeddings, round trip.
5
+ *
6
+ * Usage: npx traqr-memory-mcp --verify
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/cli/verify.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * --verify — Health check + round trip test
3
+ *
4
+ * Verifies the complete setup: DB connection, schema, embeddings, round trip.
5
+ *
6
+ * Usage: npx traqr-memory-mcp --verify
7
+ */
8
+ import * as p from '@clack/prompts';
9
+ import { configureMemory, getVectorDB, getEmbeddingProvider, storeMemory, searchMemoriesV2 } from '@traqr/memory';
10
+ async function run() {
11
+ p.intro('TraqrDB Memory — Verify Setup');
12
+ // Configure from env
13
+ const supabaseUrl = process.env.SUPABASE_URL;
14
+ const databaseUrl = process.env.DATABASE_URL;
15
+ const supabaseKey = process.env.SUPABASE_SERVICE_ROLE_KEY;
16
+ if (!supabaseUrl && !databaseUrl) {
17
+ p.log.error('No database configured. Set DATABASE_URL or SUPABASE_URL.');
18
+ p.log.info('Run: npx traqr-memory-mcp --install');
19
+ process.exit(1);
20
+ }
21
+ configureMemory({
22
+ supabaseUrl,
23
+ supabaseKey,
24
+ databaseUrl,
25
+ });
26
+ const checks = { db: false, schema: false, embedding: false, roundTrip: false };
27
+ const dbProvider = supabaseUrl ? 'Supabase' : 'Postgres';
28
+ const ep = getEmbeddingProvider();
29
+ const embeddingInfo = ep.provider === 'none' ? 'None (BM25 only)' : `${ep.provider}/${ep.model}`;
30
+ // Check 1: DB connection
31
+ const s = p.spinner();
32
+ s.start('Checking database connection...');
33
+ try {
34
+ const db = getVectorDB();
35
+ const ok = await db.ping();
36
+ if (!ok)
37
+ throw new Error('ping returned false');
38
+ checks.db = true;
39
+ s.stop(`Database: ${dbProvider} — connected`);
40
+ }
41
+ catch (err) {
42
+ s.stop(`Database: ${dbProvider} — FAILED`);
43
+ p.log.error(err instanceof Error ? err.message : String(err));
44
+ }
45
+ // Check 2: Schema version
46
+ if (checks.db) {
47
+ s.start('Checking schema version...');
48
+ try {
49
+ const db = getVectorDB();
50
+ const version = await db.schemaVersion();
51
+ if (version === null)
52
+ throw new Error('schema_version table not found — run setup.sql first');
53
+ checks.schema = true;
54
+ s.stop(`Schema: v${version}`);
55
+ }
56
+ catch (err) {
57
+ s.stop('Schema: FAILED');
58
+ p.log.error(err instanceof Error ? err.message : String(err));
59
+ p.log.info('Run: npx traqr-memory-mcp --setup');
60
+ }
61
+ }
62
+ // Check 3: Embedding provider
63
+ s.start(`Checking embeddings (${embeddingInfo})...`);
64
+ try {
65
+ if (ep.provider === 'none') {
66
+ checks.embedding = true;
67
+ s.stop(`Embeddings: None (BM25 keyword search only)`);
68
+ }
69
+ else {
70
+ const result = await ep.generate('health check');
71
+ if (!result.embedding?.length)
72
+ throw new Error('Empty embedding returned');
73
+ checks.embedding = true;
74
+ s.stop(`Embeddings: ${embeddingInfo} — ${result.dimensions} dimensions`);
75
+ }
76
+ }
77
+ catch (err) {
78
+ s.stop(`Embeddings: ${embeddingInfo} — FAILED`);
79
+ p.log.error(err instanceof Error ? err.message : String(err));
80
+ }
81
+ // Check 4: Round trip (store → search → delete)
82
+ if (checks.db && checks.schema) {
83
+ s.start('Running round-trip test (store → search → delete)...');
84
+ try {
85
+ const testContent = `TraqrDB verify test — ${Date.now()}`;
86
+ const memory = await storeMemory({
87
+ content: testContent,
88
+ sourceType: 'session',
89
+ sourceProject: 'verify-test',
90
+ confidence: 0.1,
91
+ });
92
+ // Search for it (only if embeddings work)
93
+ if (checks.embedding && ep.provider !== 'none') {
94
+ const results = await searchMemoriesV2(testContent, { limit: 1 });
95
+ if (results.length === 0) {
96
+ p.log.warn('Search returned no results for test memory (may be indexing delay)');
97
+ }
98
+ }
99
+ // Clean up
100
+ const db = getVectorDB();
101
+ await db.delete(memory.id);
102
+ checks.roundTrip = true;
103
+ s.stop('Round trip: store → search → delete — OK');
104
+ }
105
+ catch (err) {
106
+ s.stop('Round trip: FAILED');
107
+ p.log.error(err instanceof Error ? err.message : String(err));
108
+ }
109
+ }
110
+ // Summary
111
+ const allPassed = Object.values(checks).every(Boolean);
112
+ const passCount = Object.values(checks).filter(Boolean).length;
113
+ console.log('');
114
+ p.log.info(`DB: ${dbProvider} | Embeddings: ${embeddingInfo}`);
115
+ console.log('');
116
+ console.log(` ${checks.db ? 'pass' : 'FAIL'} Database connection`);
117
+ console.log(` ${checks.schema ? 'pass' : 'FAIL'} Schema version`);
118
+ console.log(` ${checks.embedding ? 'pass' : 'FAIL'} Embedding provider`);
119
+ console.log(` ${checks.roundTrip ? 'pass' : 'FAIL'} Round trip (store/search/delete)`);
120
+ console.log('');
121
+ if (allPassed) {
122
+ p.outro(`All ${passCount} checks passed! TraqrDB is ready.`);
123
+ }
124
+ else {
125
+ p.outro(`${passCount}/4 checks passed. Fix the failures above and re-run.`);
126
+ process.exit(1);
127
+ }
128
+ }
129
+ run().catch((err) => {
130
+ console.error('Verify failed:', err instanceof Error ? err.message : err);
131
+ process.exit(1);
132
+ });
133
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/cli/verify.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -2,6 +2,12 @@
2
2
  /**
3
3
  * TraqrDB Memory MCP Server
4
4
  *
5
+ * CLI flags (run instead of MCP server):
6
+ * --install Interactive setup wizard
7
+ * --setup Run setup.sql on your database
8
+ * --verify Health check + round trip test
9
+ * --print-instructions Print CLAUDE.md memory instructions
10
+ *
5
11
  * Standalone MCP server for AI agents. 10 memory tools powered by
6
12
  * Postgres + pgvector. Multi-strategy retrieval (semantic + BM25 + RRF),
7
13
  * cosine triage, LLM borderline decisions, entity extraction.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;GAeG"}
package/dist/index.js CHANGED
@@ -2,6 +2,12 @@
2
2
  /**
3
3
  * TraqrDB Memory MCP Server
4
4
  *
5
+ * CLI flags (run instead of MCP server):
6
+ * --install Interactive setup wizard
7
+ * --setup Run setup.sql on your database
8
+ * --verify Health check + round trip test
9
+ * --print-instructions Print CLAUDE.md memory instructions
10
+ *
5
11
  * Standalone MCP server for AI agents. 10 memory tools powered by
6
12
  * Postgres + pgvector. Multi-strategy retrieval (semantic + BM25 + RRF),
7
13
  * cosine triage, LLM borderline decisions, entity extraction.
@@ -9,6 +15,44 @@
9
15
  * Usage:
10
16
  * SUPABASE_URL=... SUPABASE_SERVICE_ROLE_KEY=... npx traqr-memory-mcp
11
17
  */
18
+ // CLI flag routing — handle before heavy imports
19
+ const cliFlag = process.argv[2];
20
+ if (cliFlag === '--install') {
21
+ await import('./cli/install.js');
22
+ process.exit(0);
23
+ }
24
+ if (cliFlag === '--setup') {
25
+ await import('./cli/setup-db.js');
26
+ process.exit(0);
27
+ }
28
+ if (cliFlag === '--verify') {
29
+ await import('./cli/verify.js');
30
+ process.exit(0);
31
+ }
32
+ if (cliFlag === '--print-instructions') {
33
+ await import('./cli/instructions.js');
34
+ process.exit(0);
35
+ }
36
+ if (cliFlag === '--help' || cliFlag === '-h') {
37
+ console.log(`
38
+ traqr-memory-mcp — MCP server for persistent AI agent memory
39
+
40
+ Usage: npx traqr-memory-mcp [flag]
41
+
42
+ Flags:
43
+ --install Interactive setup wizard
44
+ --setup Run setup.sql on your database
45
+ --verify Health check + round trip test
46
+ --print-instructions Print CLAUDE.md memory instructions
47
+ --help, -h Show this help
48
+
49
+ No flags: start MCP server (for MCP client config, not direct use)
50
+
51
+ Quick start:
52
+ npx traqr-memory-mcp --install
53
+ `);
54
+ process.exit(0);
55
+ }
12
56
  import { readFileSync } from 'node:fs';
13
57
  import { fileURLToPath } from 'node:url';
14
58
  import { dirname, join } from 'node:path';