memax-cli 0.1.0-alpha.9 → 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 (197) hide show
  1. package/assets/skills/memax-memory/SKILL.md +173 -0
  2. package/dist/commands/agent-configs.d.ts +41 -0
  3. package/dist/commands/agent-configs.d.ts.map +1 -0
  4. package/dist/commands/agent-configs.js +1290 -0
  5. package/dist/commands/agent-configs.js.map +1 -0
  6. package/dist/commands/agent-configs.test.d.ts +2 -0
  7. package/dist/commands/agent-configs.test.d.ts.map +1 -0
  8. package/dist/commands/agent-configs.test.js +122 -0
  9. package/dist/commands/agent-configs.test.js.map +1 -0
  10. package/dist/commands/agent-sessions.d.ts +74 -0
  11. package/dist/commands/agent-sessions.d.ts.map +1 -0
  12. package/dist/commands/agent-sessions.js +1513 -0
  13. package/dist/commands/agent-sessions.js.map +1 -0
  14. package/dist/commands/agent-sessions.test.d.ts +2 -0
  15. package/dist/commands/agent-sessions.test.d.ts.map +1 -0
  16. package/dist/commands/agent-sessions.test.js +255 -0
  17. package/dist/commands/agent-sessions.test.js.map +1 -0
  18. package/dist/commands/agents.d.ts +3 -0
  19. package/dist/commands/agents.d.ts.map +1 -0
  20. package/dist/commands/agents.js +36 -0
  21. package/dist/commands/agents.js.map +1 -0
  22. package/dist/commands/ask.d.ts +15 -0
  23. package/dist/commands/ask.d.ts.map +1 -0
  24. package/dist/commands/ask.js +483 -0
  25. package/dist/commands/ask.js.map +1 -0
  26. package/dist/commands/auth.d.ts +7 -0
  27. package/dist/commands/auth.d.ts.map +1 -1
  28. package/dist/commands/auth.js +103 -8
  29. package/dist/commands/auth.js.map +1 -1
  30. package/dist/commands/capture.d.ts +19 -0
  31. package/dist/commands/capture.d.ts.map +1 -0
  32. package/dist/commands/capture.js +69 -0
  33. package/dist/commands/capture.js.map +1 -0
  34. package/dist/commands/config.d.ts +2 -0
  35. package/dist/commands/config.d.ts.map +1 -1
  36. package/dist/commands/config.js +13 -0
  37. package/dist/commands/config.js.map +1 -1
  38. package/dist/commands/delete.d.ts +2 -0
  39. package/dist/commands/delete.d.ts.map +1 -1
  40. package/dist/commands/delete.js +15 -18
  41. package/dist/commands/delete.js.map +1 -1
  42. package/dist/commands/dreams.d.ts +22 -0
  43. package/dist/commands/dreams.d.ts.map +1 -0
  44. package/dist/commands/dreams.js +251 -0
  45. package/dist/commands/dreams.js.map +1 -0
  46. package/dist/commands/dreams.test.d.ts +2 -0
  47. package/dist/commands/dreams.test.d.ts.map +1 -0
  48. package/dist/commands/dreams.test.js +39 -0
  49. package/dist/commands/dreams.test.js.map +1 -0
  50. package/dist/commands/hook.d.ts +2 -0
  51. package/dist/commands/hook.d.ts.map +1 -1
  52. package/dist/commands/hook.js +25 -103
  53. package/dist/commands/hook.js.map +1 -1
  54. package/dist/commands/hub.d.ts +37 -0
  55. package/dist/commands/hub.d.ts.map +1 -0
  56. package/dist/commands/hub.js +347 -0
  57. package/dist/commands/hub.js.map +1 -0
  58. package/dist/commands/hub.test.d.ts +2 -0
  59. package/dist/commands/hub.test.d.ts.map +1 -0
  60. package/dist/commands/hub.test.js +62 -0
  61. package/dist/commands/hub.test.js.map +1 -0
  62. package/dist/commands/import.d.ts +13 -0
  63. package/dist/commands/import.d.ts.map +1 -0
  64. package/dist/commands/import.js +257 -0
  65. package/dist/commands/import.js.map +1 -0
  66. package/dist/commands/import.test.d.ts +2 -0
  67. package/dist/commands/import.test.d.ts.map +1 -0
  68. package/dist/commands/import.test.js +11 -0
  69. package/dist/commands/import.test.js.map +1 -0
  70. package/dist/commands/list.d.ts +9 -2
  71. package/dist/commands/list.d.ts.map +1 -1
  72. package/dist/commands/list.js +118 -9
  73. package/dist/commands/list.js.map +1 -1
  74. package/dist/commands/list.test.d.ts +2 -0
  75. package/dist/commands/list.test.d.ts.map +1 -0
  76. package/dist/commands/list.test.js +20 -0
  77. package/dist/commands/list.test.js.map +1 -0
  78. package/dist/commands/login.d.ts +7 -1
  79. package/dist/commands/login.d.ts.map +1 -1
  80. package/dist/commands/login.js +81 -20
  81. package/dist/commands/login.js.map +1 -1
  82. package/dist/commands/mcp.d.ts.map +1 -1
  83. package/dist/commands/mcp.js +386 -65
  84. package/dist/commands/mcp.js.map +1 -1
  85. package/dist/commands/push.d.ts +6 -1
  86. package/dist/commands/push.d.ts.map +1 -1
  87. package/dist/commands/push.js +42 -8
  88. package/dist/commands/push.js.map +1 -1
  89. package/dist/commands/recall.d.ts +11 -1
  90. package/dist/commands/recall.d.ts.map +1 -1
  91. package/dist/commands/recall.js +228 -41
  92. package/dist/commands/recall.js.map +1 -1
  93. package/dist/commands/recall.test.d.ts +2 -0
  94. package/dist/commands/recall.test.d.ts.map +1 -0
  95. package/dist/commands/recall.test.js +31 -0
  96. package/dist/commands/recall.test.js.map +1 -0
  97. package/dist/commands/setup-hooks.d.ts +13 -0
  98. package/dist/commands/setup-hooks.d.ts.map +1 -0
  99. package/dist/commands/setup-hooks.js +193 -0
  100. package/dist/commands/setup-hooks.js.map +1 -0
  101. package/dist/commands/setup-instructions.d.ts +21 -0
  102. package/dist/commands/setup-instructions.d.ts.map +1 -0
  103. package/dist/commands/setup-instructions.js +172 -0
  104. package/dist/commands/setup-instructions.js.map +1 -0
  105. package/dist/commands/setup-mcp.d.ts +40 -0
  106. package/dist/commands/setup-mcp.d.ts.map +1 -0
  107. package/dist/commands/setup-mcp.js +414 -0
  108. package/dist/commands/setup-mcp.js.map +1 -0
  109. package/dist/commands/setup-types.d.ts +33 -0
  110. package/dist/commands/setup-types.d.ts.map +1 -0
  111. package/dist/commands/setup-types.js +60 -0
  112. package/dist/commands/setup-types.js.map +1 -0
  113. package/dist/commands/setup.d.ts +10 -1
  114. package/dist/commands/setup.d.ts.map +1 -1
  115. package/dist/commands/setup.js +216 -534
  116. package/dist/commands/setup.js.map +1 -1
  117. package/dist/commands/show.d.ts +5 -1
  118. package/dist/commands/show.d.ts.map +1 -1
  119. package/dist/commands/show.js +36 -14
  120. package/dist/commands/show.js.map +1 -1
  121. package/dist/commands/topic.d.ts +32 -0
  122. package/dist/commands/topic.d.ts.map +1 -0
  123. package/dist/commands/topic.js +265 -0
  124. package/dist/commands/topic.js.map +1 -0
  125. package/dist/commands/topic.test.d.ts +2 -0
  126. package/dist/commands/topic.test.d.ts.map +1 -0
  127. package/dist/commands/topic.test.js +114 -0
  128. package/dist/commands/topic.test.js.map +1 -0
  129. package/dist/index.js +35 -144
  130. package/dist/index.js.map +1 -1
  131. package/dist/lib/client.d.ts +10 -0
  132. package/dist/lib/client.d.ts.map +1 -0
  133. package/dist/lib/client.js +104 -0
  134. package/dist/lib/client.js.map +1 -0
  135. package/dist/lib/client.test.d.ts +2 -0
  136. package/dist/lib/client.test.d.ts.map +1 -0
  137. package/dist/lib/client.test.js +44 -0
  138. package/dist/lib/client.test.js.map +1 -0
  139. package/dist/lib/config.d.ts +43 -0
  140. package/dist/lib/config.d.ts.map +1 -1
  141. package/dist/lib/config.js +72 -1
  142. package/dist/lib/config.js.map +1 -1
  143. package/dist/lib/credentials.d.ts +3 -0
  144. package/dist/lib/credentials.d.ts.map +1 -1
  145. package/dist/lib/credentials.js +24 -2
  146. package/dist/lib/credentials.js.map +1 -1
  147. package/dist/lib/hubs.d.ts +7 -0
  148. package/dist/lib/hubs.d.ts.map +1 -0
  149. package/dist/lib/hubs.js +33 -0
  150. package/dist/lib/hubs.js.map +1 -0
  151. package/dist/lib/hubs.test.d.ts +2 -0
  152. package/dist/lib/hubs.test.d.ts.map +1 -0
  153. package/dist/lib/hubs.test.js +58 -0
  154. package/dist/lib/hubs.test.js.map +1 -0
  155. package/dist/lib/project-context.d.ts +56 -0
  156. package/dist/lib/project-context.d.ts.map +1 -0
  157. package/dist/lib/project-context.js +225 -0
  158. package/dist/lib/project-context.js.map +1 -0
  159. package/dist/lib/project-context.test.d.ts +2 -0
  160. package/dist/lib/project-context.test.d.ts.map +1 -0
  161. package/dist/lib/project-context.test.js +75 -0
  162. package/dist/lib/project-context.test.js.map +1 -0
  163. package/dist/lib/prompt.d.ts +7 -0
  164. package/dist/lib/prompt.d.ts.map +1 -0
  165. package/dist/lib/prompt.js +41 -0
  166. package/dist/lib/prompt.js.map +1 -0
  167. package/dist/lib/trash.d.ts +6 -0
  168. package/dist/lib/trash.d.ts.map +1 -0
  169. package/dist/lib/trash.js +28 -0
  170. package/dist/lib/trash.js.map +1 -0
  171. package/package.json +17 -13
  172. package/.vscode/mcp.json +0 -8
  173. package/dist/commands/sync.d.ts +0 -12
  174. package/dist/commands/sync.d.ts.map +0 -1
  175. package/dist/commands/sync.js +0 -414
  176. package/dist/commands/sync.js.map +0 -1
  177. package/dist/lib/api.d.ts +0 -4
  178. package/dist/lib/api.d.ts.map +0 -1
  179. package/dist/lib/api.js +0 -95
  180. package/dist/lib/api.js.map +0 -1
  181. package/src/commands/auth.ts +0 -92
  182. package/src/commands/config.ts +0 -27
  183. package/src/commands/delete.ts +0 -58
  184. package/src/commands/hook.ts +0 -243
  185. package/src/commands/list.ts +0 -38
  186. package/src/commands/login.ts +0 -164
  187. package/src/commands/mcp.ts +0 -405
  188. package/src/commands/push.ts +0 -137
  189. package/src/commands/recall.ts +0 -163
  190. package/src/commands/setup.ts +0 -1077
  191. package/src/commands/show.ts +0 -35
  192. package/src/commands/sync.ts +0 -506
  193. package/src/index.ts +0 -213
  194. package/src/lib/api.ts +0 -110
  195. package/src/lib/config.ts +0 -61
  196. package/src/lib/credentials.ts +0 -42
  197. package/tsconfig.json +0 -9
@@ -1,11 +1,12 @@
1
1
  import { readFileSync, writeFileSync, mkdirSync, existsSync } from "node:fs";
2
2
  import { join } from "node:path";
3
3
  import { homedir } from "node:os";
4
+ import { randomUUID, createHash } from "node:crypto";
4
5
  const CONFIG_DIR = join(homedir(), ".memax");
5
6
  const CONFIG_FILE = join(CONFIG_DIR, "config.json");
6
7
  const DEFAULT_CONFIG = {
7
8
  api_url: "http://localhost:8080",
8
- default_hub: "default",
9
+ default_hub: "",
9
10
  default_boundary: "private",
10
11
  auto_categorize: true,
11
12
  };
@@ -21,6 +22,9 @@ export function loadConfig() {
21
22
  try {
22
23
  const raw = readFileSync(CONFIG_FILE, "utf-8");
23
24
  const config = { ...DEFAULT_CONFIG, ...JSON.parse(raw) };
25
+ if (!config.active_hub_id && config.default_hub) {
26
+ config.active_hub_id = config.default_hub;
27
+ }
24
28
  if (envUrl)
25
29
  config.api_url = envUrl;
26
30
  return config;
@@ -46,4 +50,71 @@ export function saveConfig(config) {
46
50
  const merged = { ...existing, ...config };
47
51
  writeFileSync(CONFIG_FILE, JSON.stringify(merged, null, 2) + "\n");
48
52
  }
53
+ export function getActiveHubID() {
54
+ const config = loadConfig();
55
+ return config.active_hub_id?.trim() || config.default_hub?.trim() || "";
56
+ }
57
+ export function setActiveHubID(hubID) {
58
+ saveConfig({ active_hub_id: hubID });
59
+ }
60
+ export function getOrCreateDeviceID() {
61
+ const config = loadConfig();
62
+ if (config.device_id && config.device_id.trim()) {
63
+ return config.device_id;
64
+ }
65
+ const deviceID = randomUUID();
66
+ saveConfig({ device_id: deviceID });
67
+ return deviceID;
68
+ }
69
+ export function makeSyncSourceID(rootPath) {
70
+ return createHash("sha256").update(rootPath).digest("hex").slice(0, 12);
71
+ }
72
+ export function listSyncSources() {
73
+ return [...(loadConfig().sync_sources ?? [])].sort((a, b) => a.root_path.localeCompare(b.root_path));
74
+ }
75
+ export function upsertSyncSource(source) {
76
+ const config = loadConfig();
77
+ const syncSources = [...(config.sync_sources ?? [])];
78
+ const id = source.id ?? makeSyncSourceID(source.root_path);
79
+ const next = {
80
+ id,
81
+ root_path: source.root_path,
82
+ kind: source.kind,
83
+ ignore_patterns: [...source.ignore_patterns],
84
+ default_boundary: source.default_boundary,
85
+ deletion_policy: source.deletion_policy,
86
+ last_sync_at: source.last_sync_at,
87
+ last_mode: source.last_mode,
88
+ last_scan_count: source.last_scan_count,
89
+ last_pushed: source.last_pushed,
90
+ last_skipped: source.last_skipped,
91
+ last_errors: source.last_errors,
92
+ };
93
+ const existingIndex = syncSources.findIndex((item) => item.id === id);
94
+ if (existingIndex >= 0) {
95
+ syncSources[existingIndex] = next;
96
+ }
97
+ else {
98
+ syncSources.push(next);
99
+ }
100
+ saveConfig({ sync_sources: syncSources });
101
+ return next;
102
+ }
103
+ export function updateSyncSourceRun(rootPath, update) {
104
+ const existing = listSyncSources().find((item) => item.root_path === rootPath);
105
+ return upsertSyncSource({
106
+ id: existing?.id,
107
+ root_path: rootPath,
108
+ kind: "directory",
109
+ ignore_patterns: update.ignorePatterns,
110
+ default_boundary: update.defaultBoundary,
111
+ deletion_policy: "retain",
112
+ last_sync_at: new Date().toISOString(),
113
+ last_mode: update.mode,
114
+ last_scan_count: update.scanCount,
115
+ last_pushed: update.pushed,
116
+ last_skipped: update.skipped,
117
+ last_errors: update.errors,
118
+ });
119
+ }
49
120
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AASpD,MAAM,cAAc,GAAgB;IAClC,OAAO,EAAE,uBAAuB;IAChC,WAAW,EAAE,SAAS;IACtB,gBAAgB,EAAE,SAAS;IAC3B,eAAe,EAAE,IAAI;CACtB,CAAC;AAEF,MAAM,UAAU,YAAY;IAC1B,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,+BAA+B;IAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IAEzC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC;IAC1E,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACzD,IAAI,MAAM;YAAE,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC;QACpC,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC;IAC1E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAA4B;IACrD,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE3C,IAAI,QAAQ,GAAG,cAAc,CAAC;IAC9B,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,QAAQ,GAAG;gBACT,GAAG,cAAc;gBACjB,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;aAClD,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1C,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACrE,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
@@ -2,10 +2,13 @@ interface Credentials {
2
2
  access_token: string;
3
3
  refresh_token: string;
4
4
  expires_at?: number;
5
+ local_agent_keys?: Record<string, string>;
5
6
  }
6
7
  export declare function loadCredentials(): Credentials | null;
7
8
  export declare function saveCredentials(creds: Credentials): void;
8
9
  export declare function isTokenExpired(): boolean;
9
10
  export declare function clearCredentials(): void;
11
+ export declare function getLocalAgentKey(agentID: string): string | undefined;
12
+ export declare function saveLocalAgentKey(agentID: string, apiKey: string): void;
10
13
  export {};
11
14
  //# sourceMappingURL=credentials.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"AAMA,UAAU,WAAW;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,eAAe,IAAI,WAAW,GAAG,IAAI,CASpD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAKxD;AAED,wBAAgB,cAAc,IAAI,OAAO,CAKxC;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAIvC"}
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"AAMA,UAAU,WAAW;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C;AAED,wBAAgB,eAAe,IAAI,WAAW,GAAG,IAAI,CASpD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAWxD;AAED,wBAAgB,cAAc,IAAI,OAAO,CAKxC;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAIvC;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGpE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAWvE"}
@@ -7,7 +7,7 @@ export function loadCredentials() {
7
7
  return null;
8
8
  try {
9
9
  const creds = JSON.parse(readFileSync(CRED_FILE, "utf-8"));
10
- if (!creds.access_token)
10
+ if (!creds.access_token && !creds.local_agent_keys)
11
11
  return null;
12
12
  return creds;
13
13
  }
@@ -17,7 +17,13 @@ export function loadCredentials() {
17
17
  }
18
18
  export function saveCredentials(creds) {
19
19
  mkdirSync(getConfigDir(), { recursive: true });
20
- writeFileSync(CRED_FILE, JSON.stringify(creds, null, 2) + "\n", {
20
+ const existing = loadCredentials();
21
+ const next = {
22
+ ...existing,
23
+ ...creds,
24
+ local_agent_keys: creds.local_agent_keys ?? existing?.local_agent_keys,
25
+ };
26
+ writeFileSync(CRED_FILE, JSON.stringify(next, null, 2) + "\n", {
21
27
  mode: 0o600,
22
28
  });
23
29
  }
@@ -33,4 +39,20 @@ export function clearCredentials() {
33
39
  writeFileSync(CRED_FILE, "{}\n", { mode: 0o600 });
34
40
  }
35
41
  }
42
+ export function getLocalAgentKey(agentID) {
43
+ const creds = loadCredentials();
44
+ return creds?.local_agent_keys?.[agentID];
45
+ }
46
+ export function saveLocalAgentKey(agentID, apiKey) {
47
+ const creds = loadCredentials() ?? {
48
+ access_token: "",
49
+ refresh_token: "",
50
+ };
51
+ const localAgentKeys = { ...(creds.local_agent_keys ?? {}) };
52
+ localAgentKeys[agentID] = apiKey;
53
+ saveCredentials({
54
+ ...creds,
55
+ local_agent_keys: localAgentKeys,
56
+ });
57
+ }
36
58
  //# sourceMappingURL=credentials.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,kBAAkB,CAAC,CAAC;AAQ3D,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAgB,CAAC;QAC1E,IAAI,CAAC,KAAK,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC;QACrC,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAkB;IAChD,SAAS,CAAC,YAAY,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;QAC9D,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,IAAI,CAAC,KAAK,EAAE,UAAU;QAAE,OAAO,KAAK,CAAC,CAAC,gCAAgC;IACtE,uDAAuD;IACvD,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACpD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,kBAAkB,CAAC,CAAC;AAS3D,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAgB,CAAC;QAC1E,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,gBAAgB;YAAE,OAAO,IAAI,CAAC;QAChE,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAkB;IAChD,SAAS,CAAC,YAAY,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,MAAM,IAAI,GAAgB;QACxB,GAAG,QAAQ;QACX,GAAG,KAAK;QACR,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,IAAI,QAAQ,EAAE,gBAAgB;KACvE,CAAC;IACF,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;QAC7D,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,IAAI,CAAC,KAAK,EAAE,UAAU;QAAE,OAAO,KAAK,CAAC,CAAC,gCAAgC;IACtE,uDAAuD;IACvD,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACpD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,OAAO,KAAK,EAAE,gBAAgB,EAAE,CAAC,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,MAAc;IAC/D,MAAM,KAAK,GAAG,eAAe,EAAE,IAAI;QACjC,YAAY,EAAE,EAAE;QAChB,aAAa,EAAE,EAAE;KAClB,CAAC;IACF,MAAM,cAAc,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,gBAAgB,IAAI,EAAE,CAAC,EAAE,CAAC;IAC7D,cAAc,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC;IACjC,eAAe,CAAC;QACd,GAAG,KAAK;QACR,gBAAgB,EAAE,cAAc;KACjC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { Hub, HubWithRole } from "memax-sdk";
2
+ export declare const PERSONAL_HUB_ALIAS = "personal";
3
+ export declare function getHubReference(hub: Hub): string;
4
+ export declare function findHubMatch(hubs: HubWithRole[], ref: string): HubWithRole | undefined;
5
+ export declare function resolveHubID(ref: string | undefined): Promise<string | undefined>;
6
+ export declare function requireHub(ref: string): Promise<HubWithRole>;
7
+ //# sourceMappingURL=hubs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hubs.d.ts","sourceRoot":"","sources":["../../src/lib/hubs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAGlD,eAAO,MAAM,kBAAkB,aAAa,CAAC;AAM7C,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAEhD;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,WAAW,EAAE,EACnB,GAAG,EAAE,MAAM,GACV,WAAW,GAAG,SAAS,CAWzB;AAED,wBAAsB,YAAY,CAChC,GAAG,EAAE,MAAM,GAAG,SAAS,GACtB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAI7B;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CASlE"}
@@ -0,0 +1,33 @@
1
+ import { getClient } from "./client.js";
2
+ export const PERSONAL_HUB_ALIAS = "personal";
3
+ function normalizeHubRef(value) {
4
+ return value.trim().toLowerCase();
5
+ }
6
+ export function getHubReference(hub) {
7
+ return hub.hub_type === "personal" ? PERSONAL_HUB_ALIAS : hub.slug;
8
+ }
9
+ export function findHubMatch(hubs, ref) {
10
+ const normalized = normalizeHubRef(ref);
11
+ if (normalized === PERSONAL_HUB_ALIAS) {
12
+ return hubs.find(({ hub }) => hub.hub_type === "personal");
13
+ }
14
+ return hubs.find(({ hub }) => {
15
+ return (normalizeHubRef(hub.id) === normalized ||
16
+ normalizeHubRef(hub.slug) === normalized);
17
+ });
18
+ }
19
+ export async function resolveHubID(ref) {
20
+ if (!ref)
21
+ return undefined;
22
+ const hubs = await getClient().hubs.list();
23
+ return findHubMatch(hubs, ref)?.hub.id;
24
+ }
25
+ export async function requireHub(ref) {
26
+ const hubs = await getClient().hubs.list();
27
+ const match = findHubMatch(hubs, ref);
28
+ if (!match) {
29
+ throw new Error("Hub not found or not accessible. Run `memax hub list` to see available hubs.");
30
+ }
31
+ return match;
32
+ }
33
+ //# sourceMappingURL=hubs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hubs.js","sourceRoot":"","sources":["../../src/lib/hubs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAC;AAE7C,SAAS,eAAe,CAAC,KAAa;IACpC,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAQ;IACtC,OAAO,GAAG,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,IAAmB,EACnB,GAAW;IAEX,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,UAAU,KAAK,kBAAkB,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE;QAC3B,OAAO,CACL,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,UAAU;YACtC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,UAAU,CACzC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,GAAuB;IAEvB,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,MAAM,IAAI,GAAG,MAAM,SAAS,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC3C,OAAO,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW;IAC1C,MAAM,IAAI,GAAG,MAAM,SAAS,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,8EAA8E,CAC/E,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=hubs.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hubs.test.d.ts","sourceRoot":"","sources":["../../src/lib/hubs.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,58 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { findHubMatch, getHubReference, PERSONAL_HUB_ALIAS } from "./hubs.js";
3
+ describe("getHubReference", () => {
4
+ it("uses the reserved personal alias for personal hubs", () => {
5
+ expect(getHubReference({
6
+ id: "h1",
7
+ name: "Personal",
8
+ slug: "user-123",
9
+ hub_type: "personal",
10
+ owner_id: "u1",
11
+ })).toBe(PERSONAL_HUB_ALIAS);
12
+ });
13
+ it("uses the real slug for team hubs", () => {
14
+ expect(getHubReference({
15
+ id: "h2",
16
+ name: "Memax",
17
+ slug: "memax",
18
+ hub_type: "team",
19
+ owner_id: "u1",
20
+ })).toBe("memax");
21
+ });
22
+ });
23
+ describe("findHubMatch", () => {
24
+ const hubs = [
25
+ {
26
+ hub: {
27
+ id: "personal-id",
28
+ name: "Personal",
29
+ slug: "user-123",
30
+ hub_type: "personal",
31
+ owner_id: "u1",
32
+ },
33
+ role: "owner",
34
+ memory_count: 0,
35
+ },
36
+ {
37
+ hub: {
38
+ id: "team-id",
39
+ name: "Memax",
40
+ slug: "memax",
41
+ hub_type: "team",
42
+ owner_id: "u1",
43
+ },
44
+ role: "owner",
45
+ memory_count: 0,
46
+ },
47
+ ];
48
+ it("resolves the reserved personal alias to the personal hub", () => {
49
+ expect(findHubMatch([...hubs], "personal")?.hub.id).toBe("personal-id");
50
+ });
51
+ it("matches team hubs by slug", () => {
52
+ expect(findHubMatch([...hubs], "memax")?.hub.id).toBe("team-id");
53
+ });
54
+ it("matches hubs by id", () => {
55
+ expect(findHubMatch([...hubs], "team-id")?.hub.slug).toBe("memax");
56
+ });
57
+ });
58
+ //# sourceMappingURL=hubs.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hubs.test.js","sourceRoot":"","sources":["../../src/lib/hubs.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAE9E,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,CACJ,eAAe,CAAC;YACd,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,IAAI;SACf,CAAC,CACH,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CACJ,eAAe,CAAC;YACd,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,MAAM;YAChB,QAAQ,EAAE,IAAI;SACf,CAAC,CACH,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,MAAM,IAAI,GAAG;QACX;YACE,GAAG,EAAE;gBACH,EAAE,EAAE,aAAa;gBACjB,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE,UAAU;gBACpB,QAAQ,EAAE,IAAI;aACf;YACD,IAAI,EAAE,OAAO;YACb,YAAY,EAAE,CAAC;SAChB;QACD;YACE,GAAG,EAAE;gBACH,EAAE,EAAE,SAAS;gBACb,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,MAAM;gBAChB,QAAQ,EAAE,IAAI;aACf;YACD,IAAI,EAAE,OAAO;YACb,YAAY,EAAE,CAAC;SAChB;KACO,CAAC;IAEX,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,UAAU,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,56 @@
1
+ import type { Scope } from "memax-sdk";
2
+ /**
3
+ * Normalize a git remote URL to a canonical form for use as a project identifier.
4
+ *
5
+ * All of these produce the same result: `github.com/memaxlabs/memax`
6
+ * - https://github.com/MemaxLabs/memax.git
7
+ * - git@github.com:MemaxLabs/memax.git
8
+ * - ssh://git@github.com/MemaxLabs/memax
9
+ */
10
+ export declare function normalizeRepoUrl(url: string): string;
11
+ export interface MemaxYmlConfig {
12
+ hub?: string;
13
+ project_id?: string;
14
+ }
15
+ export type ProjectScope = Scope | "project";
16
+ export interface ProjectScopeResolution {
17
+ scope: ProjectScope;
18
+ source: "memax_yml" | "git_remote" | "fallback";
19
+ warning?: string;
20
+ }
21
+ export declare function isCanonicalProjectScope(scope: ProjectScope): scope is Scope;
22
+ export declare function findNearestMemaxYmlPath(dir?: string): string | null;
23
+ export declare function readMemaxYmlConfig(dir?: string): MemaxYmlConfig | undefined;
24
+ /**
25
+ * Get a canonical project scope string for the given directory.
26
+ *
27
+ * Returns:
28
+ * "project:<project-id>" — .memax.yml project_id or git remote available
29
+ * "project" — no canonical cross-device project identity
30
+ */
31
+ export declare function getProjectScope(dir?: string): ProjectScope;
32
+ export declare function resolveProjectScope(dir?: string): ProjectScopeResolution;
33
+ export declare function resolveProjectRootPath(dir?: string): string | null;
34
+ /**
35
+ * Resolve a Claude Code mangled project folder name to a normalized repo URL.
36
+ *
37
+ * Claude Code names project folders by replacing "/" with "-" in the absolute path:
38
+ * "-workspaces-memax" → /workspaces/memax
39
+ * "-Users-ziyang-code-memax" → /Users/ziyang/code/memax
40
+ *
41
+ * Returns the normalized repo URL if the path exists and is a git repo, null otherwise.
42
+ */
43
+ export declare function resolveClaudeProjectFolder(mangledName: string): string | null;
44
+ export declare function resolveClaudeProjectPath(mangledName: string): string | null;
45
+ /**
46
+ * Normalize a file path for cross-platform consistency.
47
+ * - Forward slashes only
48
+ * - No leading "./"
49
+ * - No double slashes
50
+ */
51
+ export declare function normalizeFilePath(p: string): string;
52
+ /** Detect git project context (repo URL, project name, branch). */
53
+ export declare function detectProjectContext(dir?: string): Record<string, string>;
54
+ /** Walk up from cwd looking for .memax.yml with a hub field. */
55
+ export declare function readMemaxYmlHub(): string | undefined;
56
+ //# sourceMappingURL=project-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-context.d.ts","sourceRoot":"","sources":["../../src/lib/project-context.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAMvC;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAgBpD;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,SAAS,CAAC;AAE7C,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,WAAW,GAAG,YAAY,GAAG,UAAU,CAAC;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,YAAY,GAAG,KAAK,IAAI,KAAK,CAE3E;AA2BD,wBAAgB,uBAAuB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEnE;AAED,wBAAgB,kBAAkB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CA0B3E;AAiBD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,YAAY,CAE1D;AAED,wBAAgB,mBAAmB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,sBAAsB,CA4BxE;AAED,wBAAgB,sBAAsB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkBlE;AAED;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS7E;AAED,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI3E;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,mEAAmE;AACnE,wBAAgB,oBAAoB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAsBzE;AAED,gEAAgE;AAChE,wBAAgB,eAAe,IAAI,MAAM,GAAG,SAAS,CAEpD"}
@@ -0,0 +1,225 @@
1
+ import { execSync } from "node:child_process";
2
+ import { existsSync, readFileSync } from "node:fs";
3
+ import { dirname, join } from "node:path";
4
+ // =============================================================================
5
+ // Git URL normalization — canonical project identity for cross-machine sync
6
+ // =============================================================================
7
+ /**
8
+ * Normalize a git remote URL to a canonical form for use as a project identifier.
9
+ *
10
+ * All of these produce the same result: `github.com/memaxlabs/memax`
11
+ * - https://github.com/MemaxLabs/memax.git
12
+ * - git@github.com:MemaxLabs/memax.git
13
+ * - ssh://git@github.com/MemaxLabs/memax
14
+ */
15
+ export function normalizeRepoUrl(url) {
16
+ let s = url.trim();
17
+ // Strip protocol (https://, ssh://, git://)
18
+ s = s.replace(/^(https?:\/\/|ssh:\/\/|git:\/\/)/, "");
19
+ // Strip user@ prefix (e.g., git@)
20
+ s = s.replace(/^[^@]+@/, "");
21
+ // SSH colon syntax → slash (github.com:org/repo → github.com/org/repo)
22
+ // Skip if followed by digits (port number like git.corp.com:8443/repo)
23
+ s = s.replace(/^([^/:]+):(?![0-9])/, "$1/");
24
+ // Remove .git suffix
25
+ s = s.replace(/\.git$/, "");
26
+ // Trailing slashes
27
+ s = s.replace(/\/+$/, "");
28
+ // Lowercase + forward slashes
29
+ s = s.toLowerCase().replace(/\\/g, "/");
30
+ return s;
31
+ }
32
+ export function isCanonicalProjectScope(scope) {
33
+ return scope !== "project";
34
+ }
35
+ function normalizeProjectID(projectID) {
36
+ let s = projectID.trim();
37
+ s = s.replace(/^project:/, "");
38
+ s = normalizeRepoUrl(s);
39
+ if (!s || /\s/.test(s)) {
40
+ throw new Error("invalid project_id");
41
+ }
42
+ return s;
43
+ }
44
+ function findNearestMemaxYml(startDir) {
45
+ let dir = startDir;
46
+ const root = "/";
47
+ while (true) {
48
+ const ymlPath = join(dir, ".memax.yml");
49
+ if (existsSync(ymlPath)) {
50
+ return ymlPath;
51
+ }
52
+ const parent = join(dir, "..");
53
+ if (parent === dir || dir === root)
54
+ break;
55
+ dir = parent;
56
+ }
57
+ return null;
58
+ }
59
+ export function findNearestMemaxYmlPath(dir) {
60
+ return findNearestMemaxYml(dir ?? process.cwd());
61
+ }
62
+ export function readMemaxYmlConfig(dir) {
63
+ const cwd = dir ?? process.cwd();
64
+ const ymlPath = findNearestMemaxYml(cwd);
65
+ if (!ymlPath) {
66
+ return undefined;
67
+ }
68
+ try {
69
+ const content = readFileSync(ymlPath, "utf-8");
70
+ const hubMatch = content.match(/^hub:\s*(.+)$/m);
71
+ const projectMatch = content.match(/^project_id:\s*(.+)$/m);
72
+ const cfg = {};
73
+ if (hubMatch) {
74
+ cfg.hub = hubMatch[1].trim();
75
+ }
76
+ if (projectMatch) {
77
+ cfg.project_id = normalizeProjectID(projectMatch[1].trim());
78
+ }
79
+ if (!cfg.hub && !cfg.project_id) {
80
+ return undefined;
81
+ }
82
+ return cfg;
83
+ }
84
+ catch {
85
+ return undefined;
86
+ }
87
+ }
88
+ function getGitOriginProjectID(cwd) {
89
+ try {
90
+ const repo = execSync("git remote get-url origin", {
91
+ cwd,
92
+ encoding: "utf-8",
93
+ timeout: 2000,
94
+ stdio: ["pipe", "pipe", "pipe"],
95
+ }).trim();
96
+ if (repo) {
97
+ return normalizeRepoUrl(repo);
98
+ }
99
+ }
100
+ catch { }
101
+ return undefined;
102
+ }
103
+ /**
104
+ * Get a canonical project scope string for the given directory.
105
+ *
106
+ * Returns:
107
+ * "project:<project-id>" — .memax.yml project_id or git remote available
108
+ * "project" — no canonical cross-device project identity
109
+ */
110
+ export function getProjectScope(dir) {
111
+ return resolveProjectScope(dir).scope;
112
+ }
113
+ export function resolveProjectScope(dir) {
114
+ const cwd = dir ?? process.cwd();
115
+ const memaxCfg = readMemaxYmlConfig(cwd);
116
+ const gitProjectID = getGitOriginProjectID(cwd);
117
+ if (memaxCfg?.project_id) {
118
+ const warning = gitProjectID && gitProjectID !== memaxCfg.project_id
119
+ ? `.memax.yml project_id (${memaxCfg.project_id}) overrides git origin (${gitProjectID})`
120
+ : undefined;
121
+ return {
122
+ scope: `project:${memaxCfg.project_id}`,
123
+ source: "memax_yml",
124
+ warning,
125
+ };
126
+ }
127
+ if (gitProjectID) {
128
+ return {
129
+ scope: `project:${gitProjectID}`,
130
+ source: "git_remote",
131
+ };
132
+ }
133
+ return {
134
+ scope: "project",
135
+ source: "fallback",
136
+ };
137
+ }
138
+ export function resolveProjectRootPath(dir) {
139
+ const cwd = dir ?? process.cwd();
140
+ const ymlPath = findNearestMemaxYml(cwd);
141
+ if (ymlPath) {
142
+ return dirname(ymlPath);
143
+ }
144
+ try {
145
+ const root = execSync("git rev-parse --show-toplevel", {
146
+ cwd,
147
+ encoding: "utf-8",
148
+ timeout: 2000,
149
+ stdio: ["pipe", "pipe", "pipe"],
150
+ }).trim();
151
+ return root || null;
152
+ }
153
+ catch { }
154
+ return null;
155
+ }
156
+ /**
157
+ * Resolve a Claude Code mangled project folder name to a normalized repo URL.
158
+ *
159
+ * Claude Code names project folders by replacing "/" with "-" in the absolute path:
160
+ * "-workspaces-memax" → /workspaces/memax
161
+ * "-Users-ziyang-code-memax" → /Users/ziyang/code/memax
162
+ *
163
+ * Returns the normalized repo URL if the path exists and is a git repo, null otherwise.
164
+ */
165
+ export function resolveClaudeProjectFolder(mangledName) {
166
+ // Convert mangled name back to absolute path
167
+ const absolutePath = mangledName.replace(/-/g, "/");
168
+ if (!existsSync(absolutePath))
169
+ return null;
170
+ const resolution = resolveProjectScope(absolutePath);
171
+ if (resolution.scope === "project") {
172
+ return null;
173
+ }
174
+ return resolution.scope.replace(/^project:/, "");
175
+ }
176
+ export function resolveClaudeProjectPath(mangledName) {
177
+ const absolutePath = mangledName.replace(/-/g, "/");
178
+ if (!existsSync(absolutePath))
179
+ return null;
180
+ return absolutePath;
181
+ }
182
+ /**
183
+ * Normalize a file path for cross-platform consistency.
184
+ * - Forward slashes only
185
+ * - No leading "./"
186
+ * - No double slashes
187
+ */
188
+ export function normalizeFilePath(p) {
189
+ return p.replace(/\\/g, "/").replace(/^\.\//, "").replace(/\/+/g, "/");
190
+ }
191
+ /** Detect git project context (repo URL, project name, branch). */
192
+ export function detectProjectContext(dir) {
193
+ const cwd = dir ?? process.cwd();
194
+ const ctx = {};
195
+ const gitOpts = {
196
+ cwd,
197
+ encoding: "utf-8",
198
+ timeout: 2000,
199
+ stdio: ["pipe", "pipe", "pipe"],
200
+ };
201
+ try {
202
+ const repo = execSync("git remote get-url origin", gitOpts).trim();
203
+ if (repo)
204
+ ctx.repo = repo;
205
+ }
206
+ catch { }
207
+ try {
208
+ const project = execSync("git rev-parse --show-toplevel", gitOpts).trim();
209
+ if (project)
210
+ ctx.project = project.split("/").pop();
211
+ }
212
+ catch { }
213
+ try {
214
+ const branch = execSync("git branch --show-current", gitOpts).trim();
215
+ if (branch)
216
+ ctx.branch = branch;
217
+ }
218
+ catch { }
219
+ return ctx;
220
+ }
221
+ /** Walk up from cwd looking for .memax.yml with a hub field. */
222
+ export function readMemaxYmlHub() {
223
+ return readMemaxYmlConfig()?.hub;
224
+ }
225
+ //# sourceMappingURL=project-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-context.js","sourceRoot":"","sources":["../../src/lib/project-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=project-context.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-context.test.d.ts","sourceRoot":"","sources":["../../src/lib/project-context.test.ts"],"names":[],"mappings":""}