@nanonets/graft 0.16.0 → 0.19.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 +10 -3
- package/dist/app/brain-build-process.d.ts +22 -0
- package/dist/app/brain-build-process.d.ts.map +1 -0
- package/dist/app/brain-build-process.js +129 -0
- package/dist/app/brain-build-process.js.map +1 -0
- package/dist/app/brain-build-worker.d.ts +35 -0
- package/dist/app/brain-build-worker.d.ts.map +1 -0
- package/dist/app/brain-build-worker.js +56 -0
- package/dist/app/brain-build-worker.js.map +1 -0
- package/dist/app/brain-build.d.ts +160 -0
- package/dist/app/brain-build.d.ts.map +1 -0
- package/dist/app/brain-build.js +278 -0
- package/dist/app/brain-build.js.map +1 -0
- package/dist/app/checkout.d.ts +53 -3
- package/dist/app/checkout.d.ts.map +1 -1
- package/dist/app/checkout.js +195 -27
- package/dist/app/checkout.js.map +1 -1
- package/dist/app/events.d.ts +7 -0
- package/dist/app/events.d.ts.map +1 -1
- package/dist/app/events.js +7 -2
- package/dist/app/events.js.map +1 -1
- package/dist/app/history.d.ts +128 -0
- package/dist/app/history.d.ts.map +1 -0
- package/dist/app/history.js +266 -0
- package/dist/app/history.js.map +1 -0
- package/dist/app/identity.d.ts +56 -0
- package/dist/app/identity.d.ts.map +1 -1
- package/dist/app/identity.js +119 -0
- package/dist/app/identity.js.map +1 -1
- package/dist/app/main.js +14 -0
- package/dist/app/main.js.map +1 -1
- package/dist/app/pages.d.ts +17 -0
- package/dist/app/pages.d.ts.map +1 -1
- package/dist/app/pages.js +112 -5
- package/dist/app/pages.js.map +1 -1
- package/dist/app/review-process.d.ts +66 -0
- package/dist/app/review-process.d.ts.map +1 -0
- package/dist/app/review-process.js +199 -0
- package/dist/app/review-process.js.map +1 -0
- package/dist/app/review-worker.d.ts +2 -0
- package/dist/app/review-worker.d.ts.map +1 -0
- package/dist/app/review-worker.js +108 -0
- package/dist/app/review-worker.js.map +1 -0
- package/dist/app/review.d.ts.map +1 -1
- package/dist/app/review.js +4 -1
- package/dist/app/review.js.map +1 -1
- package/dist/app/server.d.ts +31 -2
- package/dist/app/server.d.ts.map +1 -1
- package/dist/app/server.js +130 -3
- package/dist/app/server.js.map +1 -1
- package/dist/app/sources.d.ts +68 -0
- package/dist/app/sources.d.ts.map +1 -0
- package/dist/app/sources.js +342 -0
- package/dist/app/sources.js.map +1 -0
- package/dist/ask/ask.d.ts +6 -0
- package/dist/ask/ask.d.ts.map +1 -1
- package/dist/ask/ask.js +30 -2
- package/dist/ask/ask.js.map +1 -1
- package/dist/brain/attach.d.ts +44 -0
- package/dist/brain/attach.d.ts.map +1 -0
- package/dist/brain/attach.js +63 -0
- package/dist/brain/attach.js.map +1 -0
- package/dist/brain/connect.d.ts +59 -0
- package/dist/brain/connect.d.ts.map +1 -0
- package/dist/brain/connect.js +80 -0
- package/dist/brain/connect.js.map +1 -0
- package/dist/brain/link.d.ts +89 -0
- package/dist/brain/link.d.ts.map +1 -0
- package/dist/brain/link.js +146 -0
- package/dist/brain/link.js.map +1 -0
- package/dist/brain/push.d.ts +72 -0
- package/dist/brain/push.d.ts.map +1 -0
- package/dist/brain/push.js +191 -0
- package/dist/brain/push.js.map +1 -0
- package/dist/brain/signup.d.ts +73 -0
- package/dist/brain/signup.d.ts.map +1 -0
- package/dist/brain/signup.js +186 -0
- package/dist/brain/signup.js.map +1 -0
- package/dist/brain/watch.d.ts +136 -0
- package/dist/brain/watch.d.ts.map +1 -0
- package/dist/brain/watch.js +172 -0
- package/dist/brain/watch.js.map +1 -0
- package/dist/brain/wire.d.ts +38 -0
- package/dist/brain/wire.d.ts.map +1 -0
- package/dist/brain/wire.js +133 -0
- package/dist/brain/wire.js.map +1 -0
- package/dist/claude/format.d.ts.map +1 -1
- package/dist/claude/format.js +10 -3
- package/dist/claude/format.js.map +1 -1
- package/dist/claude/hooks.d.ts.map +1 -1
- package/dist/claude/hooks.js +32 -1
- package/dist/claude/hooks.js.map +1 -1
- package/dist/claude/init.d.ts +5 -0
- package/dist/claude/init.d.ts.map +1 -1
- package/dist/claude/init.js +9 -1
- package/dist/claude/init.js.map +1 -1
- package/dist/claude/session-metrics.d.ts +10 -0
- package/dist/claude/session-metrics.d.ts.map +1 -1
- package/dist/claude/session-metrics.js +25 -0
- package/dist/claude/session-metrics.js.map +1 -1
- package/dist/claude/settings-merge.d.ts +18 -0
- package/dist/claude/settings-merge.d.ts.map +1 -1
- package/dist/claude/settings-merge.js +42 -8
- package/dist/claude/settings-merge.js.map +1 -1
- package/dist/claude/skill-template.d.ts.map +1 -1
- package/dist/claude/skill-template.js +6 -0
- package/dist/claude/skill-template.js.map +1 -1
- package/dist/claude/state.d.ts +14 -0
- package/dist/claude/state.d.ts.map +1 -1
- package/dist/claude/state.js.map +1 -1
- package/dist/claude/tally.d.ts +27 -0
- package/dist/claude/tally.d.ts.map +1 -1
- package/dist/claude/tally.js +74 -1
- package/dist/claude/tally.js.map +1 -1
- package/dist/cli.js +310 -3
- package/dist/cli.js.map +1 -1
- package/dist/context/node-file.d.ts +4 -10
- package/dist/context/node-file.d.ts.map +1 -1
- package/dist/context/node-file.js +6 -2
- package/dist/context/node-file.js.map +1 -1
- package/dist/context/price.d.ts +49 -0
- package/dist/context/price.d.ts.map +1 -0
- package/dist/context/price.js +83 -0
- package/dist/context/price.js.map +1 -0
- package/dist/context/savings.d.ts +13 -3
- package/dist/context/savings.d.ts.map +1 -1
- package/dist/context/savings.js +44 -5
- package/dist/context/savings.js.map +1 -1
- package/dist/hosts/claude-global.d.ts +33 -0
- package/dist/hosts/claude-global.d.ts.map +1 -0
- package/dist/hosts/claude-global.js +118 -0
- package/dist/hosts/claude-global.js.map +1 -0
- package/dist/hosts/plan.d.ts.map +1 -1
- package/dist/hosts/plan.js +5 -1
- package/dist/hosts/plan.js.map +1 -1
- package/dist/hosts/retract.d.ts.map +1 -1
- package/dist/hosts/retract.js +33 -13
- package/dist/hosts/retract.js.map +1 -1
- package/dist/hosts/sections.d.ts +23 -2
- package/dist/hosts/sections.d.ts.map +1 -1
- package/dist/hosts/sections.js +25 -9
- package/dist/hosts/sections.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +33 -4
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +5 -1
- package/dist/mcp/tools.js.map +1 -1
- package/dist/telemetry/contract.d.ts +12 -0
- package/dist/telemetry/contract.d.ts.map +1 -1
- package/dist/telemetry/contract.js +19 -0
- package/dist/telemetry/contract.js.map +1 -1
- package/dist/telemetry/gate.d.ts +14 -0
- package/dist/telemetry/gate.d.ts.map +1 -1
- package/dist/telemetry/gate.js +18 -2
- package/dist/telemetry/gate.js.map +1 -1
- package/dist/upkeep-run.d.ts.map +1 -1
- package/dist/upkeep-run.js +12 -2
- package/dist/upkeep-run.js.map +1 -1
- package/dist/upkeep.d.ts +18 -0
- package/dist/upkeep.d.ts.map +1 -1
- package/dist/upkeep.js +38 -0
- package/dist/upkeep.js.map +1 -1
- package/dist/util/state.d.ts +9 -0
- package/dist/util/state.d.ts.map +1 -1
- package/dist/util/state.js.map +1 -1
- package/package.json +1 -1
package/dist/app/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/app/server.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/app/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { type Fetch } from "./identity.js";
|
|
2
|
+
/** What kind of thing a source is, so extraction can weigh it. */
|
|
3
|
+
export type SourceKind = "agent_instructions" | "decision_doc" | "lint_config" | "ci_config" | "codeowners" | "branch_protection" | "revert" | "test_name" | "declined_issue";
|
|
4
|
+
/** One rule-bearing artefact. */
|
|
5
|
+
export interface HistorySource {
|
|
6
|
+
kind: SourceKind;
|
|
7
|
+
/** Repo-relative path, or an API-ish label like "branch protection: main". */
|
|
8
|
+
path: string;
|
|
9
|
+
text: string;
|
|
10
|
+
/** Deep link, where one exists (an issue, a reverted commit). */
|
|
11
|
+
url?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Instruction files the team already wrote for coding agents.
|
|
15
|
+
*
|
|
16
|
+
* The single highest-precision source in a repository: someone sat down and
|
|
17
|
+
* wrote imperative rules for a machine to follow. Nothing has to be inferred.
|
|
18
|
+
*
|
|
19
|
+
* Graft's own managed blocks are stripped first. Without that the brain reads
|
|
20
|
+
* back graft's instructions about using graft, and then graft carries them into
|
|
21
|
+
* the same file — a loop that fills the rulebook with itself.
|
|
22
|
+
*/
|
|
23
|
+
export declare function readAgentInstructions(root: string): HistorySource[];
|
|
24
|
+
/** Architecture decision records and the docs that read like them. */
|
|
25
|
+
export declare function readDecisionDocs(root: string): HistorySource[];
|
|
26
|
+
/**
|
|
27
|
+
* Rules the team already encoded for a machine: linters, formatters, and the
|
|
28
|
+
* checks CI insists on. Nothing to infer — extraction only has to phrase them.
|
|
29
|
+
*/
|
|
30
|
+
export declare function readCodifiedRules(root: string): HistorySource[];
|
|
31
|
+
/** Who must approve what. A hard constraint, stated as a file. */
|
|
32
|
+
export declare function readCodeowners(root: string): HistorySource[];
|
|
33
|
+
/**
|
|
34
|
+
* Commits that undid another commit.
|
|
35
|
+
*
|
|
36
|
+
* "We tried this and took it back" is a rule available from nowhere else, and
|
|
37
|
+
* it is the one kind of history that says what NOT to do. The body of a revert
|
|
38
|
+
* usually names the commit it undoes and, when the author bothered, why.
|
|
39
|
+
*/
|
|
40
|
+
export declare function readReverts(root: string, max?: number): HistorySource[];
|
|
41
|
+
/**
|
|
42
|
+
* Test names, which are invariants someone wrote deliberately.
|
|
43
|
+
*
|
|
44
|
+
* `never retries on a card decline` is a rule stated as an assertion. Read from
|
|
45
|
+
* the graph's own symbols rather than by re-parsing, so this costs nothing:
|
|
46
|
+
* a test function is already a node.
|
|
47
|
+
*
|
|
48
|
+
* Only names that read like a sentence are kept. `TestFoo` is a label;
|
|
49
|
+
* `rejects an expired token` is a claim about how the system must behave.
|
|
50
|
+
*/
|
|
51
|
+
export declare function readTestNames(symbolNames: Array<{
|
|
52
|
+
name: string;
|
|
53
|
+
path: string;
|
|
54
|
+
}>, max?: number): HistorySource[];
|
|
55
|
+
/**
|
|
56
|
+
* Issues closed as not planned.
|
|
57
|
+
*
|
|
58
|
+
* A decision NOT to build something, which is half of what a codebase's rules
|
|
59
|
+
* are and is invisible everywhere else — nothing was committed, so no commit
|
|
60
|
+
* message records it.
|
|
61
|
+
*/
|
|
62
|
+
export declare function readDeclinedIssues(owner: string, repo: string, token: string, fetchImpl: Fetch, api?: string, max?: number): Promise<HistorySource[]>;
|
|
63
|
+
/** Required checks and reviewers on the default branch. */
|
|
64
|
+
export declare function readBranchProtection(owner: string, repo: string, branch: string, token: string, fetchImpl: Fetch, api?: string): Promise<HistorySource[]>;
|
|
65
|
+
export declare function budgetSources(sources: HistorySource[], maxChars?: number, maxCount?: number): HistorySource[];
|
|
66
|
+
/** Repo-relative path, for readers handed an absolute one. */
|
|
67
|
+
export declare function relPath(root: string, abs: string): string;
|
|
68
|
+
//# sourceMappingURL=sources.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sources.d.ts","sourceRoot":"","sources":["../../src/app/sources.ts"],"names":[],"mappings":"AAeA,OAAO,EAAa,KAAK,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtD,kEAAkE;AAClE,MAAM,MAAM,UAAU,GAClB,oBAAoB,GACpB,cAAc,GACd,aAAa,GACb,WAAW,GACX,YAAY,GACZ,mBAAmB,GACnB,QAAQ,GACR,WAAW,GACX,gBAAgB,CAAC;AAErB,iCAAiC;AACjC,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAkCD;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CAenE;AASD,sEAAsE;AACtE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CAiB9D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CA0B/D;AAED,kEAAkE;AAClE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CAM5D;AAiBD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAc,GAAG,aAAa,EAAE,CAe5E;AAKD;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EAAE,GAAG,SAAiB,GAAG,aAAa,EAAE,CAUvH;AAqBD;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,KAAK,EAChB,GAAG,SAA2B,EAC9B,GAAG,SAAe,GACjB,OAAO,CAAC,aAAa,EAAE,CAAC,CAkC1B;AAED,2DAA2D;AAC3D,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,KAAK,EAChB,GAAG,SAA2B,GAC7B,OAAO,CAAC,aAAa,EAAE,CAAC,CA2B1B;AAsBD,wBAAgB,aAAa,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,QAAQ,SAAkB,EAAE,QAAQ,SAAc,GAAG,aAAa,EAAE,CAW3H;AAED,8DAA8D;AAC9D,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEzD"}
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Everything in a repository that is already a rule, or nearly one.
|
|
3
|
+
*
|
|
4
|
+
* Commit messages and pull-request discussion say what a team decided in
|
|
5
|
+
* passing. These are the places where they wrote it down on purpose: the
|
|
6
|
+
* instruction files they hand their own agents, the decision records, the linter
|
|
7
|
+
* config, the ownership rules. Higher precision per byte than any amount of
|
|
8
|
+
* history, and most of it is a file read.
|
|
9
|
+
*
|
|
10
|
+
* Every reader returns text, never source code, and every one is best-effort:
|
|
11
|
+
* a repo with none of these still builds a brain from its history.
|
|
12
|
+
*/
|
|
13
|
+
import { readFileSync, existsSync, readdirSync, statSync } from "node:fs";
|
|
14
|
+
import { join, relative } from "node:path";
|
|
15
|
+
import { spawnSync } from "node:child_process";
|
|
16
|
+
import { ghHeaders } from "./identity.js";
|
|
17
|
+
/** Per-file and total caps, so one enormous doc cannot crowd out everything. */
|
|
18
|
+
const MAX_FILE_CHARS = 24_000;
|
|
19
|
+
const MAX_TOTAL_CHARS = 300_000;
|
|
20
|
+
const MAX_SOURCES = 120;
|
|
21
|
+
function readText(root, rel) {
|
|
22
|
+
try {
|
|
23
|
+
const p = join(root, rel);
|
|
24
|
+
if (!existsSync(p) || !statSync(p).isFile())
|
|
25
|
+
return null;
|
|
26
|
+
const raw = readFileSync(p, "utf8");
|
|
27
|
+
const trimmed = raw.trim();
|
|
28
|
+
if (!trimmed)
|
|
29
|
+
return null;
|
|
30
|
+
return trimmed.length > MAX_FILE_CHARS ? `${trimmed.slice(0, MAX_FILE_CHARS)}\n[…truncated]` : trimmed;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/** Files directly under `rel`, one level deep, matching `test`. */
|
|
37
|
+
function filesIn(root, rel, test) {
|
|
38
|
+
try {
|
|
39
|
+
const dir = join(root, rel);
|
|
40
|
+
if (!existsSync(dir) || !statSync(dir).isDirectory())
|
|
41
|
+
return [];
|
|
42
|
+
return readdirSync(dir)
|
|
43
|
+
.filter(test)
|
|
44
|
+
.map((n) => join(rel, n))
|
|
45
|
+
.sort();
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Instruction files the team already wrote for coding agents.
|
|
53
|
+
*
|
|
54
|
+
* The single highest-precision source in a repository: someone sat down and
|
|
55
|
+
* wrote imperative rules for a machine to follow. Nothing has to be inferred.
|
|
56
|
+
*
|
|
57
|
+
* Graft's own managed blocks are stripped first. Without that the brain reads
|
|
58
|
+
* back graft's instructions about using graft, and then graft carries them into
|
|
59
|
+
* the same file — a loop that fills the rulebook with itself.
|
|
60
|
+
*/
|
|
61
|
+
export function readAgentInstructions(root) {
|
|
62
|
+
const candidates = [
|
|
63
|
+
"CLAUDE.md",
|
|
64
|
+
"AGENTS.md",
|
|
65
|
+
"GEMINI.md",
|
|
66
|
+
".github/copilot-instructions.md",
|
|
67
|
+
".windsurf/rules/graft.md",
|
|
68
|
+
...filesIn(root, ".cursor/rules", (n) => n.endsWith(".mdc") || n.endsWith(".md")),
|
|
69
|
+
];
|
|
70
|
+
const out = [];
|
|
71
|
+
for (const rel of candidates) {
|
|
72
|
+
const text = stripManagedBlocks(readText(root, rel) ?? "");
|
|
73
|
+
if (text.trim())
|
|
74
|
+
out.push({ kind: "agent_instructions", path: rel, text });
|
|
75
|
+
}
|
|
76
|
+
return out;
|
|
77
|
+
}
|
|
78
|
+
/** Remove graft's own fenced regions, so the brain never learns graft from graft. */
|
|
79
|
+
function stripManagedBlocks(text) {
|
|
80
|
+
return text
|
|
81
|
+
.replace(/<!--\s*graft:(brain:)?start\s*-->[\s\S]*?<!--\s*graft:(brain:)?end\s*-->/g, "")
|
|
82
|
+
.trim();
|
|
83
|
+
}
|
|
84
|
+
/** Architecture decision records and the docs that read like them. */
|
|
85
|
+
export function readDecisionDocs(root) {
|
|
86
|
+
const mdIn = (dir) => filesIn(root, dir, (n) => n.endsWith(".md"));
|
|
87
|
+
const candidates = [
|
|
88
|
+
"ARCHITECTURE.md",
|
|
89
|
+
"CONTRIBUTING.md",
|
|
90
|
+
"docs/ARCHITECTURE.md",
|
|
91
|
+
"docs/CONTRIBUTING.md",
|
|
92
|
+
...mdIn("docs/adr"),
|
|
93
|
+
...mdIn("docs/decisions"),
|
|
94
|
+
...mdIn("adr"),
|
|
95
|
+
];
|
|
96
|
+
const out = [];
|
|
97
|
+
for (const rel of candidates) {
|
|
98
|
+
const text = readText(root, rel);
|
|
99
|
+
if (text)
|
|
100
|
+
out.push({ kind: "decision_doc", path: rel, text });
|
|
101
|
+
}
|
|
102
|
+
return out;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Rules the team already encoded for a machine: linters, formatters, and the
|
|
106
|
+
* checks CI insists on. Nothing to infer — extraction only has to phrase them.
|
|
107
|
+
*/
|
|
108
|
+
export function readCodifiedRules(root) {
|
|
109
|
+
const lint = [
|
|
110
|
+
".golangci.yml",
|
|
111
|
+
".golangci.yaml",
|
|
112
|
+
".eslintrc.json",
|
|
113
|
+
".eslintrc.js",
|
|
114
|
+
"eslint.config.js",
|
|
115
|
+
"eslint.config.mjs",
|
|
116
|
+
"ruff.toml",
|
|
117
|
+
".ruff.toml",
|
|
118
|
+
".prettierrc",
|
|
119
|
+
".prettierrc.json",
|
|
120
|
+
"commitlint.config.cjs",
|
|
121
|
+
"commitlint.config.js",
|
|
122
|
+
".editorconfig",
|
|
123
|
+
];
|
|
124
|
+
const out = [];
|
|
125
|
+
for (const rel of lint) {
|
|
126
|
+
const text = readText(root, rel);
|
|
127
|
+
if (text)
|
|
128
|
+
out.push({ kind: "lint_config", path: rel, text });
|
|
129
|
+
}
|
|
130
|
+
for (const rel of filesIn(root, ".github/workflows", (n) => n.endsWith(".yml") || n.endsWith(".yaml"))) {
|
|
131
|
+
const text = readText(root, rel);
|
|
132
|
+
if (text)
|
|
133
|
+
out.push({ kind: "ci_config", path: rel, text });
|
|
134
|
+
}
|
|
135
|
+
return out;
|
|
136
|
+
}
|
|
137
|
+
/** Who must approve what. A hard constraint, stated as a file. */
|
|
138
|
+
export function readCodeowners(root) {
|
|
139
|
+
for (const rel of [".github/CODEOWNERS", "CODEOWNERS", "docs/CODEOWNERS"]) {
|
|
140
|
+
const text = readText(root, rel);
|
|
141
|
+
if (text)
|
|
142
|
+
return [{ kind: "codeowners", path: rel, text }];
|
|
143
|
+
}
|
|
144
|
+
return [];
|
|
145
|
+
}
|
|
146
|
+
/** Run git in `root`, or null when it fails. */
|
|
147
|
+
function git(root, args) {
|
|
148
|
+
const res = spawnSync("git", ["-c", "core.quotePath=false", ...args], {
|
|
149
|
+
cwd: root,
|
|
150
|
+
encoding: "utf8",
|
|
151
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
152
|
+
maxBuffer: 64 * 1024 * 1024,
|
|
153
|
+
});
|
|
154
|
+
if (res.error || res.status !== 0 || typeof res.stdout !== "string")
|
|
155
|
+
return null;
|
|
156
|
+
return res.stdout;
|
|
157
|
+
}
|
|
158
|
+
/** How many reverts to carry. */
|
|
159
|
+
const MAX_REVERTS = 40;
|
|
160
|
+
/**
|
|
161
|
+
* Commits that undid another commit.
|
|
162
|
+
*
|
|
163
|
+
* "We tried this and took it back" is a rule available from nowhere else, and
|
|
164
|
+
* it is the one kind of history that says what NOT to do. The body of a revert
|
|
165
|
+
* usually names the commit it undoes and, when the author bothered, why.
|
|
166
|
+
*/
|
|
167
|
+
export function readReverts(root, max = MAX_REVERTS) {
|
|
168
|
+
const out = git(root, ["log", "--grep=^Revert", "-n", String(max), "--format=%H%x02%s%x02%b%x01"]);
|
|
169
|
+
if (!out)
|
|
170
|
+
return [];
|
|
171
|
+
const sources = [];
|
|
172
|
+
for (const record of out.split("\x01")) {
|
|
173
|
+
if (!record.trim())
|
|
174
|
+
continue;
|
|
175
|
+
const [sha = "", subject = "", body = ""] = record.split("\x02");
|
|
176
|
+
if (!sha.trim() || !subject.trim())
|
|
177
|
+
continue;
|
|
178
|
+
sources.push({
|
|
179
|
+
kind: "revert",
|
|
180
|
+
path: `revert ${sha.trim().slice(0, 12)}`,
|
|
181
|
+
text: [subject.trim(), body.trim()].filter(Boolean).join("\n"),
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
return sources;
|
|
185
|
+
}
|
|
186
|
+
/** How many test names to carry. */
|
|
187
|
+
const MAX_TEST_NAMES = 300;
|
|
188
|
+
/**
|
|
189
|
+
* Test names, which are invariants someone wrote deliberately.
|
|
190
|
+
*
|
|
191
|
+
* `never retries on a card decline` is a rule stated as an assertion. Read from
|
|
192
|
+
* the graph's own symbols rather than by re-parsing, so this costs nothing:
|
|
193
|
+
* a test function is already a node.
|
|
194
|
+
*
|
|
195
|
+
* Only names that read like a sentence are kept. `TestFoo` is a label;
|
|
196
|
+
* `rejects an expired token` is a claim about how the system must behave.
|
|
197
|
+
*/
|
|
198
|
+
export function readTestNames(symbolNames, max = MAX_TEST_NAMES) {
|
|
199
|
+
const out = [];
|
|
200
|
+
for (const s of symbolNames) {
|
|
201
|
+
if (!/(^|[/.])(test|spec)[s]?[/.]|_test\.|\.test\.|\.spec\./i.test(s.path))
|
|
202
|
+
continue;
|
|
203
|
+
const sentence = humanizeTestName(s.name);
|
|
204
|
+
if (!sentence)
|
|
205
|
+
continue;
|
|
206
|
+
out.push({ kind: "test_name", path: s.path, text: sentence });
|
|
207
|
+
if (out.length === max)
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
return out;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* A test's name as a claim, or null when it is only a label.
|
|
214
|
+
*
|
|
215
|
+
* Requires three words after the prefix is stripped: fewer than that
|
|
216
|
+
* ("TestParse", "handles errors") states no invariant worth a rule, and letting
|
|
217
|
+
* those through fills the brain with noise that reads like content.
|
|
218
|
+
*/
|
|
219
|
+
function humanizeTestName(name) {
|
|
220
|
+
let s = name.replace(/^(Test|it|test|should|describe)[_\s]*/i, "");
|
|
221
|
+
// TestRetriesThreeTimes → Retries Three Times
|
|
222
|
+
if (/^[A-Za-z]+$/.test(s) && /[a-z][A-Z]/.test(s))
|
|
223
|
+
s = s.replace(/([a-z0-9])([A-Z])/g, "$1 $2");
|
|
224
|
+
s = s.replace(/[_-]+/g, " ").replace(/\s+/g, " ").trim();
|
|
225
|
+
if (s.split(" ").length < 3)
|
|
226
|
+
return null;
|
|
227
|
+
return s.toLowerCase();
|
|
228
|
+
}
|
|
229
|
+
/** How many declined issues to carry. */
|
|
230
|
+
const MAX_DECLINED = 40;
|
|
231
|
+
/**
|
|
232
|
+
* Issues closed as not planned.
|
|
233
|
+
*
|
|
234
|
+
* A decision NOT to build something, which is half of what a codebase's rules
|
|
235
|
+
* are and is invisible everywhere else — nothing was committed, so no commit
|
|
236
|
+
* message records it.
|
|
237
|
+
*/
|
|
238
|
+
export async function readDeclinedIssues(owner, repo, token, fetchImpl, api = "https://api.github.com", max = MAX_DECLINED) {
|
|
239
|
+
try {
|
|
240
|
+
const res = await fetchImpl(`${api}/repos/${owner}/${repo}/issues?state=closed&per_page=100&sort=updated`, {
|
|
241
|
+
headers: ghHeaders(token),
|
|
242
|
+
});
|
|
243
|
+
if (!res.ok)
|
|
244
|
+
return [];
|
|
245
|
+
const items = JSON.parse(await res.text());
|
|
246
|
+
if (!Array.isArray(items))
|
|
247
|
+
return [];
|
|
248
|
+
const out = [];
|
|
249
|
+
for (const i of items) {
|
|
250
|
+
// The issues endpoint returns pull requests too; they are already mined as
|
|
251
|
+
// threads and would be counted twice.
|
|
252
|
+
if (i.pull_request)
|
|
253
|
+
continue;
|
|
254
|
+
if (i.state_reason !== "not_planned")
|
|
255
|
+
continue;
|
|
256
|
+
if (!i.title?.trim())
|
|
257
|
+
continue;
|
|
258
|
+
out.push({
|
|
259
|
+
kind: "declined_issue",
|
|
260
|
+
path: `issue #${i.number}`,
|
|
261
|
+
text: [i.title.trim(), (i.body ?? "").trim()].filter(Boolean).join("\n").slice(0, MAX_FILE_CHARS),
|
|
262
|
+
url: i.html_url,
|
|
263
|
+
});
|
|
264
|
+
if (out.length === max)
|
|
265
|
+
break;
|
|
266
|
+
}
|
|
267
|
+
return out;
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
return [];
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
/** Required checks and reviewers on the default branch. */
|
|
274
|
+
export async function readBranchProtection(owner, repo, branch, token, fetchImpl, api = "https://api.github.com") {
|
|
275
|
+
if (!branch)
|
|
276
|
+
return [];
|
|
277
|
+
try {
|
|
278
|
+
const res = await fetchImpl(`${api}/repos/${owner}/${repo}/branches/${encodeURIComponent(branch)}/protection`, {
|
|
279
|
+
headers: ghHeaders(token),
|
|
280
|
+
});
|
|
281
|
+
// 404 simply means the branch is not protected, which is not a failure.
|
|
282
|
+
if (!res.ok)
|
|
283
|
+
return [];
|
|
284
|
+
const p = JSON.parse(await res.text());
|
|
285
|
+
const lines = [];
|
|
286
|
+
const checks = p.required_status_checks?.contexts ?? [];
|
|
287
|
+
if (checks.length)
|
|
288
|
+
lines.push(`Checks that must pass before merging to ${branch}: ${checks.join(", ")}.`);
|
|
289
|
+
const reviews = p.required_pull_request_reviews;
|
|
290
|
+
if (reviews?.required_approving_review_count) {
|
|
291
|
+
lines.push(`${reviews.required_approving_review_count} approving review(s) required to merge to ${branch}.`);
|
|
292
|
+
}
|
|
293
|
+
if (reviews?.require_code_owner_reviews)
|
|
294
|
+
lines.push(`A code owner must approve changes to ${branch}.`);
|
|
295
|
+
if (p.allow_force_pushes?.enabled === false)
|
|
296
|
+
lines.push(`Force pushes to ${branch} are not allowed.`);
|
|
297
|
+
if (!lines.length)
|
|
298
|
+
return [];
|
|
299
|
+
return [{ kind: "branch_protection", path: `branch protection: ${branch}`, text: lines.join("\n") }];
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
return [];
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Trim the collected sources to a budget, best kinds first.
|
|
307
|
+
*
|
|
308
|
+
* The order is the argument of this whole module: a file the team wrote to
|
|
309
|
+
* instruct an agent outranks a decision doc, which outranks a config, which
|
|
310
|
+
* outranks anything inferred. When the budget runs out it should run out on the
|
|
311
|
+
* weakest evidence.
|
|
312
|
+
*/
|
|
313
|
+
const KIND_RANK = [
|
|
314
|
+
"agent_instructions",
|
|
315
|
+
"decision_doc",
|
|
316
|
+
"codeowners",
|
|
317
|
+
"branch_protection",
|
|
318
|
+
"lint_config",
|
|
319
|
+
"ci_config",
|
|
320
|
+
"revert",
|
|
321
|
+
"declined_issue",
|
|
322
|
+
"test_name",
|
|
323
|
+
];
|
|
324
|
+
export function budgetSources(sources, maxChars = MAX_TOTAL_CHARS, maxCount = MAX_SOURCES) {
|
|
325
|
+
const ranked = [...sources].sort((a, b) => KIND_RANK.indexOf(a.kind) - KIND_RANK.indexOf(b.kind));
|
|
326
|
+
const out = [];
|
|
327
|
+
let spent = 0;
|
|
328
|
+
for (const s of ranked) {
|
|
329
|
+
if (out.length >= maxCount)
|
|
330
|
+
break;
|
|
331
|
+
if (spent + s.text.length > maxChars)
|
|
332
|
+
continue;
|
|
333
|
+
out.push(s);
|
|
334
|
+
spent += s.text.length;
|
|
335
|
+
}
|
|
336
|
+
return out;
|
|
337
|
+
}
|
|
338
|
+
/** Repo-relative path, for readers handed an absolute one. */
|
|
339
|
+
export function relPath(root, abs) {
|
|
340
|
+
return relative(root, abs) || abs;
|
|
341
|
+
}
|
|
342
|
+
//# sourceMappingURL=sources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sources.js","sourceRoot":"","sources":["../../src/app/sources.ts"],"names":[],"mappings":"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"}
|
package/dist/ask/ask.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type Savings } from "../context/savings.js";
|
|
2
2
|
import type { NodeV1, Relation } from "../graph/types.js";
|
|
3
|
+
import { type AppliedRule } from "../brain/attach.js";
|
|
3
4
|
export interface AskHit {
|
|
4
5
|
kind: "concept" | "symbol" | "caller" | "callee";
|
|
5
6
|
title: string;
|
|
@@ -87,6 +88,11 @@ export interface AskResult {
|
|
|
87
88
|
};
|
|
88
89
|
/** @internal Opt-in latent file groups plus the exact pre-file-ranking list. */
|
|
89
90
|
ranking?: AskRankingMetadata;
|
|
91
|
+
/** Rules from the attached Trail brain that govern the symbols in `hits`.
|
|
92
|
+
* Absent when the repo has no brain linked, or when none of its rules touch
|
|
93
|
+
* this answer. Populated in `--source` mode only, alongside `saved`: a pack
|
|
94
|
+
* the agent does not read the code from has nothing for a rule to sit beside. */
|
|
95
|
+
rules?: AppliedRule[];
|
|
90
96
|
}
|
|
91
97
|
/** Score a document's token counts against the query counts (name field
|
|
92
98
|
* pre-weighted by caller). Each shared term is weighted by its inverse document
|
package/dist/ask/ask.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../../src/ask/ask.ts"],"names":[],"mappings":"AAmBA,OAAO,
|
|
1
|
+
{"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../../src/ask/ask.ts"],"names":[],"mappings":"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"}
|
package/dist/ask/ask.js
CHANGED
|
@@ -17,7 +17,7 @@ import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
|
17
17
|
import { join, resolve } from "node:path";
|
|
18
18
|
import matter from "gray-matter";
|
|
19
19
|
import { contextDirFor } from "../context/node-file.js";
|
|
20
|
-
import { withSavings, savingsFor,
|
|
20
|
+
import { withSavings, savingsFor, savingsTurnNudge } from "../context/savings.js";
|
|
21
21
|
import { loadGraphCached, loadAskIndexCached } from "../graph/load.js";
|
|
22
22
|
import { assertPrefixIndexed, pathUnderPrefix, scopeLabel, scopeOf, scopesHereClause, scopesOfGraph, } from "../graph/scopes.js";
|
|
23
23
|
import { normalizePathPrefix } from "../util/paths.js";
|
|
@@ -28,6 +28,8 @@ import { fileFirstRoundRobin, roundRobinQueues } from "./file-selection.js";
|
|
|
28
28
|
import { personalizedPageRank, personalizedPageRankPrepared, preparePageRankPartitions, } from "./graphrank.js";
|
|
29
29
|
import { readSourceFile } from "../util/source.js";
|
|
30
30
|
import { counts, tokenize } from "./index-file.js";
|
|
31
|
+
import { rulesForPointers, formatRules } from "../brain/attach.js";
|
|
32
|
+
import { readLink, readRulesCache } from "../brain/link.js";
|
|
31
33
|
/** Max source lines to inline per hit — a definition longer than this is
|
|
32
34
|
* truncated with a marker, so one giant function can't blow up the pack. */
|
|
33
35
|
const MAX_SPAN_LINES = 80;
|
|
@@ -1090,9 +1092,31 @@ export function ask(dir, query, opts = {}) {
|
|
|
1090
1092
|
// The pack is truly substitutive only in retriever mode (spans inlined), so
|
|
1091
1093
|
// the "vs reading whole files" estimate is only honest here.
|
|
1092
1094
|
result.saved = baselineFor(result.hits, corpus.graph);
|
|
1095
|
+
// What the team decided about the code this pack just inlined. Read from the
|
|
1096
|
+
// local cache only — `ask` is on the agent's hot path and must never wait on
|
|
1097
|
+
// the network; `graft brain pull` and `init` are what refresh it.
|
|
1098
|
+
const applied = attachBrainRules(root, result.hits, corpus.graph);
|
|
1099
|
+
if (applied.length)
|
|
1100
|
+
result.rules = applied;
|
|
1093
1101
|
}
|
|
1094
1102
|
return result;
|
|
1095
1103
|
}
|
|
1104
|
+
/** Rules for this answer's symbols, or [] when the repo has no brain linked,
|
|
1105
|
+
* the cache is missing, or nothing overlaps. Never throws: a broken link must
|
|
1106
|
+
* degrade to the code-only answer graft gave before a brain existed. */
|
|
1107
|
+
function attachBrainRules(root, hits, graph) {
|
|
1108
|
+
try {
|
|
1109
|
+
if (!readLink(root))
|
|
1110
|
+
return [];
|
|
1111
|
+
const cache = readRulesCache(root);
|
|
1112
|
+
if (!cache?.rules?.length)
|
|
1113
|
+
return [];
|
|
1114
|
+
return rulesForPointers(hits.map((h) => h.pointer), cache.rules, graph);
|
|
1115
|
+
}
|
|
1116
|
+
catch {
|
|
1117
|
+
return [];
|
|
1118
|
+
}
|
|
1119
|
+
}
|
|
1096
1120
|
/** Signatures-only view of one file, straight from the wiring graph — the
|
|
1097
1121
|
* cheapest way to understand a file's API surface (~10× less than reading it).
|
|
1098
1122
|
* `file` is matched as an exact repo-relative path, then as a basename. */
|
|
@@ -1189,6 +1213,10 @@ export function formatAsk(r) {
|
|
|
1189
1213
|
});
|
|
1190
1214
|
lines.push(...scopeFooterLines(r));
|
|
1191
1215
|
}
|
|
1216
|
+
// Before `body` is joined, so the rules text is counted in the savings line
|
|
1217
|
+
// below rather than claimed as free.
|
|
1218
|
+
if (r.rules?.length)
|
|
1219
|
+
lines.push(...formatRules(r.rules));
|
|
1192
1220
|
const body = lines.join("\n").trimEnd();
|
|
1193
1221
|
const savings = askSavingsLine(r, body);
|
|
1194
1222
|
return (savings ? `${savings}\n\n${body}` : body) + escalationNudge(r) + "\n";
|
|
@@ -1222,7 +1250,7 @@ function askSavingsLine(r, body) {
|
|
|
1222
1250
|
return (`[graft] tokens saved ≈ ${saved.toLocaleString()} (${pct}%) — this pack ≈ ` +
|
|
1223
1251
|
`${pack.toLocaleString()} tok vs reading the ${r.saved.files} source file(s) whole ≈ ` +
|
|
1224
1252
|
`${base.toLocaleString()} tok. Estimate (baseline = those files read in full).` +
|
|
1225
|
-
|
|
1253
|
+
savingsTurnNudge(saved));
|
|
1226
1254
|
}
|
|
1227
1255
|
/** Multi-scope footer: answers a reviewer's two questions — "which
|
|
1228
1256
|
* sub-projects did this pack come from?" (`matched in:`, displayed-hit counts,
|