@nanonets/graft 0.19.0 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -4
- package/dist/app/history.d.ts +1 -1
- package/dist/app/history.d.ts.map +1 -1
- package/dist/app/history.js +7 -1
- package/dist/app/history.js.map +1 -1
- package/dist/ask/ask.js +1 -1
- package/dist/brain/claude-md.d.ts +59 -0
- package/dist/brain/claude-md.d.ts.map +1 -0
- package/dist/brain/claude-md.js +170 -0
- package/dist/brain/claude-md.js.map +1 -0
- package/dist/brain/connect.d.ts +3 -3
- package/dist/brain/connect.js +7 -7
- package/dist/brain/link.d.ts +1 -1
- package/dist/brain/link.js +1 -1
- package/dist/brain/push.d.ts +29 -1
- package/dist/brain/push.d.ts.map +1 -1
- package/dist/brain/push.js +80 -2
- package/dist/brain/push.js.map +1 -1
- package/dist/brain/signup.js +4 -4
- package/dist/brain/watch.d.ts +1 -1
- package/dist/claude/init.d.ts.map +1 -1
- package/dist/claude/init.js +3 -1
- package/dist/claude/init.js.map +1 -1
- package/dist/cli.js +130 -27
- package/dist/cli.js.map +1 -1
- package/dist/legacy-args.d.ts +12 -0
- package/dist/legacy-args.d.ts.map +1 -0
- package/dist/legacy-args.js +31 -0
- package/dist/legacy-args.js.map +1 -0
- package/dist/telemetry/contract.d.ts +1 -1
- package/dist/telemetry/contract.js +2 -2
- package/dist/upkeep.d.ts +1 -1
- package/dist/upkeep.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
<img src="https://img.shields.io/badge/License-MIT-20C997?style=for-the-badge" />
|
|
18
18
|
<a href="TELEMETRY.md"><img src="https://img.shields.io/badge/telemetry-anonymous%2C%20opt--out-546FFF?style=for-the-badge" /></a>
|
|
19
19
|
<a href="https://scorecard.dev/viewer/?uri=github.com/NanoNets/Graft"><img src="https://img.shields.io/ossf-scorecard/github.com/NanoNets/Graft?style=for-the-badge&label=openssf%20scorecard" /></a>
|
|
20
|
-
<a href="https://app.trailhq.com/get-started?step=
|
|
20
|
+
<a href="https://app.trailhq.com/get-started?step=repo"><img src="https://img.shields.io/badge/Trail-try%20it-E5484D?style=for-the-badge&logoColor=white" /></a>
|
|
21
21
|
</p>
|
|
22
22
|
|
|
23
23
|
### Up to **4× cheaper** and **3× faster**, with better or no loss of correctness.
|
|
@@ -32,12 +32,17 @@
|
|
|
32
32
|
</div>
|
|
33
33
|
|
|
34
34
|
<p align="center">
|
|
35
|
-
<b>
|
|
36
|
-
|
|
35
|
+
<b>Stop repeating yourself to your coding agent.</b><br/>
|
|
36
|
+
You correct it, and by the next session it has forgotten. Trail manages your CLAUDE.md and AGENTS.md so it doesn't.
|
|
37
37
|
</p>
|
|
38
38
|
|
|
39
39
|
<p align="center">
|
|
40
|
-
|
|
40
|
+
• Every correction you make becomes a rule your agent keeps.<br/>
|
|
41
|
+
• The ones that can't break get a hook that blocks it, not a note it ignores.
|
|
42
|
+
</p>
|
|
43
|
+
|
|
44
|
+
<p align="center">
|
|
45
|
+
<a href="https://app.trailhq.com/get-started?step=repo"><img src="https://img.shields.io/badge/Try%20it%20on%20your%20repo%20%E2%86%92-E5484D?style=for-the-badge" alt="Try it on your repo" height="34"/></a>
|
|
41
46
|
</p>
|
|
42
47
|
|
|
43
48
|
<p align="center">
|
package/dist/app/history.d.ts
CHANGED
|
@@ -87,7 +87,7 @@ export declare function readCommits(root: string, max?: number): HistoryCommit[]
|
|
|
87
87
|
* Bot comments are dropped. A CI bot posting a coverage table is the single
|
|
88
88
|
* largest source of text in a busy repo's threads and it establishes nothing.
|
|
89
89
|
*/
|
|
90
|
-
export declare function readThreads(owner: string, repo: string, token: string, fetchImpl: Fetch, api?: string, max?: number): Promise<HistoryThread[]>;
|
|
90
|
+
export declare function readThreads(owner: string, repo: string, token: string, fetchImpl: Fetch, api?: string, max?: number, known?: ReadonlyMap<number, HistoryThread>): Promise<HistoryThread[]>;
|
|
91
91
|
/**
|
|
92
92
|
* Exported symbols from the graph, with the body hash that makes an anchored
|
|
93
93
|
* rule self-invalidating.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/app/history.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAa,KAAK,KAAK,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,yCAAyC;AACzC,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,qCAAqC;AACrC,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClD;AAED,0DAA0D;AAC1D,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,6CAA6C;AAC7C,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACnG,OAAO,EAAE,KAAK,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAClD,CAAC,CAAC;IACH,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB;;8EAE0E;IAC1E,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;CACvB;AAuBD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAc,GAAG,aAAa,EAAE,CA0B5E;AAuBD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,KAAK,EAChB,GAAG,SAA2B,EAC9B,GAAG,SAAc,
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/app/history.ts"],"names":[],"mappings":"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"}
|
package/dist/app/history.js
CHANGED
|
@@ -93,7 +93,10 @@ const THREAD_FETCH_CONCURRENCY = 8;
|
|
|
93
93
|
* Bot comments are dropped. A CI bot posting a coverage table is the single
|
|
94
94
|
* largest source of text in a busy repo's threads and it establishes nothing.
|
|
95
95
|
*/
|
|
96
|
-
export async function readThreads(owner, repo, token, fetchImpl, api = "https://api.github.com", max = MAX_THREADS
|
|
96
|
+
export async function readThreads(owner, repo, token, fetchImpl, api = "https://api.github.com", max = MAX_THREADS,
|
|
97
|
+
// Threads already read (the early upload's newest ones), reused rather than
|
|
98
|
+
// fetched a second time.
|
|
99
|
+
known = new Map()) {
|
|
97
100
|
const headers = ghHeaders(token);
|
|
98
101
|
const pulls = [];
|
|
99
102
|
// 100 per page, up to the cap. Sorted by GitHub as most-recently-updated,
|
|
@@ -116,6 +119,9 @@ export async function readThreads(owner, repo, token, fetchImpl, api = "https://
|
|
|
116
119
|
for (let i = 0; i < candidates.length; i += THREAD_FETCH_CONCURRENCY) {
|
|
117
120
|
const slice = candidates.slice(i, i + THREAD_FETCH_CONCURRENCY);
|
|
118
121
|
const fetched = await Promise.all(slice.map(async (p) => {
|
|
122
|
+
const seen = known.get(p.number);
|
|
123
|
+
if (seen)
|
|
124
|
+
return seen;
|
|
119
125
|
const [issueComments, reviewComments] = await Promise.all([
|
|
120
126
|
readComments(`${api}/repos/${owner}/${repo}/issues/${p.number}/comments`, headers, fetchImpl),
|
|
121
127
|
readComments(`${api}/repos/${owner}/${repo}/pulls/${p.number}/comments`, headers, fetchImpl),
|
package/dist/app/history.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/app/history.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/app/history.ts"],"names":[],"mappings":"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"}
|
package/dist/ask/ask.js
CHANGED
|
@@ -1094,7 +1094,7 @@ export function ask(dir, query, opts = {}) {
|
|
|
1094
1094
|
result.saved = baselineFor(result.hits, corpus.graph);
|
|
1095
1095
|
// What the team decided about the code this pack just inlined. Read from the
|
|
1096
1096
|
// local cache only — `ask` is on the agent's hot path and must never wait on
|
|
1097
|
-
// the network; `graft
|
|
1097
|
+
// the network; `graft trail pull` and `init` are what refresh it.
|
|
1098
1098
|
const applied = attachBrainRules(root, result.hits, corpus.graph);
|
|
1099
1099
|
if (applied.length)
|
|
1100
1100
|
result.rules = applied;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `graft claude-md pull`: write the CLAUDE.md changes accepted in Trail into
|
|
3
|
+
* this checkout's instruction file.
|
|
4
|
+
*
|
|
5
|
+
* Trail compares the repository's CLAUDE.md with what its history says and
|
|
6
|
+
* suggests edits and new sections; a person accepts some of them on the brain's
|
|
7
|
+
* CLAUDE.md page. This fetches the accepted ones, applies them to the local
|
|
8
|
+
* file, and tells Trail which it wrote so the page stops listing them.
|
|
9
|
+
*
|
|
10
|
+
* The file is edited line by line, never regenerated, so everything a change
|
|
11
|
+
* does not touch comes back byte for byte. An edit whose text is no longer in
|
|
12
|
+
* its section means the local file has moved on since Trail read it; that
|
|
13
|
+
* change is reported and left, never guessed at. Same rules as Trail's own
|
|
14
|
+
* ComposeClaudeMd, which is what the page's preview shows.
|
|
15
|
+
*/
|
|
16
|
+
import { type BrainLink } from "./link.js";
|
|
17
|
+
/** One accepted change, as Trail sends it. */
|
|
18
|
+
export interface ClaudeMdChange {
|
|
19
|
+
id: string;
|
|
20
|
+
kind: "edit" | "add";
|
|
21
|
+
/** edit: the section it rewrites. add: the new section's heading. */
|
|
22
|
+
heading: string;
|
|
23
|
+
/** add: the section it goes after; "" = end of file. */
|
|
24
|
+
after_heading?: string;
|
|
25
|
+
/** edit: the text to replace; "" = append to the section. */
|
|
26
|
+
find?: string;
|
|
27
|
+
text: string;
|
|
28
|
+
reason?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface ClaudeMdPull {
|
|
31
|
+
/** The file Trail read, e.g. "CLAUDE.md"; "" when the repo had none. */
|
|
32
|
+
path: string;
|
|
33
|
+
head_sha: string;
|
|
34
|
+
changes: ClaudeMdChange[];
|
|
35
|
+
}
|
|
36
|
+
export interface ApplyResult {
|
|
37
|
+
text: string;
|
|
38
|
+
/** Written by this pull. */
|
|
39
|
+
written: ClaudeMdChange[];
|
|
40
|
+
/** Already in the file (committed by someone else): nothing to write. */
|
|
41
|
+
present: ClaudeMdChange[];
|
|
42
|
+
/** Could not be placed; the file was left as it is for these. */
|
|
43
|
+
skipped: Array<{
|
|
44
|
+
change: ClaudeMdChange;
|
|
45
|
+
why: string;
|
|
46
|
+
}>;
|
|
47
|
+
}
|
|
48
|
+
/** GET /api/public/brains/:id/claude-md — the accepted changes. */
|
|
49
|
+
export declare function fetchAcceptedChanges(link: BrainLink, fetchImpl?: typeof fetch): Promise<ClaudeMdPull | {
|
|
50
|
+
error: string;
|
|
51
|
+
}>;
|
|
52
|
+
/** POST /api/public/brains/:id/claude-md/applied — what this pull wrote. */
|
|
53
|
+
export declare function markApplied(link: BrainLink, ids: string[], fetchImpl?: typeof fetch): Promise<boolean>;
|
|
54
|
+
/**
|
|
55
|
+
* Apply accepted changes to the file's text. Pure: reads nothing, writes
|
|
56
|
+
* nothing, so the command and the tests share it.
|
|
57
|
+
*/
|
|
58
|
+
export declare function applyChanges(original: string, changes: ClaudeMdChange[]): ApplyResult;
|
|
59
|
+
//# sourceMappingURL=claude-md.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-md.d.ts","sourceRoot":"","sources":["../../src/brain/claude-md.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAEvD,8CAA8C;AAC9C,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,yEAAyE;IACzE,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,iEAAiE;IACjE,OAAO,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,cAAc,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACzD;AAED,mEAAmE;AACnE,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,SAAS,EACf,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,YAAY,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAiB3C;AAED,4EAA4E;AAC5E,wBAAsB,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,SAAS,GAAE,OAAO,KAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAsBnH;AAgDD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,WAAW,CAgErF"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `graft claude-md pull`: write the CLAUDE.md changes accepted in Trail into
|
|
3
|
+
* this checkout's instruction file.
|
|
4
|
+
*
|
|
5
|
+
* Trail compares the repository's CLAUDE.md with what its history says and
|
|
6
|
+
* suggests edits and new sections; a person accepts some of them on the brain's
|
|
7
|
+
* CLAUDE.md page. This fetches the accepted ones, applies them to the local
|
|
8
|
+
* file, and tells Trail which it wrote so the page stops listing them.
|
|
9
|
+
*
|
|
10
|
+
* The file is edited line by line, never regenerated, so everything a change
|
|
11
|
+
* does not touch comes back byte for byte. An edit whose text is no longer in
|
|
12
|
+
* its section means the local file has moved on since Trail read it; that
|
|
13
|
+
* change is reported and left, never guessed at. Same rules as Trail's own
|
|
14
|
+
* ComposeClaudeMd, which is what the page's preview shows.
|
|
15
|
+
*/
|
|
16
|
+
import { baseUrlFor } from "./link.js";
|
|
17
|
+
/** GET /api/public/brains/:id/claude-md — the accepted changes. */
|
|
18
|
+
export async function fetchAcceptedChanges(link, fetchImpl = fetch) {
|
|
19
|
+
const url = `${baseUrlFor(link)}/api/public/brains/${encodeURIComponent(link.brainId)}/claude-md`;
|
|
20
|
+
try {
|
|
21
|
+
const res = await fetchImpl(url, {
|
|
22
|
+
headers: { authorization: `Bearer ${link.token}`, accept: "application/json" },
|
|
23
|
+
signal: AbortSignal.timeout(15_000),
|
|
24
|
+
});
|
|
25
|
+
const body = await res.text();
|
|
26
|
+
if (res.status === 404 || res.status === 503) {
|
|
27
|
+
return { error: "this brain has no CLAUDE.md suggestions yet — its Trail may be older than the feature" };
|
|
28
|
+
}
|
|
29
|
+
if (!res.ok)
|
|
30
|
+
return { error: `Trail refused the pull: ${res.status} ${body.slice(0, 200)}` };
|
|
31
|
+
const parsed = JSON.parse(body);
|
|
32
|
+
return { path: parsed.path ?? "", head_sha: parsed.head_sha ?? "", changes: parsed.changes ?? [] };
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
return { error: `could not reach Trail: ${e instanceof Error ? e.message : e}` };
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/** POST /api/public/brains/:id/claude-md/applied — what this pull wrote. */
|
|
39
|
+
export async function markApplied(link, ids, fetchImpl = fetch) {
|
|
40
|
+
if (ids.length === 0)
|
|
41
|
+
return true;
|
|
42
|
+
const url = `${baseUrlFor(link)}/api/public/brains/${encodeURIComponent(link.brainId)}/claude-md/applied`;
|
|
43
|
+
try {
|
|
44
|
+
// Trail takes at most 100 per request.
|
|
45
|
+
for (let i = 0; i < ids.length; i += 100) {
|
|
46
|
+
const res = await fetchImpl(url, {
|
|
47
|
+
method: "POST",
|
|
48
|
+
headers: {
|
|
49
|
+
authorization: `Bearer ${link.token}`,
|
|
50
|
+
"content-type": "application/json",
|
|
51
|
+
accept: "application/json",
|
|
52
|
+
},
|
|
53
|
+
body: JSON.stringify({ ids: ids.slice(i, i + 100) }),
|
|
54
|
+
signal: AbortSignal.timeout(15_000),
|
|
55
|
+
});
|
|
56
|
+
if (!res.ok)
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const HEADING = /^(#{1,6})\s+(.+?)\s*#*\s*$/;
|
|
66
|
+
/** Every ATX heading outside code fences, with the lines it owns. */
|
|
67
|
+
function sectionsOf(lines) {
|
|
68
|
+
const heads = [];
|
|
69
|
+
let fence = false;
|
|
70
|
+
lines.forEach((ln, i) => {
|
|
71
|
+
const t = ln.trim();
|
|
72
|
+
if (t.startsWith("```") || t.startsWith("~~~")) {
|
|
73
|
+
fence = !fence;
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (fence)
|
|
77
|
+
return;
|
|
78
|
+
const m = HEADING.exec(ln);
|
|
79
|
+
if (m)
|
|
80
|
+
heads.push({ line: i, level: m[1].length, title: m[2].trim() });
|
|
81
|
+
});
|
|
82
|
+
return heads.map((h, i) => {
|
|
83
|
+
let end = lines.length;
|
|
84
|
+
for (let j = i + 1; j < heads.length; j++) {
|
|
85
|
+
if (heads[j].level <= h.level) {
|
|
86
|
+
end = heads[j].line;
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return { title: h.title, level: h.level, head: h.line, end };
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
const norm = (s) => s.trim().toLowerCase();
|
|
94
|
+
/** Trim the blank lines a section ends with, so appended text sits under its content. */
|
|
95
|
+
function lastContentLine(lines, s) {
|
|
96
|
+
let i = s.end;
|
|
97
|
+
while (i > s.head + 1 && lines[i - 1].trim() === "")
|
|
98
|
+
i--;
|
|
99
|
+
return i;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Apply accepted changes to the file's text. Pure: reads nothing, writes
|
|
103
|
+
* nothing, so the command and the tests share it.
|
|
104
|
+
*/
|
|
105
|
+
export function applyChanges(original, changes) {
|
|
106
|
+
const crlf = original.includes("\r\n");
|
|
107
|
+
let lines = original.replace(/\r\n/g, "\n").split("\n");
|
|
108
|
+
const out = { text: original, written: [], present: [], skipped: [] };
|
|
109
|
+
// Edits first, against headings that exist; then additions, which may go
|
|
110
|
+
// after a section an edit just touched.
|
|
111
|
+
const ordered = [...changes.filter((c) => c.kind === "edit"), ...changes.filter((c) => c.kind === "add")];
|
|
112
|
+
for (const c of ordered) {
|
|
113
|
+
const sections = sectionsOf(lines);
|
|
114
|
+
if (c.kind === "edit") {
|
|
115
|
+
const s = sections.find((x) => norm(x.title) === norm(c.heading));
|
|
116
|
+
if (!s) {
|
|
117
|
+
out.skipped.push({ change: c, why: `no “${c.heading}” section in the file` });
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
const body = lines.slice(s.head + 1, s.end).join("\n");
|
|
121
|
+
const text = c.text.replace(/\r\n/g, "\n");
|
|
122
|
+
const find = (c.find ?? "").replace(/\r\n/g, "\n");
|
|
123
|
+
if (text.trim() && body.includes(text.trim())) {
|
|
124
|
+
out.present.push(c);
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
if (!find) {
|
|
128
|
+
const at = lastContentLine(lines, s);
|
|
129
|
+
lines = [...lines.slice(0, at), ...text.trimEnd().split("\n"), ...lines.slice(at)];
|
|
130
|
+
out.written.push(c);
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
const idx = body.indexOf(find);
|
|
134
|
+
if (idx < 0) {
|
|
135
|
+
out.skipped.push({ change: c, why: `the text it rewrites is no longer in “${c.heading}”` });
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
const next = body.slice(0, idx) + text + body.slice(idx + find.length);
|
|
139
|
+
lines = [...lines.slice(0, s.head + 1), ...next.split("\n"), ...lines.slice(s.end)];
|
|
140
|
+
out.written.push(c);
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
// add
|
|
144
|
+
if (sections.some((x) => norm(x.title) === norm(c.heading))) {
|
|
145
|
+
out.present.push(c);
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
const block = [`## ${c.heading.trim()}`, "", ...c.text.replace(/\r\n/g, "\n").trim().split("\n")];
|
|
149
|
+
const after = c.after_heading ? sections.find((x) => norm(x.title) === norm(c.after_heading)) : undefined;
|
|
150
|
+
if (after) {
|
|
151
|
+
const at = lastContentLine(lines, after);
|
|
152
|
+
// A blank line either side, whatever the file had there.
|
|
153
|
+
const tail = lines.slice(at);
|
|
154
|
+
lines = [...lines.slice(0, at), "", ...block, ...(tail.length > 0 && tail[0].trim() !== "" ? [""] : []), ...tail];
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
while (lines.length > 0 && lines[lines.length - 1].trim() === "")
|
|
158
|
+
lines.pop();
|
|
159
|
+
lines = lines.length > 0 ? [...lines, "", ...block] : block;
|
|
160
|
+
lines.push("");
|
|
161
|
+
}
|
|
162
|
+
out.written.push(c);
|
|
163
|
+
}
|
|
164
|
+
let text = lines.join("\n");
|
|
165
|
+
if (out.written.length > 0 && !text.endsWith("\n"))
|
|
166
|
+
text += "\n";
|
|
167
|
+
out.text = out.written.length > 0 ? (crlf ? text.replace(/\n/g, "\r\n") : text) : original;
|
|
168
|
+
return out;
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=claude-md.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-md.js","sourceRoot":"","sources":["../../src/brain/claude-md.ts"],"names":[],"mappings":"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"}
|
package/dist/brain/connect.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import { type BrainLink, type BrainRule } from './link.js';
|
|
6
6
|
import { type BrainWrite } from './wire.js';
|
|
7
7
|
/**
|
|
8
|
-
* Parse the `--
|
|
8
|
+
* Parse the `--trail` value.
|
|
9
9
|
*
|
|
10
10
|
* The onboarding page hands over one string so there is one thing to copy. Two
|
|
11
11
|
* accepted shapes:
|
|
@@ -33,7 +33,7 @@ export interface ConnectResult {
|
|
|
33
33
|
*
|
|
34
34
|
* The link is stored even when the pull fails. That is deliberate: a token
|
|
35
35
|
* typed correctly against a brain that is momentarily unreachable should not
|
|
36
|
-
* have to be pasted again — `graft
|
|
36
|
+
* have to be pasted again — `graft trail pull` retries, and `ask` degrades to
|
|
37
37
|
* the code-only answer meanwhile.
|
|
38
38
|
*/
|
|
39
39
|
export declare function connectBrain(repo: string, link: BrainLink, opts?: {
|
|
@@ -50,7 +50,7 @@ export declare function pullBrain(repo: string, opts: {
|
|
|
50
50
|
ids?: string[];
|
|
51
51
|
fetchImpl?: typeof fetch;
|
|
52
52
|
}): Promise<ConnectResult | null>;
|
|
53
|
-
/** The linked brain and its cached rule set, for `graft
|
|
53
|
+
/** The linked brain and its cached rule set, for `graft trail status`. */
|
|
54
54
|
export declare function brainStatus(repo: string): {
|
|
55
55
|
link: BrainLink | null;
|
|
56
56
|
rules: BrainRule[];
|
package/dist/brain/connect.js
CHANGED
|
@@ -6,7 +6,7 @@ import { readLink, writeLink, fetchRules, writeRulesCache, readRulesCache, } fro
|
|
|
6
6
|
import { writeBrainSections } from './wire.js';
|
|
7
7
|
import { basename } from 'node:path';
|
|
8
8
|
/**
|
|
9
|
-
* Parse the `--
|
|
9
|
+
* Parse the `--trail` value.
|
|
10
10
|
*
|
|
11
11
|
* The onboarding page hands over one string so there is one thing to copy. Two
|
|
12
12
|
* accepted shapes:
|
|
@@ -21,19 +21,19 @@ import { basename } from 'node:path';
|
|
|
21
21
|
export function parseBrainArg(value) {
|
|
22
22
|
const raw = value.trim();
|
|
23
23
|
if (!raw)
|
|
24
|
-
return { error: 'empty --
|
|
24
|
+
return { error: 'empty --trail value' };
|
|
25
25
|
const cut = raw.indexOf(':');
|
|
26
26
|
if (cut > 0) {
|
|
27
27
|
const brainId = raw.slice(0, cut).trim();
|
|
28
28
|
const token = raw.slice(cut + 1).trim();
|
|
29
29
|
if (!brainId || !token)
|
|
30
|
-
return { error: 'expected --
|
|
30
|
+
return { error: 'expected --trail <brainId>:<token>' };
|
|
31
31
|
return { brainId, token };
|
|
32
32
|
}
|
|
33
33
|
const envToken = process.env.GRAFT_BRAIN_TOKEN;
|
|
34
34
|
if (!envToken) {
|
|
35
35
|
return {
|
|
36
|
-
error: 'expected --
|
|
36
|
+
error: 'expected --trail <brainId>:<token>, or a bare brain id with the token in GRAFT_BRAIN_TOKEN',
|
|
37
37
|
};
|
|
38
38
|
}
|
|
39
39
|
return { brainId: raw, token: envToken };
|
|
@@ -43,7 +43,7 @@ export function parseBrainArg(value) {
|
|
|
43
43
|
*
|
|
44
44
|
* The link is stored even when the pull fails. That is deliberate: a token
|
|
45
45
|
* typed correctly against a brain that is momentarily unreachable should not
|
|
46
|
-
* have to be pasted again — `graft
|
|
46
|
+
* have to be pasted again — `graft trail pull` retries, and `ask` degrades to
|
|
47
47
|
* the code-only answer meanwhile.
|
|
48
48
|
*/
|
|
49
49
|
export async function connectBrain(repo, link, opts = { home: '' }) {
|
|
@@ -54,7 +54,7 @@ export async function connectBrain(repo, link, opts = { home: '' }) {
|
|
|
54
54
|
linked: true,
|
|
55
55
|
ruleCount: 0,
|
|
56
56
|
writes: [],
|
|
57
|
-
warning: 'could not reach the brain to pull its rules — the link is saved; run `graft
|
|
57
|
+
warning: 'could not reach the brain to pull its rules — the link is saved; run `graft trail pull` to retry',
|
|
58
58
|
};
|
|
59
59
|
}
|
|
60
60
|
writeRulesCache(repo, { brainId: link.brainId, fetchedAt: Date.now(), rules });
|
|
@@ -71,7 +71,7 @@ export async function pullBrain(repo, opts) {
|
|
|
71
71
|
return null;
|
|
72
72
|
return connectBrain(repo, link, opts);
|
|
73
73
|
}
|
|
74
|
-
/** The linked brain and its cached rule set, for `graft
|
|
74
|
+
/** The linked brain and its cached rule set, for `graft trail status`. */
|
|
75
75
|
export function brainStatus(repo) {
|
|
76
76
|
const link = readLink(repo);
|
|
77
77
|
const cache = readRulesCache(repo);
|
package/dist/brain/link.d.ts
CHANGED
|
@@ -54,7 +54,7 @@ export declare function readLink(dir: string): BrainLink | null;
|
|
|
54
54
|
* token — which is exactly why this is also where it gets ignored. The comment
|
|
55
55
|
* on {@link BrainLink} has claimed `.graft/` was "git-ignored" since the day it
|
|
56
56
|
* was written, and nothing ever made it true: `ensureGitignored` only ever ran
|
|
57
|
-
* for the graph cache. Every repository anyone ran `graft
|
|
57
|
+
* for the graph cache. Every repository anyone ran `graft trail connect` in was
|
|
58
58
|
* therefore one `git add -A` away from publishing a credential. */
|
|
59
59
|
export declare function writeLink(dir: string, link: BrainLink): void;
|
|
60
60
|
/** Forget the link for repo `dir`. Leaves the cached rules for `uninstall` to remove. */
|
package/dist/brain/link.js
CHANGED
|
@@ -54,7 +54,7 @@ export function readLink(dir) {
|
|
|
54
54
|
* token — which is exactly why this is also where it gets ignored. The comment
|
|
55
55
|
* on {@link BrainLink} has claimed `.graft/` was "git-ignored" since the day it
|
|
56
56
|
* was written, and nothing ever made it true: `ensureGitignored` only ever ran
|
|
57
|
-
* for the graph cache. Every repository anyone ran `graft
|
|
57
|
+
* for the graph cache. Every repository anyone ran `graft trail connect` in was
|
|
58
58
|
* therefore one `git add -A` away from publishing a credential. */
|
|
59
59
|
export function writeLink(dir, link) {
|
|
60
60
|
patchBuildConfig(dir, { brain: link });
|
package/dist/brain/push.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type RepoDigest } from "../app/history.js";
|
|
1
|
+
import { type HistoryThread, type RepoDigest } from "../app/history.js";
|
|
2
2
|
import type { GraphV1 } from "../graph/types.js";
|
|
3
3
|
import { type BrainLink } from "./link.js";
|
|
4
4
|
/** What a local ingest read, for the caller to print. */
|
|
@@ -37,6 +37,8 @@ export interface ExpectedRepo {
|
|
|
37
37
|
slug: string;
|
|
38
38
|
status: string;
|
|
39
39
|
brainName: string;
|
|
40
|
+
/** The brain accepts an early upload (see pushEarlyDigest). */
|
|
41
|
+
earlyUpload: boolean;
|
|
40
42
|
}
|
|
41
43
|
/**
|
|
42
44
|
* The repository this brain expects, or null when it expects none.
|
|
@@ -53,10 +55,36 @@ export interface ExpectedRepo {
|
|
|
53
55
|
export declare function fetchExpectedRepo(link: BrainLink, fetchImpl?: typeof fetch): Promise<ExpectedRepo | null>;
|
|
54
56
|
/** Whether two repo slugs name the same repository. GitHub is case-insensitive. */
|
|
55
57
|
export declare function sameRepo(a: string, b: string): boolean;
|
|
58
|
+
/** How many of the newest pull requests and commits the early upload carries —
|
|
59
|
+
* what Trail's quick CLAUDE.md pass reads, and no more. */
|
|
60
|
+
export declare const EARLY_THREADS = 30;
|
|
61
|
+
export declare const EARLY_COMMITS = 80;
|
|
62
|
+
/**
|
|
63
|
+
* The early upload: the instruction files, the newest pull requests and the
|
|
64
|
+
* newest commits, read before the rest of the history.
|
|
65
|
+
*
|
|
66
|
+
* Reading the history is most of a push's wait — up to 200 pull requests at two
|
|
67
|
+
* GitHub calls each — and Trail's first CLAUDE.md suggestions need none of it
|
|
68
|
+
* beyond the newest few. Sent first, they start while the full read is still
|
|
69
|
+
* going here, and the full upload that follows mines as before.
|
|
70
|
+
*
|
|
71
|
+
* Returns the threads it read, so the full read reuses them instead of asking
|
|
72
|
+
* GitHub twice. Null when there is nothing worth sending early.
|
|
73
|
+
*/
|
|
74
|
+
export declare function buildEarlyDigest(root: string, opts?: {
|
|
75
|
+
fetchImpl?: typeof fetch;
|
|
76
|
+
}): Promise<{
|
|
77
|
+
digest: RepoDigest;
|
|
78
|
+
threads: HistoryThread[];
|
|
79
|
+
} | null>;
|
|
80
|
+
/** Send the early upload. Best-effort: false on any failure, and the full
|
|
81
|
+
* upload still does everything. */
|
|
82
|
+
export declare function pushEarlyDigest(link: BrainLink, digest: RepoDigest, fetchImpl?: typeof fetch): Promise<boolean>;
|
|
56
83
|
/** Build the digest for the checkout at `root`. Reads nothing but text. */
|
|
57
84
|
export declare function buildLocalDigest(root: string, graph: GraphV1 | null, opts?: {
|
|
58
85
|
autoApprove?: boolean;
|
|
59
86
|
fetchImpl?: typeof fetch;
|
|
87
|
+
knownThreads?: HistoryThread[];
|
|
60
88
|
}): Promise<{
|
|
61
89
|
digest: RepoDigest;
|
|
62
90
|
warning?: string;
|
package/dist/brain/push.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../src/brain/push.ts"],"names":[],"mappings":"AAiBA,OAAO,EAKL,KAAK,UAAU,EAChB,MAAM,mBAAmB,CAAC;AAY3B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAEvD,yDAAyD;AACzD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAYD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAMpF;AAQD;;;;;;;GAOG;AACH,wBAAgB,WAAW,IAAI,MAAM,GAAG,IAAI,CAM3C;AAgBD,uEAAuE;AACvE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../src/brain/push.ts"],"names":[],"mappings":"AAiBA,OAAO,EAKL,KAAK,aAAa,EAClB,KAAK,UAAU,EAChB,MAAM,mBAAmB,CAAC;AAY3B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAEvD,yDAAyD;AACzD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAYD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAMpF;AAQD;;;;;;;GAOG;AACH,wBAAgB,WAAW,IAAI,MAAM,GAAG,IAAI,CAM3C;AAgBD,uEAAuE;AACvE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,GAAE,OAAO,KAAa,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAsBtH;AAED,mFAAmF;AACnF,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;2DAC2D;AAC3D,eAAO,MAAM,aAAa,KAAK,CAAC;AAChC,eAAO,MAAM,aAAa,KAAK,CAAC;AAEhC;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CAAO,GACtC,OAAO,CAAC;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,aAAa,EAAE,CAAA;CAAE,GAAG,IAAI,CAAC,CA6BlE;AAED;mCACmC;AACnC,wBAAsB,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,GAAE,OAAO,KAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAkB5H;AAED,2EAA2E;AAC3E,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,GAAG,IAAI,EACrB,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IAAC,YAAY,CAAC,EAAE,aAAa,EAAE,CAAA;CAAO,GAC7F,OAAO,CAAC;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAqDvE;AAED,6DAA6D;AAC7D,wBAAsB,UAAU,CAC9B,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,UAAU,EAClB,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAkBhD"}
|