@synth-coder/memhub 0.2.3 → 0.2.4

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 (143) hide show
  1. package/.eslintrc.cjs +45 -45
  2. package/.factory/commands/opsx-apply.md +150 -150
  3. package/.factory/commands/opsx-archive.md +155 -155
  4. package/.factory/commands/opsx-explore.md +171 -171
  5. package/.factory/commands/opsx-propose.md +104 -104
  6. package/.factory/skills/openspec-apply-change/SKILL.md +156 -156
  7. package/.factory/skills/openspec-archive-change/SKILL.md +114 -114
  8. package/.factory/skills/openspec-explore/SKILL.md +288 -288
  9. package/.factory/skills/openspec-propose/SKILL.md +110 -110
  10. package/.github/workflows/ci.yml +110 -74
  11. package/.github/workflows/release.yml +67 -0
  12. package/.iflow/commands/opsx-apply.md +152 -152
  13. package/.iflow/commands/opsx-archive.md +157 -157
  14. package/.iflow/commands/opsx-explore.md +173 -173
  15. package/.iflow/commands/opsx-propose.md +106 -106
  16. package/.iflow/skills/openspec-apply-change/SKILL.md +156 -156
  17. package/.iflow/skills/openspec-archive-change/SKILL.md +114 -114
  18. package/.iflow/skills/openspec-explore/SKILL.md +288 -288
  19. package/.iflow/skills/openspec-propose/SKILL.md +110 -110
  20. package/.prettierrc +11 -11
  21. package/AGENTS.md +167 -169
  22. package/README.md +276 -195
  23. package/README.zh-CN.md +245 -193
  24. package/dist/src/cli/agents/claude-code.d.ts +5 -0
  25. package/dist/src/cli/agents/claude-code.d.ts.map +1 -0
  26. package/dist/src/cli/agents/claude-code.js +14 -0
  27. package/dist/src/cli/agents/claude-code.js.map +1 -0
  28. package/dist/src/cli/agents/cline.d.ts +5 -0
  29. package/dist/src/cli/agents/cline.d.ts.map +1 -0
  30. package/dist/src/cli/agents/cline.js +14 -0
  31. package/dist/src/cli/agents/cline.js.map +1 -0
  32. package/dist/src/cli/agents/codex.d.ts +5 -0
  33. package/dist/src/cli/agents/codex.d.ts.map +1 -0
  34. package/dist/src/cli/agents/codex.js +14 -0
  35. package/dist/src/cli/agents/codex.js.map +1 -0
  36. package/dist/src/cli/agents/cursor.d.ts +5 -0
  37. package/dist/src/cli/agents/cursor.d.ts.map +1 -0
  38. package/dist/src/cli/agents/cursor.js +14 -0
  39. package/dist/src/cli/agents/cursor.js.map +1 -0
  40. package/dist/src/cli/agents/factory-droid.d.ts +5 -0
  41. package/dist/src/cli/agents/factory-droid.d.ts.map +1 -0
  42. package/dist/src/cli/agents/factory-droid.js +14 -0
  43. package/dist/src/cli/agents/factory-droid.js.map +1 -0
  44. package/dist/src/cli/agents/gemini-cli.d.ts +5 -0
  45. package/dist/src/cli/agents/gemini-cli.d.ts.map +1 -0
  46. package/dist/src/cli/agents/gemini-cli.js +14 -0
  47. package/dist/src/cli/agents/gemini-cli.js.map +1 -0
  48. package/dist/src/cli/agents/index.d.ts +14 -0
  49. package/dist/src/cli/agents/index.d.ts.map +1 -0
  50. package/dist/src/cli/agents/index.js +30 -0
  51. package/dist/src/cli/agents/index.js.map +1 -0
  52. package/dist/src/cli/agents/windsurf.d.ts +5 -0
  53. package/dist/src/cli/agents/windsurf.d.ts.map +1 -0
  54. package/dist/src/cli/agents/windsurf.js +14 -0
  55. package/dist/src/cli/agents/windsurf.js.map +1 -0
  56. package/dist/src/cli/index.d.ts +8 -0
  57. package/dist/src/cli/index.d.ts.map +1 -0
  58. package/dist/src/cli/index.js +168 -0
  59. package/dist/src/cli/index.js.map +1 -0
  60. package/dist/src/cli/init.d.ts +34 -0
  61. package/dist/src/cli/init.d.ts.map +1 -0
  62. package/dist/src/cli/init.js +160 -0
  63. package/dist/src/cli/init.js.map +1 -0
  64. package/dist/src/cli/instructions.d.ts +29 -0
  65. package/dist/src/cli/instructions.d.ts.map +1 -0
  66. package/dist/src/cli/instructions.js +141 -0
  67. package/dist/src/cli/instructions.js.map +1 -0
  68. package/dist/src/cli/types.d.ts +22 -0
  69. package/dist/src/cli/types.d.ts.map +1 -0
  70. package/dist/src/cli/types.js +86 -0
  71. package/dist/src/cli/types.js.map +1 -0
  72. package/dist/src/contracts/mcp.js +34 -34
  73. package/dist/src/contracts/schemas.js.map +1 -1
  74. package/dist/src/server/mcp-server.d.ts.map +1 -1
  75. package/dist/src/server/mcp-server.js +7 -14
  76. package/dist/src/server/mcp-server.js.map +1 -1
  77. package/dist/src/services/embedding-service.d.ts.map +1 -1
  78. package/dist/src/services/embedding-service.js +1 -1
  79. package/dist/src/services/embedding-service.js.map +1 -1
  80. package/dist/src/services/memory-service.d.ts.map +1 -1
  81. package/dist/src/services/memory-service.js.map +1 -1
  82. package/dist/src/storage/markdown-storage.d.ts.map +1 -1
  83. package/dist/src/storage/markdown-storage.js +1 -1
  84. package/dist/src/storage/markdown-storage.js.map +1 -1
  85. package/dist/src/storage/vector-index.d.ts.map +1 -1
  86. package/dist/src/storage/vector-index.js +4 -5
  87. package/dist/src/storage/vector-index.js.map +1 -1
  88. package/docs/README.md +21 -0
  89. package/docs/mcp-tools.md +136 -0
  90. package/docs/user-guide.md +182 -0
  91. package/package.json +61 -59
  92. package/src/cli/agents/claude-code.ts +14 -0
  93. package/src/cli/agents/cline.ts +14 -0
  94. package/src/cli/agents/codex.ts +14 -0
  95. package/src/cli/agents/cursor.ts +14 -0
  96. package/src/cli/agents/factory-droid.ts +14 -0
  97. package/src/cli/agents/gemini-cli.ts +14 -0
  98. package/src/cli/agents/index.ts +36 -0
  99. package/src/cli/agents/windsurf.ts +14 -0
  100. package/src/cli/index.ts +192 -0
  101. package/src/cli/init.ts +218 -0
  102. package/src/cli/instructions.ts +156 -0
  103. package/src/cli/types.ts +112 -0
  104. package/src/contracts/index.ts +12 -12
  105. package/src/contracts/mcp.ts +223 -223
  106. package/src/contracts/schemas.ts +307 -307
  107. package/src/contracts/types.ts +410 -410
  108. package/src/index.ts +8 -8
  109. package/src/server/index.ts +5 -5
  110. package/src/server/mcp-server.ts +169 -186
  111. package/src/services/embedding-service.ts +114 -114
  112. package/src/services/index.ts +5 -5
  113. package/src/services/memory-service.ts +656 -663
  114. package/src/storage/frontmatter-parser.ts +243 -243
  115. package/src/storage/index.ts +6 -6
  116. package/src/storage/markdown-storage.ts +228 -236
  117. package/src/storage/vector-index.ts +159 -160
  118. package/src/utils/index.ts +5 -5
  119. package/src/utils/slugify.ts +63 -63
  120. package/test/cli/init.test.ts +380 -0
  121. package/test/contracts/schemas.test.ts +313 -313
  122. package/test/contracts/types.test.ts +21 -21
  123. package/test/frontmatter-parser-more.test.ts +94 -94
  124. package/test/server/mcp-server.test.ts +211 -210
  125. package/test/services/memory-service-edge.test.ts +248 -248
  126. package/test/services/memory-service.test.ts +291 -279
  127. package/test/storage/frontmatter-parser.test.ts +223 -223
  128. package/test/storage/markdown-storage.test.ts +226 -217
  129. package/test/storage/storage-edge.test.ts +238 -238
  130. package/test/storage/vector-index.test.ts +149 -153
  131. package/test/utils/slugify-edge.test.ts +94 -94
  132. package/test/utils/slugify.test.ts +72 -68
  133. package/tsconfig.json +25 -25
  134. package/tsconfig.test.json +8 -8
  135. package/vitest.config.ts +29 -29
  136. package/docs/architecture-diagrams.md +0 -368
  137. package/docs/architecture.md +0 -381
  138. package/docs/contracts.md +0 -190
  139. package/docs/prompt-template.md +0 -33
  140. package/docs/proposals/mcp-typescript-sdk-refactor.md +0 -568
  141. package/docs/proposals/proposal-close-gates.md +0 -58
  142. package/docs/tool-calling-policy.md +0 -101
  143. package/docs/vector-search.md +0 -306
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Agent configuration generators index
3
+ */
4
+ export { generateCursorConfig } from './cursor.js';
5
+ export { generateClaudeCodeConfig } from './claude-code.js';
6
+ export { generateClineConfig } from './cline.js';
7
+ export { generateWindsurfConfig } from './windsurf.js';
8
+ export { generateFactoryDroidConfig } from './factory-droid.js';
9
+ export { generateGeminiCliConfig } from './gemini-cli.js';
10
+ export { generateCodexConfig } from './codex.js';
11
+ import { generateCursorConfig } from './cursor.js';
12
+ import { generateClaudeCodeConfig } from './claude-code.js';
13
+ import { generateClineConfig } from './cline.js';
14
+ import { generateWindsurfConfig } from './windsurf.js';
15
+ import { generateFactoryDroidConfig } from './factory-droid.js';
16
+ import { generateGeminiCliConfig } from './gemini-cli.js';
17
+ import { generateCodexConfig } from './codex.js';
18
+ const generators = {
19
+ cursor: generateCursorConfig,
20
+ 'claude-code': generateClaudeCodeConfig,
21
+ cline: generateClineConfig,
22
+ windsurf: generateWindsurfConfig,
23
+ 'factory-droid': generateFactoryDroidConfig,
24
+ 'gemini-cli': generateGeminiCliConfig,
25
+ codex: generateCodexConfig,
26
+ };
27
+ export function getConfigGenerator(agentId) {
28
+ return generators[agentId];
29
+ }
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/agents/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAIjD,MAAM,UAAU,GAAuC;IACrD,MAAM,EAAE,oBAAoB;IAC5B,aAAa,EAAE,wBAAwB;IACvC,KAAK,EAAE,mBAAmB;IAC1B,QAAQ,EAAE,sBAAsB;IAChC,eAAe,EAAE,0BAA0B;IAC3C,YAAY,EAAE,uBAAuB;IACrC,KAAK,EAAE,mBAAmB;CAC3B,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,OAAkB;IACnD,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Windsurf MCP configuration generator
3
+ */
4
+ export declare function generateWindsurfConfig(_memhubPath: string): Record<string, unknown>;
5
+ //# sourceMappingURL=windsurf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windsurf.d.ts","sourceRoot":"","sources":["../../../../src/cli/agents/windsurf.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASnF"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Windsurf MCP configuration generator
3
+ */
4
+ export function generateWindsurfConfig(_memhubPath) {
5
+ return {
6
+ mcpServers: {
7
+ memhub: {
8
+ command: 'npx',
9
+ args: ['-y', '@synth-coder/memhub'],
10
+ },
11
+ },
12
+ };
13
+ }
14
+ //# sourceMappingURL=windsurf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windsurf.js","sourceRoot":"","sources":["../../../../src/cli/agents/windsurf.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,sBAAsB,CAAC,WAAmB;IACxD,OAAO;QACL,UAAU,EAAE;YACV,MAAM,EAAE;gBACN,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,CAAC,IAAI,EAAE,qBAAqB,CAAC;aACpC;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MemHub CLI entry point
4
+ * - No args: start MCP server
5
+ * - With args: run CLI commands
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;;GAIG"}
@@ -0,0 +1,168 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MemHub CLI entry point
4
+ * - No args: start MCP server
5
+ * - With args: run CLI commands
6
+ */
7
+ import { readFileSync, existsSync } from 'fs';
8
+ import { join, dirname } from 'path';
9
+ import { fileURLToPath } from 'url';
10
+ import * as p from '@clack/prompts';
11
+ import { AGENTS } from './types.js';
12
+ import { initAgent, selectAgentInteractive } from './init.js';
13
+ import { createMcpServer } from '../server/mcp-server.js';
14
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
15
+ const __filename = fileURLToPath(import.meta.url);
16
+ const __dirname = dirname(__filename);
17
+ // Get package version
18
+ let packageJsonPath = join(__dirname, '../../../package.json');
19
+ if (!existsSync(packageJsonPath)) {
20
+ packageJsonPath = join(__dirname, '../../package.json');
21
+ }
22
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
23
+ const VERSION = packageJson.version || '0.0.0';
24
+ /**
25
+ * Start MCP server (no args mode)
26
+ */
27
+ async function startMcpServer() {
28
+ const server = createMcpServer();
29
+ const transport = new StdioServerTransport();
30
+ await server.connect(transport);
31
+ console.error('MemHub MCP Server running on stdio');
32
+ }
33
+ function printHelp() {
34
+ // eslint-disable-next-line no-console
35
+ console.log(`
36
+ MemHub CLI v${VERSION} - Git-friendly memory for AI agents
37
+
38
+ Usage:
39
+ memhub Start MCP server (default)
40
+ memhub init [options] Configure MemHub for your AI agent
41
+ memhub --help Show this help message
42
+ memhub --version Show version
43
+
44
+ Options:
45
+ -a, --agent <agent> Agent type (skip interactive selection)
46
+ -f, --force Update existing configuration
47
+ -l, --local Configure for current project (default: global)
48
+
49
+ Supported agents:
50
+ ${AGENTS.map(a => ` ${a.id.padEnd(15)} ${a.name}`).join('\n')}
51
+
52
+ Examples:
53
+ memhub # Start MCP server
54
+ memhub init # Interactive selection (global)
55
+ memhub init --local # Interactive selection (project)
56
+ memhub init --agent cursor # Configure for Cursor (global)
57
+ memhub init -a claude-code -l # Configure for Claude Code (project)
58
+ `);
59
+ }
60
+ function printVersion() {
61
+ // eslint-disable-next-line no-console
62
+ console.log(`MemHub CLI v${VERSION}`);
63
+ }
64
+ function parseAgent(value) {
65
+ const validAgents = AGENTS.map(a => a.id);
66
+ if (validAgents.includes(value)) {
67
+ return value;
68
+ }
69
+ console.error(`Invalid agent: ${value}`);
70
+ console.error(`Valid agents: ${validAgents.join(', ')}`);
71
+ return null;
72
+ }
73
+ async function runCli(args) {
74
+ // Parse command
75
+ const command = args[0];
76
+ if (command === '--help' || command === '-h') {
77
+ printHelp();
78
+ process.exit(0);
79
+ }
80
+ if (command === '--version' || command === '-v') {
81
+ printVersion();
82
+ process.exit(0);
83
+ }
84
+ if (command !== 'init') {
85
+ p.log.error(`Unknown command: ${command}`);
86
+ p.log.info('Run "memhub --help" for usage information.');
87
+ process.exit(1);
88
+ }
89
+ // Parse init options
90
+ let agent;
91
+ let force = false;
92
+ let local = false;
93
+ for (let i = 1; i < args.length; i++) {
94
+ const arg = args[i];
95
+ if (arg === '-a' || arg === '--agent') {
96
+ const value = args[++i];
97
+ if (!value) {
98
+ p.log.error('--agent requires a value');
99
+ process.exit(1);
100
+ }
101
+ const parsed = parseAgent(value);
102
+ if (!parsed) {
103
+ process.exit(1);
104
+ }
105
+ agent = parsed;
106
+ }
107
+ else if (arg === '-f' || arg === '--force') {
108
+ force = true;
109
+ }
110
+ else if (arg === '-l' || arg === '--local') {
111
+ local = true;
112
+ }
113
+ else {
114
+ p.log.error(`Unknown option: ${arg}`);
115
+ process.exit(1);
116
+ }
117
+ }
118
+ // Start interactive session
119
+ p.intro(`MemHub v${VERSION}`);
120
+ // If no agent specified, run interactive selection
121
+ if (!agent) {
122
+ const selectedAgent = await selectAgentInteractive();
123
+ if (!selectedAgent) {
124
+ p.cancel('Operation cancelled.');
125
+ process.exit(0);
126
+ }
127
+ agent = selectedAgent;
128
+ }
129
+ // Run init with spinner
130
+ const s = p.spinner();
131
+ s.start(`Configuring MemHub for ${agent}...`);
132
+ const result = initAgent({
133
+ agent,
134
+ force,
135
+ local,
136
+ });
137
+ if (result.success) {
138
+ s.stop(`Configured for ${result.agent.name}`);
139
+ p.log.success(`MCP config: ${result.configPath}`);
140
+ if (result.instructionsUpdated) {
141
+ p.log.success(`Instructions: ${result.instructionsPath} (${result.instructionsReason})`);
142
+ }
143
+ else {
144
+ p.log.info(`Instructions: ${result.instructionsPath} (${result.instructionsReason})`);
145
+ }
146
+ p.outro(`Restart your agent to start using MemHub.`);
147
+ }
148
+ else {
149
+ s.stop('Configuration failed');
150
+ p.log.error(result.error);
151
+ process.exit(1);
152
+ }
153
+ }
154
+ async function main() {
155
+ const args = process.argv.slice(2);
156
+ // No args: start MCP server
157
+ if (args.length === 0) {
158
+ await startMcpServer();
159
+ return;
160
+ }
161
+ // With args: run CLI
162
+ await runCli(args);
163
+ }
164
+ main().catch(error => {
165
+ console.error('Fatal error:', error);
166
+ process.exit(1);
167
+ });
168
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Init command implementation
3
+ * Generates MCP configuration for different AI agents
4
+ */
5
+ import { type AgentType, type AgentConfig } from './types.js';
6
+ export interface InitOptions {
7
+ readonly agent: AgentType;
8
+ /** @deprecated Use local instead */
9
+ readonly projectPath?: string;
10
+ readonly force?: boolean;
11
+ readonly local?: boolean;
12
+ }
13
+ export interface InitResult {
14
+ readonly success: true;
15
+ readonly configPath: string;
16
+ readonly instructionsPath: string;
17
+ readonly instructionsUpdated: boolean;
18
+ readonly instructionsReason: string;
19
+ readonly agent: AgentConfig;
20
+ }
21
+ export interface InitError {
22
+ readonly success: false;
23
+ readonly error: string;
24
+ }
25
+ export type InitOutcome = InitResult | InitError;
26
+ /**
27
+ * Run interactive agent selection using clack
28
+ */
29
+ export declare function selectAgentInteractive(): Promise<AgentType | null>;
30
+ /**
31
+ * Generate and write MCP configuration for the specified agent
32
+ */
33
+ export declare function initAgent(options: InitOptions): InitOutcome;
34
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAU,KAAK,SAAS,EAAE,KAAK,WAAW,EAAgB,MAAM,YAAY,CAAC;AAKpF,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,oCAAoC;IACpC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;IACtC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;CAC7B;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;AAsDjD;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAexE;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,CAwG3D"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Init command implementation
3
+ * Generates MCP configuration for different AI agents
4
+ */
5
+ import { existsSync, mkdirSync, writeFileSync, readFileSync } from 'fs';
6
+ import { dirname, join } from 'path';
7
+ import { homedir } from 'os';
8
+ import * as p from '@clack/prompts';
9
+ import { AGENTS, getAgentById } from './types.js';
10
+ import { getConfigGenerator } from './agents/index.js';
11
+ import { updateInstructionsContent } from './instructions.js';
12
+ import { parse as parseToml, stringify as stringifyToml } from 'smol-toml';
13
+ /**
14
+ * Parse config file content based on format
15
+ */
16
+ function parseConfig(content, format) {
17
+ if (format === 'toml') {
18
+ return parseToml(content);
19
+ }
20
+ return JSON.parse(content);
21
+ }
22
+ /**
23
+ * Stringify config to string based on format
24
+ */
25
+ function stringifyConfig(config, format) {
26
+ if (format === 'toml') {
27
+ return stringifyToml(config);
28
+ }
29
+ return JSON.stringify(config, null, 2);
30
+ }
31
+ /**
32
+ * Merge memhub config into existing config
33
+ * Preserves all existing servers, adds/updates memhub
34
+ */
35
+ function mergeMcpConfig(existing, newConfig) {
36
+ const result = { ...existing };
37
+ // Ensure mcpServers object exists
38
+ if (typeof result.mcpServers !== 'object' || result.mcpServers === null) {
39
+ result.mcpServers = {};
40
+ }
41
+ // Merge memhub server
42
+ const existingServers = result.mcpServers;
43
+ const newServers = newConfig.mcpServers;
44
+ for (const [serverName, serverConfig] of Object.entries(newServers)) {
45
+ existingServers[serverName] = serverConfig;
46
+ }
47
+ return result;
48
+ }
49
+ /**
50
+ * Run interactive agent selection using clack
51
+ */
52
+ export async function selectAgentInteractive() {
53
+ const selection = await p.select({
54
+ message: 'Select your AI agent',
55
+ options: AGENTS.map(agent => ({
56
+ value: agent.id,
57
+ label: agent.name,
58
+ hint: agent.description,
59
+ })),
60
+ });
61
+ if (p.isCancel(selection)) {
62
+ return null;
63
+ }
64
+ return selection;
65
+ }
66
+ /**
67
+ * Generate and write MCP configuration for the specified agent
68
+ */
69
+ export function initAgent(options) {
70
+ const { agent, force = false, local = false, projectPath } = options;
71
+ const agentConfig = getAgentById(agent);
72
+ if (!agentConfig) {
73
+ return {
74
+ success: false,
75
+ error: `Unknown agent: ${agent}. Valid agents: ${AGENTS.map(a => a.id).join(', ')}`,
76
+ };
77
+ }
78
+ // Determine base path and file paths based on local flag
79
+ const basePath = projectPath ?? (local ? process.cwd() : homedir());
80
+ const configFile = local ? agentConfig.configFile : agentConfig.globalConfigFile;
81
+ const instructionsFile = local
82
+ ? agentConfig.instructionsFile
83
+ : agentConfig.globalInstructionsFile;
84
+ const configPath = join(basePath, configFile);
85
+ const configDir = dirname(configPath);
86
+ const instructionsPath = join(basePath, instructionsFile);
87
+ const instructionsDir = dirname(instructionsPath);
88
+ // Generate MCP configuration
89
+ const generator = getConfigGenerator(agent);
90
+ const newConfig = generator(basePath);
91
+ let finalConfig;
92
+ // Check if config already exists
93
+ const configFormat = agentConfig.configFormat;
94
+ if (existsSync(configPath)) {
95
+ if (force) {
96
+ // Force: still merge, but this updates memhub entry
97
+ try {
98
+ const existingContent = readFileSync(configPath, 'utf-8');
99
+ const existingConfig = parseConfig(existingContent, configFormat);
100
+ finalConfig = mergeMcpConfig(existingConfig, newConfig);
101
+ }
102
+ catch {
103
+ // Invalid config, use new config
104
+ finalConfig = newConfig;
105
+ }
106
+ }
107
+ else {
108
+ // No force: check if memhub already exists
109
+ try {
110
+ const existingContent = readFileSync(configPath, 'utf-8');
111
+ const existingConfig = parseConfig(existingContent, configFormat);
112
+ const servers = existingConfig.mcpServers;
113
+ if (servers && 'memhub' in servers) {
114
+ return {
115
+ success: false,
116
+ error: `MemHub is already configured in ${configFile}. Use --force to update.`,
117
+ };
118
+ }
119
+ // Merge with existing config
120
+ finalConfig = mergeMcpConfig(existingConfig, newConfig);
121
+ }
122
+ catch {
123
+ return {
124
+ success: false,
125
+ error: `Failed to parse existing config at ${configFile}. Use --force to overwrite.`,
126
+ };
127
+ }
128
+ }
129
+ }
130
+ else {
131
+ finalConfig = newConfig;
132
+ }
133
+ // Ensure directories exist
134
+ if (!existsSync(configDir)) {
135
+ mkdirSync(configDir, { recursive: true });
136
+ }
137
+ if (!existsSync(instructionsDir)) {
138
+ mkdirSync(instructionsDir, { recursive: true });
139
+ }
140
+ // Write MCP configuration
141
+ writeFileSync(configPath, stringifyConfig(finalConfig, configFormat), 'utf-8');
142
+ // Handle instructions file
143
+ let existingContent = '';
144
+ if (existsSync(instructionsPath)) {
145
+ existingContent = readFileSync(instructionsPath, 'utf-8');
146
+ }
147
+ const { content: updatedContent, updated: instructionsUpdated, reason: instructionsReason, } = updateInstructionsContent(existingContent, agentConfig);
148
+ if (instructionsUpdated || !existsSync(instructionsPath)) {
149
+ writeFileSync(instructionsPath, updatedContent, 'utf-8');
150
+ }
151
+ return {
152
+ success: true,
153
+ configPath: configFile,
154
+ instructionsPath: instructionsFile,
155
+ instructionsUpdated,
156
+ instructionsReason,
157
+ agent: agentConfig,
158
+ };
159
+ }
160
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * MemHub instructions generator
3
+ * Generates agent-specific instruction content with versioned tags
4
+ */
5
+ import type { AgentConfig } from './types.js';
6
+ /**
7
+ * Extract MemHub version from content if present
8
+ */
9
+ export declare function extractMemHubVersion(content: string): string | null;
10
+ /**
11
+ * Check if MemHub instructions exist and need update
12
+ */
13
+ export declare function needsUpdate(content: string): boolean;
14
+ /**
15
+ * Generate MemHub instructions content
16
+ */
17
+ export declare function generateInstructionsContent(agent: AgentConfig): string;
18
+ /**
19
+ * Update instructions file content
20
+ * - If no MemHub section: prepend new instructions
21
+ * - If MemHub section exists and outdated: replace with new version
22
+ * - If MemHub section exists and current: no change
23
+ */
24
+ export declare function updateInstructionsContent(existingContent: string, agent: AgentConfig): {
25
+ content: string;
26
+ updated: boolean;
27
+ reason: string;
28
+ };
29
+ //# sourceMappingURL=instructions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instructions.d.ts","sourceRoot":"","sources":["../../../src/cli/instructions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAO9C;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGnE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAIpD;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CA8EtE;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,eAAe,EAAE,MAAM,EACvB,KAAK,EAAE,WAAW,GACjB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAkCvD"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * MemHub instructions generator
3
+ * Generates agent-specific instruction content with versioned tags
4
+ */
5
+ const MEMHUB_VERSION = '0.2.3';
6
+ const START_TAG = `<!-- MEMHUB:v${MEMHUB_VERSION}:START -->`;
7
+ const END_TAG = '<!-- MEMHUB:END -->';
8
+ /**
9
+ * Extract MemHub version from content if present
10
+ */
11
+ export function extractMemHubVersion(content) {
12
+ const match = content.match(/<!-- MEMHUB:v([\d.]+):START -->/);
13
+ return match ? match[1] : null;
14
+ }
15
+ /**
16
+ * Check if MemHub instructions exist and need update
17
+ */
18
+ export function needsUpdate(content) {
19
+ const version = extractMemHubVersion(content);
20
+ if (!version)
21
+ return true;
22
+ return version !== MEMHUB_VERSION;
23
+ }
24
+ /**
25
+ * Generate MemHub instructions content
26
+ */
27
+ export function generateInstructionsContent(agent) {
28
+ const isMarkdown = agent.instructionsFormat === 'markdown';
29
+ if (isMarkdown) {
30
+ return `${START_TAG}
31
+ ## MemHub - AI Memory System
32
+
33
+ MemHub is a Git-friendly memory system for storing decisions, preferences, and reusable knowledge.
34
+
35
+ ### When to Call memory_load
36
+
37
+ **Proactively call** memory_load in these scenarios:
38
+
39
+ - Starting a new conversation or task
40
+ - User mentions "before", "remember", "last time" keywords
41
+ - Uncertain about user preferences or constraints
42
+ - Need project context (tech stack, conventions, architecture)
43
+
44
+ ### When to Call memory_update
45
+
46
+ **Proactively store** memories in these scenarios:
47
+
48
+ - User explicitly expresses a preference ("I prefer functional components")
49
+ - User makes a decision with reasoning ("Using PostgreSQL because...")
50
+ - Discover important project context (tech stack, constraints, patterns)
51
+ - User corrects your assumptions ("Actually, we don't use Redux")
52
+
53
+ ### Usage Principles
54
+
55
+ 1. **Load on demand** - Call memory_load at task start to get context
56
+ 2. **Store timely** - Call memory_update when learning valuable information
57
+ 3. **Query precisely** - Use tags to filter relevant memories
58
+ 4. **Describe concisely** - Be specific in content, helpful in title
59
+
60
+ ### Memory Types
61
+
62
+ | entryType | Purpose |
63
+ |-----------|---------|
64
+ | preference | User preferences (coding style, framework choices) |
65
+ | decision | Architecture decisions, technology choices |
66
+ | context | Project context (team, processes, constraints) |
67
+ | fact | Learned facts, important notes |
68
+
69
+ ${END_TAG}`;
70
+ }
71
+ // Plain text format (for .cursorrules, .clinerules, etc.)
72
+ return `${START_TAG}
73
+ # MemHub - AI Memory System
74
+
75
+ MemHub is a Git-friendly memory system for storing decisions, preferences, and reusable knowledge.
76
+
77
+ ## When to Call memory_load
78
+
79
+ - Starting a new conversation or task
80
+ - User mentions "before", "remember", "last time" keywords
81
+ - Uncertain about user preferences or constraints
82
+ - Need project context (tech stack, conventions, architecture)
83
+
84
+ ## When to Call memory_update
85
+
86
+ - User explicitly expresses a preference
87
+ - User makes a decision with reasoning
88
+ - Discover important project context
89
+ - User corrects your assumptions
90
+
91
+ ## Memory Types
92
+
93
+ - preference: User preferences
94
+ - decision: Architecture decisions
95
+ - context: Project context
96
+ - fact: Learned facts
97
+
98
+ ## Principle
99
+
100
+ Will my future self benefit from knowing this? If yes, store it.
101
+
102
+ ${END_TAG}`;
103
+ }
104
+ /**
105
+ * Update instructions file content
106
+ * - If no MemHub section: prepend new instructions
107
+ * - If MemHub section exists and outdated: replace with new version
108
+ * - If MemHub section exists and current: no change
109
+ */
110
+ export function updateInstructionsContent(existingContent, agent) {
111
+ const trimmedContent = existingContent.trim();
112
+ const hasMemHub = trimmedContent.includes('<!-- MEMHUB:');
113
+ if (!hasMemHub) {
114
+ // No MemHub section: prepend
115
+ const newInstructions = generateInstructionsContent(agent);
116
+ return {
117
+ content: `${newInstructions}\n\n${trimmedContent}`,
118
+ updated: true,
119
+ reason: 'MemHub instructions added',
120
+ };
121
+ }
122
+ const currentVersion = extractMemHubVersion(trimmedContent);
123
+ if (currentVersion === MEMHUB_VERSION) {
124
+ // Already up to date
125
+ return {
126
+ content: existingContent,
127
+ updated: false,
128
+ reason: 'Already up to date',
129
+ };
130
+ }
131
+ // Need to update: replace old section with new
132
+ const newInstructions = generateInstructionsContent(agent);
133
+ const pattern = /<!-- MEMHUB:v[\d.]+:START -->[\s\S]*?<!-- MEMHUB:END -->/;
134
+ const updatedContent = trimmedContent.replace(pattern, newInstructions);
135
+ return {
136
+ content: updatedContent,
137
+ updated: true,
138
+ reason: `Updated from v${currentVersion} to v${MEMHUB_VERSION}`,
139
+ };
140
+ }
141
+ //# sourceMappingURL=instructions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../../src/cli/instructions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,cAAc,GAAG,OAAO,CAAC;AAE/B,MAAM,SAAS,GAAG,gBAAgB,cAAc,YAAY,CAAC;AAC7D,MAAM,OAAO,GAAG,qBAAqB,CAAC;AAEtC;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC/D,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,MAAM,OAAO,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,OAAO,OAAO,KAAK,cAAc,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B,CAAC,KAAkB;IAC5D,MAAM,UAAU,GAAG,KAAK,CAAC,kBAAkB,KAAK,UAAU,CAAC;IAE3D,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,GAAG,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuCrB,OAAO,EAAE,CAAC;IACV,CAAC;IAED,0DAA0D;IAC1D,OAAO,GAAG,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8BnB,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CACvC,eAAuB,EACvB,KAAkB;IAElB,MAAM,cAAc,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC;IAC9C,MAAM,SAAS,GAAG,cAAc,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAE1D,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,6BAA6B;QAC7B,MAAM,eAAe,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAC;QAC3D,OAAO;YACL,OAAO,EAAE,GAAG,eAAe,OAAO,cAAc,EAAE;YAClD,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,2BAA2B;SACpC,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,oBAAoB,CAAC,cAAc,CAAC,CAAC;IAC5D,IAAI,cAAc,KAAK,cAAc,EAAE,CAAC;QACtC,qBAAqB;QACrB,OAAO;YACL,OAAO,EAAE,eAAe;YACxB,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,oBAAoB;SAC7B,CAAC;IACJ,CAAC;IAED,+CAA+C;IAC/C,MAAM,eAAe,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,0DAA0D,CAAC;IAC3E,MAAM,cAAc,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IAExE,OAAO;QACL,OAAO,EAAE,cAAc;QACvB,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,iBAAiB,cAAc,QAAQ,cAAc,EAAE;KAChE,CAAC;AACJ,CAAC"}