feat(cli)!: dsh boots profiles; plugin subcommand manages them via pnpm
dsh --profile <name> replaces the fixed entry modes: --config and -p are removed, --patch adds overlays over the composed profile, a positional task selects one-shot mode (requires the headless-runner row), and dsh web stays as the alias for --profile web carrying the Web flag family as patches. dsh plugin --profile <name> forwards verbatim to pnpm in the profile directory, initializes on first use, and reconciles the dsh.plugins layer list after add/remove (patch-less packages warn and stay plain dependencies). Config dumps and the keyless web e2e scaffold compose the same bundle layers over the same empty root as the boot.
This commit is contained in:
@@ -15,7 +15,6 @@ import { Context } from 'cordis'
|
||||
import Loader from '@cordisjs/plugin-loader'
|
||||
import Include from '@cordisjs/plugin-include'
|
||||
import HttpServer from '@deepseek-ai/dsh-host-webserver'
|
||||
import InvariantService, { type InvariantError } from '@deepseek-ai/dsh-invariants'
|
||||
import * as FrontendStatic from '../src/index.ts'
|
||||
|
||||
let root: string | undefined
|
||||
@@ -126,46 +125,3 @@ describe('real Loader composition', () => {
|
||||
expect(() => server.registerFallback(() => {})).not.toThrow()
|
||||
})
|
||||
})
|
||||
|
||||
describe('invariant companion', () => {
|
||||
const OWN_FIBER = { entry: { options: { name: '@deepseek-ai/dsh-frontend-static' } } }
|
||||
|
||||
// The vitest-wide invariant host (scripts/test-invariants.ts) mounts this
|
||||
// package's companion automatically when the service is plugged.
|
||||
async function setup(): Promise<Context> {
|
||||
const ctx = new Context()
|
||||
await ctx.plugin(InvariantService)
|
||||
return ctx
|
||||
}
|
||||
|
||||
it('passes on a clean seat release, skips foreign rows, and reports a leaked seat', async () => {
|
||||
const ctx = await setup()
|
||||
let fallback: unknown
|
||||
ctx.provide('httpServer', {
|
||||
registerFallback: (handler: unknown) => {
|
||||
if (fallback !== undefined) throw new Error('webserver: fallback already registered')
|
||||
fallback = handler
|
||||
return () => { fallback = undefined }
|
||||
},
|
||||
} as never)
|
||||
|
||||
// A teardown of this package's own row with the seat released: no violation.
|
||||
expect(() => { ctx.emit('internal/plugin', OWN_FIBER as never) }).not.toThrow()
|
||||
// Foreign-row teardowns are not audited (a live legitimate owner would false-positive).
|
||||
fallback = () => {}
|
||||
expect(() => { ctx.emit('internal/plugin', { entry: { options: { name: 'other-package' } } } as never) }).not.toThrow()
|
||||
// A leaked seat on our own teardown (disposer never ran): the probe cannot claim twice → violation.
|
||||
expect(() => { ctx.emit('internal/plugin', OWN_FIBER as never) })
|
||||
.toThrow(expect.objectContaining<Partial<InvariantError>>({
|
||||
code: 'INVARIANT',
|
||||
packageName: '@deepseek-ai/dsh-frontend-static',
|
||||
}))
|
||||
await ctx.fiber.dispose()
|
||||
})
|
||||
|
||||
it('skips the audit when the webserver went down with the row', async () => {
|
||||
const ctx = await setup()
|
||||
expect(() => { ctx.emit('internal/plugin', OWN_FIBER as never) }).not.toThrow()
|
||||
await ctx.fiber.dispose()
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user