diff --git a/apps/cli/src/dump-config-schema.ts b/apps/cli/src/dump-config-schema.ts index 874cd56f8c..1d92f2dfca 100644 --- a/apps/cli/src/dump-config-schema.ts +++ b/apps/cli/src/dump-config-schema.ts @@ -35,7 +35,7 @@ export async function runDumpConfigSchema( // Trusted module diagnostics must not precede the JSON document on stdout. process.stdout.write = process.stderr.write.bind(process.stderr) try { - dump = await generateConfigSchema(NAME, loaded, layers.map(layer => layer.patches), INSTALL_ANCHOR) + dump = await generateConfigSchema(loaded, layers.map(layer => layer.patches), INSTALL_ANCHOR) } finally { process.stdout.write = stdoutWrite } diff --git a/apps/cli/src/profile-boot.ts b/apps/cli/src/profile-boot.ts index 9e40d01f70..b795f627ca 100644 --- a/apps/cli/src/profile-boot.ts +++ b/apps/cli/src/profile-boot.ts @@ -23,6 +23,7 @@ import { installFailLoud, loadOverlayPatches, loadProfile, + reportSkippedBundles, PluginPackages, PROFILE_PATCH_FILENAME, PROFILE_TEMPLATES, @@ -166,6 +167,7 @@ export function initializeProfileFromDefault( export function prepareProfile(name: string, userLayer = true, fromDefaultProfile?: string): Profile { if (fromDefaultProfile !== undefined) initializeProfileFromDefault(name, fromDefaultProfile) const profile = loadProfile(NAME, name, INSTALL_ANCHOR, undefined, { userLayer }) + reportSkippedBundles(NAME, profile) writeFileSync(join(profile.dir, PROFILE_ROOT_FILENAME), PROFILE_ROOT_CONFIG) return profile } diff --git a/apps/cli/tests/desktop-host.e2e.ts b/apps/cli/tests/desktop-host.e2e.ts index 57afeb20c4..e486354a33 100644 --- a/apps/cli/tests/desktop-host.e2e.ts +++ b/apps/cli/tests/desktop-host.e2e.ts @@ -28,7 +28,7 @@ it.each([false, true])('settles startup after parent IPC disconnect (boot failur } writeFileSync(join(root, 'package.json'), '{"type":"module"}') writeFileSync(join(modules, 'dsh-app-boot', 'package.json'), '{"type":"module","exports":"./index.js"}') - writeFileSync(join(modules, 'dsh-app-boot', 'index.js'), 'export const loadProfileDirectory = () => ({}); export const loadLayeredEnv = () => ({})') + writeFileSync(join(modules, 'dsh-app-boot', 'index.js'), 'export const loadProfileDirectory = () => ({ skippedBundles: [] }); export const reportSkippedBundles = () => {}; export const loadLayeredEnv = () => ({})') writeFileSync(join(modules, 'dsh', 'package.json'), '{"type":"module","exports":{"./profile-boot":"./profile-boot.js"}}') writeFileSync(join(modules, 'dsh', 'profile-boot.js'), ` import { writeFileSync } from 'node:fs'; diff --git a/apps/cli/tests/resolved-profile-boot.spec.ts b/apps/cli/tests/resolved-profile-boot.spec.ts index 0df34251c6..6e7bc52060 100644 --- a/apps/cli/tests/resolved-profile-boot.spec.ts +++ b/apps/cli/tests/resolved-profile-boot.spec.ts @@ -60,7 +60,7 @@ describe('runProfile with an application-owned profile', () => { throw failure }) if (stage === 'composition') vi.mocked(createRuntimeResolution).mockRejectedValueOnce(failure) - const profile: Profile = { + const profile: Profile = { skippedBundles: [], name: 'desktop', dir: home, patchPath: join(home, 'cordis.patch.yml'), patches: [], layers: [], } @@ -121,7 +121,7 @@ describe('runProfile with an application-owned profile', () => { writeFileSync(profilePatch, '- id: target\n config: { profile: true, priority: profile }\n') writeFileSync(overlay, '- id: target\n config: { overlay: true, priority: overlay }\n') writeFileSync(join(home, 'cordis.yml'), '- id: stale\n') - const profile: Profile = { + const profile: Profile = { skippedBundles: [], name: 'desktop', dir: home, patchPath: profilePatch, patches: [{ id: 'target', config: { profile: true, priority: 'profile' } }], layers: [{ diff --git a/apps/cli/tests/web-agent-presets.e2e.ts b/apps/cli/tests/web-agent-presets.e2e.ts index 7d3a25f9af..8131e15f0f 100644 --- a/apps/cli/tests/web-agent-presets.e2e.ts +++ b/apps/cli/tests/web-agent-presets.e2e.ts @@ -136,7 +136,7 @@ async function bootWeb( await mkdir(dirname(link), { recursive: true }) await symlink(packageDir, link, 'junction') } - let profile: Profile = { + let profile: Profile = { skippedBundles: [], name: 'spec', dir: profileDir, layers: [], diff --git a/apps/desktop-host/src/index.ts b/apps/desktop-host/src/index.ts index e9e4e13b29..4a47a92ce8 100644 --- a/apps/desktop-host/src/index.ts +++ b/apps/desktop-host/src/index.ts @@ -2,7 +2,7 @@ import { delimiter, join } from 'node:path' import { inspect } from 'node:util' -import { loadLayeredEnv, loadProfileDirectory } from '@deepseek-ai/dsh-app-boot' +import { loadLayeredEnv, loadProfileDirectory, reportSkippedBundles } from '@deepseek-ai/dsh-app-boot' import { runProfile } from '@deepseek-ai/dsh/profile-boot' import type {} from '@deepseek-ai/dsh-client-connection' import type {} from '@deepseek-ai/dsh-host-webserver' @@ -21,6 +21,7 @@ async function main(): Promise { installOfficeEngineResolution(runtimeDir) const installAnchor = join(runtimeDir, 'node_modules', '@deepseek-ai', 'dsh', 'package.json') const profile = loadProfileDirectory('dsh', projectDir, installAnchor) + reportSkippedBundles('dsh', profile) const application = runProfile({ environment: loadLayeredEnv('dsh'), profile: 'desktop', diff --git a/apps/web/tests/scaffold.ts b/apps/web/tests/scaffold.ts index 7d9970e9cd..974d742353 100644 --- a/apps/web/tests/scaffold.ts +++ b/apps/web/tests/scaffold.ts @@ -734,7 +734,7 @@ export async function launchWebScaffold(options: LaunchOptions = {}): Promise` and combines installable bundles with its own `cordis.patch.yml`. A bundle's `dsh.bundle.patch` names one patch file or an ordered list of files; `bundlePatchFiles` validates the declaration and `bundlePatchPaths` resolves it to absolute paths; the layer concatenates their patch lists in that order. The YAML composition enables or disables HMR. The shipped `web` template uses live reload, while the other shipped templates apply patches only at startup. `sdk-minimal` names only its standalone bundle; the other templates retain base-plus-mode stacks. `dsh --profile --from-default-profile