@forwardimpact/libwiki 0.2.30 → 0.2.31
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/package.json +2 -2
- package/src/commands/fix.js +1 -1
- package/src/wiki-sync.js +41 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forwardimpact/libwiki",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.31",
|
|
4
4
|
"description": "Wiki lifecycle primitives — stable memory for agent teams so coordination persists across sessions.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"wiki",
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"dependencies": {
|
|
48
48
|
"@forwardimpact/libcli": "^0.1.0",
|
|
49
49
|
"@forwardimpact/libconfig": "^0.1.77",
|
|
50
|
-
"@forwardimpact/
|
|
50
|
+
"@forwardimpact/libharness": "^1.0.0",
|
|
51
51
|
"@forwardimpact/libpreflight": "^0.1.0",
|
|
52
52
|
"@forwardimpact/libtelemetry": "^0.1.47",
|
|
53
53
|
"@forwardimpact/libutil": "^0.1.0",
|
package/src/commands/fix.js
CHANGED
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
createAgentRunner,
|
|
6
6
|
composeProfilePrompt,
|
|
7
7
|
createRedactor,
|
|
8
|
-
} from "@forwardimpact/
|
|
8
|
+
} from "@forwardimpact/libharness";
|
|
9
9
|
import { RULES } from "../audit/rules.js";
|
|
10
10
|
import { buildContext, resolveScope } from "../audit/scopes.js";
|
|
11
11
|
import {
|
package/src/wiki-sync.js
CHANGED
|
@@ -7,6 +7,24 @@ import { scanPushWindow, appendOverrideRecord } from "./secret-gate.js";
|
|
|
7
7
|
import { runBudgetGate } from "./budget-gate.js";
|
|
8
8
|
import { currentDayIso } from "./util/clock.js";
|
|
9
9
|
|
|
10
|
+
/**
|
|
11
|
+
* A git `insteadOf` rule that maps a URL to itself. Some sandboxed
|
|
12
|
+
* environments install a broad global rewrite —
|
|
13
|
+
* `url.<local-proxy>.insteadOf = https://github.com/` — that diverts every
|
|
14
|
+
* github.com URL, the wiki included, to a proxy that serves only the main repo
|
|
15
|
+
* and returns 403 for the wiki. An identity rule keyed to the full wiki URL is
|
|
16
|
+
* a longer prefix match than the broad `https://github.com/` rule, so git wins
|
|
17
|
+
* it by longest-match and leaves the URL untouched; the request then reaches
|
|
18
|
+
* github.com over the ambient HTTPS proxy. Where no such broad rewrite exists,
|
|
19
|
+
* the rule is a harmless no-op. Applied inline on clone and persisted into the
|
|
20
|
+
* clone's local config for every later network op (see {@link WikiSync#pinTransport}).
|
|
21
|
+
* @param {string} url - The wiki clone URL.
|
|
22
|
+
* @returns {string} A `-c`-form `url.<url>.insteadOf=<url>` entry.
|
|
23
|
+
*/
|
|
24
|
+
function selfInsteadOf(url) {
|
|
25
|
+
return `url.${url}.insteadOf=${url}`;
|
|
26
|
+
}
|
|
27
|
+
|
|
10
28
|
/** The branch the wiki clone publishes (hard-coded in fetch / rebase / push). */
|
|
11
29
|
const BRANCH = "master";
|
|
12
30
|
const REMOTE = "origin";
|
|
@@ -215,15 +233,36 @@ export class WikiSync {
|
|
|
215
233
|
|
|
216
234
|
/** Clone the wiki from `url` if it is not already cloned. */
|
|
217
235
|
async ensureCloned(url) {
|
|
218
|
-
if (this.isCloned())
|
|
236
|
+
if (this.isCloned()) {
|
|
237
|
+
await this.#pinTransport(url);
|
|
238
|
+
return { cloned: true, reason: "already-cloned" };
|
|
239
|
+
}
|
|
219
240
|
try {
|
|
220
|
-
await this.#authed().clone(url, this.#wikiDir
|
|
241
|
+
await this.#authed().clone(url, this.#wikiDir, {
|
|
242
|
+
config: [selfInsteadOf(url)],
|
|
243
|
+
});
|
|
244
|
+
await this.#pinTransport(url);
|
|
221
245
|
return { cloned: true, reason: "cloned" };
|
|
222
246
|
} catch (err) {
|
|
223
247
|
return { cloned: false, reason: err.stderr?.trim() || err.message };
|
|
224
248
|
}
|
|
225
249
|
}
|
|
226
250
|
|
|
251
|
+
/**
|
|
252
|
+
* Persist the identity-`insteadOf` for the wiki's own URL into the clone's
|
|
253
|
+
* local config, so every later network op (fetch / push / ls-remote) that
|
|
254
|
+
* runs against the stored remote URL — and re-applies `insteadOf` at
|
|
255
|
+
* transport time — is covered without threading `-c` through each call. The
|
|
256
|
+
* clone command itself takes the same rule inline (the `.git/config` does not
|
|
257
|
+
* exist yet). Idempotent; safe to re-run on a resumed clone. See
|
|
258
|
+
* {@link selfInsteadOf} for why the rule is needed.
|
|
259
|
+
*/
|
|
260
|
+
async #pinTransport(url) {
|
|
261
|
+
await this.#git.configSet(`url.${url}.insteadOf`, url, {
|
|
262
|
+
cwd: this.#wikiDir,
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
|
|
227
266
|
/** Copy git user.name and user.email from the parent repository into the wiki repository. */
|
|
228
267
|
async inheritIdentity() {
|
|
229
268
|
const name = await this.#git.configGet("user.name", {
|