memax-cli 0.1.0-alpha.8 → 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.
- package/assets/skills/memax-memory/SKILL.md +173 -0
- package/dist/commands/agent-configs.d.ts +41 -0
- package/dist/commands/agent-configs.d.ts.map +1 -0
- package/dist/commands/agent-configs.js +1290 -0
- package/dist/commands/agent-configs.js.map +1 -0
- package/dist/commands/agent-configs.test.d.ts +2 -0
- package/dist/commands/agent-configs.test.d.ts.map +1 -0
- package/dist/commands/agent-configs.test.js +122 -0
- package/dist/commands/agent-configs.test.js.map +1 -0
- package/dist/commands/agent-sessions.d.ts +74 -0
- package/dist/commands/agent-sessions.d.ts.map +1 -0
- package/dist/commands/agent-sessions.js +1513 -0
- package/dist/commands/agent-sessions.js.map +1 -0
- package/dist/commands/agent-sessions.test.d.ts +2 -0
- package/dist/commands/agent-sessions.test.d.ts.map +1 -0
- package/dist/commands/agent-sessions.test.js +255 -0
- package/dist/commands/agent-sessions.test.js.map +1 -0
- package/dist/commands/agents.d.ts +3 -0
- package/dist/commands/agents.d.ts.map +1 -0
- package/dist/commands/agents.js +36 -0
- package/dist/commands/agents.js.map +1 -0
- package/dist/commands/ask.d.ts +15 -0
- package/dist/commands/ask.d.ts.map +1 -0
- package/dist/commands/ask.js +483 -0
- package/dist/commands/ask.js.map +1 -0
- package/dist/commands/auth.d.ts +7 -0
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +103 -8
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/capture.d.ts +19 -0
- package/dist/commands/capture.d.ts.map +1 -0
- package/dist/commands/capture.js +69 -0
- package/dist/commands/capture.js.map +1 -0
- package/dist/commands/config.d.ts +2 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +13 -0
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/delete.d.ts +2 -0
- package/dist/commands/delete.d.ts.map +1 -1
- package/dist/commands/delete.js +15 -18
- package/dist/commands/delete.js.map +1 -1
- package/dist/commands/dreams.d.ts +22 -0
- package/dist/commands/dreams.d.ts.map +1 -0
- package/dist/commands/dreams.js +251 -0
- package/dist/commands/dreams.js.map +1 -0
- package/dist/commands/dreams.test.d.ts +2 -0
- package/dist/commands/dreams.test.d.ts.map +1 -0
- package/dist/commands/dreams.test.js +39 -0
- package/dist/commands/dreams.test.js.map +1 -0
- package/dist/commands/hook.d.ts +2 -0
- package/dist/commands/hook.d.ts.map +1 -1
- package/dist/commands/hook.js +25 -103
- package/dist/commands/hook.js.map +1 -1
- package/dist/commands/hub.d.ts +37 -0
- package/dist/commands/hub.d.ts.map +1 -0
- package/dist/commands/hub.js +347 -0
- package/dist/commands/hub.js.map +1 -0
- package/dist/commands/hub.test.d.ts +2 -0
- package/dist/commands/hub.test.d.ts.map +1 -0
- package/dist/commands/hub.test.js +62 -0
- package/dist/commands/hub.test.js.map +1 -0
- package/dist/commands/import.d.ts +13 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +257 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/import.test.d.ts +2 -0
- package/dist/commands/import.test.d.ts.map +1 -0
- package/dist/commands/import.test.js +11 -0
- package/dist/commands/import.test.js.map +1 -0
- package/dist/commands/list.d.ts +9 -2
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +118 -9
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/list.test.d.ts +2 -0
- package/dist/commands/list.test.d.ts.map +1 -0
- package/dist/commands/list.test.js +20 -0
- package/dist/commands/list.test.js.map +1 -0
- package/dist/commands/login.d.ts +7 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +81 -20
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +386 -65
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/push.d.ts +6 -1
- package/dist/commands/push.d.ts.map +1 -1
- package/dist/commands/push.js +42 -8
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/recall.d.ts +11 -1
- package/dist/commands/recall.d.ts.map +1 -1
- package/dist/commands/recall.js +228 -41
- package/dist/commands/recall.js.map +1 -1
- package/dist/commands/recall.test.d.ts +2 -0
- package/dist/commands/recall.test.d.ts.map +1 -0
- package/dist/commands/recall.test.js +31 -0
- package/dist/commands/recall.test.js.map +1 -0
- package/dist/commands/setup-hooks.d.ts +13 -0
- package/dist/commands/setup-hooks.d.ts.map +1 -0
- package/dist/commands/setup-hooks.js +193 -0
- package/dist/commands/setup-hooks.js.map +1 -0
- package/dist/commands/setup-instructions.d.ts +21 -0
- package/dist/commands/setup-instructions.d.ts.map +1 -0
- package/dist/commands/setup-instructions.js +172 -0
- package/dist/commands/setup-instructions.js.map +1 -0
- package/dist/commands/setup-mcp.d.ts +40 -0
- package/dist/commands/setup-mcp.d.ts.map +1 -0
- package/dist/commands/setup-mcp.js +414 -0
- package/dist/commands/setup-mcp.js.map +1 -0
- package/dist/commands/setup-types.d.ts +33 -0
- package/dist/commands/setup-types.d.ts.map +1 -0
- package/dist/commands/setup-types.js +60 -0
- package/dist/commands/setup-types.js.map +1 -0
- package/dist/commands/setup.d.ts +10 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +216 -532
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/show.d.ts +5 -1
- package/dist/commands/show.d.ts.map +1 -1
- package/dist/commands/show.js +36 -14
- package/dist/commands/show.js.map +1 -1
- package/dist/commands/topic.d.ts +32 -0
- package/dist/commands/topic.d.ts.map +1 -0
- package/dist/commands/topic.js +265 -0
- package/dist/commands/topic.js.map +1 -0
- package/dist/commands/topic.test.d.ts +2 -0
- package/dist/commands/topic.test.d.ts.map +1 -0
- package/dist/commands/topic.test.js +114 -0
- package/dist/commands/topic.test.js.map +1 -0
- package/dist/index.js +35 -144
- package/dist/index.js.map +1 -1
- package/dist/lib/client.d.ts +10 -0
- package/dist/lib/client.d.ts.map +1 -0
- package/dist/lib/client.js +104 -0
- package/dist/lib/client.js.map +1 -0
- package/dist/lib/client.test.d.ts +2 -0
- package/dist/lib/client.test.d.ts.map +1 -0
- package/dist/lib/client.test.js +44 -0
- package/dist/lib/client.test.js.map +1 -0
- package/dist/lib/config.d.ts +43 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +72 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/credentials.d.ts +3 -0
- package/dist/lib/credentials.d.ts.map +1 -1
- package/dist/lib/credentials.js +24 -2
- package/dist/lib/credentials.js.map +1 -1
- package/dist/lib/hubs.d.ts +7 -0
- package/dist/lib/hubs.d.ts.map +1 -0
- package/dist/lib/hubs.js +33 -0
- package/dist/lib/hubs.js.map +1 -0
- package/dist/lib/hubs.test.d.ts +2 -0
- package/dist/lib/hubs.test.d.ts.map +1 -0
- package/dist/lib/hubs.test.js +58 -0
- package/dist/lib/hubs.test.js.map +1 -0
- package/dist/lib/project-context.d.ts +56 -0
- package/dist/lib/project-context.d.ts.map +1 -0
- package/dist/lib/project-context.js +225 -0
- package/dist/lib/project-context.js.map +1 -0
- package/dist/lib/project-context.test.d.ts +2 -0
- package/dist/lib/project-context.test.d.ts.map +1 -0
- package/dist/lib/project-context.test.js +75 -0
- package/dist/lib/project-context.test.js.map +1 -0
- package/dist/lib/prompt.d.ts +7 -0
- package/dist/lib/prompt.d.ts.map +1 -0
- package/dist/lib/prompt.js +41 -0
- package/dist/lib/prompt.js.map +1 -0
- package/dist/lib/trash.d.ts +6 -0
- package/dist/lib/trash.d.ts.map +1 -0
- package/dist/lib/trash.js +28 -0
- package/dist/lib/trash.js.map +1 -0
- package/package.json +17 -13
- package/.vscode/mcp.json +0 -8
- package/dist/commands/sync.d.ts +0 -12
- package/dist/commands/sync.d.ts.map +0 -1
- package/dist/commands/sync.js +0 -414
- package/dist/commands/sync.js.map +0 -1
- package/dist/lib/api.d.ts +0 -4
- package/dist/lib/api.d.ts.map +0 -1
- package/dist/lib/api.js +0 -95
- package/dist/lib/api.js.map +0 -1
- package/src/commands/auth.ts +0 -92
- package/src/commands/config.ts +0 -27
- package/src/commands/delete.ts +0 -58
- package/src/commands/hook.ts +0 -243
- package/src/commands/list.ts +0 -38
- package/src/commands/login.ts +0 -164
- package/src/commands/mcp.ts +0 -405
- package/src/commands/push.ts +0 -137
- package/src/commands/recall.ts +0 -163
- package/src/commands/setup.ts +0 -1075
- package/src/commands/show.ts +0 -35
- package/src/commands/sync.ts +0 -506
- package/src/index.ts +0 -213
- package/src/lib/api.ts +0 -110
- package/src/lib/config.ts +0 -61
- package/src/lib/credentials.ts +0 -42
- package/tsconfig.json +0 -9
package/dist/lib/config.js
CHANGED
|
@@ -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: "
|
|
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
|
package/dist/lib/config.js.map
CHANGED
|
@@ -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;
|
|
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;
|
|
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"}
|
package/dist/lib/credentials.js
CHANGED
|
@@ -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
|
-
|
|
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;
|
|
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"}
|
package/dist/lib/hubs.js
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"project-context.test.d.ts","sourceRoot":"","sources":["../../src/lib/project-context.test.ts"],"names":[],"mappings":""}
|