@mknightzzz/stw 0.1.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 (250) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +277 -0
  3. package/dist/agentic-fallback.d.ts +3 -0
  4. package/dist/agentic-fallback.js +32 -0
  5. package/dist/agentic-fallback.js.map +1 -0
  6. package/dist/agentic-prompt.d.ts +2 -0
  7. package/dist/agentic-prompt.js +68 -0
  8. package/dist/agentic-prompt.js.map +1 -0
  9. package/dist/agentic-runtime.d.ts +48 -0
  10. package/dist/agentic-runtime.js +149 -0
  11. package/dist/agentic-runtime.js.map +1 -0
  12. package/dist/agentic-types.d.ts +37 -0
  13. package/dist/agentic-types.js +2 -0
  14. package/dist/agentic-types.js.map +1 -0
  15. package/dist/agents.d.ts +7 -0
  16. package/dist/agents.js +2 -0
  17. package/dist/agents.js.map +1 -0
  18. package/dist/assignments.d.ts +7 -0
  19. package/dist/assignments.js +125 -0
  20. package/dist/assignments.js.map +1 -0
  21. package/dist/checkpoint.d.ts +35 -0
  22. package/dist/checkpoint.js +78 -0
  23. package/dist/checkpoint.js.map +1 -0
  24. package/dist/circuit-breaker.d.ts +17 -0
  25. package/dist/circuit-breaker.js +65 -0
  26. package/dist/circuit-breaker.js.map +1 -0
  27. package/dist/claim.d.ts +6 -0
  28. package/dist/claim.js +135 -0
  29. package/dist/claim.js.map +1 -0
  30. package/dist/clarity-gate.d.ts +12 -0
  31. package/dist/clarity-gate.js +83 -0
  32. package/dist/clarity-gate.js.map +1 -0
  33. package/dist/cli.d.ts +2 -0
  34. package/dist/cli.js +38 -0
  35. package/dist/cli.js.map +1 -0
  36. package/dist/command-dispatch.d.ts +45 -0
  37. package/dist/command-dispatch.js +206 -0
  38. package/dist/command-dispatch.js.map +1 -0
  39. package/dist/command-parser.d.ts +11 -0
  40. package/dist/command-parser.js +101 -0
  41. package/dist/command-parser.js.map +1 -0
  42. package/dist/commands/clean.d.ts +10 -0
  43. package/dist/commands/clean.js +133 -0
  44. package/dist/commands/clean.js.map +1 -0
  45. package/dist/commands/execution.d.ts +2 -0
  46. package/dist/commands/execution.js +327 -0
  47. package/dist/commands/execution.js.map +1 -0
  48. package/dist/commands/go.d.ts +2 -0
  49. package/dist/commands/go.js +197 -0
  50. package/dist/commands/go.js.map +1 -0
  51. package/dist/commands/helpers.d.ts +44 -0
  52. package/dist/commands/helpers.js +231 -0
  53. package/dist/commands/helpers.js.map +1 -0
  54. package/dist/commands/idea.d.ts +2 -0
  55. package/dist/commands/idea.js +89 -0
  56. package/dist/commands/idea.js.map +1 -0
  57. package/dist/commands/init.d.ts +2 -0
  58. package/dist/commands/init.js +94 -0
  59. package/dist/commands/init.js.map +1 -0
  60. package/dist/commands/integration.d.ts +7 -0
  61. package/dist/commands/integration.js +139 -0
  62. package/dist/commands/integration.js.map +1 -0
  63. package/dist/commands/maintenance.d.ts +2 -0
  64. package/dist/commands/maintenance.js +301 -0
  65. package/dist/commands/maintenance.js.map +1 -0
  66. package/dist/commands/run.d.ts +2 -0
  67. package/dist/commands/run.js +356 -0
  68. package/dist/commands/run.js.map +1 -0
  69. package/dist/commands/setup.d.ts +2 -0
  70. package/dist/commands/setup.js +198 -0
  71. package/dist/commands/setup.js.map +1 -0
  72. package/dist/commands/spec.d.ts +2 -0
  73. package/dist/commands/spec.js +35 -0
  74. package/dist/commands/spec.js.map +1 -0
  75. package/dist/commands/stats.d.ts +2 -0
  76. package/dist/commands/stats.js +80 -0
  77. package/dist/commands/stats.js.map +1 -0
  78. package/dist/commands/task-ops.d.ts +2 -0
  79. package/dist/commands/task-ops.js +406 -0
  80. package/dist/commands/task-ops.js.map +1 -0
  81. package/dist/config.d.ts +18 -0
  82. package/dist/config.js +338 -0
  83. package/dist/config.js.map +1 -0
  84. package/dist/cost.d.ts +30 -0
  85. package/dist/cost.js +167 -0
  86. package/dist/cost.js.map +1 -0
  87. package/dist/crash-recovery.d.ts +9 -0
  88. package/dist/crash-recovery.js +42 -0
  89. package/dist/crash-recovery.js.map +1 -0
  90. package/dist/diagnostic.d.ts +48 -0
  91. package/dist/diagnostic.js +328 -0
  92. package/dist/diagnostic.js.map +1 -0
  93. package/dist/doctor.d.ts +31 -0
  94. package/dist/doctor.js +225 -0
  95. package/dist/doctor.js.map +1 -0
  96. package/dist/drift.d.ts +11 -0
  97. package/dist/drift.js +57 -0
  98. package/dist/drift.js.map +1 -0
  99. package/dist/git-utils.d.ts +20 -0
  100. package/dist/git-utils.js +206 -0
  101. package/dist/git-utils.js.map +1 -0
  102. package/dist/gitlab.d.ts +54 -0
  103. package/dist/gitlab.js +101 -0
  104. package/dist/gitlab.js.map +1 -0
  105. package/dist/idea.d.ts +35 -0
  106. package/dist/idea.js +251 -0
  107. package/dist/idea.js.map +1 -0
  108. package/dist/import-resolution.d.ts +13 -0
  109. package/dist/import-resolution.js +111 -0
  110. package/dist/import-resolution.js.map +1 -0
  111. package/dist/inbox-renderer.d.ts +2 -0
  112. package/dist/inbox-renderer.js +67 -0
  113. package/dist/inbox-renderer.js.map +1 -0
  114. package/dist/init.d.ts +105 -0
  115. package/dist/init.js +235 -0
  116. package/dist/init.js.map +1 -0
  117. package/dist/llm-reviewer.d.ts +14 -0
  118. package/dist/llm-reviewer.js +109 -0
  119. package/dist/llm-reviewer.js.map +1 -0
  120. package/dist/lock.d.ts +26 -0
  121. package/dist/lock.js +76 -0
  122. package/dist/lock.js.map +1 -0
  123. package/dist/logger.d.ts +24 -0
  124. package/dist/logger.js +40 -0
  125. package/dist/logger.js.map +1 -0
  126. package/dist/math-utils.d.ts +2 -0
  127. package/dist/math-utils.js +7 -0
  128. package/dist/math-utils.js.map +1 -0
  129. package/dist/mechanical-review.d.ts +30 -0
  130. package/dist/mechanical-review.js +76 -0
  131. package/dist/mechanical-review.js.map +1 -0
  132. package/dist/merge.d.ts +83 -0
  133. package/dist/merge.js +363 -0
  134. package/dist/merge.js.map +1 -0
  135. package/dist/parallel.d.ts +35 -0
  136. package/dist/parallel.js +214 -0
  137. package/dist/parallel.js.map +1 -0
  138. package/dist/plan-validation.d.ts +19 -0
  139. package/dist/plan-validation.js +253 -0
  140. package/dist/plan-validation.js.map +1 -0
  141. package/dist/planner-prompt.d.ts +33 -0
  142. package/dist/planner-prompt.js +244 -0
  143. package/dist/planner-prompt.js.map +1 -0
  144. package/dist/planner.d.ts +29 -0
  145. package/dist/planner.js +511 -0
  146. package/dist/planner.js.map +1 -0
  147. package/dist/poller.d.ts +34 -0
  148. package/dist/poller.js +91 -0
  149. package/dist/poller.js.map +1 -0
  150. package/dist/progress.d.ts +34 -0
  151. package/dist/progress.js +122 -0
  152. package/dist/progress.js.map +1 -0
  153. package/dist/prompt-builder.d.ts +51 -0
  154. package/dist/prompt-builder.js +481 -0
  155. package/dist/prompt-builder.js.map +1 -0
  156. package/dist/provider.d.ts +14 -0
  157. package/dist/provider.js +278 -0
  158. package/dist/provider.js.map +1 -0
  159. package/dist/question-handler.d.ts +18 -0
  160. package/dist/question-handler.js +154 -0
  161. package/dist/question-handler.js.map +1 -0
  162. package/dist/question-triage.d.ts +31 -0
  163. package/dist/question-triage.js +175 -0
  164. package/dist/question-triage.js.map +1 -0
  165. package/dist/repo-detection.d.ts +8 -0
  166. package/dist/repo-detection.js +18 -0
  167. package/dist/repo-detection.js.map +1 -0
  168. package/dist/retry-context.d.ts +2 -0
  169. package/dist/retry-context.js +196 -0
  170. package/dist/retry-context.js.map +1 -0
  171. package/dist/router.d.ts +18 -0
  172. package/dist/router.js +137 -0
  173. package/dist/router.js.map +1 -0
  174. package/dist/run-artifact-types.d.ts +43 -0
  175. package/dist/run-artifact-types.js +2 -0
  176. package/dist/run-artifact-types.js.map +1 -0
  177. package/dist/run-summary.d.ts +14 -0
  178. package/dist/run-summary.js +347 -0
  179. package/dist/run-summary.js.map +1 -0
  180. package/dist/run-sync.d.ts +11 -0
  181. package/dist/run-sync.js +110 -0
  182. package/dist/run-sync.js.map +1 -0
  183. package/dist/run.d.ts +26 -0
  184. package/dist/run.js +150 -0
  185. package/dist/run.js.map +1 -0
  186. package/dist/scope-expansion.d.ts +10 -0
  187. package/dist/scope-expansion.js +117 -0
  188. package/dist/scope-expansion.js.map +1 -0
  189. package/dist/scope.d.ts +4 -0
  190. package/dist/scope.js +37 -0
  191. package/dist/scope.js.map +1 -0
  192. package/dist/scorecard.d.ts +18 -0
  193. package/dist/scorecard.js +128 -0
  194. package/dist/scorecard.js.map +1 -0
  195. package/dist/spec-templates.d.ts +2 -0
  196. package/dist/spec-templates.js +285 -0
  197. package/dist/spec-templates.js.map +1 -0
  198. package/dist/spec-validator.d.ts +8 -0
  199. package/dist/spec-validator.js +144 -0
  200. package/dist/spec-validator.js.map +1 -0
  201. package/dist/status.d.ts +68 -0
  202. package/dist/status.js +261 -0
  203. package/dist/status.js.map +1 -0
  204. package/dist/storage.d.ts +9 -0
  205. package/dist/storage.js +35 -0
  206. package/dist/storage.js.map +1 -0
  207. package/dist/task-executor-completion.d.ts +12 -0
  208. package/dist/task-executor-completion.js +67 -0
  209. package/dist/task-executor-completion.js.map +1 -0
  210. package/dist/task-executor-fallback.d.ts +20 -0
  211. package/dist/task-executor-fallback.js +12 -0
  212. package/dist/task-executor-fallback.js.map +1 -0
  213. package/dist/task-executor.d.ts +34 -0
  214. package/dist/task-executor.js +521 -0
  215. package/dist/task-executor.js.map +1 -0
  216. package/dist/task-graph.d.ts +11 -0
  217. package/dist/task-graph.js +226 -0
  218. package/dist/task-graph.js.map +1 -0
  219. package/dist/task-pipeline-helpers.d.ts +45 -0
  220. package/dist/task-pipeline-helpers.js +160 -0
  221. package/dist/task-pipeline-helpers.js.map +1 -0
  222. package/dist/task-review.d.ts +51 -0
  223. package/dist/task-review.js +410 -0
  224. package/dist/task-review.js.map +1 -0
  225. package/dist/transitions.d.ts +13 -0
  226. package/dist/transitions.js +104 -0
  227. package/dist/transitions.js.map +1 -0
  228. package/dist/types.d.ts +405 -0
  229. package/dist/types.js +101 -0
  230. package/dist/types.js.map +1 -0
  231. package/dist/utils.d.ts +1 -0
  232. package/dist/utils.js +23 -0
  233. package/dist/utils.js.map +1 -0
  234. package/dist/validation.d.ts +19 -0
  235. package/dist/validation.js +73 -0
  236. package/dist/validation.js.map +1 -0
  237. package/dist/worker-response.d.ts +12 -0
  238. package/dist/worker-response.js +60 -0
  239. package/dist/worker-response.js.map +1 -0
  240. package/dist/worker-runner.d.ts +19 -0
  241. package/dist/worker-runner.js +347 -0
  242. package/dist/worker-runner.js.map +1 -0
  243. package/dist/worktree-cleanup.d.ts +44 -0
  244. package/dist/worktree-cleanup.js +325 -0
  245. package/dist/worktree-cleanup.js.map +1 -0
  246. package/dist/worktree.d.ts +22 -0
  247. package/dist/worktree.js +213 -0
  248. package/dist/worktree.js.map +1 -0
  249. package/examples/spec.md +58 -0
  250. package/package.json +66 -0
@@ -0,0 +1,76 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { existsSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ function isCommandExcluded(cmd, excludeCommands) {
5
+ if (!excludeCommands)
6
+ return false;
7
+ const cmdStr = cmd.join(' ');
8
+ return excludeCommands.some((excluded) => cmdStr.includes(excluded));
9
+ }
10
+ function runCommand(file, args, cwd, timeoutMs = 30_000) {
11
+ try {
12
+ const options = {
13
+ cwd,
14
+ encoding: 'utf-8',
15
+ stdio: ['pipe', 'pipe', 'pipe'],
16
+ timeout: timeoutMs,
17
+ killSignal: 'SIGTERM',
18
+ };
19
+ const output = execFileSync(file, args, options);
20
+ return { passed: true, output: output.trim() };
21
+ }
22
+ catch (err) {
23
+ const error = err;
24
+ if (error.killed || error.signal === 'SIGTERM') {
25
+ return { passed: false, output: `Command timed out after ${timeoutMs}ms` };
26
+ }
27
+ const stdout = error.stdout ? String(error.stdout) : '';
28
+ const stderr = error.stderr ? String(error.stderr) : '';
29
+ const output = stdout || stderr || error.message || '';
30
+ return { passed: false, output: output.trim() };
31
+ }
32
+ }
33
+ function getChangedFiles(cwd, baseBranch) {
34
+ try {
35
+ const output = execFileSync('git', ['diff', '--name-only', baseBranch], {
36
+ cwd,
37
+ encoding: 'utf-8',
38
+ stdio: ['pipe', 'pipe', 'pipe'],
39
+ });
40
+ return output.split('\n').filter((line) => line.trim() !== '');
41
+ }
42
+ catch {
43
+ return [];
44
+ }
45
+ }
46
+ export function checkScopeCompliance(declaredScope, changedFiles) {
47
+ const declared = new Set(declaredScope);
48
+ const undeclared = changedFiles.filter((f) => !declared.has(f));
49
+ return {
50
+ passed: undeclared.length === 0,
51
+ declared: declaredScope,
52
+ undeclared,
53
+ };
54
+ }
55
+ export async function runMechanicalReview(options) {
56
+ const { cwd, declaredScope, baseBranch = 'HEAD~1', excludeCommands } = options;
57
+ const isNodeRepo = existsSync(join(cwd, 'package.json'));
58
+ const testResult = !isNodeRepo || isCommandExcluded(['npx', 'vitest', 'run'], excludeCommands)
59
+ ? { passed: true, output: isNodeRepo ? 'skipped (duplicate)' : 'skipped (non-Node repo)' }
60
+ : runCommand('npx', ['vitest', 'run'], cwd);
61
+ const typecheckResult = !isNodeRepo || isCommandExcluded(['npx', 'tsc', '--noEmit'], excludeCommands)
62
+ ? { passed: true, output: isNodeRepo ? 'skipped (duplicate)' : 'skipped (non-Node repo)' }
63
+ : runCommand('npx', ['tsc', '--noEmit'], cwd);
64
+ const changedFiles = getChangedFiles(cwd, baseBranch);
65
+ const scopeResult = checkScopeCompliance(declaredScope, changedFiles);
66
+ const allPassed = testResult.passed && typecheckResult.passed && scopeResult.passed;
67
+ return {
68
+ passed: allPassed,
69
+ checks: {
70
+ tests: testResult,
71
+ typecheck: typecheckResult,
72
+ scope: scopeResult,
73
+ },
74
+ };
75
+ }
76
+ //# sourceMappingURL=mechanical-review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mechanical-review.js","sourceRoot":"","sources":["../src/mechanical-review.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ import { type MRResult } from './gitlab.js';
2
+ import type { RiskLevel, StwConfig, Task } from './types.js';
3
+ export interface MergeOptions {
4
+ repoRoot: string;
5
+ runId: string;
6
+ baseBranch: string;
7
+ runBranch: string;
8
+ maxRisk: RiskLevel;
9
+ config: StwConfig;
10
+ tasks: Task[];
11
+ stwRoot?: string;
12
+ }
13
+ export interface MergeResult {
14
+ mechanical_passed: boolean;
15
+ llm_passed: boolean;
16
+ auto_merge: boolean;
17
+ should_push: boolean;
18
+ max_risk: RiskLevel;
19
+ mr_url?: string;
20
+ mr_iid?: number;
21
+ error?: string;
22
+ failure_reason?: string;
23
+ }
24
+ export interface PushAndCreateMROptions {
25
+ repoRoot: string;
26
+ runBranch: string;
27
+ baseBranch: string;
28
+ title: string;
29
+ autoMerge: boolean;
30
+ remote?: string;
31
+ }
32
+ export interface GitlabMergeabilityCheckResult {
33
+ ok: boolean;
34
+ reason?: string;
35
+ }
36
+ export interface ConflictMarker {
37
+ type: 'ours' | 'theirs' | 'ancestor';
38
+ file?: string;
39
+ content: string;
40
+ }
41
+ export interface ConflictingFile {
42
+ path: string;
43
+ hasConflictMarkers: boolean;
44
+ isBinary: boolean;
45
+ }
46
+ export type AutomaticResolutionStrategy = 'ours' | 'theirs' | 'ancestor' | 'combine';
47
+ export interface MergeResolutionResult {
48
+ resolved: boolean;
49
+ strategy?: AutomaticResolutionStrategy;
50
+ filesResolved: string[];
51
+ filesUnresolved: string[];
52
+ }
53
+ export declare function parseConflictMarkers(output: string): ConflictMarker[];
54
+ export declare function identifyConflictingFiles(mergeTreeOutput: string): string[];
55
+ export declare function detectBinaryVsTextConflicts(mergeTreeOutput: string): {
56
+ binary: string[];
57
+ text: string[];
58
+ };
59
+ export declare function automaticResolutionStrategy(mergeTreeOutput: string): AutomaticResolutionStrategy | null;
60
+ export declare function resolveConflictsAutomatic(mergeTreeOutput: string, strategy: AutomaticResolutionStrategy): MergeResolutionResult;
61
+ export declare function cleanupConflictedFiles(repoRoot: string, files: string[]): void;
62
+ export interface ExecuteMergeForRunOptions {
63
+ stwRoot: string;
64
+ runId: string;
65
+ repoRoot: string;
66
+ }
67
+ export interface ExecuteMergeForRunResult {
68
+ ok: boolean;
69
+ result?: MergeResult;
70
+ messages: Array<{
71
+ level: 'info' | 'error';
72
+ text: string;
73
+ }>;
74
+ }
75
+ export declare function prepareMerge(options: MergeOptions): Promise<MergeResult>;
76
+ export declare function checkGitlabMergeability(options: {
77
+ repoRoot: string;
78
+ baseBranch: string;
79
+ runBranch: string;
80
+ }): GitlabMergeabilityCheckResult;
81
+ export declare function pushAndCreateMR(options: PushAndCreateMROptions): MRResult;
82
+ export declare function writeMergeArtifact(stwRoot: string, runId: string, result: MergeResult): void;
83
+ export declare function executeMergeForRun(options: ExecuteMergeForRunOptions): Promise<ExecuteMergeForRunResult>;
package/dist/merge.js ADDED
@@ -0,0 +1,363 @@
1
+ /* eslint-disable max-lines */
2
+ import { execFileSync } from 'node:child_process';
3
+ import { randomUUID } from 'node:crypto';
4
+ import { tmpdir } from 'node:os';
5
+ import { join } from 'node:path';
6
+ import { createDraftMR, setMRLabels } from './gitlab.js';
7
+ import { reviewTask } from './llm-reviewer.js';
8
+ import { runMechanicalReview } from './mechanical-review.js';
9
+ import { runDir, writeJson, readJson } from './storage.js';
10
+ import { readTaskStatus } from './status.js';
11
+ import { loadConfig } from './config.js';
12
+ export function parseConflictMarkers(output) {
13
+ const markers = [];
14
+ const lines = output.split('\n');
15
+ for (const line of lines) {
16
+ if (line.startsWith('<<<<<<<')) {
17
+ markers.push({ type: 'ours', content: line });
18
+ }
19
+ else if (line.startsWith('=======')) {
20
+ if (markers.length > 0 && markers[markers.length - 1].type === 'ours') {
21
+ markers[markers.length - 1].type = 'ancestor';
22
+ markers.push({ type: 'theirs', content: line });
23
+ }
24
+ }
25
+ else if (line.startsWith('>>>>>>>')) {
26
+ markers.push({ type: 'theirs', content: line });
27
+ }
28
+ }
29
+ return markers;
30
+ }
31
+ export function identifyConflictingFiles(mergeTreeOutput) {
32
+ const files = [];
33
+ const lines = mergeTreeOutput.split('\n');
34
+ for (const line of lines) {
35
+ const conflictMatch = line.match(/^<<<<<<< .*/);
36
+ if (conflictMatch) {
37
+ const file = conflictMatch[0].replace('<<<<<<< ', '');
38
+ if (file && !files.includes(file)) {
39
+ files.push(file);
40
+ }
41
+ }
42
+ }
43
+ return files;
44
+ }
45
+ export function detectBinaryVsTextConflicts(mergeTreeOutput) {
46
+ const binary = [];
47
+ const text = [];
48
+ const conflictingFiles = identifyConflictingFiles(mergeTreeOutput);
49
+ for (const file of conflictingFiles) {
50
+ const binaryExtensions = ['.png', '.jpg', '.jpeg', '.gif', '.ico', '.pdf', '.zip', '.tar', '.gz'];
51
+ const isBinaryFile = binaryExtensions.some((ext) => file.endsWith(ext));
52
+ if (isBinaryFile) {
53
+ binary.push(file);
54
+ }
55
+ else {
56
+ text.push(file);
57
+ }
58
+ }
59
+ return { binary, text };
60
+ }
61
+ export function automaticResolutionStrategy(mergeTreeOutput) {
62
+ const conflictingFiles = identifyConflictingFiles(mergeTreeOutput);
63
+ if (conflictingFiles.length === 0) {
64
+ return null;
65
+ }
66
+ const { binary } = detectBinaryVsTextConflicts(mergeTreeOutput);
67
+ if (binary.length > 0) {
68
+ return 'ancestor';
69
+ }
70
+ return 'ours';
71
+ }
72
+ export function resolveConflictsAutomatic(mergeTreeOutput, strategy) {
73
+ const conflictingFiles = identifyConflictingFiles(mergeTreeOutput);
74
+ if (conflictingFiles.length === 0) {
75
+ return { resolved: true, filesResolved: [], filesUnresolved: [] };
76
+ }
77
+ return {
78
+ resolved: true,
79
+ strategy,
80
+ filesResolved: conflictingFiles,
81
+ filesUnresolved: [],
82
+ };
83
+ }
84
+ export function cleanupConflictedFiles(repoRoot, files) {
85
+ for (const file of files) {
86
+ try {
87
+ execFileSync('git', ['checkout', '--theirs', file], getExecOptions(repoRoot));
88
+ }
89
+ catch {
90
+ // Best effort cleanup
91
+ }
92
+ }
93
+ }
94
+ export async function prepareMerge(options) {
95
+ const declaredScope = collectDeclaredScope(options.tasks);
96
+ const reviewTaskDir = runDir(resolveStwRoot(options.repoRoot, options.stwRoot), options.runId);
97
+ let worktreePath = null;
98
+ try {
99
+ worktreePath = createDetachedWorktree(options.repoRoot, options.runBranch);
100
+ const mechanicalResult = await runMechanicalReview({
101
+ cwd: worktreePath,
102
+ declaredScope,
103
+ baseBranch: options.baseBranch,
104
+ });
105
+ if (!mechanicalResult.passed) {
106
+ return {
107
+ mechanical_passed: false,
108
+ llm_passed: false,
109
+ auto_merge: false,
110
+ should_push: false,
111
+ max_risk: options.maxRisk,
112
+ failure_reason: 'Mechanical review failed',
113
+ };
114
+ }
115
+ const validationResult = {
116
+ passed: true,
117
+ checks: [],
118
+ };
119
+ const reviewResult = await reviewTask(createMergeReviewTask(options.runId, options.maxRisk, declaredScope), options.config, getRunDiff(options.repoRoot, options.baseBranch, options.runBranch), validationResult, reviewTaskDir, worktreePath);
120
+ const llmPassed = reviewResult.decision === 'complete';
121
+ const shouldPush = llmPassed;
122
+ return {
123
+ mechanical_passed: true,
124
+ llm_passed: llmPassed,
125
+ auto_merge: shouldPush && options.maxRisk !== 'high',
126
+ should_push: shouldPush,
127
+ max_risk: options.maxRisk,
128
+ failure_reason: llmPassed ? undefined : 'LLM review did not approve the run',
129
+ };
130
+ }
131
+ finally {
132
+ if (worktreePath) {
133
+ removeWorktree(options.repoRoot, worktreePath);
134
+ }
135
+ }
136
+ }
137
+ export function checkGitlabMergeability(options) {
138
+ const gitOptions = getExecOptions(options.repoRoot);
139
+ try {
140
+ execFileSync('git', ['rev-parse', '--verify', options.runBranch], gitOptions);
141
+ }
142
+ catch {
143
+ return {
144
+ ok: false,
145
+ reason: `Run branch does not exist locally: ${options.runBranch}`,
146
+ };
147
+ }
148
+ try {
149
+ execFileSync('git', ['rev-parse', '--verify', options.baseBranch], gitOptions);
150
+ }
151
+ catch {
152
+ return {
153
+ ok: false,
154
+ reason: `Base branch does not exist locally: ${options.baseBranch}`,
155
+ };
156
+ }
157
+ try {
158
+ const statusOutput = String(execFileSync('git', ['status', '--porcelain'], gitOptions)).trim();
159
+ if (statusOutput.length > 0) {
160
+ return {
161
+ ok: false,
162
+ reason: 'GitLab mergeability check failed: working tree is not clean',
163
+ };
164
+ }
165
+ }
166
+ catch {
167
+ return {
168
+ ok: false,
169
+ reason: 'GitLab mergeability check failed: could not inspect working tree status',
170
+ };
171
+ }
172
+ try {
173
+ execFileSync('git', ['merge-base', options.baseBranch, options.runBranch], gitOptions);
174
+ }
175
+ catch {
176
+ return {
177
+ ok: false,
178
+ reason: `Could not determine merge base between ${options.baseBranch} and ${options.runBranch}`,
179
+ };
180
+ }
181
+ try {
182
+ const mergeBase = String(execFileSync('git', ['merge-base', options.baseBranch, options.runBranch], gitOptions)).trim();
183
+ const output = execFileSync('git', ['merge-tree', mergeBase, options.baseBranch, options.runBranch], gitOptions);
184
+ if (output.includes('<<<<<<<')) {
185
+ return {
186
+ ok: false,
187
+ reason: 'GitLab mergeability check failed: merge conflicts detected',
188
+ };
189
+ }
190
+ }
191
+ catch (error) {
192
+ const execError = error;
193
+ const output = execError.stdout ?? '';
194
+ if (output.includes('<<<<<<<')) {
195
+ return {
196
+ ok: false,
197
+ reason: 'GitLab mergeability check failed: merge conflicts detected',
198
+ };
199
+ }
200
+ }
201
+ return { ok: true };
202
+ }
203
+ export function pushAndCreateMR(options) {
204
+ const gitOptions = getExecOptions(options.repoRoot);
205
+ const remote = options.remote ?? 'gitlab';
206
+ execFileSync('git', ['push', remote, options.runBranch], gitOptions);
207
+ const result = createDraftMR({
208
+ repoRoot: options.repoRoot,
209
+ sourceBranch: options.runBranch,
210
+ targetBranch: options.baseBranch,
211
+ title: options.title,
212
+ });
213
+ const labels = ['ai:running'];
214
+ if (options.autoMerge) {
215
+ labels.push('ai:complete');
216
+ }
217
+ setMRLabels({
218
+ repoRoot: options.repoRoot,
219
+ mrIid: result.mr_iid,
220
+ labels,
221
+ });
222
+ return result;
223
+ }
224
+ export function writeMergeArtifact(stwRoot, runId, result) {
225
+ writeJson(join(runDir(stwRoot, runId), 'merge.json'), {
226
+ schema_version: 1,
227
+ run_id: runId,
228
+ ...result,
229
+ timestamp: new Date().toISOString(),
230
+ });
231
+ }
232
+ export async function executeMergeForRun(options) {
233
+ const messages = [];
234
+ const manifest = readJson(join(runDir(options.stwRoot, options.runId), 'manifest.json'));
235
+ const graph = readJson(join(runDir(options.stwRoot, options.runId), 'task_graph.json'));
236
+ const config = loadConfig(join(options.stwRoot, 'config.yml'));
237
+ if (manifest.status !== 'complete') {
238
+ messages.push({
239
+ level: 'error',
240
+ text: `Run ${options.runId} is not mergeable yet: status is ${manifest.status}, expected complete.`,
241
+ });
242
+ return { ok: false, messages };
243
+ }
244
+ const completedTasks = graph.tasks.filter((task) => readTaskStatus(options.stwRoot, options.runId, task.id)?.status === 'complete');
245
+ if (completedTasks.length !== graph.tasks.length) {
246
+ messages.push({
247
+ level: 'error',
248
+ text: `Run ${options.runId} is not mergeable yet: ${completedTasks.length}/${graph.tasks.length} tasks are marked complete.`,
249
+ });
250
+ return { ok: false, messages };
251
+ }
252
+ const mergeability = checkGitlabMergeability({
253
+ repoRoot: options.repoRoot,
254
+ baseBranch: manifest.base_branch,
255
+ runBranch: manifest.branch,
256
+ });
257
+ if (!mergeability.ok) {
258
+ messages.push({ level: 'error', text: mergeability.reason ?? 'GitLab mergeability checks failed.' });
259
+ return { ok: false, messages };
260
+ }
261
+ const maxRisk = ['high', 'medium', 'low'].find((risk) => completedTasks.some((task) => task.risk === risk)) ?? 'low';
262
+ messages.push({
263
+ level: 'info',
264
+ text: `Preparing merge for ${completedTasks.length} completed tasks (max risk: ${maxRisk})...`,
265
+ });
266
+ const result = await prepareMerge({
267
+ repoRoot: options.repoRoot,
268
+ runId: options.runId,
269
+ baseBranch: manifest.base_branch,
270
+ runBranch: manifest.branch,
271
+ maxRisk,
272
+ config,
273
+ tasks: completedTasks,
274
+ stwRoot: options.stwRoot,
275
+ });
276
+ if (!result.should_push) {
277
+ messages.push({ level: 'error', text: 'Review failed. Not pushing.' });
278
+ messages.push({ level: 'error', text: `Mechanical: ${result.mechanical_passed ? 'PASS' : 'FAIL'}` });
279
+ messages.push({ level: 'error', text: `LLM: ${result.llm_passed ? 'PASS' : 'FAIL'}` });
280
+ if (result.failure_reason) {
281
+ messages.push({ level: 'error', text: `Reason: ${result.failure_reason}` });
282
+ }
283
+ writeMergeArtifact(options.stwRoot, options.runId, result);
284
+ return { ok: false, result, messages };
285
+ }
286
+ messages.push({
287
+ level: 'info',
288
+ text: `Reviews passed. Pushing and creating MR (auto-merge: ${result.auto_merge})...`,
289
+ });
290
+ try {
291
+ const mr = pushAndCreateMR({
292
+ repoRoot: options.repoRoot,
293
+ runBranch: manifest.branch,
294
+ baseBranch: manifest.base_branch,
295
+ title: `[stw] ${manifest.run_id}`,
296
+ autoMerge: result.auto_merge,
297
+ remote: config.gitlab?.remote ?? 'gitlab',
298
+ });
299
+ result.mr_url = mr.mr_url;
300
+ result.mr_iid = mr.mr_iid;
301
+ messages.push({ level: 'info', text: `MR created: ${mr.mr_url}` });
302
+ if (!result.auto_merge) {
303
+ messages.push({ level: 'info', text: 'High-risk run - manual merge required.' });
304
+ }
305
+ }
306
+ catch (error) {
307
+ const message = error instanceof Error ? error.message : String(error);
308
+ result.error = message;
309
+ messages.push({ level: 'error', text: `Failed to push/create MR: ${message}` });
310
+ }
311
+ writeMergeArtifact(options.stwRoot, options.runId, result);
312
+ return { ok: !result.error, result, messages };
313
+ }
314
+ function collectDeclaredScope(tasks) {
315
+ const scope = new Set();
316
+ for (const task of tasks) {
317
+ for (const file of task.scope.files) {
318
+ scope.add(file);
319
+ }
320
+ }
321
+ return [...scope];
322
+ }
323
+ function createMergeReviewTask(runId, risk, declaredScope) {
324
+ return {
325
+ schema_version: 1,
326
+ id: `merge-${runId}`,
327
+ description: `Review merge readiness for run ${runId}`,
328
+ task_type: 'merge_review',
329
+ risk,
330
+ state: 'reviewing',
331
+ scope: {
332
+ files: declaredScope,
333
+ allow_shared_files: true,
334
+ },
335
+ dependencies: [],
336
+ acceptance_checks: [],
337
+ model_tier: 'strong',
338
+ max_retries: 0,
339
+ timeout_minutes: 10,
340
+ };
341
+ }
342
+ function resolveStwRoot(repoRoot, stwRoot) {
343
+ return stwRoot ?? join(repoRoot, '.stw');
344
+ }
345
+ function createDetachedWorktree(repoRoot, runBranch) {
346
+ const worktreePath = join(tmpdir(), `stw-merge-${randomUUID().slice(0, 8)}`);
347
+ execFileSync('git', ['worktree', 'add', '--detach', worktreePath, runBranch], getExecOptions(repoRoot));
348
+ return worktreePath;
349
+ }
350
+ function removeWorktree(repoRoot, worktreePath) {
351
+ execFileSync('git', ['worktree', 'remove', '--force', worktreePath], getExecOptions(repoRoot));
352
+ }
353
+ function getRunDiff(repoRoot, baseBranch, runBranch) {
354
+ return execFileSync('git', ['diff', `${baseBranch}...${runBranch}`], getExecOptions(repoRoot));
355
+ }
356
+ function getExecOptions(cwd) {
357
+ return {
358
+ cwd,
359
+ encoding: 'utf-8',
360
+ stdio: ['pipe', 'pipe', 'pipe'],
361
+ };
362
+ }
363
+ //# sourceMappingURL=merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.js","sourceRoot":"","sources":["../src/merge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { Task, TaskGraph, StwConfig } from './types.js';
2
+ import { type ExecuteTaskOptions, type ExecuteTaskResult } from './task-executor.js';
3
+ import type { Logger } from './logger.js';
4
+ export interface ReadyTask {
5
+ task: Task;
6
+ index: number;
7
+ }
8
+ export declare function findReadyTasks(graph: TaskGraph, stwRoot: string, runId: string): ReadyTask[];
9
+ export interface BatchTaskResult {
10
+ task: Task;
11
+ result: ExecuteTaskResult;
12
+ worktreePath?: string;
13
+ taskBranch?: string;
14
+ taskDir: string;
15
+ }
16
+ export interface MergeBackResult {
17
+ taskId: string;
18
+ merged: boolean;
19
+ needsRetry: boolean;
20
+ error?: string;
21
+ }
22
+ export declare function mergeBackSequentially(input: {
23
+ completedResults: BatchTaskResult[];
24
+ repoRoot: string;
25
+ runBranch: string;
26
+ logger?: Logger;
27
+ }): MergeBackResult[];
28
+ export interface ExecuteBatchOptions {
29
+ tasks: Task[];
30
+ config: StwConfig;
31
+ baseOptions: Omit<ExecuteTaskOptions, 'deferMerge' | 'taskDir'>;
32
+ taskDirFn: (taskId: string) => string;
33
+ logger?: Logger;
34
+ }
35
+ export declare function executeBatch(options: ExecuteBatchOptions): Promise<BatchTaskResult[]>;