@jim80net/memex-core 0.3.1 → 0.4.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/README.md CHANGED
@@ -174,6 +174,36 @@ boost: 0.05
174
174
 
175
175
  Consumers typically extend `MemexCoreConfig` with platform-specific fields (hooks config, sync config, sleep schedule, etc.) and handle file loading themselves.
176
176
 
177
+ ## Sync
178
+
179
+ The `sync` module provides Git-based cross-device sync via `syncPull` and `syncCommitAndPush`. Both accept a `SyncConfig` object.
180
+
181
+ ### Case-insensitive project IDs (default)
182
+
183
+ Project IDs are lowercased by default across all three resolution paths
184
+ (manual mappings, git remote URLs, and encoded `_local/` path fallbacks).
185
+ A clone of `git@github.com:Jim80Net/Repo.git` and `git@github.com:jim80net/repo.git`
186
+ now map to the same canonical id: `github.com/jim80net/repo`.
187
+
188
+ To preserve the original case, set `caseSensitive: true` in your sync config:
189
+
190
+ ```typescript
191
+ const syncConfig: SyncConfig = {
192
+ enabled: true,
193
+ repo: "git@github.com:me/memex-sync.git",
194
+ autoPull: true,
195
+ autoCommitPush: true,
196
+ projectMappings: {},
197
+ caseSensitive: true, // preserve case as-is
198
+ };
199
+ ```
200
+
201
+ On first sync after upgrading from a version that wrote mixed-case directories,
202
+ `syncPull` will run a one-shot migration that renames legacy paths to lowercase
203
+ and writes a `.memex-sync/version.json` marker so the scan only runs once. The
204
+ migration is safe across devices (only runs against post-pull state), idempotent,
205
+ and handles case-insensitive filesystems (macOS APFS, Windows NTFS) correctly.
206
+
177
207
  ## Development
178
208
 
179
209
  ```bash
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Run a git command inside a directory. 30s timeout.
3
+ */
4
+ export declare function git(args: string[], cwd: string): Promise<{
5
+ stdout: string;
6
+ stderr: string;
7
+ }>;
8
+ export declare function isGitRepo(dir: string): Promise<boolean>;
9
+ export declare function hasRemote(dir: string): Promise<boolean>;
10
+ export declare function hasCommits(dir: string): Promise<boolean>;
11
+ export declare function getDefaultBranch(dir: string): Promise<string>;
12
+ //# sourceMappingURL=git-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-helpers.d.ts","sourceRoot":"","sources":["../src/git-helpers.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAsB,GAAG,CACvB,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAE7C;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO7D;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO7D;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO9D;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBnE"}
@@ -0,0 +1,58 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ const execFileAsync = promisify(execFile);
4
+ /**
5
+ * Run a git command inside a directory. 30s timeout.
6
+ */
7
+ export async function git(args, cwd) {
8
+ return execFileAsync("git", args, { cwd, timeout: 30_000 });
9
+ }
10
+ export async function isGitRepo(dir) {
11
+ try {
12
+ await git(["rev-parse", "--git-dir"], dir);
13
+ return true;
14
+ }
15
+ catch {
16
+ return false;
17
+ }
18
+ }
19
+ export async function hasRemote(dir) {
20
+ try {
21
+ const { stdout } = await git(["remote"], dir);
22
+ return stdout.trim().length > 0;
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
28
+ export async function hasCommits(dir) {
29
+ try {
30
+ await git(["rev-parse", "HEAD"], dir);
31
+ return true;
32
+ }
33
+ catch {
34
+ return false;
35
+ }
36
+ }
37
+ export async function getDefaultBranch(dir) {
38
+ try {
39
+ const { stdout } = await git(["symbolic-ref", "refs/remotes/origin/HEAD"], dir);
40
+ const ref = stdout.trim();
41
+ const branch = ref.replace(/^refs\/remotes\/origin\//, "");
42
+ if (branch)
43
+ return branch;
44
+ }
45
+ catch {
46
+ try {
47
+ const { stdout } = await git(["ls-remote", "--symref", "origin", "HEAD"], dir);
48
+ const match = stdout.match(/ref:\s+refs\/heads\/(\S+)/);
49
+ if (match)
50
+ return match[1];
51
+ }
52
+ catch {
53
+ // Fall through to default
54
+ }
55
+ }
56
+ return "main";
57
+ }
58
+ //# sourceMappingURL=git-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-helpers.js","sourceRoot":"","sources":["../src/git-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,GAAG,CACvB,IAAc,EACd,GAAW;IAEX,OAAO,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW;IACzC,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,GAAG,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW;IACzC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC;QAC9C,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW;IAC1C,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAW;IAChD,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,cAAc,EAAE,0BAA0B,CAAC,EAAE,GAAG,CAAC,CAAC;QAChF,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAC;QAC3D,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;YAC/E,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;YACxD,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/dist/index.d.ts CHANGED
@@ -9,6 +9,8 @@ export * from "./session.js";
9
9
  export type { ScanDirs } from "./skill-index.js";
10
10
  export { parseFrontmatter, parseMemoryFile, SkillIndex } from "./skill-index.js";
11
11
  export { autoResolveMarkdownConflict, getSyncScanDirs, initSyncRepo, syncCommitAndPush, syncPull, } from "./sync.js";
12
+ export type { MigrationResult } from "./sync-migration.js";
13
+ export { migrateProjectIdsToLowercase, readSyncRepoVersion, runSyncMigrations, writeSyncRepoVersion, } from "./sync-migration.js";
12
14
  export * from "./telemetry.js";
13
15
  export * from "./traces.js";
14
16
  export * from "./types.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,YAAY,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACjF,OAAO,EACL,2BAA2B,EAC3B,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,QAAQ,GACT,MAAM,WAAW,CAAC;AACnB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,YAAY,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACjF,OAAO,EACL,2BAA2B,EAC3B,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,QAAQ,GACT,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EACL,4BAA4B,EAC5B,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
package/dist/index.js CHANGED
@@ -8,6 +8,7 @@ export * from "./project-registry.js";
8
8
  export * from "./session.js";
9
9
  export { parseFrontmatter, parseMemoryFile, SkillIndex } from "./skill-index.js";
10
10
  export { autoResolveMarkdownConflict, getSyncScanDirs, initSyncRepo, syncCommitAndPush, syncPull, } from "./sync.js";
11
+ export { migrateProjectIdsToLowercase, readSyncRepoVersion, runSyncMigrations, writeSyncRepoVersion, } from "./sync-migration.js";
11
12
  export * from "./telemetry.js";
12
13
  export * from "./traces.js";
13
14
  export * from "./types.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAE7B,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACjF,OAAO,EACL,2BAA2B,EAC3B,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,QAAQ,GACT,MAAM,WAAW,CAAC;AACnB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAE7B,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACjF,OAAO,EACL,2BAA2B,EAC3B,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,QAAQ,GACT,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,4BAA4B,EAC5B,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
@@ -3,11 +3,17 @@ import type { SyncConfig } from "./types.js";
3
3
  * Normalize a git remote URL to a canonical path segment.
4
4
  * Handles SSH, HTTPS, and .git suffix variations.
5
5
  *
6
+ * By default the result is lowercased so that clones of the same repo with
7
+ * different casing (`GitHub.com:Jim80Net/Repo` vs `github.com:jim80net/repo`)
8
+ * collapse onto a single canonical project id. Pass `caseSensitive = true`
9
+ * to preserve the original case.
10
+ *
6
11
  * Examples:
7
12
  * git@github.com:jim80net/repo.git → github.com/jim80net/repo
13
+ * git@GitHub.com:Jim80Net/Repo.git → github.com/jim80net/repo
8
14
  * https://github.com/jim80net/repo.git → github.com/jim80net/repo
9
15
  */
10
- export declare function normalizeGitUrl(url: string): string;
16
+ export declare function normalizeGitUrl(url: string, caseSensitive?: boolean): string;
11
17
  /**
12
18
  * Resolve the canonical project identifier for a given cwd.
13
19
  *
@@ -15,11 +21,22 @@ export declare function normalizeGitUrl(url: string): string;
15
21
  * 1. Manual mapping from config (explicit override)
16
22
  * 2. Git remote URL → normalized to host/owner/repo
17
23
  * 3. Encoded cwd path → stored under _local/
24
+ *
25
+ * All three paths are lowercased by default. Set `syncConfig.caseSensitive`
26
+ * to `true` to preserve the original casing.
18
27
  */
19
28
  export declare function resolveProjectId(cwd: string, syncConfig: SyncConfig): Promise<string>;
20
29
  /**
21
30
  * Find all project memory directories in the sync repo that match the current cwd.
22
- * Multiple matches are possible (e.g., same project stored under both URL and encoded path).
31
+ *
32
+ * Returns:
33
+ * - The canonical (lowercase) memory dir if it exists.
34
+ * - The `_local/<encoded>` fallback if it exists and differs from the canonical.
35
+ * - Any legacy mixed-case directory whose lowercase form equals the canonical id
36
+ * (rollout window before a post-upgrade sync has migrated the repo).
37
+ *
38
+ * Multiple matches are expected during the upgrade window; callers should merge
39
+ * their contents.
23
40
  */
24
41
  export declare function findMatchingProjectMemoryDirs(cwd: string, syncRepoPath: string, syncConfig: SyncConfig): Promise<string[]>;
25
42
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"project-mapping.d.ts","sourceRoot":"","sources":["../src/project-mapping.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI7C;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAmBnD;AAkBD;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAc3F;AAED;;;GAGG;AACH,wBAAsB,6BAA6B,CACjD,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,MAAM,EAAE,CAAC,CAyBnB;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,MAAM,CAAC,CAGjB"}
1
+ {"version":3,"file":"project-mapping.d.ts","sourceRoot":"","sources":["../src/project-mapping.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI7C;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,UAAQ,GAAG,MAAM,CAqB1E;AAkBD;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAiB3F;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,6BAA6B,CACjD,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,MAAM,EAAE,CAAC,CA+BnB;AAmDD;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,MAAM,CAAC,CAGjB"}
@@ -1,5 +1,5 @@
1
1
  import { execFile } from "node:child_process";
2
- import { stat } from "node:fs/promises";
2
+ import { readdir, stat } from "node:fs/promises";
3
3
  import { join } from "node:path";
4
4
  import { promisify } from "node:util";
5
5
  import { encodeProjectPath } from "./path-encoder.js";
@@ -8,26 +8,34 @@ const execFileAsync = promisify(execFile);
8
8
  * Normalize a git remote URL to a canonical path segment.
9
9
  * Handles SSH, HTTPS, and .git suffix variations.
10
10
  *
11
+ * By default the result is lowercased so that clones of the same repo with
12
+ * different casing (`GitHub.com:Jim80Net/Repo` vs `github.com:jim80net/repo`)
13
+ * collapse onto a single canonical project id. Pass `caseSensitive = true`
14
+ * to preserve the original case.
15
+ *
11
16
  * Examples:
12
17
  * git@github.com:jim80net/repo.git → github.com/jim80net/repo
18
+ * git@GitHub.com:Jim80Net/Repo.git → github.com/jim80net/repo
13
19
  * https://github.com/jim80net/repo.git → github.com/jim80net/repo
14
20
  */
15
- export function normalizeGitUrl(url) {
21
+ export function normalizeGitUrl(url, caseSensitive = false) {
16
22
  let normalized = url.trim();
17
23
  // Strip trailing .git
18
24
  normalized = normalized.replace(/\.git$/, "");
19
25
  // SSH format: git@host:owner/repo
20
26
  const sshMatch = normalized.match(/^[\w-]+@([^:]+):(.+)$/);
21
27
  if (sshMatch) {
22
- return `${sshMatch[1]}/${sshMatch[2]}`;
28
+ const result = `${sshMatch[1]}/${sshMatch[2]}`;
29
+ return caseSensitive ? result : result.toLowerCase();
23
30
  }
24
31
  // HTTPS format: https://host/owner/repo
25
32
  try {
26
33
  const parsed = new URL(normalized);
27
- return `${parsed.host}${parsed.pathname}`.replace(/^\//, "").replace(/\/$/, "");
34
+ const result = `${parsed.host}${parsed.pathname}`.replace(/^\//, "").replace(/\/$/, "");
35
+ return caseSensitive ? result : result.toLowerCase();
28
36
  }
29
37
  catch {
30
- return normalized;
38
+ return caseSensitive ? normalized : normalized.toLowerCase();
31
39
  }
32
40
  }
33
41
  /**
@@ -53,48 +61,110 @@ async function getGitRemoteUrl(cwd) {
53
61
  * 1. Manual mapping from config (explicit override)
54
62
  * 2. Git remote URL → normalized to host/owner/repo
55
63
  * 3. Encoded cwd path → stored under _local/
64
+ *
65
+ * All three paths are lowercased by default. Set `syncConfig.caseSensitive`
66
+ * to `true` to preserve the original casing.
56
67
  */
57
68
  export async function resolveProjectId(cwd, syncConfig) {
69
+ const preserveCase = syncConfig.caseSensitive === true;
70
+ const norm = (s) => (preserveCase ? s : s.toLowerCase());
58
71
  // 1. Manual mapping
59
72
  if (syncConfig.projectMappings[cwd]) {
60
- return syncConfig.projectMappings[cwd];
73
+ return norm(syncConfig.projectMappings[cwd]);
61
74
  }
62
75
  // 2. Git remote URL
63
76
  const remoteUrl = await getGitRemoteUrl(cwd);
64
77
  if (remoteUrl) {
65
- return normalizeGitUrl(remoteUrl);
78
+ return normalizeGitUrl(remoteUrl, preserveCase);
66
79
  }
67
80
  // 3. Encoded path fallback
68
- return `_local/${encodeProjectPath(cwd)}`;
81
+ return `_local/${norm(encodeProjectPath(cwd))}`;
69
82
  }
70
83
  /**
71
84
  * Find all project memory directories in the sync repo that match the current cwd.
72
- * Multiple matches are possible (e.g., same project stored under both URL and encoded path).
85
+ *
86
+ * Returns:
87
+ * - The canonical (lowercase) memory dir if it exists.
88
+ * - The `_local/<encoded>` fallback if it exists and differs from the canonical.
89
+ * - Any legacy mixed-case directory whose lowercase form equals the canonical id
90
+ * (rollout window before a post-upgrade sync has migrated the repo).
91
+ *
92
+ * Multiple matches are expected during the upgrade window; callers should merge
93
+ * their contents.
73
94
  */
74
95
  export async function findMatchingProjectMemoryDirs(cwd, syncRepoPath, syncConfig) {
75
96
  const projectsDir = join(syncRepoPath, "projects");
76
- const matches = [];
97
+ const matches = new Set();
77
98
  const canonicalId = await resolveProjectId(cwd, syncConfig);
78
99
  const canonicalMemDir = join(projectsDir, canonicalId, "memory");
79
100
  try {
80
101
  await stat(canonicalMemDir);
81
- matches.push(canonicalMemDir);
102
+ matches.add(canonicalMemDir);
82
103
  }
83
104
  catch {
84
105
  // doesn't exist yet
85
106
  }
86
107
  const encodedPath = encodeProjectPath(cwd);
87
108
  const localMemDir = join(projectsDir, "_local", encodedPath, "memory");
88
- if (localMemDir !== canonicalMemDir) {
109
+ try {
110
+ await stat(localMemDir);
111
+ matches.add(localMemDir);
112
+ }
113
+ catch {
114
+ // doesn't exist
115
+ }
116
+ // Rollout-window fallback: walk projects/ and collect any directory whose
117
+ // lowercase path (relative to projects/) equals canonicalId. This catches
118
+ // legacy mixed-case dirs that have not yet been migrated.
119
+ if (!syncConfig.caseSensitive) {
120
+ const legacyMatches = await findLegacyMixedCaseMemoryDirs(projectsDir, canonicalId);
121
+ for (const m of legacyMatches)
122
+ matches.add(m);
123
+ }
124
+ return [...matches];
125
+ }
126
+ /**
127
+ * Walk projects/ collecting every memory/ parent directory whose relative
128
+ * path (lowercased) equals targetId. Skips the already-canonical lowercase path.
129
+ */
130
+ async function findLegacyMixedCaseMemoryDirs(projectsDir, targetId) {
131
+ const results = [];
132
+ const targetDepth = targetId.split("/").length;
133
+ async function walk(relativeDir, depth) {
134
+ if (depth > targetDepth)
135
+ return;
136
+ const absDir = join(projectsDir, relativeDir);
137
+ let entries;
89
138
  try {
90
- await stat(localMemDir);
91
- matches.push(localMemDir);
139
+ entries = await readdir(absDir, { withFileTypes: true });
92
140
  }
93
141
  catch {
94
- // doesn't exist
142
+ return;
143
+ }
144
+ if (depth === targetDepth) {
145
+ // Leaf of the project id — check for memory/ child
146
+ const hasMemory = entries.some((e) => e.isDirectory() && e.name === "memory");
147
+ if (hasMemory && relativeDir.toLowerCase() === targetId && relativeDir !== targetId) {
148
+ results.push(join(absDir, "memory"));
149
+ }
150
+ return;
151
+ }
152
+ for (const entry of entries) {
153
+ if (!entry.isDirectory() || entry.name === "memory")
154
+ continue;
155
+ // Only recurse into candidates that could lowercase-match the target prefix
156
+ const childRel = relativeDir ? `${relativeDir}/${entry.name}` : entry.name;
157
+ const targetPrefix = targetId
158
+ .split("/")
159
+ .slice(0, depth + 1)
160
+ .join("/");
161
+ if (childRel.toLowerCase() === targetPrefix) {
162
+ await walk(childRel, depth + 1);
163
+ }
95
164
  }
96
165
  }
97
- return matches;
166
+ await walk("", 0);
167
+ return results;
98
168
  }
99
169
  /**
100
170
  * Get the sync repo's memory directory path for the canonical project ID.
@@ -1 +1 @@
1
- {"version":3,"file":"project-mapping.js","sourceRoot":"","sources":["../src/project-mapping.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project-mapping.js","sourceRoot":"","sources":["../src/project-mapping.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import type { SyncConfig } from "./types.js";
2
+ /**
3
+ * Read the on-disk sync repo schema version. Returns 1 (legacy default) if
4
+ * the marker file is missing, unreadable, malformed JSON, or has an unexpected
5
+ * shape. Any positive integer at the `version` key is returned as-is.
6
+ */
7
+ export declare function readSyncRepoVersion(syncRepoDir: string): Promise<number>;
8
+ /**
9
+ * Write the sync repo schema version marker, creating `.memex-sync/` if needed.
10
+ */
11
+ export declare function writeSyncRepoVersion(syncRepoDir: string, version: number): Promise<void>;
12
+ /**
13
+ * Merge two markdown file bodies for the migration's "true merge" path.
14
+ * Not the same as `autoResolveMarkdownConflict` in sync.ts, which handles
15
+ * inline git conflict markers within a single file.
16
+ *
17
+ * Lossless: concatenates both bodies with a blank line. Deduplicates if the
18
+ * trimmed bodies are identical.
19
+ */
20
+ export declare function mergeMarkdownBodies(a: string, b: string): string;
21
+ /**
22
+ * Detects whether the sync repo is currently in a mid-rebase or mid-merge
23
+ * state. Used by the migration orchestrator to bail out cleanly instead of
24
+ * operating on a broken tree.
25
+ */
26
+ export declare function isMidRebaseOrMerge(syncRepoDir: string): Promise<boolean>;
27
+ export type MigrationResult = {
28
+ renamed: string[];
29
+ merged: string[];
30
+ };
31
+ /**
32
+ * Walk `projects/` and rename mixed-case project ids to their lowercase form.
33
+ *
34
+ * Returns counts of renamed (case-only rename, no lowercase collision) and
35
+ * merged (lowercase target already existed — case-sensitive FS only) paths.
36
+ *
37
+ * Does not commit. Callers own the commit decision. Safe to run in a clean
38
+ * working tree — staged changes may confuse callers of `git add -A` afterward.
39
+ */
40
+ export declare function migrateProjectIdsToLowercase(syncRepoDir: string): Promise<MigrationResult>;
41
+ /**
42
+ * Run all pending sync repo migrations. Idempotent. Safe to call repeatedly
43
+ * from the top of `syncPull` — it becomes a no-op once the v2 marker is
44
+ * written.
45
+ *
46
+ * IMPORTANT: Callers must only invoke this after pulling the latest remote
47
+ * state (or in a local-only repo with no remote). Running on stale local
48
+ * state when a remote exists can cause divergent migration commits across
49
+ * devices. See `openspec/changes/lowercase-project-ids/design.md`
50
+ * section 4.
51
+ */
52
+ export declare function runSyncMigrations(config: SyncConfig, syncRepoDir: string): Promise<string>;
53
+ //# sourceMappingURL=sync-migration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-migration.d.ts","sourceRoot":"","sources":["../src/sync-migration.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAa7C;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAkB9E;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI9F;AAMD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAKhE;AAMD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAe9E;AAMD,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC;AAwFF;;;;;;;;GAQG;AACH,wBAAsB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAmDhG;AAgGD;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAsChG"}
@@ -0,0 +1,342 @@
1
+ import { mkdir, readdir, readFile, rm, rmdir, stat, writeFile } from "node:fs/promises";
2
+ import { dirname, join } from "node:path";
3
+ import { git, hasCommits } from "./git-helpers.js";
4
+ // ---------------------------------------------------------------------------
5
+ // Sync repo version marker
6
+ // ---------------------------------------------------------------------------
7
+ const MARKER_DIR = ".memex-sync";
8
+ const MARKER_FILE = "version.json";
9
+ function markerPath(syncRepoDir) {
10
+ return join(syncRepoDir, MARKER_DIR, MARKER_FILE);
11
+ }
12
+ /**
13
+ * Read the on-disk sync repo schema version. Returns 1 (legacy default) if
14
+ * the marker file is missing, unreadable, malformed JSON, or has an unexpected
15
+ * shape. Any positive integer at the `version` key is returned as-is.
16
+ */
17
+ export async function readSyncRepoVersion(syncRepoDir) {
18
+ try {
19
+ const raw = await readFile(markerPath(syncRepoDir), "utf-8");
20
+ const parsed = JSON.parse(raw);
21
+ if (typeof parsed === "object" &&
22
+ parsed !== null &&
23
+ "version" in parsed &&
24
+ typeof parsed.version === "number" &&
25
+ Number.isInteger(parsed.version) &&
26
+ parsed.version > 0) {
27
+ return parsed.version;
28
+ }
29
+ return 1;
30
+ }
31
+ catch {
32
+ return 1;
33
+ }
34
+ }
35
+ /**
36
+ * Write the sync repo schema version marker, creating `.memex-sync/` if needed.
37
+ */
38
+ export async function writeSyncRepoVersion(syncRepoDir, version) {
39
+ await mkdir(join(syncRepoDir, MARKER_DIR), { recursive: true });
40
+ const content = `${JSON.stringify({ version }, null, 2)}\n`;
41
+ await writeFile(markerPath(syncRepoDir), content, "utf-8");
42
+ }
43
+ // ---------------------------------------------------------------------------
44
+ // Markdown merge (two separate files, not inline conflict markers)
45
+ // ---------------------------------------------------------------------------
46
+ /**
47
+ * Merge two markdown file bodies for the migration's "true merge" path.
48
+ * Not the same as `autoResolveMarkdownConflict` in sync.ts, which handles
49
+ * inline git conflict markers within a single file.
50
+ *
51
+ * Lossless: concatenates both bodies with a blank line. Deduplicates if the
52
+ * trimmed bodies are identical.
53
+ */
54
+ export function mergeMarkdownBodies(a, b) {
55
+ const at = a.trim();
56
+ const bt = b.trim();
57
+ if (at === bt)
58
+ return at;
59
+ return `${at}\n\n${bt}`;
60
+ }
61
+ // ---------------------------------------------------------------------------
62
+ // Mid-rebase / mid-merge detection
63
+ // ---------------------------------------------------------------------------
64
+ /**
65
+ * Detects whether the sync repo is currently in a mid-rebase or mid-merge
66
+ * state. Used by the migration orchestrator to bail out cleanly instead of
67
+ * operating on a broken tree.
68
+ */
69
+ export async function isMidRebaseOrMerge(syncRepoDir) {
70
+ const candidates = [
71
+ join(syncRepoDir, ".git", "rebase-merge"),
72
+ join(syncRepoDir, ".git", "rebase-apply"),
73
+ join(syncRepoDir, ".git", "MERGE_HEAD"),
74
+ ];
75
+ for (const path of candidates) {
76
+ try {
77
+ await stat(path);
78
+ return true;
79
+ }
80
+ catch {
81
+ // not present, continue
82
+ }
83
+ }
84
+ return false;
85
+ }
86
+ /**
87
+ * Walk `projects/` and return every relative path that is the immediate
88
+ * parent of a `memory/` subdirectory. Those paths are project ids.
89
+ *
90
+ * Does not recurse into a project id once found — `memory/` content is not
91
+ * scanned for nested project ids.
92
+ */
93
+ async function findProjectIds(projectsDir) {
94
+ const results = [];
95
+ async function walk(relativeDir) {
96
+ const absDir = join(projectsDir, relativeDir);
97
+ let entries;
98
+ try {
99
+ entries = await readdir(absDir, { withFileTypes: true });
100
+ }
101
+ catch {
102
+ return;
103
+ }
104
+ const hasMemory = entries.some((e) => e.isDirectory() && e.name === "memory");
105
+ if (hasMemory && relativeDir !== "") {
106
+ results.push(relativeDir);
107
+ return;
108
+ }
109
+ for (const entry of entries) {
110
+ if (!entry.isDirectory() || entry.name === "memory")
111
+ continue;
112
+ const childRel = relativeDir ? `${relativeDir}/${entry.name}` : entry.name;
113
+ await walk(childRel);
114
+ }
115
+ }
116
+ await walk("");
117
+ return results;
118
+ }
119
+ function hasUppercase(s) {
120
+ return s !== s.toLowerCase();
121
+ }
122
+ /**
123
+ * Rename a single mixed-case project directory to its lowercase form using
124
+ * the two-step pattern. Safe on both case-sensitive and case-insensitive
125
+ * filesystems (macOS APFS, Windows NTFS).
126
+ *
127
+ * The caller is responsible for making sure srcRelative exists — any failure
128
+ * from `git mv` propagates up.
129
+ */
130
+ async function gitRenameCaseOnly(syncRepoDir, srcRelative, dstRelative) {
131
+ const tmpRelative = `${srcRelative}.memex-rename-tmp`;
132
+ // Ensure the destination parent directory exists (git mv does not create it).
133
+ const dstParent = dirname(join(syncRepoDir, dstRelative));
134
+ await mkdir(dstParent, { recursive: true });
135
+ await git(["mv", srcRelative, tmpRelative], syncRepoDir);
136
+ await git(["mv", tmpRelative, dstRelative], syncRepoDir);
137
+ }
138
+ /**
139
+ * After a rename, walk upward from the legacy source path removing empty
140
+ * directories until we hit `projects/`. Git doesn't track empty dirs so
141
+ * `git rm` is not needed — plain `fs.rm` on the working tree is enough.
142
+ */
143
+ async function removeEmptyLegacyAncestors(syncRepoDir, srcRelative) {
144
+ const projectsRoot = join(syncRepoDir, "projects");
145
+ let current = dirname(join(syncRepoDir, srcRelative));
146
+ while (current !== projectsRoot && current.startsWith(projectsRoot)) {
147
+ let entries;
148
+ try {
149
+ entries = await readdir(current);
150
+ }
151
+ catch {
152
+ return;
153
+ }
154
+ if (entries.length > 0)
155
+ return;
156
+ try {
157
+ await rmdir(current);
158
+ }
159
+ catch {
160
+ return;
161
+ }
162
+ current = dirname(current);
163
+ }
164
+ }
165
+ /**
166
+ * Walk `projects/` and rename mixed-case project ids to their lowercase form.
167
+ *
168
+ * Returns counts of renamed (case-only rename, no lowercase collision) and
169
+ * merged (lowercase target already existed — case-sensitive FS only) paths.
170
+ *
171
+ * Does not commit. Callers own the commit decision. Safe to run in a clean
172
+ * working tree — staged changes may confuse callers of `git add -A` afterward.
173
+ */
174
+ export async function migrateProjectIdsToLowercase(syncRepoDir) {
175
+ const projectsDir = join(syncRepoDir, "projects");
176
+ try {
177
+ await stat(projectsDir);
178
+ }
179
+ catch {
180
+ return { renamed: [], merged: [] };
181
+ }
182
+ const allIds = await findProjectIds(projectsDir);
183
+ const mixedCase = allIds.filter(hasUppercase);
184
+ // Rename deepest paths first so that renaming a parent doesn't shift the
185
+ // location of a child that still needs renaming.
186
+ mixedCase.sort((a, b) => b.split("/").length - a.split("/").length);
187
+ const renamed = [];
188
+ const merged = [];
189
+ for (const src of mixedCase) {
190
+ const dst = src.toLowerCase();
191
+ const srcRelative = `projects/${src}`;
192
+ const dstRelative = `projects/${dst}`;
193
+ // Does a lowercase destination already exist as a distinct directory?
194
+ // On case-insensitive filesystems, stat() of the lowercase form resolves
195
+ // to the same inode as the mixed-case form. We detect that by comparing
196
+ // inodes; if they match, it's a case-only rename (not a merge).
197
+ const srcAbs = join(syncRepoDir, srcRelative);
198
+ const dstAbs = join(syncRepoDir, dstRelative);
199
+ let isDistinctMerge = false;
200
+ try {
201
+ const [srcStat, dstStat] = await Promise.all([stat(srcAbs), stat(dstAbs)]);
202
+ isDistinctMerge = !(srcStat.ino === dstStat.ino && srcStat.dev === dstStat.dev);
203
+ }
204
+ catch {
205
+ isDistinctMerge = false; // dst doesn't exist → plain rename
206
+ }
207
+ if (isDistinctMerge) {
208
+ await mergeProjectDirs(syncRepoDir, srcRelative, dstRelative);
209
+ await removeEmptyLegacyAncestors(syncRepoDir, srcRelative);
210
+ merged.push(src);
211
+ continue;
212
+ }
213
+ await gitRenameCaseOnly(syncRepoDir, srcRelative, dstRelative);
214
+ await removeEmptyLegacyAncestors(syncRepoDir, srcRelative);
215
+ renamed.push(src);
216
+ }
217
+ return { renamed, merged };
218
+ }
219
+ /**
220
+ * Merge the contents of two distinct project directories (only reachable on
221
+ * case-sensitive filesystems where both `Foo/` and `foo/` exist as separate
222
+ * inodes).
223
+ *
224
+ * INVARIANT: project directories contain ONLY a `memory/` subdirectory, no
225
+ * sibling files. This matches the structure created by `syncCommitAndPush`
226
+ * (which writes only `projects/<id>/memory/*.md`). Any sibling files under
227
+ * the legacy source would be silently removed by the final rm — they are
228
+ * not merged across. If a future writer introduces sibling content, this
229
+ * function needs to be updated to walk the entire source tree, not just
230
+ * `memory/`.
231
+ *
232
+ * Walks `src/memory/` file-by-file:
233
+ *
234
+ * - File absent in dst → `git mv` into dst.
235
+ * - Markdown file present in both → read both bodies, merge losslessly with
236
+ * `mergeMarkdownBodies`, write to dst, `git rm` src.
237
+ * - Non-markdown file present in both → keep whichever has the newer mtime.
238
+ *
239
+ * After the walk, remove the now-empty source directory tree via `fs.rm`.
240
+ */
241
+ async function mergeProjectDirs(syncRepoDir, srcRelative, dstRelative) {
242
+ const srcMemoryRel = `${srcRelative}/memory`;
243
+ const dstMemoryRel = `${dstRelative}/memory`;
244
+ const srcMemoryAbs = join(syncRepoDir, srcMemoryRel);
245
+ const dstMemoryAbs = join(syncRepoDir, dstMemoryRel);
246
+ // Ensure destination memory/ exists — git mv fails if the parent doesn't.
247
+ await mkdir(dstMemoryAbs, { recursive: true });
248
+ let entries;
249
+ try {
250
+ entries = await readdir(srcMemoryAbs, { withFileTypes: true });
251
+ }
252
+ catch {
253
+ entries = [];
254
+ }
255
+ for (const entry of entries) {
256
+ if (!entry.isFile())
257
+ continue;
258
+ const srcFileRel = `${srcMemoryRel}/${entry.name}`;
259
+ const dstFileRel = `${dstMemoryRel}/${entry.name}`;
260
+ const srcFileAbs = join(syncRepoDir, srcFileRel);
261
+ const dstFileAbs = join(syncRepoDir, dstFileRel);
262
+ let dstExists = false;
263
+ try {
264
+ await stat(dstFileAbs);
265
+ dstExists = true;
266
+ }
267
+ catch {
268
+ dstExists = false;
269
+ }
270
+ if (!dstExists) {
271
+ await git(["mv", srcFileRel, dstFileRel], syncRepoDir);
272
+ continue;
273
+ }
274
+ if (entry.name.endsWith(".md")) {
275
+ const [srcBody, dstBody] = await Promise.all([
276
+ readFile(srcFileAbs, "utf-8"),
277
+ readFile(dstFileAbs, "utf-8"),
278
+ ]);
279
+ const mergedBody = mergeMarkdownBodies(srcBody, dstBody);
280
+ await writeFile(dstFileAbs, mergedBody, "utf-8");
281
+ await git(["add", dstFileRel], syncRepoDir);
282
+ await git(["rm", srcFileRel], syncRepoDir);
283
+ }
284
+ else {
285
+ const [srcStatRes, dstStatRes] = await Promise.all([stat(srcFileAbs), stat(dstFileAbs)]);
286
+ if (srcStatRes.mtimeMs > dstStatRes.mtimeMs) {
287
+ // src is newer — replace dst with src content
288
+ const content = await readFile(srcFileAbs);
289
+ await writeFile(dstFileAbs, content);
290
+ await git(["add", dstFileRel], syncRepoDir);
291
+ }
292
+ // either way, remove src
293
+ await git(["rm", srcFileRel], syncRepoDir);
294
+ }
295
+ }
296
+ // All tracked files have been git-removed or moved; the src directory tree
297
+ // is now empty and untracked — remove the remaining inode with plain fs.rm.
298
+ await rm(join(syncRepoDir, srcRelative), { recursive: true, force: true });
299
+ }
300
+ // ---------------------------------------------------------------------------
301
+ // Orchestrator
302
+ // ---------------------------------------------------------------------------
303
+ /**
304
+ * Run all pending sync repo migrations. Idempotent. Safe to call repeatedly
305
+ * from the top of `syncPull` — it becomes a no-op once the v2 marker is
306
+ * written.
307
+ *
308
+ * IMPORTANT: Callers must only invoke this after pulling the latest remote
309
+ * state (or in a local-only repo with no remote). Running on stale local
310
+ * state when a remote exists can cause divergent migration commits across
311
+ * devices. See `openspec/changes/lowercase-project-ids/design.md`
312
+ * section 4.
313
+ */
314
+ export async function runSyncMigrations(config, syncRepoDir) {
315
+ if (config.caseSensitive === true) {
316
+ return "migration skipped (case-sensitive mode)";
317
+ }
318
+ if (await isMidRebaseOrMerge(syncRepoDir)) {
319
+ return "migration skipped (mid-rebase/merge state)";
320
+ }
321
+ if (!(await hasCommits(syncRepoDir))) {
322
+ // Fresh repo — nothing to scan. Write the marker so the first user
323
+ // commit carries it.
324
+ await writeSyncRepoVersion(syncRepoDir, 2);
325
+ return "marker initialized (fresh repo)";
326
+ }
327
+ const version = await readSyncRepoVersion(syncRepoDir);
328
+ if (version >= 2) {
329
+ return "migration skipped (already v2)";
330
+ }
331
+ const result = await migrateProjectIdsToLowercase(syncRepoDir);
332
+ await writeSyncRepoVersion(syncRepoDir, 2);
333
+ await git(["add", "-A"], syncRepoDir);
334
+ const { stdout } = await git(["status", "--porcelain"], syncRepoDir);
335
+ if (!stdout.trim()) {
336
+ return `migration: no changes (renamed ${result.renamed.length}, merged ${result.merged.length})`;
337
+ }
338
+ await git(["commit", "-m", "memex: migrate project IDs to lowercase (schema v1 → v2)"], syncRepoDir);
339
+ process.stderr.write(`memex[sync]: migrated ${result.renamed.length} project(s), merged ${result.merged.length}\n`);
340
+ return `migrated ${result.renamed.length} dir(s), merged ${result.merged.length}`;
341
+ }
342
+ //# sourceMappingURL=sync-migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-migration.js","sourceRoot":"","sources":["../src/sync-migration.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA6D7C;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAWnE;AAwCD,wBAAsB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BzF;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAoDvF;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,EACvE,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,CAiDjB;AAwFD,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG;IACrD,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,CAKA"}
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAQ7C;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAWnE;AAwCD,wBAAsB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BzF;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAuCvF;AAgDD;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,EACvE,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,CAiDjB;AAwFD,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG;IACrD,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,CAKA"}
package/dist/sync.js CHANGED
@@ -2,63 +2,11 @@ import { execFile } from "node:child_process";
2
2
  import { mkdir, readdir, readFile, stat, writeFile } from "node:fs/promises";
3
3
  import { join } from "node:path";
4
4
  import { promisify } from "node:util";
5
+ import { getDefaultBranch, git, hasCommits, hasRemote, isGitRepo } from "./git-helpers.js";
5
6
  import { getSyncProjectMemoryDir } from "./project-mapping.js";
7
+ import { runSyncMigrations } from "./sync-migration.js";
6
8
  const execFileAsync = promisify(execFile);
7
9
  // ---------------------------------------------------------------------------
8
- // Git helpers
9
- // ---------------------------------------------------------------------------
10
- async function git(args, cwd) {
11
- return execFileAsync("git", args, { cwd, timeout: 30_000 });
12
- }
13
- async function isGitRepo(dir) {
14
- try {
15
- await git(["rev-parse", "--git-dir"], dir);
16
- return true;
17
- }
18
- catch {
19
- return false;
20
- }
21
- }
22
- async function hasRemote(dir) {
23
- try {
24
- const { stdout } = await git(["remote"], dir);
25
- return stdout.trim().length > 0;
26
- }
27
- catch {
28
- return false;
29
- }
30
- }
31
- async function hasCommits(dir) {
32
- try {
33
- await git(["rev-parse", "HEAD"], dir);
34
- return true;
35
- }
36
- catch {
37
- return false;
38
- }
39
- }
40
- async function getDefaultBranch(dir) {
41
- try {
42
- const { stdout } = await git(["symbolic-ref", "refs/remotes/origin/HEAD"], dir);
43
- const ref = stdout.trim();
44
- const branch = ref.replace(/^refs\/remotes\/origin\//, "");
45
- if (branch)
46
- return branch;
47
- }
48
- catch {
49
- try {
50
- const { stdout } = await git(["ls-remote", "--symref", "origin", "HEAD"], dir);
51
- const match = stdout.match(/ref:\s+refs\/heads\/(\S+)/);
52
- if (match)
53
- return match[1];
54
- }
55
- catch {
56
- // Fall through to default
57
- }
58
- }
59
- return "main";
60
- }
61
- // ---------------------------------------------------------------------------
62
10
  // Conflict resolution
63
11
  // ---------------------------------------------------------------------------
64
12
  /**
@@ -140,10 +88,21 @@ export async function syncPull(config, syncRepoDir) {
140
88
  if (!config.enabled || !config.repo)
141
89
  return "sync disabled";
142
90
  await initSyncRepo(config, syncRepoDir);
143
- if (!(await hasRemote(syncRepoDir)))
91
+ if (!(await hasRemote(syncRepoDir))) {
92
+ // Local-only repo — migrate without remote coordination concerns.
93
+ await runSyncMigrations(config, syncRepoDir);
144
94
  return "no remote configured";
145
- if (!(await hasCommits(syncRepoDir)))
95
+ }
96
+ if (!(await hasCommits(syncRepoDir))) {
97
+ // Fresh local repo with a remote configured. This can mean either
98
+ // (a) initSyncRepo's clone failed and fell back to `git init`, or
99
+ // (b) the remote is genuinely empty. In case (a) the remote's content
100
+ // has never been seen — writing a v2 marker locally and later rebasing
101
+ // it onto legacy v1 content would falsely mark that content as migrated.
102
+ // Defer migration until the repo has commits and we've successfully
103
+ // fetched the remote state.
146
104
  return "no commits yet";
105
+ }
147
106
  try {
148
107
  await git(["fetch", "origin"], syncRepoDir);
149
108
  }
@@ -152,6 +111,20 @@ export async function syncPull(config, syncRepoDir) {
152
111
  }
153
112
  const defaultBranch = await getDefaultBranch(syncRepoDir);
154
113
  const remoteBranch = `origin/${defaultBranch}`;
114
+ const pullResult = await pullWithConflictResolution(syncRepoDir, remoteBranch);
115
+ if (pullResult.startsWith("pull failed")) {
116
+ return pullResult;
117
+ }
118
+ // Migration runs only after a successful pull — never on stale local state.
119
+ await runSyncMigrations(config, syncRepoDir);
120
+ return pullResult;
121
+ }
122
+ /**
123
+ * Attempt rebase-first pull with fallback to merge, both with markdown
124
+ * conflict auto-resolution. Extracted so syncPull can cleanly run migration
125
+ * after any success path.
126
+ */
127
+ async function pullWithConflictResolution(syncRepoDir, remoteBranch) {
155
128
  try {
156
129
  await git(["rebase", remoteBranch], syncRepoDir);
157
130
  return "pulled successfully";
package/dist/sync.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -132,6 +132,12 @@ export type SyncConfig = {
132
132
  autoPull: boolean;
133
133
  autoCommitPush: boolean;
134
134
  projectMappings: Record<string, string>;
135
+ /**
136
+ * When true, project IDs preserve the case of git remote URLs, manual mappings,
137
+ * and encoded cwd paths. When false or undefined (default), project IDs are
138
+ * lowercased across all three resolution paths.
139
+ */
140
+ caseSensitive?: boolean;
135
141
  };
136
142
  export type ProjectRegistry = {
137
143
  version: 1;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jim80net/memex-core",
3
- "version": "0.3.1",
3
+ "version": "0.4.0",
4
4
  "description": "Shared core engine for memex skill routers — embeddings, indexing, caching, telemetry",
5
5
  "license": "MIT",
6
6
  "repository": {