@ttfw/envoi 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. package/README.md +238 -0
  2. package/dist/commands/app.d.ts +2 -0
  3. package/dist/commands/app.d.ts.map +1 -0
  4. package/dist/commands/app.js +31 -0
  5. package/dist/commands/app.js.map +1 -0
  6. package/dist/commands/autonomy.d.ts +6 -0
  7. package/dist/commands/autonomy.d.ts.map +1 -0
  8. package/dist/commands/autonomy.js +89 -0
  9. package/dist/commands/autonomy.js.map +1 -0
  10. package/dist/commands/builder.d.ts +13 -0
  11. package/dist/commands/builder.d.ts.map +1 -0
  12. package/dist/commands/builder.js +142 -0
  13. package/dist/commands/builder.js.map +1 -0
  14. package/dist/commands/idea.d.ts +12 -0
  15. package/dist/commands/idea.d.ts.map +1 -0
  16. package/dist/commands/idea.js +79 -0
  17. package/dist/commands/idea.js.map +1 -0
  18. package/dist/commands/init.d.ts +18 -0
  19. package/dist/commands/init.d.ts.map +1 -0
  20. package/dist/commands/init.js +423 -0
  21. package/dist/commands/init.js.map +1 -0
  22. package/dist/commands/mode.d.ts +13 -0
  23. package/dist/commands/mode.d.ts.map +1 -0
  24. package/dist/commands/mode.js +96 -0
  25. package/dist/commands/mode.js.map +1 -0
  26. package/dist/commands/onboard.d.ts +37 -0
  27. package/dist/commands/onboard.d.ts.map +1 -0
  28. package/dist/commands/onboard.js +743 -0
  29. package/dist/commands/onboard.js.map +1 -0
  30. package/dist/commands/pr-note.d.ts +8 -0
  31. package/dist/commands/pr-note.d.ts.map +1 -0
  32. package/dist/commands/pr-note.js +27 -0
  33. package/dist/commands/pr-note.js.map +1 -0
  34. package/dist/commands/undo.d.ts +7 -0
  35. package/dist/commands/undo.d.ts.map +1 -0
  36. package/dist/commands/undo.js +59 -0
  37. package/dist/commands/undo.js.map +1 -0
  38. package/dist/commands/update.d.ts +24 -0
  39. package/dist/commands/update.d.ts.map +1 -0
  40. package/dist/commands/update.js +248 -0
  41. package/dist/commands/update.js.map +1 -0
  42. package/dist/constants/report_codes.d.ts +29 -0
  43. package/dist/constants/report_codes.d.ts.map +1 -0
  44. package/dist/constants/report_codes.js +69 -0
  45. package/dist/constants/report_codes.js.map +1 -0
  46. package/dist/index.d.ts +3 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +675 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/lib/autonomy.d.ts +16 -0
  51. package/dist/lib/autonomy.d.ts.map +1 -0
  52. package/dist/lib/autonomy.js +38 -0
  53. package/dist/lib/autonomy.js.map +1 -0
  54. package/dist/lib/blocked.d.ts +87 -0
  55. package/dist/lib/blocked.d.ts.map +1 -0
  56. package/dist/lib/blocked.js +134 -0
  57. package/dist/lib/blocked.js.map +1 -0
  58. package/dist/lib/branding.d.ts +13 -0
  59. package/dist/lib/branding.d.ts.map +1 -0
  60. package/dist/lib/branding.js +19 -0
  61. package/dist/lib/branding.js.map +1 -0
  62. package/dist/lib/claude.d.ts +42 -0
  63. package/dist/lib/claude.d.ts.map +1 -0
  64. package/dist/lib/claude.js +291 -0
  65. package/dist/lib/claude.js.map +1 -0
  66. package/dist/lib/config.d.ts +71 -0
  67. package/dist/lib/config.d.ts.map +1 -0
  68. package/dist/lib/config.js +410 -0
  69. package/dist/lib/config.js.map +1 -0
  70. package/dist/lib/diff.d.ts +150 -0
  71. package/dist/lib/diff.d.ts.map +1 -0
  72. package/dist/lib/diff.js +257 -0
  73. package/dist/lib/diff.js.map +1 -0
  74. package/dist/lib/doctor.d.ts +67 -0
  75. package/dist/lib/doctor.d.ts.map +1 -0
  76. package/dist/lib/doctor.js +211 -0
  77. package/dist/lib/doctor.js.map +1 -0
  78. package/dist/lib/fingerprint.d.ts +27 -0
  79. package/dist/lib/fingerprint.d.ts.map +1 -0
  80. package/dist/lib/fingerprint.js +116 -0
  81. package/dist/lib/fingerprint.js.map +1 -0
  82. package/dist/lib/fs.d.ts +93 -0
  83. package/dist/lib/fs.d.ts.map +1 -0
  84. package/dist/lib/fs.js +179 -0
  85. package/dist/lib/fs.js.map +1 -0
  86. package/dist/lib/git.d.ts +177 -0
  87. package/dist/lib/git.d.ts.map +1 -0
  88. package/dist/lib/git.js +355 -0
  89. package/dist/lib/git.js.map +1 -0
  90. package/dist/lib/git_branching.d.ts +84 -0
  91. package/dist/lib/git_branching.d.ts.map +1 -0
  92. package/dist/lib/git_branching.js +327 -0
  93. package/dist/lib/git_branching.js.map +1 -0
  94. package/dist/lib/gitignore.d.ts +26 -0
  95. package/dist/lib/gitignore.d.ts.map +1 -0
  96. package/dist/lib/gitignore.js +119 -0
  97. package/dist/lib/gitignore.js.map +1 -0
  98. package/dist/lib/guardrails.d.ts +232 -0
  99. package/dist/lib/guardrails.d.ts.map +1 -0
  100. package/dist/lib/guardrails.js +323 -0
  101. package/dist/lib/guardrails.js.map +1 -0
  102. package/dist/lib/history.d.ts +110 -0
  103. package/dist/lib/history.d.ts.map +1 -0
  104. package/dist/lib/history.js +236 -0
  105. package/dist/lib/history.js.map +1 -0
  106. package/dist/lib/index.d.ts +29 -0
  107. package/dist/lib/index.d.ts.map +1 -0
  108. package/dist/lib/index.js +29 -0
  109. package/dist/lib/index.js.map +1 -0
  110. package/dist/lib/json-extract.d.ts +42 -0
  111. package/dist/lib/json-extract.d.ts.map +1 -0
  112. package/dist/lib/json-extract.js +201 -0
  113. package/dist/lib/json-extract.js.map +1 -0
  114. package/dist/lib/judge.d.ts +237 -0
  115. package/dist/lib/judge.d.ts.map +1 -0
  116. package/dist/lib/judge.js +501 -0
  117. package/dist/lib/judge.js.map +1 -0
  118. package/dist/lib/lock.d.ts +79 -0
  119. package/dist/lib/lock.d.ts.map +1 -0
  120. package/dist/lib/lock.js +254 -0
  121. package/dist/lib/lock.js.map +1 -0
  122. package/dist/lib/migration.d.ts +9 -0
  123. package/dist/lib/migration.d.ts.map +1 -0
  124. package/dist/lib/migration.js +74 -0
  125. package/dist/lib/migration.js.map +1 -0
  126. package/dist/lib/paths.d.ts +18 -0
  127. package/dist/lib/paths.d.ts.map +1 -0
  128. package/dist/lib/paths.js +27 -0
  129. package/dist/lib/paths.js.map +1 -0
  130. package/dist/lib/preflight.d.ts +33 -0
  131. package/dist/lib/preflight.d.ts.map +1 -0
  132. package/dist/lib/preflight.js +177 -0
  133. package/dist/lib/preflight.js.map +1 -0
  134. package/dist/lib/prompt_budget.d.ts +18 -0
  135. package/dist/lib/prompt_budget.d.ts.map +1 -0
  136. package/dist/lib/prompt_budget.js +36 -0
  137. package/dist/lib/prompt_budget.js.map +1 -0
  138. package/dist/lib/report.d.ts +102 -0
  139. package/dist/lib/report.d.ts.map +1 -0
  140. package/dist/lib/report.js +347 -0
  141. package/dist/lib/report.js.map +1 -0
  142. package/dist/lib/reviewer-flow.d.ts +80 -0
  143. package/dist/lib/reviewer-flow.d.ts.map +1 -0
  144. package/dist/lib/reviewer-flow.js +138 -0
  145. package/dist/lib/reviewer-flow.js.map +1 -0
  146. package/dist/lib/reviewer.d.ts +53 -0
  147. package/dist/lib/reviewer.d.ts.map +1 -0
  148. package/dist/lib/reviewer.js +199 -0
  149. package/dist/lib/reviewer.js.map +1 -0
  150. package/dist/lib/risk.d.ts +127 -0
  151. package/dist/lib/risk.d.ts.map +1 -0
  152. package/dist/lib/risk.js +192 -0
  153. package/dist/lib/risk.js.map +1 -0
  154. package/dist/lib/rollback.d.ts +143 -0
  155. package/dist/lib/rollback.d.ts.map +1 -0
  156. package/dist/lib/rollback.js +244 -0
  157. package/dist/lib/rollback.js.map +1 -0
  158. package/dist/lib/schema.d.ts +47 -0
  159. package/dist/lib/schema.d.ts.map +1 -0
  160. package/dist/lib/schema.js +91 -0
  161. package/dist/lib/schema.js.map +1 -0
  162. package/dist/lib/scope.d.ts +89 -0
  163. package/dist/lib/scope.d.ts.map +1 -0
  164. package/dist/lib/scope.js +135 -0
  165. package/dist/lib/scope.js.map +1 -0
  166. package/dist/lib/self_update.d.ts +13 -0
  167. package/dist/lib/self_update.d.ts.map +1 -0
  168. package/dist/lib/self_update.js +172 -0
  169. package/dist/lib/self_update.js.map +1 -0
  170. package/dist/lib/state.d.ts +143 -0
  171. package/dist/lib/state.d.ts.map +1 -0
  172. package/dist/lib/state.js +258 -0
  173. package/dist/lib/state.js.map +1 -0
  174. package/dist/lib/tick.d.ts +310 -0
  175. package/dist/lib/tick.d.ts.map +1 -0
  176. package/dist/lib/tick.js +424 -0
  177. package/dist/lib/tick.js.map +1 -0
  178. package/dist/lib/transport.d.ts +145 -0
  179. package/dist/lib/transport.d.ts.map +1 -0
  180. package/dist/lib/transport.js +237 -0
  181. package/dist/lib/transport.js.map +1 -0
  182. package/dist/lib/verdict_labels.d.ts +5 -0
  183. package/dist/lib/verdict_labels.d.ts.map +1 -0
  184. package/dist/lib/verdict_labels.js +25 -0
  185. package/dist/lib/verdict_labels.js.map +1 -0
  186. package/dist/lib/verify-safety.d.ts +63 -0
  187. package/dist/lib/verify-safety.d.ts.map +1 -0
  188. package/dist/lib/verify-safety.js +123 -0
  189. package/dist/lib/verify-safety.js.map +1 -0
  190. package/dist/lib/verify.d.ts +139 -0
  191. package/dist/lib/verify.d.ts.map +1 -0
  192. package/dist/lib/verify.js +311 -0
  193. package/dist/lib/verify.js.map +1 -0
  194. package/dist/lib/workspace_state.d.ts +79 -0
  195. package/dist/lib/workspace_state.d.ts.map +1 -0
  196. package/dist/lib/workspace_state.js +283 -0
  197. package/dist/lib/workspace_state.js.map +1 -0
  198. package/dist/runner/builder.d.ts +58 -0
  199. package/dist/runner/builder.d.ts.map +1 -0
  200. package/dist/runner/builder.js +775 -0
  201. package/dist/runner/builder.js.map +1 -0
  202. package/dist/runner/builder_parse.d.ts +37 -0
  203. package/dist/runner/builder_parse.d.ts.map +1 -0
  204. package/dist/runner/builder_parse.js +76 -0
  205. package/dist/runner/builder_parse.js.map +1 -0
  206. package/dist/runner/index.d.ts +9 -0
  207. package/dist/runner/index.d.ts.map +1 -0
  208. package/dist/runner/index.js +7 -0
  209. package/dist/runner/index.js.map +1 -0
  210. package/dist/runner/loop.d.ts +51 -0
  211. package/dist/runner/loop.d.ts.map +1 -0
  212. package/dist/runner/loop.js +221 -0
  213. package/dist/runner/loop.js.map +1 -0
  214. package/dist/runner/orchestrator.d.ts +67 -0
  215. package/dist/runner/orchestrator.d.ts.map +1 -0
  216. package/dist/runner/orchestrator.js +376 -0
  217. package/dist/runner/orchestrator.js.map +1 -0
  218. package/dist/runner/tick.d.ts +10 -0
  219. package/dist/runner/tick.d.ts.map +1 -0
  220. package/dist/runner/tick.js +1639 -0
  221. package/dist/runner/tick.js.map +1 -0
  222. package/dist/types/blocked.d.ts +52 -0
  223. package/dist/types/blocked.d.ts.map +1 -0
  224. package/dist/types/blocked.js +8 -0
  225. package/dist/types/blocked.js.map +1 -0
  226. package/dist/types/builder.d.ts +25 -0
  227. package/dist/types/builder.d.ts.map +1 -0
  228. package/dist/types/builder.js +7 -0
  229. package/dist/types/builder.js.map +1 -0
  230. package/dist/types/claude.d.ts +86 -0
  231. package/dist/types/claude.d.ts.map +1 -0
  232. package/dist/types/claude.js +48 -0
  233. package/dist/types/claude.js.map +1 -0
  234. package/dist/types/config.d.ts +384 -0
  235. package/dist/types/config.d.ts.map +1 -0
  236. package/dist/types/config.js +7 -0
  237. package/dist/types/config.js.map +1 -0
  238. package/dist/types/index.d.ts +18 -0
  239. package/dist/types/index.d.ts.map +1 -0
  240. package/dist/types/index.js +8 -0
  241. package/dist/types/index.js.map +1 -0
  242. package/dist/types/lock.d.ts +21 -0
  243. package/dist/types/lock.d.ts.map +1 -0
  244. package/dist/types/lock.js +8 -0
  245. package/dist/types/lock.js.map +1 -0
  246. package/dist/types/preflight.d.ts +49 -0
  247. package/dist/types/preflight.d.ts.map +1 -0
  248. package/dist/types/preflight.js +8 -0
  249. package/dist/types/preflight.js.map +1 -0
  250. package/dist/types/report.d.ts +161 -0
  251. package/dist/types/report.d.ts.map +1 -0
  252. package/dist/types/report.js +8 -0
  253. package/dist/types/report.js.map +1 -0
  254. package/dist/types/reviewer.d.ts +66 -0
  255. package/dist/types/reviewer.d.ts.map +1 -0
  256. package/dist/types/reviewer.js +5 -0
  257. package/dist/types/reviewer.js.map +1 -0
  258. package/dist/types/state.d.ts +124 -0
  259. package/dist/types/state.d.ts.map +1 -0
  260. package/dist/types/state.js +20 -0
  261. package/dist/types/state.js.map +1 -0
  262. package/dist/types/task.d.ts +117 -0
  263. package/dist/types/task.d.ts.map +1 -0
  264. package/dist/types/task.js +7 -0
  265. package/dist/types/task.js.map +1 -0
  266. package/dist/types/workspace_state.d.ts +125 -0
  267. package/dist/types/workspace_state.d.ts.map +1 -0
  268. package/dist/types/workspace_state.js +10 -0
  269. package/dist/types/workspace_state.js.map +1 -0
  270. package/envoi.config.json +191 -0
  271. package/package.json +52 -0
  272. package/relais/prompts/.gitkeep +0 -0
  273. package/relais/prompts/builder.system.txt +13 -0
  274. package/relais/prompts/builder.user.txt +15 -0
  275. package/relais/prompts/orchestrator.system.txt +37 -0
  276. package/relais/prompts/orchestrator.user.txt +34 -0
  277. package/relais/prompts/reviewer.system.txt +33 -0
  278. package/relais/prompts/reviewer.user.txt +35 -0
  279. package/relais/schemas/.gitkeep +0 -0
  280. package/relais/schemas/builder_result.schema.json +29 -0
  281. package/relais/schemas/report.schema.json +195 -0
  282. package/relais/schemas/reviewer_result.schema.json +70 -0
  283. package/relais/schemas/task.schema.json +155 -0
@@ -0,0 +1,237 @@
1
+ /**
2
+ * Judge phase: Compute touched files from git diff.
3
+ *
4
+ * Provides functions to analyze git changes and categorize files
5
+ * for scope guardrail enforcement.
6
+ */
7
+ import type { TaskScope, DiffLimits } from '../types/task.js';
8
+ import type { ScopeConfig } from '../types/config.js';
9
+ import type { ReportCode } from '../types/report.js';
10
+ import type { BlastRadius } from '../types/report.js';
11
+ /**
12
+ * Categorized list of files touched since a base commit.
13
+ */
14
+ export interface TouchedFiles {
15
+ /** Files that were modified */
16
+ modified: string[];
17
+ /** Files that were added */
18
+ added: string[];
19
+ /** Files that were deleted */
20
+ deleted: string[];
21
+ /** Files that were renamed (with old and new paths) */
22
+ renamed: Array<{
23
+ from: string;
24
+ to: string;
25
+ }>;
26
+ /** Files that are untracked (new files not yet committed) */
27
+ untracked: string[];
28
+ /** Union of all file paths (excluding deleted files) */
29
+ all: string[];
30
+ }
31
+ /**
32
+ * Parsed result from git diff --name-status output.
33
+ */
34
+ interface ParsedDiffStatus {
35
+ modified: string[];
36
+ added: string[];
37
+ deleted: string[];
38
+ renamed: Array<{
39
+ from: string;
40
+ to: string;
41
+ }>;
42
+ }
43
+ /**
44
+ * Parses git diff --name-status output into categorized file lists.
45
+ *
46
+ * Git diff --name-status format:
47
+ * - M <path> - Modified
48
+ * - A <path> - Added
49
+ * - D <path> - Deleted
50
+ * - R<score> <old> <new> - Renamed (tab-separated, e.g., R100\told\tnew)
51
+ *
52
+ * This is a pure function that can be easily tested.
53
+ *
54
+ * @param output - Raw output from `git diff --name-status <base>...HEAD`
55
+ * @returns Object with categorized file lists
56
+ *
57
+ * @example
58
+ * ```typescript
59
+ * const diffOutput = 'M\tfile1.ts\nA\tfile2.ts\nR100\told.ts\tnew.ts\n';
60
+ * const result = parseGitDiffNameStatus(diffOutput);
61
+ * // result.modified = ['file1.ts']
62
+ * // result.added = ['file2.ts']
63
+ * // result.renamed = [{ from: 'old.ts', to: 'new.ts' }]
64
+ * ```
65
+ */
66
+ export declare function parseGitDiffNameStatus(output: string): ParsedDiffStatus;
67
+ /**
68
+ * Gets all files touched since a base commit using git diff --name-status
69
+ * and git status --porcelain.
70
+ *
71
+ * Combines:
72
+ * - Tracked file changes (modified, added, deleted, renamed) from git diff
73
+ * - Untracked files from git status
74
+ *
75
+ * @param baseCommit - The base commit SHA to diff against (e.g., 'main' or commit hash)
76
+ * @returns TouchedFiles object with categorized file lists
77
+ * @throws {Error} If git commands fail
78
+ *
79
+ * @example
80
+ * ```typescript
81
+ * const touched = getTouchedFiles('main');
82
+ * console.log(`Modified: ${touched.modified.length}`);
83
+ * console.log(`All files: ${touched.all.join(', ')}`);
84
+ * ```
85
+ */
86
+ export declare function getTouchedFiles(baseCommit: string): TouchedFiles;
87
+ /**
88
+ * Result of scope violation checking.
89
+ */
90
+ export interface ScopeCheckResult {
91
+ /** True if no violations found */
92
+ ok: boolean;
93
+ /** Stop code if violation found, null otherwise */
94
+ stopCode: ReportCode | null;
95
+ /** List of file paths that caused the violation */
96
+ violatingFiles: string[];
97
+ /** Human-readable reason for the violation */
98
+ reason: string | null;
99
+ }
100
+ /**
101
+ * Checks touched files against scope rules and returns first violation or success.
102
+ *
103
+ * Checks are performed in priority order:
104
+ * 1. Runner-owned mutation (highest priority)
105
+ * 2. Forbidden globs
106
+ * 3. Outside allowed globs
107
+ * 4. New file when not allowed
108
+ * 5. Lockfile change when not allowed
109
+ *
110
+ * Returns the first violation found, or success if no violations.
111
+ *
112
+ * @param touched - TouchedFiles object with categorized file lists
113
+ * @param taskScope - Task scope configuration with allowed/forbidden globs and permissions
114
+ * @param scopeConfig - Scope configuration with lockfiles list
115
+ * @param runnerOwnedGlobs - Glob patterns for files owned by the runner
116
+ * @returns ScopeCheckResult with stopCode and violatingFiles
117
+ *
118
+ * @example
119
+ * ```typescript
120
+ * const result = checkScopeViolations(
121
+ * { modified: ['src/utils.ts'], added: ['src/new.ts'], deleted: [], renamed: [], untracked: ['src/new.ts'], all: ['src/utils.ts', 'src/new.ts'] },
122
+ * { allowed_globs: ['src/**'], forbidden_globs: ['*.key'], allow_new_files: false, allow_lockfile_changes: true },
123
+ * { lockfiles: ['package-lock.json'], default_allowed_globs: [], default_forbidden_globs: [], default_allow_new_files: true, default_allow_lockfile_changes: false },
124
+ * ['pilot/**']
125
+ * );
126
+ * if (!result.ok) {
127
+ * console.error(`Violation: ${result.stopCode}`, result.violatingFiles);
128
+ * }
129
+ * ```
130
+ */
131
+ export declare function checkScopeViolations(touched: TouchedFiles, taskScope: TaskScope, scopeConfig: ScopeConfig, runnerOwnedGlobs: string[]): ScopeCheckResult;
132
+ /**
133
+ * Result of diff limits checking.
134
+ */
135
+ export interface DiffCheckResult {
136
+ /** True if within limits, false if limits exceeded */
137
+ ok: boolean;
138
+ /** Stop code if limits exceeded, null otherwise */
139
+ stopCode: 'STOP_DIFF_TOO_LARGE' | null;
140
+ /** Blast radius metrics */
141
+ blastRadius: BlastRadius;
142
+ /** Human-readable reason for the violation */
143
+ reason: string | null;
144
+ }
145
+ /**
146
+ * Parses git diff --stat output to extract line counts.
147
+ *
148
+ * Git diff --stat format:
149
+ * - Individual file lines: " file.ts | N +++++" or " file.ts | N +++---"
150
+ * - Summary line: "N files changed, M insertions(+), K deletions(-)"
151
+ *
152
+ * This function extracts the summary line totals.
153
+ *
154
+ * @param output - Raw output from `git diff --stat <base>...HEAD`
155
+ * @returns Object with linesAdded and linesDeleted totals
156
+ *
157
+ * @example
158
+ * ```typescript
159
+ * const diffStat = ' file1.ts | 5 +++++\n file2.ts | 3 ---\n 2 files changed, 5 insertions(+), 3 deletions(-)';
160
+ * const result = parseGitDiffStat(diffStat);
161
+ * // result.linesAdded = 5
162
+ * // result.linesDeleted = 3
163
+ * ```
164
+ */
165
+ export declare function parseGitDiffStat(output: string): {
166
+ linesAdded: number;
167
+ linesDeleted: number;
168
+ };
169
+ /**
170
+ * Computes blast radius metrics from git diff.
171
+ *
172
+ * Uses git diff --stat to get line counts and TouchedFiles to get file counts.
173
+ *
174
+ * @param baseCommit - The base commit SHA to diff against (e.g., 'main' or commit hash)
175
+ * @param touched - TouchedFiles object with categorized file lists
176
+ * @returns BlastRadius object with file and line counts
177
+ * @throws {Error} If git diff --stat command fails
178
+ *
179
+ * @example
180
+ * ```typescript
181
+ * const touched = getTouchedFiles('main');
182
+ * const blastRadius = computeBlastRadius('main', touched);
183
+ * console.log(`Files touched: ${blastRadius.files_touched}`);
184
+ * console.log(`Lines added: ${blastRadius.lines_added}`);
185
+ * ```
186
+ */
187
+ export declare function computeBlastRadius(baseCommit: string, touched: TouchedFiles): BlastRadius;
188
+ /**
189
+ * Checks blast radius against configured diff limits.
190
+ *
191
+ * Returns STOP_DIFF_TOO_LARGE if either limit is exceeded:
192
+ * - files_touched > max_files_touched
193
+ * - lines_changed (added + deleted) > max_lines_changed
194
+ *
195
+ * @param blastRadius - Blast radius metrics from computeBlastRadius
196
+ * @param limits - Diff limits configuration
197
+ * @returns DiffCheckResult with ok status and stopCode
198
+ *
199
+ * @example
200
+ * ```typescript
201
+ * const blastRadius = computeBlastRadius('main', touched);
202
+ * const result = checkDiffLimits(blastRadius, { max_files_touched: 10, max_lines_changed: 100 });
203
+ * if (!result.ok) {
204
+ * console.error(`Violation: ${result.stopCode}`, result.reason);
205
+ * }
206
+ * ```
207
+ */
208
+ export declare function checkDiffLimits(blastRadius: BlastRadius, limits: DiffLimits): DiffCheckResult;
209
+ /**
210
+ * Result of HEAD-moved check (JUDGE phase).
211
+ * Detects if HEAD was moved externally during a tick (e.g. force push, external commit).
212
+ */
213
+ export interface HeadCheckResult {
214
+ /** True if HEAD is still at expected commit or a descendant of it */
215
+ ok: boolean;
216
+ /** 'STOP_HEAD_MOVED' if HEAD was moved externally, null otherwise */
217
+ stopCode: 'STOP_HEAD_MOVED' | null;
218
+ /** The base commit we expected (stored at tick start) */
219
+ expectedHead: string;
220
+ /** Current HEAD commit SHA */
221
+ actualHead: string;
222
+ /** Human-readable reason when not ok */
223
+ reason: string | null;
224
+ }
225
+ /**
226
+ * Checks if HEAD is still at the expected commit (or a descendant of it).
227
+ *
228
+ * - If HEAD === expectedBaseCommit → ok (no changes yet).
229
+ * - If expectedBaseCommit is ancestor of HEAD → ok (builder made commits).
230
+ * - Otherwise → HEAD was moved externally (force push, external commit, branch switch) → STOP_HEAD_MOVED.
231
+ *
232
+ * @param expectedBaseCommit - The base commit SHA stored at tick start
233
+ * @returns HeadCheckResult with ok, stopCode, expectedHead, actualHead, reason
234
+ */
235
+ export declare function checkHeadMoved(expectedBaseCommit: string): HeadCheckResult;
236
+ export {};
237
+ //# sourceMappingURL=judge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"judge.d.ts","sourceRoot":"","sources":["../../src/lib/judge.ts"],"names":[],"mappings":"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"}