@jim80net/memex-core 0.5.0 → 0.6.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 +42 -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/origin.d.ts +137 -0
- package/dist/origin.d.ts.map +1 -0
- package/dist/origin.js +490 -0
- package/dist/origin.js.map +1 -0
- package/dist/types.d.ts +96 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -174,6 +174,48 @@ 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
|
+
## Shared origin + projection
|
|
178
|
+
|
|
179
|
+
Harness-neutral primitives for a **shared origin** corpus and **symlink projection** into harness dirs (file-shaped rules/skills; provenance via `readlink`). Design: `design/shared-origin-sync-profile.md`.
|
|
180
|
+
|
|
181
|
+
```typescript
|
|
182
|
+
import {
|
|
183
|
+
resolveOriginRoot,
|
|
184
|
+
planProjection,
|
|
185
|
+
applyProjection,
|
|
186
|
+
materializeEntry,
|
|
187
|
+
} from "@jim80net/memex-core";
|
|
188
|
+
|
|
189
|
+
const { root } = await resolveOriginRoot(); // default ~/.memex (+ XDG / memex-claude fallbacks)
|
|
190
|
+
|
|
191
|
+
await materializeEntry(root, {
|
|
192
|
+
kind: "rule",
|
|
193
|
+
originRelPath: "rules/my-rule.md",
|
|
194
|
+
content: "---\nname: my-rule\ntype: rule\n---\n…\n",
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
const plan = await planProjection(root, [
|
|
198
|
+
{
|
|
199
|
+
id: "user-rules",
|
|
200
|
+
targetDir: `${process.env.HOME}/.grok/rules`,
|
|
201
|
+
originRelDir: "rules",
|
|
202
|
+
entryKind: "files",
|
|
203
|
+
},
|
|
204
|
+
]);
|
|
205
|
+
// Partial apply: non-conflicting links applied; real files never clobbered
|
|
206
|
+
const report = await applyProjection(plan);
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
| API | Role |
|
|
210
|
+
|-----|------|
|
|
211
|
+
| `resolveOriginRoot` | Default `~/.memex`; env `MEMEX_ORIGIN`; fallbacks XDG `memex` then legacy `memex-claude` |
|
|
212
|
+
| `planProjection` / `applyProjection` | Per-entry **absolute** symlinks; fail-closed on real files; partial apply + conflict report |
|
|
213
|
+
| `materializeEntry` | Write rule/skill/memory into origin (per-file lock; no commit) |
|
|
214
|
+
| `commitOriginPaths` | Optional git commit of origin-relative paths (no push) |
|
|
215
|
+
| `migrateOriginToDefault` | Move legacy corpus → `~/.memex` + one-release compat symlink |
|
|
216
|
+
|
|
217
|
+
Adapters own harness paths and CLI/doctor; core stays path-agnostic except the product-default origin chain.
|
|
218
|
+
|
|
177
219
|
## Sync
|
|
178
220
|
|
|
179
221
|
The `sync` module provides Git-based cross-device sync via `syncPull` and `syncCommitAndPush`. Both accept a `SyncConfig` object.
|
package/dist/index.d.ts
CHANGED
|
@@ -2,6 +2,8 @@ export * from "./cache.js";
|
|
|
2
2
|
export * from "./config.js";
|
|
3
3
|
export * from "./embeddings.js";
|
|
4
4
|
export * from "./file-lock.js";
|
|
5
|
+
export type { ApplyProjectionOptions, ApplyProjectionResult, CommitOriginResult, InstallLegacyCompatResult, MigrateOriginResult, OriginRootSource, PlanProjectionOptions, ResolvedOriginRoot, ResolveOriginRootOptions, } from "./origin.js";
|
|
6
|
+
export { applyProjection, commitOriginPaths, defaultOriginRoot, expandUserPath, installLegacyOriginCompatSymlink, isPathInsideRoot, legacyClaudeOriginRoot, materializeEntry, migrateOriginToDefault, planProjection, resolveOriginRoot, resolveUnderOrigin, toAbsolutePath, } from "./origin.js";
|
|
5
7
|
export * from "./path-encoder.js";
|
|
6
8
|
export type { HarnessKind, PortableLocationWarn, ResolvedPortableLocation, ScanRoot, ScanRootContext, ScanRootRegistry, ScanRootSpec, } from "./portable-location.js";
|
|
7
9
|
export { buildScanRoots, decodeFragment, decodePortableLocation, decodePortableLocationResolved, encodeFragment, encodePortableLocation, escapePortableText, HANDLE_PREFIX, resolvePortableLocation, resolvePortableLocationResolved, splitPortableHandle, stableUnclassifiedKey, unescapePortableText, } from "./portable-location.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,YAAY,EACV,WAAW,EACX,oBAAoB,EACpB,wBAAwB,EACxB,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,YAAY,GACb,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,cAAc,EACd,cAAc,EACd,sBAAsB,EACtB,8BAA8B,EAC9B,cAAc,EACd,sBAAsB,EACtB,kBAAkB,EAClB,aAAa,EACb,uBAAuB,EACvB,+BAA+B,EAC/B,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,YAAY,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACpE,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"}
|
|
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,YAAY,EACV,sBAAsB,EACtB,qBAAqB,EACrB,kBAAkB,EAClB,yBAAyB,EACzB,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,EACrB,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,gCAAgC,EAChC,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,EAChB,sBAAsB,EACtB,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,GACf,MAAM,aAAa,CAAC;AACrB,cAAc,mBAAmB,CAAC;AAClC,YAAY,EACV,WAAW,EACX,oBAAoB,EACpB,wBAAwB,EACxB,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,YAAY,GACb,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,cAAc,EACd,cAAc,EACd,sBAAsB,EACtB,8BAA8B,EAC9B,cAAc,EACd,sBAAsB,EACtB,kBAAkB,EAClB,aAAa,EACb,uBAAuB,EACvB,+BAA+B,EAC/B,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,YAAY,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACpE,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
|
@@ -2,6 +2,7 @@ export * from "./cache.js";
|
|
|
2
2
|
export * from "./config.js";
|
|
3
3
|
export * from "./embeddings.js";
|
|
4
4
|
export * from "./file-lock.js";
|
|
5
|
+
export { applyProjection, commitOriginPaths, defaultOriginRoot, expandUserPath, installLegacyOriginCompatSymlink, isPathInsideRoot, legacyClaudeOriginRoot, materializeEntry, migrateOriginToDefault, planProjection, resolveOriginRoot, resolveUnderOrigin, toAbsolutePath, } from "./origin.js";
|
|
5
6
|
export * from "./path-encoder.js";
|
|
6
7
|
export { buildScanRoots, decodeFragment, decodePortableLocation, decodePortableLocationResolved, encodeFragment, encodePortableLocation, escapePortableText, HANDLE_PREFIX, resolvePortableLocation, resolvePortableLocationResolved, splitPortableHandle, stableUnclassifiedKey, unescapePortableText, } from "./portable-location.js";
|
|
7
8
|
export * from "./project-mapping.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;
|
|
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;AAY/B,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,gCAAgC,EAChC,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,EAChB,sBAAsB,EACtB,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,GACf,MAAM,aAAa,CAAC;AACrB,cAAc,mBAAmB,CAAC;AAUlC,OAAO,EACL,cAAc,EACd,cAAc,EACd,sBAAsB,EACtB,8BAA8B,EAC9B,cAAc,EACd,sBAAsB,EACtB,kBAAkB,EAClB,aAAa,EACb,uBAAuB,EACvB,+BAA+B,EAC/B,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAChC,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"}
|
package/dist/origin.d.ts
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared origin root resolution, symlink projection, and materialize writes.
|
|
3
|
+
*
|
|
4
|
+
* Design: design/shared-origin-sync-profile.md (XO-gated 2026-07-10).
|
|
5
|
+
* Locked: ~/.memex default + resolver; absolute symlinks v1; partial apply
|
|
6
|
+
* + report conflicts; one-release memex-claude → ~/.memex compat symlink.
|
|
7
|
+
*/
|
|
8
|
+
import type { MaterializeInput, MaterializeResult, ProjectConflict, ProjectionTarget, ProjectPlan } from "./types.js";
|
|
9
|
+
export type OriginRootSource = "explicit" | "env" | "default" | "xdg" | "legacy-claude";
|
|
10
|
+
export type ResolveOriginRootOptions = {
|
|
11
|
+
/** Explicit root from profile.origin.root (absolute or ~/…). */
|
|
12
|
+
root?: string;
|
|
13
|
+
/** Override homedir (tests). */
|
|
14
|
+
homeDir?: string;
|
|
15
|
+
/** Override process.env (tests). */
|
|
16
|
+
env?: NodeJS.ProcessEnv;
|
|
17
|
+
/**
|
|
18
|
+
* When nothing exists on disk, still return the product default path
|
|
19
|
+
* (`~/.memex`). Default true.
|
|
20
|
+
*/
|
|
21
|
+
preferDefaultWhenMissing?: boolean;
|
|
22
|
+
};
|
|
23
|
+
export type ResolvedOriginRoot = {
|
|
24
|
+
root: string;
|
|
25
|
+
source: OriginRootSource;
|
|
26
|
+
/** Whether the resolved path currently exists. */
|
|
27
|
+
exists: boolean;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Expand `~/…` against homeDir; leave other paths for resolve().
|
|
31
|
+
*/
|
|
32
|
+
export declare function expandUserPath(path: string, homeDir: string): string;
|
|
33
|
+
/**
|
|
34
|
+
* Resolve to an absolute path. Rejects empty input.
|
|
35
|
+
*/
|
|
36
|
+
export declare function toAbsolutePath(path: string, homeDir: string): string;
|
|
37
|
+
/**
|
|
38
|
+
* True when `candidate` is exactly `root` or a path under `root`
|
|
39
|
+
* (after resolve). Does not follow symlinks on the inputs.
|
|
40
|
+
*/
|
|
41
|
+
export declare function isPathInsideRoot(root: string, candidate: string): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Join origin root + relative path with traversal rejection.
|
|
44
|
+
* `relPath` must not be absolute and must stay under root.
|
|
45
|
+
*/
|
|
46
|
+
export declare function resolveUnderOrigin(originRoot: string, relPath: string): string;
|
|
47
|
+
/**
|
|
48
|
+
* Resolve the shared origin root.
|
|
49
|
+
*
|
|
50
|
+
* Precedence (XO-locked):
|
|
51
|
+
* 1. explicit `opts.root`
|
|
52
|
+
* 2. env `MEMEX_ORIGIN`
|
|
53
|
+
* 3. existing `~/.memex`
|
|
54
|
+
* 4. existing `~/.local/share/memex` (XDG / historical grok default)
|
|
55
|
+
* 5. existing `~/.local/share/memex-claude` (legacy live corpus)
|
|
56
|
+
* 6. product default `~/.memex` (may not exist yet)
|
|
57
|
+
*/
|
|
58
|
+
export declare function resolveOriginRoot(opts?: ResolveOriginRootOptions): Promise<ResolvedOriginRoot>;
|
|
59
|
+
/** Product-default origin path for a given home (does not touch the filesystem). */
|
|
60
|
+
export declare function defaultOriginRoot(homeDir?: string): string;
|
|
61
|
+
/** Legacy claude corpus path (compat / migrate source). */
|
|
62
|
+
export declare function legacyClaudeOriginRoot(homeDir?: string): string;
|
|
63
|
+
export type PlanProjectionOptions = {
|
|
64
|
+
/** Default true — replace managed symlinks that point under origin. */
|
|
65
|
+
relinkManaged?: boolean;
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Build a projection plan: which dirs to ensure, which links to create/relink/noop,
|
|
69
|
+
* and which paths conflict (fail-closed — never clobber real files).
|
|
70
|
+
*/
|
|
71
|
+
export declare function planProjection(originRoot: string, targets: ProjectionTarget[], opts?: PlanProjectionOptions): Promise<ProjectPlan>;
|
|
72
|
+
export type ApplyProjectionOptions = {
|
|
73
|
+
/** v1: only "fail-closed" — conflicts are never applied. */
|
|
74
|
+
onClobber?: "fail-closed";
|
|
75
|
+
};
|
|
76
|
+
export type ApplyProjectionResult = {
|
|
77
|
+
linked: number;
|
|
78
|
+
skipped: number;
|
|
79
|
+
conflicts: ProjectConflict[];
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* Apply a projection plan with **partial success**: non-conflicting links are
|
|
83
|
+
* applied; conflicts are reported and never applied (XO-locked).
|
|
84
|
+
*
|
|
85
|
+
* Symlinks are **absolute** (v1).
|
|
86
|
+
*/
|
|
87
|
+
export declare function applyProjection(plan: ProjectPlan, _opts?: ApplyProjectionOptions): Promise<ApplyProjectionResult>;
|
|
88
|
+
/**
|
|
89
|
+
* Write one corpus entry under origin.root with per-file lock.
|
|
90
|
+
* Does not commit. Rejects path traversal outside origin.
|
|
91
|
+
*/
|
|
92
|
+
export declare function materializeEntry(originRoot: string, input: MaterializeInput): Promise<MaterializeResult>;
|
|
93
|
+
export type CommitOriginResult = "committed" | "no-changes" | "not-a-repo" | `failed: ${string}`;
|
|
94
|
+
/**
|
|
95
|
+
* Stage and commit specific origin-relative paths when origin is a git repo.
|
|
96
|
+
* Does not push.
|
|
97
|
+
*/
|
|
98
|
+
export declare function commitOriginPaths(originRoot: string, relPaths: string[], message: string): Promise<CommitOriginResult>;
|
|
99
|
+
export type InstallLegacyCompatResult = "created" | "already" | "conflict" | "skipped-missing-default";
|
|
100
|
+
/**
|
|
101
|
+
* Install one-release backward-compat symlink:
|
|
102
|
+
* `~/.local/share/memex-claude` → `~/.memex` (or custom paths).
|
|
103
|
+
*
|
|
104
|
+
* Fail-closed if legacy path is a real file/dir (non-link).
|
|
105
|
+
*/
|
|
106
|
+
export declare function installLegacyOriginCompatSymlink(defaultRoot: string, opts?: {
|
|
107
|
+
legacyPath?: string;
|
|
108
|
+
homeDir?: string;
|
|
109
|
+
}): Promise<InstallLegacyCompatResult>;
|
|
110
|
+
export type MigrateOriginResult = {
|
|
111
|
+
status: "migrated";
|
|
112
|
+
from: string;
|
|
113
|
+
to: string;
|
|
114
|
+
compat: InstallLegacyCompatResult;
|
|
115
|
+
} | {
|
|
116
|
+
status: "already-at-default";
|
|
117
|
+
root: string;
|
|
118
|
+
} | {
|
|
119
|
+
status: "source-missing";
|
|
120
|
+
from: string;
|
|
121
|
+
} | {
|
|
122
|
+
status: "destination-exists";
|
|
123
|
+
to: string;
|
|
124
|
+
} | {
|
|
125
|
+
status: "failed";
|
|
126
|
+
reason: string;
|
|
127
|
+
};
|
|
128
|
+
/**
|
|
129
|
+
* Move an existing origin tree to the product default (`~/.memex`) and
|
|
130
|
+
* optionally install the one-release legacy compat symlink.
|
|
131
|
+
*/
|
|
132
|
+
export declare function migrateOriginToDefault(opts?: {
|
|
133
|
+
from?: string;
|
|
134
|
+
homeDir?: string;
|
|
135
|
+
installCompatSymlink?: boolean;
|
|
136
|
+
}): Promise<MigrateOriginResult>;
|
|
137
|
+
//# sourceMappingURL=origin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"origin.d.ts","sourceRoot":"","sources":["../src/origin.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAkBH,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAEhB,WAAW,EACZ,MAAM,YAAY,CAAC;AAQpB,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,KAAK,GAAG,SAAS,GAAG,KAAK,GAAG,eAAe,CAAC;AAExF,MAAM,MAAM,wBAAwB,GAAG;IACrC,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oCAAoC;IACpC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB;;;OAGG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,gBAAgB,CAAC;IACzB,kDAAkD;IAClD,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAMpE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAMpE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAMzE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAc9E;AAeD;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,GAAE,wBAA6B,GAClC,OAAO,CAAC,kBAAkB,CAAC,CAmC7B;AAED,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,MAAkB,GAAG,MAAM,CAErE;AAED,2DAA2D;AAC3D,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,MAAkB,GAAG,MAAM,CAE1E;AAMD,MAAM,MAAM,qBAAqB,GAAG;IAClC,uEAAuE;IACvE,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAuIF;;;GAGG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,gBAAgB,EAAE,EAC3B,IAAI,GAAE,qBAA0B,GAC/B,OAAO,CAAC,WAAW,CAAC,CA4CtB;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,4DAA4D;IAC5D,SAAS,CAAC,EAAE,aAAa,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,eAAe,EAAE,CAAC;CAC9B,CAAC;AAEF;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,WAAW,EACjB,KAAK,GAAE,sBAA2B,GACjC,OAAO,CAAC,qBAAqB,CAAC,CAgChC;AAMD;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,iBAAiB,CAAC,CA+C5B;AAMD,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,YAAY,GAAG,YAAY,GAAG,WAAW,MAAM,EAAE,CAAC;AAEjG;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAAE,EAClB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,kBAAkB,CAAC,CAqB7B;AAMD,MAAM,MAAM,yBAAyB,GACjC,SAAS,GACT,SAAS,GACT,UAAU,GACV,yBAAyB,CAAC;AAE9B;;;;;GAKG;AACH,wBAAsB,gCAAgC,CACpD,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GACnD,OAAO,CAAC,yBAAyB,CAAC,CA8BpC;AAED,MAAM,MAAM,mBAAmB,GAC3B;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,yBAAyB,CAAA;CAAE,GACnF;IAAE,MAAM,EAAE,oBAAoB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,MAAM,EAAE,gBAAgB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC1C;IAAE,MAAM,EAAE,oBAAoB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC5C;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC7E,OAAO,CAAC,mBAAmB,CAAC,CAkC9B"}
|
package/dist/origin.js
ADDED
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared origin root resolution, symlink projection, and materialize writes.
|
|
3
|
+
*
|
|
4
|
+
* Design: design/shared-origin-sync-profile.md (XO-gated 2026-07-10).
|
|
5
|
+
* Locked: ~/.memex default + resolver; absolute symlinks v1; partial apply
|
|
6
|
+
* + report conflicts; one-release memex-claude → ~/.memex compat symlink.
|
|
7
|
+
*/
|
|
8
|
+
import { lstat, mkdir, readdir, readFile, readlink, realpath, rename, rm, symlink, writeFile, } from "node:fs/promises";
|
|
9
|
+
import { homedir } from "node:os";
|
|
10
|
+
import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
11
|
+
import { withFileLock } from "./file-lock.js";
|
|
12
|
+
import { git, isGitRepo } from "./git-helpers.js";
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Path helpers
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
const ENV_ORIGIN = "MEMEX_ORIGIN";
|
|
17
|
+
/**
|
|
18
|
+
* Expand `~/…` against homeDir; leave other paths for resolve().
|
|
19
|
+
*/
|
|
20
|
+
export function expandUserPath(path, homeDir) {
|
|
21
|
+
if (path === "~")
|
|
22
|
+
return homeDir;
|
|
23
|
+
if (path.startsWith(`~/`) || path.startsWith(`~${sep}`)) {
|
|
24
|
+
return join(homeDir, path.slice(2));
|
|
25
|
+
}
|
|
26
|
+
return path;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Resolve to an absolute path. Rejects empty input.
|
|
30
|
+
*/
|
|
31
|
+
export function toAbsolutePath(path, homeDir) {
|
|
32
|
+
const expanded = expandUserPath(path.trim(), homeDir);
|
|
33
|
+
if (!expanded) {
|
|
34
|
+
throw new Error("path must be non-empty");
|
|
35
|
+
}
|
|
36
|
+
return resolve(expanded);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* True when `candidate` is exactly `root` or a path under `root`
|
|
40
|
+
* (after resolve). Does not follow symlinks on the inputs.
|
|
41
|
+
*/
|
|
42
|
+
export function isPathInsideRoot(root, candidate) {
|
|
43
|
+
const r = resolve(root);
|
|
44
|
+
const c = resolve(candidate);
|
|
45
|
+
if (c === r)
|
|
46
|
+
return true;
|
|
47
|
+
const prefix = r.endsWith(sep) ? r : r + sep;
|
|
48
|
+
return c.startsWith(prefix);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Join origin root + relative path with traversal rejection.
|
|
52
|
+
* `relPath` must not be absolute and must stay under root.
|
|
53
|
+
*/
|
|
54
|
+
export function resolveUnderOrigin(originRoot, relPath) {
|
|
55
|
+
const root = resolve(originRoot);
|
|
56
|
+
const cleaned = relPath.replace(/\\/g, "/").replace(/^\/+/, "");
|
|
57
|
+
if (!cleaned || cleaned === ".") {
|
|
58
|
+
throw new Error(`origin-relative path must be non-empty: ${JSON.stringify(relPath)}`);
|
|
59
|
+
}
|
|
60
|
+
if (isAbsolute(relPath) || isAbsolute(cleaned)) {
|
|
61
|
+
throw new Error(`origin-relative path must not be absolute: ${JSON.stringify(relPath)}`);
|
|
62
|
+
}
|
|
63
|
+
const abs = resolve(root, cleaned);
|
|
64
|
+
if (!isPathInsideRoot(root, abs)) {
|
|
65
|
+
throw new Error(`path escapes origin root: ${JSON.stringify(relPath)}`);
|
|
66
|
+
}
|
|
67
|
+
return abs;
|
|
68
|
+
}
|
|
69
|
+
async function pathExists(path) {
|
|
70
|
+
try {
|
|
71
|
+
await lstat(path);
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
// resolveOriginRoot
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
/**
|
|
82
|
+
* Resolve the shared origin root.
|
|
83
|
+
*
|
|
84
|
+
* Precedence (XO-locked):
|
|
85
|
+
* 1. explicit `opts.root`
|
|
86
|
+
* 2. env `MEMEX_ORIGIN`
|
|
87
|
+
* 3. existing `~/.memex`
|
|
88
|
+
* 4. existing `~/.local/share/memex` (XDG / historical grok default)
|
|
89
|
+
* 5. existing `~/.local/share/memex-claude` (legacy live corpus)
|
|
90
|
+
* 6. product default `~/.memex` (may not exist yet)
|
|
91
|
+
*/
|
|
92
|
+
export async function resolveOriginRoot(opts = {}) {
|
|
93
|
+
const home = opts.homeDir ?? homedir();
|
|
94
|
+
const env = opts.env ?? process.env;
|
|
95
|
+
const preferDefault = opts.preferDefaultWhenMissing !== false;
|
|
96
|
+
const defaultRoot = join(home, ".memex");
|
|
97
|
+
const xdgRoot = join(home, ".local", "share", "memex");
|
|
98
|
+
const legacyClaude = join(home, ".local", "share", "memex-claude");
|
|
99
|
+
if (opts.root !== undefined && opts.root.trim() !== "") {
|
|
100
|
+
const root = toAbsolutePath(opts.root, home);
|
|
101
|
+
return { root, source: "explicit", exists: await pathExists(root) };
|
|
102
|
+
}
|
|
103
|
+
const envVal = env[ENV_ORIGIN];
|
|
104
|
+
if (typeof envVal === "string" && envVal.trim() !== "") {
|
|
105
|
+
const root = toAbsolutePath(envVal, home);
|
|
106
|
+
return { root, source: "env", exists: await pathExists(root) };
|
|
107
|
+
}
|
|
108
|
+
if (await pathExists(defaultRoot)) {
|
|
109
|
+
return { root: resolve(defaultRoot), source: "default", exists: true };
|
|
110
|
+
}
|
|
111
|
+
if (await pathExists(xdgRoot)) {
|
|
112
|
+
return { root: resolve(xdgRoot), source: "xdg", exists: true };
|
|
113
|
+
}
|
|
114
|
+
if (await pathExists(legacyClaude)) {
|
|
115
|
+
return { root: resolve(legacyClaude), source: "legacy-claude", exists: true };
|
|
116
|
+
}
|
|
117
|
+
if (preferDefault) {
|
|
118
|
+
return { root: resolve(defaultRoot), source: "default", exists: false };
|
|
119
|
+
}
|
|
120
|
+
return { root: resolve(defaultRoot), source: "default", exists: false };
|
|
121
|
+
}
|
|
122
|
+
/** Product-default origin path for a given home (does not touch the filesystem). */
|
|
123
|
+
export function defaultOriginRoot(homeDir = homedir()) {
|
|
124
|
+
return resolve(join(homeDir, ".memex"));
|
|
125
|
+
}
|
|
126
|
+
/** Legacy claude corpus path (compat / migrate source). */
|
|
127
|
+
export function legacyClaudeOriginRoot(homeDir = homedir()) {
|
|
128
|
+
return resolve(join(homeDir, ".local", "share", "memex-claude"));
|
|
129
|
+
}
|
|
130
|
+
function patternToSuffix(pattern) {
|
|
131
|
+
// v1: only support "*.ext" style → suffix match
|
|
132
|
+
const p = pattern ?? "*.md";
|
|
133
|
+
if (p.startsWith("*"))
|
|
134
|
+
return p.slice(1);
|
|
135
|
+
return p;
|
|
136
|
+
}
|
|
137
|
+
async function listFileEntries(originDir, suffix) {
|
|
138
|
+
let names;
|
|
139
|
+
try {
|
|
140
|
+
names = await readdir(originDir);
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
return [];
|
|
144
|
+
}
|
|
145
|
+
const out = [];
|
|
146
|
+
for (const name of names) {
|
|
147
|
+
if (!name.endsWith(suffix))
|
|
148
|
+
continue;
|
|
149
|
+
const absPath = join(originDir, name);
|
|
150
|
+
try {
|
|
151
|
+
const st = await lstat(absPath);
|
|
152
|
+
// Follow only for type check of the origin entry itself if it's a link? Origin
|
|
153
|
+
// entries should be real files. Accept regular files; skip dirs/symlinks-to-dirs.
|
|
154
|
+
if (st.isFile() || (st.isSymbolicLink() && (await isSymlinkToFile(absPath)))) {
|
|
155
|
+
out.push({ name, absPath: resolve(absPath) });
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// skip
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return out;
|
|
163
|
+
}
|
|
164
|
+
async function isSymlinkToFile(path) {
|
|
165
|
+
try {
|
|
166
|
+
const st = await lstat(await realpath(path));
|
|
167
|
+
return st.isFile();
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
async function listSkillDirEntries(originDir) {
|
|
174
|
+
let names;
|
|
175
|
+
try {
|
|
176
|
+
names = await readdir(originDir);
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
return [];
|
|
180
|
+
}
|
|
181
|
+
const out = [];
|
|
182
|
+
for (const name of names) {
|
|
183
|
+
const skillDir = join(originDir, name);
|
|
184
|
+
const skillMd = join(skillDir, "SKILL.md");
|
|
185
|
+
try {
|
|
186
|
+
const dirStat = await lstat(skillDir);
|
|
187
|
+
if (!dirStat.isDirectory() && !dirStat.isSymbolicLink())
|
|
188
|
+
continue;
|
|
189
|
+
const mdStat = await lstat(skillMd);
|
|
190
|
+
if (!mdStat.isFile() && !mdStat.isSymbolicLink())
|
|
191
|
+
continue;
|
|
192
|
+
out.push({ name, absPath: resolve(skillDir) });
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
// skip
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return out;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Classify existing target path for projection planning.
|
|
202
|
+
* Uses lstat (does not follow the final target symlink for type).
|
|
203
|
+
*/
|
|
204
|
+
async function classifyTarget(targetPath, originPath, originRoot, relinkManaged) {
|
|
205
|
+
let st;
|
|
206
|
+
try {
|
|
207
|
+
st = await lstat(targetPath);
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
return "create";
|
|
211
|
+
}
|
|
212
|
+
if (st.isSymbolicLink()) {
|
|
213
|
+
let linkTarget;
|
|
214
|
+
try {
|
|
215
|
+
linkTarget = await readlink(targetPath);
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
return "broken-unmanaged";
|
|
219
|
+
}
|
|
220
|
+
// Normalize link target to absolute for comparison (v1 uses absolute links).
|
|
221
|
+
const absLink = isAbsolute(linkTarget)
|
|
222
|
+
? resolve(linkTarget)
|
|
223
|
+
: resolve(dirname(targetPath), linkTarget);
|
|
224
|
+
const originAbs = resolve(originPath);
|
|
225
|
+
// Same destination (string or realpath when both exist)
|
|
226
|
+
if (absLink === originAbs)
|
|
227
|
+
return "noop";
|
|
228
|
+
try {
|
|
229
|
+
const [a, b] = await Promise.all([realpath(targetPath), realpath(originPath)]);
|
|
230
|
+
if (a === b)
|
|
231
|
+
return "noop";
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
// broken or missing origin — fall through
|
|
235
|
+
}
|
|
236
|
+
if (isPathInsideRoot(originRoot, absLink)) {
|
|
237
|
+
return relinkManaged ? "relink" : "foreign-symlink";
|
|
238
|
+
}
|
|
239
|
+
// Broken symlink: only relink if the *link text* was under origin
|
|
240
|
+
try {
|
|
241
|
+
await realpath(targetPath);
|
|
242
|
+
// resolved outside origin
|
|
243
|
+
return "foreign-symlink";
|
|
244
|
+
}
|
|
245
|
+
catch {
|
|
246
|
+
if (relinkManaged && isPathInsideRoot(originRoot, absLink)) {
|
|
247
|
+
return "relink";
|
|
248
|
+
}
|
|
249
|
+
return "broken-unmanaged";
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
if (st.isDirectory())
|
|
253
|
+
return "real-dir";
|
|
254
|
+
if (st.isFile())
|
|
255
|
+
return "real-file";
|
|
256
|
+
return "type-mismatch";
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Build a projection plan: which dirs to ensure, which links to create/relink/noop,
|
|
260
|
+
* and which paths conflict (fail-closed — never clobber real files).
|
|
261
|
+
*/
|
|
262
|
+
export async function planProjection(originRoot, targets, opts = {}) {
|
|
263
|
+
const root = resolve(originRoot);
|
|
264
|
+
const relinkManaged = opts.relinkManaged !== false;
|
|
265
|
+
const ensureDirs = new Set();
|
|
266
|
+
const links = [];
|
|
267
|
+
const conflicts = [];
|
|
268
|
+
for (const target of targets) {
|
|
269
|
+
const targetDir = resolve(target.targetDir);
|
|
270
|
+
const originDir = resolveUnderOrigin(root, target.originRelDir);
|
|
271
|
+
const initDir = target.initTargetDir !== false;
|
|
272
|
+
if (initDir)
|
|
273
|
+
ensureDirs.add(targetDir);
|
|
274
|
+
const entries = target.entryKind === "skill-dirs"
|
|
275
|
+
? await listSkillDirEntries(originDir)
|
|
276
|
+
: await listFileEntries(originDir, patternToSuffix(target.pattern));
|
|
277
|
+
for (const entry of entries) {
|
|
278
|
+
const targetPath = join(targetDir, entry.name);
|
|
279
|
+
const originPath = entry.absPath;
|
|
280
|
+
if (!isPathInsideRoot(root, originPath)) {
|
|
281
|
+
conflicts.push({
|
|
282
|
+
targetPath,
|
|
283
|
+
originPath,
|
|
284
|
+
reason: "type-mismatch",
|
|
285
|
+
});
|
|
286
|
+
continue;
|
|
287
|
+
}
|
|
288
|
+
const decision = await classifyTarget(targetPath, originPath, root, relinkManaged);
|
|
289
|
+
if (decision === "create" || decision === "relink" || decision === "noop") {
|
|
290
|
+
links.push({ targetPath, originPath, action: decision });
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
conflicts.push({ targetPath, originPath, reason: decision });
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
return {
|
|
298
|
+
ensureDirs: [...ensureDirs].sort(),
|
|
299
|
+
links,
|
|
300
|
+
conflicts,
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Apply a projection plan with **partial success**: non-conflicting links are
|
|
305
|
+
* applied; conflicts are reported and never applied (XO-locked).
|
|
306
|
+
*
|
|
307
|
+
* Symlinks are **absolute** (v1).
|
|
308
|
+
*/
|
|
309
|
+
export async function applyProjection(plan, _opts = {}) {
|
|
310
|
+
for (const dir of plan.ensureDirs) {
|
|
311
|
+
await mkdir(dir, { recursive: true });
|
|
312
|
+
}
|
|
313
|
+
let linked = 0;
|
|
314
|
+
let skipped = 0;
|
|
315
|
+
for (const link of plan.links) {
|
|
316
|
+
if (link.action === "noop") {
|
|
317
|
+
skipped++;
|
|
318
|
+
continue;
|
|
319
|
+
}
|
|
320
|
+
// Parent of target (may be deeper than ensureDirs for safety)
|
|
321
|
+
await mkdir(dirname(link.targetPath), { recursive: true });
|
|
322
|
+
if (link.action === "relink") {
|
|
323
|
+
await rm(link.targetPath, { force: true });
|
|
324
|
+
}
|
|
325
|
+
// Absolute symlink (v1)
|
|
326
|
+
const originAbs = resolve(link.originPath);
|
|
327
|
+
await symlink(originAbs, link.targetPath);
|
|
328
|
+
linked++;
|
|
329
|
+
}
|
|
330
|
+
return {
|
|
331
|
+
linked,
|
|
332
|
+
skipped,
|
|
333
|
+
conflicts: [...plan.conflicts],
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
// ---------------------------------------------------------------------------
|
|
337
|
+
// materializeEntry
|
|
338
|
+
// ---------------------------------------------------------------------------
|
|
339
|
+
/**
|
|
340
|
+
* Write one corpus entry under origin.root with per-file lock.
|
|
341
|
+
* Does not commit. Rejects path traversal outside origin.
|
|
342
|
+
*/
|
|
343
|
+
export async function materializeEntry(originRoot, input) {
|
|
344
|
+
const absPath = resolveUnderOrigin(originRoot, input.originRelPath);
|
|
345
|
+
// Parent dirs must exist before acquireLock (lock is `${absPath}.lock` via mkdir).
|
|
346
|
+
await mkdir(dirname(absPath), { recursive: true });
|
|
347
|
+
return withFileLock(absPath, async () => {
|
|
348
|
+
let existing = null;
|
|
349
|
+
try {
|
|
350
|
+
const st = await lstat(absPath);
|
|
351
|
+
if (st.isSymbolicLink()) {
|
|
352
|
+
return {
|
|
353
|
+
status: "conflict",
|
|
354
|
+
absPath,
|
|
355
|
+
reason: "destination is a symlink; refuse to materialize through unmanaged link",
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
if (st.isDirectory()) {
|
|
359
|
+
return {
|
|
360
|
+
status: "conflict",
|
|
361
|
+
absPath,
|
|
362
|
+
reason: "destination is a directory",
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
existing = await readFile(absPath, "utf-8");
|
|
366
|
+
}
|
|
367
|
+
catch {
|
|
368
|
+
existing = null;
|
|
369
|
+
}
|
|
370
|
+
if (existing !== null) {
|
|
371
|
+
if (existing === input.content) {
|
|
372
|
+
return { status: "unchanged", absPath };
|
|
373
|
+
}
|
|
374
|
+
if (input.failIfChanged) {
|
|
375
|
+
return {
|
|
376
|
+
status: "conflict",
|
|
377
|
+
absPath,
|
|
378
|
+
reason: "destination exists with different content (failIfChanged)",
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
await writeFile(absPath, input.content, "utf-8");
|
|
382
|
+
return { status: "updated", absPath };
|
|
383
|
+
}
|
|
384
|
+
await writeFile(absPath, input.content, "utf-8");
|
|
385
|
+
return { status: "created", absPath };
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Stage and commit specific origin-relative paths when origin is a git repo.
|
|
390
|
+
* Does not push.
|
|
391
|
+
*/
|
|
392
|
+
export async function commitOriginPaths(originRoot, relPaths, message) {
|
|
393
|
+
const root = resolve(originRoot);
|
|
394
|
+
if (!(await isGitRepo(root)))
|
|
395
|
+
return "not-a-repo";
|
|
396
|
+
try {
|
|
397
|
+
const absPaths = [];
|
|
398
|
+
for (const rel of relPaths) {
|
|
399
|
+
absPaths.push(resolveUnderOrigin(root, rel));
|
|
400
|
+
}
|
|
401
|
+
// git add prefers paths relative to repo root
|
|
402
|
+
for (const abs of absPaths) {
|
|
403
|
+
const rel = relative(root, abs);
|
|
404
|
+
await git(["add", "--", rel], root);
|
|
405
|
+
}
|
|
406
|
+
const { stdout } = await git(["status", "--porcelain"], root);
|
|
407
|
+
if (!stdout.trim())
|
|
408
|
+
return "no-changes";
|
|
409
|
+
await git(["commit", "-m", message], root);
|
|
410
|
+
return "committed";
|
|
411
|
+
}
|
|
412
|
+
catch (err) {
|
|
413
|
+
return `failed: ${err instanceof Error ? err.message : String(err)}`;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Install one-release backward-compat symlink:
|
|
418
|
+
* `~/.local/share/memex-claude` → `~/.memex` (or custom paths).
|
|
419
|
+
*
|
|
420
|
+
* Fail-closed if legacy path is a real file/dir (non-link).
|
|
421
|
+
*/
|
|
422
|
+
export async function installLegacyOriginCompatSymlink(defaultRoot, opts = {}) {
|
|
423
|
+
const home = opts.homeDir ?? homedir();
|
|
424
|
+
const legacy = resolve(opts.legacyPath ?? legacyClaudeOriginRoot(home));
|
|
425
|
+
const dest = resolve(defaultRoot);
|
|
426
|
+
if (!(await pathExists(dest))) {
|
|
427
|
+
return "skipped-missing-default";
|
|
428
|
+
}
|
|
429
|
+
try {
|
|
430
|
+
const st = await lstat(legacy);
|
|
431
|
+
if (st.isSymbolicLink()) {
|
|
432
|
+
const cur = await readlink(legacy);
|
|
433
|
+
const absCur = isAbsolute(cur) ? resolve(cur) : resolve(dirname(legacy), cur);
|
|
434
|
+
if (absCur === dest)
|
|
435
|
+
return "already";
|
|
436
|
+
try {
|
|
437
|
+
if ((await realpath(legacy)) === (await realpath(dest)))
|
|
438
|
+
return "already";
|
|
439
|
+
}
|
|
440
|
+
catch {
|
|
441
|
+
// fall through to conflict if we cannot safely replace
|
|
442
|
+
}
|
|
443
|
+
return "conflict";
|
|
444
|
+
}
|
|
445
|
+
return "conflict";
|
|
446
|
+
}
|
|
447
|
+
catch {
|
|
448
|
+
// missing — create
|
|
449
|
+
}
|
|
450
|
+
await mkdir(dirname(legacy), { recursive: true });
|
|
451
|
+
await symlink(dest, legacy);
|
|
452
|
+
return "created";
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* Move an existing origin tree to the product default (`~/.memex`) and
|
|
456
|
+
* optionally install the one-release legacy compat symlink.
|
|
457
|
+
*/
|
|
458
|
+
export async function migrateOriginToDefault(opts = {}) {
|
|
459
|
+
const home = opts.homeDir ?? homedir();
|
|
460
|
+
const to = defaultOriginRoot(home);
|
|
461
|
+
const from = resolve(opts.from ?? legacyClaudeOriginRoot(home));
|
|
462
|
+
if (from === to) {
|
|
463
|
+
return { status: "already-at-default", root: to };
|
|
464
|
+
}
|
|
465
|
+
if (!(await pathExists(from))) {
|
|
466
|
+
return { status: "source-missing", from };
|
|
467
|
+
}
|
|
468
|
+
if (await pathExists(to)) {
|
|
469
|
+
return { status: "destination-exists", to };
|
|
470
|
+
}
|
|
471
|
+
try {
|
|
472
|
+
await mkdir(dirname(to), { recursive: true });
|
|
473
|
+
await rename(from, to);
|
|
474
|
+
}
|
|
475
|
+
catch (err) {
|
|
476
|
+
return {
|
|
477
|
+
status: "failed",
|
|
478
|
+
reason: err instanceof Error ? err.message : String(err),
|
|
479
|
+
};
|
|
480
|
+
}
|
|
481
|
+
let compat = "skipped-missing-default";
|
|
482
|
+
if (opts.installCompatSymlink !== false) {
|
|
483
|
+
compat = await installLegacyOriginCompatSymlink(to, {
|
|
484
|
+
legacyPath: from,
|
|
485
|
+
homeDir: home,
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
return { status: "migrated", from, to, compat };
|
|
489
|
+
}
|
|
490
|
+
//# sourceMappingURL=origin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"origin.js","sourceRoot":"","sources":["../src/origin.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,KAAK,EACL,KAAK,EACL,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,EAAE,EACF,OAAO,EACP,SAAS,GACV,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAUlD,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,MAAM,UAAU,GAAG,cAAc,CAAC;AAyBlC;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,OAAe;IAC1D,IAAI,IAAI,KAAK,GAAG;QAAE,OAAO,OAAO,CAAC;IACjC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC;QACxD,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,OAAe;IAC1D,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;IACtD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,SAAiB;IAC9D,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC7B,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IAC7C,OAAO,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAkB,EAAE,OAAe;IACpE,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAChE,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,2CAA2C,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,8CAA8C,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC3F,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACnC,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAY;IACpC,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAiC,EAAE;IAEnC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACpC,MAAM,aAAa,GAAG,IAAI,CAAC,wBAAwB,KAAK,KAAK,CAAC;IAE9D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACvD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;IAEnE,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACvD,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;IACtE,CAAC;IAED,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC;IAC/B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACvD,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;IACjE,CAAC;IAED,IAAI,MAAM,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAClC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACzE,CAAC;IACD,IAAI,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACjE,CAAC;IACD,IAAI,MAAM,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAChF,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC1E,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC1E,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,iBAAiB,CAAC,UAAkB,OAAO,EAAE;IAC3D,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,sBAAsB,CAAC,UAAkB,OAAO,EAAE;IAChE,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;AACnE,CAAC;AAWD,SAAS,eAAe,CAAC,OAA2B;IAClD,gDAAgD;IAChD,MAAM,CAAC,GAAG,OAAO,IAAI,MAAM,CAAC;IAC5B,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzC,OAAO,CAAC,CAAC;AACX,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,SAAiB,EACjB,MAAc;IAEd,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,GAAG,GAAwC,EAAE,CAAC;IACpD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,SAAS;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;YAChC,+EAA+E;YAC/E,kFAAkF;YAClF,IAAI,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7E,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,IAAY;IACzC,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7C,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,SAAiB;IAEjB,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,GAAG,GAAwC,EAAE,CAAC;IACpD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC3C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE;gBAAE,SAAS;YAClE,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;gBAAE,SAAS;YAC3D,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,cAAc,CAC3B,UAAkB,EAClB,UAAkB,EAClB,UAAkB,EAClB,aAAsB;IAEtB,IAAI,EAAqC,CAAC;IAC1C,IAAI,CAAC;QACH,EAAE,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC;QACxB,IAAI,UAAkB,CAAC;QACvB,IAAI,CAAC;YACH,UAAU,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,kBAAkB,CAAC;QAC5B,CAAC;QAED,6EAA6E;QAC7E,MAAM,OAAO,GAAG,UAAU,CAAC,UAAU,CAAC;YACpC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;YACrB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC;QAE7C,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QAEtC,wDAAwD;QACxD,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAC/E,IAAI,CAAC,KAAK,CAAC;gBAAE,OAAO,MAAM,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,0CAA0C;QAC5C,CAAC;QAED,IAAI,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC;YAC1C,OAAO,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC;QACtD,CAAC;QAED,kEAAkE;QAClE,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC3B,0BAA0B;YAC1B,OAAO,iBAAiB,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,aAAa,IAAI,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC;gBAC3D,OAAO,QAAQ,CAAC;YAClB,CAAC;YACD,OAAO,kBAAkB,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,IAAI,EAAE,CAAC,WAAW,EAAE;QAAE,OAAO,UAAU,CAAC;IACxC,IAAI,EAAE,CAAC,MAAM,EAAE;QAAE,OAAO,WAAW,CAAC;IACpC,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,UAAkB,EAClB,OAA2B,EAC3B,OAA8B,EAAE;IAEhC,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACjC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,KAAK,KAAK,CAAC;IACnD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,MAAM,KAAK,GAAsB,EAAE,CAAC;IACpC,MAAM,SAAS,GAAsB,EAAE,CAAC;IAExC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;QAChE,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,KAAK,KAAK,CAAC;QAC/C,IAAI,OAAO;YAAE,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAEvC,MAAM,OAAO,GACX,MAAM,CAAC,SAAS,KAAK,YAAY;YAC/B,CAAC,CAAC,MAAM,mBAAmB,CAAC,SAAS,CAAC;YACtC,CAAC,CAAC,MAAM,eAAe,CAAC,SAAS,EAAE,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QAExE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC;YACjC,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC;gBACxC,SAAS,CAAC,IAAI,CAAC;oBACb,UAAU;oBACV,UAAU;oBACV,MAAM,EAAE,eAAe;iBACxB,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;YACnF,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;gBAC1E,KAAK,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC3D,CAAC;iBAAM,CAAC;gBACN,SAAS,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,UAAU,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,EAAE;QAClC,KAAK;QACL,SAAS;KACV,CAAC;AACJ,CAAC;AAaD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAiB,EACjB,QAAgC,EAAE;IAElC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QAClC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC3B,OAAO,EAAE,CAAC;YACV,SAAS;QACX,CAAC;QAED,8DAA8D;QAC9D,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE3D,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC7B,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;QAED,wBAAwB;QACxB,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3C,MAAM,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,EAAE,CAAC;IACX,CAAC;IAED,OAAO;QACL,MAAM;QACN,OAAO;QACP,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;KAC/B,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,UAAkB,EAClB,KAAuB;IAEvB,MAAM,OAAO,GAAG,kBAAkB,CAAC,UAAU,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IAEpE,mFAAmF;IACnF,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEnD,OAAO,YAAY,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;QACtC,IAAI,QAAQ,GAAkB,IAAI,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;YAChC,IAAI,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC;gBACxB,OAAO;oBACL,MAAM,EAAE,UAAU;oBAClB,OAAO;oBACP,MAAM,EAAE,wEAAwE;iBACjF,CAAC;YACJ,CAAC;YACD,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;gBACrB,OAAO;oBACL,MAAM,EAAE,UAAU;oBAClB,OAAO;oBACP,MAAM,EAAE,4BAA4B;iBACrC,CAAC;YACJ,CAAC;YACD,QAAQ,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;QAED,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,IAAI,QAAQ,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;gBAC/B,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;YAC1C,CAAC;YACD,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;gBACxB,OAAO;oBACL,MAAM,EAAE,UAAU;oBAClB,OAAO;oBACP,MAAM,EAAE,2DAA2D;iBACpE,CAAC;YACJ,CAAC;YACD,MAAM,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACjD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;QACxC,CAAC;QAED,MAAM,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC;AAQD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,UAAkB,EAClB,QAAkB,EAClB,OAAe;IAEf,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACjC,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,YAAY,CAAC;IAElD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;QAC/C,CAAC;QACD,8CAA8C;QAC9C,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAChC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QACtC,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,IAAI,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;YAAE,OAAO,YAAY,CAAC;QACxC,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;QAC3C,OAAO,WAAW,CAAC;IACrB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,WAAW,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IACvE,CAAC;AACH,CAAC;AAYD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,WAAmB,EACnB,OAAkD,EAAE;IAEpD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,IAAI,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC;IACxE,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAElC,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAC9B,OAAO,yBAAyB,CAAC;IACnC,CAAC;IAED,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;YACnC,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;YAC9E,IAAI,MAAM,KAAK,IAAI;gBAAE,OAAO,SAAS,CAAC;YACtC,IAAI,CAAC;gBACH,IAAI,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;oBAAE,OAAO,SAAS,CAAC;YAC5E,CAAC;YAAC,MAAM,CAAC;gBACP,uDAAuD;YACzD,CAAC;YACD,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,mBAAmB;IACrB,CAAC;IAED,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,MAAM,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5B,OAAO,SAAS,CAAC;AACnB,CAAC;AASD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,OAA4E,EAAE;IAE9E,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC;IACvC,MAAM,EAAE,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC;IAEhE,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;QAChB,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IACpD,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;IAC5C,CAAC;IACD,IAAI,MAAM,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,EAAE,EAAE,CAAC;IAC9C,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACzD,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,GAA8B,yBAAyB,CAAC;IAClE,IAAI,IAAI,CAAC,oBAAoB,KAAK,KAAK,EAAE,CAAC;QACxC,MAAM,GAAG,MAAM,gCAAgC,CAAC,EAAE,EAAE;YAClD,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;AAClD,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -140,6 +140,102 @@ export type SyncConfig = {
|
|
|
140
140
|
*/
|
|
141
141
|
caseSensitive?: boolean;
|
|
142
142
|
};
|
|
143
|
+
/** Where origin content lives on this host. */
|
|
144
|
+
export type OriginConfig = {
|
|
145
|
+
/** Absolute or `~/…` path. Empty → resolver default chain. */
|
|
146
|
+
root?: string;
|
|
147
|
+
/**
|
|
148
|
+
* Optional git remote for the origin tree (same role as SyncConfig.repo).
|
|
149
|
+
* Empty / omitted → host-local origin only.
|
|
150
|
+
*/
|
|
151
|
+
repo?: string;
|
|
152
|
+
};
|
|
153
|
+
/**
|
|
154
|
+
* One harness projection target. Core is harness-agnostic: it only sees
|
|
155
|
+
* absolute directory paths + which origin subtrees to link.
|
|
156
|
+
*/
|
|
157
|
+
export type ProjectionTarget = {
|
|
158
|
+
/** Stable id for logs/doctor: "grok-user-rules", "claude-user-rules", … */
|
|
159
|
+
id: string;
|
|
160
|
+
/** Absolute harness directory to ensure + project into. */
|
|
161
|
+
targetDir: string;
|
|
162
|
+
/**
|
|
163
|
+
* Origin-relative source directory under origin.root
|
|
164
|
+
* e.g. "rules", "skills", "projects/github.com/jim80net/foo/memory"
|
|
165
|
+
*/
|
|
166
|
+
originRelDir: string;
|
|
167
|
+
/**
|
|
168
|
+
* "files" — each matching file becomes a symlink entry
|
|
169
|
+
* "skill-dirs" — each child dir with SKILL.md is linked as a whole directory
|
|
170
|
+
*/
|
|
171
|
+
entryKind: "files" | "skill-dirs";
|
|
172
|
+
/** Glob/suffix filter; default "*.md" for files, ignored for skill-dirs. */
|
|
173
|
+
pattern?: string;
|
|
174
|
+
/** When true, create targetDir if missing. Default true. */
|
|
175
|
+
initTargetDir?: boolean;
|
|
176
|
+
};
|
|
177
|
+
export type SyncProfile = {
|
|
178
|
+
/** Schema version for migrations. */
|
|
179
|
+
version: 1;
|
|
180
|
+
/** Master switch for profile-driven origin + projection. */
|
|
181
|
+
enabled: boolean;
|
|
182
|
+
origin: OriginConfig;
|
|
183
|
+
/**
|
|
184
|
+
* Projection targets. Empty array = origin-only (materialize/sync git)
|
|
185
|
+
* without symlink management.
|
|
186
|
+
*/
|
|
187
|
+
projections: ProjectionTarget[];
|
|
188
|
+
/**
|
|
189
|
+
* Conflict policy when target has a non-link real file/dir.
|
|
190
|
+
* v1: only "fail-closed" is supported.
|
|
191
|
+
*/
|
|
192
|
+
onClobber: "fail-closed";
|
|
193
|
+
/**
|
|
194
|
+
* When true, replace a symlink that already points inside origin.root
|
|
195
|
+
* if the origin entry moved (relink). Default true.
|
|
196
|
+
*/
|
|
197
|
+
relinkManaged?: boolean;
|
|
198
|
+
/**
|
|
199
|
+
* Bridge to existing SyncConfig git pull/push behavior.
|
|
200
|
+
* If omitted, profile can still project a local-only origin.
|
|
201
|
+
*/
|
|
202
|
+
sync?: Pick<SyncConfig, "autoPull" | "autoCommitPush" | "projectMappings" | "caseSensitive">;
|
|
203
|
+
};
|
|
204
|
+
export type ProjectConflictReason = "real-file" | "real-dir" | "foreign-symlink" | "broken-unmanaged" | "type-mismatch";
|
|
205
|
+
export type ProjectConflict = {
|
|
206
|
+
targetPath: string;
|
|
207
|
+
originPath: string;
|
|
208
|
+
reason: ProjectConflictReason;
|
|
209
|
+
};
|
|
210
|
+
export type ProjectLinkAction = "create" | "relink" | "noop";
|
|
211
|
+
export type ProjectLinkPlan = {
|
|
212
|
+
targetPath: string;
|
|
213
|
+
originPath: string;
|
|
214
|
+
action: ProjectLinkAction;
|
|
215
|
+
};
|
|
216
|
+
export type ProjectPlan = {
|
|
217
|
+
ensureDirs: string[];
|
|
218
|
+
links: ProjectLinkPlan[];
|
|
219
|
+
conflicts: ProjectConflict[];
|
|
220
|
+
};
|
|
221
|
+
export type MaterializeKind = "rule" | "skill" | "memory";
|
|
222
|
+
export type MaterializeInput = {
|
|
223
|
+
kind: MaterializeKind;
|
|
224
|
+
/** Origin-relative destination, e.g. "rules/my-rule.md" or "skills/foo/SKILL.md" */
|
|
225
|
+
originRelPath: string;
|
|
226
|
+
/** Full markdown body including frontmatter (caller-owned format for v1). */
|
|
227
|
+
content: string;
|
|
228
|
+
/** If true, refuse overwrite when destination exists and content differs. */
|
|
229
|
+
failIfChanged?: boolean;
|
|
230
|
+
};
|
|
231
|
+
export type MaterializeResult = {
|
|
232
|
+
status: "created" | "updated" | "unchanged";
|
|
233
|
+
absPath: string;
|
|
234
|
+
} | {
|
|
235
|
+
status: "conflict";
|
|
236
|
+
absPath: string;
|
|
237
|
+
reason: string;
|
|
238
|
+
};
|
|
143
239
|
export type ProjectRegistry = {
|
|
144
240
|
version: 1;
|
|
145
241
|
projects: Record<string, {
|
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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"}
|