@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.
- package/README.md +238 -0
- package/dist/commands/app.d.ts +2 -0
- package/dist/commands/app.d.ts.map +1 -0
- package/dist/commands/app.js +31 -0
- package/dist/commands/app.js.map +1 -0
- package/dist/commands/autonomy.d.ts +6 -0
- package/dist/commands/autonomy.d.ts.map +1 -0
- package/dist/commands/autonomy.js +89 -0
- package/dist/commands/autonomy.js.map +1 -0
- package/dist/commands/builder.d.ts +13 -0
- package/dist/commands/builder.d.ts.map +1 -0
- package/dist/commands/builder.js +142 -0
- package/dist/commands/builder.js.map +1 -0
- package/dist/commands/idea.d.ts +12 -0
- package/dist/commands/idea.d.ts.map +1 -0
- package/dist/commands/idea.js +79 -0
- package/dist/commands/idea.js.map +1 -0
- package/dist/commands/init.d.ts +18 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +423 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/mode.d.ts +13 -0
- package/dist/commands/mode.d.ts.map +1 -0
- package/dist/commands/mode.js +96 -0
- package/dist/commands/mode.js.map +1 -0
- package/dist/commands/onboard.d.ts +37 -0
- package/dist/commands/onboard.d.ts.map +1 -0
- package/dist/commands/onboard.js +743 -0
- package/dist/commands/onboard.js.map +1 -0
- package/dist/commands/pr-note.d.ts +8 -0
- package/dist/commands/pr-note.d.ts.map +1 -0
- package/dist/commands/pr-note.js +27 -0
- package/dist/commands/pr-note.js.map +1 -0
- package/dist/commands/undo.d.ts +7 -0
- package/dist/commands/undo.d.ts.map +1 -0
- package/dist/commands/undo.js +59 -0
- package/dist/commands/undo.js.map +1 -0
- package/dist/commands/update.d.ts +24 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +248 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/constants/report_codes.d.ts +29 -0
- package/dist/constants/report_codes.d.ts.map +1 -0
- package/dist/constants/report_codes.js +69 -0
- package/dist/constants/report_codes.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +675 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/autonomy.d.ts +16 -0
- package/dist/lib/autonomy.d.ts.map +1 -0
- package/dist/lib/autonomy.js +38 -0
- package/dist/lib/autonomy.js.map +1 -0
- package/dist/lib/blocked.d.ts +87 -0
- package/dist/lib/blocked.d.ts.map +1 -0
- package/dist/lib/blocked.js +134 -0
- package/dist/lib/blocked.js.map +1 -0
- package/dist/lib/branding.d.ts +13 -0
- package/dist/lib/branding.d.ts.map +1 -0
- package/dist/lib/branding.js +19 -0
- package/dist/lib/branding.js.map +1 -0
- package/dist/lib/claude.d.ts +42 -0
- package/dist/lib/claude.d.ts.map +1 -0
- package/dist/lib/claude.js +291 -0
- package/dist/lib/claude.js.map +1 -0
- package/dist/lib/config.d.ts +71 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +410 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/diff.d.ts +150 -0
- package/dist/lib/diff.d.ts.map +1 -0
- package/dist/lib/diff.js +257 -0
- package/dist/lib/diff.js.map +1 -0
- package/dist/lib/doctor.d.ts +67 -0
- package/dist/lib/doctor.d.ts.map +1 -0
- package/dist/lib/doctor.js +211 -0
- package/dist/lib/doctor.js.map +1 -0
- package/dist/lib/fingerprint.d.ts +27 -0
- package/dist/lib/fingerprint.d.ts.map +1 -0
- package/dist/lib/fingerprint.js +116 -0
- package/dist/lib/fingerprint.js.map +1 -0
- package/dist/lib/fs.d.ts +93 -0
- package/dist/lib/fs.d.ts.map +1 -0
- package/dist/lib/fs.js +179 -0
- package/dist/lib/fs.js.map +1 -0
- package/dist/lib/git.d.ts +177 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +355 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/git_branching.d.ts +84 -0
- package/dist/lib/git_branching.d.ts.map +1 -0
- package/dist/lib/git_branching.js +327 -0
- package/dist/lib/git_branching.js.map +1 -0
- package/dist/lib/gitignore.d.ts +26 -0
- package/dist/lib/gitignore.d.ts.map +1 -0
- package/dist/lib/gitignore.js +119 -0
- package/dist/lib/gitignore.js.map +1 -0
- package/dist/lib/guardrails.d.ts +232 -0
- package/dist/lib/guardrails.d.ts.map +1 -0
- package/dist/lib/guardrails.js +323 -0
- package/dist/lib/guardrails.js.map +1 -0
- package/dist/lib/history.d.ts +110 -0
- package/dist/lib/history.d.ts.map +1 -0
- package/dist/lib/history.js +236 -0
- package/dist/lib/history.js.map +1 -0
- package/dist/lib/index.d.ts +29 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +29 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/json-extract.d.ts +42 -0
- package/dist/lib/json-extract.d.ts.map +1 -0
- package/dist/lib/json-extract.js +201 -0
- package/dist/lib/json-extract.js.map +1 -0
- package/dist/lib/judge.d.ts +237 -0
- package/dist/lib/judge.d.ts.map +1 -0
- package/dist/lib/judge.js +501 -0
- package/dist/lib/judge.js.map +1 -0
- package/dist/lib/lock.d.ts +79 -0
- package/dist/lib/lock.d.ts.map +1 -0
- package/dist/lib/lock.js +254 -0
- package/dist/lib/lock.js.map +1 -0
- package/dist/lib/migration.d.ts +9 -0
- package/dist/lib/migration.d.ts.map +1 -0
- package/dist/lib/migration.js +74 -0
- package/dist/lib/migration.js.map +1 -0
- package/dist/lib/paths.d.ts +18 -0
- package/dist/lib/paths.d.ts.map +1 -0
- package/dist/lib/paths.js +27 -0
- package/dist/lib/paths.js.map +1 -0
- package/dist/lib/preflight.d.ts +33 -0
- package/dist/lib/preflight.d.ts.map +1 -0
- package/dist/lib/preflight.js +177 -0
- package/dist/lib/preflight.js.map +1 -0
- package/dist/lib/prompt_budget.d.ts +18 -0
- package/dist/lib/prompt_budget.d.ts.map +1 -0
- package/dist/lib/prompt_budget.js +36 -0
- package/dist/lib/prompt_budget.js.map +1 -0
- package/dist/lib/report.d.ts +102 -0
- package/dist/lib/report.d.ts.map +1 -0
- package/dist/lib/report.js +347 -0
- package/dist/lib/report.js.map +1 -0
- package/dist/lib/reviewer-flow.d.ts +80 -0
- package/dist/lib/reviewer-flow.d.ts.map +1 -0
- package/dist/lib/reviewer-flow.js +138 -0
- package/dist/lib/reviewer-flow.js.map +1 -0
- package/dist/lib/reviewer.d.ts +53 -0
- package/dist/lib/reviewer.d.ts.map +1 -0
- package/dist/lib/reviewer.js +199 -0
- package/dist/lib/reviewer.js.map +1 -0
- package/dist/lib/risk.d.ts +127 -0
- package/dist/lib/risk.d.ts.map +1 -0
- package/dist/lib/risk.js +192 -0
- package/dist/lib/risk.js.map +1 -0
- package/dist/lib/rollback.d.ts +143 -0
- package/dist/lib/rollback.d.ts.map +1 -0
- package/dist/lib/rollback.js +244 -0
- package/dist/lib/rollback.js.map +1 -0
- package/dist/lib/schema.d.ts +47 -0
- package/dist/lib/schema.d.ts.map +1 -0
- package/dist/lib/schema.js +91 -0
- package/dist/lib/schema.js.map +1 -0
- package/dist/lib/scope.d.ts +89 -0
- package/dist/lib/scope.d.ts.map +1 -0
- package/dist/lib/scope.js +135 -0
- package/dist/lib/scope.js.map +1 -0
- package/dist/lib/self_update.d.ts +13 -0
- package/dist/lib/self_update.d.ts.map +1 -0
- package/dist/lib/self_update.js +172 -0
- package/dist/lib/self_update.js.map +1 -0
- package/dist/lib/state.d.ts +143 -0
- package/dist/lib/state.d.ts.map +1 -0
- package/dist/lib/state.js +258 -0
- package/dist/lib/state.js.map +1 -0
- package/dist/lib/tick.d.ts +310 -0
- package/dist/lib/tick.d.ts.map +1 -0
- package/dist/lib/tick.js +424 -0
- package/dist/lib/tick.js.map +1 -0
- package/dist/lib/transport.d.ts +145 -0
- package/dist/lib/transport.d.ts.map +1 -0
- package/dist/lib/transport.js +237 -0
- package/dist/lib/transport.js.map +1 -0
- package/dist/lib/verdict_labels.d.ts +5 -0
- package/dist/lib/verdict_labels.d.ts.map +1 -0
- package/dist/lib/verdict_labels.js +25 -0
- package/dist/lib/verdict_labels.js.map +1 -0
- package/dist/lib/verify-safety.d.ts +63 -0
- package/dist/lib/verify-safety.d.ts.map +1 -0
- package/dist/lib/verify-safety.js +123 -0
- package/dist/lib/verify-safety.js.map +1 -0
- package/dist/lib/verify.d.ts +139 -0
- package/dist/lib/verify.d.ts.map +1 -0
- package/dist/lib/verify.js +311 -0
- package/dist/lib/verify.js.map +1 -0
- package/dist/lib/workspace_state.d.ts +79 -0
- package/dist/lib/workspace_state.d.ts.map +1 -0
- package/dist/lib/workspace_state.js +283 -0
- package/dist/lib/workspace_state.js.map +1 -0
- package/dist/runner/builder.d.ts +58 -0
- package/dist/runner/builder.d.ts.map +1 -0
- package/dist/runner/builder.js +775 -0
- package/dist/runner/builder.js.map +1 -0
- package/dist/runner/builder_parse.d.ts +37 -0
- package/dist/runner/builder_parse.d.ts.map +1 -0
- package/dist/runner/builder_parse.js +76 -0
- package/dist/runner/builder_parse.js.map +1 -0
- package/dist/runner/index.d.ts +9 -0
- package/dist/runner/index.d.ts.map +1 -0
- package/dist/runner/index.js +7 -0
- package/dist/runner/index.js.map +1 -0
- package/dist/runner/loop.d.ts +51 -0
- package/dist/runner/loop.d.ts.map +1 -0
- package/dist/runner/loop.js +221 -0
- package/dist/runner/loop.js.map +1 -0
- package/dist/runner/orchestrator.d.ts +67 -0
- package/dist/runner/orchestrator.d.ts.map +1 -0
- package/dist/runner/orchestrator.js +376 -0
- package/dist/runner/orchestrator.js.map +1 -0
- package/dist/runner/tick.d.ts +10 -0
- package/dist/runner/tick.d.ts.map +1 -0
- package/dist/runner/tick.js +1639 -0
- package/dist/runner/tick.js.map +1 -0
- package/dist/types/blocked.d.ts +52 -0
- package/dist/types/blocked.d.ts.map +1 -0
- package/dist/types/blocked.js +8 -0
- package/dist/types/blocked.js.map +1 -0
- package/dist/types/builder.d.ts +25 -0
- package/dist/types/builder.d.ts.map +1 -0
- package/dist/types/builder.js +7 -0
- package/dist/types/builder.js.map +1 -0
- package/dist/types/claude.d.ts +86 -0
- package/dist/types/claude.d.ts.map +1 -0
- package/dist/types/claude.js +48 -0
- package/dist/types/claude.js.map +1 -0
- package/dist/types/config.d.ts +384 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +7 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +18 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/lock.d.ts +21 -0
- package/dist/types/lock.d.ts.map +1 -0
- package/dist/types/lock.js +8 -0
- package/dist/types/lock.js.map +1 -0
- package/dist/types/preflight.d.ts +49 -0
- package/dist/types/preflight.d.ts.map +1 -0
- package/dist/types/preflight.js +8 -0
- package/dist/types/preflight.js.map +1 -0
- package/dist/types/report.d.ts +161 -0
- package/dist/types/report.d.ts.map +1 -0
- package/dist/types/report.js +8 -0
- package/dist/types/report.js.map +1 -0
- package/dist/types/reviewer.d.ts +66 -0
- package/dist/types/reviewer.d.ts.map +1 -0
- package/dist/types/reviewer.js +5 -0
- package/dist/types/reviewer.js.map +1 -0
- package/dist/types/state.d.ts +124 -0
- package/dist/types/state.d.ts.map +1 -0
- package/dist/types/state.js +20 -0
- package/dist/types/state.js.map +1 -0
- package/dist/types/task.d.ts +117 -0
- package/dist/types/task.d.ts.map +1 -0
- package/dist/types/task.js +7 -0
- package/dist/types/task.js.map +1 -0
- package/dist/types/workspace_state.d.ts +125 -0
- package/dist/types/workspace_state.d.ts.map +1 -0
- package/dist/types/workspace_state.js +10 -0
- package/dist/types/workspace_state.js.map +1 -0
- package/envoi.config.json +191 -0
- package/package.json +52 -0
- package/relais/prompts/.gitkeep +0 -0
- package/relais/prompts/builder.system.txt +13 -0
- package/relais/prompts/builder.user.txt +15 -0
- package/relais/prompts/orchestrator.system.txt +37 -0
- package/relais/prompts/orchestrator.user.txt +34 -0
- package/relais/prompts/reviewer.system.txt +33 -0
- package/relais/prompts/reviewer.user.txt +35 -0
- package/relais/schemas/.gitkeep +0 -0
- package/relais/schemas/builder_result.schema.json +29 -0
- package/relais/schemas/report.schema.json +195 -0
- package/relais/schemas/reviewer_result.schema.json +70 -0
- package/relais/schemas/task.schema.json +155 -0
package/dist/lib/git.js
ADDED
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git helper functions for preflight checks and diff tracking.
|
|
3
|
+
*
|
|
4
|
+
* Uses execSync for git operations to ensure synchronous, blocking behavior.
|
|
5
|
+
*/
|
|
6
|
+
import { execSync } from 'node:child_process';
|
|
7
|
+
import micromatch from 'micromatch';
|
|
8
|
+
/**
|
|
9
|
+
* Checks if the current directory is inside a git repository.
|
|
10
|
+
*
|
|
11
|
+
* @returns true if in a git repo, false otherwise
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* if (!isGitRepo()) {
|
|
16
|
+
* console.error('Not in a git repository');
|
|
17
|
+
* }
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export function isGitRepo() {
|
|
21
|
+
try {
|
|
22
|
+
execSync('git rev-parse --is-inside-work-tree', {
|
|
23
|
+
encoding: 'utf-8',
|
|
24
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
25
|
+
});
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Checks if the git worktree is clean (no uncommitted tracked changes
|
|
34
|
+
* AND no untracked files).
|
|
35
|
+
*
|
|
36
|
+
* A clean worktree means:
|
|
37
|
+
* - No staged changes
|
|
38
|
+
* - No unstaged changes to tracked files
|
|
39
|
+
* - No untracked files
|
|
40
|
+
*
|
|
41
|
+
* @returns true if worktree is clean, false otherwise
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```typescript
|
|
45
|
+
* if (!isWorktreeClean()) {
|
|
46
|
+
* console.error('Worktree has uncommitted changes');
|
|
47
|
+
* }
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export function isWorktreeClean() {
|
|
51
|
+
try {
|
|
52
|
+
// git status --porcelain returns empty if nothing to report
|
|
53
|
+
// (no staged, unstaged, or untracked files)
|
|
54
|
+
const status = execSync('git status --porcelain', {
|
|
55
|
+
encoding: 'utf-8',
|
|
56
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
57
|
+
});
|
|
58
|
+
return status.trim() === '';
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// If git status fails, assume not clean
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Parses git status porcelain output and filters files based on exclusion globs.
|
|
67
|
+
*
|
|
68
|
+
* This is a pure function that can be easily tested.
|
|
69
|
+
*
|
|
70
|
+
* @param statusOutput - Raw output from `git status --porcelain`
|
|
71
|
+
* @param excludeGlobs - Glob patterns for files to exclude from the dirty check
|
|
72
|
+
* @returns Object with `clean` (boolean), `dirtyFiles`, and `excludedFiles`
|
|
73
|
+
*/
|
|
74
|
+
export function parseGitStatusWithExclusions(statusOutput, excludeGlobs) {
|
|
75
|
+
// Only trim trailing whitespace to preserve leading space in status format
|
|
76
|
+
const trimmed = statusOutput.trimEnd();
|
|
77
|
+
if (trimmed === '') {
|
|
78
|
+
return { clean: true, dirtyFiles: [], excludedFiles: [] };
|
|
79
|
+
}
|
|
80
|
+
// Parse git status output to get file paths
|
|
81
|
+
// Format: XY filename (X=staged, Y=unstaged, ?? for untracked)
|
|
82
|
+
// XY are positions 0-1, space at position 2, path starts at position 3
|
|
83
|
+
const allFiles = trimmed
|
|
84
|
+
.split('\n')
|
|
85
|
+
.filter((line) => line.length > 0)
|
|
86
|
+
.map((line) => {
|
|
87
|
+
// Git status porcelain format: XY PATH or XY ORIG -> PATH for renames
|
|
88
|
+
// XY is always 2 chars, then a space, then the path
|
|
89
|
+
// But some entries like copies/renames have different formats
|
|
90
|
+
// Handle renamed/copied files: "R old -> new" or "C old -> new"
|
|
91
|
+
const rawPath = line.slice(3); // Use slice instead of substring for clarity
|
|
92
|
+
if (rawPath.includes(' -> ')) {
|
|
93
|
+
return rawPath.split(' -> ')[1];
|
|
94
|
+
}
|
|
95
|
+
return rawPath;
|
|
96
|
+
});
|
|
97
|
+
// Separate excluded vs non-excluded files
|
|
98
|
+
const excludedFiles = [];
|
|
99
|
+
const dirtyFiles = [];
|
|
100
|
+
for (const file of allFiles) {
|
|
101
|
+
if (excludeGlobs.length > 0 && micromatch.isMatch(file, excludeGlobs)) {
|
|
102
|
+
excludedFiles.push(file);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
dirtyFiles.push(file);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
clean: dirtyFiles.length === 0,
|
|
110
|
+
dirtyFiles,
|
|
111
|
+
excludedFiles,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Checks if the git worktree is clean, excluding files matching specified globs.
|
|
116
|
+
*
|
|
117
|
+
* This is useful for ignoring runner-owned files (like REPORT.json, STATE.json)
|
|
118
|
+
* that are expected to change every tick.
|
|
119
|
+
*
|
|
120
|
+
* @param excludeGlobs - Glob patterns for files to exclude from the dirty check
|
|
121
|
+
* @returns Object with `clean` (boolean) and `dirtyFiles` (non-excluded dirty files)
|
|
122
|
+
*
|
|
123
|
+
* @example
|
|
124
|
+
* ```typescript
|
|
125
|
+
* const result = isWorktreeCleanExcluding(['envoi/**', 'pilot/**']);
|
|
126
|
+
* if (!result.clean) {
|
|
127
|
+
* console.error('Dirty files:', result.dirtyFiles);
|
|
128
|
+
* }
|
|
129
|
+
* ```
|
|
130
|
+
*/
|
|
131
|
+
export function isWorktreeCleanExcluding(excludeGlobs) {
|
|
132
|
+
try {
|
|
133
|
+
const status = execSync('git status --porcelain', {
|
|
134
|
+
encoding: 'utf-8',
|
|
135
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
136
|
+
});
|
|
137
|
+
return parseGitStatusWithExclusions(status, excludeGlobs);
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
// If git status fails, assume not clean
|
|
141
|
+
return { clean: false, dirtyFiles: ['<git status failed>'], excludedFiles: [] };
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Gets the current HEAD commit SHA.
|
|
146
|
+
*
|
|
147
|
+
* @returns The full 40-character SHA of HEAD
|
|
148
|
+
* @throws {Error} If not in a git repo or HEAD doesn't exist
|
|
149
|
+
*
|
|
150
|
+
* @example
|
|
151
|
+
* ```typescript
|
|
152
|
+
* const sha = getHeadCommit();
|
|
153
|
+
* console.log(`Current commit: ${sha}`);
|
|
154
|
+
* ```
|
|
155
|
+
*/
|
|
156
|
+
export function getHeadCommit() {
|
|
157
|
+
try {
|
|
158
|
+
const sha = execSync('git rev-parse HEAD', {
|
|
159
|
+
encoding: 'utf-8',
|
|
160
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
161
|
+
});
|
|
162
|
+
return sha.trim();
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
throw new Error(`Failed to get HEAD commit: ${error instanceof Error ? error.message : String(error)}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Gets the list of files that have changed since a base commit.
|
|
170
|
+
*
|
|
171
|
+
* Returns both modified and added files in the diff.
|
|
172
|
+
*
|
|
173
|
+
* @param base - The base commit SHA to diff against
|
|
174
|
+
* @returns Array of file paths that have changed
|
|
175
|
+
* @throws {Error} If the diff operation fails
|
|
176
|
+
*
|
|
177
|
+
* @example
|
|
178
|
+
* ```typescript
|
|
179
|
+
* const changedFiles = getDiffFiles('abc123');
|
|
180
|
+
* console.log(`${changedFiles.length} files changed`);
|
|
181
|
+
* ```
|
|
182
|
+
*/
|
|
183
|
+
export function getDiffFiles(base) {
|
|
184
|
+
try {
|
|
185
|
+
const output = execSync(`git diff --name-only ${base}`, {
|
|
186
|
+
encoding: 'utf-8',
|
|
187
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
188
|
+
});
|
|
189
|
+
return output
|
|
190
|
+
.trim()
|
|
191
|
+
.split('\n')
|
|
192
|
+
.filter((line) => line.length > 0);
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
throw new Error(`Failed to get diff files from ${base}: ${error instanceof Error ? error.message : String(error)}`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Gets the list of untracked files in the repository.
|
|
200
|
+
*
|
|
201
|
+
* @returns Array of untracked file paths
|
|
202
|
+
*
|
|
203
|
+
* @example
|
|
204
|
+
* ```typescript
|
|
205
|
+
* const untracked = getUntrackedFiles();
|
|
206
|
+
* if (untracked.length > 0) {
|
|
207
|
+
* console.log(`Found ${untracked.length} untracked files`);
|
|
208
|
+
* }
|
|
209
|
+
* ```
|
|
210
|
+
*/
|
|
211
|
+
export function getUntrackedFiles() {
|
|
212
|
+
try {
|
|
213
|
+
// -u shows untracked files, --porcelain gives machine-readable output
|
|
214
|
+
// Untracked files have ?? prefix
|
|
215
|
+
const output = execSync('git status --porcelain', {
|
|
216
|
+
encoding: 'utf-8',
|
|
217
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
218
|
+
});
|
|
219
|
+
return output
|
|
220
|
+
.trim()
|
|
221
|
+
.split('\n')
|
|
222
|
+
.filter((line) => line.startsWith('??'))
|
|
223
|
+
.map((line) => line.substring(3)); // Remove "?? " prefix
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
// If git status fails, return empty array
|
|
227
|
+
return [];
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Gets the current git branch name.
|
|
232
|
+
*
|
|
233
|
+
* @returns The current branch name
|
|
234
|
+
* @throws {Error} If not in a git repo or branch cannot be determined
|
|
235
|
+
*
|
|
236
|
+
* @example
|
|
237
|
+
* ```typescript
|
|
238
|
+
* const branch = getCurrentBranch();
|
|
239
|
+
* console.log(`Current branch: ${branch}`);
|
|
240
|
+
* ```
|
|
241
|
+
*/
|
|
242
|
+
export function getCurrentBranch() {
|
|
243
|
+
try {
|
|
244
|
+
const branch = execSync('git branch --show-current', {
|
|
245
|
+
encoding: 'utf-8',
|
|
246
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
247
|
+
});
|
|
248
|
+
return branch.trim();
|
|
249
|
+
}
|
|
250
|
+
catch (error) {
|
|
251
|
+
throw new Error(`Failed to get current branch: ${error instanceof Error ? error.message : String(error)}`);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Gets the top-level directory of the git repository.
|
|
256
|
+
*
|
|
257
|
+
* @returns The absolute path to the git repository root, or null if not in a git repo
|
|
258
|
+
*
|
|
259
|
+
* @example
|
|
260
|
+
* ```typescript
|
|
261
|
+
* const root = getGitTopLevel();
|
|
262
|
+
* if (root) {
|
|
263
|
+
* console.log(`Git root: ${root}`);
|
|
264
|
+
* }
|
|
265
|
+
* ```
|
|
266
|
+
*/
|
|
267
|
+
export function getGitTopLevel() {
|
|
268
|
+
try {
|
|
269
|
+
const topLevel = execSync('git rev-parse --show-toplevel', {
|
|
270
|
+
encoding: 'utf-8',
|
|
271
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
272
|
+
});
|
|
273
|
+
return topLevel.trim();
|
|
274
|
+
}
|
|
275
|
+
catch {
|
|
276
|
+
return null;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Stashes pilot/ directory files to prevent merge conflicts.
|
|
281
|
+
*
|
|
282
|
+
* Creates a stash containing only files in the pilot/ directory.
|
|
283
|
+
* This allows safe merging without losing pilot state.
|
|
284
|
+
*
|
|
285
|
+
* @returns The stash reference (e.g., "stash@{0}")
|
|
286
|
+
* @throws {Error} If the stash operation fails
|
|
287
|
+
*
|
|
288
|
+
* @example
|
|
289
|
+
* ```typescript
|
|
290
|
+
* const stashRef = stashPilotFiles();
|
|
291
|
+
* // Perform merge...
|
|
292
|
+
* popPilotStash(stashRef);
|
|
293
|
+
* ```
|
|
294
|
+
*/
|
|
295
|
+
export function stashPilotFiles() {
|
|
296
|
+
try {
|
|
297
|
+
// Stash only pilot/ directory files
|
|
298
|
+
// --keep-index keeps staged changes, but we want to stash everything in pilot/
|
|
299
|
+
// Using git stash push with pathspec to stash only pilot/ files
|
|
300
|
+
const output = execSync('git stash push -m "envoi: auto-stash pilot files" -- pilot/', {
|
|
301
|
+
encoding: 'utf-8',
|
|
302
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
303
|
+
});
|
|
304
|
+
// Extract stash reference from output
|
|
305
|
+
// Output format: "Saved working directory and index state On <branch>: <message>"
|
|
306
|
+
// We need to get the stash ref, which is typically "stash@{0}" for the most recent stash
|
|
307
|
+
const stashRef = execSync('git rev-parse --short stash@{0}', {
|
|
308
|
+
encoding: 'utf-8',
|
|
309
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
310
|
+
}).trim();
|
|
311
|
+
// Return the full stash reference
|
|
312
|
+
return 'stash@{0}';
|
|
313
|
+
}
|
|
314
|
+
catch (error) {
|
|
315
|
+
// If stash push fails (e.g., no changes to stash), check if stash exists
|
|
316
|
+
try {
|
|
317
|
+
// Try to get the most recent stash
|
|
318
|
+
execSync('git rev-parse --verify stash@{0} > /dev/null 2>&1', {
|
|
319
|
+
encoding: 'utf-8',
|
|
320
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
321
|
+
});
|
|
322
|
+
return 'stash@{0}';
|
|
323
|
+
}
|
|
324
|
+
catch {
|
|
325
|
+
throw new Error(`Failed to stash pilot files: ${error instanceof Error ? error.message : String(error)}`);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Pops a previously created stash to restore pilot files.
|
|
331
|
+
*
|
|
332
|
+
* Restores the stashed pilot/ directory files back to the working tree.
|
|
333
|
+
*
|
|
334
|
+
* @param stashRef - The stash reference returned by stashPilotFiles (e.g., "stash@{0}")
|
|
335
|
+
* @throws {Error} If the stash pop operation fails
|
|
336
|
+
*
|
|
337
|
+
* @example
|
|
338
|
+
* ```typescript
|
|
339
|
+
* const stashRef = stashPilotFiles();
|
|
340
|
+
* // Perform merge...
|
|
341
|
+
* popPilotStash(stashRef);
|
|
342
|
+
* ```
|
|
343
|
+
*/
|
|
344
|
+
export function popPilotStash(stashRef) {
|
|
345
|
+
try {
|
|
346
|
+
execSync(`git stash pop ${stashRef}`, {
|
|
347
|
+
encoding: 'utf-8',
|
|
348
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
catch (error) {
|
|
352
|
+
throw new Error(`Failed to pop pilot stash ${stashRef}: ${error instanceof Error ? error.message : String(error)}`);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
//# 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,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git branching helper functions for runner-owned branch management.
|
|
3
|
+
*
|
|
4
|
+
* Uses execSync for git operations to ensure synchronous, blocking behavior.
|
|
5
|
+
* All git commands use argv-only (no shell strings) for security.
|
|
6
|
+
*/
|
|
7
|
+
import type { GitBranchingConfig } from '../types/config.js';
|
|
8
|
+
/**
|
|
9
|
+
* Result of branch creation/switch operation.
|
|
10
|
+
*/
|
|
11
|
+
export interface BranchResult {
|
|
12
|
+
/** Whether the operation succeeded */
|
|
13
|
+
ok: boolean;
|
|
14
|
+
/** The branch name that was created/switched to */
|
|
15
|
+
branchName: string;
|
|
16
|
+
/** Error message if operation failed */
|
|
17
|
+
error?: string;
|
|
18
|
+
/** Whether the branch already existed */
|
|
19
|
+
existed: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Parameters for branch template expansion.
|
|
23
|
+
*/
|
|
24
|
+
export interface BranchTemplateParams {
|
|
25
|
+
task_id?: string;
|
|
26
|
+
milestone_id?: string;
|
|
27
|
+
run_id?: string;
|
|
28
|
+
tick_count?: number;
|
|
29
|
+
seq?: number;
|
|
30
|
+
batch_index?: number;
|
|
31
|
+
YYYYMMDD?: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Expands a branch name template with placeholders.
|
|
35
|
+
*
|
|
36
|
+
* Supported placeholders (both {{...}} and {...} styles):
|
|
37
|
+
* - {{task_id}} or {task_id} - Task ID
|
|
38
|
+
* - {{milestone_id}} or {milestone_id} - Milestone ID
|
|
39
|
+
* - {{run_id}} or {run_id} - Run ID
|
|
40
|
+
* - {{tick_count}} or {tick_count} - Tick count (1-based)
|
|
41
|
+
* - {{seq}} or {seq} or {{batch_index}} or {batch_index} - Sequence/batch index (0-based)
|
|
42
|
+
* - {{YYYYMMDD}} or {YYYYMMDD} - Date in YYYYMMDD format
|
|
43
|
+
*
|
|
44
|
+
* @param template - Template string with placeholders
|
|
45
|
+
* @param params - Parameters to substitute
|
|
46
|
+
* @returns Expanded branch name
|
|
47
|
+
*/
|
|
48
|
+
export declare function expandBranchTemplate(template: string, params: BranchTemplateParams): string;
|
|
49
|
+
/**
|
|
50
|
+
* Ensures a branch exists and HEAD is on it (per_tick mode).
|
|
51
|
+
*
|
|
52
|
+
* For per_tick mode, creates/switches to a branch based on the template.
|
|
53
|
+
* If the branch already exists, switches to it (idempotent).
|
|
54
|
+
* If there's a collision, appends a numeric suffix.
|
|
55
|
+
*
|
|
56
|
+
* @param config - Git branching configuration
|
|
57
|
+
* @param params - Parameters for template expansion
|
|
58
|
+
* @returns BranchResult indicating success or failure
|
|
59
|
+
*/
|
|
60
|
+
export declare function ensureBranchPerTick(config: GitBranchingConfig, params: BranchTemplateParams): BranchResult;
|
|
61
|
+
/**
|
|
62
|
+
* Ensures a branch exists and HEAD is on it (per_n_tasks mode).
|
|
63
|
+
*
|
|
64
|
+
* For per_n_tasks mode, creates/switches to a branch based on the template,
|
|
65
|
+
* grouping tasks into batches of n_tasks. The seq parameter represents
|
|
66
|
+
* the batch index (0-based).
|
|
67
|
+
*
|
|
68
|
+
* @param config - Git branching configuration
|
|
69
|
+
* @param params - Parameters for template expansion (must include seq for batch index)
|
|
70
|
+
* @returns BranchResult indicating success or failure
|
|
71
|
+
*/
|
|
72
|
+
export declare function ensureBranchPerNTasks(config: GitBranchingConfig, params: BranchTemplateParams): BranchResult;
|
|
73
|
+
/**
|
|
74
|
+
* Ensures a branch exists and HEAD is on it (per_milestone mode).
|
|
75
|
+
*
|
|
76
|
+
* For per_milestone mode, creates/switches to a branch based on the template
|
|
77
|
+
* for the current milestone. All tasks in the same milestone use the same branch.
|
|
78
|
+
*
|
|
79
|
+
* @param config - Git branching configuration
|
|
80
|
+
* @param params - Parameters for template expansion (must include milestone_id)
|
|
81
|
+
* @returns BranchResult indicating success or failure
|
|
82
|
+
*/
|
|
83
|
+
export declare function ensureBranchPerMilestone(config: GitBranchingConfig, params: BranchTemplateParams): BranchResult;
|
|
84
|
+
//# sourceMappingURL=git_branching.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git_branching.d.ts","sourceRoot":"","sources":["../../src/lib/git_branching.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,sCAAsC;IACtC,EAAE,EAAE,OAAO,CAAC;IACZ,mDAAmD;IACnD,UAAU,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,oBAAoB,GAC3B,MAAM,CAoCR;AAsJD;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,kBAAkB,EAC1B,MAAM,EAAE,oBAAoB,GAC3B,YAAY,CA4Bd;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,kBAAkB,EAC1B,MAAM,EAAE,oBAAoB,GAC3B,YAAY,CAkDd;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,kBAAkB,EAC1B,MAAM,EAAE,oBAAoB,GAC3B,YAAY,CAqCd"}
|