better-dsh 0.2.3 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cordis.patch.yml +1 -1
- package/docs/50_test-reports/2026-09-06-write/345/267/245/345/205/267sandbox/345/215/207/347/272/247/351/200/217/344/274/240bug/345/244/215/345/217/221/345/217/212/346/214/202/350/265/267-/344/272/213/344/273/266/346/212/245/345/221/212.md +176 -0
- package/docs/50_test-reports/2026-09-08-hashline-edit-E_RANGE_UNVERIFIED/350/267/250/350/275/256/344/274/232/350/257/235/351/224/256/345/244/261/346/225/210-/350/257/212/346/226/255/346/212/245/345/221/212.md +226 -0
- package/docs/50_test-reports/2026-09-11-control-prompt-into-eval-description/345/256/236/346/265/213/346/212/245/345/221/212.md +222 -0
- package/docs/50_test-reports/2026-09-12-fs-scheme-resolution-/345/256/236/346/265/213/346/212/245/345/221/212.md +81 -0
- package/docs/50_test-reports/2026-09-12-url-schemes-grammar-matrix/344/270/216catalog-centralize-/345/256/236/346/265/213/346/212/245/345/221/212.md +234 -0
- package/docs/50_test-reports/2026-09-12-url-schemes-recallable-context-design/351/252/214/350/257/201/346/212/245/345/221/212.md +160 -0
- package/docs/50_test-reports/2026-09-12-url-schemes-recallable-context-/345/256/236/346/265/213/345/211/247/346/234/254.md +44 -0
- package/docs/50_test-reports/2026-09-12-url-schemes-recallable-context-/345/256/236/346/265/213/346/212/245/345/221/212.md +89 -0
- package/docs/50_test-reports/2026-09-12-url-schemes-/345/205/255scheme/345/206/222/347/203/237/344/270/216/350/276/271/347/225/214/345/256/236/346/265/213/346/212/245/345/221/212.md +198 -0
- package/docs/50_test-reports/2026-09-13-hashline-off/344/270/213scheme/345/217/257/350/276/276/346/200/247/345/267/245/345/205/267/351/235/242/344/270/215/345/257/271/347/247/260-/345/256/236/346/265/213/346/212/245/345/221/212.md +246 -0
- package/docs/50_test-reports/2026-09-13-preact-ui-shell/345/256/236/346/265/213/346/212/245/345/221/212.md +50 -0
- package/docs/50_test-reports/2026-09-14-4999-skill/346/270/205/345/215/225/344/270/216lsp-gate/345/256/236/346/265/213/346/212/245/345/221/212.md +63 -0
- package/docs/50_test-reports/upstream-dsh-0.1.3-alpha.2-local-test-report.md +44 -0
- package/docs/50_test-reports/upstream-dsh-0.1.3-alpha.2-report.md +110 -0
- package/docs/50_test-reports/upstream-dsh-0.1.5-rc.2-local-test-report.md +79 -0
- package/docs/50_test-reports/v0.2.3b-hashline-content-locator/345/256/236/346/265/213/346/212/245/345/221/212.md +73 -0
- package/docs/50_test-reports/v0.2.3c-mobile-wave/345/256/236/346/265/213/346/212/245/345/221/212.md +47 -0
- package/docs/50_test-reports/v0.2.4-ios-focus-zoom-suppression/345/256/236/346/265/213/346/212/245/345/221/212.md +158 -0
- package/docs/specs/agent/spec.md +54 -0
- package/docs/specs/ast/spec.md +34 -0
- package/docs/specs/compaction-recall/spec.md +46 -0
- package/docs/specs/ctx/spec.md +107 -0
- package/docs/specs/dsh/spec.md +47 -0
- package/docs/specs/dvc/spec.md +87 -0
- package/docs/specs/escalation-guidance/spec.md +44 -0
- package/docs/specs/fs-scheme-resolution/spec.md +37 -0
- package/docs/specs/hash-edit/spec.md +41 -0
- package/docs/specs/http-read/spec.md +73 -0
- package/docs/specs/kernel-provisioning/spec.md +53 -0
- package/docs/specs/lsp/spec.md +121 -0
- package/docs/specs/mobile-layout/spec.md +108 -0
- package/docs/specs/model-failover/spec.md +20 -0
- package/docs/specs/preact-ui-shell/spec.md +22 -0
- package/docs/specs/repl-dispatch-resilience/spec.md +21 -0
- package/docs/specs/skill/spec.md +58 -0
- package/docs/specs/tool-surface/spec.md +222 -0
- package/docs/specs/url-schema/spec.md +148 -0
- package/docs/specs/web-trust-fence/spec.md +43 -0
- package/docs/upstream-dsh-0.1.5-rc.2-report.md +156 -0
- package/dsh-docs/AGENTS.md +75 -0
- package/dsh-docs/agent-lifecycle.md +84 -0
- package/dsh-docs/agent-lifecycle.zh.md +86 -0
- package/dsh-docs/api-gateway.md +164 -0
- package/dsh-docs/api-gateway.zh.md +164 -0
- package/dsh-docs/architecture.md +150 -0
- package/dsh-docs/architecture.zh.md +154 -0
- package/dsh-docs/capability-seams.md +543 -0
- package/dsh-docs/capability-seams.zh.md +545 -0
- package/dsh-docs/config-catalog.md +3473 -0
- package/dsh-docs/config-catalog.zh.md +3474 -0
- package/dsh-docs/cookbook/adding-a-package.md +117 -0
- package/dsh-docs/cookbook/adding-a-package.zh.md +119 -0
- package/dsh-docs/cookbook/adding-a-remote-api.md +197 -0
- package/dsh-docs/cookbook/adding-a-remote-api.zh.md +197 -0
- package/dsh-docs/cookbook/adding-a-session-format-version.md +109 -0
- package/dsh-docs/cookbook/adding-a-session-format-version.zh.md +109 -0
- package/dsh-docs/cookbook/adding-a-settings-card.md +102 -0
- package/dsh-docs/cookbook/adding-a-settings-card.zh.md +102 -0
- package/dsh-docs/cookbook/adding-a-tool.md +101 -0
- package/dsh-docs/cookbook/adding-a-tool.zh.md +103 -0
- package/dsh-docs/cookbook/adding-a-vendored-package.md +59 -0
- package/dsh-docs/cookbook/adding-a-vendored-package.zh.md +59 -0
- package/dsh-docs/cookbook/adding-an-llm-adapter.md +43 -0
- package/dsh-docs/cookbook/adding-an-llm-adapter.zh.md +43 -0
- package/dsh-docs/cookbook/extension-cookbook.md +132 -0
- package/dsh-docs/cookbook/extension-cookbook.zh.md +136 -0
- package/dsh-docs/cookbook/maintaining-dsh-code-review.md +64 -0
- package/dsh-docs/cookbook/maintaining-dsh-code-review.zh.md +64 -0
- package/dsh-docs/cookbook/responding-to-pr-review-on-a-stack.md +32 -0
- package/dsh-docs/cookbook/responding-to-pr-review-on-a-stack.zh.md +32 -0
- package/dsh-docs/cordis-api/context.md +364 -0
- package/dsh-docs/cordis-api/context.zh.md +366 -0
- package/dsh-docs/cordis-api/events.md +207 -0
- package/dsh-docs/cordis-api/events.zh.md +209 -0
- package/dsh-docs/cordis-api/fiber.md +375 -0
- package/dsh-docs/cordis-api/fiber.zh.md +377 -0
- package/dsh-docs/cordis-api/inherited.md +39 -0
- package/dsh-docs/cordis-api/registry.md +152 -0
- package/dsh-docs/cordis-api/registry.zh.md +154 -0
- package/dsh-docs/cordis-api/service.md +102 -0
- package/dsh-docs/cordis-api/service.zh.md +104 -0
- package/dsh-docs/cordis-primer.md +45 -0
- package/dsh-docs/cordis-primer.zh.md +51 -0
- package/dsh-docs/cordis-tutorial/01-first-plugin.md +95 -0
- package/dsh-docs/cordis-tutorial/01-first-plugin.zh.md +95 -0
- package/dsh-docs/cordis-tutorial/02-lifecycle-and-effects.md +98 -0
- package/dsh-docs/cordis-tutorial/02-lifecycle-and-effects.zh.md +98 -0
- package/dsh-docs/cordis-tutorial/03-services.md +98 -0
- package/dsh-docs/cordis-tutorial/03-services.zh.md +98 -0
- package/dsh-docs/cordis-tutorial/04-events.md +144 -0
- package/dsh-docs/cordis-tutorial/04-events.zh.md +144 -0
- package/dsh-docs/cordis-tutorial/05-config.md +84 -0
- package/dsh-docs/cordis-tutorial/05-config.zh.md +84 -0
- package/dsh-docs/cordis-tutorial/06-composition-and-hmr.md +113 -0
- package/dsh-docs/cordis-tutorial/06-composition-and-hmr.zh.md +113 -0
- package/dsh-docs/cordis-tutorial/07-into-the-harness.md +108 -0
- package/dsh-docs/cordis-tutorial/07-into-the-harness.zh.md +108 -0
- package/dsh-docs/cordis-tutorial/index.md +60 -0
- package/dsh-docs/cordis-tutorial/index.zh.md +62 -0
- package/dsh-docs/deepseek-llm-api-wire-extensions.md +163 -0
- package/dsh-docs/deepseek-llm-api-wire-extensions.zh.md +163 -0
- package/dsh-docs/defensive-patterns.md +33 -0
- package/dsh-docs/defensive-patterns.zh.md +35 -0
- package/dsh-docs/development.md +167 -0
- package/dsh-docs/development.zh.md +173 -0
- package/dsh-docs/event-producer-consumer.md +86 -0
- package/dsh-docs/event-producer-consumer.zh.md +88 -0
- package/dsh-docs/glossary.md +45 -0
- package/dsh-docs/glossary.zh.md +45 -0
- package/dsh-docs/graph-atlas.md +22 -0
- package/dsh-docs/graph-atlas.zh.md +24 -0
- package/dsh-docs/i18n/README.md +60 -0
- package/dsh-docs/i18n/README.zh.md +62 -0
- package/dsh-docs/i18n/style-samples.md +87 -0
- package/dsh-docs/i18n/terminology.md +214 -0
- package/dsh-docs/i18n/translation-prompt.md +263 -0
- package/dsh-docs/i18n/translation-rules.md +69 -0
- package/dsh-docs/i18n/translation-rules.zh.md +69 -0
- package/dsh-docs/module-graph.md +1411 -0
- package/dsh-docs/module-graph.zh.md +1413 -0
- package/dsh-docs/persistence-catalog.md +1075 -0
- package/dsh-docs/persistence-catalog.zh.md +1077 -0
- package/dsh-docs/postmortem/0001-acp-default-export-drops-inject.md +113 -0
- package/dsh-docs/postmortem/0001-acp-default-export-drops-inject.zh.md +113 -0
- package/dsh-docs/postmortem/0002-js-expression-disabled-filesystem-tools.md +47 -0
- package/dsh-docs/postmortem/0002-js-expression-disabled-filesystem-tools.zh.md +47 -0
- package/dsh-docs/postmortem/0003-web-agent-gui-feedback-loop.md +53 -0
- package/dsh-docs/postmortem/0003-web-agent-gui-feedback-loop.zh.md +53 -0
- package/dsh-docs/postmortem/0004-landlock-partial-notice-misclassified-child-failures.md +55 -0
- package/dsh-docs/postmortem/0004-landlock-partial-notice-misclassified-child-failures.zh.md +55 -0
- package/dsh-docs/postmortem/README.md +18 -0
- package/dsh-docs/postmortem/README.zh.md +18 -0
- package/dsh-docs/rescope.md +53 -0
- package/dsh-docs/rescope.zh.md +53 -0
- package/dsh-docs/session-format-status.md +47 -0
- package/dsh-docs/session-format-status.zh.md +47 -0
- package/dsh-docs/subsystems/README.md +61 -0
- package/dsh-docs/subsystems/README.zh.md +61 -0
- package/dsh-docs/subsystems/agent-team.md +207 -0
- package/dsh-docs/subsystems/agent-team.zh.md +207 -0
- package/dsh-docs/subsystems/approval.md +170 -0
- package/dsh-docs/subsystems/approval.zh.md +170 -0
- package/dsh-docs/subsystems/attachment.md +351 -0
- package/dsh-docs/subsystems/attachment.zh.md +351 -0
- package/dsh-docs/subsystems/client-modules.md +168 -0
- package/dsh-docs/subsystems/client-modules.zh.md +168 -0
- package/dsh-docs/subsystems/client-resources.md +91 -0
- package/dsh-docs/subsystems/client-resources.zh.md +91 -0
- package/dsh-docs/subsystems/code-runtime.md +195 -0
- package/dsh-docs/subsystems/code-runtime.zh.md +195 -0
- package/dsh-docs/subsystems/commands.md +219 -0
- package/dsh-docs/subsystems/commands.zh.md +219 -0
- package/dsh-docs/subsystems/compaction.md +238 -0
- package/dsh-docs/subsystems/compaction.zh.md +238 -0
- package/dsh-docs/subsystems/conversation.md +258 -0
- package/dsh-docs/subsystems/conversation.zh.md +258 -0
- package/dsh-docs/subsystems/core.md +1209 -0
- package/dsh-docs/subsystems/core.zh.md +1219 -0
- package/dsh-docs/subsystems/credentials.md +329 -0
- package/dsh-docs/subsystems/credentials.zh.md +329 -0
- package/dsh-docs/subsystems/extensions.md +382 -0
- package/dsh-docs/subsystems/extensions.zh.md +382 -0
- package/dsh-docs/subsystems/feedback.md +266 -0
- package/dsh-docs/subsystems/feedback.zh.md +266 -0
- package/dsh-docs/subsystems/filesystem.md +505 -0
- package/dsh-docs/subsystems/filesystem.zh.md +505 -0
- package/dsh-docs/subsystems/goal.md +277 -0
- package/dsh-docs/subsystems/goal.zh.md +277 -0
- package/dsh-docs/subsystems/invariants.md +88 -0
- package/dsh-docs/subsystems/invariants.zh.md +88 -0
- package/dsh-docs/subsystems/jobs.md +290 -0
- package/dsh-docs/subsystems/jobs.zh.md +290 -0
- package/dsh-docs/subsystems/llm-streaming.md +1080 -0
- package/dsh-docs/subsystems/llm-streaming.zh.md +1086 -0
- package/dsh-docs/subsystems/lsp.md +202 -0
- package/dsh-docs/subsystems/lsp.zh.md +202 -0
- package/dsh-docs/subsystems/permission-presets.md +131 -0
- package/dsh-docs/subsystems/permission-presets.zh.md +131 -0
- package/dsh-docs/subsystems/persistence.md +395 -0
- package/dsh-docs/subsystems/persistence.zh.md +395 -0
- package/dsh-docs/subsystems/plan.md +87 -0
- package/dsh-docs/subsystems/plan.zh.md +87 -0
- package/dsh-docs/subsystems/sandbox.md +220 -0
- package/dsh-docs/subsystems/sandbox.zh.md +220 -0
- package/dsh-docs/subsystems/schedule.md +192 -0
- package/dsh-docs/subsystems/schedule.zh.md +192 -0
- package/dsh-docs/subsystems/scope.md +59 -0
- package/dsh-docs/subsystems/scope.zh.md +59 -0
- package/dsh-docs/subsystems/session-projection.md +354 -0
- package/dsh-docs/subsystems/session-projection.zh.md +354 -0
- package/dsh-docs/subsystems/session-query.md +509 -0
- package/dsh-docs/subsystems/session-query.zh.md +509 -0
- package/dsh-docs/subsystems/session-reference.md +219 -0
- package/dsh-docs/subsystems/session-reference.zh.md +219 -0
- package/dsh-docs/subsystems/session-telemetry.md +194 -0
- package/dsh-docs/subsystems/session-telemetry.zh.md +194 -0
- package/dsh-docs/subsystems/session-title.md +204 -0
- package/dsh-docs/subsystems/session-title.zh.md +204 -0
- package/dsh-docs/subsystems/session.md +1155 -0
- package/dsh-docs/subsystems/session.zh.md +1159 -0
- package/dsh-docs/subsystems/settings.md +405 -0
- package/dsh-docs/subsystems/settings.zh.md +405 -0
- package/dsh-docs/subsystems/shell.md +303 -0
- package/dsh-docs/subsystems/shell.zh.md +303 -0
- package/dsh-docs/subsystems/sidebar-right.md +148 -0
- package/dsh-docs/subsystems/sidebar-right.zh.md +148 -0
- package/dsh-docs/subsystems/skills.md +354 -0
- package/dsh-docs/subsystems/skills.zh.md +354 -0
- package/dsh-docs/subsystems/slots.md +175 -0
- package/dsh-docs/subsystems/slots.zh.md +175 -0
- package/dsh-docs/subsystems/spill.md +117 -0
- package/dsh-docs/subsystems/spill.zh.md +117 -0
- package/dsh-docs/subsystems/storage.md +260 -0
- package/dsh-docs/subsystems/storage.zh.md +260 -0
- package/dsh-docs/subsystems/subagent.md +766 -0
- package/dsh-docs/subsystems/subagent.zh.md +770 -0
- package/dsh-docs/subsystems/subprocess.md +324 -0
- package/dsh-docs/subsystems/subprocess.zh.md +324 -0
- package/dsh-docs/subsystems/system-prompt.md +220 -0
- package/dsh-docs/subsystems/system-prompt.zh.md +220 -0
- package/dsh-docs/subsystems/terminal.md +184 -0
- package/dsh-docs/subsystems/terminal.zh.md +184 -0
- package/dsh-docs/subsystems/todo.md +32 -0
- package/dsh-docs/subsystems/todo.zh.md +32 -0
- package/dsh-docs/subsystems/token-meter.md +105 -0
- package/dsh-docs/subsystems/token-meter.zh.md +105 -0
- package/dsh-docs/subsystems/tools.md +720 -0
- package/dsh-docs/subsystems/tools.zh.md +720 -0
- package/dsh-docs/subsystems/typert.md +343 -0
- package/dsh-docs/subsystems/typert.zh.md +343 -0
- package/dsh-docs/subsystems/user-questions.md +178 -0
- package/dsh-docs/subsystems/user-questions.zh.md +178 -0
- package/dsh-docs/subsystems/web-client.md +95 -0
- package/dsh-docs/subsystems/web-client.zh.md +95 -0
- package/dsh-docs/subsystems/web-server.md +154 -0
- package/dsh-docs/subsystems/web-server.zh.md +154 -0
- package/dsh-docs/subsystems/web.md +206 -0
- package/dsh-docs/subsystems/web.zh.md +206 -0
- package/dsh-docs/subsystems/webhook.md +70 -0
- package/dsh-docs/subsystems/webhook.zh.md +70 -0
- package/dsh-docs/subsystems/workflow.md +278 -0
- package/dsh-docs/subsystems/workflow.zh.md +278 -0
- package/dsh-docs/subsystems/workspace.md +321 -0
- package/dsh-docs/subsystems/workspace.zh.md +321 -0
- package/dsh-docs/testing.md +54 -0
- package/dsh-docs/testing.zh.md +54 -0
- package/dsh-docs/tool-catalog.md +2225 -0
- package/dsh-docs/tool-catalog.zh.md +2233 -0
- package/dsh-docs/tool-execution-pipeline.md +62 -0
- package/dsh-docs/tool-execution-pipeline.zh.md +64 -0
- package/dsh-docs/user/develop/basic/config.md +106 -0
- package/dsh-docs/user/develop/basic/config.zh.md +106 -0
- package/dsh-docs/user/develop/basic/index.md +144 -0
- package/dsh-docs/user/develop/basic/index.zh.md +144 -0
- package/dsh-docs/user/develop/basic/publish.md +183 -0
- package/dsh-docs/user/develop/basic/publish.zh.md +183 -0
- package/dsh-docs/user/develop/basic/tool.md +52 -0
- package/dsh-docs/user/develop/basic/tool.zh.md +52 -0
- package/dsh-docs/user/develop/framework/events.md +143 -0
- package/dsh-docs/user/develop/framework/events.zh.md +143 -0
- package/dsh-docs/user/develop/framework/index.md +137 -0
- package/dsh-docs/user/develop/framework/index.zh.md +137 -0
- package/dsh-docs/user/develop/framework/service.md +148 -0
- package/dsh-docs/user/develop/framework/service.zh.md +150 -0
- package/dsh-docs/user/develop/practice/dynamic-cordis.md +15 -0
- package/dsh-docs/user/develop/practice/dynamic-cordis.zh.md +15 -0
- package/dsh-docs/user/develop/practice/index.md +155 -0
- package/dsh-docs/user/develop/practice/index.zh.md +155 -0
- package/dsh-docs/user/develop/practice/llm-adapter.md +189 -0
- package/dsh-docs/user/develop/practice/llm-adapter.zh.md +189 -0
- package/dsh-docs/user/guide/github-review.md +102 -0
- package/dsh-docs/user/guide/github-review.zh.md +102 -0
- package/dsh-docs/user/guide/index.md +30 -0
- package/dsh-docs/user/guide/index.zh.md +30 -0
- package/dsh-docs/user/guide/mcp-memory.md +101 -0
- package/dsh-docs/user/guide/mcp-memory.zh.md +101 -0
- package/dsh-docs/user/guide/network-proxy.md +85 -0
- package/dsh-docs/user/guide/network-proxy.zh.md +85 -0
- package/dsh-docs/user/guide/providers.md +190 -0
- package/dsh-docs/user/guide/providers.zh.md +190 -0
- package/dsh-docs/user/guide/python-sdk.md +150 -0
- package/dsh-docs/user/guide/python-sdk.zh.md +150 -0
- package/dsh-docs/user/guide/schedule.md +21 -0
- package/dsh-docs/user/guide/schedule.zh.md +21 -0
- package/dsh-docs/user/index.md +11 -0
- package/dsh-docs/user/index.zh.md +11 -0
- package/dsh-docs/web-styling.md +29 -0
- package/dsh-docs/web-styling.zh.md +29 -0
- package/eval-description.md +33 -0
- package/lib/client/index.js +327 -88
- package/lib/fs-aware/sandbox-plugin.d.ts +71 -0
- package/lib/fs-aware/sandbox-plugin.js +249 -0
- package/lib/index.d.ts +22 -22
- package/lib/index.js +3095 -3204
- package/lib/lsp-server-registry-DkaYmTwt.js +972 -0
- package/lib/lsp-server-registry-_hk-Wcia.js +3 -0
- package/lib/py-sdk-Chvy92MB.js +178 -0
- package/lib/py-sdk.d.ts +19 -2
- package/lib/py-sdk.js +2 -2
- package/lib/wrap-JFjcWwZf.js +747 -0
- package/package.json +9 -3
- package/url-schemes-instruction.md +22 -0
- package/control-prompt.md +0 -37
- package/docs/50_test-reports/v0.1.8d_artifacts/README.md +0 -138
- package/docs/50_test-reports/v0.1.8d_artifacts/code-mode-repl-only.observation.md +0 -74
- package/docs/50_test-reports/v0.1.8d_artifacts/dsh-session-session-4a293388-9ae1-474b-87a0-9e17bb556d94.jsonl +0 -3890
- package/docs/50_test-reports/v0.1.8d_artifacts/dsh-session-session-4a293388-9ae1-474b-87a0-9e17bb556d94.w-sample-0435.jsonl +0 -544
- package/docs/50_test-reports/v0.1.8d_artifacts/functions.json +0 -592
- package/docs/50_test-reports/v0.1.8d_artifacts/skills-catalog.snapshot.md +0 -30
- package/docs/50_test-reports/v0.1.8d_artifacts/tools-sdk.output-schemas.json +0 -1236
- package/docs/50_test-reports/v0.1.8d_artifacts/tools-sdk.python.txt +0 -592
- package/docs/50_test-reports/v0.1.8d_artifacts/tools-sdk.typescript.txt +0 -516
- package/docs/50_test-reports/v0.1.8d_artifacts/wire-vs-transcription.diff.md +0 -54
- package/docs/50_test-reports/v0.2.0b_artifacts/f2probe/Cargo.lock +0 -7
- package/docs/50_test-reports/v0.2.0b_artifacts/f2probe/Cargo.toml +0 -6
- package/docs/50_test-reports/v0.2.0b_artifacts/f2probe/src/bin/messy.rs +0 -8
- package/docs/50_test-reports/v0.2.0b_artifacts/f2probe/src/main.rs +0 -4
- package/docs/50_test-reports/v0.2.0b_artifacts/hashline-probe.md +0 -5
- package/docs/50_test-reports/v0.2.0b_artifacts/slowprobe/Cargo.lock +0 -7
- package/docs/50_test-reports/v0.2.0b_artifacts/slowprobe/Cargo.toml +0 -7
- package/docs/50_test-reports/v0.2.0b_artifacts/slowprobe/build.rs +0 -4
- package/docs/50_test-reports/v0.2.0b_artifacts/slowprobe/src/main.rs +0 -13
- package/docs/60_exploration-and-research/cordis-research.md +0 -350
- package/docs/60_exploration-and-research/dsh-web-profile-package-map.md +0 -186
- package/docs/60_exploration-and-research/dsh-web-ui-slot-system-research.md +0 -310
- package/docs/60_exploration-and-research/dsh-webui-strip-boundary-research.md +0 -300
- package/docs/60_exploration-and-research/ios-chat-app-bridge-research.md +0 -324
- package/docs/60_exploration-and-research/web-frontend-composability-research.md +0 -191
- package/docs/REPL-/345/267/245/345/205/267/350/260/203/347/224/250-/346/210/252/346/226/255/350/257/212/346/226/255.md +0 -110
- package/docs/adr/0001-bridge-tool-layer-not-service-layer.md +0 -14
- package/docs/adr/0002-masking-is-presentation-only.md +0 -15
- package/docs/plans/A2A-messaging-channel-test-archive.md +0 -256
- package/docs/plans/code-mode-vs-rlm-ipython-comparison.md +0 -137
- package/docs/plans/dashr-blueprint-review.md +0 -201
- package/docs/plans/dashr-blueprint.md +0 -561
- package/docs/plans/dashr-compaction-window-and-archive.md +0 -307
- package/docs/plans/dashr-profile-layer-feasibility.md +0 -367
- package/docs/plans/dashr-sandbox-escalation-semantics-gap.md +0 -171
- package/docs/plans/dashr-security-sandbox-analysis.md +0 -187
- package/docs/plans/dashr-surface-invariant-and-omp-imports.md +0 -97
- package/docs/plans/ipython-kernel-interactive-interface-test-report.md +0 -152
- package/docs/plans/kernel-refactoring/Dash-IPython-Control-Prompt-draft.md +0 -146
- package/docs/plans/kernel-refactoring/Dash-IPython-Control-Prompt-draft_v3.md +0 -50
- package/docs/plans/kernel-refactoring/Dash-IPython-Control-Prompt-draft_v4.md +0 -79
- package/docs/plans/kernel-refactoring/Dash-vs-PrimeAgent-systemprompt-toolcatalog-comparison.md +0 -138
- package/docs/plans/kernel-refactoring/RLM-system-prompt-injection-gap-report.md +0 -161
- package/docs/plans/kernel-refactoring/V0.1.5-development-plan.md +0 -109
- package/docs/plans/kernel-refactoring/actinoable-surface-to-llm-in-agent-runtime_dsh.md +0 -50
- package/docs/plans/kernel-refactoring/actinoable-surface-to-llm-in-agent-runtime_prime.md +0 -113
- package/docs/plans/recallable-compaction.md +0 -147
- package/docs/plans/spike-tag-repro.mjs +0 -102
- package/docs/plans/upstream-analysis.md +0 -128
- package/docs/v0.1.8-improved-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -142
- package/docs/v0.1.8-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -193
- package/docs/v0.1.8b-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -96
- package/docs/v0.1.8c-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -127
- package/docs/v0.1.8d-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -150
- package/docs/v0.1.8d_artifacts/README.md +0 -138
- package/docs/v0.1.8d_artifacts/code-mode-repl-only.observation.md +0 -74
- package/docs/v0.1.8d_artifacts/dsh-session-session-4a293388-9ae1-474b-87a0-9e17bb556d94.jsonl +0 -3890
- package/docs/v0.1.8d_artifacts/dsh-session-session-4a293388-9ae1-474b-87a0-9e17bb556d94.w-sample-0435.jsonl +0 -544
- package/docs/v0.1.8d_artifacts/functions.json +0 -592
- package/docs/v0.1.8d_artifacts/skills-catalog.snapshot.md +0 -30
- package/docs/v0.1.8d_artifacts/tools-sdk.output-schemas.json +0 -1236
- package/docs/v0.1.8d_artifacts/tools-sdk.python.txt +0 -592
- package/docs/v0.1.8d_artifacts/tools-sdk.typescript.txt +0 -516
- package/docs/v0.1.8d_artifacts/wire-vs-transcription.diff.md +0 -54
- package/docs/v0.1.8e-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -224
- package/docs/v0.1.9a-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -168
- package/docs/v0.2.0b-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -123
- package/docs/v0.2.0b_artifacts/f2probe/Cargo.lock +0 -7
- package/docs/v0.2.0b_artifacts/f2probe/Cargo.toml +0 -6
- package/docs/v0.2.0b_artifacts/f2probe/src/bin/messy.rs +0 -8
- package/docs/v0.2.0b_artifacts/f2probe/src/main.rs +0 -4
- package/docs/v0.2.0b_artifacts/hashline-probe.md +0 -5
- package/docs/v0.2.0b_artifacts/slowprobe/Cargo.lock +0 -7
- package/docs/v0.2.0b_artifacts/slowprobe/Cargo.toml +0 -7
- package/docs/v0.2.0b_artifacts/slowprobe/build.rs +0 -4
- package/docs/v0.2.0b_artifacts/slowprobe/src/main.rs +0 -13
- package/docs/v0.2.1-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -110
- package/docs/v0.2.1b-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -86
- package/docs/v0.2.1c-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -66
- package/lib/py-sdk-BCaOGYz7.d.ts +0 -125
- package/lib/py-sdk-CbgYiX8O.js +0 -691
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Maintaining the dsh-code-review skill
|
|
2
|
+
|
|
3
|
+
English | [中文](maintaining-dsh-code-review.zh.md)
|
|
4
|
+
|
|
5
|
+
The [`dsh-code-review`](../../.agents/skills/dsh-code-review/SKILL.md) skill is kept current by a single designated operator running a private periodic maintenance tool. This cookbook is the entry point for that operator — and for anyone taking over the role — and for repo contributors who want to understand why skill updates arrive as small periodic PRs rather than one-off audits. The workflow itself is specified in the [human-review skill-maintenance Agent Note](../../.agents/notes/proposed/process/2026-07-13-human-review-skill-maintenance.md).
|
|
6
|
+
|
|
7
|
+
## What the maintainer receives
|
|
8
|
+
|
|
9
|
+
The operator invokes the wrapper manually, daily with a two-UTC-day overlap; a manual weekly recovery run uses a seven-day window. The workflow:
|
|
10
|
+
|
|
11
|
+
1. It selects PRs merged in the chosen window (default two UTC days for the daily cadence, seven for weekly) whose merge commit is reachable from `origin/master`. PRs whose merge commit is not reachable (stacked branches whose parent was squashed) or that exceed a 250-commit acquisition cap are logged to `skipped-pulls.json` and skipped rather than aborting the run.
|
|
12
|
+
2. It collects pre-merge human review feedback with commit anchors (inline comments and review submissions), then compares feedback-time and final landed PR patches. It does not acquire PR conversation comments because current GitHub state cannot give them a force-push-safe feedback-time baseline, and it excludes target-branch-only changes from adoption evidence.
|
|
13
|
+
3. Two independently configured reviewer adapters classify who wrote each item and whether the change adopted it, then classify agreed-adopted items against the current skill.
|
|
14
|
+
4. The primary adapter drafts a complete revised `SKILL.md`; both adapters review the same diff; blocking findings loop until both approve.
|
|
15
|
+
5. `pnpm run doc-sync` and `pnpm run lint` run against the candidate before the tool declares success.
|
|
16
|
+
|
|
17
|
+
Each run stores its artifacts on the operator's machine. The saved diff, candidate `SKILL.md`, and promotion manifest land under `~/dsh-code-review-outputs/` named by timestamp. The manifest records the source master commit and skill blob, source feedback IDs and URLs, landed evidence ranges, adapter verdicts, and gate results; raw per-adapter I/O stays in a private temp directory whose path is written to the notification and to the daily log under `~/Library/Logs/dsh-code-review-maintainer/`. The maintenance worktree itself is restored clean after every run so the operator is never tempted to edit the maintenance copy in place.
|
|
18
|
+
|
|
19
|
+
## What the operator does with a candidate diff
|
|
20
|
+
|
|
21
|
+
When a run produces a candidate, a macOS notification arrives with a `dsh-code-review-promote <timestamp>` hint.
|
|
22
|
+
|
|
23
|
+
1. **Read the diff on its own merits.** Do not defer to "the reviewers approved"; the maintainer contract is that the operator makes the final decision. Look for checklist bloat, historical prose, unsupported extrapolation from a single incident, and duplicated coverage with existing skill or authoritative-doc content.
|
|
24
|
+
|
|
25
|
+
```sh
|
|
26
|
+
ls ~/dsh-code-review-outputs/ # every candidate ever produced
|
|
27
|
+
less ~/dsh-code-review-outputs/2026-07-16T02-00-00Z.diff
|
|
28
|
+
less ~/dsh-code-review-outputs/2026-07-16T02-00-00Z.SKILL.md
|
|
29
|
+
less ~/dsh-code-review-outputs/2026-07-16T02-00-00Z.manifest.json
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
2. **Cross-check against the run artifacts.** The promotion manifest maps each proposed rule to source feedback and landed evidence; detailed per-adapter I/O, consensus, and adopted evidence live under the run's private temp directory (path shown in the log). Spot-check at least one candidate: does the linked human comment actually support the added rule? Does the linked PR actually adopt it?
|
|
33
|
+
|
|
34
|
+
3. **Decide one of three:**
|
|
35
|
+
- **Discard.** Delete the saved candidate. The tool re-considers the same feedback on the next run under whatever the current skill then says.
|
|
36
|
+
|
|
37
|
+
```sh
|
|
38
|
+
rm ~/dsh-code-review-outputs/2026-07-16T02-00-00Z.{diff,SKILL.md,manifest.json}
|
|
39
|
+
```
|
|
40
|
+
- **Batch.** Keep the candidate aside if the update is small and could combine with a future one. The source-skill check still applies; rerun the analysis or manually rebase and re-review the diff if `master` changes first.
|
|
41
|
+
- **Promote.** From a clean `master` checkout of the repo, run the promote helper. It refreshes `master`, verifies that the current skill matches the recorded source blob, applies the saved diff, and opens a draft PR whose body lists the source feedback URLs or IDs, landed commit range, originating run, checks, and operator edits. It stops on skill drift rather than overwriting newer guidance; the operator still reviews the PR on GitHub and either merges it or closes it.
|
|
42
|
+
|
|
43
|
+
```sh
|
|
44
|
+
cd ~/path/to/deepseek-harness # clean master
|
|
45
|
+
dsh-code-review-promote 2026-07-16T02-00-00Z
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
4. **Do not commit adapter output verbatim.** Small edits during promotion — tightening wording, removing an example that only makes sense with the source PR's context, folding a rule into an existing one — are expected and preserve the "reviewer judgment" the workflow depends on. Amend the branch before merging.
|
|
49
|
+
|
|
50
|
+
## When a run produces no candidate
|
|
51
|
+
|
|
52
|
+
That is the common case after every nonempty classification stage has produced at least one valid adapter result. The tool records "no candidate" in its daily log, sends no notification (to avoid alert fatigue), and moves on. Days without a skill update are the workflow behaving correctly, not a stall.
|
|
53
|
+
|
|
54
|
+
## Interruptions and handoff
|
|
55
|
+
|
|
56
|
+
The mechanism lives on one machine. Interruptions the operator handles as they arise:
|
|
57
|
+
|
|
58
|
+
- **Daily run missed.** The two-day overlap window catches one skipped day automatically; longer gaps recover by running the wrapper manually with `DSH_CODE_REVIEW_SINCE=<Nd>`. Overlapping windows are idempotent: guidance already in the current skill is classified `covered` and does not re-enter as a candidate.
|
|
59
|
+
- **Adapter provider outage.** The tool refuses to run when the two reviewer commands resolve to byte-identical executables. A single batch whose adapter response fails schema or id validation is failed closed at the batch level (every item in the batch marked unclear) and the run continues; the raw output is preserved for debugging. If either adapter produces no valid result for any nonempty batch in an operation, the run fails, writes a failure record, and notifies the operator; it never collapses a total-provider outage into "no candidate."
|
|
60
|
+
- **Handoff to another maintainer.** Open a follow-up Agent Note that supersedes the current one: either move the mechanism into the repository or record the new operator's private setup. Do not silently transfer the tool — the "single-maintainer bus factor" in the Agent Note's Risks section is the reason the handoff needs a documented decision.
|
|
61
|
+
|
|
62
|
+
## Where the operator's private setup lives
|
|
63
|
+
|
|
64
|
+
The tool source, reviewer adapters, provider credentials, and scheduler are the operator's private infrastructure and are outside this repository by design (see the Agent Note's "Where the mechanism lives" section). This cookbook and the Agent Note describe **what the workflow guarantees**; **how** those guarantees are implemented is a private-infrastructure concern. If you are the new operator, the Agent Note's `## Proposal` sections are the specification you build against.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# 维护 dsh-code-review skill
|
|
2
|
+
|
|
3
|
+
[English](maintaining-dsh-code-review.md) | 中文
|
|
4
|
+
|
|
5
|
+
[`dsh-code-review`](../../.agents/skills/dsh-code-review/SKILL.md) skill(技能)由一名指定操作员通过私有的周期维护工具持续更新。本实操手册既是该操作员和接任者的入口,也帮助仓库贡献者理解为何 skill 更新会以小型周期 PR(Pull Request)的形式出现,而不是一次性审计。工作流本身由[人工评审 skill 维护 Agent Note](../../.agents/notes/proposed/process/2026-07-13-human-review-skill-maintenance.zh.md)规定。
|
|
6
|
+
|
|
7
|
+
## 维护者会收到什么
|
|
8
|
+
|
|
9
|
+
操作员每天手动调用包装脚本,并使用 2 个 UTC 日的重叠窗口;每周手动恢复运行使用 7 日窗口。工作流会:
|
|
10
|
+
|
|
11
|
+
1. 选择指定窗口内合并、且合并 commit 可从 `origin/master` 到达的 PR(每天运行默认选择 2 个 UTC 日,每周运行选择 7 日)。合并 commit 无法到达的 PR(例如父分支被 squash 的堆叠分支),或超出 250 个 commit 获取上限的 PR,会记录到 `skipped-pulls.json` 并跳过,不会中止本次运行。
|
|
12
|
+
2. 收集合并前带 commit 锚点的人工评审反馈(行内评论和评审提交),然后比较反馈时与最终落地的 PR patch。它不获取 PR 会话评论,因为 GitHub 当前状态无法为这些评论提供可抵抗 force-push 的反馈时基线;它也不会把只存在于目标分支的变更作为采纳证据。
|
|
13
|
+
3. 两个独立配置的评审适配器先对每个条目的作者以及更改是否采纳了它进行分类,再根据当前 skill 对双方一致认定已采纳的条目分类。
|
|
14
|
+
4. 主适配器起草完整修订版 `SKILL.md`;两个适配器评审同一份 diff;只要仍有阻塞性问题,循环就会继续,直到双方批准。
|
|
15
|
+
5. 工具声明成功前,会针对候选版本运行 `pnpm run doc-sync` 和 `pnpm run lint`。
|
|
16
|
+
|
|
17
|
+
每次运行都把产物保存在操作员的机器上。保存的 diff、候选 `SKILL.md` 和提升 manifest(元数据清单)按时间戳命名,存放在 `~/dsh-code-review-outputs/` 下。manifest 记录源 master commit 与 skill blob、源反馈 ID 和 URL、已落地证据范围、适配器裁决和门禁结果;每个适配器的原始 I/O 留在私有临时目录中,该目录路径会写入通知和 `~/Library/Logs/dsh-code-review-maintainer/` 下的每日日志。维护 worktree 在每次运行后都会恢复为干净状态,避免操作员直接在维护副本中编辑。
|
|
18
|
+
|
|
19
|
+
## 操作员如何处理候选 diff
|
|
20
|
+
|
|
21
|
+
某次运行产出候选版本时,macOS 会发出一条带 `dsh-code-review-promote <timestamp>` 提示的通知。
|
|
22
|
+
|
|
23
|
+
1. **根据 diff 本身作出判断。** 不要因为「评审者已经批准」就直接接受;维护者约定规定由操作员作出最终决定。检查清单是否膨胀、是否有历史叙述、是否根据单次事件作出无依据的外推,以及是否与现有 skill 或权威文档重复。
|
|
24
|
+
|
|
25
|
+
```sh
|
|
26
|
+
ls ~/dsh-code-review-outputs/ # every candidate ever produced
|
|
27
|
+
less ~/dsh-code-review-outputs/2026-07-16T02-00-00Z.diff
|
|
28
|
+
less ~/dsh-code-review-outputs/2026-07-16T02-00-00Z.SKILL.md
|
|
29
|
+
less ~/dsh-code-review-outputs/2026-07-16T02-00-00Z.manifest.json
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
2. **与运行产物交叉核验。** 提升 manifest 会把每条拟议规则映射到源反馈和已落地证据;每个适配器的详细 I/O、共识和采纳证据位于本次运行的私有临时目录中(路径见日志)。至少抽查一个候选项:链接的人工评论是否确实支持新增规则?链接的 PR 是否确实采纳了它?
|
|
33
|
+
|
|
34
|
+
3. **从三种处理方式中选择一种:**
|
|
35
|
+
- **丢弃。** 删除保存的候选版本。下一次运行会依据届时的当前 skill,重新考虑同一份反馈。
|
|
36
|
+
|
|
37
|
+
```sh
|
|
38
|
+
rm ~/dsh-code-review-outputs/2026-07-16T02-00-00Z.{diff,SKILL.md,manifest.json}
|
|
39
|
+
```
|
|
40
|
+
- **留待成批处理。** 如果更新很小,可以把候选版本留待与后续版本合并。源 skill 检查仍然适用;如果 `master` 先发生变化,请重新运行分析,或手动 rebase 并重新评审 diff。
|
|
41
|
+
- **提升。** 在仓库的干净 `master` checkout 中运行提升辅助工具。它会刷新 `master`、验证当前 skill 与记录的源 blob 一致、应用保存的 diff,并创建一份 draft PR,其正文列出原始反馈的 URL 或 ID、已落地的 commit 范围、发起这次更改的运行、检查以及操作员编辑。如果 skill 已发生漂移,它会停止而不是覆盖更新后的指导;操作员仍需在 GitHub 上评审 PR,并选择合并或关闭。
|
|
42
|
+
|
|
43
|
+
```sh
|
|
44
|
+
cd ~/path/to/deepseek-harness # clean master
|
|
45
|
+
dsh-code-review-promote 2026-07-16T02-00-00Z
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
4. **不要逐字提交适配器输出。** 提升过程中可以进行小幅编辑,例如收紧措辞、移除只有结合源 PR 上下文才有意义的示例、把规则并入现有规则。这些编辑是预期行为,也保留了工作流所依赖的「评审者判断」。合并前应在该分支上修订这些改动。
|
|
49
|
+
|
|
50
|
+
## 运行未产出候选版本时
|
|
51
|
+
|
|
52
|
+
只要每个非空分类阶段都至少产生一个有效的适配器结果,这就是常见情况。工具会在每日日志中记录「无候选版本」,不发送通知(避免提醒疲劳),然后继续。某天没有 skill 更新,说明工作流运行正常,而不是停滞。
|
|
53
|
+
|
|
54
|
+
## 中断与交接
|
|
55
|
+
|
|
56
|
+
该机制运行在一台机器上。操作员应随时处理以下中断:
|
|
57
|
+
|
|
58
|
+
- **错过每日运行。** 2 日重叠窗口会自动覆盖一次漏跑;更长的间隔可通过设置 `DSH_CODE_REVIEW_SINCE=<Nd>` 手动运行包装脚本来恢复。重叠窗口具有幂等性:当前 skill 已包含的指导会被归类为 `covered`,不会再次成为候选项。
|
|
59
|
+
- **适配器提供方中断。** 当两个评审命令解析为逐字节相同的可执行文件时,工具会拒绝运行。某个批次的适配器响应未通过 schema 或 ID 校验时,该批次会整体 fail-closed(其中每个条目都标记为不明确),运行则继续;原始输出会保留以便调试。如果任一适配器在某项操作的所有非空批次中都未产生有效结果,本次运行就会失败、写入失败记录并通知操作员;它绝不会把提供方完全中断折叠成「无候选版本」。
|
|
60
|
+
- **交接给另一名维护者。** 新建一篇取代当前记录的后续 Agent Note:要么把机制移入仓库,要么记录新操作员的私有设置。不要暗中转交工具;Agent Note 的风险章节已把「单维护者关键人风险」列为交接必须记录决策的原因。
|
|
61
|
+
|
|
62
|
+
## 操作员的私有设置位于何处
|
|
63
|
+
|
|
64
|
+
工具源代码、评审适配器、提供方凭据和调度器属于操作员的私有基础设施,按设计位于本仓库之外(参见 Agent Note 的「机制位于何处」章节)。本实操手册和 Agent Note 描述的是**工作流保证什么**;这些保证**如何**实现则属于私有基础设施问题。如果你是新操作员,应以 Agent Note 的 `## Proposal` 各节作为实现依据。
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Responding to review across a stacked PR chain
|
|
2
|
+
|
|
3
|
+
English | [中文](responding-to-pr-review-on-a-stack.zh.md)
|
|
4
|
+
|
|
5
|
+
Review comments may target several PRs in a dependent stack (`A ← B ← C …`). Keep that chain linked through GitHub's official stacked-PR feature. This guide owns review-fix placement and propagation; the [dsh-merging-stacked-prs](../../.agents/skills/dsh-merging-stacked-prs/SKILL.md) skill owns linkage checks and landing.
|
|
6
|
+
|
|
7
|
+
## Ground rules
|
|
8
|
+
|
|
9
|
+
1. **One worktree per PR branch.** Each PR's fixes happen in that PR's own worktree; parallel fixes never share a checkout.
|
|
10
|
+
2. **GitHub's stack object is authoritative.** Base branches establish the expected dependency order, while `PullRequest.stack` and `stackEntry.position` prove that GitHub recognizes it. Do not treat a matching branch chain as an official stack without checking those fields.
|
|
11
|
+
3. **A fix lands on the PR that INTRODUCED the issue, then flows up-stack.** When a comment on PR `B` points at code `B` introduced, fix it on `B` and propagate `B` into `C` — even if `C` also carries the file. Originating the fix downstream leaves `B` shipping the unfixed code and hides the fix from `B`'s reviewer.
|
|
12
|
+
4. **Each review fix remains a distinct commit.** A later rebase may change its OID, but do not amend a reviewed fix out of the branch history. Amend only your own not-yet-pushed, not-yet-reviewed work.
|
|
13
|
+
5. **Choose merge-forward or rebase deliberately.** Both histories are allowed after review. A rewritten push must be lease-protected and must abort rather than overwrite a concurrently advanced remote head; raw `--force` is forbidden.
|
|
14
|
+
|
|
15
|
+
## Resolve comments through the stack
|
|
16
|
+
|
|
17
|
+
1. Triage every comment on the merits before acting: verify the claim against the code — a reviewer flagging the right symptom can still misdiagnose the cause.
|
|
18
|
+
2. Map each accepted finding to its originating PR and fix it there.
|
|
19
|
+
3. Propagate the fixed layer through every affected child in order:
|
|
20
|
+
- **Merge-forward:** merge the fixed parent branch into its child, validate the child, and continue upward. Preserve each in-progress checkpoint under the [incremental-retargeting decision](../../.agents/notes/implemented/process/2026-07-26-incremental-pr-base-retargeting.md).
|
|
21
|
+
- **Native cascading rebase:** use `gh stack rebase`, validate the rewritten layers, then publish with `gh stack push`; or use `gh stack sync`, which may publish first and therefore requires immediate post-sync validation under [dsh-pre-push-checks](../../.agents/skills/dsh-pre-push-checks/SKILL.md).
|
|
22
|
+
4. Treat delegated fixes as trust-but-verify: a sub-agent's report describes intent, not necessarily what landed. Re-run the gates yourself on the actual tree, and for a regression guard, prove it FAILS on the unfixed code (introduce the regression, watch red, revert) — a guard that passes both ways guards nothing. A sub-agent that reframes a problem as already handled is a signal to dig in personally.
|
|
23
|
+
5. Reply in the review thread (`gh api repos/{owner}/{repo}/pulls/{pr}/comments/{id}/replies`), not as a top-level comment, stating the fix and the current commit or head that carries it.
|
|
24
|
+
6. After any rewritten push, re-read unresolved threads, approvals, mergeability, and checks. A force-pushed commit OID or outdated inline anchor is not current evidence that the finding remains resolved.
|
|
25
|
+
7. Land only through the official stack procedure. If the PRs are not yet linked, the landing skill automatically links a same-author chain, asks before linking mixed authors, and hard-stops when native stack support is unavailable.
|
|
26
|
+
|
|
27
|
+
## Verify
|
|
28
|
+
|
|
29
|
+
- Every fixed PR's current diff contains the intended correction at the layer that introduced the issue.
|
|
30
|
+
- GraphQL reports one official stack in the expected order, and each child diff against its parent shows only that child's changes.
|
|
31
|
+
- Unresolved threads, approvals, mergeability, and checks were re-audited after every rewritten push.
|
|
32
|
+
- The relevant gates pass on every affected PR in the stack, not just the top.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# 在堆叠 PR 链中回应评审意见
|
|
2
|
+
|
|
3
|
+
[English](responding-to-pr-review-on-a-stack.md) | 中文
|
|
4
|
+
|
|
5
|
+
评审意见可能同时针对一条依赖堆叠(`A ← B ← C …`)中的多个 PR(Pull Request)。请通过 GitHub 官方的堆叠 PR 功能保持这条链的关联。本指南负责评审修复的归属与传播;[dsh-merging-stacked-prs](../../.agents/skills/dsh-merging-stacked-prs/SKILL.md) skill(技能)负责检查关联关系和落地。
|
|
6
|
+
|
|
7
|
+
## 基本规则
|
|
8
|
+
|
|
9
|
+
1. **每个 PR 分支一个 worktree。** 每个 PR 的修复在该 PR 自己的 worktree 中进行;并行修复绝不共享同一个 checkout。
|
|
10
|
+
2. **GitHub 的 stack 对象是权威依据。** base 分支确定预期的依赖顺序,`PullRequest.stack` 和 `stackEntry.position` 则证明 GitHub 已识别该堆叠。未经检查这些字段,不得仅凭分支链吻合就将其视为官方堆叠。
|
|
11
|
+
3. **修复落在引入问题的那个 PR 上,然后沿堆叠向上流动。** 当 PR `B` 上的评论指向 `B` 引入的代码时,在 `B` 上修复,再将 `B` 的变更传播到 `C`,即使 `C` 也包含该文件。把修复发起在下游会导致 `B` 带着未修复的代码交付,并对 `B` 的评审者隐藏修复。
|
|
12
|
+
4. **每项评审修复都保留为独立 commit。** 后续 rebase 可能改变其 OID,但不得通过 amend 把已经评审的修复从分支历史中抹去。只有你自己尚未推送且尚未评审的工作才可以 amend。
|
|
13
|
+
5. **明确选择 merge-forward 或 rebase。** 评审后允许采用这两种历史更新方式。改写历史的推送必须受 lease 保护;如果远端 head 在此期间前移,操作必须中止,不得将其覆盖。禁止直接使用 `--force`。
|
|
14
|
+
|
|
15
|
+
## 沿堆叠解决评审意见
|
|
16
|
+
|
|
17
|
+
1. 在行动之前先就事论事地审视每条评论:对照代码验证其论断——评审者指出了正确的症状,但仍可能误诊原因。
|
|
18
|
+
2. 将每个被接受的发现映射到引入该问题的 PR,并在那里修复。
|
|
19
|
+
3. 将修复后的层按顺序传播到每个受影响的子 PR:
|
|
20
|
+
- **Merge-forward:** 将修复后的父分支合并到其子分支,验证子分支,然后继续沿堆叠向上传播。依照[增量更新 base 的决策](../../.agents/notes/implemented/process/2026-07-26-incremental-pr-base-retargeting.zh.md),保留每个正在处理的检查点。
|
|
21
|
+
- **原生级联 rebase:** 使用 `gh stack rebase`,验证所有已改写的层,然后通过 `gh stack push` 发布;也可以使用 `gh stack sync`,该命令可能先发布,因此必须按照 [dsh-pre-push-checks](../../.agents/skills/dsh-pre-push-checks/SKILL.md) 在同步后立即验证。
|
|
22
|
+
4. 委派的修复需要信任但验证:subagent 的报告描述的是意图,不一定是实际落地的内容。请亲自在实际代码树上重新运行门禁;对于回归守卫,要证明它在未修复的代码上**失败**(引入回归、观察变红、再还原)——两种情况都通过的守卫什么也守不住。subagent 将问题重新定性为「已处理」时,这是一个需要亲自深入的信号。
|
|
23
|
+
5. 在评审线程中回复(`gh api repos/{owner}/{repo}/pulls/{pr}/comments/{id}/replies`),而非发顶层评论;说明修复内容及当前承载修复的 commit 或 head。
|
|
24
|
+
6. 每次改写推送后,都要重新读取未解决线程、批准状态、可合并性和检查结果。经 force-push 改写的 commit OID 或已过时的内联锚点,都不足以证明该发现当前仍处于已解决状态。
|
|
25
|
+
7. 仅可通过官方堆叠流程落地。如果这些 PR 尚未关联,落地 skill 会自动关联作者相同的链;如果作者不同,则先询问用户;如果原生堆叠支持不可用,则硬性停止流程。
|
|
26
|
+
|
|
27
|
+
## 验证
|
|
28
|
+
|
|
29
|
+
- 每个已修复 PR 的当前 diff 都在引入问题的那一层包含预期修正。
|
|
30
|
+
- GraphQL 报告的官方堆叠只有一个且顺序符合预期;每个子 PR 相对于父 PR 的 diff 只显示该子 PR 自身的变更。
|
|
31
|
+
- 每次改写推送后,均重新审计了未解决线程、批准状态、可合并性和检查结果。
|
|
32
|
+
- 相关门禁在堆叠中的每个受影响 PR 上都通过,而不仅仅是顶部。
|
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
<!-- Generated by scripts/gen-cordis-catalog.ts — do not edit by hand.
|
|
2
|
+
Run `pnpm run gen-cordis-catalog` to regenerate. -->
|
|
3
|
+
|
|
4
|
+
# Context
|
|
5
|
+
|
|
6
|
+
The context is the core Cordis object: every service, event, and lifecycle API is reached through `ctx`. Event methods are documented on [Events](events.md), effects and the current fiber on [Fiber](fiber.md), and plugin loading on [Registry](registry.md).
|
|
7
|
+
|
|
8
|
+
Root and child dependency containers for Cordis plugins.
|
|
9
|
+
|
|
10
|
+
A context is a proxy: normal property reads go through the service resolver, while `extend()`, `isolate()`, and `intercept()` create scoped child contexts without mutating their parent.
|
|
11
|
+
|
|
12
|
+
[Source](../../vendor/cordis/src/context.ts#L42)
|
|
13
|
+
|
|
14
|
+
### ctx.extend(meta?)
|
|
15
|
+
|
|
16
|
+
```ts cordis-catalog
|
|
17
|
+
/**
|
|
18
|
+
* Create a child context with extra metadata on top of the current scope.
|
|
19
|
+
*
|
|
20
|
+
* The child prototypally inherits every property of this context; own
|
|
21
|
+
* properties of `meta` shadow the inherited ones. The parent is not mutated.
|
|
22
|
+
*
|
|
23
|
+
* @param meta — own properties (including symbol keys) to define on the child.
|
|
24
|
+
* @returns a child context inheriting from this one.
|
|
25
|
+
*/
|
|
26
|
+
extend(meta = {}): this
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Create a child context with extra metadata on top of the current scope.
|
|
30
|
+
|
|
31
|
+
The child prototypally inherits every property of this context; own properties of `meta` shadow the inherited ones. The parent is not mutated.
|
|
32
|
+
|
|
33
|
+
- `meta` — own properties (including symbol keys) to define on the child.
|
|
34
|
+
|
|
35
|
+
**Returns** a child context inheriting from this one.
|
|
36
|
+
|
|
37
|
+
[Source](../../vendor/cordis/src/context.ts#L99)
|
|
38
|
+
|
|
39
|
+
### ctx.isolate(name, label?)
|
|
40
|
+
|
|
41
|
+
```ts cordis-catalog
|
|
42
|
+
/**
|
|
43
|
+
* Create a child context with an independent service scope for `name`.
|
|
44
|
+
*
|
|
45
|
+
* Below the returned context, reads and writes of the service `name`
|
|
46
|
+
* resolve against the new label instead of the parent's, so a different
|
|
47
|
+
* implementation can be provided without affecting the parent scope.
|
|
48
|
+
* Passing the same `label` to two `isolate()` calls joins their scopes.
|
|
49
|
+
*
|
|
50
|
+
* @param name — the service name to isolate.
|
|
51
|
+
* @param label — scope label to join; defaults to a fresh unique symbol.
|
|
52
|
+
* @returns a child context whose `name` service resolves in the new scope.
|
|
53
|
+
*/
|
|
54
|
+
isolate(name: string, label?: symbol)
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Create a child context with an independent service scope for `name`.
|
|
58
|
+
|
|
59
|
+
Below the returned context, reads and writes of the service `name` resolve against the new label instead of the parent's, so a different implementation can be provided without affecting the parent scope. Passing the same `label` to two `isolate()` calls joins their scopes.
|
|
60
|
+
|
|
61
|
+
- `name` — the service name to isolate.
|
|
62
|
+
- `label` — scope label to join; defaults to a fresh unique symbol.
|
|
63
|
+
|
|
64
|
+
**Returns** a child context whose `name` service resolves in the new scope.
|
|
65
|
+
|
|
66
|
+
[Source](../../vendor/cordis/src/context.ts#L121)
|
|
67
|
+
|
|
68
|
+
### ctx.intercept(name, config)
|
|
69
|
+
|
|
70
|
+
```ts cordis-catalog
|
|
71
|
+
/**
|
|
72
|
+
* Add service-specific intercept config for plugins started below this
|
|
73
|
+
* context.
|
|
74
|
+
*
|
|
75
|
+
* Plugins loaded under the returned context see `config` merged into the
|
|
76
|
+
* service's resolved config (ancestor entries first; see
|
|
77
|
+
* `Service[symbols.resolveConfig]`). The parent context is not affected.
|
|
78
|
+
*
|
|
79
|
+
* @param name — the service name whose config to intercept.
|
|
80
|
+
* @param config — the intercept config to merge for that service.
|
|
81
|
+
* @returns a child context carrying the additional intercept entry.
|
|
82
|
+
*/
|
|
83
|
+
intercept<K extends InjectKey>(name: K, config: Context[K] extends { [symbols.config]: infer T } ? T : never): this
|
|
84
|
+
intercept(name: string, config: any): this
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Add service-specific intercept config for plugins started below this context.
|
|
88
|
+
|
|
89
|
+
Plugins loaded under the returned context see `config` merged into the service's resolved config (ancestor entries first; see `Service[symbols.resolveConfig]`). The parent context is not affected.
|
|
90
|
+
|
|
91
|
+
- `name` — the service name whose config to intercept.
|
|
92
|
+
- `config` — the intercept config to merge for that service.
|
|
93
|
+
|
|
94
|
+
**Returns** a child context carrying the additional intercept entry.
|
|
95
|
+
|
|
96
|
+
[Source](../../vendor/cordis/src/context.ts#L139)
|
|
97
|
+
|
|
98
|
+
### ctx.root
|
|
99
|
+
|
|
100
|
+
```ts cordis-catalog
|
|
101
|
+
/** The root context of the application (every child context shares it). @experimental */
|
|
102
|
+
root: this
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
The root context of the application (every child context shares it). @experimental
|
|
106
|
+
|
|
107
|
+
[Source](../../vendor/cordis/src/context.ts#L22)
|
|
108
|
+
|
|
109
|
+
### ctx.baseUrl
|
|
110
|
+
|
|
111
|
+
```ts cordis-catalog
|
|
112
|
+
/** Base URL used to resolve relative plugin/module specifiers, if the runtime sets one. */
|
|
113
|
+
baseUrl?: string
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Base URL used to resolve relative plugin/module specifiers, if the runtime sets one.
|
|
117
|
+
|
|
118
|
+
[Source](../../vendor/cordis/src/context.ts#L24)
|
|
119
|
+
|
|
120
|
+
### ctx.events
|
|
121
|
+
|
|
122
|
+
```ts cordis-catalog
|
|
123
|
+
/** The event bus. Its methods are also mixed onto `ctx` (`ctx.on`, `ctx.emit`, ...). */
|
|
124
|
+
events: EventsService
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
The event bus. Its methods are also mixed onto `ctx` (`ctx.on`, `ctx.emit`, ...).
|
|
128
|
+
|
|
129
|
+
[Source](../../vendor/cordis/src/context.ts#L26)
|
|
130
|
+
|
|
131
|
+
### ctx.logger
|
|
132
|
+
|
|
133
|
+
```ts cordis-catalog
|
|
134
|
+
/** The logging service. Call `ctx.logger(name)` for a named logger. */
|
|
135
|
+
logger: LoggerService
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
The logging service. Call `ctx.logger(name)` for a named logger.
|
|
139
|
+
|
|
140
|
+
[Source](../../vendor/cordis/src/context.ts#L28)
|
|
141
|
+
|
|
142
|
+
### ctx.reflect
|
|
143
|
+
|
|
144
|
+
```ts cordis-catalog
|
|
145
|
+
/** The reflection layer backing the context proxy (`ctx.get`, `ctx.provide`, ...). */
|
|
146
|
+
reflect: ReflectService
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
The reflection layer backing the context proxy (`ctx.get`, `ctx.provide`, ...).
|
|
150
|
+
|
|
151
|
+
[Source](../../vendor/cordis/src/context.ts#L30)
|
|
152
|
+
|
|
153
|
+
### ctx.registry
|
|
154
|
+
|
|
155
|
+
```ts cordis-catalog
|
|
156
|
+
/** The plugin registry. Its methods are mixed onto `ctx` (`ctx.plugin`, `ctx.inject`). */
|
|
157
|
+
registry: RegistryService
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
The plugin registry. Its methods are mixed onto `ctx` (`ctx.plugin`, `ctx.inject`).
|
|
161
|
+
|
|
162
|
+
[Source](../../vendor/cordis/src/context.ts#L32)
|
|
163
|
+
|
|
164
|
+
## Static members
|
|
165
|
+
|
|
166
|
+
### Context.effect
|
|
167
|
+
|
|
168
|
+
```ts cordis-catalog
|
|
169
|
+
/** Symbol key under which a disposer exposes its {@link EffectMeta} diagnostics tree. */
|
|
170
|
+
static readonly effect: unique symbol
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
Symbol key under which a disposer exposes its EffectMeta diagnostics tree.
|
|
174
|
+
|
|
175
|
+
[Source](../../vendor/cordis/src/context.ts#L44)
|
|
176
|
+
|
|
177
|
+
### Context.filter
|
|
178
|
+
|
|
179
|
+
```ts cordis-catalog
|
|
180
|
+
/** Symbol key for a context's listener filter, consulted on every event dispatch. */
|
|
181
|
+
static readonly filter: unique symbol
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
Symbol key for a context's listener filter, consulted on every event dispatch.
|
|
185
|
+
|
|
186
|
+
[Source](../../vendor/cordis/src/context.ts#L46)
|
|
187
|
+
|
|
188
|
+
### Context.isolate
|
|
189
|
+
|
|
190
|
+
```ts cordis-catalog
|
|
191
|
+
/** Symbol key of the isolation map (see the `Context[symbols.isolate]` property). */
|
|
192
|
+
static readonly isolate: unique symbol
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
Symbol key of the isolation map (see the `Context[symbols.isolate]` property).
|
|
196
|
+
|
|
197
|
+
[Source](../../vendor/cordis/src/context.ts#L48)
|
|
198
|
+
|
|
199
|
+
### Context.intercept
|
|
200
|
+
|
|
201
|
+
```ts cordis-catalog
|
|
202
|
+
/** Symbol key of the intercept map (see the `Context[symbols.intercept]` property). */
|
|
203
|
+
static readonly intercept: unique symbol
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
Symbol key of the intercept map (see the `Context[symbols.intercept]` property).
|
|
207
|
+
|
|
208
|
+
[Source](../../vendor/cordis/src/context.ts#L50)
|
|
209
|
+
|
|
210
|
+
### Context.is(value)
|
|
211
|
+
|
|
212
|
+
```ts cordis-catalog
|
|
213
|
+
/**
|
|
214
|
+
* Returns true for Cordis context proxies and context prototypes.
|
|
215
|
+
*
|
|
216
|
+
* Works across realms and across multiple copies of cordis, because the
|
|
217
|
+
* brand is keyed by a global symbol rather than by `instanceof`.
|
|
218
|
+
*
|
|
219
|
+
* @param value — the value to test.
|
|
220
|
+
* @returns `true` if `value` is a Cordis context, narrowing its type.
|
|
221
|
+
*/
|
|
222
|
+
static is(value: any): value is Context
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
Returns true for Cordis context proxies and context prototypes.
|
|
226
|
+
|
|
227
|
+
Works across realms and across multiple copies of cordis, because the brand is keyed by a global symbol rather than by `instanceof`.
|
|
228
|
+
|
|
229
|
+
- `value` — the value to test.
|
|
230
|
+
|
|
231
|
+
**Returns** `true` if `value` is a Cordis context, narrowing its type.
|
|
232
|
+
|
|
233
|
+
[Source](../../vendor/cordis/src/context.ts#L61)
|
|
234
|
+
|
|
235
|
+
## Service store and mixins
|
|
236
|
+
|
|
237
|
+
### ctx.get(name, strict?)
|
|
238
|
+
|
|
239
|
+
```ts cordis-catalog
|
|
240
|
+
/**
|
|
241
|
+
* Read a service from the store without the inject requirement.
|
|
242
|
+
*
|
|
243
|
+
* @param name — the service name.
|
|
244
|
+
* @param strict — when `true` (default), only return implementations
|
|
245
|
+
* whose providing fiber is currently active.
|
|
246
|
+
* @returns the service value, or `undefined` when not (yet) provided.
|
|
247
|
+
*/
|
|
248
|
+
get<K extends string & keyof this>(name: K, strict?: boolean): undefined | this[K]
|
|
249
|
+
get(name: string, strict?: boolean): any
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
Read a service from the store without the inject requirement.
|
|
253
|
+
|
|
254
|
+
- `name` — the service name.
|
|
255
|
+
- `strict` — when `true` (default), only return implementations whose providing fiber is currently active.
|
|
256
|
+
|
|
257
|
+
**Returns** the service value, or `undefined` when not (yet) provided.
|
|
258
|
+
|
|
259
|
+
[Source](../../vendor/cordis/src/reflect.ts#L17)
|
|
260
|
+
|
|
261
|
+
### ctx.set(name, value)
|
|
262
|
+
|
|
263
|
+
```ts cordis-catalog
|
|
264
|
+
/**
|
|
265
|
+
* Overwrite a provided service's value.
|
|
266
|
+
*
|
|
267
|
+
* Only the fiber that provided the service may set it; setting an
|
|
268
|
+
* unprovided name throws.
|
|
269
|
+
*
|
|
270
|
+
* @param name — the service name.
|
|
271
|
+
* @param value — the new service value.
|
|
272
|
+
*/
|
|
273
|
+
set<K extends string & keyof this>(name: K, value: undefined | this[K]): void
|
|
274
|
+
set(name: string, value: any): void
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
Overwrite a provided service's value.
|
|
278
|
+
|
|
279
|
+
Only the fiber that provided the service may set it; setting an unprovided name throws.
|
|
280
|
+
|
|
281
|
+
- `name` — the service name.
|
|
282
|
+
- `value` — the new service value.
|
|
283
|
+
|
|
284
|
+
[Source](../../vendor/cordis/src/reflect.ts#L29)
|
|
285
|
+
|
|
286
|
+
### ctx.provide(name, value)
|
|
287
|
+
|
|
288
|
+
```ts cordis-catalog
|
|
289
|
+
/**
|
|
290
|
+
* Register a service implementation owned by the current fiber.
|
|
291
|
+
*
|
|
292
|
+
* The service becomes visible to dependents in the same isolation scope
|
|
293
|
+
* once the fiber is active; it is unregistered (waking dependents) when
|
|
294
|
+
* the returned disposer runs or the fiber unloads. Throws if the name is
|
|
295
|
+
* already provided in this scope or declared as an accessor.
|
|
296
|
+
*
|
|
297
|
+
* @param name — the service name.
|
|
298
|
+
* @param value — the service value.
|
|
299
|
+
* @returns a disposer that unregisters the service.
|
|
300
|
+
*/
|
|
301
|
+
provide<K extends string & keyof this>(name: K, value: undefined | this[K]): () => void
|
|
302
|
+
provide(name: string, value?: any): () => void
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
Register a service implementation owned by the current fiber.
|
|
306
|
+
|
|
307
|
+
The service becomes visible to dependents in the same isolation scope once the fiber is active; it is unregistered (waking dependents) when the returned disposer runs or the fiber unloads. Throws if the name is already provided in this scope or declared as an accessor.
|
|
308
|
+
|
|
309
|
+
- `name` — the service name.
|
|
310
|
+
- `value` — the service value.
|
|
311
|
+
|
|
312
|
+
**Returns** a disposer that unregisters the service.
|
|
313
|
+
|
|
314
|
+
[Source](../../vendor/cordis/src/reflect.ts#L44)
|
|
315
|
+
|
|
316
|
+
### ctx.accessor(name, options)
|
|
317
|
+
|
|
318
|
+
```ts cordis-catalog
|
|
319
|
+
/**
|
|
320
|
+
* Define a computed context property backed by get/set hooks.
|
|
321
|
+
*
|
|
322
|
+
* The accessor is removed when the current fiber unloads. Throws if the
|
|
323
|
+
* name is already declared.
|
|
324
|
+
*
|
|
325
|
+
* @param name — the context property name.
|
|
326
|
+
* @param options — the `get` hook and optional `set` hook.
|
|
327
|
+
*/
|
|
328
|
+
accessor(name: string, options: Omit<Property.Accessor, 'type'>): void
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
Define a computed context property backed by get/set hooks.
|
|
332
|
+
|
|
333
|
+
The accessor is removed when the current fiber unloads. Throws if the name is already declared.
|
|
334
|
+
|
|
335
|
+
- `name` — the context property name.
|
|
336
|
+
- `options` — the `get` hook and optional `set` hook.
|
|
337
|
+
|
|
338
|
+
[Source](../../vendor/cordis/src/reflect.ts#L56)
|
|
339
|
+
|
|
340
|
+
### ctx.mixin(name, mixins)
|
|
341
|
+
|
|
342
|
+
```ts cordis-catalog
|
|
343
|
+
/**
|
|
344
|
+
* Expose selected members of a service directly on `ctx`.
|
|
345
|
+
*
|
|
346
|
+
* Each mixed-in key becomes an accessor that forwards to the service
|
|
347
|
+
* (binding methods to it), so e.g. `ctx.on` forwards to `ctx.events.on`.
|
|
348
|
+
* Mixins are removed when the current fiber unloads.
|
|
349
|
+
*
|
|
350
|
+
* @param name — the context property holding the source service.
|
|
351
|
+
* @param mixins — keys to forward, or a source-key → ctx-key map.
|
|
352
|
+
*/
|
|
353
|
+
mixin<K extends string & keyof this>(name: K, mixins: (keyof this & keyof this[K])[] | Dict<string>): void
|
|
354
|
+
mixin<T extends {}>(source: T, mixins: (keyof this & keyof T)[] | Dict<string>): void
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
Expose selected members of a service directly on `ctx`.
|
|
358
|
+
|
|
359
|
+
Each mixed-in key becomes an accessor that forwards to the service (binding methods to it), so e.g. `ctx.on` forwards to `ctx.events.on`. Mixins are removed when the current fiber unloads.
|
|
360
|
+
|
|
361
|
+
- `name` — the context property holding the source service.
|
|
362
|
+
- `mixins` — keys to forward, or a source-key → ctx-key map.
|
|
363
|
+
|
|
364
|
+
[Source](../../vendor/cordis/src/reflect.ts#L67)
|