3.8 KiB
T3 report: mosaic fleet agent new
Changed
- Added
packages/mosaic/src/fleet/fleet-agent-scaffold.ts.- Creates user-owned seats at
~/.mosaic/fleet/agents/<name>(test seam:fleetDataHome, environment default:MOSAIC_DATA_HOME). - Writes schema-one
profile.jsonwith defaultharness: "claude",bundle: "primary", optionalmodel,overlay: "overlay.json", and mandatoryenv.MOSAIC_AGENT_NAME. - Writes a positive
SOUL.mdidentity and materializes that identity in.claude/CLAUDE.mdor.pi/AGENTS.md. - Writes
overlay.jsonas{}. Claude homes get.claude.jsonwithhasCompletedOnboarding: trueandtheme: "dark". No settings file is composed. - Creates the appropriate credential symlink (
.credentials.jsonfor Claude,auth.jsonfor Pi), allowing an intentional dangling destination and reporting it at the command surface. - Compares every existing object (including link targets as link text), succeeds only byte-identically, and otherwise refuses with the differing paths.
- Creates user-owned seats at
- Added
packages/mosaic/src/commands/fleet-agent-scaffold-command.tsand wiredfleet agent new <name> [--harness claude|pi] [--bundle B] [--model M]inpackages/mosaic/src/commands/fleet.ts. - Added
packages/mosaic/src/commands/fleet-agent-scaffold-command.spec.tswith temp-root-only coverage: exact Claude/Pi layouts, literal quote/backtick/$( )handling, unsafe names and option failures, idempotence, changed-file refusal, and credential-link comparison.
Reconciliation
fleet-agent-crud-command.ts currently registers roster-v2 get/create/update/delete/plan directly under mosaic fleet; it has no agent new command or profile schema. T3 adds an agent namespace for the profile-owned user-data scaffold and leaves roster-v2 CRUD unchanged.
No roster projection is created. Current roster-v2 requires fields that cannot be derived from the new profile (class, provider, working directory, reasoning, tool policy, lifecycle), while no current mosaic fleet launch <name> consumes these profiles. Writing such a roster entry would create the forbidden second registry and invent semantics. The profile is therefore the sole state created here. When the launcher owns profile-to-roster projection, it must derive it there and emit the required actionable unscaffolded-name message.
Validation
$ pnpm install --frozen-lockfile
Done in 4.1s using pnpm v10.6.2
$ pnpm --filter @mosaicstack/mosaic exec vitest run src/commands/fleet-agent-scaffold-command.spec.ts
✓ src/commands/fleet-agent-scaffold-command.spec.ts (13 tests) 28ms
Test Files 1 passed (1)
Tests 13 passed (13)
$ pnpm --filter @mosaicstack/mosaic exec eslint src/fleet/fleet-agent-scaffold.ts src/commands/fleet-agent-scaffold-command.ts src/commands/fleet-agent-scaffold-command.spec.ts src/commands/fleet.ts
(exit 0)
$ pnpm exec prettier --check packages/mosaic/src/fleet/fleet-agent-scaffold.ts packages/mosaic/src/commands/fleet-agent-scaffold-command.ts packages/mosaic/src/commands/fleet-agent-scaffold-command.spec.ts packages/mosaic/src/commands/fleet.ts
All matched files use Prettier code style!
$ git diff --check
(exit 0)
pnpm --filter @mosaicstack/mosaic typecheck remains blocked by pre-existing unresolved workspace package entries (@mosaicstack/brain, @mosaicstack/db, @mosaicstack/types, and others). The typecheck output had no diagnostics naming T3 files. Running the pre-existing CRUD command spec is blocked by the same @mosaicstack/db Vite resolution failure through fleet-backlog.ts.
Skipped ambiguity
The design asks for a generated harness-home settings.json as part of an earlier generic home-template description, but the task explicitly says composed settings are left to launch. T3 creates no settings.json; launch composition remains the owner.