@attalabs/vinaya 0.21.0 → 0.22.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 +3 -2
- package/aeg-root/enforcement.md +2 -1
- package/aeg-root/roles/archivist.md +1 -1
- package/aeg-root/roles/planner.md +1 -1
- package/aeg-root/templates/pr-report-template.md +2 -0
- package/aeg-root/tranche-model.md +3 -3
- package/dist/checks/bin/check-body-bare-digits.js +115 -9
- package/dist/checks/bin/check-branch-topology.js +111 -5
- package/dist/checks/bin/check-brief-shape.js +111 -5
- package/dist/checks/bin/check-changeset-coverage.js +113 -7
- package/dist/checks/bin/check-closes-n.js +111 -5
- package/dist/checks/bin/check-coherence.js +115 -9
- package/dist/checks/bin/check-dead-branch-push.js +111 -5
- package/dist/checks/bin/check-dispatch-readiness.js +116 -10
- package/dist/checks/bin/check-doc-coverage-push.js +116 -10
- package/dist/checks/bin/check-doc-coverage.js +116 -10
- package/dist/checks/bin/check-doctrine-portability.js +115 -9
- package/dist/checks/bin/check-evidence-fresh.js +111 -5
- package/dist/checks/bin/check-first-push-dispatch.js +113 -7
- package/dist/checks/bin/check-issue-assignment.js +111 -5
- package/dist/checks/bin/check-main-branch-refusal.js +111 -5
- package/dist/checks/bin/check-no-disk-state.js +111 -5
- package/dist/checks/bin/check-quoted-command.js +121 -12
- package/dist/checks/bin/check-reader-resolvable-prose.js +152 -20
- package/dist/checks/bin/check-registry-gates.js +131 -10
- package/dist/checks/bin/check-retired-vocabulary.js +144 -12
- package/dist/checks/bin/check-review-gate.js +113 -7
- package/dist/checks/bin/check-single-plan-pr.js +111 -5
- package/dist/checks/bin/check-test-plan.js +111 -5
- package/dist/checks/bin/check-token-collection-wired.js +113 -7
- package/dist/checks/bin/check-token-report.js +4096 -0
- package/dist/checks/bin/check-workspace-escape.js +113 -7
- package/dist/index.js +177 -104
- package/package.json +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/BUILD_ID +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/build-manifest.json +3 -3
- package/studio-standalone/apps/vinaya-studio/web/.next/prerender-manifest.json +3 -3
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/_global-error.html +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/_global-error.rsc +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/_not-found/page/server-reference-manifest.json +2 -2
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/page/server-reference-manifest.json +2 -2
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/backlog/page/server-reference-manifest.json +2 -2
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/backlog/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/backlog/page_client-reference-manifest.js +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/page/server-reference-manifest.json +2 -2
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/page_client-reference-manifest.js +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/projects/[name]/page/server-reference-manifest.json +2 -2
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/projects/[name]/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/projects/[name]/page_client-reference-manifest.js +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/projects/[name]/tranches/[slug]/page/server-reference-manifest.json +2 -2
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/projects/[name]/tranches/[slug]/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/projects/[name]/tranches/[slug]/page_client-reference-manifest.js +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/projects/[name]/tranches/[slug]/tasks/[taskId]/page/server-reference-manifest.json +2 -2
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/projects/[name]/tranches/[slug]/tasks/[taskId]/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/projects/[name]/tranches/[slug]/tasks/[taskId]/page_client-reference-manifest.js +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/projects/page/server-reference-manifest.json +2 -2
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/projects/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/projects/page_client-reference-manifest.js +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/tranches/page/server-reference-manifest.json +2 -2
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/tranches/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/tranches/page_client-reference-manifest.js +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/1q96_modules_@clerk_nextjs_dist_esm_app-router_client_keyless-creator-reader_0lom2js.js +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/[root-of-the-server]__0053k9k._.js +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/[root-of-the-server]__0112h-k._.js +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/[root-of-the-server]__02c71kv._.js +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/{[root-of-the-server]__0ozbaq0._.js → [root-of-the-server]__069-_41._.js} +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/[root-of-the-server]__0o771t1._.js +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/[root-of-the-server]__0puovz5._.js +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/[root-of-the-server]__1hs0dcu._.js +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/[root-of-the-server]__1wc4-ip._.js +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/_03x_w6q._.js +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/_0gvm3og._.js +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/_0lwxg63._.js +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/_0o54suy._.js +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/_1-6rzip._.js +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/_1mrtj0f._.js +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/_1n0cnq-._.js +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/apps_vinaya-studio_web_src_app_studio_06it6s-._.js +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/node_modules_1vo08dj._.js +2 -2
- package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/packages_ui_libraries_animate_components_index_ts_186fje1._.js +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/packages_ui_libraries_brutal_components_index_ts_0n_lcc4._.js +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/packages_ui_libraries_retro_components_index_ts_0wvpm_z._.js +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/packages_ui_libraries_retro_components_index_ts_1_cfi48._.js +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/middleware-build-manifest.js +3 -3
- package/studio-standalone/apps/vinaya-studio/web/.next/server/pages/500.html +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/server-reference-manifest.js +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/server/server-reference-manifest.json +3 -3
- package/studio-standalone/apps/vinaya-studio/web/.next/static/chunks/00pi8vhg8w6gi.js +1 -0
- package/studio-standalone/apps/vinaya-studio/web/.next/static/chunks/{0r4i_ks9z02bw.js → 03q0q9n6-xah8.js} +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/static/chunks/0vc2u252q5q6o.js +1 -0
- package/studio-standalone/apps/vinaya-studio/web/.next/static/chunks/{1k916ih3p4nsg.js → 13g16cu00g570.js} +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/static/chunks/1hufpuody6vjv.js +1 -0
- package/studio-standalone/apps/vinaya-studio/web/.next/static/chunks/{2hmannd4bjhzy.js → 1sfxfunirkcr6.js} +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/static/chunks/{1t2kft7bxzuxn.js → 206ajg8f1a-_h.js} +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/static/chunks/{1hfhxjy577l5d.js → 267o-tsrnuwnv.js} +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/static/chunks/{25kbt5k-xb2a5.js → 279qq4twinc97.js} +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/static/chunks/{112g08xpx3kro.js → 2ka8dg687auhj.js} +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/static/chunks/{0up5x3jg-cwov.js → 2rn89uwtf2lwc.js} +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/static/chunks/{2_k6j1o9q5nn4.js → 37hnluhzj9bei.js} +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/static/chunks/{3mqu_uhluy19i.css → 3qc67qhcvbg0o.css} +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/static/chunks/{1yqs2zgvwa4p1.js → 3zugx9esh2x51.js} +1 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/static/chunks/0_jnwbarv-cqk.js +0 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/static/chunks/1ybrihl5_aocy.js +0 -1
- package/studio-standalone/apps/vinaya-studio/web/.next/static/chunks/3r5efmleneaco.js +0 -1
- /package/studio-standalone/apps/vinaya-studio/web/.next/static/{crNCHQ9uAgKOYC6DKkZma → Fmyc42qzLwFcWWHLLNy-G}/_buildManifest.js +0 -0
- /package/studio-standalone/apps/vinaya-studio/web/.next/static/{crNCHQ9uAgKOYC6DKkZma → Fmyc42qzLwFcWWHLLNy-G}/_clientMiddlewareManifest.js +0 -0
- /package/studio-standalone/apps/vinaya-studio/web/.next/static/{crNCHQ9uAgKOYC6DKkZma → Fmyc42qzLwFcWWHLLNy-G}/_ssgManifest.js +0 -0
|
@@ -1788,6 +1788,99 @@ var DERIVED_STATUSES = [
|
|
|
1788
1788
|
"incoherent"
|
|
1789
1789
|
];
|
|
1790
1790
|
var DERIVABLE_STATUSES = DERIVED_STATUSES.filter((s) => s !== "backlog");
|
|
1791
|
+
// ../../packages/aeg-core/src/parse-ledger.ts
|
|
1792
|
+
function rowFromCells(cells) {
|
|
1793
|
+
if (cells.length < 7)
|
|
1794
|
+
return null;
|
|
1795
|
+
const phase = (cells[0] ?? "").trim();
|
|
1796
|
+
if (!phase)
|
|
1797
|
+
return null;
|
|
1798
|
+
return {
|
|
1799
|
+
phase,
|
|
1800
|
+
role: (cells[1] ?? "").trim(),
|
|
1801
|
+
agentModel: (cells[2] ?? "").trim(),
|
|
1802
|
+
tokensIn: parseIntCell(cells[3] ?? ""),
|
|
1803
|
+
tokensOut: parseIntCell(cells[4] ?? ""),
|
|
1804
|
+
cost: parseCostCell(cells[5] ?? ""),
|
|
1805
|
+
date: (cells[6] ?? "").trim()
|
|
1806
|
+
};
|
|
1807
|
+
}
|
|
1808
|
+
function parseIntCell(cell) {
|
|
1809
|
+
const trimmed = cell.replace(/`/g, "").trim();
|
|
1810
|
+
if (!trimmed || isEmDashOrDash(trimmed))
|
|
1811
|
+
return null;
|
|
1812
|
+
const normalized = trimmed.replace(/[,_\s]/g, "");
|
|
1813
|
+
if (!/^-?\d+$/.test(normalized))
|
|
1814
|
+
return null;
|
|
1815
|
+
return Number(normalized);
|
|
1816
|
+
}
|
|
1817
|
+
function parseCostCell(cell) {
|
|
1818
|
+
const trimmed = cell.replace(/`/g, "").trim();
|
|
1819
|
+
if (!trimmed || isEmDashOrDash(trimmed))
|
|
1820
|
+
return null;
|
|
1821
|
+
const normalized = trimmed.replace(/^\$/, "").replace(/[,_\s]/g, "");
|
|
1822
|
+
if (!/^-?\d+(\.\d+)?$/.test(normalized))
|
|
1823
|
+
return null;
|
|
1824
|
+
return Number(normalized);
|
|
1825
|
+
}
|
|
1826
|
+
function isEmDashOrDash(s) {
|
|
1827
|
+
const t = s.trim();
|
|
1828
|
+
return t === "—" || t === "-" || t === "–";
|
|
1829
|
+
}
|
|
1830
|
+
// ../../packages/aeg-core/src/parse-token-report.ts
|
|
1831
|
+
var TOKEN_REPORT_HEADING = /^\s*(?:#{1,6}\s*Token report\s*|\*\*Token report\*\*)\s*$/i;
|
|
1832
|
+
var INLINE_FIELD_LIST = /Phase:\s*([^|]+?)\s*\|\s*Role:\s*([^|]+?)\s*\|\s*Agent\/Model:\s*([^|]+?)\s*\|\s*Tokens in:\s*([^|]+?)\s*\|\s*Tokens out:\s*([^|]+?)\s*\|\s*Cost:\s*([^|]+?)\s*\|\s*Date:\s*(.+?)\s*$/im;
|
|
1833
|
+
function parseTokenReportEntries(body) {
|
|
1834
|
+
const lines = body.split(/\r?\n/);
|
|
1835
|
+
const headingIdxs = [];
|
|
1836
|
+
lines.forEach((line, i) => {
|
|
1837
|
+
if (TOKEN_REPORT_HEADING.test(line))
|
|
1838
|
+
headingIdxs.push(i);
|
|
1839
|
+
});
|
|
1840
|
+
const out = [];
|
|
1841
|
+
for (let h = 0;h < headingIdxs.length; h++) {
|
|
1842
|
+
const start = headingIdxs[h] + 1;
|
|
1843
|
+
const end = h + 1 < headingIdxs.length ? headingIdxs[h + 1] : lines.length;
|
|
1844
|
+
const section = lines.slice(start, end).join(`
|
|
1845
|
+
`);
|
|
1846
|
+
const tableRows = parseTableSection(section);
|
|
1847
|
+
if (tableRows.length > 0) {
|
|
1848
|
+
out.push(...tableRows);
|
|
1849
|
+
continue;
|
|
1850
|
+
}
|
|
1851
|
+
const inlineRow = parseInlineFieldList(section);
|
|
1852
|
+
if (inlineRow)
|
|
1853
|
+
out.push(inlineRow);
|
|
1854
|
+
}
|
|
1855
|
+
return out;
|
|
1856
|
+
}
|
|
1857
|
+
function parseTableSection(section) {
|
|
1858
|
+
const lines = section.split(/\r?\n/);
|
|
1859
|
+
let i = 0;
|
|
1860
|
+
for (;i < lines.length; i++) {
|
|
1861
|
+
if ((lines[i] ?? "").trim().startsWith("|"))
|
|
1862
|
+
break;
|
|
1863
|
+
}
|
|
1864
|
+
if (i + 1 >= lines.length)
|
|
1865
|
+
return [];
|
|
1866
|
+
i += 2;
|
|
1867
|
+
const out = [];
|
|
1868
|
+
for (;i < lines.length; i++) {
|
|
1869
|
+
const trimmed = (lines[i] ?? "").trim();
|
|
1870
|
+
if (!trimmed.startsWith("|"))
|
|
1871
|
+
break;
|
|
1872
|
+
const row = rowFromCells(splitTableRow(trimmed));
|
|
1873
|
+
if (row)
|
|
1874
|
+
out.push(row);
|
|
1875
|
+
}
|
|
1876
|
+
return out;
|
|
1877
|
+
}
|
|
1878
|
+
function parseInlineFieldList(section) {
|
|
1879
|
+
const m = section.match(INLINE_FIELD_LIST);
|
|
1880
|
+
if (!m)
|
|
1881
|
+
return null;
|
|
1882
|
+
return rowFromCells([m[1], m[2], m[3], m[4], m[5], m[6], m[7]]);
|
|
1883
|
+
}
|
|
1791
1884
|
// ../../packages/aeg-core/src/report-tokens.ts
|
|
1792
1885
|
var DASH_LOOKALIKES = {
|
|
1793
1886
|
"-": "‑",
|
|
@@ -1796,6 +1889,7 @@ var DASH_LOOKALIKES = {
|
|
|
1796
1889
|
};
|
|
1797
1890
|
var DASH_CHARS = new Set(Object.keys(DASH_LOOKALIKES));
|
|
1798
1891
|
// ../../packages/aeg-core/src/claude-code-transcript.ts
|
|
1892
|
+
import { createHash } from "node:crypto";
|
|
1799
1893
|
function summarizeTranscript(jsonl) {
|
|
1800
1894
|
const seen = new Set;
|
|
1801
1895
|
const components = {
|
|
@@ -1844,7 +1938,14 @@ function numberOr(value, fallback) {
|
|
|
1844
1938
|
function sanitizeKey(value) {
|
|
1845
1939
|
return value.replace(/[^A-Za-z0-9]+/g, "-");
|
|
1846
1940
|
}
|
|
1941
|
+
function collisionResistantKey(value) {
|
|
1942
|
+
const digest = createHash("sha256").update(value).digest("hex");
|
|
1943
|
+
return `${sanitizeKey(value)}-${digest}`;
|
|
1944
|
+
}
|
|
1847
1945
|
function transcriptPointerPath(projectDir, tmpDir) {
|
|
1946
|
+
return `${tmpDir}/claude-transcript-${collisionResistantKey(projectDir)}.txt`;
|
|
1947
|
+
}
|
|
1948
|
+
function legacyTranscriptPointerPath(projectDir, tmpDir) {
|
|
1848
1949
|
return `${tmpDir}/claude-transcript-${sanitizeKey(projectDir)}.txt`;
|
|
1849
1950
|
}
|
|
1850
1951
|
function resolvePointer(explicitTranscriptPath, deps) {
|
|
@@ -1852,13 +1953,15 @@ function resolvePointer(explicitTranscriptPath, deps) {
|
|
|
1852
1953
|
return { path: explicitTranscriptPath, corroborated: true };
|
|
1853
1954
|
const projectDir = deps.env.CLAUDE_PROJECT_DIR ?? deps.cwd;
|
|
1854
1955
|
const tmpDir = deps.env.TMPDIR ?? "/tmp";
|
|
1855
|
-
const
|
|
1956
|
+
const primaryPointerPath = transcriptPointerPath(projectDir, tmpDir);
|
|
1957
|
+
const legacyPointerPath = legacyTranscriptPointerPath(projectDir, tmpDir);
|
|
1856
1958
|
const currentSessionId = deps.env.CLAUDE_CODE_SESSION_ID;
|
|
1857
|
-
|
|
1959
|
+
const pointerPath = deps.exists(primaryPointerPath) ? primaryPointerPath : deps.exists(legacyPointerPath) ? legacyPointerPath : undefined;
|
|
1960
|
+
if (!pointerPath) {
|
|
1858
1961
|
return {
|
|
1859
1962
|
pointerExisted: false,
|
|
1860
1963
|
corroborated: false,
|
|
1861
|
-
error: `No transcript pointer at ${
|
|
1964
|
+
error: `No transcript pointer at ${primaryPointerPath} (nor its pre-migration name ${legacyPointerPath}) ` + "and no --transcript given. Either this repo installs no track-transcript.sh Stop hook (lacking one " + "is not a defect — name the transcript directly instead), or no session has completed a turn yet."
|
|
1862
1965
|
};
|
|
1863
1966
|
}
|
|
1864
1967
|
let contents;
|
|
@@ -1933,6 +2036,9 @@ function isTokenCollectionWiringBroken(capability) {
|
|
|
1933
2036
|
return false;
|
|
1934
2037
|
return capability.reason !== "no-transcript-resolved";
|
|
1935
2038
|
}
|
|
2039
|
+
// ../../packages/aeg-core/src/metering-io-guard.ts
|
|
2040
|
+
import { closeSync, constants as fsConstants, fstatSync, openSync, readFileSync } from "node:fs";
|
|
2041
|
+
var GUARD_OPEN_FLAGS = fsConstants.O_RDONLY | fsConstants.O_NONBLOCK | fsConstants.O_NOFOLLOW;
|
|
1936
2042
|
// ../../packages/aeg-core/src/file-classify.ts
|
|
1937
2043
|
function isCodeFile(p) {
|
|
1938
2044
|
if (p.endsWith(".md"))
|
|
@@ -2139,7 +2245,7 @@ function overrideActive(opts) {
|
|
|
2139
2245
|
return false;
|
|
2140
2246
|
}
|
|
2141
2247
|
// ../../packages/aeg-core/src/premise-check.ts
|
|
2142
|
-
import { createHash } from "node:crypto";
|
|
2248
|
+
import { createHash as createHash2 } from "node:crypto";
|
|
2143
2249
|
var ASSERTION_KINDS = new Set(["contains", "absent", "sha256"]);
|
|
2144
2250
|
function isPremiseHeader(line) {
|
|
2145
2251
|
const stripped = line.replace(/[*#]/g, "").trim();
|
|
@@ -2184,7 +2290,7 @@ function checkPremises(assertions, fileReader) {
|
|
|
2184
2290
|
} else if (a.kind === "absent" && content.includes(a.value)) {
|
|
2185
2291
|
failures.push(`premise-check: ${a.path} now contains "${a.value}", but the brief pinned it absent — the premise has moved; re-dig before proceeding.`);
|
|
2186
2292
|
} else if (a.kind === "sha256") {
|
|
2187
|
-
const actual =
|
|
2293
|
+
const actual = createHash2("sha256").update(content).digest("hex");
|
|
2188
2294
|
if (actual !== a.value.toLowerCase()) {
|
|
2189
2295
|
failures.push(`premise-check: ${a.path} sha256 mismatch (brief pinned ${a.value}, file is now ${actual}) — the file changed since this brief was authored; re-dig before proceeding.`);
|
|
2190
2296
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
// src/checks/bin/check-changeset-coverage.ts
|
|
4
4
|
import { execFileSync as execFileSync3 } from "node:child_process";
|
|
5
|
-
import { readdirSync, readFileSync } from "node:fs";
|
|
5
|
+
import { readdirSync, readFileSync as readFileSync2 } from "node:fs";
|
|
6
6
|
import { join as join2, relative } from "node:path";
|
|
7
7
|
// ../../packages/aeg-core/src/gate-audience.ts
|
|
8
8
|
var GATE_AUDIENCE = {
|
|
@@ -1793,6 +1793,99 @@ var DERIVED_STATUSES = [
|
|
|
1793
1793
|
"incoherent"
|
|
1794
1794
|
];
|
|
1795
1795
|
var DERIVABLE_STATUSES = DERIVED_STATUSES.filter((s) => s !== "backlog");
|
|
1796
|
+
// ../../packages/aeg-core/src/parse-ledger.ts
|
|
1797
|
+
function rowFromCells(cells) {
|
|
1798
|
+
if (cells.length < 7)
|
|
1799
|
+
return null;
|
|
1800
|
+
const phase = (cells[0] ?? "").trim();
|
|
1801
|
+
if (!phase)
|
|
1802
|
+
return null;
|
|
1803
|
+
return {
|
|
1804
|
+
phase,
|
|
1805
|
+
role: (cells[1] ?? "").trim(),
|
|
1806
|
+
agentModel: (cells[2] ?? "").trim(),
|
|
1807
|
+
tokensIn: parseIntCell(cells[3] ?? ""),
|
|
1808
|
+
tokensOut: parseIntCell(cells[4] ?? ""),
|
|
1809
|
+
cost: parseCostCell(cells[5] ?? ""),
|
|
1810
|
+
date: (cells[6] ?? "").trim()
|
|
1811
|
+
};
|
|
1812
|
+
}
|
|
1813
|
+
function parseIntCell(cell) {
|
|
1814
|
+
const trimmed = cell.replace(/`/g, "").trim();
|
|
1815
|
+
if (!trimmed || isEmDashOrDash(trimmed))
|
|
1816
|
+
return null;
|
|
1817
|
+
const normalized = trimmed.replace(/[,_\s]/g, "");
|
|
1818
|
+
if (!/^-?\d+$/.test(normalized))
|
|
1819
|
+
return null;
|
|
1820
|
+
return Number(normalized);
|
|
1821
|
+
}
|
|
1822
|
+
function parseCostCell(cell) {
|
|
1823
|
+
const trimmed = cell.replace(/`/g, "").trim();
|
|
1824
|
+
if (!trimmed || isEmDashOrDash(trimmed))
|
|
1825
|
+
return null;
|
|
1826
|
+
const normalized = trimmed.replace(/^\$/, "").replace(/[,_\s]/g, "");
|
|
1827
|
+
if (!/^-?\d+(\.\d+)?$/.test(normalized))
|
|
1828
|
+
return null;
|
|
1829
|
+
return Number(normalized);
|
|
1830
|
+
}
|
|
1831
|
+
function isEmDashOrDash(s) {
|
|
1832
|
+
const t = s.trim();
|
|
1833
|
+
return t === "—" || t === "-" || t === "–";
|
|
1834
|
+
}
|
|
1835
|
+
// ../../packages/aeg-core/src/parse-token-report.ts
|
|
1836
|
+
var TOKEN_REPORT_HEADING = /^\s*(?:#{1,6}\s*Token report\s*|\*\*Token report\*\*)\s*$/i;
|
|
1837
|
+
var INLINE_FIELD_LIST = /Phase:\s*([^|]+?)\s*\|\s*Role:\s*([^|]+?)\s*\|\s*Agent\/Model:\s*([^|]+?)\s*\|\s*Tokens in:\s*([^|]+?)\s*\|\s*Tokens out:\s*([^|]+?)\s*\|\s*Cost:\s*([^|]+?)\s*\|\s*Date:\s*(.+?)\s*$/im;
|
|
1838
|
+
function parseTokenReportEntries(body) {
|
|
1839
|
+
const lines = body.split(/\r?\n/);
|
|
1840
|
+
const headingIdxs = [];
|
|
1841
|
+
lines.forEach((line, i) => {
|
|
1842
|
+
if (TOKEN_REPORT_HEADING.test(line))
|
|
1843
|
+
headingIdxs.push(i);
|
|
1844
|
+
});
|
|
1845
|
+
const out = [];
|
|
1846
|
+
for (let h = 0;h < headingIdxs.length; h++) {
|
|
1847
|
+
const start = headingIdxs[h] + 1;
|
|
1848
|
+
const end = h + 1 < headingIdxs.length ? headingIdxs[h + 1] : lines.length;
|
|
1849
|
+
const section = lines.slice(start, end).join(`
|
|
1850
|
+
`);
|
|
1851
|
+
const tableRows = parseTableSection(section);
|
|
1852
|
+
if (tableRows.length > 0) {
|
|
1853
|
+
out.push(...tableRows);
|
|
1854
|
+
continue;
|
|
1855
|
+
}
|
|
1856
|
+
const inlineRow = parseInlineFieldList(section);
|
|
1857
|
+
if (inlineRow)
|
|
1858
|
+
out.push(inlineRow);
|
|
1859
|
+
}
|
|
1860
|
+
return out;
|
|
1861
|
+
}
|
|
1862
|
+
function parseTableSection(section) {
|
|
1863
|
+
const lines = section.split(/\r?\n/);
|
|
1864
|
+
let i = 0;
|
|
1865
|
+
for (;i < lines.length; i++) {
|
|
1866
|
+
if ((lines[i] ?? "").trim().startsWith("|"))
|
|
1867
|
+
break;
|
|
1868
|
+
}
|
|
1869
|
+
if (i + 1 >= lines.length)
|
|
1870
|
+
return [];
|
|
1871
|
+
i += 2;
|
|
1872
|
+
const out = [];
|
|
1873
|
+
for (;i < lines.length; i++) {
|
|
1874
|
+
const trimmed = (lines[i] ?? "").trim();
|
|
1875
|
+
if (!trimmed.startsWith("|"))
|
|
1876
|
+
break;
|
|
1877
|
+
const row = rowFromCells(splitTableRow(trimmed));
|
|
1878
|
+
if (row)
|
|
1879
|
+
out.push(row);
|
|
1880
|
+
}
|
|
1881
|
+
return out;
|
|
1882
|
+
}
|
|
1883
|
+
function parseInlineFieldList(section) {
|
|
1884
|
+
const m = section.match(INLINE_FIELD_LIST);
|
|
1885
|
+
if (!m)
|
|
1886
|
+
return null;
|
|
1887
|
+
return rowFromCells([m[1], m[2], m[3], m[4], m[5], m[6], m[7]]);
|
|
1888
|
+
}
|
|
1796
1889
|
// ../../packages/aeg-core/src/report-tokens.ts
|
|
1797
1890
|
var DASH_LOOKALIKES = {
|
|
1798
1891
|
"-": "‑",
|
|
@@ -1801,6 +1894,7 @@ var DASH_LOOKALIKES = {
|
|
|
1801
1894
|
};
|
|
1802
1895
|
var DASH_CHARS = new Set(Object.keys(DASH_LOOKALIKES));
|
|
1803
1896
|
// ../../packages/aeg-core/src/claude-code-transcript.ts
|
|
1897
|
+
import { createHash } from "node:crypto";
|
|
1804
1898
|
function summarizeTranscript(jsonl) {
|
|
1805
1899
|
const seen = new Set;
|
|
1806
1900
|
const components = {
|
|
@@ -1849,7 +1943,14 @@ function numberOr(value, fallback) {
|
|
|
1849
1943
|
function sanitizeKey(value) {
|
|
1850
1944
|
return value.replace(/[^A-Za-z0-9]+/g, "-");
|
|
1851
1945
|
}
|
|
1946
|
+
function collisionResistantKey(value) {
|
|
1947
|
+
const digest = createHash("sha256").update(value).digest("hex");
|
|
1948
|
+
return `${sanitizeKey(value)}-${digest}`;
|
|
1949
|
+
}
|
|
1852
1950
|
function transcriptPointerPath(projectDir, tmpDir) {
|
|
1951
|
+
return `${tmpDir}/claude-transcript-${collisionResistantKey(projectDir)}.txt`;
|
|
1952
|
+
}
|
|
1953
|
+
function legacyTranscriptPointerPath(projectDir, tmpDir) {
|
|
1853
1954
|
return `${tmpDir}/claude-transcript-${sanitizeKey(projectDir)}.txt`;
|
|
1854
1955
|
}
|
|
1855
1956
|
function resolvePointer(explicitTranscriptPath, deps) {
|
|
@@ -1857,13 +1958,15 @@ function resolvePointer(explicitTranscriptPath, deps) {
|
|
|
1857
1958
|
return { path: explicitTranscriptPath, corroborated: true };
|
|
1858
1959
|
const projectDir = deps.env.CLAUDE_PROJECT_DIR ?? deps.cwd;
|
|
1859
1960
|
const tmpDir = deps.env.TMPDIR ?? "/tmp";
|
|
1860
|
-
const
|
|
1961
|
+
const primaryPointerPath = transcriptPointerPath(projectDir, tmpDir);
|
|
1962
|
+
const legacyPointerPath = legacyTranscriptPointerPath(projectDir, tmpDir);
|
|
1861
1963
|
const currentSessionId = deps.env.CLAUDE_CODE_SESSION_ID;
|
|
1862
|
-
|
|
1964
|
+
const pointerPath = deps.exists(primaryPointerPath) ? primaryPointerPath : deps.exists(legacyPointerPath) ? legacyPointerPath : undefined;
|
|
1965
|
+
if (!pointerPath) {
|
|
1863
1966
|
return {
|
|
1864
1967
|
pointerExisted: false,
|
|
1865
1968
|
corroborated: false,
|
|
1866
|
-
error: `No transcript pointer at ${
|
|
1969
|
+
error: `No transcript pointer at ${primaryPointerPath} (nor its pre-migration name ${legacyPointerPath}) ` + "and no --transcript given. Either this repo installs no track-transcript.sh Stop hook (lacking one " + "is not a defect — name the transcript directly instead), or no session has completed a turn yet."
|
|
1867
1970
|
};
|
|
1868
1971
|
}
|
|
1869
1972
|
let contents;
|
|
@@ -1938,6 +2041,9 @@ function isTokenCollectionWiringBroken(capability) {
|
|
|
1938
2041
|
return false;
|
|
1939
2042
|
return capability.reason !== "no-transcript-resolved";
|
|
1940
2043
|
}
|
|
2044
|
+
// ../../packages/aeg-core/src/metering-io-guard.ts
|
|
2045
|
+
import { closeSync, constants as fsConstants, fstatSync, openSync, readFileSync } from "node:fs";
|
|
2046
|
+
var GUARD_OPEN_FLAGS = fsConstants.O_RDONLY | fsConstants.O_NONBLOCK | fsConstants.O_NOFOLLOW;
|
|
1941
2047
|
// ../../packages/aeg-core/src/file-classify.ts
|
|
1942
2048
|
function isCodeFile(p) {
|
|
1943
2049
|
if (p.endsWith(".md"))
|
|
@@ -2144,7 +2250,7 @@ function overrideActive(opts) {
|
|
|
2144
2250
|
return false;
|
|
2145
2251
|
}
|
|
2146
2252
|
// ../../packages/aeg-core/src/premise-check.ts
|
|
2147
|
-
import { createHash } from "node:crypto";
|
|
2253
|
+
import { createHash as createHash2 } from "node:crypto";
|
|
2148
2254
|
var ASSERTION_KINDS = new Set(["contains", "absent", "sha256"]);
|
|
2149
2255
|
function isPremiseHeader(line) {
|
|
2150
2256
|
const stripped = line.replace(/[*#]/g, "").trim();
|
|
@@ -2189,7 +2295,7 @@ function checkPremises(assertions, fileReader) {
|
|
|
2189
2295
|
} else if (a.kind === "absent" && content.includes(a.value)) {
|
|
2190
2296
|
failures.push(`premise-check: ${a.path} now contains "${a.value}", but the brief pinned it absent — the premise has moved; re-dig before proceeding.`);
|
|
2191
2297
|
} else if (a.kind === "sha256") {
|
|
2192
|
-
const actual =
|
|
2298
|
+
const actual = createHash2("sha256").update(content).digest("hex");
|
|
2193
2299
|
if (actual !== a.value.toLowerCase()) {
|
|
2194
2300
|
failures.push(`premise-check: ${a.path} sha256 mismatch (brief pinned ${a.value}, file is now ${actual}) — the file changed since this brief was authored; re-dig before proceeding.`);
|
|
2195
2301
|
}
|
|
@@ -4067,7 +4173,7 @@ function toPosix(p) {
|
|
|
4067
4173
|
}
|
|
4068
4174
|
function readPackageJson(path) {
|
|
4069
4175
|
try {
|
|
4070
|
-
const parsed = JSON.parse(
|
|
4176
|
+
const parsed = JSON.parse(readFileSync2(path, "utf8"));
|
|
4071
4177
|
return parsed && typeof parsed === "object" ? parsed : null;
|
|
4072
4178
|
} catch {
|
|
4073
4179
|
return null;
|
|
@@ -1791,6 +1791,99 @@ var DERIVED_STATUSES = [
|
|
|
1791
1791
|
"incoherent"
|
|
1792
1792
|
];
|
|
1793
1793
|
var DERIVABLE_STATUSES = DERIVED_STATUSES.filter((s) => s !== "backlog");
|
|
1794
|
+
// ../../packages/aeg-core/src/parse-ledger.ts
|
|
1795
|
+
function rowFromCells(cells) {
|
|
1796
|
+
if (cells.length < 7)
|
|
1797
|
+
return null;
|
|
1798
|
+
const phase = (cells[0] ?? "").trim();
|
|
1799
|
+
if (!phase)
|
|
1800
|
+
return null;
|
|
1801
|
+
return {
|
|
1802
|
+
phase,
|
|
1803
|
+
role: (cells[1] ?? "").trim(),
|
|
1804
|
+
agentModel: (cells[2] ?? "").trim(),
|
|
1805
|
+
tokensIn: parseIntCell(cells[3] ?? ""),
|
|
1806
|
+
tokensOut: parseIntCell(cells[4] ?? ""),
|
|
1807
|
+
cost: parseCostCell(cells[5] ?? ""),
|
|
1808
|
+
date: (cells[6] ?? "").trim()
|
|
1809
|
+
};
|
|
1810
|
+
}
|
|
1811
|
+
function parseIntCell(cell) {
|
|
1812
|
+
const trimmed = cell.replace(/`/g, "").trim();
|
|
1813
|
+
if (!trimmed || isEmDashOrDash(trimmed))
|
|
1814
|
+
return null;
|
|
1815
|
+
const normalized = trimmed.replace(/[,_\s]/g, "");
|
|
1816
|
+
if (!/^-?\d+$/.test(normalized))
|
|
1817
|
+
return null;
|
|
1818
|
+
return Number(normalized);
|
|
1819
|
+
}
|
|
1820
|
+
function parseCostCell(cell) {
|
|
1821
|
+
const trimmed = cell.replace(/`/g, "").trim();
|
|
1822
|
+
if (!trimmed || isEmDashOrDash(trimmed))
|
|
1823
|
+
return null;
|
|
1824
|
+
const normalized = trimmed.replace(/^\$/, "").replace(/[,_\s]/g, "");
|
|
1825
|
+
if (!/^-?\d+(\.\d+)?$/.test(normalized))
|
|
1826
|
+
return null;
|
|
1827
|
+
return Number(normalized);
|
|
1828
|
+
}
|
|
1829
|
+
function isEmDashOrDash(s) {
|
|
1830
|
+
const t = s.trim();
|
|
1831
|
+
return t === "—" || t === "-" || t === "–";
|
|
1832
|
+
}
|
|
1833
|
+
// ../../packages/aeg-core/src/parse-token-report.ts
|
|
1834
|
+
var TOKEN_REPORT_HEADING = /^\s*(?:#{1,6}\s*Token report\s*|\*\*Token report\*\*)\s*$/i;
|
|
1835
|
+
var INLINE_FIELD_LIST = /Phase:\s*([^|]+?)\s*\|\s*Role:\s*([^|]+?)\s*\|\s*Agent\/Model:\s*([^|]+?)\s*\|\s*Tokens in:\s*([^|]+?)\s*\|\s*Tokens out:\s*([^|]+?)\s*\|\s*Cost:\s*([^|]+?)\s*\|\s*Date:\s*(.+?)\s*$/im;
|
|
1836
|
+
function parseTokenReportEntries(body) {
|
|
1837
|
+
const lines = body.split(/\r?\n/);
|
|
1838
|
+
const headingIdxs = [];
|
|
1839
|
+
lines.forEach((line, i) => {
|
|
1840
|
+
if (TOKEN_REPORT_HEADING.test(line))
|
|
1841
|
+
headingIdxs.push(i);
|
|
1842
|
+
});
|
|
1843
|
+
const out = [];
|
|
1844
|
+
for (let h = 0;h < headingIdxs.length; h++) {
|
|
1845
|
+
const start = headingIdxs[h] + 1;
|
|
1846
|
+
const end = h + 1 < headingIdxs.length ? headingIdxs[h + 1] : lines.length;
|
|
1847
|
+
const section = lines.slice(start, end).join(`
|
|
1848
|
+
`);
|
|
1849
|
+
const tableRows = parseTableSection(section);
|
|
1850
|
+
if (tableRows.length > 0) {
|
|
1851
|
+
out.push(...tableRows);
|
|
1852
|
+
continue;
|
|
1853
|
+
}
|
|
1854
|
+
const inlineRow = parseInlineFieldList(section);
|
|
1855
|
+
if (inlineRow)
|
|
1856
|
+
out.push(inlineRow);
|
|
1857
|
+
}
|
|
1858
|
+
return out;
|
|
1859
|
+
}
|
|
1860
|
+
function parseTableSection(section) {
|
|
1861
|
+
const lines = section.split(/\r?\n/);
|
|
1862
|
+
let i = 0;
|
|
1863
|
+
for (;i < lines.length; i++) {
|
|
1864
|
+
if ((lines[i] ?? "").trim().startsWith("|"))
|
|
1865
|
+
break;
|
|
1866
|
+
}
|
|
1867
|
+
if (i + 1 >= lines.length)
|
|
1868
|
+
return [];
|
|
1869
|
+
i += 2;
|
|
1870
|
+
const out = [];
|
|
1871
|
+
for (;i < lines.length; i++) {
|
|
1872
|
+
const trimmed = (lines[i] ?? "").trim();
|
|
1873
|
+
if (!trimmed.startsWith("|"))
|
|
1874
|
+
break;
|
|
1875
|
+
const row = rowFromCells(splitTableRow(trimmed));
|
|
1876
|
+
if (row)
|
|
1877
|
+
out.push(row);
|
|
1878
|
+
}
|
|
1879
|
+
return out;
|
|
1880
|
+
}
|
|
1881
|
+
function parseInlineFieldList(section) {
|
|
1882
|
+
const m = section.match(INLINE_FIELD_LIST);
|
|
1883
|
+
if (!m)
|
|
1884
|
+
return null;
|
|
1885
|
+
return rowFromCells([m[1], m[2], m[3], m[4], m[5], m[6], m[7]]);
|
|
1886
|
+
}
|
|
1794
1887
|
// ../../packages/aeg-core/src/report-tokens.ts
|
|
1795
1888
|
var DASH_LOOKALIKES = {
|
|
1796
1889
|
"-": "‑",
|
|
@@ -1799,6 +1892,7 @@ var DASH_LOOKALIKES = {
|
|
|
1799
1892
|
};
|
|
1800
1893
|
var DASH_CHARS = new Set(Object.keys(DASH_LOOKALIKES));
|
|
1801
1894
|
// ../../packages/aeg-core/src/claude-code-transcript.ts
|
|
1895
|
+
import { createHash } from "node:crypto";
|
|
1802
1896
|
function summarizeTranscript(jsonl) {
|
|
1803
1897
|
const seen = new Set;
|
|
1804
1898
|
const components = {
|
|
@@ -1847,7 +1941,14 @@ function numberOr(value, fallback) {
|
|
|
1847
1941
|
function sanitizeKey(value) {
|
|
1848
1942
|
return value.replace(/[^A-Za-z0-9]+/g, "-");
|
|
1849
1943
|
}
|
|
1944
|
+
function collisionResistantKey(value) {
|
|
1945
|
+
const digest = createHash("sha256").update(value).digest("hex");
|
|
1946
|
+
return `${sanitizeKey(value)}-${digest}`;
|
|
1947
|
+
}
|
|
1850
1948
|
function transcriptPointerPath(projectDir, tmpDir) {
|
|
1949
|
+
return `${tmpDir}/claude-transcript-${collisionResistantKey(projectDir)}.txt`;
|
|
1950
|
+
}
|
|
1951
|
+
function legacyTranscriptPointerPath(projectDir, tmpDir) {
|
|
1851
1952
|
return `${tmpDir}/claude-transcript-${sanitizeKey(projectDir)}.txt`;
|
|
1852
1953
|
}
|
|
1853
1954
|
function resolvePointer(explicitTranscriptPath, deps) {
|
|
@@ -1855,13 +1956,15 @@ function resolvePointer(explicitTranscriptPath, deps) {
|
|
|
1855
1956
|
return { path: explicitTranscriptPath, corroborated: true };
|
|
1856
1957
|
const projectDir = deps.env.CLAUDE_PROJECT_DIR ?? deps.cwd;
|
|
1857
1958
|
const tmpDir = deps.env.TMPDIR ?? "/tmp";
|
|
1858
|
-
const
|
|
1959
|
+
const primaryPointerPath = transcriptPointerPath(projectDir, tmpDir);
|
|
1960
|
+
const legacyPointerPath = legacyTranscriptPointerPath(projectDir, tmpDir);
|
|
1859
1961
|
const currentSessionId = deps.env.CLAUDE_CODE_SESSION_ID;
|
|
1860
|
-
|
|
1962
|
+
const pointerPath = deps.exists(primaryPointerPath) ? primaryPointerPath : deps.exists(legacyPointerPath) ? legacyPointerPath : undefined;
|
|
1963
|
+
if (!pointerPath) {
|
|
1861
1964
|
return {
|
|
1862
1965
|
pointerExisted: false,
|
|
1863
1966
|
corroborated: false,
|
|
1864
|
-
error: `No transcript pointer at ${
|
|
1967
|
+
error: `No transcript pointer at ${primaryPointerPath} (nor its pre-migration name ${legacyPointerPath}) ` + "and no --transcript given. Either this repo installs no track-transcript.sh Stop hook (lacking one " + "is not a defect — name the transcript directly instead), or no session has completed a turn yet."
|
|
1865
1968
|
};
|
|
1866
1969
|
}
|
|
1867
1970
|
let contents;
|
|
@@ -1936,6 +2039,9 @@ function isTokenCollectionWiringBroken(capability) {
|
|
|
1936
2039
|
return false;
|
|
1937
2040
|
return capability.reason !== "no-transcript-resolved";
|
|
1938
2041
|
}
|
|
2042
|
+
// ../../packages/aeg-core/src/metering-io-guard.ts
|
|
2043
|
+
import { closeSync, constants as fsConstants, fstatSync, openSync, readFileSync } from "node:fs";
|
|
2044
|
+
var GUARD_OPEN_FLAGS = fsConstants.O_RDONLY | fsConstants.O_NONBLOCK | fsConstants.O_NOFOLLOW;
|
|
1939
2045
|
// ../../packages/aeg-core/src/file-classify.ts
|
|
1940
2046
|
function isCodeFile(p) {
|
|
1941
2047
|
if (p.endsWith(".md"))
|
|
@@ -2142,7 +2248,7 @@ function overrideActive(opts) {
|
|
|
2142
2248
|
return false;
|
|
2143
2249
|
}
|
|
2144
2250
|
// ../../packages/aeg-core/src/premise-check.ts
|
|
2145
|
-
import { createHash } from "node:crypto";
|
|
2251
|
+
import { createHash as createHash2 } from "node:crypto";
|
|
2146
2252
|
var ASSERTION_KINDS = new Set(["contains", "absent", "sha256"]);
|
|
2147
2253
|
function isPremiseHeader(line) {
|
|
2148
2254
|
const stripped = line.replace(/[*#]/g, "").trim();
|
|
@@ -2187,7 +2293,7 @@ function checkPremises(assertions, fileReader) {
|
|
|
2187
2293
|
} else if (a.kind === "absent" && content.includes(a.value)) {
|
|
2188
2294
|
failures.push(`premise-check: ${a.path} now contains "${a.value}", but the brief pinned it absent — the premise has moved; re-dig before proceeding.`);
|
|
2189
2295
|
} else if (a.kind === "sha256") {
|
|
2190
|
-
const actual =
|
|
2296
|
+
const actual = createHash2("sha256").update(content).digest("hex");
|
|
2191
2297
|
if (actual !== a.value.toLowerCase()) {
|
|
2192
2298
|
failures.push(`premise-check: ${a.path} sha256 mismatch (brief pinned ${a.value}, file is now ${actual}) — the file changed since this brief was authored; re-dig before proceeding.`);
|
|
2193
2299
|
}
|