@fourshore/graft-core 0.0.4 → 0.0.6
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/agents.d.ts +18 -0
- package/dist/agents.js +51 -0
- package/dist/agents.js.map +1 -0
- package/dist/git.d.ts +2 -0
- package/dist/git.js +5 -1
- package/dist/git.js.map +1 -1
- package/dist/graft.d.ts +26 -4
- package/dist/graft.js +76 -20
- package/dist/graft.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/policy.d.ts +12 -2
- package/dist/policy.js.map +1 -1
- package/dist/record.d.ts +24 -1
- package/dist/record.js +107 -0
- package/dist/record.js.map +1 -1
- package/dist/redact.d.ts +26 -0
- package/dist/redact.js +64 -0
- package/dist/redact.js.map +1 -0
- package/package.json +1 -1
package/dist/agents.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare const AGENTS_PATH = "AGENTS.md";
|
|
2
|
+
export declare const CLAUDE_PATH = "CLAUDE.md";
|
|
3
|
+
/**
|
|
4
|
+
* The section `graft init` adds to AGENTS.md so an agent working in the repo
|
|
5
|
+
* knows the workflow without anyone pasting it. Shell commands first, since
|
|
6
|
+
* every agent has a shell; MCP tool names as the alternative.
|
|
7
|
+
*/
|
|
8
|
+
export declare const AGENTS_SECTION = "## Version control\n\nThis repo uses Graft (https://github.com/FourShore/Graft). Every commit records\nthe task you were given, your plan, and the checks you ran, so the next reader\nknows why the code is the way it is.\n\n- Before editing, open a change: `graft start \"<the task, in the words you were given>\"`.\n If it says a change is already open from another session, use `graft start --replace`.\n- Record each check as you run it: `graft evidence --label \"unit tests\" -- npm test`,\n or `graft evidence --note \"<what you checked by hand>\"` for anything manual.\n- Commit with `graft land <paths> -m \"<title>\"`, not `git commit`. It refuses to\n land without evidence.\n- After `git push`, run `graft sync` so the full records reach the remote.\n- To learn why code is the way it is, run `graft log` or `graft show <id>`.\n\nWith the Graft MCP server the same steps are `graft_start`, `graft_evidence`,\n`graft_note`, `graft_land`, `graft_sync` and `graft_log`.\n";
|
|
9
|
+
export interface AgentsResult {
|
|
10
|
+
/** True if AGENTS.md was created or the section appended. */
|
|
11
|
+
written: boolean;
|
|
12
|
+
/** True if AGENTS.md already mentioned Graft and was left alone. */
|
|
13
|
+
alreadyThere: boolean;
|
|
14
|
+
/** True if CLAUDE.md is absent or does not import AGENTS.md, so Claude Code won't read it. */
|
|
15
|
+
claudeHint: boolean;
|
|
16
|
+
}
|
|
17
|
+
/** Add the Graft section to AGENTS.md at `topLevel`, creating the file if needed. Idempotent. */
|
|
18
|
+
export declare function writeAgentsSection(topLevel: string): Promise<AgentsResult>;
|
package/dist/agents.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
export const AGENTS_PATH = "AGENTS.md";
|
|
4
|
+
export const CLAUDE_PATH = "CLAUDE.md";
|
|
5
|
+
/**
|
|
6
|
+
* The section `graft init` adds to AGENTS.md so an agent working in the repo
|
|
7
|
+
* knows the workflow without anyone pasting it. Shell commands first, since
|
|
8
|
+
* every agent has a shell; MCP tool names as the alternative.
|
|
9
|
+
*/
|
|
10
|
+
export const AGENTS_SECTION = `## Version control
|
|
11
|
+
|
|
12
|
+
This repo uses Graft (https://github.com/FourShore/Graft). Every commit records
|
|
13
|
+
the task you were given, your plan, and the checks you ran, so the next reader
|
|
14
|
+
knows why the code is the way it is.
|
|
15
|
+
|
|
16
|
+
- Before editing, open a change: \`graft start "<the task, in the words you were given>"\`.
|
|
17
|
+
If it says a change is already open from another session, use \`graft start --replace\`.
|
|
18
|
+
- Record each check as you run it: \`graft evidence --label "unit tests" -- npm test\`,
|
|
19
|
+
or \`graft evidence --note "<what you checked by hand>"\` for anything manual.
|
|
20
|
+
- Commit with \`graft land <paths> -m "<title>"\`, not \`git commit\`. It refuses to
|
|
21
|
+
land without evidence.
|
|
22
|
+
- After \`git push\`, run \`graft sync\` so the full records reach the remote.
|
|
23
|
+
- To learn why code is the way it is, run \`graft log\` or \`graft show <id>\`.
|
|
24
|
+
|
|
25
|
+
With the Graft MCP server the same steps are \`graft_start\`, \`graft_evidence\`,
|
|
26
|
+
\`graft_note\`, \`graft_land\`, \`graft_sync\` and \`graft_log\`.
|
|
27
|
+
`;
|
|
28
|
+
const MENTIONS_GRAFT = /graft start|graft_start/;
|
|
29
|
+
/** Add the Graft section to AGENTS.md at `topLevel`, creating the file if needed. Idempotent. */
|
|
30
|
+
export async function writeAgentsSection(topLevel) {
|
|
31
|
+
const agentsFile = join(topLevel, AGENTS_PATH);
|
|
32
|
+
const existing = await readOrNull(agentsFile);
|
|
33
|
+
const claude = await readOrNull(join(topLevel, CLAUDE_PATH));
|
|
34
|
+
const claudeHint = !claude || !/^@AGENTS\.md\s*$/m.test(claude);
|
|
35
|
+
if (existing && MENTIONS_GRAFT.test(existing))
|
|
36
|
+
return { written: false, alreadyThere: true, claudeHint };
|
|
37
|
+
const body = existing ? existing.replace(/\s*$/, "\n\n") + AGENTS_SECTION : AGENTS_SECTION;
|
|
38
|
+
await writeFile(agentsFile, body);
|
|
39
|
+
return { written: true, alreadyThere: false, claudeHint };
|
|
40
|
+
}
|
|
41
|
+
async function readOrNull(path) {
|
|
42
|
+
try {
|
|
43
|
+
return await readFile(path, "utf8");
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
if (err.code === "ENOENT")
|
|
47
|
+
return null;
|
|
48
|
+
throw err;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=agents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,MAAM,WAAW,GAAG,WAAW,CAAC;AACvC,MAAM,CAAC,MAAM,WAAW,GAAG,WAAW,CAAC;AAEvC;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;CAiB7B,CAAC;AAWF,MAAM,cAAc,GAAG,yBAAyB,CAAC;AAEjD,iGAAiG;AACjG,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,QAAgB;IACvD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;IAC7D,MAAM,UAAU,GAAG,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChE,IAAI,QAAQ,IAAI,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IACzG,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC;IAC3F,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AAC5D,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAY;IACpC,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAClE,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
|
package/dist/git.d.ts
CHANGED
|
@@ -16,5 +16,7 @@ export declare class Git {
|
|
|
16
16
|
topLevel(): Promise<string>;
|
|
17
17
|
head(): Promise<string | null>;
|
|
18
18
|
hasStagedChanges(): Promise<boolean>;
|
|
19
|
+
/** Paths staged for the next commit, relative to the working tree root. */
|
|
20
|
+
stagedFiles(): Promise<string[]>;
|
|
19
21
|
hasWorkingTreeChanges(): Promise<boolean>;
|
|
20
22
|
}
|
package/dist/git.js
CHANGED
|
@@ -52,8 +52,12 @@ export class Git {
|
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
54
|
async hasStagedChanges() {
|
|
55
|
+
return (await this.stagedFiles()).length > 0;
|
|
56
|
+
}
|
|
57
|
+
/** Paths staged for the next commit, relative to the working tree root. */
|
|
58
|
+
async stagedFiles() {
|
|
55
59
|
const out = await this.run(["diff", "--cached", "--name-only"]);
|
|
56
|
-
return out.
|
|
60
|
+
return out.split("\n").filter(Boolean);
|
|
57
61
|
}
|
|
58
62
|
async hasWorkingTreeChanges() {
|
|
59
63
|
const out = await this.run(["status", "--porcelain"]);
|
package/dist/git.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,OAAO,QAAS,SAAQ,KAAK;IAGf;IACA;IAHlB,YACE,OAAe,EACC,IAAc,EACd,MAAc;QAE9B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAAU;QACd,WAAM,GAAN,MAAM,CAAQ;QAG9B,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,2EAA2E;AAC3E,MAAM,OAAO,GAAG;IACc;IAA5B,YAA4B,GAAW;QAAX,QAAG,GAAH,GAAG,CAAQ;IAAG,CAAC;IAE3C,KAAK,CAAC,GAAG,CAAC,IAAc,EAAE,OAA2B,EAAE;QACrD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE;gBACvC,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;gBAC3B,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,mBAAmB,EAAE,GAAG,EAAE;aAClD,CAAC,CAAC;YACH,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBAClD,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;YACD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC;YAC/B,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,GAA4C,CAAC;YACvD,MAAM,IAAI,QAAQ,CAChB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,EACvE,IAAI,EACJ,CAAC,CAAC,MAAM,IAAI,EAAE,CACf,CAAC;QACJ,CAAC;IACH,CAAC;IAED,+DAA+D;IAC/D,MAAM;QACJ,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,8CAA8C;IAC9C,QAAQ;QACN,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC;QAChE,OAAO,GAAG,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"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"}
|
package/dist/graft.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Git } from "./git.js";
|
|
2
2
|
import { type ChangeAuthor, type ChangeRecord, type Evidence } from "./record.js";
|
|
3
|
+
import { type AgentsResult } from "./agents.js";
|
|
3
4
|
export declare class GraftError extends Error {
|
|
4
5
|
constructor(message: string);
|
|
5
6
|
}
|
|
@@ -7,12 +8,20 @@ export interface StartOptions {
|
|
|
7
8
|
task: string;
|
|
8
9
|
plan?: string;
|
|
9
10
|
author?: Partial<ChangeAuthor>;
|
|
11
|
+
/** Abandon a change left open (for example by a crashed session) instead of refusing. */
|
|
12
|
+
replace?: boolean;
|
|
10
13
|
}
|
|
11
14
|
export interface LandOptions {
|
|
12
15
|
/** Commit title. Defaults to the task, truncated to 72 chars. */
|
|
13
16
|
title?: string;
|
|
14
|
-
/** Stage everything (git add -A) before committing. */
|
|
17
|
+
/** Stage everything (git add -A) before committing. Off by default; prefer `paths`. */
|
|
15
18
|
all?: boolean;
|
|
19
|
+
/** Stage these paths (git add -- <paths>) before committing. */
|
|
20
|
+
paths?: string[];
|
|
21
|
+
/** Land even though a staged file looks like a credential (.env, *.pem, ...). */
|
|
22
|
+
allowSecrets?: boolean;
|
|
23
|
+
/** Extra commit trailers, each "Key: value", appended after Graft's own (e.g. Co-Authored-By). */
|
|
24
|
+
trailers?: string[];
|
|
16
25
|
/** Final plan, overriding whatever was recorded at start. */
|
|
17
26
|
plan?: string;
|
|
18
27
|
/** Allow landing with no evidence recorded. */
|
|
@@ -25,12 +34,16 @@ export interface InitResult {
|
|
|
25
34
|
/** True if .graft/policy.json was written. */
|
|
26
35
|
policyWritten: boolean;
|
|
27
36
|
remote?: string;
|
|
37
|
+
/** What happened to AGENTS.md; absent when `agents: false`. */
|
|
38
|
+
agents?: AgentsResult;
|
|
28
39
|
}
|
|
29
40
|
export interface SyncResult {
|
|
30
41
|
remote: string;
|
|
31
42
|
fetched: boolean;
|
|
32
43
|
merged: boolean;
|
|
33
44
|
pushed: boolean;
|
|
45
|
+
/** Why the push was refused, when it was. Fetch and merge still happened. */
|
|
46
|
+
pushError?: string;
|
|
34
47
|
}
|
|
35
48
|
export interface LandedChange {
|
|
36
49
|
record: ChangeRecord;
|
|
@@ -43,6 +56,12 @@ export interface LogEntry {
|
|
|
43
56
|
authorName: string;
|
|
44
57
|
authoredAt: string;
|
|
45
58
|
record: ChangeRecord | null;
|
|
59
|
+
/**
|
|
60
|
+
* Where `record` came from: the git note (full record, with command output),
|
|
61
|
+
* or the commit message alone (trailers plus the Plan: and Evidence: blocks,
|
|
62
|
+
* no output) when the note is not in this clone. Null when there is no record.
|
|
63
|
+
*/
|
|
64
|
+
recordSource: "note" | "message" | null;
|
|
46
65
|
/** Trailers parsed from the message, even when the note is missing. */
|
|
47
66
|
trailers: Record<string, string>;
|
|
48
67
|
}
|
|
@@ -63,12 +82,13 @@ export declare class Graft {
|
|
|
63
82
|
land(opts?: LandOptions): Promise<LandedChange>;
|
|
64
83
|
/**
|
|
65
84
|
* Prepare a repository: make git carry notes through amend and rebase,
|
|
66
|
-
* fetch the notes ref alongside branches,
|
|
67
|
-
* Safe to run more than once.
|
|
85
|
+
* fetch the notes ref alongside branches, write a starter policy file, and
|
|
86
|
+
* tell agents how to use Graft in AGENTS.md. Safe to run more than once.
|
|
68
87
|
*/
|
|
69
88
|
init(opts?: {
|
|
70
89
|
remote?: string;
|
|
71
90
|
force?: boolean;
|
|
91
|
+
agents?: boolean;
|
|
72
92
|
}): Promise<InitResult>;
|
|
73
93
|
/**
|
|
74
94
|
* Exchange change records with a remote: fetch its notes, merge them into
|
|
@@ -87,6 +107,8 @@ export declare class Graft {
|
|
|
87
107
|
show(ref: string): Promise<LogEntry | null>;
|
|
88
108
|
/** The unified diff a commit introduced against its first parent (empty for a root commit's parent side). */
|
|
89
109
|
diff(commit: string): Promise<string>;
|
|
110
|
+
/** The note when it is here, else what the commit message alone can reconstruct. */
|
|
111
|
+
private readRecord;
|
|
90
112
|
private readNote;
|
|
91
113
|
private configGet;
|
|
92
114
|
private configGetAll;
|
|
@@ -94,4 +116,4 @@ export declare class Graft {
|
|
|
94
116
|
private defaultRemote;
|
|
95
117
|
private requireOpen;
|
|
96
118
|
}
|
|
97
|
-
export declare function buildCommitMessage(record: ChangeRecord, title?: string): string;
|
|
119
|
+
export declare function buildCommitMessage(record: ChangeRecord, title?: string, extraTrailers?: string[]): string;
|
package/dist/graft.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
2
|
import { Git } from "./git.js";
|
|
3
|
-
import { EVIDENCE_OUTPUT_CAP, NOTES_REF, TRAILER_KEYS, isChangeId, newChangeId, parseTrailers, trailersFor, } from "./record.js";
|
|
3
|
+
import { EVIDENCE_OUTPUT_CAP, NOTES_REF, TRAILER_KEYS, isChangeId, newChangeId, parseTrailers, parseMessageRecord, evidenceLines, EVIDENCE_HEADER, trailersFor, } from "./record.js";
|
|
4
4
|
import { OpenChangeStore } from "./store.js";
|
|
5
5
|
import { DEFAULT_POLICY, POLICY_PATH, readPolicy } from "./policy.js";
|
|
6
|
+
import { looksLikeSecretFile, redact } from "./redact.js";
|
|
7
|
+
import { writeAgentsSection } from "./agents.js";
|
|
6
8
|
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
7
9
|
import { join } from "node:path";
|
|
8
10
|
export class GraftError extends Error {
|
|
@@ -24,8 +26,9 @@ export class Graft {
|
|
|
24
26
|
}
|
|
25
27
|
async start(opts) {
|
|
26
28
|
const open = await this.store.read();
|
|
27
|
-
if (open) {
|
|
28
|
-
throw new GraftError(`A change is already open (${open.id}: ${open.task}
|
|
29
|
+
if (open && !opts.replace) {
|
|
30
|
+
throw new GraftError(`A change is already open (${open.id}: ${open.task}, opened ${age(open.startedAt)} ago). ` +
|
|
31
|
+
"Land it, run `graft abandon`, or pass --replace to drop it.");
|
|
29
32
|
}
|
|
30
33
|
if (!opts.task?.trim())
|
|
31
34
|
throw new GraftError("A task is required.");
|
|
@@ -64,7 +67,7 @@ export class Graft {
|
|
|
64
67
|
command,
|
|
65
68
|
exitCode,
|
|
66
69
|
durationMs: Date.now() - started,
|
|
67
|
-
output: capOutput(output),
|
|
70
|
+
output: capOutput(redact(output)),
|
|
68
71
|
label,
|
|
69
72
|
};
|
|
70
73
|
open.evidence.push(ev);
|
|
@@ -76,7 +79,7 @@ export class Graft {
|
|
|
76
79
|
const open = await this.requireOpen();
|
|
77
80
|
if (!text.trim())
|
|
78
81
|
throw new GraftError("Evidence text is required.");
|
|
79
|
-
const ev = { kind: "note", at: new Date().toISOString(), text: text.trim(), label };
|
|
82
|
+
const ev = { kind: "note", at: new Date().toISOString(), text: redact(text.trim()), label };
|
|
80
83
|
open.evidence.push(ev);
|
|
81
84
|
await this.store.write(open);
|
|
82
85
|
return ev;
|
|
@@ -87,16 +90,31 @@ export class Graft {
|
|
|
87
90
|
if (opts.plan)
|
|
88
91
|
open.plan = opts.plan.trim();
|
|
89
92
|
const policy = await readPolicy(await this.git.topLevel());
|
|
90
|
-
if (
|
|
91
|
-
|
|
93
|
+
if (policy.requireEvidence && !opts.allowNoEvidence) {
|
|
94
|
+
if (open.evidence.length === 0) {
|
|
95
|
+
throw new GraftError("No evidence recorded. Run `graft evidence -- <command>` or pass --allow-no-evidence.");
|
|
96
|
+
}
|
|
97
|
+
const passed = open.evidence.some((e) => e.kind === "command" && e.exitCode === 0);
|
|
98
|
+
if (policy.requireEvidence === "command" && !passed) {
|
|
99
|
+
throw new GraftError("Policy requires a passing command as evidence; notes alone do not count. " +
|
|
100
|
+
"Run `graft evidence -- <command>` or pass --allow-no-evidence.");
|
|
101
|
+
}
|
|
92
102
|
}
|
|
103
|
+
if (opts.paths?.length)
|
|
104
|
+
await this.git.run(["add", "--", ...opts.paths]);
|
|
93
105
|
if (opts.all)
|
|
94
106
|
await this.git.run(["add", "-A"]);
|
|
95
|
-
|
|
96
|
-
|
|
107
|
+
const staged = await this.git.stagedFiles();
|
|
108
|
+
if (staged.length === 0) {
|
|
109
|
+
throw new GraftError("Nothing staged to commit. Stage files, name paths, or pass --all.");
|
|
110
|
+
}
|
|
111
|
+
const suspicious = staged.filter((p) => looksLikeSecretFile(p, policy.secretFiles));
|
|
112
|
+
if (suspicious.length > 0 && !opts.allowSecrets) {
|
|
113
|
+
throw new GraftError(`Refusing to land: staged files look like credentials: ${suspicious.join(", ")}. ` +
|
|
114
|
+
"Unstage them (git restore --staged <file>) or pass --allow-secrets if they are not.");
|
|
97
115
|
}
|
|
98
116
|
open.landedAt = new Date().toISOString();
|
|
99
|
-
const message = buildCommitMessage(open, opts.title);
|
|
117
|
+
const message = buildCommitMessage(open, opts.title, opts.trailers);
|
|
100
118
|
await this.git.run(["commit", "-q", "-F", "-"], { input: message });
|
|
101
119
|
const commit = (await this.git.head());
|
|
102
120
|
open.commit = commit;
|
|
@@ -108,8 +126,8 @@ export class Graft {
|
|
|
108
126
|
}
|
|
109
127
|
/**
|
|
110
128
|
* Prepare a repository: make git carry notes through amend and rebase,
|
|
111
|
-
* fetch the notes ref alongside branches,
|
|
112
|
-
* Safe to run more than once.
|
|
129
|
+
* fetch the notes ref alongside branches, write a starter policy file, and
|
|
130
|
+
* tell agents how to use Graft in AGENTS.md. Safe to run more than once.
|
|
113
131
|
*/
|
|
114
132
|
async init(opts = {}) {
|
|
115
133
|
const topLevel = await this.git.topLevel();
|
|
@@ -149,7 +167,8 @@ export class Graft {
|
|
|
149
167
|
await writeFile(policyFile, JSON.stringify(DEFAULT_POLICY, null, 2) + "\n");
|
|
150
168
|
policyWritten = true;
|
|
151
169
|
}
|
|
152
|
-
|
|
170
|
+
const agents = opts.agents === false ? undefined : await writeAgentsSection(topLevel);
|
|
171
|
+
return { topLevel, configured, policyWritten, remote: remote ?? undefined, agents };
|
|
153
172
|
}
|
|
154
173
|
/**
|
|
155
174
|
* Exchange change records with a remote: fetch its notes, merge them into
|
|
@@ -182,11 +201,19 @@ export class Graft {
|
|
|
182
201
|
merged = true;
|
|
183
202
|
}
|
|
184
203
|
let pushed = false;
|
|
204
|
+
let pushError;
|
|
185
205
|
if (opts.push !== false && (await this.refExists(NOTES_REF))) {
|
|
186
|
-
|
|
187
|
-
|
|
206
|
+
try {
|
|
207
|
+
await this.git.run(["push", "-q", remote, `${NOTES_REF}:${NOTES_REF}`]);
|
|
208
|
+
pushed = true;
|
|
209
|
+
}
|
|
210
|
+
catch (err) {
|
|
211
|
+
// Some hosts (and some agent sandboxes) refuse pushes to refs/notes.
|
|
212
|
+
// The merge above still happened, so this is a warning, not a failure.
|
|
213
|
+
pushError = err.message;
|
|
214
|
+
}
|
|
188
215
|
}
|
|
189
|
-
return { remote, fetched, merged, pushed };
|
|
216
|
+
return { remote, fetched, merged, pushed, pushError };
|
|
190
217
|
}
|
|
191
218
|
/** History as changes. Commits without a Graft record are included with record: null. */
|
|
192
219
|
async log(opts = {}) {
|
|
@@ -206,8 +233,7 @@ export class Graft {
|
|
|
206
233
|
const trailers = parseTrailers(body ?? "");
|
|
207
234
|
if (opts.onlyGraft && !trailers[TRAILER_KEYS.change])
|
|
208
235
|
continue;
|
|
209
|
-
|
|
210
|
-
entries.push({ commit, title, authorName, authoredAt, trailers, record });
|
|
236
|
+
entries.push({ commit, title, authorName, authoredAt, trailers, ...(await this.readRecord(commit, body ?? "", authoredAt)) });
|
|
211
237
|
}
|
|
212
238
|
return entries;
|
|
213
239
|
}
|
|
@@ -229,12 +255,22 @@ export class Graft {
|
|
|
229
255
|
}
|
|
230
256
|
const [title, authorName, authoredAt, body] = (await this.git.run(["log", "-1", "--format=%s%x1f%an%x1f%aI%x1f%B", sha])).split("\x1f");
|
|
231
257
|
const trailers = parseTrailers(body ?? "");
|
|
232
|
-
return { commit: sha, title, authorName, authoredAt, trailers,
|
|
258
|
+
return { commit: sha, title, authorName, authoredAt, trailers, ...(await this.readRecord(sha, body ?? "", authoredAt)) };
|
|
233
259
|
}
|
|
234
260
|
/** The unified diff a commit introduced against its first parent (empty for a root commit's parent side). */
|
|
235
261
|
async diff(commit) {
|
|
236
262
|
return this.git.run(["show", "--format=", "--no-color", "--no-ext-diff", "-M", "--root", commit]);
|
|
237
263
|
}
|
|
264
|
+
/** The note when it is here, else what the commit message alone can reconstruct. */
|
|
265
|
+
async readRecord(commit, message, authoredAt) {
|
|
266
|
+
if (!parseTrailers(message)[TRAILER_KEYS.change])
|
|
267
|
+
return { record: null, recordSource: null };
|
|
268
|
+
const note = await this.readNote(commit);
|
|
269
|
+
if (note)
|
|
270
|
+
return { record: note, recordSource: "note" };
|
|
271
|
+
const record = parseMessageRecord(message, authoredAt);
|
|
272
|
+
return record ? { record, recordSource: "message" } : { record: null, recordSource: null };
|
|
273
|
+
}
|
|
238
274
|
async readNote(commit) {
|
|
239
275
|
try {
|
|
240
276
|
const raw = await this.git.run(["notes", `--ref=${NOTES_REF}`, "show", commit]);
|
|
@@ -281,17 +317,37 @@ export class Graft {
|
|
|
281
317
|
return open;
|
|
282
318
|
}
|
|
283
319
|
}
|
|
284
|
-
export function buildCommitMessage(record, title) {
|
|
320
|
+
export function buildCommitMessage(record, title, extraTrailers = []) {
|
|
285
321
|
const subject = (title?.trim() || record.task).split("\n")[0].slice(0, 72);
|
|
286
322
|
const lines = [subject, ""];
|
|
287
323
|
if (record.task !== subject)
|
|
288
324
|
lines.push(record.task, "");
|
|
289
325
|
if (record.plan)
|
|
290
326
|
lines.push("Plan:", indent(record.plan), "");
|
|
327
|
+
if (record.evidence.length)
|
|
328
|
+
lines.push(EVIDENCE_HEADER, ...evidenceLines(record.evidence), "");
|
|
291
329
|
for (const [k, v] of trailersFor(record))
|
|
292
330
|
lines.push(`${k}: ${v}`);
|
|
331
|
+
for (const t of extraTrailers)
|
|
332
|
+
lines.push(checkTrailer(t));
|
|
293
333
|
return lines.join("\n") + "\n";
|
|
294
334
|
}
|
|
335
|
+
const TRAILER = /^([A-Za-z][A-Za-z0-9-]*): (\S.*)$/;
|
|
336
|
+
function checkTrailer(t) {
|
|
337
|
+
const m = TRAILER.exec(t.trim());
|
|
338
|
+
if (!m)
|
|
339
|
+
throw new GraftError(`Bad trailer '${t}': expected 'Key: value'.`);
|
|
340
|
+
if (/^graft-/i.test(m[1]))
|
|
341
|
+
throw new GraftError(`Trailer '${m[1]}' is reserved; Graft writes its own.`);
|
|
342
|
+
return `${m[1]}: ${m[2]}`;
|
|
343
|
+
}
|
|
344
|
+
function age(iso) {
|
|
345
|
+
const mins = Math.max(0, Math.round((Date.now() - Date.parse(iso)) / 60_000));
|
|
346
|
+
if (mins < 60)
|
|
347
|
+
return `${mins} min`;
|
|
348
|
+
const hours = Math.round(mins / 60);
|
|
349
|
+
return hours < 48 ? `${hours} h` : `${Math.round(hours / 24)} days`;
|
|
350
|
+
}
|
|
295
351
|
function indent(s) {
|
|
296
352
|
return s
|
|
297
353
|
.split("\n")
|
package/dist/graft.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graft.js","sourceRoot":"","sources":["../src/graft.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAIL,mBAAmB,EACnB,SAAS,EACT,YAAY,EACZ,UAAU,EACV,WAAW,EACX,aAAa,EACb,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAmDD,wFAAwF;AACxF,MAAM,OAAO,KAAK;IACP,GAAG,CAAM;IACD,KAAK,CAAkB;IAExC,YAAY,MAAc,OAAO,CAAC,GAAG,EAAE;QACrC,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,MAAM;QACV,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAkB;QAC5B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACrC,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,IAAI,UAAU,CAClB,6BAA6B,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,4CAA4C,CAC/F,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;YAAE,MAAM,IAAI,UAAU,CAAC,qBAAqB,CAAC,CAAC;QACpE,MAAM,MAAM,GAAiB;YAC3B,OAAO,EAAE,CAAC;YACV,EAAE,EAAE,WAAW,EAAE;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACtB,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,SAAS;YACpC,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;YAClC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,QAAQ,EAAE,EAAE;SACb,CAAC;QACF,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC/B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACrC,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY;QACxB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACxB,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,wFAAwF;IACxF,KAAK,CAAC,eAAe,CAAC,OAAe,EAAE,KAAc;QACnD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC1D,MAAM,EAAE,GAAa;YACnB,IAAI,EAAE,SAAS;YACf,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,OAAO;YACP,QAAQ;YACR,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;YAChC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC;YACzB,KAAK;SACN,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvB,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,+EAA+E;IAC/E,KAAK,CAAC,YAAY,CAAC,IAAY,EAAE,KAAc;QAC7C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,MAAM,IAAI,UAAU,CAAC,4BAA4B,CAAC,CAAC;QACrE,MAAM,EAAE,GAAa,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC;QAC9F,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvB,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,4EAA4E;IAC5E,KAAK,CAAC,IAAI,CAAC,OAAoB,EAAE;QAC/B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACtC,IAAI,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3D,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAClF,MAAM,IAAI,UAAU,CAClB,sFAAsF,CACvF,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QAChD,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,UAAU,CAAC,sDAAsD,CAAC,CAAC;QAC/E,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACpE,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAE,CAAC;QACxC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE;YAClF,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI;SAC5C,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACzB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,IAAI,CAAC,OAA6C,EAAE;QACxD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC3C,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,IAAI,GAA4B;YACpC,CAAC,kBAAkB,EAAE,SAAS,CAAC;YAC/B,CAAC,mBAAmB,EAAE,WAAW,CAAC;YAClC,CAAC,qBAAqB,EAAE,MAAM,CAAC;YAC/B,CAAC,sBAAsB,EAAE,MAAM,CAAC;SACjC,CAAC;QACF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;gBAC1C,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC3C,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QAC3D,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;YAC7C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,MAAM,QAAQ,CAAC,CAAC;YACnE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAChC,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,MAAM,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC3E,UAAU,CAAC,IAAI,CAAC,UAAU,MAAM,QAAQ,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QAED,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACnC,IAAI,IAAI,CAAC,KAAK;gBAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC9E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,GAAG,CAAC;YAChE,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3D,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YAC5E,aAAa,GAAG,IAAI,CAAC;QACvB,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,IAAI,SAAS,EAAE,CAAC;IAC9E,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,CAAC,OAA4C,EAAE;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,UAAU,CAAC,uEAAuE,CAAC,CAAC;QAC3G,MAAM,MAAM,GAAG,oBAAoB,MAAM,EAAE,CAAC;QAC5C,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,SAAS,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC;YACvE,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,6EAA6E;YAC7E,IAAI,CAAC,8CAA8C,CAAC,IAAI,CAAE,GAAa,CAAC,OAAO,CAAC;gBAAE,MAAM,GAAG,CAAC;QAC9F,CAAC;QACD,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;YAC3D,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;YACxD,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;YACpG,CAAC;YACD,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;QACD,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YAC7D,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC;YACxE,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC7C,CAAC;IAED,yFAAyF;IACzF,KAAK,CAAC,GAAG,CAAC,OAAgD,EAAE;QAC1D,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAAE,OAAO,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAC7B,KAAK;YACL,eAAe,KAAK,EAAE;YACtB,2CAA2C;SAC5C,CAAC,CAAC;QACH,MAAM,OAAO,GAAe,EAAE,CAAC;QAC/B,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;gBAAE,SAAS;YAC5B,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC7F,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YAC3C,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC;gBAAE,SAAS;YAC/D,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAClF,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,8CAA8C;IAC9C,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,YAAY,CAAC,MAAM,KAAK,GAAG,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC;YAC3G,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAClC,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YACzB,GAAG,GAAG,MAAM,CAAC;QACf,CAAC;QACD,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC;QAC/E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,CAC5C,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,iCAAiC,EAAE,GAAG,CAAC,CAAC,CAC1E,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAChB,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAC3C,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;IACpG,CAAC;IAED,6GAA6G;IAC7G,KAAK,CAAC,IAAI,CAAC,MAAc;QACvB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IACpG,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,MAAc;QACnC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;YAChF,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiB,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,GAAW;QACjC,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,GAAW;QACpC,IAAI,CAAC;YACH,OAAO,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACxF,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,GAAW;QACjC,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;QAClE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,aAAa;QACzB,MAAM,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7E,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,OAAO,QAAQ,CAAC;QAChD,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC5B,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,UAAU,CAAC,oDAAoD,CAAC,CAAC;QACtF,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAoB,EAAE,KAAc;IACrE,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3E,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACzD,IAAI,MAAM,CAAC,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9D,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACnE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC;AAED,SAAS,MAAM,CAAC,CAAS;IACvB,OAAO,CAAC;SACL,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAC9B,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,OAA+B;IACpD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACxB,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,GAAG,CAAC,YAAY,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,SAAS,CAAC,CAAC;IAC3G,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,eAAe,IAAI,SAAS,CAAC;IACpF,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAChG,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC/B,CAAC;AAED,SAAS,SAAS,CAAC,CAAS;IAC1B,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,mBAAmB;QAAE,OAAO,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,mBAAmB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC5E,OAAO,uBAAuB,GAAG,IAAI,CAAC;AACxC,CAAC;AAED,SAAS,QAAQ,CAAC,OAAe,EAAE,GAAW;IAC5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QACxG,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5E,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAChH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
1
|
+
{"version":3,"file":"graft.js","sourceRoot":"","sources":["../src/graft.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAIL,mBAAmB,EACnB,SAAS,EACT,YAAY,EACZ,UAAU,EACV,WAAW,EACX,aAAa,EACb,kBAAkB,EAClB,aAAa,EACb,eAAe,EACf,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAqB,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAqED,wFAAwF;AACxF,MAAM,OAAO,KAAK;IACP,GAAG,CAAM;IACD,KAAK,CAAkB;IAExC,YAAY,MAAc,OAAO,CAAC,GAAG,EAAE;QACrC,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,MAAM;QACV,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAkB;QAC5B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACrC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAC1B,MAAM,IAAI,UAAU,CAClB,6BAA6B,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,YAAY,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS;gBACxF,6DAA6D,CAChE,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;YAAE,MAAM,IAAI,UAAU,CAAC,qBAAqB,CAAC,CAAC;QACpE,MAAM,MAAM,GAAiB;YAC3B,OAAO,EAAE,CAAC;YACV,EAAE,EAAE,WAAW,EAAE;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACtB,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,SAAS;YACpC,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;YAClC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,QAAQ,EAAE,EAAE;SACb,CAAC;QACF,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC/B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACrC,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY;QACxB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACxB,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,wFAAwF;IACxF,KAAK,CAAC,eAAe,CAAC,OAAe,EAAE,KAAc;QACnD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC1D,MAAM,EAAE,GAAa;YACnB,IAAI,EAAE,SAAS;YACf,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,OAAO;YACP,QAAQ;YACR,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;YAChC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACjC,KAAK;SACN,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvB,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,+EAA+E;IAC/E,KAAK,CAAC,YAAY,CAAC,IAAY,EAAE,KAAc;QAC7C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,MAAM,IAAI,UAAU,CAAC,4BAA4B,CAAC,CAAC;QACrE,MAAM,EAAE,GAAa,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;QACtG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvB,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,4EAA4E;IAC5E,KAAK,CAAC,IAAI,CAAC,OAAoB,EAAE;QAC/B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACtC,IAAI,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3D,IAAI,MAAM,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YACpD,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,UAAU,CAClB,sFAAsF,CACvF,CAAC;YACJ,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC;YACnF,IAAI,MAAM,CAAC,eAAe,KAAK,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC;gBACpD,MAAM,IAAI,UAAU,CAClB,2EAA2E;oBACzE,gEAAgE,CACnE,CAAC;YACJ,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM;YAAE,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACzE,IAAI,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;QAC5C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,UAAU,CAAC,mEAAmE,CAAC,CAAC;QAC5F,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;QACpF,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YAChD,MAAM,IAAI,UAAU,CAClB,yDAAyD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;gBAChF,qFAAqF,CACxF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpE,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACpE,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAE,CAAC;QACxC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE;YAClF,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI;SAC5C,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACzB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,IAAI,CAAC,OAA+D,EAAE;QAC1E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC3C,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,IAAI,GAA4B;YACpC,CAAC,kBAAkB,EAAE,SAAS,CAAC;YAC/B,CAAC,mBAAmB,EAAE,WAAW,CAAC;YAClC,CAAC,qBAAqB,EAAE,MAAM,CAAC;YAC/B,CAAC,sBAAsB,EAAE,MAAM,CAAC;SACjC,CAAC;QACF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;gBAC1C,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC3C,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QAC3D,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;YAC7C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,MAAM,QAAQ,CAAC,CAAC;YACnE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAChC,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,MAAM,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC3E,UAAU,CAAC,IAAI,CAAC,UAAU,MAAM,QAAQ,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QAED,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACnC,IAAI,IAAI,CAAC,KAAK;gBAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC9E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,GAAG,CAAC;YAChE,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3D,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YAC5E,aAAa,GAAG,IAAI,CAAC;QACvB,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACtF,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,EAAE,CAAC;IACtF,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,CAAC,OAA4C,EAAE;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,UAAU,CAAC,uEAAuE,CAAC,CAAC;QAC3G,MAAM,MAAM,GAAG,oBAAoB,MAAM,EAAE,CAAC;QAC5C,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,SAAS,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC;YACvE,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,6EAA6E;YAC7E,IAAI,CAAC,8CAA8C,CAAC,IAAI,CAAE,GAAa,CAAC,OAAO,CAAC;gBAAE,MAAM,GAAG,CAAC;QAC9F,CAAC;QACD,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;YAC3D,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;YACxD,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;YACpG,CAAC;YACD,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;QACD,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI,SAA6B,CAAC;QAClC,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YAC7D,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC;gBACxE,MAAM,GAAG,IAAI,CAAC;YAChB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,qEAAqE;gBACrE,uEAAuE;gBACvE,SAAS,GAAI,GAAa,CAAC,OAAO,CAAC;YACrC,CAAC;QACH,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACxD,CAAC;IAED,yFAAyF;IACzF,KAAK,CAAC,GAAG,CAAC,OAAgD,EAAE;QAC1D,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAAE,OAAO,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAC7B,KAAK;YACL,eAAe,KAAK,EAAE;YACtB,2CAA2C;SAC5C,CAAC,CAAC;QACH,MAAM,OAAO,GAAe,EAAE,CAAC;QAC/B,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;gBAAE,SAAS;YAC5B,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC7F,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YAC3C,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC;gBAAE,SAAS;YAC/D,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;QAChI,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,8CAA8C;IAC9C,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,YAAY,CAAC,MAAM,KAAK,GAAG,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC;YAC3G,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAClC,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YACzB,GAAG,GAAG,MAAM,CAAC;QACf,CAAC;QACD,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC;QAC/E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,CAC5C,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,iCAAiC,EAAE,GAAG,CAAC,CAAC,CAC1E,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAChB,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAC3C,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC;IAC3H,CAAC;IAED,6GAA6G;IAC7G,KAAK,CAAC,IAAI,CAAC,MAAc;QACvB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IACpG,CAAC;IAED,oFAAoF;IAC5E,KAAK,CAAC,UAAU,CACtB,MAAc,EACd,OAAe,EACf,UAAkB;QAElB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;QAC9F,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,IAAI;YAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;QACxD,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACvD,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IAC7F,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,MAAc;QACnC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;YAChF,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiB,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,GAAW;QACjC,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,GAAW;QACpC,IAAI,CAAC;YACH,OAAO,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACxF,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,GAAW;QACjC,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;QAClE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,aAAa;QACzB,MAAM,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7E,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,OAAO,QAAQ,CAAC;QAChD,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC5B,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,UAAU,CAAC,oDAAoD,CAAC,CAAC;QACtF,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAoB,EAAE,KAAc,EAAE,gBAA0B,EAAE;IACnG,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3E,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACzD,IAAI,MAAM,CAAC,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9D,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/F,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACnE,KAAK,MAAM,CAAC,IAAI,aAAa;QAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC;AAED,MAAM,OAAO,GAAG,mCAAmC,CAAC;AAEpD,SAAS,YAAY,CAAC,CAAS;IAC7B,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACjC,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,gBAAgB,CAAC,2BAA2B,CAAC,CAAC;IAC3E,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC;IACxG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,GAAG,CAAC,GAAW;IACtB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAC9E,IAAI,IAAI,GAAG,EAAE;QAAE,OAAO,GAAG,IAAI,MAAM,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IACpC,OAAO,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC;AACtE,CAAC;AAED,SAAS,MAAM,CAAC,CAAS;IACvB,OAAO,CAAC;SACL,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAC9B,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,OAA+B;IACpD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACxB,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,GAAG,CAAC,YAAY,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,SAAS,CAAC,CAAC;IAC3G,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,eAAe,IAAI,SAAS,CAAC;IACpF,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAChG,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC/B,CAAC;AAED,SAAS,SAAS,CAAC,CAAS;IAC1B,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,mBAAmB;QAAE,OAAO,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,mBAAmB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC5E,OAAO,uBAAuB,GAAG,IAAI,CAAC;AACxC,CAAC;AAED,SAAS,QAAQ,CAAC,OAAe,EAAE,GAAW;IAC5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QACxG,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5E,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAChH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,3 +2,5 @@ export { Graft, GraftError, buildCommitMessage } from "./graft.js";
|
|
|
2
2
|
export type { InitResult, LandOptions, LandedChange, LogEntry, StartOptions, SyncResult } from "./graft.js";
|
|
3
3
|
export * from "./policy.js";
|
|
4
4
|
export * from "./record.js";
|
|
5
|
+
export * from "./redact.js";
|
|
6
|
+
export * from "./agents.js";
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEnE,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEnE,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
|
package/dist/policy.d.ts
CHANGED
|
@@ -4,8 +4,18 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export interface Policy {
|
|
6
6
|
version: 1;
|
|
7
|
-
/**
|
|
8
|
-
|
|
7
|
+
/**
|
|
8
|
+
* Refuse to land a change that has no evidence. Default true. "command"
|
|
9
|
+
* is stricter: at least one recorded command must have exited 0, so a note
|
|
10
|
+
* alone ("checked it") does not satisfy the gate.
|
|
11
|
+
*/
|
|
12
|
+
requireEvidence: boolean | "command";
|
|
13
|
+
/**
|
|
14
|
+
* Extra files that must not be landed without --allow-secrets, as globs
|
|
15
|
+
* relative to the repo root ("nova.json", "config/*.secret", "keys/**").
|
|
16
|
+
* Added to the built-in list (.env, *.pem, ...).
|
|
17
|
+
*/
|
|
18
|
+
secretFiles?: string[];
|
|
9
19
|
}
|
|
10
20
|
export declare const DEFAULT_POLICY: Policy;
|
|
11
21
|
export declare const POLICY_PATH = ".graft/policy.json";
|
package/dist/policy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAsBjC,MAAM,CAAC,MAAM,cAAc,GAAW,EAAE,OAAO,EAAE,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;AAE5E,MAAM,CAAC,MAAM,WAAW,GAAG,oBAAoB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAoB,CAAC;QAClD,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;YACzD,MAAM,IAAI,KAAK,CAAC,8BAA8B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,WAAW,EAAE,CAAC,CAAC;QAC5F,CAAC;QACD,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IACtD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,cAAc,CAAC;QAC5E,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
|
package/dist/record.d.ts
CHANGED
|
@@ -18,7 +18,11 @@ export interface ChangeRecord {
|
|
|
18
18
|
landedAt?: string;
|
|
19
19
|
/** Evidence collected while the change was open. */
|
|
20
20
|
evidence: Evidence[];
|
|
21
|
-
/**
|
|
21
|
+
/**
|
|
22
|
+
* Commit SHA this record was first landed on. Informational: the note follows
|
|
23
|
+
* the commit through amend and rebase, so after a rewrite this names the
|
|
24
|
+
* original SHA, not the one the note is now attached to.
|
|
25
|
+
*/
|
|
22
26
|
commit?: string;
|
|
23
27
|
}
|
|
24
28
|
export interface ChangeAuthor {
|
|
@@ -67,3 +71,22 @@ export declare function parseTrailers(message: string): Record<string, string>;
|
|
|
67
71
|
export declare function oneLine(s: string): string;
|
|
68
72
|
/** The notes ref where full records live. */
|
|
69
73
|
export declare const NOTES_REF = "refs/notes/graft";
|
|
74
|
+
/** Header of the evidence section written into the commit message body. */
|
|
75
|
+
export declare const EVIDENCE_HEADER = "Evidence:";
|
|
76
|
+
/**
|
|
77
|
+
* The evidence list as commit-message lines: one per entry, so the record
|
|
78
|
+
* travels with the commit even when the note does not. Output stays in the
|
|
79
|
+
* note; the message carries the command, its exit code and duration.
|
|
80
|
+
*
|
|
81
|
+
* [pass] unit tests: npm test (12.3s)
|
|
82
|
+
* [fail 1] npm run lint (0.4s)
|
|
83
|
+
* [note] manually verified in browser
|
|
84
|
+
*/
|
|
85
|
+
export declare function evidenceLines(evidence: Evidence[]): string[];
|
|
86
|
+
/**
|
|
87
|
+
* Rebuild a record from a commit message alone: trailers, the Plan: block and
|
|
88
|
+
* the Evidence: block. Used when the note is missing. Command output is not in
|
|
89
|
+
* the message, so `output` is empty; timestamps fall back to `authoredAt`.
|
|
90
|
+
* Returns null when the message carries no Graft-Change trailer.
|
|
91
|
+
*/
|
|
92
|
+
export declare function parseMessageRecord(message: string, authoredAt: string): ChangeRecord | null;
|
package/dist/record.js
CHANGED
|
@@ -62,4 +62,111 @@ export function oneLine(s) {
|
|
|
62
62
|
}
|
|
63
63
|
/** The notes ref where full records live. */
|
|
64
64
|
export const NOTES_REF = "refs/notes/graft";
|
|
65
|
+
/** Header of the evidence section written into the commit message body. */
|
|
66
|
+
export const EVIDENCE_HEADER = "Evidence:";
|
|
67
|
+
const MESSAGE_LINE_CAP = 200;
|
|
68
|
+
/**
|
|
69
|
+
* The evidence list as commit-message lines: one per entry, so the record
|
|
70
|
+
* travels with the commit even when the note does not. Output stays in the
|
|
71
|
+
* note; the message carries the command, its exit code and duration.
|
|
72
|
+
*
|
|
73
|
+
* [pass] unit tests: npm test (12.3s)
|
|
74
|
+
* [fail 1] npm run lint (0.4s)
|
|
75
|
+
* [note] manually verified in browser
|
|
76
|
+
*/
|
|
77
|
+
export function evidenceLines(evidence) {
|
|
78
|
+
return evidence.map((ev) => {
|
|
79
|
+
const label = ev.label ? `${oneLine(ev.label)}: ` : "";
|
|
80
|
+
if (ev.kind === "note")
|
|
81
|
+
return ` [note] ${label}${clip(oneLine(ev.text))}`;
|
|
82
|
+
const status = ev.exitCode === 0 ? "pass" : `fail ${ev.exitCode}`;
|
|
83
|
+
return ` [${status}] ${label}${clip(oneLine(ev.command))} (${(ev.durationMs / 1000).toFixed(1)}s)`;
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
const EVIDENCE_LINE = /^\s*\[(pass|fail (-?\d+)|note)\] (.*)$/;
|
|
87
|
+
const DURATION = /^(.*) \((\d+(?:\.\d+)?)s\)$/;
|
|
88
|
+
const LABEL = /^([^:]{1,60}): (.*)$/;
|
|
89
|
+
/**
|
|
90
|
+
* Rebuild a record from a commit message alone: trailers, the Plan: block and
|
|
91
|
+
* the Evidence: block. Used when the note is missing. Command output is not in
|
|
92
|
+
* the message, so `output` is empty; timestamps fall back to `authoredAt`.
|
|
93
|
+
* Returns null when the message carries no Graft-Change trailer.
|
|
94
|
+
*/
|
|
95
|
+
export function parseMessageRecord(message, authoredAt) {
|
|
96
|
+
const trailers = parseTrailers(message);
|
|
97
|
+
const id = trailers[TRAILER_KEYS.change];
|
|
98
|
+
if (!id)
|
|
99
|
+
return null;
|
|
100
|
+
const lines = message.split("\n");
|
|
101
|
+
const plan = readBlock(lines, "Plan:");
|
|
102
|
+
const evidence = [];
|
|
103
|
+
for (const line of readBlock(lines, EVIDENCE_HEADER)?.split("\n") ?? []) {
|
|
104
|
+
const m = EVIDENCE_LINE.exec(line);
|
|
105
|
+
if (!m)
|
|
106
|
+
continue;
|
|
107
|
+
let rest = m[3];
|
|
108
|
+
let durationMs = 0;
|
|
109
|
+
if (m[1] !== "note") {
|
|
110
|
+
const d = DURATION.exec(rest);
|
|
111
|
+
if (d) {
|
|
112
|
+
rest = d[1];
|
|
113
|
+
durationMs = Math.round(Number(d[2]) * 1000);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
let label;
|
|
117
|
+
const l = LABEL.exec(rest);
|
|
118
|
+
if (l) {
|
|
119
|
+
label = l[1];
|
|
120
|
+
rest = l[2];
|
|
121
|
+
}
|
|
122
|
+
if (m[1] === "note")
|
|
123
|
+
evidence.push({ kind: "note", at: authoredAt, text: rest, label });
|
|
124
|
+
else
|
|
125
|
+
evidence.push({ kind: "command", at: authoredAt, command: rest, exitCode: m[2] ? Number(m[2]) : 0, durationMs, output: "", label });
|
|
126
|
+
}
|
|
127
|
+
const [kind, ...name] = (trailers[TRAILER_KEYS.author] ?? "human:unknown").split(":");
|
|
128
|
+
return {
|
|
129
|
+
version: 1,
|
|
130
|
+
id,
|
|
131
|
+
task: trailers[TRAILER_KEYS.task] ?? lines[0],
|
|
132
|
+
plan: plan || undefined,
|
|
133
|
+
author: {
|
|
134
|
+
kind: kind === "agent" ? "agent" : "human",
|
|
135
|
+
name: name.join(":") || "unknown",
|
|
136
|
+
model: trailers[TRAILER_KEYS.model] || undefined,
|
|
137
|
+
},
|
|
138
|
+
startedAt: authoredAt,
|
|
139
|
+
landedAt: authoredAt,
|
|
140
|
+
evidence,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* The indented lines that follow `header` on its own line. Blank lines are
|
|
145
|
+
* kept while the next non-blank line is still indented, so a multi-paragraph
|
|
146
|
+
* plan survives; the block ends at the first unindented line.
|
|
147
|
+
*/
|
|
148
|
+
function readBlock(lines, header) {
|
|
149
|
+
const start = lines.indexOf(header);
|
|
150
|
+
if (start < 0)
|
|
151
|
+
return null;
|
|
152
|
+
const body = [];
|
|
153
|
+
const rest = lines.slice(start + 1);
|
|
154
|
+
for (let i = 0; i < rest.length; i++) {
|
|
155
|
+
const line = rest[i];
|
|
156
|
+
if (!line.trim()) {
|
|
157
|
+
const next = rest.slice(i + 1).find((l) => l.trim());
|
|
158
|
+
if (!next || !next.startsWith(" "))
|
|
159
|
+
break;
|
|
160
|
+
body.push("");
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
if (!line.startsWith(" "))
|
|
164
|
+
break;
|
|
165
|
+
body.push(line.slice(2));
|
|
166
|
+
}
|
|
167
|
+
return body.join("\n");
|
|
168
|
+
}
|
|
169
|
+
function clip(s) {
|
|
170
|
+
return s.length > MESSAGE_LINE_CAP ? s.slice(0, MESSAGE_LINE_CAP - 1) + "…" : s;
|
|
171
|
+
}
|
|
65
172
|
//# sourceMappingURL=record.js.map
|
package/dist/record.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record.js","sourceRoot":"","sources":["../src/record.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"record.js","sourceRoot":"","sources":["../src/record.ts"],"names":[],"mappings":"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"}
|
package/dist/redact.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keep secrets out of records. Two cheap guards for version 1:
|
|
3
|
+
*
|
|
4
|
+
* - Evidence output and notes are scrubbed of the values of environment
|
|
5
|
+
* variables whose names look secret, since commands run with the agent's
|
|
6
|
+
* full environment and a verbose failure can echo config.
|
|
7
|
+
* - Landing refuses files whose names look like credentials, since a weak
|
|
8
|
+
* .gitignore plus "stage everything" is how a .env ends up in history.
|
|
9
|
+
*
|
|
10
|
+
* Neither is a substitute for a secret scanner; they catch the common case.
|
|
11
|
+
*/
|
|
12
|
+
/** Values of environment variables that look like secrets, longest first. */
|
|
13
|
+
export declare function secretEnvValues(env?: NodeJS.ProcessEnv): {
|
|
14
|
+
name: string;
|
|
15
|
+
value: string;
|
|
16
|
+
}[];
|
|
17
|
+
/** Replace every occurrence of a secret-looking env value with a marker naming the variable. */
|
|
18
|
+
export declare function redact(text: string, env?: NodeJS.ProcessEnv): string;
|
|
19
|
+
/**
|
|
20
|
+
* True if a path looks like it holds credentials rather than code. `extra`
|
|
21
|
+
* are repo-specific globs from policy: a pattern without a slash matches the
|
|
22
|
+
* file name anywhere in the tree, one with a slash is anchored at the root.
|
|
23
|
+
*/
|
|
24
|
+
export declare function looksLikeSecretFile(path: string, extra?: string[]): boolean;
|
|
25
|
+
/** Minimal glob: `**` spans directories, `*` and `?` stay within one segment. */
|
|
26
|
+
export declare function globToRegExp(glob: string): RegExp;
|
package/dist/redact.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keep secrets out of records. Two cheap guards for version 1:
|
|
3
|
+
*
|
|
4
|
+
* - Evidence output and notes are scrubbed of the values of environment
|
|
5
|
+
* variables whose names look secret, since commands run with the agent's
|
|
6
|
+
* full environment and a verbose failure can echo config.
|
|
7
|
+
* - Landing refuses files whose names look like credentials, since a weak
|
|
8
|
+
* .gitignore plus "stage everything" is how a .env ends up in history.
|
|
9
|
+
*
|
|
10
|
+
* Neither is a substitute for a secret scanner; they catch the common case.
|
|
11
|
+
*/
|
|
12
|
+
// Names that hold a secret, not names that merely mention auth: AUTH_SERVER_URI
|
|
13
|
+
// is a public address, AUTH_TOKEN is caught by TOKEN.
|
|
14
|
+
const SECRET_ENV_NAME = /(SECRET|TOKEN|PASSWORD|PASSWD|API_?KEY|PRIVATE_?KEY|ACCESS_?KEY|SIGNING_?KEY|CREDENTIALS?)(_|$)/i;
|
|
15
|
+
const MIN_SECRET_LENGTH = 8;
|
|
16
|
+
/** Values of environment variables that look like secrets, longest first. */
|
|
17
|
+
export function secretEnvValues(env = process.env) {
|
|
18
|
+
const found = [];
|
|
19
|
+
for (const [name, value] of Object.entries(env)) {
|
|
20
|
+
if (!value || value.length < MIN_SECRET_LENGTH)
|
|
21
|
+
continue;
|
|
22
|
+
if (!SECRET_ENV_NAME.test(name))
|
|
23
|
+
continue;
|
|
24
|
+
found.push({ name, value });
|
|
25
|
+
}
|
|
26
|
+
return found.sort((a, b) => b.value.length - a.value.length);
|
|
27
|
+
}
|
|
28
|
+
/** Replace every occurrence of a secret-looking env value with a marker naming the variable. */
|
|
29
|
+
export function redact(text, env = process.env) {
|
|
30
|
+
let out = text;
|
|
31
|
+
for (const { name, value } of secretEnvValues(env)) {
|
|
32
|
+
out = out.split(value).join(`[redacted ${name}]`);
|
|
33
|
+
}
|
|
34
|
+
return out;
|
|
35
|
+
}
|
|
36
|
+
const SECRET_FILE_PATTERNS = [
|
|
37
|
+
/(^|\/)\.env(\.[^/]*)?$/, // .env, .env.local, .env.production
|
|
38
|
+
/\.(pem|key|p12|pfx|jks|keystore)$/i,
|
|
39
|
+
/(^|\/)id_(rsa|dsa|ecdsa|ed25519)(\.pub)?$/,
|
|
40
|
+
/(^|\/)(credentials|service-account[^/]*)\.json$/i,
|
|
41
|
+
/(^|\/)\.(npmrc|pypirc|netrc)$/,
|
|
42
|
+
];
|
|
43
|
+
/**
|
|
44
|
+
* True if a path looks like it holds credentials rather than code. `extra`
|
|
45
|
+
* are repo-specific globs from policy: a pattern without a slash matches the
|
|
46
|
+
* file name anywhere in the tree, one with a slash is anchored at the root.
|
|
47
|
+
*/
|
|
48
|
+
export function looksLikeSecretFile(path, extra = []) {
|
|
49
|
+
const p = path.replace(/\\/g, "/");
|
|
50
|
+
if (/(^|\/)\.env\.(example|sample|template)$/.test(p))
|
|
51
|
+
return false;
|
|
52
|
+
return SECRET_FILE_PATTERNS.some((re) => re.test(p)) || extra.some((g) => globToRegExp(g).test(p));
|
|
53
|
+
}
|
|
54
|
+
/** Minimal glob: `**` spans directories, `*` and `?` stay within one segment. */
|
|
55
|
+
export function globToRegExp(glob) {
|
|
56
|
+
const body = glob
|
|
57
|
+
.replace(/[.+^${}()|[\]\\]/g, "\\$&")
|
|
58
|
+
.replace(/\*\*\/?/g, "\u0000")
|
|
59
|
+
.replace(/\*/g, "[^/]*")
|
|
60
|
+
.replace(/\?/g, "[^/]")
|
|
61
|
+
.replace(/\u0000/g, "(?:.*/)?");
|
|
62
|
+
return new RegExp(glob.includes("/") ? `^${body}$` : `(^|/)${body}$`);
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=redact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact.js","sourceRoot":"","sources":["../src/redact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,gFAAgF;AAChF,sDAAsD;AACtD,MAAM,eAAe,GAAG,kGAAkG,CAAC;AAC3H,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAE5B,6EAA6E;AAC7E,MAAM,UAAU,eAAe,CAAC,MAAyB,OAAO,CAAC,GAAG;IAClE,MAAM,KAAK,GAAsC,EAAE,CAAC;IACpD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,iBAAiB;YAAE,SAAS;QACzD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QAC1C,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC/D,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,MAAM,CAAC,IAAY,EAAE,MAAyB,OAAO,CAAC,GAAG;IACvE,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,KAAK,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;QACnD,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,IAAI,GAAG,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,oBAAoB,GAAa;IACrC,wBAAwB,EAAE,oCAAoC;IAC9D,oCAAoC;IACpC,2CAA2C;IAC3C,kDAAkD;IAClD,+BAA+B;CAChC,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,QAAkB,EAAE;IACpE,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACnC,IAAI,yCAAyC,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACpE,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACrG,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,IAAI,GAAG,IAAI;SACd,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC;SACpC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC;SAC7B,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC;SACvB,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;SACtB,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAClC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC;AACxE,CAAC"}
|