fix(vendor): align command providers with Cordis rescope
This commit is contained in:
@@ -16,9 +16,9 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import type { Command } from 'commander'
|
import type { Command } from 'commander'
|
||||||
import type { Context } from 'cordis'
|
import type { Context } from '@deepseek-ai/cordis'
|
||||||
// Empty type import carries the Loader Context merge used by enableRow.
|
// Empty type import carries the Loader Context merge used by enableRow.
|
||||||
import type {} from '@cordisjs/plugin-loader'
|
import type {} from '@deepseek-ai/cordis-plugin-loader'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The invocation's inner arguments: everything after the launcher's own flags,
|
* The invocation's inner arguments: everything after the launcher's own flags,
|
||||||
@@ -42,7 +42,7 @@ export interface AppExit {
|
|||||||
(code: number): void
|
(code: number): void
|
||||||
}
|
}
|
||||||
|
|
||||||
declare module 'cordis' {
|
declare module '@deepseek-ai/cordis' {
|
||||||
interface Context {
|
interface Context {
|
||||||
/** The invocation's inner arguments; provided by a launcher before the tree mounts. */
|
/** The invocation's inner arguments; provided by a launcher before the tree mounts. */
|
||||||
cmdlineArgs?: CmdlineArgs
|
cmdlineArgs?: CmdlineArgs
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
* @module @deepseek-ai/dsh-cmdline/invariant
|
* @module @deepseek-ai/dsh-cmdline/invariant
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import type { Context } from 'cordis'
|
import type { Context } from '@deepseek-ai/cordis'
|
||||||
import type { InvariantInstaller } from '@deepseek-ai/dsh-invariants'
|
import type { InvariantInstaller } from '@deepseek-ai/dsh-invariants'
|
||||||
|
|
||||||
const PACKAGE_NAME = '@deepseek-ai/dsh-cmdline'
|
const PACKAGE_NAME = '@deepseek-ai/dsh-cmdline'
|
||||||
|
|||||||
@@ -9,10 +9,10 @@ import { tmpdir } from 'node:os'
|
|||||||
import { join } from 'node:path'
|
import { join } from 'node:path'
|
||||||
import { pathToFileURL } from 'node:url'
|
import { pathToFileURL } from 'node:url'
|
||||||
import { Command } from 'commander'
|
import { Command } from 'commander'
|
||||||
import { Context } from 'cordis'
|
import { Context } from '@deepseek-ai/cordis'
|
||||||
import Loader from '@cordisjs/plugin-loader'
|
import Loader from '@deepseek-ai/cordis-plugin-loader'
|
||||||
import Include from '@cordisjs/plugin-include'
|
import Include from '@deepseek-ai/cordis-plugin-include'
|
||||||
import type { PatchOptions } from '@cordisjs/plugin-include'
|
import type { PatchOptions } from '@deepseek-ai/cordis-plugin-include'
|
||||||
import { afterEach, describe, expect, it } from 'vitest'
|
import { afterEach, describe, expect, it } from 'vitest'
|
||||||
import {
|
import {
|
||||||
enableRow, internals, parseCmdline, provideCmdline, type CmdlinePlan,
|
enableRow, internals, parseCmdline, provideCmdline, type CmdlinePlan,
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Command } from 'commander'
|
import { Command } from 'commander'
|
||||||
import type { Context } from 'cordis'
|
import type { Context } from '@deepseek-ai/cordis'
|
||||||
import { parseCmdline } from '@deepseek-ai/dsh-cmdline'
|
import { parseCmdline } from '@deepseek-ai/dsh-cmdline'
|
||||||
|
|
||||||
/** Stable Cordis plugin name. */
|
/** Stable Cordis plugin name. */
|
||||||
|
|||||||
@@ -8,9 +8,9 @@ import { mkdtempSync, writeFileSync } from 'node:fs'
|
|||||||
import { tmpdir } from 'node:os'
|
import { tmpdir } from 'node:os'
|
||||||
import { join } from 'node:path'
|
import { join } from 'node:path'
|
||||||
import { pathToFileURL } from 'node:url'
|
import { pathToFileURL } from 'node:url'
|
||||||
import { Context } from 'cordis'
|
import { Context } from '@deepseek-ai/cordis'
|
||||||
import Loader from '@cordisjs/plugin-loader'
|
import Loader from '@deepseek-ai/cordis-plugin-loader'
|
||||||
import Include from '@cordisjs/plugin-include'
|
import Include from '@deepseek-ai/cordis-plugin-include'
|
||||||
import { internals, provideCmdline } from '@deepseek-ai/dsh-cmdline'
|
import { internals, provideCmdline } from '@deepseek-ai/dsh-cmdline'
|
||||||
import { afterEach, describe, expect, it } from 'vitest'
|
import { afterEach, describe, expect, it } from 'vitest'
|
||||||
import { apply, HEADLESS_STARTUP_SERVICE, type HeadlessStartupValues } from '../src/startup.ts'
|
import { apply, HEADLESS_STARTUP_SERVICE, type HeadlessStartupValues } from '../src/startup.ts'
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Command } from 'commander'
|
import { Command } from 'commander'
|
||||||
import type { Context } from 'cordis'
|
import type { Context } from '@deepseek-ai/cordis'
|
||||||
import { parseCmdline } from '@deepseek-ai/dsh-cmdline'
|
import { parseCmdline } from '@deepseek-ai/dsh-cmdline'
|
||||||
|
|
||||||
/** Stable Cordis plugin name. */
|
/** Stable Cordis plugin name. */
|
||||||
|
|||||||
@@ -7,9 +7,9 @@ import { mkdtempSync, writeFileSync } from 'node:fs'
|
|||||||
import { tmpdir } from 'node:os'
|
import { tmpdir } from 'node:os'
|
||||||
import { join } from 'node:path'
|
import { join } from 'node:path'
|
||||||
import { pathToFileURL } from 'node:url'
|
import { pathToFileURL } from 'node:url'
|
||||||
import { Context } from 'cordis'
|
import { Context } from '@deepseek-ai/cordis'
|
||||||
import Loader from '@cordisjs/plugin-loader'
|
import Loader from '@deepseek-ai/cordis-plugin-loader'
|
||||||
import Include from '@cordisjs/plugin-include'
|
import Include from '@deepseek-ai/cordis-plugin-include'
|
||||||
import { internals, provideCmdline } from '@deepseek-ai/dsh-cmdline'
|
import { internals, provideCmdline } from '@deepseek-ai/dsh-cmdline'
|
||||||
import { afterEach, describe, expect, it } from 'vitest'
|
import { afterEach, describe, expect, it } from 'vitest'
|
||||||
import { apply, WEB_STARTUP_SERVICE, type WebStartupValues } from '../src/startup.ts'
|
import { apply, WEB_STARTUP_SERVICE, type WebStartupValues } from '../src/startup.ts'
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ const POSTCONDITIONS: readonly PostCondition[] = [
|
|||||||
{ file: 'packages/boot/app-boot/tsdown.config.ts', text: '[\'@deepseek-ai/cordis-plugin-include\']', count: 1 },
|
{ file: 'packages/boot/app-boot/tsdown.config.ts', text: '[\'@deepseek-ai/cordis-plugin-include\']', count: 1 },
|
||||||
{ file: 'tsconfig.base.json', text: '"@deepseek-ai/cordis-plugin-loader": ["./vendor/loader/src"]', count: 1 },
|
{ file: 'tsconfig.base.json', text: '"@deepseek-ai/cordis-plugin-loader": ["./vendor/loader/src"]', count: 1 },
|
||||||
// One insertion, once: a duplicated log entry is what a non-idempotent apply produced.
|
// One insertion, once: a duplicated log entry is what a non-idempotent apply produced.
|
||||||
{ file: 'vendor/README.md', text: '15. **`@deepseek-ai` rescope**', count: 1 },
|
{ file: 'vendor/README.md', text: '17. **`@deepseek-ai` rescope**', count: 1 },
|
||||||
{ file: 'knip.json', text: '@cordisjs', count: 0 },
|
{ file: 'knip.json', text: '@cordisjs', count: 0 },
|
||||||
{ file: 'pnpm-workspace.yaml', text: 'cordis@4.0.0-rc.7', count: 0 },
|
{ file: 'pnpm-workspace.yaml', text: 'cordis@4.0.0-rc.7', count: 0 },
|
||||||
// The preset ids in this table are product data, not package names.
|
// The preset ids in this table are product data, not package names.
|
||||||
@@ -319,7 +319,7 @@ const EXACT_EDITS: readonly ExactEdit[] = [
|
|||||||
id: 'vendor-readme-local-modification-log',
|
id: 'vendor-readme-local-modification-log',
|
||||||
file: 'vendor/README.md',
|
file: 'vendor/README.md',
|
||||||
find: '\n## Sync procedure',
|
find: '\n## Sync procedure',
|
||||||
replace: '15. **`@deepseek-ai` rescope**: every vendored manifest `name`, every internal dependency entry among the vendored set, and every module specifier that reaches them use the scoped names in the manifest table\'s `npm name` column. Directory names, version numbers, and dependency ranges are unchanged, and no upstream runtime identifier is renamed — `Symbol.for(\'schemastery\')` and Schemastery\'s `vendor:` metadata field keep their upstream values. Re-apply with `pnpm run rescope-vendor --apply` after a sync; the table\'s two name columns are the mapping, restated for consumers in [docs/rescope.md](../docs/rescope.md).\n\n## Sync procedure',
|
replace: '17. **`@deepseek-ai` rescope**: every vendored manifest `name`, every internal dependency entry among the vendored set, and every module specifier that reaches them use the scoped names in the manifest table\'s `npm name` column. Directory names, version numbers, and dependency ranges are unchanged, and no upstream runtime identifier is renamed — `Symbol.for(\'schemastery\')` and Schemastery\'s `vendor:` metadata field keep their upstream values. Re-apply with `pnpm run rescope-vendor --apply` after a sync; the table\'s two name columns are the mapping, restated for consumers in [docs/rescope.md](../docs/rescope.md).\n\n## Sync procedure',
|
||||||
expect: 1,
|
expect: 1,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
Vendored
+3
-3
@@ -44,9 +44,9 @@ Keep this log exhaustive — every divergence from upstream must be listed.
|
|||||||
12. **`include/src/index.ts` serialized child-tree mutation and `hmr/src/index.ts` main-watcher initial-scan suppression**: every Include child-tree mutation (initial apply, refresh, `internal/update` patch re-application) runs through one per-Include queue, because the group's transactional `update` is not reentrant — two concurrent applies interleave create and rollback on the same entries and strand the Include fiber without ever settling. The HMR main watcher passes `ignoreInitial: true`: the initial scan re-announced files boot had just consumed, and its `add` for a config file refreshed an Include mid-initial-apply; once serialized, a failing initial apply's rollback disposed HMR, whose teardown drain waited on the queued refresh sitting behind that same apply — a deadlock that exited 13 with no diagnostic. `registerConfig()` keeps its own `ignoreInitial: false` watcher because a user patch layer present at registration must apply once. Covered by the patch-overlay boot-failure built-bin case in `apps/cli/tests/built-bin.e2e.ts`.
|
12. **`include/src/index.ts` serialized child-tree mutation and `hmr/src/index.ts` main-watcher initial-scan suppression**: every Include child-tree mutation (initial apply, refresh, `internal/update` patch re-application) runs through one per-Include queue, because the group's transactional `update` is not reentrant — two concurrent applies interleave create and rollback on the same entries and strand the Include fiber without ever settling. The HMR main watcher passes `ignoreInitial: true`: the initial scan re-announced files boot had just consumed, and its `add` for a config file refreshed an Include mid-initial-apply; once serialized, a failing initial apply's rollback disposed HMR, whose teardown drain waited on the queued refresh sitting behind that same apply — a deadlock that exited 13 with no diagnostic. `registerConfig()` keeps its own `ignoreInitial: false` watcher because a user patch layer present at registration must apply once. Covered by the patch-overlay boot-failure built-bin case in `apps/cli/tests/built-bin.e2e.ts`.
|
||||||
13. **`include/src/index.ts` `writeTask` type**: widened the optional `writeTask?: NodeJS.Timeout` property to `NodeJS.Timeout | undefined` — the debounced writer assigns `undefined` on flush, which `exactOptionalPropertyTypes` rejects on a plain optional. Type-only; no behavior change.
|
13. **`include/src/index.ts` `writeTask` type**: widened the optional `writeTask?: NodeJS.Timeout` property to `NodeJS.Timeout | undefined` — the debounced writer assigns `undefined` on flush, which `exactOptionalPropertyTypes` rejects on a plain optional. Type-only; no behavior change.
|
||||||
14. **`include/src/index.ts` durable debounced writes**: serialized and tracked config-file writes, retried transient `EACCES`/`EBUSY`/`EPERM` rename failures with a bounded backoff, observed asynchronous timer rejections, and drained the latest write during Include teardown. Windows can briefly retain a destination handle after a Loader child disposes; the upstream fire-and-forget rename escaped as an unhandled rejection and could lose the persisted `disabled` state. A terminal failure is logged by the asynchronous writer and remains on the queue so `Include.stop()` rethrows it instead of silently declaring persistence complete; Cordis's ordinary fiber teardown retains its separate error-containment contract. Covered by `packages/host/directory-picker-auto/tests/loader-composition.spec.ts` with injected transient and terminal rename failures.
|
14. **`include/src/index.ts` durable debounced writes**: serialized and tracked config-file writes, retried transient `EACCES`/`EBUSY`/`EPERM` rename failures with a bounded backoff, observed asynchronous timer rejections, and drained the latest write during Include teardown. Windows can briefly retain a destination handle after a Loader child disposes; the upstream fire-and-forget rename escaped as an unhandled rejection and could lose the persisted `disabled` state. A terminal failure is logged by the asynchronous writer and remains on the queue so `Include.stop()` rethrows it instead of silently declaring persistence complete; Cordis's ordinary fiber teardown retains its separate error-containment contract. Covered by `packages/host/directory-picker-auto/tests/loader-composition.spec.ts` with injected transient and terminal rename failures.
|
||||||
15. **`@deepseek-ai` rescope**: every vendored manifest `name`, every internal dependency entry among the vendored set, and every module specifier that reaches them use the scoped names in the manifest table's `npm name` column. Directory names, version numbers, and dependency ranges are unchanged, and no upstream runtime identifier is renamed — `Symbol.for('schemastery')` and Schemastery's `vendor:` metadata field keep their upstream values. Re-apply with `pnpm run rescope-vendor --apply` after a sync; the table's two name columns are the mapping, restated for consumers in [docs/rescope.md](../docs/rescope.md).
|
15. **Lazy Loader config resolution across `cordis/src/{events,fiber}.ts`, `loader/src/{index,config/entry}.ts`, `include/src/index.ts`, and `hmr/src/index.ts`**: ports [cordiverse/cordis#41](https://github.com/cordiverse/cordis/pull/41), retaining raw fiber config and resolving it through `internal/config` only after declared injections are active. Provider replacement re-resolves the raw expression, pending updates retain it, and HMR transfers it. Resolution applies only to the entry root, so child plugins mounted by a row keep caller-owned config identity. Include adds a static entry-config resolver so its own options interpolate while nested row `!!js` nodes remain deferred. Deferred failures retain the owning row diagnostic, and tree teardown does not persist failure-driven self-disposal. Covered by `packages/boot/app-boot/tests/{app-boot,user-patches}.spec.ts`, `packages/boot/cmdline/tests/cmdline.spec.ts`, `apps/cli/tests/web-agent-presets.e2e.ts`, and the built custom-profile cases in `apps/cli/tests/built-bin.e2e.ts`.
|
||||||
16. **Lazy Loader config resolution across `cordis/src/{events,fiber}.ts`, `loader/src/{index,config/entry}.ts`, `include/src/index.ts`, and `hmr/src/index.ts`**: ports [cordiverse/cordis#41](https://github.com/cordiverse/cordis/pull/41), retaining raw fiber config and resolving it through `internal/config` only after declared injections are active. Provider replacement re-resolves the raw expression, pending updates retain it, and HMR transfers it. Resolution applies only to the entry root, so child plugins mounted by a row keep caller-owned config identity. Include adds a static entry-config resolver so its own options interpolate while nested row `!!js` nodes remain deferred. Deferred failures retain the owning row diagnostic, and tree teardown does not persist failure-driven self-disposal. Covered by `packages/boot/app-boot/tests/{app-boot,user-patches}.spec.ts`, `packages/boot/cmdline/tests/cmdline.spec.ts`, `apps/cli/tests/web-agent-presets.e2e.ts`, and the built custom-profile cases in `apps/cli/tests/built-bin.e2e.ts`.
|
16. **In-memory Loader entry activation in `loader/src/config/entry.ts`**: an invocation can activate a row shipped with `disabled: true` without mutating its serialized options. The override belongs to the mounted entry object, survives Include config reapplication, respects disabled ancestors, and disappears with the entry. Covered by `packages/boot/cmdline/tests/cmdline.spec.ts` and `apps/web/tests/hmr-live.e2e.ts`.
|
||||||
17. **In-memory Loader entry activation in `loader/src/config/entry.ts`**: an invocation can activate a row shipped with `disabled: true` without mutating its serialized options. The override belongs to the mounted entry object, survives Include config reapplication, respects disabled ancestors, and disappears with the entry. Covered by `packages/boot/cmdline/tests/cmdline.spec.ts` and `apps/web/tests/hmr-live.e2e.ts`.
|
17. **`@deepseek-ai` rescope**: every vendored manifest `name`, every internal dependency entry among the vendored set, and every module specifier that reaches them use the scoped names in the manifest table's `npm name` column. Directory names, version numbers, and dependency ranges are unchanged, and no upstream runtime identifier is renamed — `Symbol.for('schemastery')` and Schemastery's `vendor:` metadata field keep their upstream values. Re-apply with `pnpm run rescope-vendor --apply` after a sync; the table's two name columns are the mapping, restated for consumers in [docs/rescope.md](../docs/rescope.md).
|
||||||
|
|
||||||
## Sync procedure
|
## Sync procedure
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user