@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 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { PatchHunk, PostToolUseInput } from "@coldtea/abide-schema";
|
|
2
|
+
export declare const renderHunks: (hunks: readonly PatchHunk[]) => string;
|
|
3
|
+
/**
|
|
4
|
+
* One file's change from a PostToolUse payload. `text` is undefined when the
|
|
5
|
+
* diff could not be computed within the time a hook may spend on it; the
|
|
6
|
+
* caller skips that file and says so rather than holding the agent.
|
|
7
|
+
* `original` is the file's content before the edit when the host said, for
|
|
8
|
+
* a Stop check without a git baseline. `after` is derived from the payload
|
|
9
|
+
* alone, so it is exactly what the judge saw; null when it cannot be.
|
|
10
|
+
*/
|
|
11
|
+
export type EditHunk = {
|
|
12
|
+
filePath: string;
|
|
13
|
+
text: string | undefined;
|
|
14
|
+
isNewFile: boolean;
|
|
15
|
+
original: string | null;
|
|
16
|
+
after: string | null;
|
|
17
|
+
};
|
|
18
|
+
/** Time left on a budget that several diffs share. */
|
|
19
|
+
export declare const remainingMs: (deadline: number) => number;
|
|
20
|
+
/** Every file one PostToolUse payload changed. Claude-style tools name one file; a Codex patch may name several. */
|
|
21
|
+
export declare const editsFromPostToolUse: (input: PostToolUseInput) => EditHunk[];
|
|
22
|
+
/** Undefined when the diff could not be computed within the time a hook may spend on it. */
|
|
23
|
+
export declare const unifiedDiff: (relativePath: string, before: string, after: string, timeoutMs?: number) => string | undefined;
|
|
24
|
+
export declare const addedLines: (hunkText: string) => string[];
|
|
25
|
+
export declare const changedLineCount: (hunkText: string) => number;
|
|
26
|
+
export declare const boundState: (text: string, max?: number) => {
|
|
27
|
+
text: string;
|
|
28
|
+
truncated: boolean;
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/lib/diff.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAMzE,eAAO,MAAM,WAAW,UAAW,SAAS,SAAS,EAAE,KAAG,MAM3C,CAAC;AA4BhB;;;;;;;GAOG;AACH,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAsBF,sDAAsD;AACtD,eAAO,MAAM,WAAW,aAAc,MAAM,KAAG,MAAkD,CAAC;AASlG,oHAAoH;AACpH,eAAO,MAAM,oBAAoB,UAAW,gBAAgB,KAAG,QAAQ,EAgFtE,CAAC;AAEF,4FAA4F;AAC5F,eAAO,MAAM,WAAW,iBACR,MAAM,UACZ,MAAM,SACP,MAAM,yBAEZ,MAAM,GAAG,SAcL,CAAC;AAER,eAAO,MAAM,UAAU,aAAc,MAAM,KAAG,MAAM,EAIzB,CAAC;AAE5B,eAAO,MAAM,gBAAgB,aAAc,MAAM,KAAG,MACmB,CAAC;AAExE,eAAO,MAAM,UAAU,SACf,MAAM,mBAEX;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAG2D,CAAC"}
|
package/dist/lib/diff.js
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { createTwoFilesPatch, structuredPatch } from "diff";
|
|
3
|
+
import { assertNever } from "@coldtea/abide-schema";
|
|
4
|
+
import { parseApplyPatch } from "./applyPatch.js";
|
|
5
|
+
import { DIFF_TIMEOUT_MS, MAX_DIFF_INPUT_CHARS, MAX_STATE_CHARS } from "./constants.js";
|
|
6
|
+
import { readRegularText } from "./regularFile.js";
|
|
7
|
+
export const renderHunks = (hunks) => hunks
|
|
8
|
+
.map((h) => `@@ -${h.oldStart},${h.oldLines} +${h.newStart},${h.newLines} @@\n${h.lines.join("\n")}`)
|
|
9
|
+
.join("\n");
|
|
10
|
+
/** Undefined when the diff would take longer than a hook may spend on it, or the inputs are too big to try. */
|
|
11
|
+
const hunksBetween = (before, after, timeoutMs = DIFF_TIMEOUT_MS) => {
|
|
12
|
+
if (timeoutMs <= 0 || before.length + after.length > MAX_DIFF_INPUT_CHARS)
|
|
13
|
+
return undefined;
|
|
14
|
+
const patch = structuredPatch("a", "b", before, after, undefined, undefined, {
|
|
15
|
+
context: 3,
|
|
16
|
+
timeout: timeoutMs,
|
|
17
|
+
});
|
|
18
|
+
return patch?.hunks.map((h) => ({
|
|
19
|
+
oldStart: h.oldStart,
|
|
20
|
+
oldLines: h.oldLines,
|
|
21
|
+
newStart: h.newStart,
|
|
22
|
+
newLines: h.newLines,
|
|
23
|
+
lines: h.lines,
|
|
24
|
+
}));
|
|
25
|
+
};
|
|
26
|
+
const allAdded = (content) => {
|
|
27
|
+
const lines = content.split("\n");
|
|
28
|
+
if (lines.at(-1) === "")
|
|
29
|
+
lines.pop();
|
|
30
|
+
return `@@ -0,0 +1,${lines.length} @@\n${lines.map((l) => `+${l}`).join("\n")}`;
|
|
31
|
+
};
|
|
32
|
+
// A function replacement keeps "$" in the new text literal.
|
|
33
|
+
const applyEdit = (content, edit) => edit.all
|
|
34
|
+
? content.replaceAll(edit.old, () => edit.new)
|
|
35
|
+
: content.replace(edit.old, () => edit.new);
|
|
36
|
+
const applyEdits = (content, edits) => content === null ? null : edits.reduce(applyEdit, content);
|
|
37
|
+
const synthesized = (before, after, timeoutMs = DIFF_TIMEOUT_MS) => {
|
|
38
|
+
const hunks = hunksBetween(before, after, timeoutMs);
|
|
39
|
+
return hunks === undefined ? undefined : renderHunks(hunks);
|
|
40
|
+
};
|
|
41
|
+
/** Time left on a budget that several diffs share. */
|
|
42
|
+
export const remainingMs = (deadline) => Math.floor(deadline - performance.now());
|
|
43
|
+
/** Reverses the edit on the file as it is now, since the host did not send the original. */
|
|
44
|
+
const reversed = (filePath, edits) => applyEdits(readRegularText(filePath) ?? null, [...edits].reverse().map((e) => ({ old: e.new, new: e.old, ...(e.all ? { all: true } : {}) })));
|
|
45
|
+
/** Every file one PostToolUse payload changed. Claude-style tools name one file; a Codex patch may name several. */
|
|
46
|
+
export const editsFromPostToolUse = (input) => {
|
|
47
|
+
switch (input.tool_name) {
|
|
48
|
+
case "Edit": {
|
|
49
|
+
const hostPatch = input.tool_response?.structuredPatch;
|
|
50
|
+
const fromHost = hostPatch && hostPatch.length > 0 ? renderHunks(hostPatch) : undefined;
|
|
51
|
+
const filePath = input.tool_input.file_path;
|
|
52
|
+
const text = fromHost ?? synthesized(input.tool_input.old_string, input.tool_input.new_string);
|
|
53
|
+
const edits = [
|
|
54
|
+
{
|
|
55
|
+
old: input.tool_input.old_string,
|
|
56
|
+
new: input.tool_input.new_string,
|
|
57
|
+
...(input.tool_input.replace_all ? { all: true } : {}),
|
|
58
|
+
},
|
|
59
|
+
];
|
|
60
|
+
const original = input.tool_response?.originalFile ?? reversed(filePath, edits);
|
|
61
|
+
return [{ filePath, text, isNewFile: false, original, after: applyEdits(original, edits) }];
|
|
62
|
+
}
|
|
63
|
+
case "Write": {
|
|
64
|
+
const hostPatch = input.tool_response?.structuredPatch;
|
|
65
|
+
const fromHost = hostPatch && hostPatch.length > 0 ? renderHunks(hostPatch) : undefined;
|
|
66
|
+
const filePath = input.tool_input.file_path;
|
|
67
|
+
const original = input.tool_response?.originalFile;
|
|
68
|
+
const after = input.tool_input.content;
|
|
69
|
+
if (original === null || original === undefined) {
|
|
70
|
+
const text = after.length > MAX_DIFF_INPUT_CHARS ? undefined : allAdded(after);
|
|
71
|
+
return [{ filePath, text, isNewFile: true, original: null, after }];
|
|
72
|
+
}
|
|
73
|
+
const text = fromHost ?? synthesized(original, after);
|
|
74
|
+
return [{ filePath, text, isNewFile: false, original, after }];
|
|
75
|
+
}
|
|
76
|
+
case "MultiEdit": {
|
|
77
|
+
const hostPatch = input.tool_response?.structuredPatch;
|
|
78
|
+
const fromHost = hostPatch && hostPatch.length > 0 ? renderHunks(hostPatch) : undefined;
|
|
79
|
+
const filePath = input.tool_input.file_path;
|
|
80
|
+
const edits = input.tool_input.edits.map((e) => ({
|
|
81
|
+
old: e.old_string,
|
|
82
|
+
new: e.new_string,
|
|
83
|
+
...(e.replace_all ? { all: true } : {}),
|
|
84
|
+
}));
|
|
85
|
+
const original = input.tool_response?.originalFile ?? reversed(filePath, edits);
|
|
86
|
+
const after = applyEdits(original, edits);
|
|
87
|
+
if (fromHost !== undefined) {
|
|
88
|
+
return [{ filePath, text: fromHost, isNewFile: false, original, after }];
|
|
89
|
+
}
|
|
90
|
+
// One budget for every part: each on its own could pass while together they hold the hook.
|
|
91
|
+
const deadline = performance.now() + DIFF_TIMEOUT_MS;
|
|
92
|
+
const parts = [];
|
|
93
|
+
let text = undefined;
|
|
94
|
+
for (const edit of input.tool_input.edits) {
|
|
95
|
+
const part = synthesized(edit.old_string, edit.new_string, remainingMs(deadline));
|
|
96
|
+
if (part === undefined) {
|
|
97
|
+
parts.length = 0;
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
parts.push(part);
|
|
101
|
+
}
|
|
102
|
+
if (parts.length > 0)
|
|
103
|
+
text = parts.join("\n");
|
|
104
|
+
return [{ filePath, text, isNewFile: false, original, after }];
|
|
105
|
+
}
|
|
106
|
+
case "apply_patch":
|
|
107
|
+
return parseApplyPatch(input.tool_input.command).flatMap((file) => {
|
|
108
|
+
const filePath = path.resolve(input.cwd, file.kind === "update" ? (file.movedTo ?? file.path) : file.path);
|
|
109
|
+
switch (file.kind) {
|
|
110
|
+
case "add":
|
|
111
|
+
return [{ filePath, text: file.text, isNewFile: true, original: null, after: null }];
|
|
112
|
+
case "update":
|
|
113
|
+
return [{ filePath, text: file.text, isNewFile: false, original: null, after: null }];
|
|
114
|
+
case "delete":
|
|
115
|
+
return [];
|
|
116
|
+
default:
|
|
117
|
+
return assertNever(file);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
default:
|
|
121
|
+
return assertNever(input);
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
/** Undefined when the diff could not be computed within the time a hook may spend on it. */
|
|
125
|
+
export const unifiedDiff = (relativePath, before, after, timeoutMs = DIFF_TIMEOUT_MS) => timeoutMs <= 0 || before.length + after.length > MAX_DIFF_INPUT_CHARS
|
|
126
|
+
? undefined
|
|
127
|
+
: createTwoFilesPatch(`a/${relativePath}`, `b/${relativePath}`, before, after, undefined, undefined, {
|
|
128
|
+
context: 3,
|
|
129
|
+
timeout: timeoutMs,
|
|
130
|
+
});
|
|
131
|
+
export const addedLines = (hunkText) => hunkText
|
|
132
|
+
.split("\n")
|
|
133
|
+
.filter((l) => l.startsWith("+") && !l.startsWith("+++"))
|
|
134
|
+
.map((l) => l.slice(1));
|
|
135
|
+
export const changedLineCount = (hunkText) => hunkText.split("\n").filter((l) => /^[+-](?![+-]{2})/.test(l)).length;
|
|
136
|
+
export const boundState = (text, max = MAX_STATE_CHARS) => text.length <= max
|
|
137
|
+
? { text, truncated: false }
|
|
138
|
+
: { text: `${text.slice(0, max)}\n[abide: diff cut at ${max} characters]`, truncated: true };
|
|
139
|
+
//# sourceMappingURL=diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/lib/diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type AbideEvent } from "@coldtea/abide-schema";
|
|
2
|
+
/** Best effort. The log must never take the hook down with it, or hold it. */
|
|
3
|
+
export declare const appendEvent: (root: string, event: AbideEvent) => void;
|
|
4
|
+
export declare const readEvents: (root: string) => AbideEvent[];
|
|
5
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/lib/events.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAIrE,8EAA8E;AAC9E,eAAO,MAAM,WAAW,SAAU,MAAM,SAAS,UAAU,KAAG,IAO7D,CAAC;AAEF,eAAO,MAAM,UAAU,SAAU,MAAM,KAAG,UAAU,EAkBnD,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { mkdirSync, readFileSync } from "node:fs";
|
|
2
|
+
import { eventSchema } from "@coldtea/abide-schema";
|
|
3
|
+
import { abideDir, eventsPath } from "./paths.js";
|
|
4
|
+
import { writeRegularFile } from "./regularFile.js";
|
|
5
|
+
/** Best effort. The log must never take the hook down with it, or hold it. */
|
|
6
|
+
export const appendEvent = (root, event) => {
|
|
7
|
+
try {
|
|
8
|
+
mkdirSync(abideDir(root), { recursive: true });
|
|
9
|
+
writeRegularFile(eventsPath(root), `${JSON.stringify(event)}\n`, { use: "append" });
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
// nothing to do: logging is optional
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
export const readEvents = (root) => {
|
|
16
|
+
let raw;
|
|
17
|
+
try {
|
|
18
|
+
raw = readFileSync(eventsPath(root), "utf8");
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
const events = [];
|
|
24
|
+
for (const line of raw.split("\n")) {
|
|
25
|
+
if (line.trim() === "")
|
|
26
|
+
continue;
|
|
27
|
+
try {
|
|
28
|
+
const parsed = eventSchema.safeParse(JSON.parse(line));
|
|
29
|
+
if (parsed.success)
|
|
30
|
+
events.push(parsed.data);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// skip a torn line
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return events;
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/lib/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,WAAW,EAAmB,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,8EAA8E;AAC9E,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,KAAiB,EAAQ,EAAE;IACnE,IAAI,CAAC;QACH,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtF,CAAC;IAAC,MAAM,CAAC;QACP,qCAAqC;IACvC,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAgB,EAAE;IACvD,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,SAAS;QACjC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACvD,IAAI,MAAM,CAAC,OAAO;gBAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,mBAAmB;QACrB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export declare const isGitRepo: (root: string) => boolean;
|
|
2
|
+
export type FileDiff = {
|
|
3
|
+
file: string;
|
|
4
|
+
text: string;
|
|
5
|
+
};
|
|
6
|
+
/** Splits a unified diff into per-file hunk text, dropping generated, binary and excluded files. */
|
|
7
|
+
export declare const splitDiff: (patch: string) => FileDiff[];
|
|
8
|
+
export type HistoryHunk = {
|
|
9
|
+
commit: string;
|
|
10
|
+
subject: string;
|
|
11
|
+
file: string;
|
|
12
|
+
text: string;
|
|
13
|
+
};
|
|
14
|
+
export type HistoryCommit = {
|
|
15
|
+
commit: string;
|
|
16
|
+
subject: string;
|
|
17
|
+
files: string[];
|
|
18
|
+
fileDiffs: FileDiff[];
|
|
19
|
+
};
|
|
20
|
+
/** Recent real changes from this repository's history, for calibration. */
|
|
21
|
+
export declare const recentHistory: (root: string, wantHunks: number, wantCommits: number) => {
|
|
22
|
+
hunks: HistoryHunk[];
|
|
23
|
+
commits: HistoryCommit[];
|
|
24
|
+
};
|
|
25
|
+
/** Uncommitted changes, including staged, as one patch. */
|
|
26
|
+
export declare const workingTreeDiff: (root: string, paths: readonly string[]) => string;
|
|
27
|
+
/**
|
|
28
|
+
* A tree object for the working tree as it stands now, untracked files
|
|
29
|
+
* included and ignored files excluded, without touching the real index. The
|
|
30
|
+
* real index is copied first so `add -A` only has to look at what changed.
|
|
31
|
+
*/
|
|
32
|
+
export declare const snapshotTree: (root: string, scratchIndex: string, timeoutMs: number) => string | undefined;
|
|
33
|
+
/** Blob id per file in a tree; absent files are left out, undefined if git did not answer in time. */
|
|
34
|
+
export declare const blobIdsAt: (root: string, tree: string, files: readonly string[], timeoutMs: number) => Map<string, string> | undefined;
|
|
35
|
+
/** Everything that changed between two snapshots, as one patch. */
|
|
36
|
+
export declare const diffTrees: (root: string, base: string, now: string, timeoutMs: number) => string | undefined;
|
|
37
|
+
//# sourceMappingURL=git.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/lib/git.ts"],"names":[],"mappings":"AAkCA,eAAO,MAAM,SAAS,SAAU,MAAM,KAAG,OAC+B,CAAC;AAKzE,MAAM,MAAM,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtD,oGAAoG;AACpG,eAAO,MAAM,SAAS,UAAW,MAAM,KAAG,QAAQ,EAcjD,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAC1F,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,QAAQ,EAAE,CAAC;CACvB,CAAC;AAEF,2EAA2E;AAC3E,eAAO,MAAM,aAAa,SAClB,MAAM,aACD,MAAM,eACJ,MAAM,KAClB;IAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAAC,OAAO,EAAE,aAAa,EAAE,CAAA;CAsClD,CAAC;AAEF,2DAA2D;AAC3D,eAAO,MAAM,eAAe,SAAU,MAAM,SAAS,SAAS,MAAM,EAAE,KAAG,MAuBxE,CAAC;AAYF;;;;GAIG;AACH,eAAO,MAAM,YAAY,SACjB,MAAM,gBACE,MAAM,aACT,MAAM,KAChB,MAAM,GAAG,SAmBX,CAAC;AAEF,sGAAsG;AACtG,eAAO,MAAM,SAAS,SACd,MAAM,QACN,MAAM,SACL,SAAS,MAAM,EAAE,aACb,MAAM,KAChB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAUxB,CAAC;AAEF,mEAAmE;AACnE,eAAO,MAAM,SAAS,SACd,MAAM,QACN,MAAM,OACP,MAAM,aACA,MAAM,KAChB,MAAM,GAAG,SAGiF,CAAC"}
|
package/dist/lib/git.js
ADDED
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { copyFileSync, existsSync, mkdirSync } from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { parsePatch } from "diff";
|
|
5
|
+
import { AbideError } from "@coldtea/abide-schema";
|
|
6
|
+
import { GIT_TIMEOUT_MS, MAX_STATE_CHARS } from "./constants.js";
|
|
7
|
+
import { renderHunks } from "./diff.js";
|
|
8
|
+
import { isExcludedPath, SECRET_FILE_PATTERNS } from "./paths.js";
|
|
9
|
+
/**
|
|
10
|
+
* One git call, killed outright at its timeout. A clean filter, LFS, or a slow
|
|
11
|
+
* disk can hold git for longer than a hook may live, and nothing on the main
|
|
12
|
+
* thread can interrupt a synchronous child. stderr is not ours to hold open:
|
|
13
|
+
* a filter that inherited it could keep us waiting after git itself is gone.
|
|
14
|
+
*/
|
|
15
|
+
const git = (root, args, timeoutMs = GIT_TIMEOUT_MS, options = {}) => {
|
|
16
|
+
const { env, ok = [0] } = options;
|
|
17
|
+
const result = spawnSync("git", args, {
|
|
18
|
+
cwd: root,
|
|
19
|
+
encoding: "utf8",
|
|
20
|
+
maxBuffer: 64 * 1024 * 1024,
|
|
21
|
+
timeout: Math.max(1, timeoutMs),
|
|
22
|
+
killSignal: "SIGKILL",
|
|
23
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
24
|
+
...(env === undefined ? {} : { env }),
|
|
25
|
+
});
|
|
26
|
+
return result.status !== null && ok.includes(result.status) ? result.stdout : undefined;
|
|
27
|
+
};
|
|
28
|
+
export const isGitRepo = (root) => git(root, ["rev-parse", "--is-inside-work-tree"], 2_000) !== undefined;
|
|
29
|
+
const SKIP_FILE = /(^|\/)(package-lock\.json|pnpm-lock\.yaml|yarn\.lock|bun\.lockb?|Cargo\.lock|go\.sum)$|\.(min\.js|min\.css|map|svg|png|jpg|jpeg|gif|ico|woff2?|ttf|pdf|lock|snap)$/;
|
|
30
|
+
/** Splits a unified diff into per-file hunk text, dropping generated, binary and excluded files. */
|
|
31
|
+
export const splitDiff = (patch) => {
|
|
32
|
+
const out = [];
|
|
33
|
+
for (const file of parsePatch(patch)) {
|
|
34
|
+
// A deletion has no new name: its old one is the file the turn removed.
|
|
35
|
+
const named = file.newFileName && file.newFileName !== "/dev/null" ? file.newFileName : file.oldFileName;
|
|
36
|
+
const name = (named ?? "").replace(/^[ab]\//, "");
|
|
37
|
+
if (name === "" || name === "/dev/null" || SKIP_FILE.test(name) || isExcludedPath(name)) {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (file.hunks.length === 0)
|
|
41
|
+
continue;
|
|
42
|
+
out.push({ file: name, text: renderHunks(file.hunks) });
|
|
43
|
+
}
|
|
44
|
+
return out;
|
|
45
|
+
};
|
|
46
|
+
/** Recent real changes from this repository's history, for calibration. */
|
|
47
|
+
export const recentHistory = (root, wantHunks, wantCommits) => {
|
|
48
|
+
const list = git(root, ["log", "--no-merges", "-n", "60", "--format=%H%x1f%s", "HEAD"]);
|
|
49
|
+
if (list === undefined)
|
|
50
|
+
throw new AbideError("GIT_UNAVAILABLE", "git history is not readable here");
|
|
51
|
+
const hunks = [];
|
|
52
|
+
const commits = [];
|
|
53
|
+
const seenFiles = new Set();
|
|
54
|
+
for (const line of list.split("\n")) {
|
|
55
|
+
if (line.trim() === "")
|
|
56
|
+
continue;
|
|
57
|
+
const [commit, subject = ""] = line.split("\x1f");
|
|
58
|
+
if (commit === undefined)
|
|
59
|
+
continue;
|
|
60
|
+
if (hunks.length >= wantHunks && commits.length >= wantCommits)
|
|
61
|
+
break;
|
|
62
|
+
const patch = git(root, [
|
|
63
|
+
"show",
|
|
64
|
+
"--format=",
|
|
65
|
+
"--unified=3",
|
|
66
|
+
"--no-color",
|
|
67
|
+
"--diff-filter=AM",
|
|
68
|
+
commit,
|
|
69
|
+
]);
|
|
70
|
+
if (patch === undefined || patch.trim() === "")
|
|
71
|
+
continue;
|
|
72
|
+
const files = splitDiff(patch);
|
|
73
|
+
if (files.length === 0)
|
|
74
|
+
continue;
|
|
75
|
+
if (commits.length < wantCommits) {
|
|
76
|
+
const size = files.reduce((sum, f) => sum + f.text.length, 0);
|
|
77
|
+
if (size >= 200 && size <= MAX_STATE_CHARS) {
|
|
78
|
+
commits.push({ commit, subject, files: files.map((f) => f.file), fileDiffs: files });
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
for (const f of files) {
|
|
82
|
+
if (hunks.length >= wantHunks)
|
|
83
|
+
break;
|
|
84
|
+
const changed = f.text.split("\n").filter((l) => /^[+-](?![+-]{2})/.test(l)).length;
|
|
85
|
+
if (changed < 3 || f.text.length > 6000 || seenFiles.has(f.file))
|
|
86
|
+
continue;
|
|
87
|
+
seenFiles.add(f.file);
|
|
88
|
+
hunks.push({ commit, subject, file: f.file, text: f.text });
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return { hunks, commits };
|
|
92
|
+
};
|
|
93
|
+
/** Uncommitted changes, including staged, as one patch. */
|
|
94
|
+
export const workingTreeDiff = (root, paths) => {
|
|
95
|
+
const hasHead = git(root, ["rev-parse", "--verify", "HEAD"]) !== undefined;
|
|
96
|
+
const base = hasHead
|
|
97
|
+
? ["diff", "HEAD", "--no-color", "--unified=3"]
|
|
98
|
+
: ["diff", "--cached", "--no-color", "--unified=3"];
|
|
99
|
+
const tracked = git(root, [...base, "--", ...paths]) ?? "";
|
|
100
|
+
const untracked = (git(root, ["ls-files", "--others", "--exclude-standard", "--", ...paths]) ?? "")
|
|
101
|
+
.split("\n")
|
|
102
|
+
.filter((f) => f.trim() !== "");
|
|
103
|
+
// --no-index exits 1 when the sides differ.
|
|
104
|
+
const added = untracked
|
|
105
|
+
.map((f) => git(root, ["diff", "--no-color", "--no-index", "--unified=3", "--", "/dev/null", f], GIT_TIMEOUT_MS, { ok: [0, 1] }))
|
|
106
|
+
.filter((p) => p !== undefined && p.trim() !== "");
|
|
107
|
+
return [tracked, ...added].join("\n");
|
|
108
|
+
};
|
|
109
|
+
const indexPath = (root) => {
|
|
110
|
+
const out = git(root, ["rev-parse", "--git-path", "index"], 2_000);
|
|
111
|
+
if (out === undefined)
|
|
112
|
+
return undefined;
|
|
113
|
+
const p = out.trim();
|
|
114
|
+
return path.isAbsolute(p) ? p : path.join(root, p);
|
|
115
|
+
};
|
|
116
|
+
// Never staged, so no snapshot writes a secret into the object store.
|
|
117
|
+
const NOT_SECRETS = SECRET_FILE_PATTERNS.map((pattern) => `:(exclude,glob)**/${pattern}`);
|
|
118
|
+
/**
|
|
119
|
+
* A tree object for the working tree as it stands now, untracked files
|
|
120
|
+
* included and ignored files excluded, without touching the real index. The
|
|
121
|
+
* real index is copied first so `add -A` only has to look at what changed.
|
|
122
|
+
*/
|
|
123
|
+
export const snapshotTree = (root, scratchIndex, timeoutMs) => {
|
|
124
|
+
const deadline = performance.now() + timeoutMs;
|
|
125
|
+
const remaining = () => Math.floor(deadline - performance.now());
|
|
126
|
+
try {
|
|
127
|
+
mkdirSync(path.dirname(scratchIndex), { recursive: true });
|
|
128
|
+
const real = indexPath(root);
|
|
129
|
+
if (real !== undefined && existsSync(real))
|
|
130
|
+
copyFileSync(real, scratchIndex);
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return undefined;
|
|
134
|
+
}
|
|
135
|
+
const env = { ...process.env, GIT_INDEX_FILE: scratchIndex };
|
|
136
|
+
if (remaining() <= 0 ||
|
|
137
|
+
git(root, ["add", "-A", "--", ".", ...NOT_SECRETS], remaining(), { env }) === undefined)
|
|
138
|
+
return undefined;
|
|
139
|
+
if (remaining() <= 0)
|
|
140
|
+
return undefined;
|
|
141
|
+
const hash = git(root, ["write-tree"], remaining(), { env })?.trim();
|
|
142
|
+
return hash !== undefined && /^[0-9a-f]{40,64}$/.test(hash) ? hash : undefined;
|
|
143
|
+
};
|
|
144
|
+
/** Blob id per file in a tree; absent files are left out, undefined if git did not answer in time. */
|
|
145
|
+
export const blobIdsAt = (root, tree, files, timeoutMs) => {
|
|
146
|
+
if (files.length === 0)
|
|
147
|
+
return new Map();
|
|
148
|
+
const out = git(root, ["ls-tree", "-r", "-z", tree, "--", ...files], timeoutMs);
|
|
149
|
+
if (out === undefined)
|
|
150
|
+
return undefined;
|
|
151
|
+
const ids = new Map();
|
|
152
|
+
for (const entry of out.split("\0")) {
|
|
153
|
+
const m = /^\d+ blob ([0-9a-f]{40,64})\t([^]+)$/.exec(entry);
|
|
154
|
+
if (m?.[1] !== undefined && m[2] !== undefined)
|
|
155
|
+
ids.set(m[2], m[1]);
|
|
156
|
+
}
|
|
157
|
+
return ids;
|
|
158
|
+
};
|
|
159
|
+
/** Everything that changed between two snapshots, as one patch. */
|
|
160
|
+
export const diffTrees = (root, base, now, timeoutMs) => base === now
|
|
161
|
+
? ""
|
|
162
|
+
: git(root, ["diff-tree", "-p", "-M", "--no-color", "--unified=3", base, now], timeoutMs);
|
|
163
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/lib/git.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { HookOutput } from "@coldtea/abide-schema";
|
|
2
|
+
export type HookName = "session-start" | "turn-start" | "post-tool-use" | "stop";
|
|
3
|
+
/**
|
|
4
|
+
* Every hook goes through here: parse what we can, never throw, and leave
|
|
5
|
+
* within the budget whatever else is going on. The deadline exits the
|
|
6
|
+
* process rather than resolving a promise, because a promise cannot interrupt
|
|
7
|
+
* work that is still running, and an open handle would keep us alive after it.
|
|
8
|
+
*/
|
|
9
|
+
export declare const runHook: (name: HookName, handler: (raw: unknown) => Promise<HookOutput>, budgetMs: number) => Promise<void>;
|
|
10
|
+
//# sourceMappingURL=hookRunner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hookRunner.d.ts","sourceRoot":"","sources":["../../src/lib/hookRunner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAIxD,MAAM,MAAM,QAAQ,GAAG,eAAe,GAAG,YAAY,GAAG,eAAe,GAAG,MAAM,CAAC;AASjF;;;;;GAKG;AACH,eAAO,MAAM,OAAO,SACZ,QAAQ,WACL,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,CAAC,YACpC,MAAM,KACf,OAAO,CAAC,IAAI,CA+Bd,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { debug, emit } from "./output.js";
|
|
2
|
+
import { readStdin } from "./stdin.js";
|
|
3
|
+
const EVENT = {
|
|
4
|
+
"session-start": "SessionStart",
|
|
5
|
+
"turn-start": "UserPromptSubmit",
|
|
6
|
+
"post-tool-use": "PostToolUse",
|
|
7
|
+
stop: "Stop",
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Every hook goes through here: parse what we can, never throw, and leave
|
|
11
|
+
* within the budget whatever else is going on. The deadline exits the
|
|
12
|
+
* process rather than resolving a promise, because a promise cannot interrupt
|
|
13
|
+
* work that is still running, and an open handle would keep us alive after it.
|
|
14
|
+
*/
|
|
15
|
+
export const runHook = async (name, handler, budgetMs) => {
|
|
16
|
+
process.exitCode = 0;
|
|
17
|
+
let finished = false;
|
|
18
|
+
const finish = (output) => {
|
|
19
|
+
if (finished)
|
|
20
|
+
return;
|
|
21
|
+
finished = true;
|
|
22
|
+
try {
|
|
23
|
+
emit(output, EVENT[name], () => process.exit(0));
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
process.exit(0);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
const deadline = setTimeout(() => {
|
|
30
|
+
debug(`${name}: gave up after ${budgetMs}ms`);
|
|
31
|
+
finish({ kind: "silent" });
|
|
32
|
+
}, budgetMs);
|
|
33
|
+
try {
|
|
34
|
+
const text = await readStdin();
|
|
35
|
+
let raw = undefined;
|
|
36
|
+
try {
|
|
37
|
+
raw = text.trim() === "" ? undefined : JSON.parse(text);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
debug(`${name}: stdin was not JSON`);
|
|
41
|
+
}
|
|
42
|
+
finish(await handler(raw));
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
debug(`${name}: ${error instanceof Error ? error.message : String(error)}`);
|
|
46
|
+
finish({ kind: "silent" });
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
clearTimeout(deadline);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=hookRunner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hookRunner.js","sourceRoot":"","sources":["../../src/lib/hookRunner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAIvC,MAAM,KAAK,GAAmF;IAC5F,eAAe,EAAE,cAAc;IAC/B,YAAY,EAAE,kBAAkB;IAChC,eAAe,EAAE,aAAa;IAC9B,IAAI,EAAE,MAAM;CACb,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAC1B,IAAc,EACd,OAA8C,EAC9C,QAAgB,EACD,EAAE;IACjB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACrB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,MAAM,MAAM,GAAG,CAAC,MAAkB,EAAQ,EAAE;QAC1C,IAAI,QAAQ;YAAE,OAAO;QACrB,QAAQ,GAAG,IAAI,CAAC;QAChB,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE;QAC/B,KAAK,CAAC,GAAG,IAAI,mBAAmB,QAAQ,IAAI,CAAC,CAAC;QAC9C,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC7B,CAAC,EAAE,QAAQ,CAAC,CAAC;IACb,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,SAAS,EAAE,CAAC;QAC/B,IAAI,GAAG,GAAY,SAAS,CAAC;QAC7B,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1D,CAAC;QAAC,MAAM,CAAC;YACP,KAAK,CAAC,GAAG,IAAI,sBAAsB,CAAC,CAAC;QACvC,CAAC;QACD,MAAM,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,KAAK,CAAC,GAAG,IAAI,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC5E,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC7B,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type Host } from "@coldtea/abide-schema";
|
|
2
|
+
export declare const hostLabel: (host: Host) => string;
|
|
3
|
+
export declare const parseHost: (name: string) => Host;
|
|
4
|
+
export declare const hostPresent: (host: Host) => boolean;
|
|
5
|
+
export declare const detectHosts: () => Host[];
|
|
6
|
+
/**
|
|
7
|
+
* Where abide's entries live for a host. Claude Code and Codex read the same
|
|
8
|
+
* hooks JSON shape from different files; OpenCode loads a plugin file from a
|
|
9
|
+
* directory it watches, so no config file is edited there.
|
|
10
|
+
*/
|
|
11
|
+
export declare const installTarget: (host: Host, root: string, project: boolean) => string;
|
|
12
|
+
export type Installed = {
|
|
13
|
+
host: Host;
|
|
14
|
+
target: string;
|
|
15
|
+
what: string;
|
|
16
|
+
afterwards?: string;
|
|
17
|
+
};
|
|
18
|
+
export declare const installHost: (host: Host, root: string, project: boolean) => Installed;
|
|
19
|
+
export declare const uninstallHost: (host: Host, root: string, project: boolean) => number;
|
|
20
|
+
//# sourceMappingURL=hosts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosts.d.ts","sourceRoot":"","sources":["../../src/lib/hosts.ts"],"names":[],"mappings":"AAGA,OAAO,EAA8C,KAAK,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAM9F,eAAO,MAAM,SAAS,SAAU,IAAI,KAAG,MAWtC,CAAC;AAEF,eAAO,MAAM,SAAS,SAAU,MAAM,KAAG,IAKxC,CAAC;AAKF,eAAO,MAAM,WAAW,SAAU,IAAI,KAAG,OAWxC,CAAC;AAEF,eAAO,MAAM,WAAW,QAAO,IAAI,EAA+B,CAAC;AAEnE;;;;GAIG;AACH,eAAO,MAAM,aAAa,SAAU,IAAI,QAAQ,MAAM,WAAW,OAAO,KAAG,MAiB1E,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1F,eAAO,MAAM,WAAW,SAAU,IAAI,QAAQ,MAAM,WAAW,OAAO,KAAG,SAyBxE,CAAC;AAEF,eAAO,MAAM,aAAa,SAAU,IAAI,QAAQ,MAAM,WAAW,OAAO,KAAG,MAW1E,CAAC"}
|