@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 +30 -0
- package/dist/git-helpers.d.ts +12 -0
- package/dist/git-helpers.d.ts.map +1 -0
- package/dist/git-helpers.js +58 -0
- package/dist/git-helpers.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/project-mapping.d.ts +19 -2
- package/dist/project-mapping.d.ts.map +1 -1
- package/dist/project-mapping.js +86 -16
- package/dist/project-mapping.js.map +1 -1
- package/dist/sync-migration.d.ts +53 -0
- package/dist/sync-migration.d.ts.map +1 -0
- package/dist/sync-migration.js +342 -0
- package/dist/sync-migration.js.map +1 -0
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +29 -56
- package/dist/sync.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
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";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
-
*
|
|
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
|
|
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"}
|
package/dist/project-mapping.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
*
|
|
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.
|
|
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
|
-
|
|
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
|
|
91
|
-
matches.push(localMemDir);
|
|
139
|
+
entries = await readdir(absDir, { withFileTypes: true });
|
|
92
140
|
}
|
|
93
141
|
catch {
|
|
94
|
-
|
|
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
|
-
|
|
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"project-mapping.js","sourceRoot":"","sources":["../src/project-mapping.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGtD,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,aAAa,GAAG,KAAK;IAChE,IAAI,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAE5B,sBAAsB;IACtB,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAE9C,kCAAkC;IAClC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3D,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,OAAO,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;IACvD,CAAC;IAED,wCAAwC;IACxC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACxF,OAAO,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;IAC/D,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe,CAAC,GAAW;IACxC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE;YAC7E,GAAG;YACH,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC1B,OAAO,GAAG,IAAI,IAAI,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAW,EAAE,UAAsB;IACxE,MAAM,YAAY,GAAG,UAAU,CAAC,aAAa,KAAK,IAAI,CAAC;IACvD,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAEjE,oBAAoB;IACpB,IAAI,UAAU,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,oBAAoB;IACpB,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,eAAe,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAClD,CAAC;IAED,2BAA2B;IAC3B,OAAO,UAAU,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;AAClD,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,GAAW,EACX,YAAoB,EACpB,UAAsB;IAEtB,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAElC,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAC5D,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IACjE,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,eAAe,CAAC,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,oBAAoB;IACtB,CAAC;IAED,MAAM,WAAW,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IACvE,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,gBAAgB;IAClB,CAAC;IAED,0EAA0E;IAC1E,0EAA0E;IAC1E,0DAA0D;IAC1D,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;QAC9B,MAAM,aAAa,GAAG,MAAM,6BAA6B,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACpF,KAAK,MAAM,CAAC,IAAI,aAAa;YAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,6BAA6B,CAC1C,WAAmB,EACnB,QAAgB;IAEhB,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IAE/C,KAAK,UAAU,IAAI,CAAC,WAAmB,EAAE,KAAa;QACpD,IAAI,KAAK,GAAG,WAAW;YAAE,OAAO;QAEhC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAC9C,IAAI,OAAmC,CAAC;QACxC,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QAED,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;YAC1B,mDAAmD;YACnD,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YAC9E,IAAI,SAAS,IAAI,WAAW,CAAC,WAAW,EAAE,KAAK,QAAQ,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;gBACpF,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;YACvC,CAAC;YACD,OAAO;QACT,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAAE,SAAS;YAC9D,4EAA4E;YAC5E,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;YAC3E,MAAM,YAAY,GAAG,QAAQ;iBAC1B,KAAK,CAAC,GAAG,CAAC;iBACV,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;iBACnB,IAAI,CAAC,GAAG,CAAC,CAAC;YACb,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,YAAY,EAAE,CAAC;gBAC5C,MAAM,IAAI,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAClB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,GAAW,EACX,YAAoB,EACpB,UAAsB;IAEtB,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAC5D,OAAO,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -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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"}
|
package/dist/sync.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"
|
|
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
|
-
|
|
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;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -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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"}
|