memoire-ai 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 (51) hide show
  1. package/README.md +18 -0
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +359 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands.d.ts +33 -0
  7. package/dist/commands.d.ts.map +1 -0
  8. package/dist/commands.js +497 -0
  9. package/dist/commands.js.map +1 -0
  10. package/dist/configure.d.ts +65 -0
  11. package/dist/configure.d.ts.map +1 -0
  12. package/dist/configure.js +485 -0
  13. package/dist/configure.js.map +1 -0
  14. package/dist/dashboard.d.ts +9 -0
  15. package/dist/dashboard.d.ts.map +1 -0
  16. package/dist/dashboard.js +8 -0
  17. package/dist/dashboard.js.map +1 -0
  18. package/dist/dependencies.d.ts +3 -0
  19. package/dist/dependencies.d.ts.map +1 -0
  20. package/dist/dependencies.js +213 -0
  21. package/dist/dependencies.js.map +1 -0
  22. package/dist/detect.d.ts +3 -0
  23. package/dist/detect.d.ts.map +1 -0
  24. package/dist/detect.js +30 -0
  25. package/dist/detect.js.map +1 -0
  26. package/dist/hooks.d.ts +25 -0
  27. package/dist/hooks.d.ts.map +1 -0
  28. package/dist/hooks.js +479 -0
  29. package/dist/hooks.js.map +1 -0
  30. package/dist/index.d.ts +9 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +9 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/local-config.d.ts +8 -0
  35. package/dist/local-config.d.ts.map +1 -0
  36. package/dist/local-config.js +16 -0
  37. package/dist/local-config.js.map +1 -0
  38. package/dist/login.d.ts +20 -0
  39. package/dist/login.d.ts.map +1 -0
  40. package/dist/login.js +93 -0
  41. package/dist/login.js.map +1 -0
  42. package/dist/manual.d.ts +15 -0
  43. package/dist/manual.d.ts.map +1 -0
  44. package/dist/manual.js +143 -0
  45. package/dist/manual.js.map +1 -0
  46. package/dist/mcp.d.ts +5 -0
  47. package/dist/mcp.d.ts.map +1 -0
  48. package/dist/mcp.js +18 -0
  49. package/dist/mcp.js.map +1 -0
  50. package/package.json +55 -0
  51. package/skills/use-memoire/SKILL.md +79 -0
package/dist/login.js ADDED
@@ -0,0 +1,93 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { setTimeout as delay } from 'node:timers/promises';
3
+ import { install } from './configure.js';
4
+ import { detectClient } from './detect.js';
5
+ export async function runLoginCommand(opts, deps = {}) {
6
+ const logger = deps.logger ?? console;
7
+ const fetchImpl = deps.fetchImpl ?? fetch;
8
+ const sleep = deps.sleep ?? ((ms) => delay(ms));
9
+ const installImpl = deps.installImpl ?? install;
10
+ const client = opts.client ?? (await (deps.detectClient ?? detectClient)());
11
+ if (!client) {
12
+ throw new Error('Could not detect client. Use --client to specify one.');
13
+ }
14
+ logger.log('\n Memoire Login\n');
15
+ const startRes = await fetchImpl(`${opts.apiUrl.replace(/\/$/, '')}/v1/setup/device-auth/start`, {
16
+ method: 'POST',
17
+ headers: { 'Content-Type': 'application/json' },
18
+ body: JSON.stringify({ client }),
19
+ });
20
+ if (!startRes.ok) {
21
+ const body = await startRes.text().catch(() => '');
22
+ throw new Error(`Could not start device auth (${startRes.status}): ${body || 'unknown error'}`);
23
+ }
24
+ const start = await startRes.json();
25
+ const pollIntervalMs = Math.max(1000, (start.poll_interval_seconds ?? 2) * 1000);
26
+ logger.log(` Your code: ${start.user_code}`);
27
+ logger.log(` Verification URL: ${start.verification_url}`);
28
+ logger.log();
29
+ const opened = await (deps.openExternal ?? openExternalInBrowser)(start.verification_url);
30
+ if (opened) {
31
+ logger.log(' Opening browser...');
32
+ }
33
+ else {
34
+ logger.log(' Could not open a browser automatically. Open the verification URL manually.');
35
+ }
36
+ logger.log(' Waiting for approval...\n');
37
+ for (;;) {
38
+ const exchangeRes = await fetchImpl(`${opts.apiUrl.replace(/\/$/, '')}/v1/setup/device-auth/exchange`, {
39
+ method: 'POST',
40
+ headers: { 'Content-Type': 'application/json' },
41
+ body: JSON.stringify({ session_secret: start.session_secret }),
42
+ });
43
+ let exchangeBody = null;
44
+ try {
45
+ exchangeBody = await exchangeRes.json();
46
+ }
47
+ catch {
48
+ exchangeBody = null;
49
+ }
50
+ if (exchangeRes.status === 202 || exchangeBody?.status === 'pending') {
51
+ await sleep(pollIntervalMs);
52
+ continue;
53
+ }
54
+ if (exchangeRes.status === 410 || exchangeBody?.status === 'expired') {
55
+ throw new Error('Login session expired. Run `memoire login` again.');
56
+ }
57
+ if (!exchangeRes.ok) {
58
+ throw new Error(`Login failed during exchange (${exchangeRes.status}).`);
59
+ }
60
+ if (exchangeBody?.status !== 'approved' || !exchangeBody.api_key) {
61
+ throw new Error('Login approval succeeded but no API key was returned.');
62
+ }
63
+ await installImpl({
64
+ client: client,
65
+ apiKey: exchangeBody.api_key,
66
+ apiUrl: opts.apiUrl,
67
+ orgId: exchangeBody.org_id,
68
+ projectId: exchangeBody.project_id,
69
+ userName: opts.userName,
70
+ userEmail: opts.userEmail,
71
+ });
72
+ logger.log(' Login complete.\n');
73
+ return;
74
+ }
75
+ }
76
+ async function openExternalInBrowser(url) {
77
+ try {
78
+ if (process.platform === 'darwin') {
79
+ execFileSync('open', [url], { stdio: 'ignore' });
80
+ return true;
81
+ }
82
+ if (process.platform === 'win32') {
83
+ execFileSync('cmd', ['/c', 'start', '', url], { stdio: 'ignore' });
84
+ return true;
85
+ }
86
+ execFileSync('xdg-open', [url], { stdio: 'ignore' });
87
+ return true;
88
+ }
89
+ catch {
90
+ return false;
91
+ }
92
+ }
93
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAuB,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAqC3C,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAkB,EAAE,OAAkB,EAAE;IAC5E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC;IACtC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC;IAEhD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC;IAC5E,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAElC,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,6BAA6B,EAAE;QAC/F,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;KACjC,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,CAAC,MAAM,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC,CAAC;IAClG,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA6B,CAAC;IAC/D,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,qBAAqB,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAEjF,MAAM,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;IAC9C,MAAM,CAAC,GAAG,CAAC,uBAAuB,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC5D,MAAM,CAAC,GAAG,EAAE,CAAC;IAEb,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,IAAI,qBAAqB,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC1F,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACrC,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,GAAG,CAAC,+EAA+E,CAAC,CAAC;IAC9F,CAAC;IACD,MAAM,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAE1C,SAAS,CAAC;QACR,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,gCAAgC,EAAE;YACrG,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC;SAC/D,CAAC,CAAC;QAEH,IAAI,YAAY,GAAsC,IAAI,CAAC;QAC3D,IAAI,CAAC;YACH,YAAY,GAAG,MAAM,WAAW,CAAC,IAAI,EAAgC,CAAC;QACxE,CAAC;QAAC,MAAM,CAAC;YACP,YAAY,GAAG,IAAI,CAAC;QACtB,CAAC;QAED,IAAI,WAAW,CAAC,MAAM,KAAK,GAAG,IAAI,YAAY,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;YACrE,MAAM,KAAK,CAAC,cAAc,CAAC,CAAC;YAC5B,SAAS;QACX,CAAC;QAED,IAAI,WAAW,CAAC,MAAM,KAAK,GAAG,IAAI,YAAY,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;YACrE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACvE,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,iCAAiC,WAAW,CAAC,MAAM,IAAI,CAAC,CAAC;QAC3E,CAAC;QAED,IAAI,YAAY,EAAE,MAAM,KAAK,UAAU,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;YACjE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;QAED,MAAM,WAAW,CAAC;YAChB,MAAM,EAAE,MAAyB;YACjC,MAAM,EAAE,YAAY,CAAC,OAAO;YAC5B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,YAAY,CAAC,MAAM;YAC1B,SAAS,EAAE,YAAY,CAAC,UAAU;YAClC,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;QAEH,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QAClC,OAAO;IACT,CAAC;AACH,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,GAAW;IAC9C,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAClC,YAAY,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YACjD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,YAAY,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YACnE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,YAAY,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { MemoireConfig } from '@memoire/shared';
2
+ export interface ManualSetupOptions {
3
+ client?: MemoireConfig['client'];
4
+ configPath?: string;
5
+ }
6
+ interface ManualSetupDeps {
7
+ readConfig?: (opts?: {
8
+ configPath?: string;
9
+ }) => MemoireConfig;
10
+ detectClient?: () => Promise<MemoireConfig['client'] | null>;
11
+ cwd?: string;
12
+ }
13
+ export declare function runManualSetupCommand(options?: ManualSetupOptions, deps?: ManualSetupDeps): Promise<string>;
14
+ export {};
15
+ //# sourceMappingURL=manual.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manual.d.ts","sourceRoot":"","sources":["../src/manual.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIrD,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,eAAe;IACvB,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,aAAa,CAAC;IAC/D,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;IAC7D,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,qBAAqB,CACzC,OAAO,GAAE,kBAAuB,EAChC,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,MAAM,CAAC,CAyJjB"}
package/dist/manual.js ADDED
@@ -0,0 +1,143 @@
1
+ import { detectClient } from './detect.js';
2
+ import { getLocalConfigPath, readLocalConfig } from './local-config.js';
3
+ export async function runManualSetupCommand(options = {}, deps = {}) {
4
+ const config = deps.readConfig?.({ configPath: options.configPath })
5
+ ?? readLocalConfig({ configPath: options.configPath });
6
+ const detectedClient = await (deps.detectClient ?? detectClient)();
7
+ const resolvedClient = (options.client ?? detectedClient ?? config.client);
8
+ const configPath = getLocalConfigPath({ configPath: options.configPath });
9
+ const repoRoot = config.repo_root ?? deps.cwd ?? process.cwd();
10
+ const clientId = config.client_id ?? '<client-id>';
11
+ const lines = [
12
+ 'Memoire manual setup',
13
+ `Client: ${resolvedClient}`,
14
+ `Config path: ${configPath}`,
15
+ `Workspace: ${repoRoot}`,
16
+ `API URL: ${config.api_url}`,
17
+ '',
18
+ ];
19
+ if (resolvedClient === 'cursor') {
20
+ lines.push('Cursor MCP (~/.cursor/mcp.json)');
21
+ lines.push(JSON.stringify({
22
+ mcpServers: {
23
+ memoire: createManagedMcpServerConfig(configPath, 'cursor', clientId),
24
+ },
25
+ }, null, 2));
26
+ lines.push('');
27
+ lines.push('Cursor hooks (.cursor/hooks.json)');
28
+ lines.push(JSON.stringify({
29
+ version: 1,
30
+ hooks: {
31
+ beforeSubmitPrompt: [{ command: buildManagedCommand(['memoire', 'hook', 'cursor-before-submit', '--config-path', configPath, '--client', 'cursor', '--client-id', clientId]) }],
32
+ afterMCPExecution: [{ command: buildManagedCommand(['memoire', 'hook', 'cursor-after-mcp', '--config-path', configPath, '--client', 'cursor', '--client-id', clientId]) }],
33
+ afterShellExecution: [{ command: buildManagedCommand(['memoire', 'hook', 'cursor-after-shell', '--config-path', configPath, '--client', 'cursor', '--client-id', clientId]) }],
34
+ afterFileEdit: [{ command: buildManagedCommand(['memoire', 'hook', 'cursor-after-file-edit', '--config-path', configPath, '--client', 'cursor', '--client-id', clientId]) }],
35
+ stop: [{ command: buildManagedCommand(['memoire', 'hook', 'cursor-stop', '--config-path', configPath, '--client', 'cursor', '--client-id', clientId]) }],
36
+ },
37
+ }, null, 2));
38
+ }
39
+ else if (resolvedClient === 'claude') {
40
+ lines.push('Claude Code MCP (.mcp.json)');
41
+ lines.push(JSON.stringify({
42
+ mcpServers: {
43
+ memoire: createManagedMcpServerConfig(configPath, 'claude', clientId),
44
+ },
45
+ }, null, 2));
46
+ lines.push('');
47
+ lines.push('Claude hooks (.claude/settings.local.json)');
48
+ lines.push(JSON.stringify({
49
+ hooks: {
50
+ SessionStart: [
51
+ {
52
+ matcher: 'startup|clear|compact',
53
+ hooks: [
54
+ {
55
+ type: 'command',
56
+ command: buildManagedCommand(['memoire', 'hook', 'claude-session-start', '--config-path', configPath, '--client', 'claude', '--client-id', clientId]),
57
+ timeout: 30,
58
+ },
59
+ ],
60
+ },
61
+ ],
62
+ UserPromptSubmit: [
63
+ {
64
+ hooks: [
65
+ {
66
+ type: 'command',
67
+ command: buildManagedCommand(['memoire', 'hook', 'claude-user-prompt', '--config-path', configPath, '--client', 'claude', '--client-id', clientId]),
68
+ timeout: 30,
69
+ },
70
+ ],
71
+ },
72
+ ],
73
+ PostToolUse: [
74
+ {
75
+ matcher: '*',
76
+ hooks: [
77
+ {
78
+ type: 'command',
79
+ command: buildManagedCommand(['memoire', 'hook', 'claude-post-tool-use', '--config-path', configPath, '--client', 'claude', '--client-id', clientId]),
80
+ timeout: 45,
81
+ },
82
+ ],
83
+ },
84
+ ],
85
+ Stop: [
86
+ {
87
+ hooks: [
88
+ {
89
+ type: 'command',
90
+ command: buildManagedCommand(['memoire', 'hook', 'claude-stop', '--config-path', configPath, '--client', 'claude', '--client-id', clientId]),
91
+ timeout: 30,
92
+ },
93
+ ],
94
+ },
95
+ ],
96
+ },
97
+ }, null, 2));
98
+ }
99
+ else if (resolvedClient === 'codex') {
100
+ lines.push('Codex native command');
101
+ lines.push(`codex mcp add memoire --env MEMOIRE_CONFIG_PATH=${quoteCliValue(configPath)} --env MEMOIRE_CLIENT=codex --env MEMOIRE_CLIENT_ID=${quoteCliValue(clientId)} -- npx -y memoire mcp`);
102
+ lines.push('');
103
+ lines.push('Codex fallback (~/.codex/config.toml)');
104
+ lines.push([
105
+ '[mcp_servers.memoire]',
106
+ 'command = "npx"',
107
+ 'args = ["-y", "memoire", "mcp"]',
108
+ '',
109
+ '[mcp_servers.memoire.env]',
110
+ `MEMOIRE_CONFIG_PATH = ${JSON.stringify(configPath)}`,
111
+ 'MEMOIRE_CLIENT = "codex"',
112
+ `MEMOIRE_CLIENT_ID = ${JSON.stringify(clientId)}`,
113
+ ].join('\n'));
114
+ }
115
+ else {
116
+ lines.push('Manual setup');
117
+ lines.push(JSON.stringify({
118
+ mcpServers: {
119
+ memoire: createManagedMcpServerConfig(configPath, resolvedClient, clientId),
120
+ },
121
+ }, null, 2));
122
+ }
123
+ return lines.join('\n');
124
+ }
125
+ function createManagedMcpServerConfig(configPath, client, clientId) {
126
+ return {
127
+ command: 'npx',
128
+ args: ['-y', 'memoire', 'mcp'],
129
+ env: {
130
+ MEMOIRE_CONFIG_PATH: configPath,
131
+ MEMOIRE_CLIENT: client,
132
+ MEMOIRE_CLIENT_ID: clientId,
133
+ },
134
+ };
135
+ }
136
+ function buildManagedCommand(args) {
137
+ const quoted = args.map((arg) => JSON.stringify(arg)).join(' ');
138
+ return `npx -y ${quoted}`;
139
+ }
140
+ function quoteCliValue(value) {
141
+ return JSON.stringify(value);
142
+ }
143
+ //# sourceMappingURL=manual.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manual.js","sourceRoot":"","sources":["../src/manual.ts"],"names":[],"mappings":"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"}
package/dist/mcp.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ import { runMemoireStdioServer } from '@memoire/mcp-runtime';
2
+ export declare function runMcpCommand(env?: NodeJS.ProcessEnv, deps?: {
3
+ runServer?: typeof runMemoireStdioServer;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAG7D,wBAAsB,aAAa,CACjC,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,IAAI,GAAE;IACJ,SAAS,CAAC,EAAE,OAAO,qBAAqB,CAAC;CACrC,GACL,OAAO,CAAC,IAAI,CAAC,CAef"}
package/dist/mcp.js ADDED
@@ -0,0 +1,18 @@
1
+ import { runMemoireStdioServer } from '@memoire/mcp-runtime';
2
+ import { readLocalConfig } from './local-config.js';
3
+ export async function runMcpCommand(env = process.env, deps = {}) {
4
+ const config = readLocalConfig({
5
+ configPath: env.MEMOIRE_CONFIG_PATH,
6
+ });
7
+ const clientId = env.MEMOIRE_CLIENT_ID ?? config.client_id;
8
+ await (deps.runServer ?? runMemoireStdioServer)({
9
+ apiUrl: env.MEMOIRE_API_URL ?? config.api_url,
10
+ apiKey: env.MEMOIRE_API_KEY ?? config.api_key,
11
+ orgId: env.MEMOIRE_ORG_ID ?? config.org_id,
12
+ projectId: env.MEMOIRE_PROJECT_ID ?? config.project_id,
13
+ userId: env.MEMOIRE_USER_ID ?? config.user_id,
14
+ sessionId: env.MEMOIRE_SESSION_ID,
15
+ ...(clientId ? { clientId } : {}),
16
+ });
17
+ }
18
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAyB,OAAO,CAAC,GAAG,EACpC,OAEI,EAAE;IAEN,MAAM,MAAM,GAAG,eAAe,CAAC;QAC7B,UAAU,EAAE,GAAG,CAAC,mBAAmB;KACpC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,GAAG,CAAC,iBAAiB,IAAI,MAAM,CAAC,SAAS,CAAC;IAE3D,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,qBAAqB,CAAC,CAAC;QAC9C,MAAM,EAAE,GAAG,CAAC,eAAe,IAAI,MAAM,CAAC,OAAO;QAC7C,MAAM,EAAE,GAAG,CAAC,eAAe,IAAI,MAAM,CAAC,OAAO;QAC7C,KAAK,EAAE,GAAG,CAAC,cAAc,IAAI,MAAM,CAAC,MAAM;QAC1C,SAAS,EAAE,GAAG,CAAC,kBAAkB,IAAI,MAAM,CAAC,UAAU;QACtD,MAAM,EAAE,GAAG,CAAC,eAAe,IAAI,MAAM,CAAC,OAAO;QAC7C,SAAS,EAAE,GAAG,CAAC,kBAAkB;QACjC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClC,CAAC,CAAC;AACL,CAAC"}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "memoire-ai",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "description": "Memoire CLI for installing and querying shared AI coding context",
6
+ "license": "AGPL-3.0",
7
+ "files": [
8
+ "dist",
9
+ "!dist/**/*.test.*",
10
+ "!dist/*.test.*",
11
+ "skills",
12
+ "README.md"
13
+ ],
14
+ "exports": {
15
+ ".": {
16
+ "types": "./dist/index.d.ts",
17
+ "import": "./dist/index.js"
18
+ },
19
+ "./package.json": "./package.json"
20
+ },
21
+ "keywords": [
22
+ "ai",
23
+ "cli",
24
+ "cursor",
25
+ "claude",
26
+ "codex",
27
+ "mcp",
28
+ "memory"
29
+ ],
30
+ "engines": {
31
+ "node": ">=18.0.0"
32
+ },
33
+ "bin": {
34
+ "memoire": "./dist/cli.js"
35
+ },
36
+ "main": "./dist/index.js",
37
+ "types": "./dist/index.d.ts",
38
+ "dependencies": {
39
+ "yaml": "^2.8.1",
40
+ "@memoire/collector": "0.1.0",
41
+ "@memoire/dashboard": "0.1.0",
42
+ "@memoire/sdk": "0.1.0",
43
+ "@memoire/shared": "0.1.0",
44
+ "@memoire/mcp-runtime": "0.1.0"
45
+ },
46
+ "devDependencies": {
47
+ "@types/node": "^20.0.0",
48
+ "typescript": "^5.7.0"
49
+ },
50
+ "scripts": {
51
+ "build": "tsc",
52
+ "dev": "tsc --watch",
53
+ "test": "node --test dist/*.test.js"
54
+ }
55
+ }
@@ -0,0 +1,79 @@
1
+ ---
2
+ name: use-memoire
3
+ description: Search and contribute to shared project memory across your team's AI agents
4
+ activation: When you need project context, past decisions, team conventions, or want to record what you learned
5
+ ---
6
+
7
+ # Use Memoire
8
+
9
+ ## When to Activate
10
+
11
+ - You need project context, architecture decisions, or team conventions
12
+ - You want to check if someone already tried an approach (avoid repeating failures)
13
+ - You are starting a new task and need to understand current project state
14
+ - You finished work and want to record decisions, observations, or failed attempts
15
+ - You need to hand off context to another agent or teammate
16
+
17
+ ## Workflow
18
+
19
+ ### 1. Search — find relevant context before you start
20
+
21
+ ```
22
+ search_context(query: "your task description")
23
+ project_profile() # architecture, conventions, focus
24
+ assemble_context(query: "optional focus") # prompt-ready context block
25
+ ```
26
+
27
+ ### 2. Use — apply what you found
28
+
29
+ - Follow conventions already recorded in memory
30
+ - Avoid approaches that were previously attempted and failed
31
+ - Build on existing architectural decisions
32
+
33
+ ### 3. Record — persist what you learned
34
+
35
+ ```
36
+ write_memory_event(
37
+ event_type: "decision" | "observation" | "attempt" | "convention",
38
+ content: "what happened and why",
39
+ files_modified: ["src/foo.ts"],
40
+ concepts: ["auth", "jwt"]
41
+ )
42
+ ```
43
+
44
+ Record **failed attempts** — they prevent teammates from repeating mistakes.
45
+
46
+ ### 4. Handoff — pass context forward (optional)
47
+
48
+ ```
49
+ save_handoff(query: "focus area", title: "Auth refactor status")
50
+ ```
51
+
52
+ ## Tool Quick Reference
53
+
54
+ | Tool | Use For |
55
+ |------|---------|
56
+ | `search_context` | Find past decisions, observations, attempts |
57
+ | `timeline_context` | See recent chronological activity |
58
+ | `project_profile` | Get architecture, conventions, current focus |
59
+ | `project_facts` | Get derived static/dynamic project facts |
60
+ | `assemble_context` | Get a prompt-ready context block |
61
+ | `oracle_research` | Deep research: "why did we...", "how does..." |
62
+ | `tracer_search` | Trace decision/concept history across events |
63
+ | `write_memory_event` | Record a decision, observation, attempt, or convention |
64
+ | `write_scratchpad` | Write a temporary note (expires in 24h) |
65
+ | `get_scratchpad` | Read temporary notes from teammates |
66
+ | `save_handoff` | Save context bundle for another agent |
67
+ | `list_handoffs` / `get_handoff` | Retrieve saved handoffs |
68
+ | `search_docs` | Search indexed dependency documentation |
69
+ | `index_docs` | Index docs for a package by name |
70
+ | `memory_health` | Check project memory health and coverage |
71
+ | `memoire_advisor` | Analyze code against project conventions |
72
+
73
+ ## Key Rules
74
+
75
+ - Always search before implementing. Someone may have already solved your problem.
76
+ - Record the "why" behind decisions, not just the "what".
77
+ - Use `attempt` event type for failed or abandoned approaches.
78
+ - Include `files_modified` and `concepts` for better future search recall.
79
+ - Use `write_scratchpad` for ephemeral notes; `write_memory_event` for durable knowledge.