memax-cli 0.1.0-alpha.3 → 0.1.0-alpha.30
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 +154 -0
- package/dist/commands/agent-sessions.d.ts +32 -0
- package/dist/commands/agent-sessions.d.ts.map +1 -0
- package/dist/commands/agent-sessions.js +761 -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 +82 -0
- package/dist/commands/agent-sessions.test.js.map +1 -0
- package/dist/commands/auth.d.ts +1 -0
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +14 -7
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/capture.d.ts +17 -0
- package/dist/commands/capture.d.ts.map +1 -0
- package/dist/commands/capture.js +61 -0
- package/dist/commands/capture.js.map +1 -0
- package/dist/commands/delete.d.ts +1 -1
- package/dist/commands/delete.d.ts.map +1 -1
- package/dist/commands/delete.js +22 -5
- package/dist/commands/delete.js.map +1 -1
- package/dist/commands/hub.d.ts +4 -0
- package/dist/commands/hub.d.ts.map +1 -0
- package/dist/commands/hub.js +53 -0
- package/dist/commands/hub.js.map +1 -0
- package/dist/commands/list.d.ts +2 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +35 -8
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +27 -5
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +275 -42
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/push.d.ts +4 -1
- package/dist/commands/push.d.ts.map +1 -1
- package/dist/commands/push.js +51 -11
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/recall.d.ts +7 -0
- package/dist/commands/recall.d.ts.map +1 -1
- package/dist/commands/recall.js +164 -39
- 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 +12 -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 +14 -0
- package/dist/commands/setup-mcp.d.ts.map +1 -0
- package/dist/commands/setup-mcp.js +278 -0
- package/dist/commands/setup-mcp.js.map +1 -0
- package/dist/commands/setup-types.d.ts +20 -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 +6 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +146 -306
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/show.d.ts.map +1 -1
- package/dist/commands/show.js +10 -13
- package/dist/commands/show.js.map +1 -1
- package/dist/commands/sync.d.ts +33 -2
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +1066 -119
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/sync.test.d.ts +2 -0
- package/dist/commands/sync.test.d.ts.map +1 -0
- package/dist/commands/sync.test.js +130 -0
- package/dist/commands/sync.test.js.map +1 -0
- package/dist/commands/topic.d.ts +20 -0
- package/dist/commands/topic.d.ts.map +1 -0
- package/dist/commands/topic.js +87 -0
- package/dist/commands/topic.js.map +1 -0
- package/dist/index.js +131 -14
- package/dist/index.js.map +1 -1
- package/dist/lib/client.d.ts +7 -0
- package/dist/lib/client.d.ts.map +1 -0
- package/dist/lib/client.js +72 -0
- package/dist/lib/client.js.map +1 -0
- package/dist/lib/config.d.ts +42 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +63 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/project-context.d.ts +50 -0
- package/dist/lib/project-context.d.ts.map +1 -0
- package/dist/lib/project-context.js +201 -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/package.json +17 -13
- package/.vscode/mcp.json +0 -8
- 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 -20
- package/src/commands/hook.ts +0 -243
- package/src/commands/list.ts +0 -38
- package/src/commands/login.ts +0 -162
- package/src/commands/mcp.ts +0 -357
- package/src/commands/push.ts +0 -82
- package/src/commands/recall.ts +0 -163
- package/src/commands/setup.ts +0 -682
- package/src/commands/show.ts +0 -35
- package/src/commands/sync.ts +0 -403
- package/src/index.ts +0 -192
- 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/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Memax } from "memax-sdk";
|
|
2
|
+
/** Get the shared SDK client instance (lazily created) */
|
|
3
|
+
export declare function getClient(): Memax;
|
|
4
|
+
/** Reset the cached client (useful after login/logout) */
|
|
5
|
+
export declare function resetClient(): void;
|
|
6
|
+
export declare function getAuthHeaders(): Promise<Record<string, string>>;
|
|
7
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAUlC,0DAA0D;AAC1D,wBAAgB,SAAS,IAAI,KAAK,CASjC;AAED,0DAA0D;AAC1D,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAEtE"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// CLI API client — configures memax-sdk with CLI-specific auth
|
|
3
|
+
//
|
|
4
|
+
// All CLI commands should use `getClient()` instead of raw fetch.
|
|
5
|
+
// Auth flow: MEMAX_API_KEY env var → stored credentials (with auto-refresh).
|
|
6
|
+
// =============================================================================
|
|
7
|
+
import { Memax } from "memax-sdk";
|
|
8
|
+
import { loadConfig } from "./config.js";
|
|
9
|
+
import { loadCredentials, saveCredentials, isTokenExpired, } from "./credentials.js";
|
|
10
|
+
let instance = null;
|
|
11
|
+
/** Get the shared SDK client instance (lazily created) */
|
|
12
|
+
export function getClient() {
|
|
13
|
+
if (!instance) {
|
|
14
|
+
const config = loadConfig();
|
|
15
|
+
instance = new Memax({
|
|
16
|
+
apiUrl: config.api_url,
|
|
17
|
+
auth: cliAuthProvider,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
return instance;
|
|
21
|
+
}
|
|
22
|
+
/** Reset the cached client (useful after login/logout) */
|
|
23
|
+
export function resetClient() {
|
|
24
|
+
instance = null;
|
|
25
|
+
}
|
|
26
|
+
export async function getAuthHeaders() {
|
|
27
|
+
return cliAuthProvider();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* CLI auth provider — resolves authorization headers.
|
|
31
|
+
*
|
|
32
|
+
* Priority:
|
|
33
|
+
* 1. MEMAX_API_KEY env var (CI/CD, non-interactive)
|
|
34
|
+
* 2. Stored credentials with automatic token refresh
|
|
35
|
+
*/
|
|
36
|
+
async function cliAuthProvider() {
|
|
37
|
+
// 1. Env var takes priority
|
|
38
|
+
const envKey = process.env.MEMAX_API_KEY;
|
|
39
|
+
if (envKey) {
|
|
40
|
+
return { Authorization: `Bearer ${envKey}` };
|
|
41
|
+
}
|
|
42
|
+
// 2. Stored credentials
|
|
43
|
+
const creds = loadCredentials();
|
|
44
|
+
if (!creds?.access_token)
|
|
45
|
+
return {};
|
|
46
|
+
// Auto-refresh if expired
|
|
47
|
+
if (isTokenExpired() && creds.refresh_token) {
|
|
48
|
+
try {
|
|
49
|
+
const config = loadConfig();
|
|
50
|
+
const url = `${config.api_url}/v1/auth/refresh`;
|
|
51
|
+
const res = await fetch(url, {
|
|
52
|
+
method: "POST",
|
|
53
|
+
headers: { "Content-Type": "application/json" },
|
|
54
|
+
body: JSON.stringify({ refresh_token: creds.refresh_token }),
|
|
55
|
+
});
|
|
56
|
+
const json = (await res.json());
|
|
57
|
+
if (json.data) {
|
|
58
|
+
saveCredentials({
|
|
59
|
+
access_token: json.data.access_token,
|
|
60
|
+
refresh_token: json.data.refresh_token,
|
|
61
|
+
expires_at: Date.now() + json.data.expires_in * 1000,
|
|
62
|
+
});
|
|
63
|
+
return { Authorization: `Bearer ${json.data.access_token}` };
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// Refresh failed — fall through to stale token
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return { Authorization: `Bearer ${creds.access_token}` };
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,+DAA+D;AAC/D,EAAE;AACF,kEAAkE;AAClE,6EAA6E;AAC7E,gFAAgF;AAEhF,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,eAAe,EACf,eAAe,EACf,cAAc,GACf,MAAM,kBAAkB,CAAC;AAE1B,IAAI,QAAQ,GAAiB,IAAI,CAAC;AAElC,0DAA0D;AAC1D,MAAM,UAAU,SAAS;IACvB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,QAAQ,GAAG,IAAI,KAAK,CAAC;YACnB,MAAM,EAAE,MAAM,CAAC,OAAO;YACtB,IAAI,EAAE,eAAe;SACtB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,WAAW;IACzB,QAAQ,GAAG,IAAI,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,OAAO,eAAe,EAAE,CAAC;AAC3B,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,eAAe;IAC5B,4BAA4B;IAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IACzC,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,EAAE,aAAa,EAAE,UAAU,MAAM,EAAE,EAAE,CAAC;IAC/C,CAAC;IAED,wBAAwB;IACxB,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,IAAI,CAAC,KAAK,EAAE,YAAY;QAAE,OAAO,EAAE,CAAC;IAEpC,0BAA0B;IAC1B,IAAI,cAAc,EAAE,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;QAC5C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,OAAO,kBAAkB,CAAC;YAChD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAC3B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC;aAC7D,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAM7B,CAAC;YACF,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,eAAe,CAAC;oBACd,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY;oBACpC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa;oBACtC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI;iBACrD,CAAC,CAAC;gBACH,OAAO,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YAC/D,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,+CAA+C;QACjD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,aAAa,EAAE,UAAU,KAAK,CAAC,YAAY,EAAE,EAAE,CAAC;AAC3D,CAAC"}
|
package/dist/lib/config.d.ts
CHANGED
|
@@ -3,8 +3,50 @@ export interface MemaxConfig {
|
|
|
3
3
|
default_hub: string;
|
|
4
4
|
default_boundary: string;
|
|
5
5
|
auto_categorize: boolean;
|
|
6
|
+
device_id?: string;
|
|
7
|
+
sync_sources?: SyncSourceState[];
|
|
8
|
+
agent_session_roots?: AgentSessionRoot[];
|
|
9
|
+
}
|
|
10
|
+
export interface AgentSessionRoot {
|
|
11
|
+
id?: string;
|
|
12
|
+
agent: string;
|
|
13
|
+
root_path: string;
|
|
14
|
+
scope: string;
|
|
15
|
+
session_type?: string;
|
|
16
|
+
include_extensions?: string[];
|
|
17
|
+
}
|
|
18
|
+
export interface SyncSourceState {
|
|
19
|
+
id: string;
|
|
20
|
+
root_path: string;
|
|
21
|
+
kind: "directory";
|
|
22
|
+
ignore_patterns: string[];
|
|
23
|
+
default_category?: string;
|
|
24
|
+
default_boundary?: string;
|
|
25
|
+
deletion_policy: "retain";
|
|
26
|
+
last_sync_at?: string;
|
|
27
|
+
last_mode?: "manual" | "watch";
|
|
28
|
+
last_scan_count?: number;
|
|
29
|
+
last_pushed?: number;
|
|
30
|
+
last_skipped?: number;
|
|
31
|
+
last_errors?: number;
|
|
6
32
|
}
|
|
7
33
|
export declare function getConfigDir(): string;
|
|
8
34
|
export declare function loadConfig(): MemaxConfig;
|
|
9
35
|
export declare function saveConfig(config: Partial<MemaxConfig>): void;
|
|
36
|
+
export declare function getOrCreateDeviceID(): string;
|
|
37
|
+
export declare function makeSyncSourceID(rootPath: string): string;
|
|
38
|
+
export declare function listSyncSources(): SyncSourceState[];
|
|
39
|
+
export declare function upsertSyncSource(source: Omit<SyncSourceState, "id"> & {
|
|
40
|
+
id?: string;
|
|
41
|
+
}): SyncSourceState;
|
|
42
|
+
export declare function updateSyncSourceRun(rootPath: string, update: {
|
|
43
|
+
ignorePatterns: string[];
|
|
44
|
+
defaultCategory?: string;
|
|
45
|
+
defaultBoundary?: string;
|
|
46
|
+
mode: "manual" | "watch";
|
|
47
|
+
scanCount: number;
|
|
48
|
+
pushed: number;
|
|
49
|
+
skipped: number;
|
|
50
|
+
errors: number;
|
|
51
|
+
}): SyncSourceState;
|
|
10
52
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/lib/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,eAAe,EAAE,CAAC;IACjC,mBAAmB,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC1C;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,WAAW,CAAC;IAClB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,QAAQ,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AASD,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,UAAU,IAAI,WAAW,CAgBxC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAiB7D;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAQ5C;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,eAAe,IAAI,eAAe,EAAE,CAInD;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GACpD,eAAe,CA6BjB;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE;IACN,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,GACA,eAAe,CAmBjB"}
|
package/dist/lib/config.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
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 = {
|
|
@@ -46,4 +47,66 @@ export function saveConfig(config) {
|
|
|
46
47
|
const merged = { ...existing, ...config };
|
|
47
48
|
writeFileSync(CONFIG_FILE, JSON.stringify(merged, null, 2) + "\n");
|
|
48
49
|
}
|
|
50
|
+
export function getOrCreateDeviceID() {
|
|
51
|
+
const config = loadConfig();
|
|
52
|
+
if (config.device_id && config.device_id.trim()) {
|
|
53
|
+
return config.device_id;
|
|
54
|
+
}
|
|
55
|
+
const deviceID = randomUUID();
|
|
56
|
+
saveConfig({ device_id: deviceID });
|
|
57
|
+
return deviceID;
|
|
58
|
+
}
|
|
59
|
+
export function makeSyncSourceID(rootPath) {
|
|
60
|
+
return createHash("sha256").update(rootPath).digest("hex").slice(0, 12);
|
|
61
|
+
}
|
|
62
|
+
export function listSyncSources() {
|
|
63
|
+
return [...(loadConfig().sync_sources ?? [])].sort((a, b) => a.root_path.localeCompare(b.root_path));
|
|
64
|
+
}
|
|
65
|
+
export function upsertSyncSource(source) {
|
|
66
|
+
const config = loadConfig();
|
|
67
|
+
const syncSources = [...(config.sync_sources ?? [])];
|
|
68
|
+
const id = source.id ?? makeSyncSourceID(source.root_path);
|
|
69
|
+
const next = {
|
|
70
|
+
id,
|
|
71
|
+
root_path: source.root_path,
|
|
72
|
+
kind: source.kind,
|
|
73
|
+
ignore_patterns: [...source.ignore_patterns],
|
|
74
|
+
default_category: source.default_category,
|
|
75
|
+
default_boundary: source.default_boundary,
|
|
76
|
+
deletion_policy: source.deletion_policy,
|
|
77
|
+
last_sync_at: source.last_sync_at,
|
|
78
|
+
last_mode: source.last_mode,
|
|
79
|
+
last_scan_count: source.last_scan_count,
|
|
80
|
+
last_pushed: source.last_pushed,
|
|
81
|
+
last_skipped: source.last_skipped,
|
|
82
|
+
last_errors: source.last_errors,
|
|
83
|
+
};
|
|
84
|
+
const existingIndex = syncSources.findIndex((item) => item.id === id);
|
|
85
|
+
if (existingIndex >= 0) {
|
|
86
|
+
syncSources[existingIndex] = next;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
syncSources.push(next);
|
|
90
|
+
}
|
|
91
|
+
saveConfig({ sync_sources: syncSources });
|
|
92
|
+
return next;
|
|
93
|
+
}
|
|
94
|
+
export function updateSyncSourceRun(rootPath, update) {
|
|
95
|
+
const existing = listSyncSources().find((item) => item.root_path === rootPath);
|
|
96
|
+
return upsertSyncSource({
|
|
97
|
+
id: existing?.id,
|
|
98
|
+
root_path: rootPath,
|
|
99
|
+
kind: "directory",
|
|
100
|
+
ignore_patterns: update.ignorePatterns,
|
|
101
|
+
default_category: update.defaultCategory,
|
|
102
|
+
default_boundary: update.defaultBoundary,
|
|
103
|
+
deletion_policy: "retain",
|
|
104
|
+
last_sync_at: new Date().toISOString(),
|
|
105
|
+
last_mode: update.mode,
|
|
106
|
+
last_scan_count: update.scanCount,
|
|
107
|
+
last_pushed: update.pushed,
|
|
108
|
+
last_skipped: update.skipped,
|
|
109
|
+
last_errors: update.errors,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
49
112
|
//# 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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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalize a git remote URL to a canonical form for use as a project identifier.
|
|
3
|
+
*
|
|
4
|
+
* All of these produce the same result: `github.com/memaxlabs/memax`
|
|
5
|
+
* - https://github.com/MemaxLabs/memax.git
|
|
6
|
+
* - git@github.com:MemaxLabs/memax.git
|
|
7
|
+
* - ssh://git@github.com/MemaxLabs/memax
|
|
8
|
+
*/
|
|
9
|
+
export declare function normalizeRepoUrl(url: string): string;
|
|
10
|
+
export interface MemaxYmlConfig {
|
|
11
|
+
hub?: string;
|
|
12
|
+
project_id?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface ProjectScopeResolution {
|
|
15
|
+
scope: string;
|
|
16
|
+
source: "memax_yml" | "git_remote" | "fallback";
|
|
17
|
+
warning?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function readMemaxYmlConfig(dir?: string): MemaxYmlConfig | undefined;
|
|
20
|
+
/**
|
|
21
|
+
* Get a canonical project scope string for the given directory.
|
|
22
|
+
*
|
|
23
|
+
* Returns:
|
|
24
|
+
* "project:<project-id>" — .memax.yml project_id or git remote available
|
|
25
|
+
* "project" — no canonical cross-device project identity
|
|
26
|
+
*/
|
|
27
|
+
export declare function getProjectScope(dir?: string): string;
|
|
28
|
+
export declare function resolveProjectScope(dir?: string): ProjectScopeResolution;
|
|
29
|
+
/**
|
|
30
|
+
* Resolve a Claude Code mangled project folder name to a normalized repo URL.
|
|
31
|
+
*
|
|
32
|
+
* Claude Code names project folders by replacing "/" with "-" in the absolute path:
|
|
33
|
+
* "-workspaces-memax" → /workspaces/memax
|
|
34
|
+
* "-Users-ziyang-code-memax" → /Users/ziyang/code/memax
|
|
35
|
+
*
|
|
36
|
+
* Returns the normalized repo URL if the path exists and is a git repo, null otherwise.
|
|
37
|
+
*/
|
|
38
|
+
export declare function resolveClaudeProjectFolder(mangledName: string): string | null;
|
|
39
|
+
/**
|
|
40
|
+
* Normalize a file path for cross-platform consistency.
|
|
41
|
+
* - Forward slashes only
|
|
42
|
+
* - No leading "./"
|
|
43
|
+
* - No double slashes
|
|
44
|
+
*/
|
|
45
|
+
export declare function normalizeFilePath(p: string): string;
|
|
46
|
+
/** Detect git project context (repo URL, project name, branch). */
|
|
47
|
+
export declare function detectProjectContext(dir?: string): Record<string, string>;
|
|
48
|
+
/** Walk up from cwd looking for .memax.yml with a hub field. */
|
|
49
|
+
export declare function readMemaxYmlHub(): string | undefined;
|
|
50
|
+
//# 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":"AAQA;;;;;;;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,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,GAAG,YAAY,GAAG,UAAU,CAAC;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA2BD,wBAAgB,kBAAkB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CA0B3E;AAiBD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,mBAAmB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,sBAAsB,CA4BxE;AAED;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS7E;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,CA4BzE;AAED,gEAAgE;AAChE,wBAAgB,eAAe,IAAI,MAAM,GAAG,SAAS,CAEpD"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
3
|
+
import { 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
|
+
function normalizeProjectID(projectID) {
|
|
33
|
+
let s = projectID.trim();
|
|
34
|
+
s = s.replace(/^project:/, "");
|
|
35
|
+
s = normalizeRepoUrl(s);
|
|
36
|
+
if (!s || /\s/.test(s)) {
|
|
37
|
+
throw new Error("invalid project_id");
|
|
38
|
+
}
|
|
39
|
+
return s;
|
|
40
|
+
}
|
|
41
|
+
function findNearestMemaxYml(startDir) {
|
|
42
|
+
let dir = startDir;
|
|
43
|
+
const root = "/";
|
|
44
|
+
while (true) {
|
|
45
|
+
const ymlPath = join(dir, ".memax.yml");
|
|
46
|
+
if (existsSync(ymlPath)) {
|
|
47
|
+
return ymlPath;
|
|
48
|
+
}
|
|
49
|
+
const parent = join(dir, "..");
|
|
50
|
+
if (parent === dir || dir === root)
|
|
51
|
+
break;
|
|
52
|
+
dir = parent;
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
export function readMemaxYmlConfig(dir) {
|
|
57
|
+
const cwd = dir ?? process.cwd();
|
|
58
|
+
const ymlPath = findNearestMemaxYml(cwd);
|
|
59
|
+
if (!ymlPath) {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
const content = readFileSync(ymlPath, "utf-8");
|
|
64
|
+
const hubMatch = content.match(/^hub:\s*(.+)$/m);
|
|
65
|
+
const projectMatch = content.match(/^project_id:\s*(.+)$/m);
|
|
66
|
+
const cfg = {};
|
|
67
|
+
if (hubMatch) {
|
|
68
|
+
cfg.hub = hubMatch[1].trim();
|
|
69
|
+
}
|
|
70
|
+
if (projectMatch) {
|
|
71
|
+
cfg.project_id = normalizeProjectID(projectMatch[1].trim());
|
|
72
|
+
}
|
|
73
|
+
if (!cfg.hub && !cfg.project_id) {
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
return cfg;
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function getGitOriginProjectID(cwd) {
|
|
83
|
+
try {
|
|
84
|
+
const repo = execSync("git remote get-url origin", {
|
|
85
|
+
cwd,
|
|
86
|
+
encoding: "utf-8",
|
|
87
|
+
timeout: 2000,
|
|
88
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
89
|
+
}).trim();
|
|
90
|
+
if (repo) {
|
|
91
|
+
return normalizeRepoUrl(repo);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch { }
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Get a canonical project scope string for the given directory.
|
|
99
|
+
*
|
|
100
|
+
* Returns:
|
|
101
|
+
* "project:<project-id>" — .memax.yml project_id or git remote available
|
|
102
|
+
* "project" — no canonical cross-device project identity
|
|
103
|
+
*/
|
|
104
|
+
export function getProjectScope(dir) {
|
|
105
|
+
return resolveProjectScope(dir).scope;
|
|
106
|
+
}
|
|
107
|
+
export function resolveProjectScope(dir) {
|
|
108
|
+
const cwd = dir ?? process.cwd();
|
|
109
|
+
const memaxCfg = readMemaxYmlConfig(cwd);
|
|
110
|
+
const gitProjectID = getGitOriginProjectID(cwd);
|
|
111
|
+
if (memaxCfg?.project_id) {
|
|
112
|
+
const warning = gitProjectID && gitProjectID !== memaxCfg.project_id
|
|
113
|
+
? `.memax.yml project_id (${memaxCfg.project_id}) overrides git origin (${gitProjectID})`
|
|
114
|
+
: undefined;
|
|
115
|
+
return {
|
|
116
|
+
scope: `project:${memaxCfg.project_id}`,
|
|
117
|
+
source: "memax_yml",
|
|
118
|
+
warning,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
if (gitProjectID) {
|
|
122
|
+
return {
|
|
123
|
+
scope: `project:${gitProjectID}`,
|
|
124
|
+
source: "git_remote",
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
scope: "project",
|
|
129
|
+
source: "fallback",
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Resolve a Claude Code mangled project folder name to a normalized repo URL.
|
|
134
|
+
*
|
|
135
|
+
* Claude Code names project folders by replacing "/" with "-" in the absolute path:
|
|
136
|
+
* "-workspaces-memax" → /workspaces/memax
|
|
137
|
+
* "-Users-ziyang-code-memax" → /Users/ziyang/code/memax
|
|
138
|
+
*
|
|
139
|
+
* Returns the normalized repo URL if the path exists and is a git repo, null otherwise.
|
|
140
|
+
*/
|
|
141
|
+
export function resolveClaudeProjectFolder(mangledName) {
|
|
142
|
+
// Convert mangled name back to absolute path
|
|
143
|
+
const absolutePath = mangledName.replace(/-/g, "/");
|
|
144
|
+
if (!existsSync(absolutePath))
|
|
145
|
+
return null;
|
|
146
|
+
const resolution = resolveProjectScope(absolutePath);
|
|
147
|
+
if (resolution.scope === "project") {
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
return resolution.scope.replace(/^project:/, "");
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Normalize a file path for cross-platform consistency.
|
|
154
|
+
* - Forward slashes only
|
|
155
|
+
* - No leading "./"
|
|
156
|
+
* - No double slashes
|
|
157
|
+
*/
|
|
158
|
+
export function normalizeFilePath(p) {
|
|
159
|
+
return p.replace(/\\/g, "/").replace(/^\.\//, "").replace(/\/+/g, "/");
|
|
160
|
+
}
|
|
161
|
+
/** Detect git project context (repo URL, project name, branch). */
|
|
162
|
+
export function detectProjectContext(dir) {
|
|
163
|
+
const cwd = dir ?? process.cwd();
|
|
164
|
+
const ctx = {};
|
|
165
|
+
try {
|
|
166
|
+
const repo = execSync("git remote get-url origin", {
|
|
167
|
+
cwd,
|
|
168
|
+
encoding: "utf-8",
|
|
169
|
+
timeout: 2000,
|
|
170
|
+
}).trim();
|
|
171
|
+
if (repo)
|
|
172
|
+
ctx.repo = repo;
|
|
173
|
+
}
|
|
174
|
+
catch { }
|
|
175
|
+
try {
|
|
176
|
+
const project = execSync("git rev-parse --show-toplevel", {
|
|
177
|
+
cwd,
|
|
178
|
+
encoding: "utf-8",
|
|
179
|
+
timeout: 2000,
|
|
180
|
+
}).trim();
|
|
181
|
+
if (project)
|
|
182
|
+
ctx.project = project.split("/").pop();
|
|
183
|
+
}
|
|
184
|
+
catch { }
|
|
185
|
+
try {
|
|
186
|
+
const branch = execSync("git branch --show-current", {
|
|
187
|
+
cwd,
|
|
188
|
+
encoding: "utf-8",
|
|
189
|
+
timeout: 2000,
|
|
190
|
+
}).trim();
|
|
191
|
+
if (branch)
|
|
192
|
+
ctx.branch = branch;
|
|
193
|
+
}
|
|
194
|
+
catch { }
|
|
195
|
+
return ctx;
|
|
196
|
+
}
|
|
197
|
+
/** Walk up from cwd looking for .memax.yml with a hub field. */
|
|
198
|
+
export function readMemaxYmlHub() {
|
|
199
|
+
return readMemaxYmlConfig()?.hub;
|
|
200
|
+
}
|
|
201
|
+
//# 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":""}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
const { execSync, existsSync, readFileSync } = vi.hoisted(() => ({
|
|
3
|
+
execSync: vi.fn(),
|
|
4
|
+
existsSync: vi.fn(),
|
|
5
|
+
readFileSync: vi.fn(),
|
|
6
|
+
}));
|
|
7
|
+
vi.mock("node:child_process", () => ({
|
|
8
|
+
execSync,
|
|
9
|
+
}));
|
|
10
|
+
vi.mock("node:fs", async () => {
|
|
11
|
+
const actual = await vi.importActual("node:fs");
|
|
12
|
+
return {
|
|
13
|
+
...actual,
|
|
14
|
+
existsSync,
|
|
15
|
+
readFileSync,
|
|
16
|
+
};
|
|
17
|
+
});
|
|
18
|
+
import { getProjectScope, normalizeRepoUrl, readMemaxYmlConfig, readMemaxYmlHub, resolveProjectScope, } from "./project-context.js";
|
|
19
|
+
describe("normalizeRepoUrl", () => {
|
|
20
|
+
it("normalizes common git remote forms", () => {
|
|
21
|
+
expect(normalizeRepoUrl("https://github.com/MemaxLabs/memax.git")).toBe("github.com/memaxlabs/memax");
|
|
22
|
+
expect(normalizeRepoUrl("git@github.com:MemaxLabs/memax.git")).toBe("github.com/memaxlabs/memax");
|
|
23
|
+
expect(normalizeRepoUrl("ssh://git@github.com/MemaxLabs/memax")).toBe("github.com/memaxlabs/memax");
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
describe("getProjectScope", () => {
|
|
27
|
+
beforeEach(() => {
|
|
28
|
+
execSync.mockReset();
|
|
29
|
+
existsSync.mockReset();
|
|
30
|
+
readFileSync.mockReset();
|
|
31
|
+
existsSync.mockReturnValue(false);
|
|
32
|
+
});
|
|
33
|
+
it("uses the normalized origin remote when present", () => {
|
|
34
|
+
execSync.mockReturnValueOnce("git@github.com:MemaxLabs/memax.git\n");
|
|
35
|
+
expect(getProjectScope("/workspaces/memax")).toBe("project:github.com/memaxlabs/memax");
|
|
36
|
+
});
|
|
37
|
+
it("returns generic project scope when there is no canonical remote", () => {
|
|
38
|
+
execSync.mockImplementation(() => {
|
|
39
|
+
throw new Error("no remote");
|
|
40
|
+
});
|
|
41
|
+
expect(getProjectScope("/workspaces/memax")).toBe("project");
|
|
42
|
+
});
|
|
43
|
+
it("uses .memax.yml project_id as an explicit override", () => {
|
|
44
|
+
existsSync.mockImplementation((path) => path.endsWith(".memax.yml"));
|
|
45
|
+
readFileSync.mockReturnValue("project_id: Acme.Internal/Payments-API\n");
|
|
46
|
+
expect(getProjectScope("/workspaces/memax")).toBe("project:acme.internal/payments-api");
|
|
47
|
+
});
|
|
48
|
+
it("reports when .memax.yml project_id overrides git origin", () => {
|
|
49
|
+
existsSync.mockImplementation((path) => path.endsWith(".memax.yml"));
|
|
50
|
+
readFileSync.mockReturnValue("project_id: github.com/acme/override\n");
|
|
51
|
+
execSync.mockReturnValueOnce("git@github.com:MemaxLabs/memax.git\n");
|
|
52
|
+
expect(resolveProjectScope("/workspaces/memax")).toEqual({
|
|
53
|
+
scope: "project:github.com/acme/override",
|
|
54
|
+
source: "memax_yml",
|
|
55
|
+
warning: ".memax.yml project_id (github.com/acme/override) overrides git origin (github.com/memaxlabs/memax)",
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
describe("readMemaxYmlConfig", () => {
|
|
60
|
+
beforeEach(() => {
|
|
61
|
+
existsSync.mockReset();
|
|
62
|
+
readFileSync.mockReset();
|
|
63
|
+
existsSync.mockReturnValue(false);
|
|
64
|
+
});
|
|
65
|
+
it("parses hub and project_id from .memax.yml", () => {
|
|
66
|
+
existsSync.mockImplementation((path) => path.endsWith(".memax.yml"));
|
|
67
|
+
readFileSync.mockReturnValue("hub: team-backend\nproject_id: github.com/MemaxLabs/memax\n");
|
|
68
|
+
expect(readMemaxYmlConfig("/workspaces/memax")).toEqual({
|
|
69
|
+
hub: "team-backend",
|
|
70
|
+
project_id: "github.com/memaxlabs/memax",
|
|
71
|
+
});
|
|
72
|
+
expect(readMemaxYmlHub()).toBe("team-backend");
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
//# sourceMappingURL=project-context.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-context.test.js","sourceRoot":"","sources":["../../src/lib/project-context.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Ask a yes/no question. Returns true if user answers 'y'. */
|
|
2
|
+
export declare function confirm(message: string): Promise<boolean>;
|
|
3
|
+
/** Ask a question and return the trimmed answer. */
|
|
4
|
+
export declare function ask(message: string): Promise<string>;
|
|
5
|
+
/** Ask a yes/no question where Enter defaults to yes. */
|
|
6
|
+
export declare function confirmDefault(message: string): Promise<boolean>;
|
|
7
|
+
//# sourceMappingURL=prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/lib/prompt.ts"],"names":[],"mappings":"AAEA,+DAA+D;AAC/D,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAWzD;AAED,oDAAoD;AACpD,wBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAWpD;AAED,yDAAyD;AACzD,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAWhE"}
|