2nd dokployH
Find a file
imccyu 7b973e27c8 feat(release): reject a module-scope load of an optional dependency
A dependency in optionalDependencies, or a peer carrying
peerDependenciesMeta.<name>.optional, may be absent from an installed
tree — that absence is the whole promise of "optional". A static import
is evaluated when the importing module loads, so one absent package
stops being "this capability is unavailable" and becomes a load failure
for everything that reaches the importing module.

Nothing checked it, and nothing here could: the failure needs an
installed tree missing that package, and a workspace install always has
every package, so the unit tests, the snapshots, and the packed-install
probe all pass while the published package is broken for the consumer
who declined the optional peer.

verify-optional-dependency-imports reads each package's own manifest for
what it allows to be absent, then scans the files that ship across both
compiler faces. Value-versus-type is decided against a bound Program
rather than the import syntax, because verbatimModuleSyntax is off: the
compiler already erases an import whose bindings resolve to types, so a
syntactic rule would report four forms that emit nothing. Only the type
phase erases an import — `import defer` still resolves and links its
module, deferring evaluation alone — which is what phaseModifier
expresses and the deprecated isTypeOnly cannot.

A violation names the package, the declaration that made it optional,
and the way out in order: import it as a type, or restructure so module
scope does not need it. A dynamic import() only moves the failure to
first use, so the gate does not offer it as the remedy.

The gate runs in ci-static and ci-primary through ciSharedStaticGates
and locally in hygiene; it needs no build. TypeScriptProject gained a
face parameter so a repository-wide gate can seed the client aggregate,
which was previously unreachable; the constraint it was built with is
unchanged, a face config and never the root solution.

The tree has no violation today, so this guards the rule rather than
fixing a defect. The spec pins all seven import forms against what tsc
emits, including the four a syntactic rule would misreport.
2026-08-14 16:10:06 +08:00
.agents feat(release): reject a module-scope load of an optional dependency 2026-08-14 16:10:06 +08:00
.claude Revert "test(repository-plugin): drop the skill contribution from the preset-composed e2e" 2026-08-09 22:10:50 +08:00
.github fix(docs): point source links at public master 2026-08-13 21:20:28 +08:00
apps Merge pull request #2374 from deepseek-harness/codex/product-subagent-one-shot-background 2026-08-14 15:49:58 +08:00
assets docs: align community QR assets 2026-08-13 15:32:38 +08:00
docs feat(llm-deepseek): support low reasoning effort 2026-08-14 11:47:59 +08:00
examples Merge pull request #2374 from deepseek-harness/codex/product-subagent-one-shot-background 2026-08-14 15:49:58 +08:00
native release(landlock-run): 0.1.1 2026-08-13 15:32:17 +08:00
packages Merge pull request #2374 from deepseek-harness/codex/product-subagent-one-shot-background 2026-08-14 15:49:58 +08:00
patches cleanup: remove TUI package and legacy dsh entrypoints 2026-08-04 13:20:28 +08:00
python Adopt MIT for DSH packages 2026-08-13 13:07:24 +08:00
scripts feat(release): reject a module-scope load of an optional dependency 2026-08-14 16:10:06 +08:00
vendor release(vendor): cordis 4.0.1, cosmokit 1.8.2, group 1.0.1, hmr 1.0.16, include 1.0.6, loader 1.0.2, logger-console 1.0.1, schemastery 3.18.1, timer 1.1.3 2026-08-13 14:18:56 +08:00
website docs(website): read guide module facts from one per-locale record 2026-08-13 12:19:22 +08:00
.editorconfig Declare LF and final-newline conventions in .editorconfig 2026-07-15 16:09:12 +08:00
.gitattributes feat(i18n): compose pairing records during merges 2026-08-08 21:11:59 +08:00
.gitignore chore: untrack the local .claude/launch.json and ignore it 2026-08-08 23:45:38 +08:00
.gitlab-ci.yml fix: address Python release review feedback 2026-08-11 20:09:33 +08:00
.jscpd.json chore(lint): bring .tsx files into the eslint, lefthook, and jscpd lanes 2026-07-27 21:42:08 +08:00
.oxlintrc.json refactor: make lint workflows Oxlint-only 2026-08-09 14:55:15 +08:00
.oxlintrc.staged.json refactor: make lint workflows Oxlint-only 2026-08-09 14:55:15 +08:00
.rgignore chore: exclude archived Agent Notes from rg 2026-08-10 14:49:30 +08:00
AGENTS.md docs: capitalize Service Provider across repository 2026-08-13 13:31:30 +08:00
BENCHMARK.md docs: make Web UI the primary onboarding path 2026-08-12 11:44:33 +08:00
CLAUDE.md Initialize repo with README, AGENTS.md, and CLAUDE.md symlink 2026-06-10 22:58:56 +08:00
CONTRIBUTING.i18n.yaml docs(i18n): polish contribution greeting 2026-08-12 14:40:32 +08:00
CONTRIBUTING.md docs(i18n): refine contribution guide wording 2026-08-12 14:24:44 +08:00
CONTRIBUTING.zh.md docs(i18n): polish contribution greeting 2026-08-12 14:40:32 +08:00
knip.json fix: static 2026-08-13 15:32:13 +08:00
lefthook.yml fix(review): address source-run feedback 2026-08-11 11:22:08 +08:00
LICENSE Adopt MIT for DSH packages 2026-08-13 13:07:24 +08:00
package.json feat(release): reject a module-scope load of an optional dependency 2026-08-14 16:10:06 +08:00
pnpm-lock.yaml build(release): publish the vendored framework and the native packages publicly 2026-08-13 14:05:48 +08:00
pnpm-workspace.yaml fix(packaging): materialize runtime dependencies 2026-08-10 22:47:18 +08:00
pytest.ini Merge remote-tracking branch 'origin/master' into codex/trim-ai-prose 2026-07-14 00:40:36 +08:00
README.i18n.yaml docs: add link to preview paper 2026-08-13 18:37:45 +08:00
README.md docs: add link to preview paper 2026-08-13 18:37:45 +08:00
README.zh.md docs: add link to preview paper 2026-08-13 18:37:45 +08:00
THIRD_PARTY_NOTICES.md Adopt MIT for DSH packages 2026-08-13 13:07:24 +08:00
tsconfig.base.client.json refactor: replace overloaded surface terminology 2026-08-11 15:23:05 +08:00
tsconfig.base.json • feat(self-modification): add dynamic Cordis plugin runtime and UI 2026-08-13 01:29:36 +08:00
tsconfig.client.json fix(session-query): rename session log export package 2026-08-13 05:02:00 +08:00
tsconfig.host.json fix(web): hide verified cold blank sessions 2026-08-13 14:04:16 +08:00
tsconfig.json refactor(tsconfig): single root solution graph over host/client aggregates 2026-07-23 03:59:05 +08:00
tsdown.config.ts refactor: apply repository naming contract 2026-08-13 00:54:38 +08:00
vitest.config.ts ci: skip 2026-08-13 18:29:09 +08:00
vitest.e2e.config.ts fix(typert): close remote gateway review gaps 2026-08-07 21:47:15 +08:00
vitest.shared.ts fix(typert): close remote gateway review gaps 2026-08-07 21:47:15 +08:00
vitest.snapshot.config.ts chore: remove remaining SDK toolchain residue 2026-08-11 16:37:29 +08:00
vitest.web-stress.config.ts test(web): add opt-in reasoning chunk stress lane 2026-08-04 14:37:31 +08:00
vitest.web.config.ts fix: vitest 2026-08-13 01:35:47 +08:00
vitest.web.perf.config.ts test: add opt-in web performance scenario 2026-08-04 14:23:34 +08:00

DeepSeek Harness

English | 中文

DeepSeek Harness (dsh) is an open-source agent harness developed by DeepSeek AI.

It uses an architecture where everything is a plugin, and is powered by Cordis, whose design is described in A Programming Paradigm for Spatiotemporal Composability.

Developer preview

DeepSeek Harness is currently in developer preview and is iterating rapidly. THERE WILL BE COMPATIBILITY-BREAKING CHANGES.

Run

Run from npm

Install Node.js, then run:

npx @deepseek-ai/dsh web

The command starts the Web UI, served at http://127.0.0.1:3080 by default. See Web UI guide.

Run from source

To run from a repository checkout:

git clone https://github.com/deepseek-ai/deepseek-harness.git
cd deepseek-harness
pnpm install
pnpm run build
pnpm dsh web

Community and support

Contributing

See CONTRIBUTING.md.

Development

Start with the development guide and architecture documentation.

For agents, follow AGENTS.md.

License

MIT

Third-party dependencies and their licenses are disclosed in THIRD_PARTY_NOTICES.md.