@miadi/inquiry-weave 0.18.4 → 0.18.5
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/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/rise-resolve.d.ts +71 -0
- package/dist/rise-resolve.d.ts.map +1 -0
- package/dist/rise-resolve.js +165 -0
- package/dist/rise-resolve.js.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -32,6 +32,7 @@ export * from "./pde.js";
|
|
|
32
32
|
export * from "./tracing.js";
|
|
33
33
|
export * from "./rispec.js";
|
|
34
34
|
export * from "./rise-workspaces.js";
|
|
35
|
+
export * from "./rise-resolve.js";
|
|
35
36
|
export * from "./chronicle-terminal.js";
|
|
36
37
|
export * from "./story-library.js";
|
|
37
38
|
export * from "./git-landing.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,UAAU,CAAA;AACxB,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,oBAAoB,CAAA;AAClC,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,mBAAmB,CAAA;AACjC,cAAc,aAAa,CAAA;AAC3B,cAAc,qBAAqB,CAAA;AACnC,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,0BAA0B,CAAA;AACxC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA;AACxB,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,sBAAsB,CAAA;AACpC,cAAc,yBAAyB,CAAA;AACvC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,oBAAoB,CAAA;AAClC,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,mBAAmB,CAAA;AACjC,cAAc,aAAa,CAAA;AAC3B,cAAc,qBAAqB,CAAA;AACnC,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,0BAA0B,CAAA;AACxC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA;AACxB,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,sBAAsB,CAAA;AACpC,cAAc,mBAAmB,CAAA;AACjC,cAAc,yBAAyB,CAAA;AACvC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -32,6 +32,7 @@ export * from "./pde.js";
|
|
|
32
32
|
export * from "./tracing.js";
|
|
33
33
|
export * from "./rispec.js";
|
|
34
34
|
export * from "./rise-workspaces.js";
|
|
35
|
+
export * from "./rise-resolve.js";
|
|
35
36
|
export * from "./chronicle-terminal.js";
|
|
36
37
|
export * from "./story-library.js";
|
|
37
38
|
export * from "./git-landing.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,oBAAoB,CAAA;AAClC,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,mBAAmB,CAAA;AACjC,cAAc,aAAa,CAAA;AAC3B,cAAc,qBAAqB,CAAA;AACnC,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,0BAA0B,CAAA;AACxC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA;AACxB,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,sBAAsB,CAAA;AACpC,cAAc,yBAAyB,CAAA;AACvC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,OAAO,EAAE,MAAM,EAAuC,MAAM,UAAU,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,oBAAoB,CAAA;AAClC,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,mBAAmB,CAAA;AACjC,cAAc,aAAa,CAAA;AAC3B,cAAc,qBAAqB,CAAA;AACnC,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,0BAA0B,CAAA;AACxC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA;AACxB,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,sBAAsB,CAAA;AACpC,cAAc,mBAAmB,CAAA;AACjC,cAAc,yBAAyB,CAAA;AACvC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,OAAO,EAAE,MAAM,EAAuC,MAAM,UAAU,CAAA"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where a `rise://` address opens now (jgwill/Miadi#888).
|
|
3
|
+
*
|
|
4
|
+
* An address names a specification, not a branch, and a specification moves
|
|
5
|
+
* through time: it is written on a pull request's branch (often in a fork),
|
|
6
|
+
* it is merged into the default branch, and its branch may then be deleted.
|
|
7
|
+
* The address has to keep opening it through all of that. So, in order:
|
|
8
|
+
*
|
|
9
|
+
* 1. `@commit` in the address → that commit, as written (no lookup).
|
|
10
|
+
* 2. the default branch → when the path exists there; after a merge
|
|
11
|
+
* every address lands here.
|
|
12
|
+
* 3. an open pull request → the branch that carries the path, in the
|
|
13
|
+
* fork when the branch lives in one.
|
|
14
|
+
* 4. a commit an episode recorded → the commit a chronicle episode stood on
|
|
15
|
+
* when it held the spec (`rispecs:`), which
|
|
16
|
+
* outlives a deleted branch.
|
|
17
|
+
* 5. nothing → `url: null`, with what was looked at.
|
|
18
|
+
*
|
|
19
|
+
* A lookup that cannot reach GitHub is not a verdict: it opens the recorded
|
|
20
|
+
* commit when there is one, else the default branch, marked `unverified`.
|
|
21
|
+
* Grounding: foundations/resource-addressing-and-terminal-hypermedia/
|
|
22
|
+
* (persistent identification, reference rot).
|
|
23
|
+
*/
|
|
24
|
+
import { type ParsedRiseUri } from "./rise-dsl.js";
|
|
25
|
+
export type RiseResolution = "pinned" | "default-branch" | "pull-request" | "recorded-commit" | "unverified" | "unresolved";
|
|
26
|
+
export interface RiseLocation {
|
|
27
|
+
via: RiseResolution;
|
|
28
|
+
/** The page to open; null when nothing carries the path. */
|
|
29
|
+
url: string | null;
|
|
30
|
+
/** The repository the page is in: a fork when a pull request's branch lives there. */
|
|
31
|
+
repository?: string;
|
|
32
|
+
/** The branch or commit opened. */
|
|
33
|
+
ref?: string;
|
|
34
|
+
pull?: {
|
|
35
|
+
number: number;
|
|
36
|
+
url: string;
|
|
37
|
+
title?: string;
|
|
38
|
+
};
|
|
39
|
+
/** The episode whose recorded commit was opened. */
|
|
40
|
+
episode?: string;
|
|
41
|
+
/** What was looked at, in order: the readable answer when nothing is found. */
|
|
42
|
+
checked: string[];
|
|
43
|
+
}
|
|
44
|
+
export interface RecordedRiseCommit {
|
|
45
|
+
commit: string;
|
|
46
|
+
/** The episode folder that recorded it. */
|
|
47
|
+
episode: string;
|
|
48
|
+
}
|
|
49
|
+
export interface ResolveRiseOptions {
|
|
50
|
+
fetchImpl?: typeof fetch;
|
|
51
|
+
/** A GitHub token: private repositories, and a rate limit that holds. */
|
|
52
|
+
token?: string;
|
|
53
|
+
/** Commits chronicle episodes recorded for this address (`recordedRiseCommits`). */
|
|
54
|
+
recorded?: RecordedRiseCommit[];
|
|
55
|
+
/** Open pull requests looked at, newest first. Default 50. */
|
|
56
|
+
pullLimit?: number;
|
|
57
|
+
apiBase?: string;
|
|
58
|
+
/** Per request. Default 4000 ms. */
|
|
59
|
+
timeoutMs?: number;
|
|
60
|
+
}
|
|
61
|
+
type Kind = "file" | "dir";
|
|
62
|
+
/** The GitHub page of a path at a ref: `tree` for a folder, `blob` for a file. */
|
|
63
|
+
export declare function riseGithubPageUrl(repository: string, ref: string, path: string, kind: Kind, fragment?: string): string;
|
|
64
|
+
export declare function resolveRiseLocation(parsed: ParsedRiseUri, options?: ResolveRiseOptions): Promise<RiseLocation>;
|
|
65
|
+
/**
|
|
66
|
+
* The commits chronicle episodes recorded for an address in their `rispecs:`,
|
|
67
|
+
* newest episode first, one per commit. Episodes that cannot be read are skipped.
|
|
68
|
+
*/
|
|
69
|
+
export declare function recordedRiseCommits(chronicleRoot: string, parsed: Pick<ParsedRiseUri, "owner" | "repo" | "path">): Promise<RecordedRiseCommit[]>;
|
|
70
|
+
export {};
|
|
71
|
+
//# sourceMappingURL=rise-resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rise-resolve.d.ts","sourceRoot":"","sources":["../src/rise-resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAMH,OAAO,EAA8D,KAAK,aAAa,EAAE,MAAM,eAAe,CAAA;AAE9G,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,gBAAgB,GAAG,cAAc,GAAG,iBAAiB,GAAG,YAAY,GAAG,YAAY,CAAA;AAE3H,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,cAAc,CAAA;IACnB,4DAA4D;IAC5D,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,mCAAmC;IACnC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACtD,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,+EAA+E;IAC/E,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;IACxB,yEAAyE;IACzE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,oFAAoF;IACpF,QAAQ,CAAC,EAAE,kBAAkB,EAAE,CAAA;IAC/B,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,KAAK,IAAI,GAAG,MAAM,GAAG,KAAK,CAAA;AAQ1B,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAEtH;AAED,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,YAAY,CAAC,CAwFxH;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAyBtJ"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where a `rise://` address opens now (jgwill/Miadi#888).
|
|
3
|
+
*
|
|
4
|
+
* An address names a specification, not a branch, and a specification moves
|
|
5
|
+
* through time: it is written on a pull request's branch (often in a fork),
|
|
6
|
+
* it is merged into the default branch, and its branch may then be deleted.
|
|
7
|
+
* The address has to keep opening it through all of that. So, in order:
|
|
8
|
+
*
|
|
9
|
+
* 1. `@commit` in the address → that commit, as written (no lookup).
|
|
10
|
+
* 2. the default branch → when the path exists there; after a merge
|
|
11
|
+
* every address lands here.
|
|
12
|
+
* 3. an open pull request → the branch that carries the path, in the
|
|
13
|
+
* fork when the branch lives in one.
|
|
14
|
+
* 4. a commit an episode recorded → the commit a chronicle episode stood on
|
|
15
|
+
* when it held the spec (`rispecs:`), which
|
|
16
|
+
* outlives a deleted branch.
|
|
17
|
+
* 5. nothing → `url: null`, with what was looked at.
|
|
18
|
+
*
|
|
19
|
+
* A lookup that cannot reach GitHub is not a verdict: it opens the recorded
|
|
20
|
+
* commit when there is one, else the default branch, marked `unverified`.
|
|
21
|
+
* Grounding: foundations/resource-addressing-and-terminal-hypermedia/
|
|
22
|
+
* (persistent identification, reference rot).
|
|
23
|
+
*/
|
|
24
|
+
import { readdir, readFile } from "node:fs/promises";
|
|
25
|
+
import { join } from "node:path";
|
|
26
|
+
import { parse } from "yaml";
|
|
27
|
+
import { readEpisodeRispecs } from "@miadi/episodic-memory-schema";
|
|
28
|
+
import { canonicalRiseRef, RISE_REPOS_WITHOUT_GITHUB, riseGithubUrl } from "./rise-dsl.js";
|
|
29
|
+
class Unreachable extends Error {
|
|
30
|
+
}
|
|
31
|
+
function pathSegments(path) {
|
|
32
|
+
return path.split("/").map(encodeURIComponent).join("/");
|
|
33
|
+
}
|
|
34
|
+
/** The GitHub page of a path at a ref: `tree` for a folder, `blob` for a file. */
|
|
35
|
+
export function riseGithubPageUrl(repository, ref, path, kind, fragment) {
|
|
36
|
+
return `https://github.com/${repository}/${kind === "dir" ? "tree" : "blob"}/${pathSegments(ref)}/${pathSegments(path)}${fragment ? `#${encodeURI(fragment)}` : ""}`;
|
|
37
|
+
}
|
|
38
|
+
export async function resolveRiseLocation(parsed, options = {}) {
|
|
39
|
+
const base = `${parsed.owner}/${parsed.repo}`;
|
|
40
|
+
const checked = [];
|
|
41
|
+
if (parsed.commit) {
|
|
42
|
+
return { via: "pinned", url: riseGithubUrl(parsed), repository: base, ref: parsed.commit, checked: [`the address pins ${parsed.commit}`] };
|
|
43
|
+
}
|
|
44
|
+
if (RISE_REPOS_WITHOUT_GITHUB.has(base)) {
|
|
45
|
+
return { via: "unresolved", url: null, checked: [`${base} has no GitHub page`] };
|
|
46
|
+
}
|
|
47
|
+
const fetchImpl = options.fetchImpl ?? fetch;
|
|
48
|
+
const api = (options.apiBase ?? "https://api.github.com").replace(/\/$/, "");
|
|
49
|
+
const headers = { accept: "application/vnd.github+json", "x-github-api-version": "2022-11-28" };
|
|
50
|
+
if (options.token)
|
|
51
|
+
headers.authorization = `Bearer ${options.token}`;
|
|
52
|
+
const recorded = options.recorded ?? [];
|
|
53
|
+
const get = async (route) => {
|
|
54
|
+
const controller = new AbortController();
|
|
55
|
+
const timer = setTimeout(() => controller.abort(), options.timeoutMs ?? 4000);
|
|
56
|
+
try {
|
|
57
|
+
const response = await fetchImpl(`${api}${route}`, { headers, signal: controller.signal });
|
|
58
|
+
const body = response.status === 204 ? null : await response.json().catch(() => null);
|
|
59
|
+
return { status: response.status, body };
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
throw new Unreachable(error instanceof Error ? error.message : String(error));
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
clearTimeout(timer);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
/** The kind of the path at a ref, or null when it is not there. Anything but 200 or 404 is unreachable. */
|
|
69
|
+
const kindAt = async (repository, ref) => {
|
|
70
|
+
const { status, body } = await get(`/repos/${repository}/contents/${pathSegments(parsed.path)}?ref=${encodeURIComponent(ref)}`);
|
|
71
|
+
if (status === 404 || status === 422)
|
|
72
|
+
return null;
|
|
73
|
+
if (status !== 200)
|
|
74
|
+
throw new Unreachable(`GitHub answered ${status} for ${repository}@${ref}`);
|
|
75
|
+
return Array.isArray(body) ? "dir" : "file";
|
|
76
|
+
};
|
|
77
|
+
try {
|
|
78
|
+
const repo = await get(`/repos/${base}`);
|
|
79
|
+
if (repo.status === 404)
|
|
80
|
+
return { via: "unresolved", url: null, checked: [`${base} is not a repository GitHub shows`] };
|
|
81
|
+
if (repo.status !== 200)
|
|
82
|
+
throw new Unreachable(`GitHub answered ${repo.status} for ${base}`);
|
|
83
|
+
const branch = String(repo.body?.default_branch || "main");
|
|
84
|
+
checked.push(`${base}@${branch} (default branch)`);
|
|
85
|
+
const onDefault = await kindAt(base, branch);
|
|
86
|
+
if (onDefault) {
|
|
87
|
+
return { via: "default-branch", url: riseGithubPageUrl(base, branch, parsed.path, onDefault, parsed.fragment), repository: base, ref: branch, checked };
|
|
88
|
+
}
|
|
89
|
+
const limit = Math.max(1, Math.min(options.pullLimit ?? 50, 100));
|
|
90
|
+
const pulls = await get(`/repos/${base}/pulls?state=open&sort=updated&direction=desc&per_page=${limit}`);
|
|
91
|
+
if (pulls.status !== 200)
|
|
92
|
+
throw new Unreachable(`GitHub answered ${pulls.status} for the pull requests of ${base}`);
|
|
93
|
+
for (const pull of (Array.isArray(pulls.body) ? pulls.body : [])) {
|
|
94
|
+
const head = pull.head ?? {};
|
|
95
|
+
const repository = typeof head.repo?.full_name === "string" ? head.repo.full_name : null;
|
|
96
|
+
const ref = typeof head.ref === "string" ? head.ref : null;
|
|
97
|
+
if (!repository || !ref)
|
|
98
|
+
continue;
|
|
99
|
+
checked.push(`${repository}@${ref} (${base}#${pull.number})`);
|
|
100
|
+
const kind = await kindAt(repository, ref);
|
|
101
|
+
if (kind) {
|
|
102
|
+
return {
|
|
103
|
+
via: "pull-request",
|
|
104
|
+
url: riseGithubPageUrl(repository, ref, parsed.path, kind, parsed.fragment),
|
|
105
|
+
repository,
|
|
106
|
+
ref,
|
|
107
|
+
pull: { number: Number(pull.number), url: String(pull.html_url ?? `https://github.com/${base}/pull/${pull.number}`), ...(pull.title ? { title: String(pull.title) } : {}) },
|
|
108
|
+
checked,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
for (const entry of recorded) {
|
|
113
|
+
checked.push(`${base}@${entry.commit} (recorded by ${entry.episode})`);
|
|
114
|
+
const kind = await kindAt(base, entry.commit);
|
|
115
|
+
if (kind) {
|
|
116
|
+
return { via: "recorded-commit", url: riseGithubPageUrl(base, entry.commit, parsed.path, kind, parsed.fragment), repository: base, ref: entry.commit, episode: entry.episode, checked };
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return { via: "unresolved", url: null, checked };
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
if (!(error instanceof Unreachable))
|
|
123
|
+
throw error;
|
|
124
|
+
checked.push(`GitHub not reached: ${error.message}`);
|
|
125
|
+
const first = recorded[0];
|
|
126
|
+
if (first) {
|
|
127
|
+
return { via: "unverified", url: riseGithubUrl({ ...parsed, commit: first.commit }), repository: base, ref: first.commit, episode: first.episode, checked };
|
|
128
|
+
}
|
|
129
|
+
return { via: "unverified", url: riseGithubUrl(parsed), repository: base, checked };
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* The commits chronicle episodes recorded for an address in their `rispecs:`,
|
|
134
|
+
* newest episode first, one per commit. Episodes that cannot be read are skipped.
|
|
135
|
+
*/
|
|
136
|
+
export async function recordedRiseCommits(chronicleRoot, parsed) {
|
|
137
|
+
const ref = canonicalRiseRef(parsed.owner, parsed.repo, parsed.path);
|
|
138
|
+
let folders;
|
|
139
|
+
try {
|
|
140
|
+
folders = (await readdir(chronicleRoot, { withFileTypes: true })).filter((d) => d.isDirectory() && /-episode-\d+/.test(d.name)).map((d) => d.name);
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
return [];
|
|
144
|
+
}
|
|
145
|
+
folders.sort().reverse();
|
|
146
|
+
const out = [];
|
|
147
|
+
const seen = new Set();
|
|
148
|
+
for (const episode of folders) {
|
|
149
|
+
let manifest;
|
|
150
|
+
try {
|
|
151
|
+
manifest = parse(await readFile(join(chronicleRoot, episode, "episode.yaml"), "utf8"));
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
for (const entry of readEpisodeRispecs(manifest)) {
|
|
157
|
+
if (entry.ref !== ref || !entry.commit || seen.has(entry.commit))
|
|
158
|
+
continue;
|
|
159
|
+
seen.add(entry.commit);
|
|
160
|
+
out.push({ commit: entry.commit, episode });
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return out;
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=rise-resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rise-resolve.js","sourceRoot":"","sources":["../src/rise-resolve.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@miadi/inquiry-weave",
|
|
3
|
-
"version": "0.18.
|
|
3
|
+
"version": "0.18.5",
|
|
4
4
|
"description": "Relate and sync IAIP inquiry artefacts, their GitHub issues, and miadi-chronicle episodes. Creates vessels and relations only — never inquiry content.",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|