@treeseed/dsh-chapters 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +14 -0
- package/README.md +644 -0
- package/cordis.patch.yml +88 -0
- package/docs/architecture.md +460 -0
- package/docs/contract.md +375 -0
- package/docs/development.md +437 -0
- package/docs/host-compaction-seam.md +117 -0
- package/docs/knowledge-repo.md +730 -0
- package/docs/provider.md +98 -0
- package/docs/verify.md +200 -0
- package/lib/archive.d.ts +88 -0
- package/lib/archive.js +114 -0
- package/lib/archive.js.map +1 -0
- package/lib/arrival.d.ts +23 -0
- package/lib/arrival.js +86 -0
- package/lib/arrival.js.map +1 -0
- package/lib/artifact-query.d.ts +53 -0
- package/lib/artifact-query.js +130 -0
- package/lib/artifact-query.js.map +1 -0
- package/lib/client.js +234 -0
- package/lib/client.js.map +1 -0
- package/lib/commands.d.ts +28 -0
- package/lib/commands.js +305 -0
- package/lib/commands.js.map +1 -0
- package/lib/compose.d.ts +30 -0
- package/lib/compose.js +131 -0
- package/lib/compose.js.map +1 -0
- package/lib/continue-core.d.ts +153 -0
- package/lib/continue-core.js +252 -0
- package/lib/continue-core.js.map +1 -0
- package/lib/engine-core.d.ts +219 -0
- package/lib/engine-core.js +405 -0
- package/lib/engine-core.js.map +1 -0
- package/lib/engine.d.ts +211 -0
- package/lib/engine.js +571 -0
- package/lib/engine.js.map +1 -0
- package/lib/enrich-queue.d.ts +66 -0
- package/lib/enrich-queue.js +100 -0
- package/lib/enrich-queue.js.map +1 -0
- package/lib/enrich-store.d.ts +31 -0
- package/lib/enrich-store.js +103 -0
- package/lib/enrich-store.js.map +1 -0
- package/lib/enrich-wire.d.ts +73 -0
- package/lib/enrich-wire.js +209 -0
- package/lib/enrich-wire.js.map +1 -0
- package/lib/enrich.d.ts +73 -0
- package/lib/enrich.js +150 -0
- package/lib/enrich.js.map +1 -0
- package/lib/gitops.d.ts +107 -0
- package/lib/gitops.js +539 -0
- package/lib/gitops.js.map +1 -0
- package/lib/index.d.ts +81 -0
- package/lib/index.js +305 -0
- package/lib/index.js.map +1 -0
- package/lib/indexing.d.ts +85 -0
- package/lib/indexing.js +212 -0
- package/lib/indexing.js.map +1 -0
- package/lib/injections.d.ts +66 -0
- package/lib/injections.js +83 -0
- package/lib/injections.js.map +1 -0
- package/lib/notice.d.ts +60 -0
- package/lib/notice.js +84 -0
- package/lib/notice.js.map +1 -0
- package/lib/provider.d.ts +44 -0
- package/lib/provider.js +66 -0
- package/lib/provider.js.map +1 -0
- package/lib/redact.d.ts +24 -0
- package/lib/redact.js +85 -0
- package/lib/redact.js.map +1 -0
- package/lib/registry.d.ts +120 -0
- package/lib/registry.js +130 -0
- package/lib/registry.js.map +1 -0
- package/lib/render.d.ts +40 -0
- package/lib/render.js +280 -0
- package/lib/render.js.map +1 -0
- package/lib/repo.d.ts +78 -0
- package/lib/repo.js +184 -0
- package/lib/repo.js.map +1 -0
- package/lib/rules-commands.d.ts +24 -0
- package/lib/rules-commands.js +138 -0
- package/lib/rules-commands.js.map +1 -0
- package/lib/rules.d.ts +90 -0
- package/lib/rules.js +185 -0
- package/lib/rules.js.map +1 -0
- package/lib/search.d.ts +48 -0
- package/lib/search.js +152 -0
- package/lib/search.js.map +1 -0
- package/lib/signature.d.ts +28 -0
- package/lib/signature.js +149 -0
- package/lib/signature.js.map +1 -0
- package/lib/store.d.ts +130 -0
- package/lib/store.js +235 -0
- package/lib/store.js.map +1 -0
- package/lib/sync.d.ts +183 -0
- package/lib/sync.js +719 -0
- package/lib/sync.js.map +1 -0
- package/lib/tools.d.ts +84 -0
- package/lib/tools.js +581 -0
- package/lib/tools.js.map +1 -0
- package/lib/treedx/client.d.ts +57 -0
- package/lib/treedx/client.js +82 -0
- package/lib/treedx/client.js.map +1 -0
- package/lib/treedx/provider.d.ts +39 -0
- package/lib/treedx/provider.js +479 -0
- package/lib/treedx/provider.js.map +1 -0
- package/lib/treedx/state.d.ts +27 -0
- package/lib/treedx/state.js +65 -0
- package/lib/treedx/state.js.map +1 -0
- package/lib/types.d.ts +100 -0
- package/lib/types.js +19 -0
- package/lib/types.js.map +1 -0
- package/lib/vocabulary.d.ts +41 -0
- package/lib/vocabulary.js +118 -0
- package/lib/vocabulary.js.map +1 -0
- package/package.json +132 -0
- package/presets/chapters/agent.cordis.yml +272 -0
- package/presets/chapters/preset.yml +3 -0
- package/presets/probe-roots/agent.cordis.yml +11 -0
- package/presets/probe-roots/preset.yml +3 -0
package/lib/gitops.js
ADDED
|
@@ -0,0 +1,539 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git operations over isomorphic-git (knowledge-repo.md §3.2): pure-JS, no
|
|
3
|
+
* git binary, no native deps. Every operation takes explicit dir/remote —
|
|
4
|
+
* no global state — and every failure comes back as `{ok, detail}` because
|
|
5
|
+
* the sync layer is best-effort by rule: a remote failure must never break
|
|
6
|
+
* the conversation path (record §5.3).
|
|
7
|
+
*
|
|
8
|
+
* Fast-forward ONLY (§3.3): append-only content means divergence is separate
|
|
9
|
+
* files and ff always succeeds; a non-ff state is an error, never a force.
|
|
10
|
+
* The local repo is the mirror (transport, not storage, §3.1) — the
|
|
11
|
+
* workspace store stays the read path's source of truth.
|
|
12
|
+
*
|
|
13
|
+
* API notes (isomorphic-git 1.42, verified against the installed types):
|
|
14
|
+
* `http` is a client object with a `request` fn (node default from
|
|
15
|
+
* `isomorphic-git/http/node`); the remote `url` is a SEPARATE argument;
|
|
16
|
+
* auth rides `onAuth`; statusMatrix rows are
|
|
17
|
+
* `[filepath, head, workdir, stage]` of numeric literals.
|
|
18
|
+
*/
|
|
19
|
+
import * as git from 'isomorphic-git';
|
|
20
|
+
import { randomUUID } from 'node:crypto';
|
|
21
|
+
import nodeHttp from 'isomorphic-git/http/node';
|
|
22
|
+
import * as fs from 'node:fs';
|
|
23
|
+
import * as nodefs from 'node:fs/promises';
|
|
24
|
+
import os from 'node:os';
|
|
25
|
+
import path from 'node:path';
|
|
26
|
+
const authOf = (r) => r.token !== undefined ? () => ({ username: 'dsh-chapters', password: r.token }) : undefined;
|
|
27
|
+
/**
|
|
28
|
+
* Classify an isomorphic-git transport error. A rejected credential (HTTP
|
|
29
|
+
* 401/403, or the auth-phrase fallback) MUST come back as `auth`, not the
|
|
30
|
+
* generic `network` the catch blocks used to assume — otherwise /chapters-status
|
|
31
|
+
* tells the user "remote unreachable" when the truth is "your token is bad,
|
|
32
|
+
* re-link it". 404/401-on-repo maps to not_found (private-but-missing vs
|
|
33
|
+
* forbidden are genuinely ambiguous over smart HTTP; auth wins when a token
|
|
34
|
+
* was actually sent).
|
|
35
|
+
*/
|
|
36
|
+
export function classifyGitTransportError(error) {
|
|
37
|
+
const e = error;
|
|
38
|
+
const status = e?.statusCode ?? e?.status ?? e?.data?.statusCode;
|
|
39
|
+
const msg = String(e?.message ?? error);
|
|
40
|
+
if (status === 404 || /HTTP Error: 404|repository not found/i.test(msg))
|
|
41
|
+
return { code: 'not_found', detail: msg };
|
|
42
|
+
if (status === 401 || status === 403 || /HTTP Error: 40[13]|authentication|could not read Username|invalid credentials|Unauthorized|Forbidden|access denied|Permission denied/i.test(msg)) {
|
|
43
|
+
return { code: 'auth', detail: msg };
|
|
44
|
+
}
|
|
45
|
+
return { code: 'network', detail: msg };
|
|
46
|
+
}
|
|
47
|
+
const headOf = (dir) => path.join(dir, '.git', 'HEAD');
|
|
48
|
+
const isRepo = async (dir) => {
|
|
49
|
+
try {
|
|
50
|
+
await nodefs.access(headOf(dir));
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Ensure a clone exists at `dir` for `remote`. A non-repo dir is cloned
|
|
59
|
+
* (single branch, main); an existing repo is left alone — pull/ff is the
|
|
60
|
+
* caller's step. A non-empty non-repo dir is dead transport: moved aside
|
|
61
|
+
* (`<dir>.stale-<ts>`, contents preserved) and cloned fresh. The r39-era e2e
|
|
62
|
+
* failure class was exactly this residue making every later clone refuse;
|
|
63
|
+
* renaming aside is strictly weaker than what the diverged-rebuild path
|
|
64
|
+
* already does (removeMirror rm -rf) — the mirror is transport, the store
|
|
65
|
+
* is truth (§3.1).
|
|
66
|
+
*/
|
|
67
|
+
export async function ensureClone(dir, remote, opts = {}) {
|
|
68
|
+
try {
|
|
69
|
+
if (await isRepo(dir)) {
|
|
70
|
+
const remotes = await git.listRemotes({ fs, dir }).catch(() => []);
|
|
71
|
+
const origin = remotes.find((r) => r.remote === 'origin');
|
|
72
|
+
if (origin !== undefined && origin.url !== remote.url) {
|
|
73
|
+
return { ok: false, code: 'origin-mismatch', detail: `mirror origin is ${origin.url}, the project's remote is ${remote.url}` };
|
|
74
|
+
}
|
|
75
|
+
if (origin === undefined && remote.url !== '')
|
|
76
|
+
await git.addRemote({ fs, dir, remote: 'origin', url: remote.url, force: true }).catch(() => undefined);
|
|
77
|
+
return { ok: true, detail: 'already a repo' };
|
|
78
|
+
}
|
|
79
|
+
const entries = await nodefs.readdir(dir).catch(() => []);
|
|
80
|
+
let movedAside = '';
|
|
81
|
+
if (entries.length > 0) {
|
|
82
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
83
|
+
movedAside = `${path.basename(dir)}.stale-${stamp}`;
|
|
84
|
+
await nodefs.rename(dir, `${dir}.stale-${stamp}`);
|
|
85
|
+
await nodefs.mkdir(path.dirname(dir), { recursive: true });
|
|
86
|
+
}
|
|
87
|
+
await git.clone({ fs, http: nodeHttp, dir, url: remote.url, singleBranch: true, onAuth: authOf(remote) });
|
|
88
|
+
// Cloning an EMPTY remote leaves the clone on isomorphic-git's fallback
|
|
89
|
+
// branch ('master') — real finding from the first real-HTTP sync test.
|
|
90
|
+
// Align HEAD to the expected branch while it is still unborn (no commit
|
|
91
|
+
// to move); a born branch stays untouched.
|
|
92
|
+
const branch = opts.defaultBranch ?? 'main';
|
|
93
|
+
const current = await git.currentBranch({ fs, dir, fullname: false });
|
|
94
|
+
if (current !== branch && (await git.resolveRef({ fs, dir, ref: 'HEAD' }).catch(() => null)) === null) {
|
|
95
|
+
await nodefs.writeFile(headOf(dir), `ref: refs/heads/${branch}\n`);
|
|
96
|
+
}
|
|
97
|
+
return { ok: true, detail: 'cloned', changed: true };
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
const cls = classifyGitTransportError(error);
|
|
101
|
+
return { ok: false, code: cls.code, detail: `clone: ${cls.detail}` };
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Commit every workdir file whose content differs from HEAD. Does not trust
|
|
106
|
+
* `statusMatrix` — on isomorphic-git 1.42 it reports stale index state right
|
|
107
|
+
* after a commit (verified: a clean repo still reports [1,1,1]); the
|
|
108
|
+
* workdir-vs-HEAD content comparison is the honest diff. Untracked dotfiles
|
|
109
|
+
* and .git are out of scope (the mirror holds knowledge files only).
|
|
110
|
+
*/
|
|
111
|
+
export async function stageAllAndCommit(dir, message, author) {
|
|
112
|
+
try {
|
|
113
|
+
const headFiles = await git.listFiles({ fs, dir, ref: 'HEAD' }).catch(() => []);
|
|
114
|
+
const headOid = await git.resolveRef({ fs, dir, ref: 'HEAD' }).catch(() => null);
|
|
115
|
+
const head = new Map();
|
|
116
|
+
for (const f of headFiles) {
|
|
117
|
+
// HEAD's OWN content — reading the workdir here (as an earlier cut did)
|
|
118
|
+
// compares the disk against itself, so modifications to TRACKED files
|
|
119
|
+
// are permanently invisible to the commit: P2 enrichment writes would
|
|
120
|
+
// never travel. Measured by the two-machine enrichment test (r37).
|
|
121
|
+
let text = null;
|
|
122
|
+
if (headOid !== null) {
|
|
123
|
+
const r = await git.readBlob({ fs, dir, oid: headOid, filepath: f }).catch(() => null);
|
|
124
|
+
if (r !== null)
|
|
125
|
+
text = Buffer.from(r.blob).toString('utf8');
|
|
126
|
+
}
|
|
127
|
+
head.set(f, text);
|
|
128
|
+
}
|
|
129
|
+
const changed = [];
|
|
130
|
+
const walk = (rel) => {
|
|
131
|
+
for (const e of fs.readdirSync(path.join(dir, rel), { withFileTypes: true })) {
|
|
132
|
+
if (e.name === '.git' || e.name.startsWith('.'))
|
|
133
|
+
continue;
|
|
134
|
+
const relPath = rel === '' ? e.name : path.join(rel, e.name);
|
|
135
|
+
if (e.isDirectory())
|
|
136
|
+
walk(relPath);
|
|
137
|
+
else {
|
|
138
|
+
const content = fs.readFileSync(path.join(dir, relPath), 'utf8');
|
|
139
|
+
const prev = head.get(relPath) ?? null;
|
|
140
|
+
if (prev === null || prev !== content)
|
|
141
|
+
changed.push(relPath);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
walk('');
|
|
146
|
+
if (changed.length === 0)
|
|
147
|
+
return { ok: true, detail: 'nothing to commit' };
|
|
148
|
+
for (const f of changed) {
|
|
149
|
+
await git.add({ fs, dir, filepath: f });
|
|
150
|
+
}
|
|
151
|
+
await git.commit({ fs, dir, message, author, committer: author });
|
|
152
|
+
return { ok: true, detail: `committed ${changed.length} path(s)`, changed: true };
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
return { ok: false, detail: `commit: ${String(error?.message ?? error)}` };
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/** The branch HEAD points at (falls back to the expected default). */
|
|
159
|
+
async function branchOf(dir, fallback) {
|
|
160
|
+
return (await git.currentBranch({ fs, dir, fullname: false })) || fallback;
|
|
161
|
+
}
|
|
162
|
+
/** Fetch the remote and fast-forward the local branch. ff-only, always. */
|
|
163
|
+
export async function pullFastForward(dir, remote, opts = {}) {
|
|
164
|
+
const branch = await branchOf(dir, opts.defaultBranch ?? 'main');
|
|
165
|
+
const ref = `refs/heads/${branch}`;
|
|
166
|
+
try {
|
|
167
|
+
await git.fetch({ fs, http: nodeHttp, dir, url: remote.url, singleBranch: true, onAuth: authOf(remote) });
|
|
168
|
+
const remoteRef = await git.resolveRef({ fs, dir, ref: `refs/remotes/origin/${branch}` }).catch(() => null);
|
|
169
|
+
const localRef = await git.resolveRef({ fs, dir, ref }).catch(() => null);
|
|
170
|
+
if (remoteRef === null || localRef === null || remoteRef === localRef) {
|
|
171
|
+
return { ok: true, detail: 'up to date (nothing to fast-forward)' };
|
|
172
|
+
}
|
|
173
|
+
// ff-only guard, all three cases (the direction here was inverted once —
|
|
174
|
+
// isDescendent({oid, ancestor}) asks whether OID's history CONTAINS
|
|
175
|
+
// ancestor): remote ahead ⇒ fast-forward; local ahead ⇒ nothing to do
|
|
176
|
+
// (push will ship it); neither contains the other ⇒ genuine divergence.
|
|
177
|
+
const remoteAhead = await git.isDescendent({ fs, dir, oid: remoteRef, ancestor: localRef });
|
|
178
|
+
if (!remoteAhead) {
|
|
179
|
+
const localAhead = await git.isDescendent({ fs, dir, oid: localRef, ancestor: remoteRef });
|
|
180
|
+
if (localAhead)
|
|
181
|
+
return { ok: true, detail: 'nothing to fast-forward (local ahead; push will ship it)' };
|
|
182
|
+
return { ok: false, code: 'diverged', detail: 'diverged — fast-forward impossible (the mirror diverged from the remote; rebuild will recover)' };
|
|
183
|
+
}
|
|
184
|
+
await git.fastForward({ fs, http: nodeHttp, dir, url: remote.url, ref, onAuth: authOf(remote) });
|
|
185
|
+
return { ok: true, detail: 'fast-forwarded', changed: true };
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
const cls = classifyGitTransportError(error);
|
|
189
|
+
return { ok: false, code: cls.code, detail: `pull failed: ${cls.detail}` };
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// ------------------------------------------------------------- local-path upstreams
|
|
193
|
+
// A local-path upstream ('/srv/git/kb.git', '~/pools/kb.git', './kb.git') is a
|
|
194
|
+
// bare directory the user owns — no HTTP, no git binary, no credentials
|
|
195
|
+
// needed (record §2.1's loopback-of-the-filesystem). Transfer is isomorphic-
|
|
196
|
+
// git's OWN pack layer: packObjects (full closure of a commit set) into a
|
|
197
|
+
// temp file, indexPack into the target. ff-only rules identical to the HTTP
|
|
198
|
+
// path: push checks the remote head is an ancestor of ours before moving it.
|
|
199
|
+
export const isLocalUpstreamUrl = (url) => /^(?:file:\/\/\/|[/~]|\.\.{0,1}\/|[a-zA-Z]:\\)/.test(url) && !/^https?:\/\//.test(url);
|
|
200
|
+
/** file:///a/b -> /a/b ; ~ -> homedir ; relative resolved against `cwd`. */
|
|
201
|
+
export function resolveLocalUpstreamPath(url, cwd) {
|
|
202
|
+
let p = url.startsWith('file:///') ? decodeURIComponent(url.slice('file://'.length)) : url;
|
|
203
|
+
if (p === '~' || p.startsWith('~/'))
|
|
204
|
+
p = path.join(os.homedir(), p.slice(1));
|
|
205
|
+
if (!path.isAbsolute(p))
|
|
206
|
+
p = path.join(cwd, p);
|
|
207
|
+
return path.normalize(p);
|
|
208
|
+
}
|
|
209
|
+
/** The gitdir of a repo that may be bare (gitdir = the dir itself) or a
|
|
210
|
+
* working tree (gitdir = dir/.git); null when neither. */
|
|
211
|
+
function gitdirOf(repoDir) {
|
|
212
|
+
if (fs.existsSync(path.join(repoDir, 'HEAD')) && fs.existsSync(path.join(repoDir, 'objects')))
|
|
213
|
+
return repoDir;
|
|
214
|
+
if (fs.existsSync(path.join(repoDir, '.git', 'HEAD')))
|
|
215
|
+
return path.join(repoDir, '.git');
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
/** All objects reachable from the given commits (commit chain + trees +
|
|
219
|
+
* blobs). packObjects packs EXACTLY what it is given — the closure is ours
|
|
220
|
+
* to compute (measured the hard way: 'Could not find <oid>' on checkout). */
|
|
221
|
+
async function closureOids(fromDir, fromGit, commits) {
|
|
222
|
+
const oids = new Set();
|
|
223
|
+
for (const c of commits) {
|
|
224
|
+
const history = await git.log({ fs, dir: fromDir, gitdir: fromGit, ref: c });
|
|
225
|
+
for (const entry of history)
|
|
226
|
+
oids.add(entry.oid);
|
|
227
|
+
}
|
|
228
|
+
for (const co of [...oids]) {
|
|
229
|
+
const { object: commit } = (await git.readObject({ fs, dir: fromDir, gitdir: fromGit, oid: co }));
|
|
230
|
+
const stack = [commit.tree];
|
|
231
|
+
while (stack.length > 0) {
|
|
232
|
+
const t = stack.pop();
|
|
233
|
+
if (oids.has(t))
|
|
234
|
+
continue;
|
|
235
|
+
oids.add(t);
|
|
236
|
+
// measured in this isomorphic build: a tree readObject's `object` IS
|
|
237
|
+
// the entries array (keys '0','1',…), not an { entries } wrapper.
|
|
238
|
+
const { object: treeEntries } = (await git.readObject({ fs, dir: fromDir, gitdir: fromGit, oid: t }));
|
|
239
|
+
for (const e of treeEntries) {
|
|
240
|
+
if (e.type === 'tree')
|
|
241
|
+
stack.push(e.oid);
|
|
242
|
+
else
|
|
243
|
+
oids.add(e.oid);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return [...oids];
|
|
248
|
+
}
|
|
249
|
+
async function transferCommits(fromDir, toDir, commits) {
|
|
250
|
+
try {
|
|
251
|
+
const fromGit = gitdirOf(fromDir);
|
|
252
|
+
const toGit = gitdirOf(toDir);
|
|
253
|
+
if (fromGit === null)
|
|
254
|
+
return { ok: false, detail: `transfer source ${fromDir} is not a git repo` };
|
|
255
|
+
if (toGit === null)
|
|
256
|
+
return { ok: false, detail: `transfer target ${toDir} is not a git repo` };
|
|
257
|
+
const oids = await closureOids(fromDir, fromGit, commits);
|
|
258
|
+
const packed = await git.packObjects({ fs, dir: fromDir, gitdir: fromGit, oids, write: false });
|
|
259
|
+
if (packed.packfile === undefined)
|
|
260
|
+
return { ok: false, detail: 'packObjects returned no packfile' };
|
|
261
|
+
// indexPack resolves filepath RELATIVE TO dir and expects the pack where
|
|
262
|
+
// pushes put packs: inside the object store. So the incoming pack is
|
|
263
|
+
// written to <gitdir>/objects/pack/ first — where it then legitimately
|
|
264
|
+
// lives (this is literally how a git receive-pack lands objects).
|
|
265
|
+
const inTree = toGit !== toDir;
|
|
266
|
+
const relPack = path.posix.join(...(inTree ? ['.git', 'objects', 'pack'] : ['objects', 'pack']), `dsh-xfer-${randomUUID().slice(0, 8)}.pack`);
|
|
267
|
+
const absPack = path.join(toDir, ...(inTree ? ['.git', 'objects', 'pack'] : ['objects', 'pack']));
|
|
268
|
+
await nodefs.mkdir(absPack, { recursive: true });
|
|
269
|
+
const packFile = path.join(absPack, path.posix.basename(relPack));
|
|
270
|
+
await nodefs.writeFile(packFile, packed.packfile);
|
|
271
|
+
await git.indexPack({ fs, dir: toDir, gitdir: toGit, filepath: relPack });
|
|
272
|
+
return { ok: true, detail: `transferred ${commits.length} commit(s), ${oids.length} objects` };
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
return { ok: false, detail: `transfer: ${String(error?.message ?? error)}` };
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
async function localHeadOf(repoDir, branch) {
|
|
279
|
+
const g = gitdirOf(repoDir);
|
|
280
|
+
if (g === null)
|
|
281
|
+
return null;
|
|
282
|
+
return await git.resolveRef({ fs, dir: repoDir, gitdir: g, ref: `refs/heads/${branch}` }).catch(() => null);
|
|
283
|
+
}
|
|
284
|
+
/** Materialize the mirror's workdir from its committed state (the local
|
|
285
|
+
* transport moves refs and transfers objects; HTTP clones materialize — keep
|
|
286
|
+
* the two transports behaving identically for the copy-out/search layers). */
|
|
287
|
+
async function checkoutMirror(mirrorDir, branch) {
|
|
288
|
+
// NOT caught: a mirror that failed to materialize must fail the pass
|
|
289
|
+
// loudly (the silent swallow here hid the closure bug for one whole round).
|
|
290
|
+
await git.checkout({ fs, dir: mirrorDir, ref: branch, force: true });
|
|
291
|
+
}
|
|
292
|
+
/** Create the upstream (bare, empty) when it does not exist — 'link a path'
|
|
293
|
+
* materializes the pool dir; never clobbers an existing repo. */
|
|
294
|
+
async function ensureUpstreamDir(upstream, branch) {
|
|
295
|
+
if (gitdirOf(upstream) !== null)
|
|
296
|
+
return { ok: true, detail: 'upstream exists' };
|
|
297
|
+
if (fs.existsSync(upstream) && fs.readdirSync(upstream).length > 0) {
|
|
298
|
+
return { ok: false, detail: `upstream path ${upstream} exists but is not a git repo` };
|
|
299
|
+
}
|
|
300
|
+
try {
|
|
301
|
+
await nodefs.mkdir(upstream, { recursive: true });
|
|
302
|
+
await git.init({ fs, dir: upstream, gitdir: upstream, bare: true, defaultBranch: branch });
|
|
303
|
+
return { ok: true, detail: 'upstream created (bare)', changed: true };
|
|
304
|
+
}
|
|
305
|
+
catch (error) {
|
|
306
|
+
return { ok: false, detail: `upstream init: ${String(error?.message ?? error)}` };
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
/** local-upstream ops take a url that is a resolved absolute path (sync.ts
|
|
310
|
+
* resolves before calling; the driver dispatches on the shape). */
|
|
311
|
+
export async function ensureCloneLocal(mirrorDir, upstreamPath, opts = {}) {
|
|
312
|
+
const branch = opts.defaultBranch ?? 'main';
|
|
313
|
+
try {
|
|
314
|
+
const up = await ensureUpstreamDir(upstreamPath, branch);
|
|
315
|
+
if (!up.ok)
|
|
316
|
+
return up;
|
|
317
|
+
if (await isRepo(mirrorDir))
|
|
318
|
+
return { ok: true, detail: 'already a repo' };
|
|
319
|
+
const entries = await nodefs.readdir(mirrorDir).catch(() => []);
|
|
320
|
+
if (entries.length > 0)
|
|
321
|
+
return { ok: false, detail: `clone target ${mirrorDir} exists and is not empty and not a git repo` };
|
|
322
|
+
await nodefs.mkdir(mirrorDir, { recursive: true });
|
|
323
|
+
await git.init({ fs, dir: mirrorDir, defaultBranch: branch });
|
|
324
|
+
const t = await localHeadOf(upstreamPath, branch);
|
|
325
|
+
if (t !== null) {
|
|
326
|
+
const tr = await transferCommits(upstreamPath, mirrorDir, [t]);
|
|
327
|
+
if (!tr.ok)
|
|
328
|
+
return tr;
|
|
329
|
+
const g = gitdirOf(mirrorDir) ?? path.join(mirrorDir, '.git');
|
|
330
|
+
await git.writeRef({ fs, dir: mirrorDir, gitdir: g, ref: `refs/heads/${branch}`, value: t, force: true });
|
|
331
|
+
await git.writeRef({ fs, dir: mirrorDir, gitdir: g, ref: `refs/remotes/origin/${branch}`, value: t, force: true });
|
|
332
|
+
await checkoutMirror(mirrorDir, branch);
|
|
333
|
+
return { ok: true, detail: 'cloned (local upstream)', changed: true };
|
|
334
|
+
}
|
|
335
|
+
return { ok: true, detail: `mirror initialized against ${up.ok === true ? 'new empty' : 'empty'} local upstream`, changed: true };
|
|
336
|
+
}
|
|
337
|
+
catch (error) {
|
|
338
|
+
return { ok: false, code: 'network', detail: `clone(local): ${String(error?.message ?? error)}` };
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
export async function pullLocal(mirrorDir, upstreamPath, opts = {}) {
|
|
342
|
+
const branch = opts.defaultBranch ?? 'main';
|
|
343
|
+
try {
|
|
344
|
+
const t = await localHeadOf(upstreamPath, branch);
|
|
345
|
+
if (t === null)
|
|
346
|
+
return { ok: true, detail: 'up-to-date (upstream has no branch yet)' };
|
|
347
|
+
const s = await localHeadOf(mirrorDir, branch);
|
|
348
|
+
const g = gitdirOf(mirrorDir);
|
|
349
|
+
if (g === null)
|
|
350
|
+
return { ok: false, detail: 'mirror is not a git repo' };
|
|
351
|
+
if (s === t)
|
|
352
|
+
return { ok: true, detail: 'up to date (nothing to fast-forward)' };
|
|
353
|
+
const tr = await transferCommits(upstreamPath, mirrorDir, [t]);
|
|
354
|
+
if (!tr.ok)
|
|
355
|
+
return tr;
|
|
356
|
+
if (s !== null) {
|
|
357
|
+
const remoteAhead = await git.isDescendent({ fs, dir: mirrorDir, gitdir: g, oid: t, ancestor: s });
|
|
358
|
+
if (!remoteAhead) {
|
|
359
|
+
const localAhead = await git.isDescendent({ fs, dir: mirrorDir, gitdir: g, oid: s, ancestor: t });
|
|
360
|
+
if (localAhead)
|
|
361
|
+
return { ok: true, detail: 'nothing to fast-forward (local ahead; push will ship it)' };
|
|
362
|
+
return { ok: false, code: 'diverged', detail: 'diverged — fast-forward impossible (local upstream)' };
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
await git.writeRef({ fs, dir: mirrorDir, gitdir: g, ref: `refs/heads/${branch}`, value: t, force: true });
|
|
366
|
+
await git.writeRef({ fs, dir: mirrorDir, gitdir: g, ref: `refs/remotes/origin/${branch}`, value: t, force: true });
|
|
367
|
+
await checkoutMirror(mirrorDir, branch);
|
|
368
|
+
return { ok: true, detail: 'fast-forwarded (local)', changed: true };
|
|
369
|
+
}
|
|
370
|
+
catch (error) {
|
|
371
|
+
return { ok: false, code: 'network', detail: `pull(local): ${String(error?.message ?? error)}` };
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
export async function pushLocal(mirrorDir, upstreamPath, opts = {}) {
|
|
375
|
+
const branch = opts.defaultBranch ?? 'main';
|
|
376
|
+
try {
|
|
377
|
+
const s = await localHeadOf(mirrorDir, branch);
|
|
378
|
+
if (s === null)
|
|
379
|
+
return { ok: true, detail: 'pushed (nothing new)' };
|
|
380
|
+
const up = await ensureUpstreamDir(upstreamPath, branch);
|
|
381
|
+
if (!up.ok)
|
|
382
|
+
return { ok: false, code: 'network', detail: up.detail };
|
|
383
|
+
const t = await localHeadOf(upstreamPath, branch);
|
|
384
|
+
const ug = gitdirOf(upstreamPath);
|
|
385
|
+
if (ug === null)
|
|
386
|
+
return { ok: false, detail: 'upstream lost its gitdir' };
|
|
387
|
+
if (s === t)
|
|
388
|
+
return { ok: true, detail: 'pushed (up to date)' };
|
|
389
|
+
const tr = await transferCommits(mirrorDir, upstreamPath, [s]);
|
|
390
|
+
if (!tr.ok)
|
|
391
|
+
return tr;
|
|
392
|
+
if (t !== null) {
|
|
393
|
+
const canFf = await git.isDescendent({ fs, dir: upstreamPath, gitdir: ug, oid: s, ancestor: t });
|
|
394
|
+
if (!canFf)
|
|
395
|
+
return { ok: false, code: 'diverged', detail: 'push rejected — upstream diverged (local)' };
|
|
396
|
+
}
|
|
397
|
+
await git.writeRef({ fs, dir: upstreamPath, gitdir: ug, ref: `refs/heads/${branch}`, value: s, force: true });
|
|
398
|
+
const g = gitdirOf(mirrorDir);
|
|
399
|
+
if (g !== null)
|
|
400
|
+
await git.writeRef({ fs, dir: mirrorDir, gitdir: g, ref: `refs/remotes/origin/${branch}`, value: s, force: true }).catch(() => undefined);
|
|
401
|
+
return { ok: true, detail: 'pushed (local)', changed: true };
|
|
402
|
+
}
|
|
403
|
+
catch (error) {
|
|
404
|
+
return { ok: false, code: 'network', detail: `push(local): ${String(error?.message ?? error)}` };
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
/** Mirror provenance: which upstream this mirror was last bound to (http OR
|
|
408
|
+
* local) — an origin change is detected on EVERY ensureClone, local or not. */
|
|
409
|
+
export const originSentinel = (mirrorDir) => path.join(mirrorDir, '.git', 'DSH-ORIGIN');
|
|
410
|
+
export async function recordOrigin(mirrorDir, url) {
|
|
411
|
+
await nodefs.mkdir(path.join(mirrorDir, '.git'), { recursive: true });
|
|
412
|
+
await nodefs.writeFile(originSentinel(mirrorDir), url);
|
|
413
|
+
}
|
|
414
|
+
export function readOrigin(mirrorDir) {
|
|
415
|
+
try {
|
|
416
|
+
return fs.readFileSync(originSentinel(mirrorDir), 'utf8').trim();
|
|
417
|
+
}
|
|
418
|
+
catch {
|
|
419
|
+
return null;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* Initialize a local-only mirror (offline mode, record §5.3): the remote is
|
|
424
|
+
* unreachable, but the mirror is transport over truth we own — publish,
|
|
425
|
+
* index, commit, and search keep working; push waits for the remote.
|
|
426
|
+
*/
|
|
427
|
+
export async function initLocal(dir, remote, opts = {}) {
|
|
428
|
+
try {
|
|
429
|
+
if (await isRepo(dir)) {
|
|
430
|
+
// even an existing repo needs its origin (offline mirrors init before
|
|
431
|
+
// the remote is reachable; recovery must be able to fetch)
|
|
432
|
+
if (remote !== undefined)
|
|
433
|
+
await git.addRemote({ fs, dir, remote: 'origin', url: remote.url, force: true }).catch(() => undefined);
|
|
434
|
+
return { ok: true, detail: 'already a repo' };
|
|
435
|
+
}
|
|
436
|
+
await nodefs.mkdir(dir, { recursive: true });
|
|
437
|
+
const entries = await nodefs.readdir(dir);
|
|
438
|
+
const strays = entries.filter((e) => e !== '.git');
|
|
439
|
+
if (strays.length > 0) {
|
|
440
|
+
// same policy as ensureClone: dead transport moved aside, never fatal
|
|
441
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
442
|
+
await nodefs.rename(dir, `${dir}.stale-${stamp}`);
|
|
443
|
+
await nodefs.mkdir(dir, { recursive: true });
|
|
444
|
+
}
|
|
445
|
+
await git.init({ fs, dir, defaultBranch: opts.defaultBranch ?? 'main' });
|
|
446
|
+
if (remote !== undefined)
|
|
447
|
+
await git.addRemote({ fs, dir, remote: 'origin', url: remote.url });
|
|
448
|
+
return { ok: true, detail: 'local mirror initialized (offline mode)', changed: true };
|
|
449
|
+
}
|
|
450
|
+
catch (error) {
|
|
451
|
+
return { ok: false, detail: `init: ${String(error?.message ?? error)}` };
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
/** Delete the mirror working tree + git dir entirely. SAFE ONLY because the
|
|
455
|
+
* mirror is transport (§3.1): the workspace store holds the truth, and the
|
|
456
|
+
* rebuild republishes from it (the diverged-offline recovery, §5.3). */
|
|
457
|
+
export async function removeMirror(dir) {
|
|
458
|
+
try {
|
|
459
|
+
await nodefs.rm(dir, { recursive: true, force: true });
|
|
460
|
+
return { ok: true, detail: 'mirror removed for rebuild' };
|
|
461
|
+
}
|
|
462
|
+
catch (error) {
|
|
463
|
+
return { ok: false, detail: `remove: ${String(error?.message ?? error)}` };
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
/** Push the local branch; a rejected (non-ff) push comes back for the caller to ff-and-retry. */
|
|
467
|
+
export async function push(dir, remote, opts = {}) {
|
|
468
|
+
const ref = `refs/heads/${await branchOf(dir, opts.defaultBranch ?? 'main')}`;
|
|
469
|
+
// Nothing committed yet is NOT a push failure (measured 2026-09-25 by the
|
|
470
|
+
// hosted e2e: linking a pristine workspace to a fresh empty remote made
|
|
471
|
+
// the mirror's clone unborn-HEAD, the push of a nonexistent ref threw, and
|
|
472
|
+
// the honest state 'nothing to push yet' degraded to local-only — the
|
|
473
|
+
// status told the user the remote took nothing when there was literally
|
|
474
|
+
// nothing to take). A mirror without a local branch is up to date by
|
|
475
|
+
// definition; the archive's first commit re-arms the push.
|
|
476
|
+
try {
|
|
477
|
+
await git.resolveRef({ fs, dir, ref });
|
|
478
|
+
}
|
|
479
|
+
catch {
|
|
480
|
+
return { ok: true, detail: 'nothing to push (no local commits yet)' };
|
|
481
|
+
}
|
|
482
|
+
try {
|
|
483
|
+
await git.push({ fs, http: nodeHttp, dir, url: remote.url, ref, onAuth: authOf(remote) });
|
|
484
|
+
return { ok: true, detail: 'pushed' };
|
|
485
|
+
}
|
|
486
|
+
catch (error) {
|
|
487
|
+
const msg = String(error?.message ?? error);
|
|
488
|
+
if (/rejected|non-fast-forward|fetch first/i.test(msg)) {
|
|
489
|
+
return { ok: false, code: 'rejected', detail: 'push rejected (remote is ahead) — pull-and-retry' };
|
|
490
|
+
}
|
|
491
|
+
const cls = classifyGitTransportError(error);
|
|
492
|
+
return { ok: false, code: cls.code, detail: `push failed: ${cls.detail}` };
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
/** The real driver (isomorphic-git, https only — record §3.2). Sync takes a driver
|
|
496
|
+
* so tests can exercise the loop against a fake remote (the wire protocol is
|
|
497
|
+
* isomorphic-git's to own; our logic is what the fake exercises). */
|
|
498
|
+
const upstreamOf = (remote, dir) => isLocalUpstreamUrl(remote.url) ? resolveLocalUpstreamPath(remote.url, path.dirname(path.dirname(dir))) : undefined;
|
|
499
|
+
export const isomorphicDriver = {
|
|
500
|
+
async ensureClone(dir, remote, opts) {
|
|
501
|
+
const up = upstreamOf(remote, dir);
|
|
502
|
+
if (up !== undefined) {
|
|
503
|
+
const known = readOrigin(dir);
|
|
504
|
+
if (known !== null && known !== up) {
|
|
505
|
+
return { ok: false, code: 'origin-mismatch', detail: `mirror origin is ${known}, the project's upstream is ${up}` };
|
|
506
|
+
}
|
|
507
|
+
const res = await ensureCloneLocal(dir, up, opts);
|
|
508
|
+
if (res.ok)
|
|
509
|
+
await recordOrigin(dir, up);
|
|
510
|
+
return res;
|
|
511
|
+
}
|
|
512
|
+
if (await isRepo(dir)) {
|
|
513
|
+
const known = readOrigin(dir);
|
|
514
|
+
if (known !== null && known !== remote.url) {
|
|
515
|
+
return { ok: false, code: 'origin-mismatch', detail: `mirror origin is ${known}, the project's remote is ${remote.url}` };
|
|
516
|
+
}
|
|
517
|
+
const r = await ensureClone(dir, remote, opts);
|
|
518
|
+
if (r.ok && r.detail === 'already a repo')
|
|
519
|
+
await recordOrigin(dir, remote.url);
|
|
520
|
+
return r;
|
|
521
|
+
}
|
|
522
|
+
const r = await ensureClone(dir, remote, opts);
|
|
523
|
+
if (r.ok)
|
|
524
|
+
await recordOrigin(dir, remote.url);
|
|
525
|
+
return r;
|
|
526
|
+
},
|
|
527
|
+
initLocal,
|
|
528
|
+
removeMirror,
|
|
529
|
+
stageAllAndCommit,
|
|
530
|
+
async pullFastForward(dir, remote, opts) {
|
|
531
|
+
const up = upstreamOf(remote, dir);
|
|
532
|
+
return up !== undefined ? pullLocal(dir, up, opts) : pullFastForward(dir, remote, opts);
|
|
533
|
+
},
|
|
534
|
+
async push(dir, remote, opts) {
|
|
535
|
+
const up = upstreamOf(remote, dir);
|
|
536
|
+
return up !== undefined ? pushLocal(dir, up, opts) : push(dir, remote, opts);
|
|
537
|
+
},
|
|
538
|
+
};
|
|
539
|
+
//# sourceMappingURL=gitops.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitops.js","sourceRoot":"","sources":["../src/gitops.ts"],"names":[],"mappings":"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"}
|