Commit graph

224 commits

Author SHA1 Message Date
Chinesezjc
161c6591be ci: fail fast at the first blocking gate failure 2026-08-31 01:54:14 +08:00
imccyu
de256e8bc1 feat: enforce published dependency policy 2026-08-29 14:26:42 +08:00
Yichen Jiang
90505636cd test(ci): carry the hook budget and raise the Lefthook suite to the lane value
The Windows coverage lane grants DSH_COVERAGE_TEST_TIMEOUT_MS=90000, but two
paths declined it.

scripts/install-lefthook.spec.ts took a describe-level 30_000, restated as a
per-case constant on five cases. Every case drives spawned Git and Node
subprocesses; the slowest costs 7.5 s on an idle host, so the ceiling carried
roughly fourfold headroom and fired on branches that did not touch the file.
The suite takes 90_000 and the redundant constant is removed.

coverageTestTimeoutArgs raised --testTimeout and --expect.poll.timeout but left
--hookTimeout at Vitest's separate 10 s default, which removeFixtureSafely's
documented 10-second Windows retry window meets exactly. Raising only the test
budget would move a contended suite's failure into its teardown.
2026-08-29 11:15:32 +08:00
Turtle
7e92ed8213 Merge origin/master into codex/remove-knip 2026-08-28 12:07:36 +08:00
Yichen Jiang
12c161e1a7 perf(infra): map each workspace package to an explicit path alias
tsconfig.base.json resolved @deepseek-ai/dsh-* through 49 candidate
globs and @deepseek-ai/dsh-*/invariant through 45, one per package
group. Resolution tries candidates in order, so a package late in the
list paid for every earlier miss — and under the dsh source launch each
miss is an ERR_MODULE_NOT_FOUND that Node decorates with a full
CommonJS resolution walk. A boot profile attributed 934.6 ms, 35% of
startup, to that decoration path across 60,942 failed resolutions. The
cost landed hardest on packages/util/*, which sits at position 44 of 49
and holds the leaf utilities nearly every plugin imports.

gen-tsconfig-paths writes one explicit alias per package into a marked
region and both group wildcards are gone; verify-tsconfig-paths reports
drift and runs in the ci-static lane. Booting the headless profile from
source drops from ~2,157 ms to ~1,055 ms with --help output unchanged.

All 1,022 dsh specifiers in repository sources resolve to the same
target as before, except seven /invariant specifiers in the lsp,
terminal, and runtime-diagnostics groups that the deleted wildcard
never listed: those reached built lib/types instead of src, against the
rule that static gates resolve through paths to src on a clean tree.
2026-08-27 17:26:52 +08:00
Yichen Jiang
4e1c87b1a2 fix(ci): bound Windows process contention 2026-08-26 14:24:24 +08:00
fengsy
eadd5df82b fix(team): preserve current Client architecture after rebase 2026-08-26 10:56:57 +08:00
Dudu-0223
61dea35bd2 refactor: let Team own browser remotes 2026-08-26 10:56:57 +08:00
Dudu-0223
806642b064 feat(team): add experimental Agent Teams Web profile 2026-08-26 10:56:57 +08:00
Magolor
0b5eba0c8d docs: rebuild the documentation skill and standards (#2983) 2026-08-25 23:47:20 +08:00
pku-xht
08aed20139 test(ci): stabilize cross-platform consumer gates 2026-08-25 19:27:34 +08:00
Tianyi Cui
97f9e2e402 fix(ci): serialize native Windows coverage after build 2026-08-24 22:36:02 +08:00
Tianyi Cui
4125514a08 refactor(repo): retire top-level examples 2026-08-24 22:02:44 +08:00
Tianyi Cui
caf386f59c fix(test): use expected-output naming 2026-08-24 21:37:14 +08:00
Tianyi Cui
1cfe0f9942 refactor(test): reserve snapshots for session recordings 2026-08-24 21:37:14 +08:00
Chinesezjc
cd6941d5d7 Revert "perf(ci): shorten native Windows coverage critical path" 2026-08-24 14:39:56 +08:00
imccyu
a050b3d4f1 fix(client): gate the inspect catalog 2026-08-23 23:06:39 +08:00
Tianyi Cui
9ebda8755e Merge remote-tracking branch 'origin/master' into worktree/localize-ui-strings-gate
# Conflicts:
#	packages/client/ui-chat/src/client/chat/AssistantMarkdown.tsx
#	packages/client/ui-chat/src/client/chat/CompactionItem.tsx
#	packages/client/ui-conversation/src/client/locales.ts
#	packages/client/ui-renderer/src/client/app.tsx
#	packages/client/ui-renderer/src/client/index.ts
#	packages/client/ui-renderer/tests/ui-renderer.client.spec.tsx
#	packages/client/ui-tool/src/client/tool/models/tool-call-model.ts
#	packages/client/ui-trajectory/src/client/trajectory-record.ts
#	packages/client/ui-trajectory/src/client/trajectory-snapshot-builder.ts
#	packages/client/ui-trajectory/tests/views.client.spec.tsx
#	packages/client/ui-workspace/src/client/tree.ts
2026-08-23 18:34:42 +08:00
Tianyi Cui
3c10f5d2d3 fix(client): route UI copy through locale 2026-08-23 17:31:37 +08:00
Tianyi Cui
4bc6f4bdf7 Merge origin/master into worktree/gate-package-subsystem-pages 2026-08-23 15:47:32 +08:00
Tianyi Cui
3b33ca058f chore(repo): enforce dsh as the only Node application launcher
Add verify-application-entrypoints to the top-level gate graph. It inventories executable sources and package bins across apps, packages, and examples; rejects unclassified launchers including root-level js/mjs/cjs/ts files; and permits only the dsh CLI plus the explicitly private Python runtime carrier exception.

Update repository, architecture, CLI, and naming records to state the same rule: Node consumers select a dsh profile instead of invoking application-package bins, and no compatibility aliases remain. Fixtures prove both allowed classifications and representative escape attempts, making the architectural rule mechanically enforceable.
2026-08-23 10:59:01 +08:00
Tianyi Cui
12ad38b234 perf(ci): phase native Windows coverage work 2026-08-22 20:10:55 +08:00
_Kerman
36a10618df Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-2739
# Conflicts:
#	scripts/run-gates.spec.ts
2026-08-21 12:01:02 +08:00
_Kerman
d0d5b00095 Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-2739
# Conflicts:
#	.agents/notes/implemented/process/2026-07-06-parallel-pre-push-gates.i18n.yaml
#	.agents/notes/implemented/process/2026-07-13-documentation-site-projection.i18n.yaml
2026-08-21 11:35:58 +08:00
imccyu
89674edc93 fix(build): support standalone pnpm entrypoints 2026-08-21 11:09:25 +08:00
imccyu
66a7081c15 feat(build): bind client artifacts to build profiles 2026-08-19 18:21:27 +08:00
_Kerman
e850c07691 perf(infra): parallelize hygiene checks 2026-08-19 14:12:16 +08:00
_Kerman
f4af19d724 perf(infra): shorten doc-sync critical path 2026-08-19 13:45:34 +08:00
Turtle
907c6334c1 Remove Knip from repository tooling 2026-08-19 13:33:24 +08:00
imccyu
45a73e3ed5 fix(ci): preserve Windows gate ordering 2026-08-18 22:03:20 +08:00
imccyu
5ba9e50bb0 fix(ci): stabilize native Windows coverage 2026-08-18 21:15:21 +08:00
imccyu
ef75b6ff2f perf(ci): parallelize coverage and web snapshots in-job 2026-08-18 21:15:20 +08:00
imccyu
aa03eff500 build(client): enforce client package boundaries 2026-08-18 01:34:53 +08:00
Tianyi Cui
b2f23f88ad Merge commit '70396085b141370ce32de1be4e225b4384eaf46d' into HEAD
# Conflicts:
#	.agents/notes/implemented/feature/2026-07-07-mcp-client-plugin.i18n.yaml
#	.agents/notes/implemented/feature/2026-07-20-code-mode-typed-tool-returns.i18n.yaml
#	.agents/notes/implemented/feature/2026-07-22-web-multimodal-image-input-and-durable-attachments.i18n.yaml
#	.agents/notes/implemented/feature/2026-07-22-web-multimodal-image-input-and-durable-attachments.md
#	.agents/notes/implemented/feature/2026-07-22-web-multimodal-image-input-and-durable-attachments.zh.md
#	.agents/notes/implemented/simplification/2026-07-23-acp-automation-only-protocol.i18n.yaml
#	docs/config-catalog.i18n.yaml
#	docs/module-graph.i18n.yaml
#	docs/module-graph.md
#	docs/module-graph.zh.md
#	docs/tool-catalog.i18n.yaml
#	docs/tool-catalog.md
#	docs/tool-catalog.zh.md
#	examples/acp-agent/tests/snapshots/advanced-toolchain/tool-schemas.expected.json
#	examples/acp-agent/tests/snapshots/both-mode-turn/tool-schemas.expected.json
#	examples/acp-agent/tests/snapshots/code-mode-turn/tool-schemas.expected.json
#	packages/core/tools/README.i18n.yaml
#	packages/core/tools/README.zh.md
#	packages/core/tools/src/code-mode.ts
#	packages/host/apiproxy/tests/api-proxy-models.spec.ts
#	packages/host/plugin-inventory/tests/inventory.spec.ts
#	packages/mcp/mcp-client/tests/mcp-client.e2e.ts
#	packages/mcp/mcp-client/tests/mcp-client.spec.ts
#	packages/self-modification/tool-cordis/src/api-catalog.ts
#	packages/test-support/acp-snapshot/README.i18n.yaml
#	pnpm-lock.yaml
2026-08-17 11:31:59 +08:00
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
Turtle
3a1a4e2cd8 docs: address fragment review feedback 2026-08-13 14:30:17 +08:00
Turtle
62080d49c2 docs: fix release smoke test failures 2026-08-13 14:20:09 +08:00
Tianyi Cui
c905c4694e Adopt MIT for DSH packages 2026-08-13 13:07:24 +08:00
imccyu
4064198560 • feat(self-modification): add dynamic Cordis plugin runtime and UI 2026-08-13 01:29:36 +08:00
Tianyi Cui
a2d0f7f411 refactor: apply repository naming contract
Apply the accepted pre-release package, service, type, directory, and role renames as one repository-wide change.
2026-08-13 00:54:38 +08:00
Tianyi Cui
f3bfcf33bb fix(ci): budget native Windows coverage timing 2026-08-12 17:48:17 +08:00
Tianyi Cui
daf90bda7e refactor(sdk): remove unreleased project toolchain 2026-08-11 14:20:53 +08:00
imccyu
194828e8b8 build(vendor): add the @deepseek-ai rescope codemod, its mapping doc, and its Agent Note
Every harness package declares cordis as a peer dependency, so publishing the
harness publishes the vendored framework layer too; under the upstream names
that publication would squat them on the registry.

scripts/rescope-vendor.ts owns the rename: the nine-package mapping, a
delimited-token rule that leaves cordis.yml, the Loader's cordis: builtins and
vendor directory names alone, per-file exemptions where a name is a directory
or an upstream runtime identifier, and the exact edits for sites a token rule
cannot express — dot-notation lookups, unquoted manifest keys, a regex literal
whose failure would make every Context-merge scan silently find nothing, the
vendored-manifest table, and the contracts that told readers vendored packages
keep their upstream names.

Markdown follows the rename inside every fence, because a fence is code a
reader copies or configuration they mount, and in `docs/` prose as well, where
a sentence quoting a name teaches something this repository no longer resolves.
Prose elsewhere records what was true when it was written, and the same
spelling can mean something else: the Python SDK's `cordis` option, or the
unvendored `@cordisjs/plugin-http`. `docs/rescope.md` states both names on
purpose and is exempt.

exactEditState() classifies every exact edit as pending, applied, or invalid.
An insertion keeps its anchor and a deletion keeps its remainder, so each side
counts the form that survives: a duplicated insertion, a half-applied
replacement, and a deletion whose remainder moved are all invalid. The run
classifies every edit before writing anything and aborts on the first invalid
one, so a disagreement between the mapping and the tree cannot leave a
half-rescoped checkout; each write re-reads its file, because two edits can
target one. rescope-vendor.spec.ts pins those rejections, and --check asserts
the whole post-state from the hygiene gate, so CI owns the invariant.

--reverse restores the upstream names, verified as a round trip: reverse, then
apply, reproduces this tree byte for byte.

docs/rescope.md is the consumer-facing reference: the old-name/new-name table
with each package's role, what the rename deliberately leaves alone, the sites
callers must change, and the commands to apply, verify, and revert. The Agent
Note carries the decision and its consequences.

The rename itself lands in the next commit, produced by running the script.
2026-08-10 22:04:10 +08:00
Turtle
993550e6c8 refactor: remove repository plugin path 2026-08-10 21:32:13 +08:00
Tianyi Cui
ef7195a00a fix(skill): enforce manual invocation policy 2026-08-10 18:04:26 +08:00
Turtle
a27efdef36 docs: make technical prose concrete 2026-08-10 16:34:20 +08:00
Tianyi Cui
9d37d7155a test(docs): require package subsystem ownership 2026-08-09 22:50:01 +08:00
Tianyi Cui
cbba728f03 Merge worktree/ci-native-windows-20260808 into worktree/ci-native-windows-coverage-20260808 2026-08-09 13:01:04 +08:00
Tianyi Cui
b91b1fdefe fix(repository-plugin): make GitHub source preparation self-contained 2026-08-09 11:41:40 +08:00
Tianyi Cui
1ce84853de Merge remote-tracking branch 'origin/worktree/ci-native-windows-20260808' into worktree/ci-native-windows-coverage-20260808 2026-08-09 02:15:46 +08:00