@synth-coder/memhub 0.2.3 → 0.2.5

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 (118) hide show
  1. package/.github/workflows/ci.yml +48 -12
  2. package/.github/workflows/release.yml +70 -0
  3. package/AGENTS.md +71 -73
  4. package/README.md +284 -195
  5. package/README.zh-CN.md +90 -30
  6. package/dist/src/cli/agents/claude-code.d.ts +5 -0
  7. package/dist/src/cli/agents/claude-code.d.ts.map +1 -0
  8. package/dist/src/cli/agents/claude-code.js +14 -0
  9. package/dist/src/cli/agents/claude-code.js.map +1 -0
  10. package/dist/src/cli/agents/cline.d.ts +5 -0
  11. package/dist/src/cli/agents/cline.d.ts.map +1 -0
  12. package/dist/src/cli/agents/cline.js +14 -0
  13. package/dist/src/cli/agents/cline.js.map +1 -0
  14. package/dist/src/cli/agents/cursor.d.ts +5 -0
  15. package/dist/src/cli/agents/cursor.d.ts.map +1 -0
  16. package/dist/src/cli/agents/cursor.js +14 -0
  17. package/dist/src/cli/agents/cursor.js.map +1 -0
  18. package/dist/src/cli/agents/factory-droid.d.ts +5 -0
  19. package/dist/src/cli/agents/factory-droid.d.ts.map +1 -0
  20. package/dist/src/cli/agents/factory-droid.js +14 -0
  21. package/dist/src/cli/agents/factory-droid.js.map +1 -0
  22. package/dist/src/cli/agents/gemini-cli.d.ts +5 -0
  23. package/dist/src/cli/agents/gemini-cli.d.ts.map +1 -0
  24. package/dist/src/cli/agents/gemini-cli.js +14 -0
  25. package/dist/src/cli/agents/gemini-cli.js.map +1 -0
  26. package/dist/src/cli/agents/index.d.ts +13 -0
  27. package/dist/src/cli/agents/index.d.ts.map +1 -0
  28. package/dist/src/cli/agents/index.js +27 -0
  29. package/dist/src/cli/agents/index.js.map +1 -0
  30. package/dist/src/cli/agents/windsurf.d.ts +5 -0
  31. package/dist/src/cli/agents/windsurf.d.ts.map +1 -0
  32. package/dist/src/cli/agents/windsurf.js +14 -0
  33. package/dist/src/cli/agents/windsurf.js.map +1 -0
  34. package/dist/src/cli/index.d.ts +8 -0
  35. package/dist/src/cli/index.d.ts.map +1 -0
  36. package/dist/src/cli/index.js +168 -0
  37. package/dist/src/cli/index.js.map +1 -0
  38. package/dist/src/cli/init.d.ts +34 -0
  39. package/dist/src/cli/init.d.ts.map +1 -0
  40. package/dist/src/cli/init.js +140 -0
  41. package/dist/src/cli/init.js.map +1 -0
  42. package/dist/src/cli/instructions.d.ts +29 -0
  43. package/dist/src/cli/instructions.d.ts.map +1 -0
  44. package/dist/src/cli/instructions.js +141 -0
  45. package/dist/src/cli/instructions.js.map +1 -0
  46. package/dist/src/cli/types.d.ts +22 -0
  47. package/dist/src/cli/types.d.ts.map +1 -0
  48. package/dist/src/cli/types.js +75 -0
  49. package/dist/src/cli/types.js.map +1 -0
  50. package/dist/src/contracts/mcp.js +34 -34
  51. package/dist/src/contracts/schemas.js.map +1 -1
  52. package/dist/src/server/mcp-server.d.ts.map +1 -1
  53. package/dist/src/server/mcp-server.js +7 -14
  54. package/dist/src/server/mcp-server.js.map +1 -1
  55. package/dist/src/services/embedding-service.d.ts.map +1 -1
  56. package/dist/src/services/embedding-service.js +1 -1
  57. package/dist/src/services/embedding-service.js.map +1 -1
  58. package/dist/src/services/memory-service.d.ts.map +1 -1
  59. package/dist/src/services/memory-service.js.map +1 -1
  60. package/dist/src/storage/markdown-storage.d.ts.map +1 -1
  61. package/dist/src/storage/markdown-storage.js +1 -1
  62. package/dist/src/storage/markdown-storage.js.map +1 -1
  63. package/dist/src/storage/vector-index.d.ts.map +1 -1
  64. package/dist/src/storage/vector-index.js +4 -5
  65. package/dist/src/storage/vector-index.js.map +1 -1
  66. package/docs/README.md +21 -0
  67. package/docs/mcp-tools.md +136 -0
  68. package/docs/user-guide.md +184 -0
  69. package/package.json +61 -59
  70. package/src/cli/agents/claude-code.ts +14 -0
  71. package/src/cli/agents/cline.ts +14 -0
  72. package/src/cli/agents/codex.ts +14 -0
  73. package/src/cli/agents/cursor.ts +14 -0
  74. package/src/cli/agents/factory-droid.ts +14 -0
  75. package/src/cli/agents/gemini-cli.ts +14 -0
  76. package/src/cli/agents/index.ts +36 -0
  77. package/src/cli/agents/windsurf.ts +14 -0
  78. package/src/cli/index.ts +192 -0
  79. package/src/cli/init.ts +218 -0
  80. package/src/cli/instructions.ts +156 -0
  81. package/src/cli/types.ts +112 -0
  82. package/src/contracts/index.ts +12 -12
  83. package/src/contracts/mcp.ts +223 -223
  84. package/src/contracts/schemas.ts +307 -307
  85. package/src/contracts/types.ts +410 -410
  86. package/src/index.ts +8 -8
  87. package/src/server/index.ts +5 -5
  88. package/src/server/mcp-server.ts +169 -186
  89. package/src/services/embedding-service.ts +114 -114
  90. package/src/services/index.ts +5 -5
  91. package/src/services/memory-service.ts +656 -663
  92. package/src/storage/frontmatter-parser.ts +243 -243
  93. package/src/storage/index.ts +6 -6
  94. package/src/storage/markdown-storage.ts +228 -236
  95. package/src/storage/vector-index.ts +159 -160
  96. package/src/utils/index.ts +5 -5
  97. package/src/utils/slugify.ts +63 -63
  98. package/test/cli/init.test.ts +402 -0
  99. package/test/contracts/schemas.test.ts +313 -313
  100. package/test/contracts/types.test.ts +21 -21
  101. package/test/frontmatter-parser-more.test.ts +94 -94
  102. package/test/server/mcp-server.test.ts +211 -210
  103. package/test/services/memory-service-edge.test.ts +248 -248
  104. package/test/services/memory-service.test.ts +291 -279
  105. package/test/storage/frontmatter-parser.test.ts +223 -223
  106. package/test/storage/markdown-storage.test.ts +226 -217
  107. package/test/storage/storage-edge.test.ts +238 -238
  108. package/test/storage/vector-index.test.ts +149 -153
  109. package/test/utils/slugify-edge.test.ts +94 -94
  110. package/test/utils/slugify.test.ts +72 -68
  111. package/docs/architecture-diagrams.md +0 -368
  112. package/docs/architecture.md +0 -381
  113. package/docs/contracts.md +0 -190
  114. package/docs/prompt-template.md +0 -33
  115. package/docs/proposals/mcp-typescript-sdk-refactor.md +0 -568
  116. package/docs/proposals/proposal-close-gates.md +0 -58
  117. package/docs/tool-calling-policy.md +0 -101
  118. package/docs/vector-search.md +0 -306
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Claude Code MCP configuration generator
3
+ */
4
+ export function generateClaudeCodeConfig(_memhubPath) {
5
+ return {
6
+ mcpServers: {
7
+ memhub: {
8
+ command: 'npx',
9
+ args: ['-y', '@synth-coder/memhub'],
10
+ },
11
+ },
12
+ };
13
+ }
14
+ //# sourceMappingURL=claude-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../../src/cli/agents/claude-code.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,wBAAwB,CAAC,WAAmB;IAC1D,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,5 @@
1
+ /**
2
+ * Cline MCP configuration generator
3
+ */
4
+ export declare function generateClineConfig(_memhubPath: string): Record<string, unknown>;
5
+ //# sourceMappingURL=cline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cline.d.ts","sourceRoot":"","sources":["../../../../src/cli/agents/cline.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAShF"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Cline MCP configuration generator
3
+ */
4
+ export function generateClineConfig(_memhubPath) {
5
+ return {
6
+ mcpServers: {
7
+ memhub: {
8
+ command: 'npx',
9
+ args: ['-y', '@synth-coder/memhub'],
10
+ },
11
+ },
12
+ };
13
+ }
14
+ //# sourceMappingURL=cline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cline.js","sourceRoot":"","sources":["../../../../src/cli/agents/cline.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,mBAAmB,CAAC,WAAmB;IACrD,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,5 @@
1
+ /**
2
+ * Cursor MCP configuration generator
3
+ */
4
+ export declare function generateCursorConfig(_memhubPath: string): Record<string, unknown>;
5
+ //# sourceMappingURL=cursor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../../../src/cli/agents/cursor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASjF"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Cursor MCP configuration generator
3
+ */
4
+ export function generateCursorConfig(_memhubPath) {
5
+ return {
6
+ mcpServers: {
7
+ memhub: {
8
+ command: 'npx',
9
+ args: ['-y', '@synth-coder/memhub'],
10
+ },
11
+ },
12
+ };
13
+ }
14
+ //# sourceMappingURL=cursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../../src/cli/agents/cursor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,oBAAoB,CAAC,WAAmB;IACtD,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,5 @@
1
+ /**
2
+ * Factory Droid MCP configuration generator
3
+ */
4
+ export declare function generateFactoryDroidConfig(_memhubPath: string): Record<string, unknown>;
5
+ //# sourceMappingURL=factory-droid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory-droid.d.ts","sourceRoot":"","sources":["../../../../src/cli/agents/factory-droid.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASvF"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Factory Droid MCP configuration generator
3
+ */
4
+ export function generateFactoryDroidConfig(_memhubPath) {
5
+ return {
6
+ mcpServers: {
7
+ memhub: {
8
+ command: 'npx',
9
+ args: ['-y', '@synth-coder/memhub'],
10
+ },
11
+ },
12
+ };
13
+ }
14
+ //# sourceMappingURL=factory-droid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory-droid.js","sourceRoot":"","sources":["../../../../src/cli/agents/factory-droid.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,0BAA0B,CAAC,WAAmB;IAC5D,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,5 @@
1
+ /**
2
+ * Gemini CLI MCP configuration generator
3
+ */
4
+ export declare function generateGeminiCliConfig(_memhubPath: string): Record<string, unknown>;
5
+ //# sourceMappingURL=gemini-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-cli.d.ts","sourceRoot":"","sources":["../../../../src/cli/agents/gemini-cli.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASpF"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Gemini CLI MCP configuration generator
3
+ */
4
+ export function generateGeminiCliConfig(_memhubPath) {
5
+ return {
6
+ mcpServers: {
7
+ memhub: {
8
+ command: 'npx',
9
+ args: ['-y', '@synth-coder/memhub'],
10
+ },
11
+ },
12
+ };
13
+ }
14
+ //# sourceMappingURL=gemini-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-cli.js","sourceRoot":"","sources":["../../../../src/cli/agents/gemini-cli.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,uBAAuB,CAAC,WAAmB;IACzD,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,13 @@
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
+ import type { AgentType } from '../types.js';
11
+ export type ConfigGenerator = (memhubPath: string) => Record<string, unknown>;
12
+ export declare function getConfigGenerator(agentId: AgentType): ConfigGenerator;
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","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;AAE1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAQ7C,MAAM,MAAM,eAAe,GAAG,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAW9E,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,SAAS,GAAG,eAAe,CAEtE"}
@@ -0,0 +1,27 @@
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
+ import { generateCursorConfig } from './cursor.js';
11
+ import { generateClaudeCodeConfig } from './claude-code.js';
12
+ import { generateClineConfig } from './cline.js';
13
+ import { generateWindsurfConfig } from './windsurf.js';
14
+ import { generateFactoryDroidConfig } from './factory-droid.js';
15
+ import { generateGeminiCliConfig } from './gemini-cli.js';
16
+ const generators = {
17
+ cursor: generateCursorConfig,
18
+ 'claude-code': generateClaudeCodeConfig,
19
+ cline: generateClineConfig,
20
+ windsurf: generateWindsurfConfig,
21
+ 'factory-droid': generateFactoryDroidConfig,
22
+ 'gemini-cli': generateGeminiCliConfig,
23
+ };
24
+ export function getConfigGenerator(agentId) {
25
+ return generators[agentId];
26
+ }
27
+ //# 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;AAG1D,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;AAI1D,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;CACtC,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":";AACA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,MAAM,EAAkB,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAMtC,sBAAsB;AACtB,IAAI,eAAe,GAAG,IAAI,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;AAC/D,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;IACjC,eAAe,GAAG,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAgB,CAAC;AACtF,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,IAAI,OAAO,CAAC;AAE/C;;GAEG;AACH,KAAK,UAAU,cAAc;IAC3B,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,SAAS;IAChB,sCAAsC;IACtC,OAAO,CAAC,GAAG,CAAC;cACA,OAAO;;;;;;;;;;;;;;EAcnB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;;CAQ7D,CAAC,CAAC;AACH,CAAC;AAED,SAAS,YAAY;IACnB,sCAAsC;IACtC,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1C,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAkB,CAAC,EAAE,CAAC;QAC7C,OAAO,KAAkB,CAAC;IAC5B,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,kBAAkB,KAAK,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,KAAK,CAAC,iBAAiB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,IAAc;IAClC,gBAAgB;IAChB,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAExB,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QAC7C,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,OAAO,KAAK,WAAW,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QAChD,YAAY,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;QAC3C,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,qBAAqB;IACrB,IAAI,KAA4B,CAAC;IACjC,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,KAAK,GAAG,KAAK,CAAC;IAElB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpB,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACxB,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;gBACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;YACjC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,KAAK,GAAG,MAAM,CAAC;QACjB,CAAC;aAAM,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YAC7C,KAAK,GAAG,IAAI,CAAC;QACf,CAAC;aAAM,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YAC7C,KAAK,GAAG,IAAI,CAAC;QACf,CAAC;aAAM,CAAC;YACN,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,CAAC,CAAC,KAAK,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;IAE9B,mDAAmD;IACnD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,aAAa,GAAG,MAAM,sBAAsB,EAAE,CAAC;QACrD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,CAAC,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,KAAK,GAAG,aAAa,CAAC;IACxB,CAAC;IAED,wBAAwB;IACxB,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IACtB,CAAC,CAAC,KAAK,CAAC,0BAA0B,KAAK,KAAK,CAAC,CAAC;IAE9C,MAAM,MAAM,GAAG,SAAS,CAAC;QACvB,KAAK;QACL,KAAK;QACL,KAAK;KACN,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9C,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAElD,IAAI,MAAM,CAAC,mBAAmB,EAAE,CAAC;YAC/B,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,iBAAiB,MAAM,CAAC,gBAAgB,KAAK,MAAM,CAAC,kBAAkB,GAAG,CAAC,CAAC;QAC3F,CAAC;aAAM,CAAC;YACN,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,gBAAgB,KAAK,MAAM,CAAC,kBAAkB,GAAG,CAAC,CAAC;QACxF,CAAC;QAED,CAAC,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;IACvD,CAAC;SAAM,CAAC;QACN,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC/B,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEnC,4BAA4B;IAC5B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,cAAc,EAAE,CAAC;QACvB,OAAO;IACT,CAAC;IAED,qBAAqB;IACrB,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -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;AAIpF,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;AA4BjD;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAexE;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,CAuG3D"}
@@ -0,0 +1,140 @@
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
+ /**
13
+ * Merge memhub config into existing config
14
+ * Preserves all existing servers, adds/updates memhub
15
+ */
16
+ function mergeMcpConfig(existing, newConfig) {
17
+ const result = { ...existing };
18
+ // Ensure mcpServers object exists
19
+ if (typeof result.mcpServers !== 'object' || result.mcpServers === null) {
20
+ result.mcpServers = {};
21
+ }
22
+ // Merge memhub server
23
+ const existingServers = result.mcpServers;
24
+ const newServers = newConfig.mcpServers;
25
+ for (const [serverName, serverConfig] of Object.entries(newServers)) {
26
+ existingServers[serverName] = serverConfig;
27
+ }
28
+ return result;
29
+ }
30
+ /**
31
+ * Run interactive agent selection using clack
32
+ */
33
+ export async function selectAgentInteractive() {
34
+ const selection = await p.select({
35
+ message: 'Select your AI agent',
36
+ options: AGENTS.map(agent => ({
37
+ value: agent.id,
38
+ label: agent.name,
39
+ hint: agent.description,
40
+ })),
41
+ });
42
+ if (p.isCancel(selection)) {
43
+ return null;
44
+ }
45
+ return selection;
46
+ }
47
+ /**
48
+ * Generate and write MCP configuration for the specified agent
49
+ */
50
+ export function initAgent(options) {
51
+ const { agent, force = false, local = false, projectPath } = options;
52
+ const agentConfig = getAgentById(agent);
53
+ if (!agentConfig) {
54
+ return {
55
+ success: false,
56
+ error: `Unknown agent: ${agent}. Valid agents: ${AGENTS.map(a => a.id).join(', ')}`,
57
+ };
58
+ }
59
+ // Determine base path and file paths based on local flag
60
+ const basePath = projectPath ?? (local ? process.cwd() : homedir());
61
+ const configFile = local ? agentConfig.configFile : agentConfig.globalConfigFile;
62
+ const instructionsFile = local
63
+ ? agentConfig.instructionsFile
64
+ : agentConfig.globalInstructionsFile;
65
+ const configPath = join(basePath, configFile);
66
+ const configDir = dirname(configPath);
67
+ const instructionsPath = join(basePath, instructionsFile);
68
+ const instructionsDir = dirname(instructionsPath);
69
+ // Generate MCP configuration
70
+ const generator = getConfigGenerator(agent);
71
+ const newConfig = generator(basePath);
72
+ let finalConfig;
73
+ // Check if config already exists
74
+ if (existsSync(configPath)) {
75
+ if (force) {
76
+ // Force: still merge, but this updates memhub entry
77
+ try {
78
+ const existingContent = readFileSync(configPath, 'utf-8');
79
+ const existingConfig = JSON.parse(existingContent);
80
+ finalConfig = mergeMcpConfig(existingConfig, newConfig);
81
+ }
82
+ catch {
83
+ // Invalid JSON, use new config
84
+ finalConfig = newConfig;
85
+ }
86
+ }
87
+ else {
88
+ // No force: check if memhub already exists
89
+ try {
90
+ const existingContent = readFileSync(configPath, 'utf-8');
91
+ const existingConfig = JSON.parse(existingContent);
92
+ const servers = existingConfig.mcpServers;
93
+ if (servers && 'memhub' in servers) {
94
+ return {
95
+ success: false,
96
+ error: `MemHub is already configured in ${configFile}. Use --force to update.`,
97
+ };
98
+ }
99
+ // Merge with existing config
100
+ finalConfig = mergeMcpConfig(existingConfig, newConfig);
101
+ }
102
+ catch {
103
+ return {
104
+ success: false,
105
+ error: `Failed to parse existing config at ${configFile}. Use --force to overwrite.`,
106
+ };
107
+ }
108
+ }
109
+ }
110
+ else {
111
+ finalConfig = newConfig;
112
+ }
113
+ // Ensure directories exist
114
+ if (!existsSync(configDir)) {
115
+ mkdirSync(configDir, { recursive: true });
116
+ }
117
+ if (!existsSync(instructionsDir)) {
118
+ mkdirSync(instructionsDir, { recursive: true });
119
+ }
120
+ // Write MCP configuration
121
+ writeFileSync(configPath, JSON.stringify(finalConfig, null, 2), 'utf-8');
122
+ // Handle instructions file
123
+ let existingContent = '';
124
+ if (existsSync(instructionsPath)) {
125
+ existingContent = readFileSync(instructionsPath, 'utf-8');
126
+ }
127
+ const { content: updatedContent, updated: instructionsUpdated, reason: instructionsReason, } = updateInstructionsContent(existingContent, agentConfig);
128
+ if (instructionsUpdated || !existsSync(instructionsPath)) {
129
+ writeFileSync(instructionsPath, updatedContent, 'utf-8');
130
+ }
131
+ return {
132
+ success: true,
133
+ configPath: configFile,
134
+ instructionsPath: instructionsFile,
135
+ instructionsUpdated,
136
+ instructionsReason,
137
+ agent: agentConfig,
138
+ };
139
+ }
140
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,MAAM,EAAoC,YAAY,EAAE,MAAM,YAAY,CAAC;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AA0B9D;;;GAGG;AACH,SAAS,cAAc,CACrB,QAAiC,EACjC,SAAkC;IAElC,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;IAE/B,kCAAkC;IAClC,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QACxE,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC;IACzB,CAAC;IAED,sBAAsB;IACtB,MAAM,eAAe,GAAG,MAAM,CAAC,UAAqC,CAAC;IACrE,MAAM,UAAU,GAAG,SAAS,CAAC,UAAqC,CAAC;IAEnE,KAAK,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACpE,eAAe,CAAC,UAAU,CAAC,GAAG,YAAY,CAAC;IAC7C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC;QAC/B,OAAO,EAAE,sBAAsB;QAC/B,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC5B,KAAK,EAAE,KAAK,CAAC,EAAE;YACf,KAAK,EAAE,KAAK,CAAC,IAAI;YACjB,IAAI,EAAE,KAAK,CAAC,WAAW;SACxB,CAAC,CAAC;KACJ,CAAC,CAAC;IAEH,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,OAAoB;IAC5C,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAErE,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,kBAAkB,KAAK,mBAAmB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SACpF,CAAC;IACJ,CAAC;IAED,yDAAyD;IACzD,MAAM,QAAQ,GAAG,WAAW,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACpE,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,gBAAgB,CAAC;IACjF,MAAM,gBAAgB,GAAG,KAAK;QAC5B,CAAC,CAAC,WAAW,CAAC,gBAAgB;QAC9B,CAAC,CAAC,WAAW,CAAC,sBAAsB,CAAC;IAEvC,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IAC1D,MAAM,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAElD,6BAA6B;IAC7B,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAEtC,IAAI,WAAoC,CAAC;IAEzC,iCAAiC;IACjC,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,IAAI,KAAK,EAAE,CAAC;YACV,oDAAoD;YACpD,IAAI,CAAC;gBACH,MAAM,eAAe,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBAC1D,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAA4B,CAAC;gBAC9E,WAAW,GAAG,cAAc,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;YAC1D,CAAC;YAAC,MAAM,CAAC;gBACP,+BAA+B;gBAC/B,WAAW,GAAG,SAAS,CAAC;YAC1B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,2CAA2C;YAC3C,IAAI,CAAC;gBACH,MAAM,eAAe,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBAC1D,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAA4B,CAAC;gBAC9E,MAAM,OAAO,GAAG,cAAc,CAAC,UAAiD,CAAC;gBAEjF,IAAI,OAAO,IAAI,QAAQ,IAAI,OAAO,EAAE,CAAC;oBACnC,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,mCAAmC,UAAU,0BAA0B;qBAC/E,CAAC;gBACJ,CAAC;gBAED,6BAA6B;gBAC7B,WAAW,GAAG,cAAc,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;YAC1D,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,sCAAsC,UAAU,6BAA6B;iBACrF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,WAAW,GAAG,SAAS,CAAC;IAC1B,CAAC;IAED,2BAA2B;IAC3B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACjC,SAAS,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,0BAA0B;IAC1B,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAEzE,2BAA2B;IAC3B,IAAI,eAAe,GAAG,EAAE,CAAC;IACzB,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACjC,eAAe,GAAG,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,EACJ,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,mBAAmB,EAC5B,MAAM,EAAE,kBAAkB,GAC3B,GAAG,yBAAyB,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;IAE5D,IAAI,mBAAmB,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACzD,aAAa,CAAC,gBAAgB,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,UAAU;QACtB,gBAAgB,EAAE,gBAAgB;QAClC,mBAAmB;QACnB,kBAAkB;QAClB,KAAK,EAAE,WAAW;KACnB,CAAC;AACJ,CAAC"}
@@ -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"}