@coldtea/abide 0.0.1
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/LICENSE +21 -0
- package/README.md +10 -0
- package/dist/abide-hook.d.ts +2 -0
- package/dist/abide-hook.d.ts.map +1 -0
- package/dist/abide-hook.js +23 -0
- package/dist/abide-hook.js.map +1 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +64 -0
- package/dist/bin.js.map +1 -0
- package/dist/commands/audit.d.ts +3 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +79 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/bench.d.ts +3 -0
- package/dist/commands/bench.d.ts.map +1 -0
- package/dist/commands/bench.js +206 -0
- package/dist/commands/bench.js.map +1 -0
- package/dist/commands/calibrate.d.ts +3 -0
- package/dist/commands/calibrate.d.ts.map +1 -0
- package/dist/commands/calibrate.js +159 -0
- package/dist/commands/calibrate.js.map +1 -0
- package/dist/commands/check.d.ts +3 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +106 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/compile.d.ts +3 -0
- package/dist/commands/compile.d.ts.map +1 -0
- package/dist/commands/compile.js +116 -0
- package/dist/commands/compile.js.map +1 -0
- package/dist/commands/init.d.ts +4 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +93 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +58 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/replay.d.ts +4 -0
- package/dist/commands/replay.d.ts.map +1 -0
- package/dist/commands/replay.js +118 -0
- package/dist/commands/replay.js.map +1 -0
- package/dist/commands/report.d.ts +5 -0
- package/dist/commands/report.d.ts.map +1 -0
- package/dist/commands/report.js +78 -0
- package/dist/commands/report.js.map +1 -0
- package/dist/commands/rubric.d.ts +3 -0
- package/dist/commands/rubric.d.ts.map +1 -0
- package/dist/commands/rubric.js +40 -0
- package/dist/commands/rubric.js.map +1 -0
- package/dist/commands/uninstall.d.ts +2 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +31 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/hooks/postToolUse.d.ts +3 -0
- package/dist/hooks/postToolUse.d.ts.map +1 -0
- package/dist/hooks/postToolUse.js +145 -0
- package/dist/hooks/postToolUse.js.map +1 -0
- package/dist/hooks/sessionStart.d.ts +11 -0
- package/dist/hooks/sessionStart.d.ts.map +1 -0
- package/dist/hooks/sessionStart.js +83 -0
- package/dist/hooks/sessionStart.js.map +1 -0
- package/dist/hooks/stop.d.ts +26 -0
- package/dist/hooks/stop.d.ts.map +1 -0
- package/dist/hooks/stop.js +227 -0
- package/dist/hooks/stop.js.map +1 -0
- package/dist/hooks/turnStart.d.ts +8 -0
- package/dist/hooks/turnStart.d.ts.map +1 -0
- package/dist/hooks/turnStart.js +40 -0
- package/dist/hooks/turnStart.js.map +1 -0
- package/dist/lib/applyPatch.d.ts +22 -0
- package/dist/lib/applyPatch.d.ts.map +1 -0
- package/dist/lib/applyPatch.js +63 -0
- package/dist/lib/applyPatch.js.map +1 -0
- package/dist/lib/audit.d.ts +40 -0
- package/dist/lib/audit.d.ts.map +1 -0
- package/dist/lib/audit.js +215 -0
- package/dist/lib/audit.js.map +1 -0
- package/dist/lib/band.d.ts +20 -0
- package/dist/lib/band.d.ts.map +1 -0
- package/dist/lib/band.js +40 -0
- package/dist/lib/band.js.map +1 -0
- package/dist/lib/calibration.d.ts +13 -0
- package/dist/lib/calibration.d.ts.map +1 -0
- package/dist/lib/calibration.js +25 -0
- package/dist/lib/calibration.js.map +1 -0
- package/dist/lib/checkRunner.d.ts +34 -0
- package/dist/lib/checkRunner.d.ts.map +1 -0
- package/dist/lib/checkRunner.js +76 -0
- package/dist/lib/checkRunner.js.map +1 -0
- package/dist/lib/claude.d.ts +4 -0
- package/dist/lib/claude.d.ts.map +1 -0
- package/dist/lib/claude.js +28 -0
- package/dist/lib/claude.js.map +1 -0
- package/dist/lib/compilePrompt.d.ts +22 -0
- package/dist/lib/compilePrompt.d.ts.map +1 -0
- package/dist/lib/compilePrompt.js +33 -0
- package/dist/lib/compilePrompt.js.map +1 -0
- package/dist/lib/constants.d.ts +33 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +33 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/coverage.d.ts +7 -0
- package/dist/lib/coverage.d.ts.map +1 -0
- package/dist/lib/coverage.js +17 -0
- package/dist/lib/coverage.js.map +1 -0
- package/dist/lib/credentials.d.ts +27 -0
- package/dist/lib/credentials.d.ts.map +1 -0
- package/dist/lib/credentials.js +89 -0
- package/dist/lib/credentials.js.map +1 -0
- package/dist/lib/diff.d.ts +30 -0
- package/dist/lib/diff.d.ts.map +1 -0
- package/dist/lib/diff.js +139 -0
- package/dist/lib/diff.js.map +1 -0
- package/dist/lib/events.d.ts +5 -0
- package/dist/lib/events.d.ts.map +1 -0
- package/dist/lib/events.js +38 -0
- package/dist/lib/events.js.map +1 -0
- package/dist/lib/git.d.ts +37 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +163 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/hookRunner.d.ts +10 -0
- package/dist/lib/hookRunner.d.ts.map +1 -0
- package/dist/lib/hookRunner.js +52 -0
- package/dist/lib/hookRunner.js.map +1 -0
- package/dist/lib/hosts.d.ts +20 -0
- package/dist/lib/hosts.d.ts.map +1 -0
- package/dist/lib/hosts.js +101 -0
- package/dist/lib/hosts.js.map +1 -0
- package/dist/lib/jev.d.ts +24 -0
- package/dist/lib/jev.d.ts.map +1 -0
- package/dist/lib/jev.js +169 -0
- package/dist/lib/jev.js.map +1 -0
- package/dist/lib/lintConfig.d.ts +3 -0
- package/dist/lib/lintConfig.d.ts.map +1 -0
- package/dist/lib/lintConfig.js +55 -0
- package/dist/lib/lintConfig.js.map +1 -0
- package/dist/lib/loadRules.d.ts +12 -0
- package/dist/lib/loadRules.d.ts.map +1 -0
- package/dist/lib/loadRules.js +31 -0
- package/dist/lib/loadRules.js.map +1 -0
- package/dist/lib/opencodePlugin.d.ts +10 -0
- package/dist/lib/opencodePlugin.d.ts.map +1 -0
- package/dist/lib/opencodePlugin.js +36 -0
- package/dist/lib/opencodePlugin.js.map +1 -0
- package/dist/lib/output.d.ts +6 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +35 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/packageRoot.d.ts +12 -0
- package/dist/lib/packageRoot.d.ts.map +1 -0
- package/dist/lib/packageRoot.js +50 -0
- package/dist/lib/packageRoot.js.map +1 -0
- package/dist/lib/paths.d.ts +24 -0
- package/dist/lib/paths.d.ts.map +1 -0
- package/dist/lib/paths.js +75 -0
- package/dist/lib/paths.js.map +1 -0
- package/dist/lib/reason.d.ts +11 -0
- package/dist/lib/reason.d.ts.map +1 -0
- package/dist/lib/reason.js +31 -0
- package/dist/lib/reason.js.map +1 -0
- package/dist/lib/regularFile.d.ts +26 -0
- package/dist/lib/regularFile.d.ts.map +1 -0
- package/dist/lib/regularFile.js +77 -0
- package/dist/lib/regularFile.js.map +1 -0
- package/dist/lib/replay.d.ts +74 -0
- package/dist/lib/replay.d.ts.map +1 -0
- package/dist/lib/replay.js +250 -0
- package/dist/lib/replay.js.map +1 -0
- package/dist/lib/replayCodex.d.ts +6 -0
- package/dist/lib/replayCodex.d.ts.map +1 -0
- package/dist/lib/replayCodex.js +132 -0
- package/dist/lib/replayCodex.js.map +1 -0
- package/dist/lib/replayOpencode.d.ts +15 -0
- package/dist/lib/replayOpencode.d.ts.map +1 -0
- package/dist/lib/replayOpencode.js +154 -0
- package/dist/lib/replayOpencode.js.map +1 -0
- package/dist/lib/rubricFile.d.ts +31 -0
- package/dist/lib/rubricFile.d.ts.map +1 -0
- package/dist/lib/rubricFile.js +75 -0
- package/dist/lib/rubricFile.js.map +1 -0
- package/dist/lib/scope.d.ts +4 -0
- package/dist/lib/scope.d.ts.map +1 -0
- package/dist/lib/scope.js +14 -0
- package/dist/lib/scope.js.map +1 -0
- package/dist/lib/session.d.ts +48 -0
- package/dist/lib/session.d.ts.map +1 -0
- package/dist/lib/session.js +182 -0
- package/dist/lib/session.js.map +1 -0
- package/dist/lib/settings.d.ts +26 -0
- package/dist/lib/settings.d.ts.map +1 -0
- package/dist/lib/settings.js +104 -0
- package/dist/lib/settings.js.map +1 -0
- package/dist/lib/sources.d.ts +28 -0
- package/dist/lib/sources.d.ts.map +1 -0
- package/dist/lib/sources.js +137 -0
- package/dist/lib/sources.js.map +1 -0
- package/dist/lib/stdin.d.ts +3 -0
- package/dist/lib/stdin.d.ts.map +1 -0
- package/dist/lib/stdin.js +24 -0
- package/dist/lib/stdin.js.map +1 -0
- package/dist/lib/transcript.d.ts +3 -0
- package/dist/lib/transcript.d.ts.map +1 -0
- package/dist/lib/transcript.js +57 -0
- package/dist/lib/transcript.js.map +1 -0
- package/dist/lib/ui.d.ts +8 -0
- package/dist/lib/ui.d.ts.map +1 -0
- package/dist/lib/ui.js +34 -0
- package/dist/lib/ui.js.map +1 -0
- package/dist/ui/components/Buckets.d.ts +6 -0
- package/dist/ui/components/Buckets.d.ts.map +1 -0
- package/dist/ui/components/Buckets.js +11 -0
- package/dist/ui/components/Buckets.js.map +1 -0
- package/dist/ui/components/Callout.d.ts +11 -0
- package/dist/ui/components/Callout.d.ts.map +1 -0
- package/dist/ui/components/Callout.js +10 -0
- package/dist/ui/components/Callout.js.map +1 -0
- package/dist/ui/components/Checklist.d.ts +10 -0
- package/dist/ui/components/Checklist.d.ts.map +1 -0
- package/dist/ui/components/Checklist.js +8 -0
- package/dist/ui/components/Checklist.js.map +1 -0
- package/dist/ui/components/Columns.d.ts +28 -0
- package/dist/ui/components/Columns.d.ts.map +1 -0
- package/dist/ui/components/Columns.js +20 -0
- package/dist/ui/components/Columns.js.map +1 -0
- package/dist/ui/components/Header.d.ts +9 -0
- package/dist/ui/components/Header.d.ts.map +1 -0
- package/dist/ui/components/Header.js +7 -0
- package/dist/ui/components/Header.js.map +1 -0
- package/dist/ui/components/Live.d.ts +16 -0
- package/dist/ui/components/Live.d.ts.map +1 -0
- package/dist/ui/components/Live.js +40 -0
- package/dist/ui/components/Live.js.map +1 -0
- package/dist/ui/components/RuleTable.d.ts +15 -0
- package/dist/ui/components/RuleTable.d.ts.map +1 -0
- package/dist/ui/components/RuleTable.js +81 -0
- package/dist/ui/components/RuleTable.js.map +1 -0
- package/dist/ui/components/Section.d.ts +10 -0
- package/dist/ui/components/Section.d.ts.map +1 -0
- package/dist/ui/components/Section.js +8 -0
- package/dist/ui/components/Section.js.map +1 -0
- package/dist/ui/components/Verdicts.d.ts +9 -0
- package/dist/ui/components/Verdicts.d.ts.map +1 -0
- package/dist/ui/components/Verdicts.js +12 -0
- package/dist/ui/components/Verdicts.js.map +1 -0
- package/dist/ui/render.d.ts +20 -0
- package/dist/ui/render.d.ts.map +1 -0
- package/dist/ui/render.js +32 -0
- package/dist/ui/render.js.map +1 -0
- package/dist/ui/theme.d.ts +37 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +63 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/ui/views/AuditView.d.ts +18 -0
- package/dist/ui/views/AuditView.d.ts.map +1 -0
- package/dist/ui/views/AuditView.js +48 -0
- package/dist/ui/views/AuditView.js.map +1 -0
- package/dist/ui/views/BenchView.d.ts +33 -0
- package/dist/ui/views/BenchView.d.ts.map +1 -0
- package/dist/ui/views/BenchView.js +19 -0
- package/dist/ui/views/BenchView.js.map +1 -0
- package/dist/ui/views/CalibrateView.d.ts +26 -0
- package/dist/ui/views/CalibrateView.d.ts.map +1 -0
- package/dist/ui/views/CalibrateView.js +42 -0
- package/dist/ui/views/CalibrateView.js.map +1 -0
- package/dist/ui/views/CheckView.d.ts +19 -0
- package/dist/ui/views/CheckView.d.ts.map +1 -0
- package/dist/ui/views/CheckView.js +15 -0
- package/dist/ui/views/CheckView.js.map +1 -0
- package/dist/ui/views/ErrorView.d.ts +4 -0
- package/dist/ui/views/ErrorView.d.ts.map +1 -0
- package/dist/ui/views/ErrorView.js +26 -0
- package/dist/ui/views/ErrorView.js.map +1 -0
- package/dist/ui/views/HelpView.d.ts +2 -0
- package/dist/ui/views/HelpView.d.ts.map +1 -0
- package/dist/ui/views/HelpView.js +25 -0
- package/dist/ui/views/HelpView.js.map +1 -0
- package/dist/ui/views/InitView.d.ts +27 -0
- package/dist/ui/views/InitView.d.ts.map +1 -0
- package/dist/ui/views/InitView.js +24 -0
- package/dist/ui/views/InitView.js.map +1 -0
- package/dist/ui/views/ReplayView.d.ts +16 -0
- package/dist/ui/views/ReplayView.d.ts.map +1 -0
- package/dist/ui/views/ReplayView.js +44 -0
- package/dist/ui/views/ReplayView.js.map +1 -0
- package/dist/ui/views/ReportView.d.ts +14 -0
- package/dist/ui/views/ReportView.d.ts.map +1 -0
- package/dist/ui/views/ReportView.js +86 -0
- package/dist/ui/views/ReportView.js.map +1 -0
- package/dist/ui/views/RubricView.d.ts +18 -0
- package/dist/ui/views/RubricView.d.ts.map +1 -0
- package/dist/ui/views/RubricView.js +18 -0
- package/dist/ui/views/RubricView.js.map +1 -0
- package/opencode/abide.mjs +246 -0
- package/package.json +50 -0
- package/skills/abide-compile/SKILL.md +173 -0
- package/src/abide-hook.ts +23 -0
- package/src/bin.ts +64 -0
- package/src/commands/audit.ts +97 -0
- package/src/commands/bench.ts +226 -0
- package/src/commands/calibrate.ts +165 -0
- package/src/commands/check.ts +114 -0
- package/src/commands/compile.ts +127 -0
- package/src/commands/init.ts +109 -0
- package/src/commands/login.ts +61 -0
- package/src/commands/replay.ts +148 -0
- package/src/commands/report.ts +83 -0
- package/src/commands/rubric.ts +45 -0
- package/src/commands/uninstall.ts +33 -0
- package/src/hooks/postToolUse.ts +171 -0
- package/src/hooks/sessionStart.ts +100 -0
- package/src/hooks/stop.ts +275 -0
- package/src/hooks/turnStart.ts +36 -0
- package/src/lib/applyPatch.ts +75 -0
- package/src/lib/audit.ts +265 -0
- package/src/lib/band.ts +49 -0
- package/src/lib/calibration.ts +35 -0
- package/src/lib/checkRunner.ts +124 -0
- package/src/lib/claude.ts +35 -0
- package/src/lib/compilePrompt.ts +67 -0
- package/src/lib/constants.ts +39 -0
- package/src/lib/coverage.ts +21 -0
- package/src/lib/credentials.ts +104 -0
- package/src/lib/diff.ts +209 -0
- package/src/lib/events.ts +34 -0
- package/src/lib/git.ts +206 -0
- package/src/lib/hookRunner.ts +55 -0
- package/src/lib/hosts.ts +112 -0
- package/src/lib/jev.ts +223 -0
- package/src/lib/lintConfig.ts +53 -0
- package/src/lib/loadRules.ts +39 -0
- package/src/lib/opencodePlugin.ts +38 -0
- package/src/lib/output.ts +44 -0
- package/src/lib/packageRoot.ts +48 -0
- package/src/lib/paths.ts +96 -0
- package/src/lib/reason.ts +46 -0
- package/src/lib/regularFile.ts +96 -0
- package/src/lib/replay.ts +314 -0
- package/src/lib/replayCodex.ts +130 -0
- package/src/lib/replayOpencode.ts +186 -0
- package/src/lib/rubricFile.ts +99 -0
- package/src/lib/scope.ts +18 -0
- package/src/lib/session.ts +223 -0
- package/src/lib/settings.ts +112 -0
- package/src/lib/sources.ts +154 -0
- package/src/lib/stdin.ts +23 -0
- package/src/lib/transcript.ts +49 -0
- package/src/lib/ui.ts +38 -0
- package/src/ui/components/Buckets.tsx +30 -0
- package/src/ui/components/Callout.tsx +26 -0
- package/src/ui/components/Checklist.tsx +29 -0
- package/src/ui/components/Columns.tsx +62 -0
- package/src/ui/components/Header.tsx +35 -0
- package/src/ui/components/Live.tsx +73 -0
- package/src/ui/components/RuleTable.tsx +94 -0
- package/src/ui/components/Section.tsx +24 -0
- package/src/ui/components/Verdicts.tsx +40 -0
- package/src/ui/render.tsx +51 -0
- package/src/ui/theme.ts +65 -0
- package/src/ui/views/AuditView.tsx +140 -0
- package/src/ui/views/BenchView.tsx +87 -0
- package/src/ui/views/CalibrateView.tsx +108 -0
- package/src/ui/views/CheckView.tsx +56 -0
- package/src/ui/views/ErrorView.tsx +32 -0
- package/src/ui/views/HelpView.tsx +51 -0
- package/src/ui/views/InitView.tsx +103 -0
- package/src/ui/views/ReplayView.tsx +100 -0
- package/src/ui/views/ReportView.tsx +225 -0
- package/src/ui/views/RubricView.tsx +82 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export declare const homeDir: () => string;
|
|
2
|
+
export declare const globalAbideDir: () => string;
|
|
3
|
+
export declare const globalRubricPath: () => string;
|
|
4
|
+
export declare const sessionsDir: () => string;
|
|
5
|
+
export declare const abideDir: (root: string) => string;
|
|
6
|
+
export declare const rubricPath: (root: string) => string;
|
|
7
|
+
export declare const eventsPath: (root: string) => string;
|
|
8
|
+
/** The nearest ancestor that looks like a repository root, else the start directory. */
|
|
9
|
+
export declare const findRepoRoot: (start: string) => string;
|
|
10
|
+
export declare const expandHome: (p: string) => string;
|
|
11
|
+
/** Absolute location of a rubric source path ("~/x" or repo-relative). */
|
|
12
|
+
export declare const resolveSourcePath: (root: string, sourcePath: string) => string;
|
|
13
|
+
/** The rubric's spelling of an absolute path: repo-relative, "~/..." inside home, else absolute. */
|
|
14
|
+
export declare const toSourcePath: (root: string, absolute: string) => string;
|
|
15
|
+
/** One spelling for a source path however the agent wrote it. */
|
|
16
|
+
export declare const canonicalSourcePath: (root: string, sourcePath: string) => string;
|
|
17
|
+
export declare const relativeToRoot: (root: string, absolute: string) => string;
|
|
18
|
+
/** Files abide owns are never checked; the agent writes the rubric under supervision of the compile skill. */
|
|
19
|
+
export declare const isAbideOwned: (relativePath: string) => boolean;
|
|
20
|
+
/** Basename globs; also fed to git as pathspecs. */
|
|
21
|
+
export declare const SECRET_FILE_PATTERNS: readonly string[];
|
|
22
|
+
export declare const isSecretFile: (relativePath: string) => boolean;
|
|
23
|
+
export declare const isExcludedPath: (relativePath: string) => boolean;
|
|
24
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,OAAO,QAAO,MAAiD,CAAC;AAE7E,eAAO,MAAM,cAAc,QAAO,MAAwC,CAAC;AAC3E,eAAO,MAAM,gBAAgB,QAAO,MAAoD,CAAC;AACzF,eAAO,MAAM,WAAW,QAAO,MAAiD,CAAC;AAEjF,eAAO,MAAM,QAAQ,SAAU,MAAM,KAAG,MAAmC,CAAC;AAC5E,eAAO,MAAM,UAAU,SAAU,MAAM,KAAG,MAAkD,CAAC;AAC7F,eAAO,MAAM,UAAU,SAAU,MAAM,KAAG,MAAmD,CAAC;AAY9F,wFAAwF;AACxF,eAAO,MAAM,YAAY,UAAW,MAAM,KAAG,MAc5C,CAAC;AAEF,eAAO,MAAM,UAAU,MAAO,MAAM,KAAG,MAC4C,CAAC;AAEpF,0EAA0E;AAC1E,eAAO,MAAM,iBAAiB,SAAU,MAAM,cAAc,MAAM,KAAG,MACiB,CAAC;AAIvF,oGAAoG;AACpG,eAAO,MAAM,YAAY,SAAU,MAAM,YAAY,MAAM,KAAG,MAe7D,CAAC;AAEF,iEAAiE;AACjE,eAAO,MAAM,mBAAmB,SAAU,MAAM,cAAc,MAAM,KAAG,MACd,CAAC;AAE1D,eAAO,MAAM,cAAc,SAAU,MAAM,YAAY,MAAM,KAAG,MACxB,CAAC;AAEzC,8GAA8G;AAC9G,eAAO,MAAM,YAAY,iBAAkB,MAAM,KAAG,OACa,CAAC;AAElE,oDAAoD;AACpD,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAMjD,CAAC;AAIF,eAAO,MAAM,YAAY,iBAAkB,MAAM,KAAG,OACH,CAAC;AAElD,eAAO,MAAM,cAAc,iBAAkB,MAAM,KAAG,OACI,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { existsSync, statSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import picomatch from "picomatch";
|
|
5
|
+
export const homeDir = () => process.env.ABIDE_HOME_DIR ?? homedir();
|
|
6
|
+
export const globalAbideDir = () => path.join(homeDir(), ".abide");
|
|
7
|
+
export const globalRubricPath = () => path.join(globalAbideDir(), "global.json");
|
|
8
|
+
export const sessionsDir = () => path.join(globalAbideDir(), "sessions");
|
|
9
|
+
export const abideDir = (root) => path.join(root, ".abide");
|
|
10
|
+
export const rubricPath = (root) => path.join(abideDir(root), "rubric.json");
|
|
11
|
+
export const eventsPath = (root) => path.join(abideDir(root), "events.jsonl");
|
|
12
|
+
const isDir = (p) => {
|
|
13
|
+
try {
|
|
14
|
+
return statSync(p).isDirectory();
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
const ROOT_MARKERS = [".git", ".abide", "AGENTS.md", "CLAUDE.md"];
|
|
21
|
+
/** The nearest ancestor that looks like a repository root, else the start directory. */
|
|
22
|
+
export const findRepoRoot = (start) => {
|
|
23
|
+
let dir = path.resolve(start);
|
|
24
|
+
if (!isDir(dir))
|
|
25
|
+
dir = path.dirname(dir);
|
|
26
|
+
let fallback;
|
|
27
|
+
for (;;) {
|
|
28
|
+
if (existsSync(path.join(dir, ".git")))
|
|
29
|
+
return dir;
|
|
30
|
+
if (fallback === undefined && ROOT_MARKERS.some((m) => existsSync(path.join(dir, m)))) {
|
|
31
|
+
fallback = dir;
|
|
32
|
+
}
|
|
33
|
+
const parent = path.dirname(dir);
|
|
34
|
+
if (parent === dir)
|
|
35
|
+
break;
|
|
36
|
+
dir = parent;
|
|
37
|
+
}
|
|
38
|
+
return fallback ?? path.resolve(start);
|
|
39
|
+
};
|
|
40
|
+
export const expandHome = (p) => p === "~" ? homeDir() : p.startsWith("~/") ? path.join(homeDir(), p.slice(2)) : p;
|
|
41
|
+
/** Absolute location of a rubric source path ("~/x" or repo-relative). */
|
|
42
|
+
export const resolveSourcePath = (root, sourcePath) => sourcePath.startsWith("~") ? expandHome(sourcePath) : path.resolve(root, sourcePath);
|
|
43
|
+
const toPosix = (p) => p.split(path.sep).join("/");
|
|
44
|
+
/** The rubric's spelling of an absolute path: repo-relative, "~/..." inside home, else absolute. */
|
|
45
|
+
export const toSourcePath = (root, absolute) => {
|
|
46
|
+
const rel = path.relative(root, absolute);
|
|
47
|
+
if (path.resolve(root) !== homeDir() &&
|
|
48
|
+
rel !== "" &&
|
|
49
|
+
!rel.startsWith("..") &&
|
|
50
|
+
!path.isAbsolute(rel)) {
|
|
51
|
+
return toPosix(rel);
|
|
52
|
+
}
|
|
53
|
+
const fromHome = path.relative(homeDir(), absolute);
|
|
54
|
+
if (fromHome !== "" && !fromHome.startsWith("..") && !path.isAbsolute(fromHome)) {
|
|
55
|
+
return `~/${toPosix(fromHome)}`;
|
|
56
|
+
}
|
|
57
|
+
return toPosix(absolute);
|
|
58
|
+
};
|
|
59
|
+
/** One spelling for a source path however the agent wrote it. */
|
|
60
|
+
export const canonicalSourcePath = (root, sourcePath) => toSourcePath(root, resolveSourcePath(root, sourcePath));
|
|
61
|
+
export const relativeToRoot = (root, absolute) => toPosix(path.relative(root, absolute));
|
|
62
|
+
/** Files abide owns are never checked; the agent writes the rubric under supervision of the compile skill. */
|
|
63
|
+
export const isAbideOwned = (relativePath) => relativePath === ".abide" || relativePath.startsWith(".abide/");
|
|
64
|
+
/** Basename globs; also fed to git as pathspecs. */
|
|
65
|
+
export const SECRET_FILE_PATTERNS = [
|
|
66
|
+
".env",
|
|
67
|
+
".env.*",
|
|
68
|
+
".envrc",
|
|
69
|
+
"*.pem",
|
|
70
|
+
"*.key",
|
|
71
|
+
];
|
|
72
|
+
const isSecretName = picomatch([...SECRET_FILE_PATTERNS], { dot: true });
|
|
73
|
+
export const isSecretFile = (relativePath) => isSecretName(path.posix.basename(relativePath));
|
|
74
|
+
export const isExcludedPath = (relativePath) => isAbideOwned(relativePath) || isSecretFile(relativePath);
|
|
75
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Rule, Verdict } from "@coldtea/abide-schema";
|
|
2
|
+
/** One sentence per violation, naming the rule. Never the whole instruction file. */
|
|
3
|
+
export declare const repairReason: (phase: "edit" | "turn", violations: readonly {
|
|
4
|
+
rule: Rule;
|
|
5
|
+
verdict: Verdict;
|
|
6
|
+
}[], files: readonly string[]) => string;
|
|
7
|
+
export declare const flagNotice: (phase: "edit" | "turn", flagged: readonly {
|
|
8
|
+
rule: Rule;
|
|
9
|
+
verdict: Verdict;
|
|
10
|
+
}[], files: readonly string[]) => string;
|
|
11
|
+
//# sourceMappingURL=reason.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reason.d.ts","sourceRoot":"","sources":["../../src/lib/reason.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAY3D,qFAAqF;AACrF,eAAO,MAAM,YAAY,UAChB,MAAM,GAAG,MAAM,cACV,SAAS;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,EAAE,SAChD,SAAS,MAAM,EAAE,KACvB,MAiBF,CAAC;AAEF,eAAO,MAAM,UAAU,UACd,MAAM,GAAG,MAAM,WACb,SAAS;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,EAAE,SAC7C,SAAS,MAAM,EAAE,KACvB,MAKF,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
const where = (rule) => rule.source.line === undefined
|
|
2
|
+
? rule.source.path
|
|
3
|
+
: `${rule.source.path} line ${rule.source.line}`;
|
|
4
|
+
const quote = (text) => {
|
|
5
|
+
const trimmed = text.trim().replace(/\s+/g, " ");
|
|
6
|
+
return trimmed.length > 220 ? `${trimmed.slice(0, 217)}...` : trimmed;
|
|
7
|
+
};
|
|
8
|
+
/** One sentence per violation, naming the rule. Never the whole instruction file. */
|
|
9
|
+
export const repairReason = (phase, violations, files) => {
|
|
10
|
+
const lines = violations.map(({ rule, verdict }) => {
|
|
11
|
+
const evidence = rule.check.type === "lint" && verdict.answer !== undefined
|
|
12
|
+
? ` Matched: ${verdict.answer}`
|
|
13
|
+
: verdict.answer !== undefined
|
|
14
|
+
? ` Judged: ${verdict.answer} (${verdict.probability.toFixed(2)}).`
|
|
15
|
+
: ` (${verdict.probability.toFixed(2)})`;
|
|
16
|
+
return `Rule "${rule.id}" from ${where(rule)}: "${quote(rule.text)}".${evidence}`;
|
|
17
|
+
});
|
|
18
|
+
const subject = phase === "edit" ? "This edit" : "The changes in this turn";
|
|
19
|
+
const target = files.length === 1 ? files[0] : `${files.length} files (${files.join(", ")})`;
|
|
20
|
+
const ask = phase === "edit"
|
|
21
|
+
? `Repair ${target} now, then continue with the task.`
|
|
22
|
+
: `Repair ${target} before you finish. Keep the fix to what the rule asks.`;
|
|
23
|
+
return `Abide: ${subject} appears to break ${lines.length === 1 ? "a rule" : `${lines.length} rules`} from this repository's instructions.\n${lines.map((l) => `- ${l}`).join("\n")}\n${ask}`;
|
|
24
|
+
};
|
|
25
|
+
export const flagNotice = (phase, flagged, files) => {
|
|
26
|
+
const list = flagged
|
|
27
|
+
.map(({ rule, verdict }) => `${rule.id} ${verdict.probability.toFixed(2)}`)
|
|
28
|
+
.join(", ");
|
|
29
|
+
return `Abide: uncertain about ${list} on ${files.join(", ")} (${phase}). Not sent to the agent. Details in .abide/events.jsonl.`;
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=reason.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reason.js","sourceRoot":"","sources":["../../src/lib/reason.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
type Use = "read" | "append" | "replace";
|
|
2
|
+
type OpenOptions = {
|
|
3
|
+
followSymlinks?: boolean;
|
|
4
|
+
use?: Use;
|
|
5
|
+
};
|
|
6
|
+
type ReadOptions = Omit<OpenOptions, "use"> & {
|
|
7
|
+
maxBytes?: number;
|
|
8
|
+
};
|
|
9
|
+
type WriteOptions = Omit<OpenOptions, "use"> & {
|
|
10
|
+
use: Exclude<Use, "read">;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* A FIFO or device would hold a synchronous read or write for as long as the
|
|
14
|
+
* other side likes, past any hook deadline. Opening non-blocking and judging
|
|
15
|
+
* the descriptor leaves no window between the check and the use. The caller
|
|
16
|
+
* closes it.
|
|
17
|
+
*/
|
|
18
|
+
export declare const openRegular: (file: string, options?: OpenOptions) => {
|
|
19
|
+
fd: number;
|
|
20
|
+
size: number;
|
|
21
|
+
} | undefined;
|
|
22
|
+
export declare const readRegularFile: (file: string, options?: ReadOptions) => Buffer | undefined;
|
|
23
|
+
export declare const readRegularText: (file: string, options?: ReadOptions) => string | undefined;
|
|
24
|
+
export declare const writeRegularFile: (file: string, text: string, options: WriteOptions) => boolean;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=regularFile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regularFile.d.ts","sourceRoot":"","sources":["../../src/lib/regularFile.ts"],"names":[],"mappings":"AAWA,KAAK,GAAG,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEzC,KAAK,WAAW,GAAG;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,GAAG,CAAC,EAAE,GAAG,CAAC;CACX,CAAC;AAEF,KAAK,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpE,KAAK,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG;IAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC;AAQ7E;;;;;GAKG;AACH,eAAO,MAAM,WAAW,SAChB,MAAM,YACH,WAAW,KACnB;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,SAoBjC,CAAC;AAEF,eAAO,MAAM,eAAe,SAAU,MAAM,YAAW,WAAW,KAAQ,MAAM,GAAG,SAoBlF,CAAC;AAEF,eAAO,MAAM,eAAe,SAAU,MAAM,YAAW,WAAW,KAAQ,MAAM,GAAG,SACjC,CAAC;AAEnD,eAAO,MAAM,gBAAgB,SAAU,MAAM,QAAQ,MAAM,WAAW,YAAY,KAAG,OAWpF,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { closeSync, constants, fstatSync, openSync, readSync, writeSync, } from "node:fs";
|
|
2
|
+
import { MAX_FILE_READ_BYTES } from "./constants.js";
|
|
3
|
+
const FLAGS = {
|
|
4
|
+
read: constants.O_RDONLY,
|
|
5
|
+
append: constants.O_WRONLY | constants.O_APPEND | constants.O_CREAT,
|
|
6
|
+
replace: constants.O_WRONLY | constants.O_CREAT | constants.O_TRUNC,
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* A FIFO or device would hold a synchronous read or write for as long as the
|
|
10
|
+
* other side likes, past any hook deadline. Opening non-blocking and judging
|
|
11
|
+
* the descriptor leaves no window between the check and the use. The caller
|
|
12
|
+
* closes it.
|
|
13
|
+
*/
|
|
14
|
+
export const openRegular = (file, options = {}) => {
|
|
15
|
+
const { followSymlinks = true, use = "read" } = options;
|
|
16
|
+
let fd;
|
|
17
|
+
try {
|
|
18
|
+
fd = openSync(file, FLAGS[use] | constants.O_NONBLOCK | (followSymlinks ? 0 : constants.O_NOFOLLOW));
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
let stat;
|
|
24
|
+
try {
|
|
25
|
+
stat = fstatSync(fd);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
stat = undefined;
|
|
29
|
+
}
|
|
30
|
+
if (stat?.isFile())
|
|
31
|
+
return { fd, size: stat.size };
|
|
32
|
+
closeSync(fd);
|
|
33
|
+
return undefined;
|
|
34
|
+
};
|
|
35
|
+
export const readRegularFile = (file, options = {}) => {
|
|
36
|
+
const { maxBytes = MAX_FILE_READ_BYTES, ...open } = options;
|
|
37
|
+
const opened = openRegular(file, open);
|
|
38
|
+
if (opened === undefined)
|
|
39
|
+
return undefined;
|
|
40
|
+
const { fd, size } = opened;
|
|
41
|
+
try {
|
|
42
|
+
if (size > maxBytes)
|
|
43
|
+
return undefined;
|
|
44
|
+
const buffer = Buffer.alloc(size);
|
|
45
|
+
let read = 0;
|
|
46
|
+
while (read < size) {
|
|
47
|
+
const count = readSync(fd, buffer, read, size - read, read);
|
|
48
|
+
if (count === 0)
|
|
49
|
+
break;
|
|
50
|
+
read += count;
|
|
51
|
+
}
|
|
52
|
+
return buffer.subarray(0, read);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
finally {
|
|
58
|
+
closeSync(fd);
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
export const readRegularText = (file, options = {}) => readRegularFile(file, options)?.toString("utf8");
|
|
62
|
+
export const writeRegularFile = (file, text, options) => {
|
|
63
|
+
const opened = openRegular(file, options);
|
|
64
|
+
if (opened === undefined)
|
|
65
|
+
return false;
|
|
66
|
+
try {
|
|
67
|
+
writeSync(opened.fd, text);
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
finally {
|
|
74
|
+
closeSync(opened.fd);
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=regularFile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regularFile.js","sourceRoot":"","sources":["../../src/lib/regularFile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { type PostToolUseInput, type Rule, type Thresholds, type Verdict } from "@coldtea/abide-schema";
|
|
2
|
+
/**
|
|
3
|
+
* A past coding session, read back from the host's transcript, so every edit
|
|
4
|
+
* it made can be judged as if abide had been installed at the time. Nothing
|
|
5
|
+
* here touches the working tree: the diffs come from the transcript alone.
|
|
6
|
+
*/
|
|
7
|
+
export type ReplayEdit = {
|
|
8
|
+
turn: number;
|
|
9
|
+
input: PostToolUseInput;
|
|
10
|
+
};
|
|
11
|
+
export type ReplayTurn = {
|
|
12
|
+
index: number;
|
|
13
|
+
prompt: string | undefined;
|
|
14
|
+
edits: ReplayEdit[];
|
|
15
|
+
};
|
|
16
|
+
export type ReplaySession = {
|
|
17
|
+
file: string;
|
|
18
|
+
cwd: string;
|
|
19
|
+
turns: ReplayTurn[];
|
|
20
|
+
};
|
|
21
|
+
export declare const parseTranscript: (file: string) => ReplaySession;
|
|
22
|
+
export type ReplayEditResult = {
|
|
23
|
+
session: string;
|
|
24
|
+
turn: number;
|
|
25
|
+
file: string;
|
|
26
|
+
verdicts: Verdict[];
|
|
27
|
+
costUsd: number;
|
|
28
|
+
error?: string;
|
|
29
|
+
diff?: string;
|
|
30
|
+
task?: string;
|
|
31
|
+
};
|
|
32
|
+
export type ReplayTurnResult = {
|
|
33
|
+
session: string;
|
|
34
|
+
turn: number;
|
|
35
|
+
files: string[];
|
|
36
|
+
verdicts: Verdict[];
|
|
37
|
+
costUsd: number;
|
|
38
|
+
error?: string;
|
|
39
|
+
};
|
|
40
|
+
export type ReplayResult = {
|
|
41
|
+
edits: ReplayEditResult[];
|
|
42
|
+
turns: ReplayTurnResult[];
|
|
43
|
+
};
|
|
44
|
+
export type ReplayProgress = (done: number, total: number, spendUsd: number) => void;
|
|
45
|
+
/**
|
|
46
|
+
* Judges every edit of every session as the edit hook would have, then every
|
|
47
|
+
* turn as the stop hook would have, from the edits alone. Shell-made changes
|
|
48
|
+
* are not in a transcript and are not judged.
|
|
49
|
+
*/
|
|
50
|
+
export declare const replaySessions: (sessions: readonly ReplaySession[], rules: readonly Rule[], thresholds: Thresholds, concurrency: number, progress: ReplayProgress, keepDiffs?: boolean) => Promise<ReplayResult>;
|
|
51
|
+
/** Turn ranges the drift is reported over. The first covers the session's opening, where instructions are fresh. */
|
|
52
|
+
export declare const DRIFT_BUCKETS: readonly {
|
|
53
|
+
label: string;
|
|
54
|
+
from: number;
|
|
55
|
+
to: number;
|
|
56
|
+
}[];
|
|
57
|
+
export type DriftRow = {
|
|
58
|
+
label: string;
|
|
59
|
+
edits: number;
|
|
60
|
+
broken: number;
|
|
61
|
+
/** Share of judged edits with at least one rule above the act line. */
|
|
62
|
+
rate: number;
|
|
63
|
+
};
|
|
64
|
+
export declare const driftByTurn: (edits: readonly ReplayEditResult[]) => DriftRow[];
|
|
65
|
+
export type RuleTally = {
|
|
66
|
+
rule: string;
|
|
67
|
+
phase: "edit" | "turn";
|
|
68
|
+
broken: number;
|
|
69
|
+
flagged: number;
|
|
70
|
+
of: number;
|
|
71
|
+
example: string;
|
|
72
|
+
};
|
|
73
|
+
export declare const tallyRules: (result: ReplayResult, rules: readonly Rule[]) => RuleTally[];
|
|
74
|
+
//# sourceMappingURL=replay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../../src/lib/replay.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,IAAI,EACT,KAAK,UAAU,EACf,KAAK,OAAO,EACb,MAAM,uBAAuB,CAAC;AAQ/B;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,gBAAgB,CAAA;CAAE,CAAC;AACnE,MAAM,MAAM,UAAU,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,CAAA;CAAE,CAAC;AAC5F,MAAM,MAAM,aAAa,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,CAAA;CAAE,CAAC;AAyB/E,eAAO,MAAM,eAAe,SAAU,MAAM,KAAG,aA6D9C,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAAC,KAAK,EAAE,gBAAgB,EAAE,CAAA;CAAE,CAAC;AAEpF,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;AAIrF;;;;GAIG;AACH,eAAO,MAAM,cAAc,aACf,SAAS,aAAa,EAAE,SAC3B,SAAS,IAAI,EAAE,cACV,UAAU,eACT,MAAM,YACT,cAAc,0BAEvB,OAAO,CAAC,YAAY,CAmGtB,CAAC;AAEF,oHAAoH;AACpH,eAAO,MAAM,aAAa,EAAE,SAAS;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,EAI/E,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,eAAO,MAAM,WAAW,UAAW,SAAS,gBAAgB,EAAE,KAAG,QAAQ,EAYrE,CAAC;AAEL,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,eAAO,MAAM,UAAU,WAAY,YAAY,SAAS,SAAS,IAAI,EAAE,KAAG,SAAS,EAyBlF,CAAC"}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { postToolUseInputSchema, } from "@coldtea/abide-schema";
|
|
4
|
+
import { pool } from "./audit.js";
|
|
5
|
+
import { runCheck } from "./checkRunner.js";
|
|
6
|
+
import { EDIT_CHECK_TIMEOUT_MS, MAX_TASK_CHARS, TURN_CHECK_TIMEOUT_MS } from "./constants.js";
|
|
7
|
+
import { boundState, editsFromPostToolUse } from "./diff.js";
|
|
8
|
+
import { findRepoRoot, isExcludedPath, relativeToRoot } from "./paths.js";
|
|
9
|
+
const EDIT_TOOLS = new Set(["Edit", "Write", "MultiEdit"]);
|
|
10
|
+
const asRecord = (value) => {
|
|
11
|
+
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
12
|
+
return undefined;
|
|
13
|
+
const record = { ...value };
|
|
14
|
+
return record;
|
|
15
|
+
};
|
|
16
|
+
const asList = (value) => (Array.isArray(value) ? value : []);
|
|
17
|
+
const promptText = (content) => {
|
|
18
|
+
if (typeof content === "string")
|
|
19
|
+
return content.trim() === "" ? undefined : content;
|
|
20
|
+
const parts = asList(content).flatMap((p) => {
|
|
21
|
+
const part = asRecord(p);
|
|
22
|
+
return part?.type === "text" && typeof part.text === "string" ? [part.text] : [];
|
|
23
|
+
});
|
|
24
|
+
const hasToolResult = asList(content).some((p) => asRecord(p)?.type === "tool_result");
|
|
25
|
+
if (hasToolResult || parts.length === 0)
|
|
26
|
+
return undefined;
|
|
27
|
+
return parts.join("\n");
|
|
28
|
+
};
|
|
29
|
+
export const parseTranscript = (file) => {
|
|
30
|
+
const turns = [];
|
|
31
|
+
const uses = new Map();
|
|
32
|
+
let cwd;
|
|
33
|
+
let turnIndex = 0;
|
|
34
|
+
const current = () => {
|
|
35
|
+
const last = turns.at(-1);
|
|
36
|
+
if (last !== undefined)
|
|
37
|
+
return last;
|
|
38
|
+
const first = { index: 0, prompt: undefined, edits: [] };
|
|
39
|
+
turns.push(first);
|
|
40
|
+
return first;
|
|
41
|
+
};
|
|
42
|
+
for (const line of readFileSync(file, "utf8").split("\n")) {
|
|
43
|
+
if (line.trim() === "")
|
|
44
|
+
continue;
|
|
45
|
+
let entry;
|
|
46
|
+
try {
|
|
47
|
+
entry = asRecord(JSON.parse(line));
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// a torn line, still being written
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (entry === undefined)
|
|
54
|
+
continue;
|
|
55
|
+
if (typeof entry.cwd === "string")
|
|
56
|
+
cwd ??= entry.cwd;
|
|
57
|
+
const message = asRecord(entry.message);
|
|
58
|
+
if (entry.type === "user" && entry.isMeta !== true) {
|
|
59
|
+
const prompt = promptText(message?.content);
|
|
60
|
+
if (prompt !== undefined) {
|
|
61
|
+
turnIndex += 1;
|
|
62
|
+
turns.push({ index: turnIndex, prompt: prompt.slice(0, MAX_TASK_CHARS), edits: [] });
|
|
63
|
+
}
|
|
64
|
+
const result = asRecord(entry.toolUseResult);
|
|
65
|
+
for (const p of asList(message?.content)) {
|
|
66
|
+
const part = asRecord(p);
|
|
67
|
+
if (part?.type !== "tool_result" || typeof part.tool_use_id !== "string")
|
|
68
|
+
continue;
|
|
69
|
+
const use = uses.get(part.tool_use_id);
|
|
70
|
+
if (use === undefined)
|
|
71
|
+
continue;
|
|
72
|
+
uses.delete(part.tool_use_id);
|
|
73
|
+
const parsed = postToolUseInputSchema.safeParse({
|
|
74
|
+
session_id: path.basename(file, ".jsonl"),
|
|
75
|
+
cwd: cwd ?? process.cwd(),
|
|
76
|
+
hook_event_name: "PostToolUse",
|
|
77
|
+
tool_name: use.name,
|
|
78
|
+
tool_use_id: use.id,
|
|
79
|
+
tool_input: use.input,
|
|
80
|
+
...(result === undefined ? {} : { tool_response: result }),
|
|
81
|
+
});
|
|
82
|
+
if (!parsed.success)
|
|
83
|
+
continue;
|
|
84
|
+
const turn = turns.find((t) => t.index === use.turn) ?? current();
|
|
85
|
+
turn.edits.push({ turn: turn.index, input: parsed.data });
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (entry.type === "assistant") {
|
|
89
|
+
for (const p of asList(message?.content)) {
|
|
90
|
+
const part = asRecord(p);
|
|
91
|
+
if (part?.type !== "tool_use" || typeof part.id !== "string")
|
|
92
|
+
continue;
|
|
93
|
+
if (typeof part.name !== "string" || !EDIT_TOOLS.has(part.name))
|
|
94
|
+
continue;
|
|
95
|
+
uses.set(part.id, { id: part.id, name: part.name, input: part.input, turn: turnIndex });
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return { file, cwd: cwd ?? process.cwd(), turns: turns.filter((t) => t.edits.length > 0) };
|
|
100
|
+
};
|
|
101
|
+
const failed = (error) => (error instanceof Error ? error.message : String(error));
|
|
102
|
+
/**
|
|
103
|
+
* Judges every edit of every session as the edit hook would have, then every
|
|
104
|
+
* turn as the stop hook would have, from the edits alone. Shell-made changes
|
|
105
|
+
* are not in a transcript and are not judged.
|
|
106
|
+
*/
|
|
107
|
+
export const replaySessions = async (sessions, rules, thresholds, concurrency, progress, keepDiffs = false) => {
|
|
108
|
+
const jobs = sessions.flatMap((session) => session.turns.flatMap((turn) => turn.edits.map((edit) => ({ session, turn, edit }))));
|
|
109
|
+
const edits = [];
|
|
110
|
+
const turnDiffs = new Map();
|
|
111
|
+
let done = 0;
|
|
112
|
+
let spendUsd = 0;
|
|
113
|
+
await pool(jobs, concurrency, async ({ session, turn, edit }) => {
|
|
114
|
+
const root = findRepoRoot(session.cwd);
|
|
115
|
+
const name = path.basename(session.file, ".jsonl");
|
|
116
|
+
for (const hunk of editsFromPostToolUse(edit.input)) {
|
|
117
|
+
const relative = relativeToRoot(root, hunk.filePath);
|
|
118
|
+
if (relative.startsWith("..") || isExcludedPath(relative) || hunk.text === undefined)
|
|
119
|
+
continue;
|
|
120
|
+
const { text } = boundState(hunk.text);
|
|
121
|
+
if (text.trim() === "")
|
|
122
|
+
continue;
|
|
123
|
+
const key = `${name}:${turn.index}`;
|
|
124
|
+
const bucket = turnDiffs.get(key) ?? { session, turn, files: new Map() };
|
|
125
|
+
bucket.files.set(relative, [...(bucket.files.get(relative) ?? []), text]);
|
|
126
|
+
turnDiffs.set(key, bucket);
|
|
127
|
+
try {
|
|
128
|
+
const out = await runCheck({
|
|
129
|
+
phase: "edit",
|
|
130
|
+
fileDiffs: [{ file: relative, text }],
|
|
131
|
+
task: turn.prompt,
|
|
132
|
+
rules,
|
|
133
|
+
thresholds,
|
|
134
|
+
timeoutMs: EDIT_CHECK_TIMEOUT_MS,
|
|
135
|
+
retries: 2,
|
|
136
|
+
});
|
|
137
|
+
spendUsd += out.usage.costUsd ?? 0;
|
|
138
|
+
edits.push({
|
|
139
|
+
session: name,
|
|
140
|
+
turn: turn.index,
|
|
141
|
+
file: relative,
|
|
142
|
+
verdicts: out.verdicts,
|
|
143
|
+
costUsd: out.usage.costUsd ?? 0,
|
|
144
|
+
...(keepDiffs
|
|
145
|
+
? { diff: text, ...(turn.prompt === undefined ? {} : { task: turn.prompt }) }
|
|
146
|
+
: {}),
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
edits.push({
|
|
151
|
+
session: name,
|
|
152
|
+
turn: turn.index,
|
|
153
|
+
file: relative,
|
|
154
|
+
verdicts: [],
|
|
155
|
+
costUsd: 0,
|
|
156
|
+
error: failed(error),
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
done += 1;
|
|
161
|
+
progress(done, jobs.length, spendUsd);
|
|
162
|
+
});
|
|
163
|
+
const turns = [];
|
|
164
|
+
await pool([...turnDiffs.values()], concurrency, async ({ session, turn, files }) => {
|
|
165
|
+
const name = path.basename(session.file, ".jsonl");
|
|
166
|
+
const fileDiffs = [...files.entries()].map(([file, texts]) => ({
|
|
167
|
+
file,
|
|
168
|
+
text: boundState(texts.join("\n"), 8_000).text,
|
|
169
|
+
}));
|
|
170
|
+
try {
|
|
171
|
+
const out = await runCheck({
|
|
172
|
+
phase: "turn",
|
|
173
|
+
fileDiffs,
|
|
174
|
+
task: turn.prompt,
|
|
175
|
+
rules,
|
|
176
|
+
thresholds,
|
|
177
|
+
timeoutMs: TURN_CHECK_TIMEOUT_MS,
|
|
178
|
+
retries: 2,
|
|
179
|
+
});
|
|
180
|
+
spendUsd += out.usage.costUsd ?? 0;
|
|
181
|
+
turns.push({
|
|
182
|
+
session: name,
|
|
183
|
+
turn: turn.index,
|
|
184
|
+
files: fileDiffs.map((f) => f.file),
|
|
185
|
+
verdicts: out.verdicts,
|
|
186
|
+
costUsd: out.usage.costUsd ?? 0,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
turns.push({
|
|
191
|
+
session: name,
|
|
192
|
+
turn: turn.index,
|
|
193
|
+
files: fileDiffs.map((f) => f.file),
|
|
194
|
+
verdicts: [],
|
|
195
|
+
costUsd: 0,
|
|
196
|
+
error: failed(error),
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
progress(done, jobs.length, spendUsd);
|
|
200
|
+
});
|
|
201
|
+
return { edits, turns };
|
|
202
|
+
};
|
|
203
|
+
/** Turn ranges the drift is reported over. The first covers the session's opening, where instructions are fresh. */
|
|
204
|
+
export const DRIFT_BUCKETS = [
|
|
205
|
+
{ label: "turns 1 to 5", from: 1, to: 5 },
|
|
206
|
+
{ label: "turns 6 to 15", from: 6, to: 15 },
|
|
207
|
+
{ label: "turns 16 and later", from: 16, to: Infinity },
|
|
208
|
+
];
|
|
209
|
+
export const driftByTurn = (edits) => DRIFT_BUCKETS.map((b) => {
|
|
210
|
+
const inBucket = edits.filter((e) => e.error === undefined && e.turn >= b.from && e.turn <= b.to);
|
|
211
|
+
const broken = inBucket.filter((e) => e.verdicts.some((v) => v.band === "act")).length;
|
|
212
|
+
return {
|
|
213
|
+
label: b.label,
|
|
214
|
+
edits: inBucket.length,
|
|
215
|
+
broken,
|
|
216
|
+
rate: inBucket.length === 0 ? 0 : broken / inBucket.length,
|
|
217
|
+
};
|
|
218
|
+
});
|
|
219
|
+
export const tallyRules = (result, rules) => {
|
|
220
|
+
const tallies = [];
|
|
221
|
+
for (const rule of rules) {
|
|
222
|
+
if (rule.check.type !== "model")
|
|
223
|
+
continue;
|
|
224
|
+
const phase = rule.when ?? "edit";
|
|
225
|
+
const items = phase === "edit"
|
|
226
|
+
? result.edits.map((e) => ({ file: e.file, verdicts: e.verdicts }))
|
|
227
|
+
: result.turns.map((t) => ({ file: t.files.join(", "), verdicts: t.verdicts }));
|
|
228
|
+
let broken = 0;
|
|
229
|
+
let flagged = 0;
|
|
230
|
+
let of = 0;
|
|
231
|
+
let example = "";
|
|
232
|
+
for (const item of items) {
|
|
233
|
+
const v = item.verdicts.find((x) => x.ruleId === rule.id);
|
|
234
|
+
if (v === undefined)
|
|
235
|
+
continue;
|
|
236
|
+
of += 1;
|
|
237
|
+
if (v.band === "act") {
|
|
238
|
+
broken += 1;
|
|
239
|
+
if (example === "")
|
|
240
|
+
example = item.file;
|
|
241
|
+
}
|
|
242
|
+
else if (v.band === "flag")
|
|
243
|
+
flagged += 1;
|
|
244
|
+
}
|
|
245
|
+
if (of > 0)
|
|
246
|
+
tallies.push({ rule: rule.id, phase, broken, flagged, of, example });
|
|
247
|
+
}
|
|
248
|
+
return tallies.sort((a, b) => b.broken - a.broken || b.flagged - a.flagged);
|
|
249
|
+
};
|
|
250
|
+
//# sourceMappingURL=replay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay.js","sourceRoot":"","sources":["../../src/lib/replay.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ReplaySession } from "./replay.js";
|
|
2
|
+
/** One rollout file per session, one JSON object per line. An `apply_patch` call carries the same patch text the live hook receives. */
|
|
3
|
+
export declare const codexSessionsDir: () => string;
|
|
4
|
+
export declare const parseCodexRollout: (file: string) => ReplaySession;
|
|
5
|
+
export declare const codexSessionsFor: (root: string, dir?: string) => ReplaySession[];
|
|
6
|
+
//# sourceMappingURL=replayCodex.d.ts.map
|