foundr-companion 0.1.6 → 0.1.8

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.
@@ -191,6 +191,7 @@ export async function runFleet({ log = console.error, signal, workers = DEFAULT_
191
191
  hostId,
192
192
  mcpUrl,
193
193
  bearer,
194
+ log,
194
195
  deps: {
195
196
  ensureWorktree,
196
197
  stageWorkerCodexConfig: stageCodexConfig,
@@ -219,6 +220,7 @@ export async function runFleet({ log = console.error, signal, workers = DEFAULT_
219
220
  runWorker,
220
221
  seats,
221
222
  signal: ac.signal,
223
+ log,
222
224
  })
223
225
  } finally {
224
226
  process.off?.('SIGINT', stop)
@@ -1,6 +1,6 @@
1
1
  /** Top-level fleet supervisor: register host, then loop polling for assigned
2
2
  * missions and running a worker per mission, bounded by the worker-seat pool. */
3
- export function runSupervisor({ registerHost, heartbeatHost, pollMissions, runWorker, seats, intervalMs, signal }: {
3
+ export function runSupervisor({ registerHost, heartbeatHost, pollMissions, runWorker, seats, intervalMs, signal, log }: {
4
4
  registerHost: any;
5
5
  heartbeatHost: any;
6
6
  pollMissions: any;
@@ -8,5 +8,6 @@ export function runSupervisor({ registerHost, heartbeatHost, pollMissions, runWo
8
8
  seats: any;
9
9
  intervalMs?: number | undefined;
10
10
  signal: any;
11
+ log?: (() => void) | undefined;
11
12
  }): Promise<void>;
12
13
  //# sourceMappingURL=supervisor.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"supervisor.d.mts","sourceRoot":"","sources":["../../../src/bridge/fleet/supervisor.mjs"],"names":[],"mappings":"AAOA;kFACkF;AAClF;;;;;;;;kBAgBC"}
1
+ {"version":3,"file":"supervisor.d.mts","sourceRoot":"","sources":["../../../src/bridge/fleet/supervisor.mjs"],"names":[],"mappings":"AAOA;kFACkF;AAClF;;;;;;;;;kBAuBC"}
@@ -7,18 +7,25 @@ const sleep = (ms, signal) => new Promise((resolve) => {
7
7
 
8
8
  /** Top-level fleet supervisor: register host, then loop polling for assigned
9
9
  * missions and running a worker per mission, bounded by the worker-seat pool. */
10
- export async function runSupervisor({ registerHost, heartbeatHost, pollMissions, runWorker, seats, intervalMs = 5000, signal }) {
10
+ export async function runSupervisor({ registerHost, heartbeatHost, pollMissions, runWorker, seats, intervalMs = 5000, signal, log = () => {} }) {
11
11
  const host = await registerHost()
12
12
  const pool = new SeatPool(seats)
13
+ const inFlight = new Set()
13
14
  while (!signal?.aborted) {
14
15
  await heartbeatHost?.(host.id).catch?.(() => {})
15
- const missions = await pollMissions(host.id).catch(() => [])
16
+ const missions = await pollMissions(host.id).catch((e) => {
17
+ log(`poll failed: ${e instanceof Error ? e.message : String(e)}`)
18
+ return []
19
+ })
16
20
  for (const mission of missions) {
21
+ if (inFlight.has(mission.id)) continue // already being worked this round
17
22
  const seat = pool.acquire(mission.id)
18
23
  if (!seat) break // no free seats this round
24
+ inFlight.add(mission.id)
25
+ log(`picked up mission ${mission.id} (slot ${seat})`)
19
26
  void Promise.resolve(runWorker({ mission, hostId: host.id, seat }))
20
- .catch(() => {})
21
- .finally(() => pool.release(seat))
27
+ .catch((e) => log(`worker error on ${mission.id}: ${e instanceof Error ? e.message : String(e)}`))
28
+ .finally(() => { pool.release(seat); inFlight.delete(mission.id) })
22
29
  }
23
30
  if (signal?.aborted) break
24
31
  await sleep(intervalMs, signal)
@@ -1 +1 @@
1
- {"version":3,"file":"supervisor.mjs","sourceRoot":"","sources":["../../../src/bridge/fleet/supervisor.mjs"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAE5C,MAAM,KAAK,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;;IACpD,MAAM,CAAC,GAAG,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;IACjC,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,gBAAgB,uDAAG,OAAO,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAA,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;AAC3F,CAAC,CAAC,CAAA;AAEF;kFACkF;AAClF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,EAAE,MAAM,EAAE;;IAC5H,MAAM,IAAI,GAAG,MAAM,YAAY,EAAE,CAAA;IACjC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAA;IAChC,OAAO,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,CAAA,EAAE,CAAC;QACxB,MAAM,CAAA,MAAA,aAAa,aAAb,aAAa,6BAAb,aAAa,CAAG,IAAI,CAAC,EAAE,GAAE,KAAK,mDAAG,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA,CAAA;QAChD,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAA;QAC5D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;YACrC,IAAI,CAAC,IAAI;gBAAE,MAAK,CAAC,2BAA2B;YAC5C,KAAK,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;iBAChE,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;iBACf,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;QACtC,CAAC;QACD,IAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO;YAAE,MAAK;QAC1B,MAAM,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;IACjC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"supervisor.mjs","sourceRoot":"","sources":["../../../src/bridge/fleet/supervisor.mjs"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAE5C,MAAM,KAAK,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;;IACpD,MAAM,CAAC,GAAG,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;IACjC,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,gBAAgB,uDAAG,OAAO,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAA,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;AAC3F,CAAC,CAAC,CAAA;AAEF;kFACkF;AAClF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,GAAG,GAAG,EAAE,GAAE,CAAC,EAAE;;IAC5I,MAAM,IAAI,GAAG,MAAM,YAAY,EAAE,CAAA;IACjC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAA;IAChC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAA;IAC1B,OAAO,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,CAAA,EAAE,CAAC;QACxB,MAAM,CAAA,MAAA,aAAa,aAAb,aAAa,6BAAb,aAAa,CAAG,IAAI,CAAC,EAAE,GAAE,KAAK,mDAAG,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA,CAAA;QAChD,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;YACvD,GAAG,CAAC,gBAAgB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YACjE,OAAO,EAAE,CAAA;QACX,CAAC,CAAC,CAAA;QACF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAAE,SAAQ,CAAC,kCAAkC;YACzE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;YACrC,IAAI,CAAC,IAAI;gBAAE,MAAK,CAAC,2BAA2B;YAC5C,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;YACxB,GAAG,CAAC,qBAAqB,OAAO,CAAC,EAAE,UAAU,IAAI,GAAG,CAAC,CAAA;YACrD,KAAK,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;iBAChE,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,mBAAmB,OAAO,CAAC,EAAE,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;iBACjG,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;QACvE,CAAC;QACD,IAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO;YAAE,MAAK;QAC1B,MAAM,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;IACjC,CAAC;AACH,CAAC"}
@@ -2,12 +2,13 @@
2
2
  * orchestration is unit-tested without real Codex/git/MCP. Model 1: the worker
3
3
  * codex self-surfaces done/blocked via its staged Foundr MCP; we backstop
4
4
  * `failed` on crash/budget (and `done` on a clean finish). */
5
- export function runMissionWorker({ mission, hostId, mcpUrl, bearer, leaseSeconds, deps }: {
5
+ export function runMissionWorker({ mission, hostId, mcpUrl, bearer, leaseSeconds, deps, log }: {
6
6
  mission: any;
7
7
  hostId: any;
8
8
  mcpUrl: any;
9
9
  bearer: any;
10
10
  leaseSeconds?: number | undefined;
11
11
  deps: any;
12
+ log?: (() => void) | undefined;
12
13
  }): Promise<void>;
13
14
  //# sourceMappingURL=worker.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"worker.d.mts","sourceRoot":"","sources":["../../../src/bridge/fleet/worker.mjs"],"names":[],"mappings":"AAAA;;;+DAG+D;AAC/D;;;;;;;kBA6BC"}
1
+ {"version":3,"file":"worker.d.mts","sourceRoot":"","sources":["../../../src/bridge/fleet/worker.mjs"],"names":[],"mappings":"AAAA;;;+DAG+D;AAC/D;;;;;;;;kBAyCC"}
@@ -2,17 +2,25 @@
2
2
  * orchestration is unit-tested without real Codex/git/MCP. Model 1: the worker
3
3
  * codex self-surfaces done/blocked via its staged Foundr MCP; we backstop
4
4
  * `failed` on crash/budget (and `done` on a clean finish). */
5
- export async function runMissionWorker({ mission, hostId, mcpUrl, bearer, leaseSeconds = 1800, deps }) {
5
+ export async function runMissionWorker({ mission, hostId, mcpUrl, bearer, leaseSeconds = 1800, deps, log = () => {} }) {
6
6
  const { ensureWorktree, stageWorkerCodexConfig, claimMission, surfaceMission, makeAdapter, makeBudget } = deps
7
- const surface = (state, payload = {}) => surfaceMission({ missionId: mission.id, state, payload }).catch(() => {})
7
+ const surface = (state, payload = {}) =>
8
+ surfaceMission({ missionId: mission.id, state, payload })
9
+ .catch((e) => log(`mission ${mission.id}: surface ${state} failed: ${e instanceof Error ? e.message : String(e)}`))
8
10
 
9
- const worktreePath = await ensureWorktree({ repoPath: mission.repo, branch: mission.worktree_branch })
10
- const codexHome = await stageWorkerCodexConfig({ worktreePath, mcpUrl, bearer })
11
- await claimMission({ missionId: mission.id, hostId, repo: mission.repo, worktreeBranch: mission.worktree_branch, leaseSeconds })
12
-
13
- const budget = makeBudget()
14
- const adapter = makeAdapter({ cwd: worktreePath, codexHome })
11
+ // EVERYTHING is inside the try a worktree/config/claim failure must surface
12
+ // `failed` (so the mission leaves the 'planned' poll instead of retrying
13
+ // forever) and be logged, not propagate silently to the supervisor's catch.
14
+ let adapter
15
15
  try {
16
+ log(`mission ${mission.id}: ${mission.repo} @ ${mission.worktree_branch} — making worktree`)
17
+ const worktreePath = await ensureWorktree({ repo: mission.repo, branch: mission.worktree_branch })
18
+ const codexHome = await stageWorkerCodexConfig({ worktreePath, mcpUrl, bearer })
19
+ await claimMission({ missionId: mission.id, hostId, repo: mission.repo, worktreeBranch: mission.worktree_branch, leaseSeconds })
20
+ log(`mission ${mission.id}: claimed, starting codex in ${worktreePath}`)
21
+
22
+ const budget = makeBudget()
23
+ adapter = makeAdapter({ cwd: worktreePath, codexHome })
16
24
  await adapter.start()
17
25
  const envelope = { message: { body: mission.brief ?? mission.title ?? '' }, mission: { id: mission.id } }
18
26
  let budgetTripped = false
@@ -22,13 +30,17 @@ export async function runMissionWorker({ mission, hostId, mcpUrl, bearer, leaseS
22
30
  },
23
31
  })
24
32
  if (budgetTripped || budget.exceeded()) {
33
+ log(`mission ${mission.id}: budget exceeded`)
25
34
  await surface('failed', { reason: 'budget', detail: 'mission budget exceeded' })
26
35
  } else {
36
+ log(`mission ${mission.id}: completed`)
27
37
  await surface('done', { result: result?.text ?? '' })
28
38
  }
29
39
  } catch (error) {
30
- await surface('failed', { error: error instanceof Error ? error.message : String(error) })
40
+ const msg = error instanceof Error ? error.message : String(error)
41
+ log(`mission ${mission.id}: FAILED — ${msg}`)
42
+ await surface('failed', { error: msg })
31
43
  } finally {
32
- adapter.close?.()
44
+ adapter?.close?.()
33
45
  }
34
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"worker.mjs","sourceRoot":"","sources":["../../../src/bridge/fleet/worker.mjs"],"names":[],"mappings":"AAAA;;;+DAG+D;AAC/D,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,EAAE,IAAI,EAAE;;IACnG,MAAM,EAAE,cAAc,EAAE,sBAAsB,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,IAAI,CAAA;IAC9G,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IAElH,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC,CAAA;IACtG,MAAM,SAAS,GAAG,MAAM,sBAAsB,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IAChF,MAAM,YAAY,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,eAAe,EAAE,YAAY,EAAE,CAAC,CAAA;IAEhI,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAA;IAC7D,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;QACrB,MAAM,QAAQ,GAAG,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAA,MAAA,OAAO,CAAC,KAAK,mCAAI,OAAO,CAAC,KAAK,mCAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,CAAA;QACzG,IAAI,aAAa,GAAG,KAAK,CAAA;QACzB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE;YAC3C,UAAU,EAAE,GAAG,EAAE;;gBACf,IAAI,CAAC,aAAa,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;oBAAC,aAAa,GAAG,IAAI,CAAC;oBAAC,MAAA,OAAO,CAAC,SAAS,uDAAI,CAAA;gBAAC,CAAC;YACtF,CAAC;SACF,CAAC,CAAA;QACF,IAAI,aAAa,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;YACvC,MAAM,OAAO,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC,CAAA;QAClF,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,IAAI,mCAAI,EAAE,EAAE,CAAC,CAAA;QACvD,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAC5F,CAAC;YAAS,CAAC;QACT,MAAA,OAAO,CAAC,KAAK,uDAAI,CAAA;IACnB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"worker.mjs","sourceRoot":"","sources":["../../../src/bridge/fleet/worker.mjs"],"names":[],"mappings":"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"}
@@ -1,14 +1,34 @@
1
- /** Ensure a git worktree for `branch` exists off `repoPath`; returns its path.
2
- * Idempotent: re-calling returns the existing path. Creates the branch off
3
- * baseRef if it doesn't exist. */
4
- export function ensureWorktree({ repoPath, branch, baseRef }: {
5
- repoPath: any;
1
+ /** Resolve a mission "repo" into { owner, name, cloneUrl }.
2
+ * - "owner/name" -> github https clone url
3
+ * - "https://github.com/owner/name" -> github https clone url
4
+ * - "git@github.com:owner/name(.git)" -> github https clone url
5
+ * - a local path / file:// / other git URL -> used verbatim as cloneUrl,
6
+ * owner/name derived from the basename (for flexibility + offline tests).
7
+ * Throws on empty/garbage. */
8
+ export function parseRepo(repo: any): {
9
+ owner: any;
10
+ name: any;
11
+ cloneUrl: string;
12
+ };
13
+ /** Ensure a local clone of the repo exists (cached under ~/.foundr-world/repos).
14
+ * Fresh clone if absent, otherwise best-effort fetch. Returns the clone path. */
15
+ export function ensureClone({ owner, name, cloneUrl }: {
16
+ owner: any;
17
+ name: any;
18
+ cloneUrl: any;
19
+ }): Promise<string>;
20
+ /** Ensure a git worktree for `branch` exists off the (cloned) repo; returns its
21
+ * path. Idempotent: re-calling returns the existing path. If `branch` exists
22
+ * locally or as origin/<branch>, it is checked out; otherwise a new branch is
23
+ * created off the repo's default branch (or baseRef when given). */
24
+ export function ensureWorktree({ repo, branch, baseRef }: {
25
+ repo: any;
6
26
  branch: any;
7
- baseRef?: string | undefined;
27
+ baseRef: any;
8
28
  }): Promise<string>;
9
- /** Remove a worktree (and prune the admin entry). */
10
- export function removeWorktree({ repoPath, worktreePath }: {
11
- repoPath: any;
29
+ /** Remove a worktree (and prune the admin entry). Best-effort. */
30
+ export function removeWorktree({ repo, worktreePath }: {
31
+ repo: any;
12
32
  worktreePath: any;
13
33
  }): Promise<void>;
14
34
  //# sourceMappingURL=worktree.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"worktree.d.mts","sourceRoot":"","sources":["../../../src/bridge/fleet/worktree.mjs"],"names":[],"mappings":"AAUA;;mCAEmC;AACnC;;;;oBAYC;AAED,qDAAqD;AACrD;;;kBAGC"}
1
+ {"version":3,"file":"worktree.d.mts","sourceRoot":"","sources":["../../../src/bridge/fleet/worktree.mjs"],"names":[],"mappings":"AAaA;;;;;;+BAM+B;AAC/B;;;;EAwCC;AAED;kFACkF;AAClF;;;;oBAUC;AAgBD;;;qEAGqE;AACrE;;;;oBAqBC;AAED,kEAAkE;AAClE;;;kBAQC"}
@@ -2,31 +2,126 @@ import { execFile } from 'node:child_process'
2
2
  import { promisify } from 'node:util'
3
3
  import os from 'node:os'
4
4
  import path from 'node:path'
5
+ import fs from 'node:fs/promises'
5
6
  const run = promisify(execFile)
6
7
 
7
- const FLEET_ROOT = () => path.join(os.homedir(), '.foundr-world', 'worktrees')
8
+ const ROOT = () => path.join(os.homedir(), '.foundr-world')
9
+ const REPOS_ROOT = () => path.join(ROOT(), 'repos')
10
+ const WORKTREES_ROOT = () => path.join(ROOT(), 'worktrees')
8
11
 
9
- function sanitize(branch) { return branch.replace(/[^a-zA-Z0-9._-]+/g, '-') }
12
+ function sanitize(s) { return String(s).replace(/[^A-Za-z0-9._-]+/g, '-') }
10
13
 
11
- /** Ensure a git worktree for `branch` exists off `repoPath`; returns its path.
12
- * Idempotent: re-calling returns the existing path. Creates the branch off
13
- * baseRef if it doesn't exist. */
14
- export async function ensureWorktree({ repoPath, branch, baseRef = 'HEAD' }) {
15
- const dir = path.join(FLEET_ROOT(), path.basename(repoPath), sanitize(branch))
16
- // Already registered?
17
- const { stdout } = await run('git', ['-C', repoPath, 'worktree', 'list', '--porcelain'])
18
- if (stdout.includes(`worktree ${dir}\n`)) return dir
19
- const branchExists = await run('git', ['-C', repoPath, 'rev-parse', '--verify', '--quiet', branch])
14
+ /** Resolve a mission "repo" into { owner, name, cloneUrl }.
15
+ * - "owner/name" -> github https clone url
16
+ * - "https://github.com/owner/name" -> github https clone url
17
+ * - "git@github.com:owner/name(.git)" -> github https clone url
18
+ * - a local path / file:// / other git URL -> used verbatim as cloneUrl,
19
+ * owner/name derived from the basename (for flexibility + offline tests).
20
+ * Throws on empty/garbage. */
21
+ export function parseRepo(repo) {
22
+ if (typeof repo !== 'string') throw new Error(`invalid repo: ${repo}`)
23
+ const raw = repo.trim()
24
+ if (!raw) throw new Error('empty repo')
25
+
26
+ const stripGit = (s) => s.replace(/\.git$/, '')
27
+
28
+ // git@github.com:owner/name(.git)
29
+ const ssh = raw.match(/^git@github\.com:([^/]+)\/([^/]+?)(?:\.git)?$/i)
30
+ if (ssh) {
31
+ const owner = ssh[1]
32
+ const name = ssh[2]
33
+ return { owner, name, cloneUrl: `https://github.com/${owner}/${name}.git` }
34
+ }
35
+
36
+ // https://github.com/owner/name(.git)
37
+ const https = raw.match(/^https?:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?\/?$/i)
38
+ if (https) {
39
+ const owner = https[1]
40
+ const name = https[2]
41
+ return { owner, name, cloneUrl: `https://github.com/${owner}/${name}.git` }
42
+ }
43
+
44
+ // owner/name shorthand (no scheme, no extra slashes, not a local path)
45
+ const shorthand = raw.match(/^([A-Za-z0-9._-]+)\/([A-Za-z0-9._-]+)$/)
46
+ if (shorthand && !raw.startsWith('.') && !raw.startsWith('~')) {
47
+ const owner = shorthand[1]
48
+ const name = stripGit(shorthand[2])
49
+ return { owner, name, cloneUrl: `https://github.com/${owner}/${name}.git` }
50
+ }
51
+
52
+ // Fallback: a local filesystem path, file:// URL, or some other git URL.
53
+ // Use it verbatim as the clone source; derive owner/name from the basename.
54
+ const cloneUrl = raw
55
+ const withoutScheme = raw.replace(/^[a-z][a-z0-9+.-]*:\/\//i, '')
56
+ const segments = stripGit(withoutScheme).split('/').filter(Boolean)
57
+ const name = segments[segments.length - 1]
58
+ const owner = segments.length >= 2 ? segments[segments.length - 2] : 'local'
59
+ if (!name) throw new Error(`invalid repo: ${repo}`)
60
+ return { owner, name, cloneUrl }
61
+ }
62
+
63
+ /** Ensure a local clone of the repo exists (cached under ~/.foundr-world/repos).
64
+ * Fresh clone if absent, otherwise best-effort fetch. Returns the clone path. */
65
+ export async function ensureClone({ owner, name, cloneUrl }) {
66
+ const clonePath = path.join(REPOS_ROOT(), sanitize(owner), sanitize(name))
67
+ const hasGit = await fs.stat(path.join(clonePath, '.git')).then(() => true).catch(() => false)
68
+ if (!hasGit) {
69
+ await fs.mkdir(path.dirname(clonePath), { recursive: true })
70
+ await run('git', ['clone', cloneUrl, clonePath])
71
+ } else {
72
+ await run('git', ['-C', clonePath, 'fetch', '--all', '--prune']).catch(() => {})
73
+ }
74
+ return clonePath
75
+ }
76
+
77
+ /** Resolve the repo's default branch ref to base a new branch on. */
78
+ async function defaultBaseRef(clonePath) {
79
+ const head = await run('git', ['-C', clonePath, 'symbolic-ref', '--quiet', 'refs/remotes/origin/HEAD'])
80
+ .then((r) => r.stdout.trim().replace(/^refs\/remotes\//, ''))
81
+ .catch(() => '')
82
+ if (head) return head
83
+ for (const ref of ['origin/main', 'origin/master']) {
84
+ const ok = await run('git', ['-C', clonePath, 'rev-parse', '--verify', '--quiet', ref])
85
+ .then(() => true).catch(() => false)
86
+ if (ok) return ref
87
+ }
88
+ return 'HEAD'
89
+ }
90
+
91
+ /** Ensure a git worktree for `branch` exists off the (cloned) repo; returns its
92
+ * path. Idempotent: re-calling returns the existing path. If `branch` exists
93
+ * locally or as origin/<branch>, it is checked out; otherwise a new branch is
94
+ * created off the repo's default branch (or baseRef when given). */
95
+ export async function ensureWorktree({ repo, branch, baseRef }) {
96
+ const { owner, name, cloneUrl } = parseRepo(repo)
97
+ const clonePath = await ensureClone({ owner, name, cloneUrl })
98
+ const wtDir = path.join(WORKTREES_ROOT(), sanitize(owner), sanitize(name), sanitize(branch))
99
+
100
+ // Already registered as a worktree?
101
+ const { stdout } = await run('git', ['-C', clonePath, 'worktree', 'list', '--porcelain'])
102
+ if (stdout.includes(`worktree ${wtDir}\n`)) return wtDir
103
+
104
+ const localExists = await run('git', ['-C', clonePath, 'rev-parse', '--verify', '--quiet', branch])
105
+ .then(() => true).catch(() => false)
106
+ const remoteExists = await run('git', ['-C', clonePath, 'rev-parse', '--verify', '--quiet', `origin/${branch}`])
20
107
  .then(() => true).catch(() => false)
21
- const args = branchExists
22
- ? ['-C', repoPath, 'worktree', 'add', dir, branch]
23
- : ['-C', repoPath, 'worktree', 'add', '-b', branch, dir, baseRef]
24
- await run('git', args)
25
- return dir
108
+
109
+ if (localExists || remoteExists) {
110
+ await run('git', ['-C', clonePath, 'worktree', 'add', wtDir, branch])
111
+ } else {
112
+ const base = baseRef ?? (await defaultBaseRef(clonePath))
113
+ await run('git', ['-C', clonePath, 'worktree', 'add', '-b', branch, wtDir, base])
114
+ }
115
+ return wtDir
26
116
  }
27
117
 
28
- /** Remove a worktree (and prune the admin entry). */
29
- export async function removeWorktree({ repoPath, worktreePath }) {
30
- await run('git', ['-C', repoPath, 'worktree', 'remove', '--force', worktreePath]).catch(() => {})
31
- await run('git', ['-C', repoPath, 'worktree', 'prune']).catch(() => {})
118
+ /** Remove a worktree (and prune the admin entry). Best-effort. */
119
+ export async function removeWorktree({ repo, worktreePath }) {
120
+ const { owner, name, cloneUrl } = parseRepo(repo)
121
+ const clonePath = path.join(REPOS_ROOT(), sanitize(owner), sanitize(name))
122
+ // clonePath derivation doesn't need the network; cloneUrl is unused here but
123
+ // parseRepo validates `repo` and yields the owner/name we key the cache on.
124
+ void cloneUrl
125
+ await run('git', ['-C', clonePath, 'worktree', 'remove', '--force', worktreePath]).catch(() => {})
126
+ await run('git', ['-C', clonePath, 'worktree', 'prune']).catch(() => {})
32
127
  }
@@ -1 +1 @@
1
- {"version":3,"file":"worktree.mjs","sourceRoot":"","sources":["../../../src/bridge/fleet/worktree.mjs"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAA;AAE/B,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,WAAW,CAAC,CAAA;AAE9E,SAAS,QAAQ,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAA,CAAC,CAAC;AAE7E;;mCAEmC;AACnC,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE;IACzE,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;IAC9E,sBAAsB;IACtB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,CAAA;IACxF,IAAI,MAAM,CAAC,QAAQ,CAAC,YAAY,GAAG,IAAI,CAAC;QAAE,OAAO,GAAG,CAAA;IACpD,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;SAChG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAA;IACtC,MAAM,IAAI,GAAG,YAAY;QACvB,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC;QAClD,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,CAAA;IACnE,MAAM,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IACtB,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,qDAAqD;AACrD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE;IAC7D,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IACjG,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;AACzE,CAAC"}
1
+ {"version":3,"file":"worktree.mjs","sourceRoot":"","sources":["../../../src/bridge/fleet/worktree.mjs"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "foundr-companion",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"