memoire-ai 0.6.13 → 0.6.15

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 (63) hide show
  1. package/README.md +17 -6
  2. package/dist/ascii-success.js +10 -10
  3. package/dist/ascii-success.js.map +1 -1
  4. package/dist/auth.d.ts +12 -0
  5. package/dist/auth.d.ts.map +1 -0
  6. package/dist/auth.js +288 -0
  7. package/dist/auth.js.map +1 -0
  8. package/dist/cli.js +21 -326
  9. package/dist/cli.js.map +1 -1
  10. package/dist/configure.d.ts +0 -45
  11. package/dist/configure.d.ts.map +1 -1
  12. package/dist/configure.js +60 -401
  13. package/dist/configure.js.map +1 -1
  14. package/dist/hooks.d.ts +2 -13
  15. package/dist/hooks.d.ts.map +1 -1
  16. package/dist/hooks.js +131 -451
  17. package/dist/hooks.js.map +1 -1
  18. package/dist/index.d.ts +0 -7
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +0 -6
  21. package/dist/index.js.map +1 -1
  22. package/dist/local-config.d.ts +5 -2
  23. package/dist/local-config.d.ts.map +1 -1
  24. package/dist/local-config.js +1 -1
  25. package/dist/local-config.js.map +1 -1
  26. package/dist/manual.js +12 -12
  27. package/dist/manual.js.map +1 -1
  28. package/dist/mcp.d.ts +1 -1
  29. package/dist/mcp.d.ts.map +1 -1
  30. package/dist/mcp.js +2 -22
  31. package/dist/mcp.js.map +1 -1
  32. package/dist/profiler/codebase-analyzer.d.ts +34 -0
  33. package/dist/profiler/codebase-analyzer.d.ts.map +1 -0
  34. package/dist/profiler/codebase-analyzer.js +622 -0
  35. package/dist/profiler/codebase-analyzer.js.map +1 -0
  36. package/dist/profiler/convention-detector.d.ts +11 -0
  37. package/dist/profiler/convention-detector.d.ts.map +1 -0
  38. package/dist/profiler/convention-detector.js +408 -0
  39. package/dist/profiler/convention-detector.js.map +1 -0
  40. package/dist/profiler/git-scanner.d.ts +8 -0
  41. package/dist/profiler/git-scanner.d.ts.map +1 -0
  42. package/dist/profiler/git-scanner.js +246 -0
  43. package/dist/profiler/git-scanner.js.map +1 -0
  44. package/dist/profiler/index.d.ts +50 -0
  45. package/dist/profiler/index.d.ts.map +1 -0
  46. package/dist/profiler/index.js +374 -0
  47. package/dist/profiler/index.js.map +1 -0
  48. package/dist/profiler/mcp-installer.d.ts +34 -0
  49. package/dist/profiler/mcp-installer.d.ts.map +1 -0
  50. package/dist/profiler/mcp-installer.js +249 -0
  51. package/dist/profiler/mcp-installer.js.map +1 -0
  52. package/dist/profiler/skill-engine.d.ts +43 -0
  53. package/dist/profiler/skill-engine.d.ts.map +1 -0
  54. package/dist/profiler/skill-engine.js +295 -0
  55. package/dist/profiler/skill-engine.js.map +1 -0
  56. package/dist/profiler/watcher.d.ts +44 -0
  57. package/dist/profiler/watcher.d.ts.map +1 -0
  58. package/dist/profiler/watcher.js +122 -0
  59. package/dist/profiler/watcher.js.map +1 -0
  60. package/dist/uninstall.js +1 -1
  61. package/dist/uninstall.js.map +1 -1
  62. package/package.json +11 -17
  63. package/skills/use-memoire/SKILL.md +50 -89
package/README.md CHANGED
@@ -1,18 +1,29 @@
1
1
  # Memoire CLI
2
2
 
3
- Memoire installs shared coding context for Cursor, Claude Code, Codex, and MCP-compatible clients.
3
+ Memoire installs local research tools and last-session context for Cursor, Claude Code, Codex, and Amp.
4
4
 
5
- ## Install
5
+ ## Setup
6
6
 
7
7
  ```bash
8
- npx memoire install --client cursor --api-key sk_mem_xxx
8
+ npx memoire-ai setup --client cursor
9
9
  ```
10
10
 
11
11
  ## Commands
12
12
 
13
13
  ```bash
14
- npx memoire search "auth decisions"
15
- npx memoire status
14
+ npx memoire-ai setup --client cursor
15
+ memoire pause
16
+ memoire unpause
17
+ memoire uninstall
18
+ memoire mcp
16
19
  ```
17
20
 
18
- The CLI writes shared config to `~/.memoire/config.json`, auto-registers the local client, and indexes dependency docs for the current repository when the API is available.
21
+ ## What you get
22
+
23
+ - `memoire_code_search` for GitHub code search
24
+ - `arxiv_search` for paper lookup
25
+ - `fetch_url` for reading docs and raw files
26
+ - `index_docs`, `search_docs`, `list_docs`, and `remove_docs` for local docs indexing
27
+ - `get_session_context` for the last session summary
28
+
29
+ Memoire stores its local state in `~/.memoire/` and does not require a cloud service or API key for the default setup.
@@ -107,9 +107,9 @@ export async function playSuccessAnimation(client) {
107
107
  write('\n');
108
108
  // Phase 5: Closing message
109
109
  const closing = [
110
- 'Your agents now share memory across sessions.',
111
- 'Every decision, convention, and lesson learned',
112
- 'is remembered by the whole team.',
110
+ 'Your agents now reuse the last session context.',
111
+ 'Research tools and local docs are ready whenever you need them.',
112
+ 'Memoire stays local by default.',
113
113
  ];
114
114
  for (const line of closing) {
115
115
  write(`${C.brand} ${line}${C.reset}\n`);
@@ -119,21 +119,21 @@ export async function playSuccessAnimation(client) {
119
119
  }
120
120
  function printStaticSuccess(client) {
121
121
  console.log(`\n ◆ Memoire is active for ${client}`);
122
- console.log(' Your agents now share memory across sessions.\n');
122
+ console.log(' Local research tools and session context are ready.\n');
123
123
  }
124
124
  function getTips(client) {
125
125
  const base = [
126
126
  'Quick start:',
127
127
  '',
128
- ` Search memory "What decisions did we make about auth?"`,
129
- ` Record context "Record a convention: all routes use Hono"`,
130
- ` Create handoff "Create a handoff for this work"`,
128
+ ' Resume work use `get_session_context()` in your agent',
129
+ ' Research code use `memoire_code_search(query: "...")`',
130
+ ' Search docs use `index_docs(...)` then `search_docs(...)`',
131
131
  '',
132
132
  'Commands:',
133
133
  '',
134
- ' memoire search "query" Search shared memory',
135
- ' memoire status Check connection',
136
- ' memoire doctor Diagnose issues',
134
+ ' memoire pause Pause hooks',
135
+ ' memoire unpause Resume hooks',
136
+ ' memoire uninstall Remove Memoire from this project',
137
137
  ];
138
138
  if (client === 'cursor') {
139
139
  base.push('', 'Context is auto-injected via .cursor/rules/ on every prompt.');
@@ -1 +1 @@
1
- {"version":3,"file":"ascii-success.js","sourceRoot":"","sources":["../src/ascii-success.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ascii-success.js","sourceRoot":"","sources":["../src/ascii-success.ts"],"names":[],"mappings":"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"}
package/dist/auth.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ /**
2
+ * memoire auth <provider>
3
+ *
4
+ * Reads locally-stored CLI credentials (Claude Code or Codex) and syncs them
5
+ * to the Memoire dashboard via the auth bridge API.
6
+ *
7
+ * Usage:
8
+ * npx memoire-ai auth claude --session=<id>
9
+ * npx memoire-ai auth codex --session=<id>
10
+ */
11
+ export declare function runAuthCommand(provider: string | undefined, sessionId: string | undefined): Promise<void>;
12
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA+PH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,OAAO,CAAC,IAAI,CAAC,CA6Ff"}
package/dist/auth.js ADDED
@@ -0,0 +1,288 @@
1
+ /**
2
+ * memoire auth <provider>
3
+ *
4
+ * Reads locally-stored CLI credentials (Claude Code or Codex) and syncs them
5
+ * to the Memoire dashboard via the auth bridge API.
6
+ *
7
+ * Usage:
8
+ * npx memoire-ai auth claude --session=<id>
9
+ * npx memoire-ai auth codex --session=<id>
10
+ */
11
+ import { existsSync, readFileSync } from 'node:fs';
12
+ import { join } from 'node:path';
13
+ import { homedir } from 'node:os';
14
+ import { execFileSync } from 'node:child_process';
15
+ import { createHash } from 'node:crypto';
16
+ // ---------------------------------------------------------------------------
17
+ // Credential readers (ported from memi/src/agents/cli-credentials.ts)
18
+ // ---------------------------------------------------------------------------
19
+ const CLAUDE_CREDENTIALS_PATH = '.claude/.credentials.json';
20
+ const CLAUDE_KEYCHAIN_SERVICE = 'Claude Code-credentials';
21
+ const CODEX_AUTH_FILENAME = 'auth.json';
22
+ function readClaudeCredentials() {
23
+ // Try macOS Keychain first (using execFileSync to prevent shell injection)
24
+ if (process.platform === 'darwin') {
25
+ try {
26
+ const result = execFileSync('security', ['find-generic-password', '-s', CLAUDE_KEYCHAIN_SERVICE, '-w'], { encoding: 'utf8', timeout: 5000, stdio: ['pipe', 'pipe', 'pipe'] });
27
+ const data = JSON.parse(result.trim());
28
+ const oauth = data?.claudeAiOauth;
29
+ if (oauth?.accessToken) {
30
+ return {
31
+ provider: 'anthropic',
32
+ access_token: oauth.accessToken,
33
+ refresh_token: oauth.refreshToken || undefined,
34
+ expires_at: oauth.expiresAt
35
+ ? new Date(oauth.expiresAt).toISOString()
36
+ : undefined,
37
+ };
38
+ }
39
+ }
40
+ catch {
41
+ // Keychain not available or no entry — fall through to file
42
+ }
43
+ }
44
+ // Try credentials file
45
+ const credPath = join(homedir(), CLAUDE_CREDENTIALS_PATH);
46
+ if (!existsSync(credPath))
47
+ return null;
48
+ try {
49
+ const raw = JSON.parse(readFileSync(credPath, 'utf-8'));
50
+ const oauth = raw?.claudeAiOauth;
51
+ if (!oauth?.accessToken)
52
+ return null;
53
+ return {
54
+ provider: 'anthropic',
55
+ access_token: oauth.accessToken,
56
+ refresh_token: oauth.refreshToken || undefined,
57
+ expires_at: oauth.expiresAt
58
+ ? new Date(oauth.expiresAt).toISOString()
59
+ : undefined,
60
+ };
61
+ }
62
+ catch {
63
+ return null;
64
+ }
65
+ }
66
+ function resolveCodexHome() {
67
+ const configured = process.env.CODEX_HOME;
68
+ return configured ?? join(homedir(), '.codex');
69
+ }
70
+ function readCodexCredentials() {
71
+ // Try macOS Keychain first
72
+ if (process.platform === 'darwin') {
73
+ try {
74
+ const codexHome = resolveCodexHome();
75
+ const hash = createHash('sha256').update(codexHome).digest('hex');
76
+ const account = `cli|${hash.slice(0, 16)}`;
77
+ const result = execFileSync('security', ['find-generic-password', '-s', 'Codex Auth', '-a', account, '-w'], { encoding: 'utf8', timeout: 5000, stdio: ['pipe', 'pipe', 'pipe'] });
78
+ const data = JSON.parse(result.trim());
79
+ const tokens = data?.tokens;
80
+ if (tokens?.access_token) {
81
+ const expiresMs = decodeJwtExpiry(tokens.access_token);
82
+ return {
83
+ provider: 'openai',
84
+ access_token: tokens.access_token,
85
+ refresh_token: tokens.refresh_token || undefined,
86
+ expires_at: expiresMs ? new Date(expiresMs).toISOString() : undefined,
87
+ };
88
+ }
89
+ }
90
+ catch {
91
+ // Keychain not available — fall through to file
92
+ }
93
+ }
94
+ // Try auth.json file
95
+ const authPath = join(resolveCodexHome(), CODEX_AUTH_FILENAME);
96
+ if (!existsSync(authPath))
97
+ return null;
98
+ try {
99
+ const raw = JSON.parse(readFileSync(authPath, 'utf-8'));
100
+ const tokens = raw?.tokens;
101
+ if (!tokens?.access_token)
102
+ return null;
103
+ const expiresMs = decodeJwtExpiry(tokens.access_token);
104
+ return {
105
+ provider: 'openai',
106
+ access_token: tokens.access_token,
107
+ refresh_token: tokens.refresh_token || undefined,
108
+ expires_at: expiresMs ? new Date(expiresMs).toISOString() : undefined,
109
+ };
110
+ }
111
+ catch {
112
+ return null;
113
+ }
114
+ }
115
+ /** Decode JWT expiry (exp claim) without a library. */
116
+ function decodeJwtExpiry(token) {
117
+ const parts = token.split('.');
118
+ if (parts.length < 2)
119
+ return null;
120
+ try {
121
+ const payload = JSON.parse(Buffer.from(parts[1], 'base64url').toString('utf8'));
122
+ return typeof payload.exp === 'number' ? payload.exp * 1000 : null;
123
+ }
124
+ catch {
125
+ return null;
126
+ }
127
+ }
128
+ // ---------------------------------------------------------------------------
129
+ // OpenAI Device Code Flow (runs from user's terminal — no CORS/Cloudflare)
130
+ // ---------------------------------------------------------------------------
131
+ const OPENAI_CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann';
132
+ async function doCodexDeviceCodeFlow() {
133
+ console.log(' No local Codex credentials found.');
134
+ console.log(' Starting ChatGPT sign-in...\n');
135
+ const res = await fetch('https://auth0.openai.com/oauth/device/code', {
136
+ method: 'POST',
137
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
138
+ body: new URLSearchParams({
139
+ client_id: OPENAI_CLIENT_ID,
140
+ scope: 'openid profile email offline_access',
141
+ }),
142
+ });
143
+ if (!res.ok) {
144
+ const text = await res.text().catch(() => '');
145
+ throw new Error(`OpenAI device code request failed (${res.status}): ${text.slice(0, 200)}`);
146
+ }
147
+ const data = (await res.json());
148
+ if (!data.device_code) {
149
+ throw new Error('No device code returned from OpenAI');
150
+ }
151
+ const verificationUri = data.verification_uri_complete || data.verification_uri;
152
+ console.log(` Your code: ${data.user_code}`);
153
+ console.log(` Open this URL: ${verificationUri}\n`);
154
+ // Try to open browser automatically
155
+ try {
156
+ const openCmd = process.platform === 'darwin' ? 'open'
157
+ : process.platform === 'win32' ? 'start'
158
+ : 'xdg-open';
159
+ execFileSync(openCmd, [verificationUri], {
160
+ stdio: 'ignore',
161
+ timeout: 5000,
162
+ });
163
+ console.log(' Browser opened. Enter the code above, then authorize.');
164
+ }
165
+ catch {
166
+ console.log(' Open the URL above in your browser and enter the code.');
167
+ }
168
+ console.log(' Waiting for authorization...\n');
169
+ const interval = (data.interval || 5) * 1000;
170
+ const deadline = Date.now() + data.expires_in * 1000;
171
+ while (Date.now() < deadline) {
172
+ await new Promise((r) => setTimeout(r, interval));
173
+ const tokenRes = await fetch('https://auth0.openai.com/oauth/token', {
174
+ method: 'POST',
175
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
176
+ body: new URLSearchParams({
177
+ grant_type: 'urn:ietf:params:oauth:grant-type:device_code',
178
+ device_code: data.device_code,
179
+ client_id: OPENAI_CLIENT_ID,
180
+ }),
181
+ });
182
+ const tokenData = (await tokenRes.json());
183
+ if (tokenData.error === 'authorization_pending' || tokenData.error === 'slow_down') {
184
+ continue;
185
+ }
186
+ if (!tokenRes.ok || !tokenData.access_token) {
187
+ throw new Error(tokenData.error_description || tokenData.error || 'Token exchange failed');
188
+ }
189
+ const expiresMs = tokenData.expires_in
190
+ ? Date.now() + tokenData.expires_in * 1000
191
+ : null;
192
+ return {
193
+ provider: 'openai',
194
+ access_token: tokenData.access_token,
195
+ refresh_token: tokenData.refresh_token || undefined,
196
+ expires_at: expiresMs ? new Date(expiresMs).toISOString() : undefined,
197
+ };
198
+ }
199
+ throw new Error('Device code expired. Please try again.');
200
+ }
201
+ // ---------------------------------------------------------------------------
202
+ // Main auth command
203
+ // ---------------------------------------------------------------------------
204
+ const DASHBOARD_URL = process.env.MEMOIRE_DASHBOARD_URL || 'https://trymemoire.com';
205
+ export async function runAuthCommand(provider, sessionId) {
206
+ if (!provider || !['claude', 'codex', 'anthropic', 'openai'].includes(provider)) {
207
+ console.error(`
208
+ Usage: memoire auth <provider> --session=<id>
209
+
210
+ Providers:
211
+ claude Sync Claude Code credentials (from ~/.claude/)
212
+ codex Sync Codex credentials or sign in with ChatGPT
213
+
214
+ The --session flag links this to your dashboard. Get the full command
215
+ from trymemoire.com/settings/coding-agents.
216
+ `);
217
+ process.exit(1);
218
+ }
219
+ if (!sessionId) {
220
+ console.error(' Error: --session flag is required.');
221
+ console.error(' Copy the full command from your Memoire dashboard.\n');
222
+ process.exit(1);
223
+ }
224
+ // Normalize provider name
225
+ const isAnthropic = provider === 'claude' || provider === 'anthropic';
226
+ const providerLabel = isAnthropic ? 'Claude Code' : 'Codex';
227
+ const apiProvider = isAnthropic ? 'anthropic' : 'openai';
228
+ console.log(`\n Reading ${providerLabel} credentials...`);
229
+ // Read local credentials
230
+ let cred = isAnthropic ? readClaudeCredentials() : readCodexCredentials();
231
+ if (!cred && isAnthropic) {
232
+ console.error('\n No Claude Code credentials found.');
233
+ console.error(' Run "claude" in your terminal to authenticate first.');
234
+ console.error(' Credentials are stored in ~/.claude/.credentials.json\n');
235
+ process.exit(1);
236
+ }
237
+ // For Codex: if no local creds, run the device code flow from this terminal
238
+ if (!cred && !isAnthropic) {
239
+ cred = await doCodexDeviceCodeFlow();
240
+ }
241
+ if (!cred) {
242
+ console.error(`\n No ${providerLabel} credentials found.\n`);
243
+ process.exit(1);
244
+ }
245
+ console.log(` Found ${providerLabel} credentials.`);
246
+ // Check if token is expired
247
+ if (cred.expires_at) {
248
+ const expiresAt = new Date(cred.expires_at).getTime();
249
+ if (Date.now() > expiresAt) {
250
+ console.error(`\n Warning: ${providerLabel} token is expired.`);
251
+ console.error(` Re-authenticate by running "${isAnthropic ? 'claude' : 'codex'}" first.\n`);
252
+ process.exit(1);
253
+ }
254
+ }
255
+ // Send to bridge API
256
+ console.log(' Syncing to Memoire dashboard...');
257
+ try {
258
+ const res = await fetch(`${DASHBOARD_URL}/api/auth/bridge`, {
259
+ method: 'POST',
260
+ headers: { 'Content-Type': 'application/json' },
261
+ body: JSON.stringify({
262
+ session_id: sessionId,
263
+ provider: apiProvider,
264
+ access_token: cred.access_token,
265
+ refresh_token: cred.refresh_token,
266
+ expires_at: cred.expires_at,
267
+ }),
268
+ });
269
+ if (!res.ok) {
270
+ const body = await res.json().catch(() => ({ error: 'Unknown error' }));
271
+ if (res.status === 404) {
272
+ console.error('\n Session expired or invalid. Generate a new command from the dashboard.\n');
273
+ }
274
+ else {
275
+ console.error(`\n Error: ${body.error || `HTTP ${res.status}`}\n`);
276
+ }
277
+ process.exit(1);
278
+ }
279
+ console.log(`\n ${providerLabel} connected successfully!`);
280
+ console.log(' You can close this terminal and return to the dashboard.\n');
281
+ }
282
+ catch (e) {
283
+ console.error(`\n Network error: ${e instanceof Error ? e.message : String(e)}`);
284
+ console.error(' Check your internet connection and try again.\n');
285
+ process.exit(1);
286
+ }
287
+ }
288
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}