feat(fleet): native Mosaic backlog on @mosaicstack/db (atomic claim + TTL)
Add Mosaic's own backlog-of-record on the existing Postgres storage layer, replacing the former Hermes adapter (no Hermes dependency) and the earlier sqlite idea (no sqlite, no new client). - packages/db: `backlog` table (drizzle) + enum + migration 0011; BacklogService taking a Db handle so it runs on both createDb (server PG) and createPgliteDb (embedded). Atomic claim via SELECT ... FOR UPDATE SKIP LOCKED inside one tx, TTL claims + reclaim of expired, deps DAG gate, idempotency-key dedup, stats. - packages/mosaic: `mosaic fleet backlog <sub> --json` (create/list/claim/ reclaim/link/stats/block/complete). Embedded PGlite default at <mosaicHome>/fleet/backlog; full Postgres via DATABASE_URL — same code. Migrations run on first use. - install.sh: preserve fleet/backlog across `mosaic update`. - docs/fleet/backlog-conventions.md: schema, phase convention, atomic-claim + TTL semantics, PGlite-default/Postgres-by-config, Mosaic-native (no Hermes). - Tests (in-memory PGlite, real PG semantics): create/list, exactly-one-winner concurrency (and N-card no-double-claim), deps gate, reclaim of expired, stats. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -78,6 +78,7 @@ describe('registerFleetCommand', () => {
|
||||
expect(fleet).toBeDefined();
|
||||
expect(fleet!.commands.map((command) => command.name()).sort()).toEqual([
|
||||
'add',
|
||||
'backlog',
|
||||
'init',
|
||||
'install',
|
||||
'install-systemd',
|
||||
@@ -91,6 +92,24 @@ describe('registerFleetCommand', () => {
|
||||
]);
|
||||
});
|
||||
|
||||
it('registers the backlog subcommand with its operations', () => {
|
||||
const program = buildProgram();
|
||||
const fleet = program.commands.find((command) => command.name() === 'fleet');
|
||||
const backlog = fleet!.commands.find((command) => command.name() === 'backlog');
|
||||
|
||||
expect(backlog).toBeDefined();
|
||||
expect(backlog!.commands.map((command) => command.name()).sort()).toEqual([
|
||||
'block',
|
||||
'claim',
|
||||
'complete',
|
||||
'create',
|
||||
'link',
|
||||
'list',
|
||||
'reclaim',
|
||||
'stats',
|
||||
]);
|
||||
});
|
||||
|
||||
it('adds fleet-backed agent subcommands without removing existing options', () => {
|
||||
const program = buildProgram();
|
||||
const agent = program.commands.find((command) => command.name() === 'agent');
|
||||
|
||||
Reference in New Issue
Block a user