@renseiai/agentfactory 0.8.25 → 0.8.27
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/orchestrator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAmCH,OAAO,KAAK,EAAE,aAAa,EAA0B,MAAM,iBAAiB,CAAA;AAuB5E,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAElB,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,2BAA2B,EAC5B,MAAM,YAAY,CAAA;AAyBnB;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CA6B1E;
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import { randomUUID } from 'crypto';
|
|
7
7
|
import { execSync } from 'child_process';
|
|
8
8
|
import { copyFileSync, existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, readlinkSync, rmSync, statSync, symlinkSync, unlinkSync, writeFileSync } from 'fs';
|
|
9
|
-
import { resolve, dirname, basename } from 'path';
|
|
9
|
+
import { resolve, dirname, basename, isAbsolute } from 'path';
|
|
10
10
|
import { parse as parseDotenv } from 'dotenv';
|
|
11
11
|
import { createProvider, resolveProviderName, resolveProviderWithSource, } from '../providers/index.js';
|
|
12
12
|
import { initializeAgentDir, writeState, updateState, writeTodos, createInitialState, checkRecovery, buildRecoveryPrompt, getHeartbeatTimeoutFromEnv, getMaxRecoveryAttemptsFromEnv, } from './state-recovery.js';
|
|
@@ -102,7 +102,34 @@ const DEFAULT_CONFIG = {
|
|
|
102
102
|
/**
|
|
103
103
|
* Load environment variables from .claude/settings.local.json
|
|
104
104
|
*/
|
|
105
|
-
function loadSettingsEnv(workDir, log) {
|
|
105
|
+
function loadSettingsEnv(workDir, log, mainRepoRoot) {
|
|
106
|
+
// If main repo root is known, check there first (settings.local.json is gitignored,
|
|
107
|
+
// so it only exists in the main repo, not in worktrees)
|
|
108
|
+
if (mainRepoRoot) {
|
|
109
|
+
const settingsPath = resolve(mainRepoRoot, '.claude', 'settings.local.json');
|
|
110
|
+
if (existsSync(settingsPath)) {
|
|
111
|
+
try {
|
|
112
|
+
const content = readFileSync(settingsPath, 'utf-8');
|
|
113
|
+
const settings = JSON.parse(content);
|
|
114
|
+
if (settings.env && typeof settings.env === 'object') {
|
|
115
|
+
const env = {};
|
|
116
|
+
for (const [key, value] of Object.entries(settings.env)) {
|
|
117
|
+
if (typeof value === 'string') {
|
|
118
|
+
env[key] = value;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
log?.debug('Loaded settings.local.json from main repo', { envVars: Object.keys(env).length });
|
|
122
|
+
return env;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
log?.warn('Failed to load settings.local.json from main repo', {
|
|
127
|
+
error: error instanceof Error ? error.message : String(error),
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
return {};
|
|
131
|
+
}
|
|
132
|
+
}
|
|
106
133
|
// Walk up from workDir to find .claude/settings.local.json
|
|
107
134
|
let currentDir = workDir;
|
|
108
135
|
let prevDir = '';
|
|
@@ -142,8 +169,8 @@ function loadSettingsEnv(workDir, log) {
|
|
|
142
169
|
return {};
|
|
143
170
|
}
|
|
144
171
|
/**
|
|
145
|
-
* Find the
|
|
146
|
-
*
|
|
172
|
+
* Find the repo root from a starting directory.
|
|
173
|
+
* Accepts both real .git directories (main repos) and .git files (worktrees).
|
|
147
174
|
*/
|
|
148
175
|
function findRepoRoot(startDir) {
|
|
149
176
|
let currentDir = startDir;
|
|
@@ -151,16 +178,54 @@ function findRepoRoot(startDir) {
|
|
|
151
178
|
while (currentDir !== prevDir) {
|
|
152
179
|
const gitPath = resolve(currentDir, '.git');
|
|
153
180
|
if (existsSync(gitPath)) {
|
|
154
|
-
|
|
181
|
+
return currentDir;
|
|
182
|
+
}
|
|
183
|
+
prevDir = currentDir;
|
|
184
|
+
currentDir = dirname(currentDir);
|
|
185
|
+
}
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Resolve the main repo root from any path — works for both regular repos
|
|
190
|
+
* and worktrees. For worktrees, follows the .git file's gitdir reference
|
|
191
|
+
* back to the main .git directory.
|
|
192
|
+
*/
|
|
193
|
+
function resolveMainRepoRoot(startDir) {
|
|
194
|
+
let currentDir = startDir;
|
|
195
|
+
let prevDir = '';
|
|
196
|
+
while (currentDir !== prevDir) {
|
|
197
|
+
const gitPath = resolve(currentDir, '.git');
|
|
198
|
+
if (existsSync(gitPath)) {
|
|
155
199
|
try {
|
|
156
|
-
const
|
|
157
|
-
|
|
158
|
-
|
|
200
|
+
const stat = statSync(gitPath);
|
|
201
|
+
if (stat.isDirectory()) {
|
|
202
|
+
// Real .git directory — this is the main repo root
|
|
159
203
|
return currentDir;
|
|
160
204
|
}
|
|
205
|
+
// .git file — worktree reference: "gitdir: /path/to/main/.git/worktrees/BRANCH"
|
|
206
|
+
const content = readFileSync(gitPath, 'utf-8').trim();
|
|
207
|
+
if (content.startsWith('gitdir:')) {
|
|
208
|
+
const gitdir = content.replace('gitdir:', '').trim();
|
|
209
|
+
const resolved = isAbsolute(gitdir) ? gitdir : resolve(currentDir, gitdir);
|
|
210
|
+
// Walk up from worktrees/BRANCH → .git → repo root
|
|
211
|
+
let candidate = resolved;
|
|
212
|
+
while (candidate !== dirname(candidate)) {
|
|
213
|
+
candidate = dirname(candidate);
|
|
214
|
+
if (basename(candidate) === '.git') {
|
|
215
|
+
try {
|
|
216
|
+
if (statSync(candidate).isDirectory()) {
|
|
217
|
+
return dirname(candidate);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
// continue walking up
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
161
226
|
}
|
|
162
227
|
catch {
|
|
163
|
-
// If we can't read
|
|
228
|
+
// If we can't read/stat .git, treat it as the repo root
|
|
164
229
|
return currentDir;
|
|
165
230
|
}
|
|
166
231
|
}
|
|
@@ -199,9 +264,9 @@ export function resolveWorktreePath(template, gitRoot, branch) {
|
|
|
199
264
|
* This ensures agents running in worktrees have access to database config
|
|
200
265
|
* and other environment variables that are gitignored.
|
|
201
266
|
*/
|
|
202
|
-
function loadAppEnvFiles(workDir, workType, log) {
|
|
203
|
-
//
|
|
204
|
-
const repoRoot = findRepoRoot(workDir);
|
|
267
|
+
function loadAppEnvFiles(workDir, workType, log, mainRepoRoot) {
|
|
268
|
+
// Use provided main repo root, or resolve from workDir (follows worktree .git references)
|
|
269
|
+
const repoRoot = mainRepoRoot ?? resolveMainRepoRoot(workDir) ?? findRepoRoot(workDir);
|
|
205
270
|
if (!repoRoot) {
|
|
206
271
|
log?.warn('Could not find repo root for env file loading', { startDir: workDir });
|
|
207
272
|
return {};
|
|
@@ -1881,7 +1946,9 @@ ORCHESTRATOR_INSTALL=1 exec pnpm add "$@"
|
|
|
1881
1946
|
* Falls back to `pnpm install --frozen-lockfile` if symlinking fails.
|
|
1882
1947
|
*/
|
|
1883
1948
|
linkDependencies(worktreePath, identifier) {
|
|
1884
|
-
|
|
1949
|
+
// Use the main repo root (set at construction from process.cwd()) for node_modules.
|
|
1950
|
+
// Worktrees are sibling directories that don't contain node_modules.
|
|
1951
|
+
const repoRoot = this.gitRoot ?? resolveMainRepoRoot(worktreePath) ?? findRepoRoot(worktreePath);
|
|
1885
1952
|
if (!repoRoot) {
|
|
1886
1953
|
console.warn(`[${identifier}] Could not find repo root, skipping dependency linking`);
|
|
1887
1954
|
return;
|
|
@@ -2128,7 +2195,7 @@ ORCHESTRATOR_INSTALL=1 exec pnpm add "$@"
|
|
|
2128
2195
|
* updates the main repo's node_modules, then re-links into the worktree.
|
|
2129
2196
|
*/
|
|
2130
2197
|
syncDependencies(worktreePath, identifier) {
|
|
2131
|
-
const repoRoot = findRepoRoot(worktreePath);
|
|
2198
|
+
const repoRoot = this.gitRoot ?? resolveMainRepoRoot(worktreePath) ?? findRepoRoot(worktreePath);
|
|
2132
2199
|
if (!repoRoot) {
|
|
2133
2200
|
this.linkDependencies(worktreePath, identifier);
|
|
2134
2201
|
return;
|
|
@@ -2447,12 +2514,12 @@ You are running in an AgentFactory-managed worktree. Follow these rules strictly
|
|
|
2447
2514
|
// Create AbortController for cancellation
|
|
2448
2515
|
const abortController = new AbortController();
|
|
2449
2516
|
this.abortControllers.set(issueId, abortController);
|
|
2450
|
-
// Load environment from settings.local.json
|
|
2517
|
+
// Load environment from settings.local.json and app .env files.
|
|
2518
|
+
// Pass the main repo root so these functions can find gitignored files
|
|
2519
|
+
// (settings.local.json, .env.local) that only exist in the main repo.
|
|
2451
2520
|
const envBaseDir = worktreePath ?? process.cwd();
|
|
2452
|
-
const settingsEnv = loadSettingsEnv(envBaseDir, log);
|
|
2453
|
-
|
|
2454
|
-
// Development work loads .env.local, QA/acceptance loads .env.test.local
|
|
2455
|
-
const appEnv = loadAppEnvFiles(envBaseDir, workType, log);
|
|
2521
|
+
const settingsEnv = loadSettingsEnv(envBaseDir, log, this.gitRoot);
|
|
2522
|
+
const appEnv = loadAppEnvFiles(envBaseDir, workType, log, this.gitRoot);
|
|
2456
2523
|
// Build environment variables - inherit ALL from process.env (required for node to be found)
|
|
2457
2524
|
// Then overlay app env vars, settings.local.json env vars, then our specific vars
|
|
2458
2525
|
const processEnvFiltered = {};
|
|
@@ -4319,13 +4386,12 @@ You are running in an AgentFactory-managed worktree. Follow these rules strictly
|
|
|
4319
4386
|
// Create AbortController for cancellation
|
|
4320
4387
|
const abortController = new AbortController();
|
|
4321
4388
|
this.abortControllers.set(issueId, abortController);
|
|
4322
|
-
// Load environment from settings.local.json
|
|
4389
|
+
// Load environment from settings.local.json and app .env files.
|
|
4390
|
+
// Pass the main repo root so these functions can find gitignored files.
|
|
4323
4391
|
const envBaseDir = worktreePath ?? process.cwd();
|
|
4324
|
-
const settingsEnv = loadSettingsEnv(envBaseDir, log);
|
|
4325
|
-
// Load app-specific env files based on work type
|
|
4326
|
-
// Development work loads .env.local, QA/acceptance loads .env.test.local
|
|
4392
|
+
const settingsEnv = loadSettingsEnv(envBaseDir, log, this.gitRoot);
|
|
4327
4393
|
const effectiveWorkTypeForEnv = workType ?? 'development';
|
|
4328
|
-
const appEnv = loadAppEnvFiles(envBaseDir, effectiveWorkTypeForEnv, log);
|
|
4394
|
+
const appEnv = loadAppEnvFiles(envBaseDir, effectiveWorkTypeForEnv, log, this.gitRoot);
|
|
4329
4395
|
// Build environment variables - inherit ALL from process.env (required for node to be found)
|
|
4330
4396
|
// Then overlay app env vars, settings.local.json env vars, then our specific vars
|
|
4331
4397
|
// Apply the same blocklist as spawnAgent() to prevent API key leakage
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-backstop.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/session-backstop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,OAAO,KAAK,EAEV,cAAc,EACd,kBAAkB,EAClB,0BAA0B,EAC1B,cAAc,EACf,MAAM,2BAA2B,CAAA;AAWlC,gDAAgD;AAChD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,YAAY,CAAA;IACnB,iEAAiE;IACjE,aAAa,EAAE,OAAO,CAAA;IACtB,sDAAsD;IACtD,YAAY,EAAE,OAAO,CAAA;IACrB,2CAA2C;IAC3C,gBAAgB,EAAE,OAAO,CAAA;CAC1B;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,cAAc,GAAG,cAAc,CA8BzE;AAMD,uCAAuC;AACvC,MAAM,WAAW,eAAe;IAC9B,iFAAiF;IACjF,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,qEAAqE;IACrE,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CACzB,GAAG,EAAE,cAAc,EACnB,OAAO,CAAC,EAAE,eAAe,GACxB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"session-backstop.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/session-backstop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,OAAO,KAAK,EAEV,cAAc,EACd,kBAAkB,EAClB,0BAA0B,EAC1B,cAAc,EACf,MAAM,2BAA2B,CAAA;AAWlC,gDAAgD;AAChD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,YAAY,CAAA;IACnB,iEAAiE;IACjE,aAAa,EAAE,OAAO,CAAA;IACtB,sDAAsD;IACtD,YAAY,EAAE,OAAO,CAAA;IACrB,2CAA2C;IAC3C,gBAAgB,EAAE,OAAO,CAAA;CAC1B;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,cAAc,GAAG,cAAc,CA8BzE;AAMD,uCAAuC;AACvC,MAAM,WAAW,eAAe;IAC9B,iFAAiF;IACjF,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,qEAAqE;IACrE,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CACzB,GAAG,EAAE,cAAc,EACnB,OAAO,CAAC,EAAE,eAAe,GACxB,iBAAiB,CA2InB;AAED,oCAAoC;AACpC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CAAA;IACnC,OAAO,EAAE,cAAc,CAAA;IACvB,UAAU,EAAE,0BAA0B,GAAG,IAAI,CAAA;IAC7C,QAAQ,EAAE,cAAc,CAAA;IACxB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;CACjC;AAyUD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,GAAG,IAAI,CA8C9E"}
|
|
@@ -113,6 +113,16 @@ export function runBackstop(ctx, options) {
|
|
|
113
113
|
break;
|
|
114
114
|
}
|
|
115
115
|
case 'branch_pushed': {
|
|
116
|
+
// Only push if there are actually commits ahead of main
|
|
117
|
+
if (!outputs.commitsPresent) {
|
|
118
|
+
actions.push({
|
|
119
|
+
field: 'branch_pushed',
|
|
120
|
+
action: 'skipped — no commits to push',
|
|
121
|
+
success: false,
|
|
122
|
+
detail: 'Branch has no commits ahead of main',
|
|
123
|
+
});
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
116
126
|
if (options?.dryRun) {
|
|
117
127
|
actions.push({ field: 'branch_pushed', action: 'would push branch', success: false, detail: 'dry-run' });
|
|
118
128
|
break;
|
|
@@ -125,7 +135,16 @@ export function runBackstop(ctx, options) {
|
|
|
125
135
|
break;
|
|
126
136
|
}
|
|
127
137
|
case 'pr_url': {
|
|
128
|
-
// Can only create PR if
|
|
138
|
+
// Can only create PR if there are commits AND the branch is pushed
|
|
139
|
+
if (!outputs.commitsPresent) {
|
|
140
|
+
actions.push({
|
|
141
|
+
field: 'pr_url',
|
|
142
|
+
action: 'skipped PR creation — no commits on branch',
|
|
143
|
+
success: false,
|
|
144
|
+
detail: 'No commits ahead of main — nothing to create a PR for',
|
|
145
|
+
});
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
129
148
|
if (!outputs.branchPushed) {
|
|
130
149
|
actions.push({
|
|
131
150
|
field: 'pr_url',
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@renseiai/agentfactory",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.27",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Multi-agent fleet management for coding agents — orchestrator, providers, crash recovery",
|
|
6
6
|
"author": "Rensei AI (https://rensei.ai)",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"@types/node": "^22.5.4",
|
|
58
58
|
"typescript": "^5.7.3",
|
|
59
59
|
"vitest": "^3.2.3",
|
|
60
|
-
"@renseiai/create-agentfactory-app": "0.8.
|
|
60
|
+
"@renseiai/create-agentfactory-app": "0.8.27"
|
|
61
61
|
},
|
|
62
62
|
"scripts": {
|
|
63
63
|
"build": "tsc",
|