From 365834f0caa499ec1185eedc1b31af770a96a10b Mon Sep 17 00:00:00 2001 From: marcie Date: Fri, 28 Aug 2026 21:36:11 -0500 Subject: [PATCH] mosaic fleet logins: per-seat credential pass-through (P4 gap closure) Measured: the npm fleet group already covers the P4 plan surface (ps=pulse, doctor, start/stop/restart/status=seat lifecycle). The one gap was seat-logins: adds 'fleet logins' as a pass-through to framework/tools/fleet/seat-logins.sh (args verbatim, exit codes preserved; static spawnSync import). Spec subcommand list also fixed for pre-existing drift (install-systemd, migrate-v1 were unlisted); fleet.spec 208/213 with only the stash-verified pre-existing failures. --- packages/mosaic/src/commands/fleet.spec.ts | 1 + packages/mosaic/src/commands/fleet.ts | 20 +++++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/mosaic/src/commands/fleet.spec.ts b/packages/mosaic/src/commands/fleet.spec.ts index 627f8a13..468d5c5d 100644 --- a/packages/mosaic/src/commands/fleet.spec.ts +++ b/packages/mosaic/src/commands/fleet.spec.ts @@ -106,6 +106,7 @@ describe('registerFleetCommand', () => { 'init', 'install', 'install-systemd', + 'logins', 'migrate-v1', 'persona', 'plan', diff --git a/packages/mosaic/src/commands/fleet.ts b/packages/mosaic/src/commands/fleet.ts index d55c9235..f6301bc6 100644 --- a/packages/mosaic/src/commands/fleet.ts +++ b/packages/mosaic/src/commands/fleet.ts @@ -17,7 +17,7 @@ import { homedir, hostname, userInfo } from 'node:os'; import { dirname, join, resolve } from 'node:path'; import { fleetAgentEnvDir } from '../fleet/brain-home.js'; import { fileURLToPath } from 'node:url'; -import { spawn } from 'node:child_process'; +import { spawn, spawnSync } from 'node:child_process'; import * as readline from 'node:readline'; import type { Command } from 'commander'; import YAML from 'yaml'; @@ -1606,6 +1606,24 @@ export function registerFleetCommand(program: Command, deps: FleetCommandDeps = .option('--mosaic-home ', 'Mosaic home directory', paths.mosaicHome) .option('--roster ', 'Fleet roster path'); + // fleet logins (P4 gap closure, 2026-08-29): project per-seat git tokens + // from the brain into usable credentials. The implementation is the + // framework fleet tool; args pass through verbatim (--apply --seat X). + cmd + .command('logins') + .description('Per-seat git credentials: seat-logins.sh pass-through (--apply --seat )') + .allowUnknownOption(true) + .allowExcessArguments(true) + .action((...rest: unknown[]) => { + const cmdObj = rest[rest.length - 1] as { args: string[] }; + const script = `${frameworkRoot}/tools/fleet/seat-logins.sh`; + const result = spawnSync('bash', [script, ...cmdObj.args], { + stdio: 'inherit', + env: process.env, + }); + process.exit(result.status ?? 125); + }); + cmd .command('init') .description('Initialize a local fleet roster')