dsh-plugin-guide 0.3.27 → 0.3.30
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/README-es.md +3 -3
- package/README-hi.md +3 -3
- package/README-pt.md +3 -3
- package/README-zh.md +5 -3
- package/README.md +5 -3
- package/SKILL.md +21 -8
- package/dist/dsh-plugin-dev.js +93 -18
- package/guide/family-toolchain.md +260 -0
- package/guide/links.md +3 -2
- package/guide/migration-0.2.md +64 -8
- package/guide/plugin-dev-guide.md +8 -6
- package/guide/quick-reference.es.md +3 -2
- package/guide/quick-reference.hi.md +4 -3
- package/guide/quick-reference.md +6 -5
- package/guide/quick-reference.pt.md +4 -3
- package/guide/quick-reference.zh-CN.md +6 -5
- package/guide/release-engineering.md +4 -2
- package/guide/release-engineering.zh-CN.md +4 -2
- package/guide/unfixed-issues.md +7 -0
- package/guide/version-matrix.md +309 -0
- package/guide/when-to-retire-a-plugin.md +5 -5
- package/guide/when-to-retire-a-plugin.zh-CN.md +5 -5
- package/index.d.ts +32 -0
- package/index.js +24 -9
- package/package.json +19 -11
- package/references/community-ecosystem.md +2 -1
- package/references/dev-resource-landscape.md +294 -0
- package/references/official-docs/AGENTS.md +4 -5
- package/references/official-docs/SNAPSHOT.md +3 -3
- package/references/official-docs/THIRD_PARTY_NOTICES.md +2 -1
- package/references/official-docs/docs/AGENTS.md +1 -1
- package/references/official-docs/docs/architecture.i18n.yaml +14 -14
- package/references/official-docs/docs/architecture.md +11 -12
- package/references/official-docs/docs/architecture.zh.md +11 -12
- package/references/official-docs/docs/capability-seams.i18n.yaml +2 -2
- package/references/official-docs/docs/capability-seams.md +48 -23
- package/references/official-docs/docs/capability-seams.zh.md +48 -23
- package/references/official-docs/docs/cli-help.i18n.yaml +34 -0
- package/references/official-docs/docs/cli-help.md +203 -0
- package/references/official-docs/docs/cli-help.zh.md +205 -0
- package/references/official-docs/docs/config-catalog.md +305 -145
- package/references/official-docs/docs/config-catalog.zh.md +305 -145
- package/references/official-docs/docs/cookbook/adding-a-session-format-version.i18n.yaml +6 -6
- package/references/official-docs/docs/cookbook/adding-a-session-format-version.md +7 -5
- package/references/official-docs/docs/cookbook/adding-a-session-format-version.zh.md +7 -5
- package/references/official-docs/docs/cookbook/reviewing-persistence-type-changes.i18n.yaml +6 -6
- package/references/official-docs/docs/cookbook/reviewing-persistence-type-changes.md +11 -9
- package/references/official-docs/docs/cookbook/reviewing-persistence-type-changes.zh.md +11 -9
- package/references/official-docs/docs/deepseek-llm-api-wire-extensions.i18n.yaml +4 -4
- package/references/official-docs/docs/deepseek-llm-api-wire-extensions.md +5 -5
- package/references/official-docs/docs/deepseek-llm-api-wire-extensions.zh.md +5 -5
- package/references/official-docs/docs/defensive-patterns.i18n.yaml +2 -2
- package/references/official-docs/docs/defensive-patterns.md +1 -1
- package/references/official-docs/docs/defensive-patterns.zh.md +1 -1
- package/references/official-docs/docs/development.i18n.yaml +6 -6
- package/references/official-docs/docs/development.md +4 -2
- package/references/official-docs/docs/development.zh.md +4 -2
- package/references/official-docs/docs/event-producer-consumer.md +33 -33
- package/references/official-docs/docs/event-producer-consumer.zh.md +33 -33
- package/references/official-docs/docs/experimental-persistence-catalog.i18n.yaml +10 -0
- package/references/official-docs/docs/experimental-persistence-catalog.md +17 -0
- package/references/official-docs/docs/experimental-persistence-catalog.zh.md +17 -0
- package/references/official-docs/docs/module-graph.md +202 -131
- package/references/official-docs/docs/module-graph.zh.md +202 -131
- package/references/official-docs/docs/persistence-catalog.i18n.yaml +185 -158
- package/references/official-docs/docs/persistence-catalog.md +213 -112
- package/references/official-docs/docs/persistence-catalog.zh.md +213 -112
- package/references/official-docs/docs/persistence-changes/2026-09-13-working-directory.i18n.yaml +28 -0
- package/references/official-docs/docs/persistence-changes/2026-09-13-working-directory.md +48 -0
- package/references/official-docs/docs/persistence-changes/2026-09-13-working-directory.schema.json +76 -0
- package/references/official-docs/docs/persistence-changes/2026-09-13-working-directory.zh.md +48 -0
- package/references/official-docs/docs/persistence-changes/2026-09-16-session-format-v4.i18n.yaml +4 -4
- package/references/official-docs/docs/persistence-changes/2026-09-16-session-format-v4.md +2 -2
- package/references/official-docs/docs/persistence-changes/2026-09-16-session-format-v4.zh.md +2 -2
- package/references/official-docs/docs/persistence-changes/2026-09-19-external-subagent-catalog.i18n.yaml +28 -0
- package/references/official-docs/docs/persistence-changes/2026-09-19-external-subagent-catalog.md +48 -0
- package/references/official-docs/docs/persistence-changes/2026-09-19-external-subagent-catalog.schema.json +290 -0
- package/references/official-docs/docs/persistence-changes/2026-09-19-external-subagent-catalog.zh.md +48 -0
- package/references/official-docs/docs/persistence-changes/2026-10-05-ptc-operation-metadata.i18n.yaml +28 -0
- package/references/official-docs/docs/persistence-changes/2026-10-05-ptc-operation-metadata.md +48 -0
- package/references/official-docs/docs/persistence-changes/2026-10-05-ptc-operation-metadata.schema.json +457 -0
- package/references/official-docs/docs/persistence-changes/2026-10-05-ptc-operation-metadata.zh.md +48 -0
- package/references/official-docs/docs/persistence-changes/2026-10-05-working-directory-attribution.i18n.yaml +28 -0
- package/references/official-docs/docs/persistence-changes/2026-10-05-working-directory-attribution.md +60 -0
- package/references/official-docs/docs/persistence-changes/2026-10-05-working-directory-attribution.schema.json +11474 -0
- package/references/official-docs/docs/persistence-changes/2026-10-05-working-directory-attribution.zh.md +60 -0
- package/references/official-docs/docs/persistence-changes/2026-10-07-title-reasoning-effort.i18n.yaml +28 -0
- package/references/official-docs/docs/persistence-changes/2026-10-07-title-reasoning-effort.md +48 -0
- package/references/official-docs/docs/persistence-changes/2026-10-07-title-reasoning-effort.schema.json +2990 -0
- package/references/official-docs/docs/persistence-changes/2026-10-07-title-reasoning-effort.zh.md +48 -0
- package/references/official-docs/docs/persistence-changes/README.i18n.yaml +4 -4
- package/references/official-docs/docs/persistence-changes/README.md +12 -10
- package/references/official-docs/docs/persistence-changes/README.zh.md +12 -10
- package/references/official-docs/docs/persistence-changes/historical-formats/README.i18n.yaml +2 -2
- package/references/official-docs/docs/persistence-changes/historical-formats/README.md +1 -1
- package/references/official-docs/docs/persistence-changes/historical-formats/README.zh.md +1 -1
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.0.1-rc.2.i18n.yaml +2 -2
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.0.1-rc.2.md +50 -50
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.0.1-rc.2.zh.md +50 -50
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.0.1-rc.3.i18n.yaml +2 -2
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.0.1-rc.3.md +14 -14
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.0.1-rc.3.zh.md +14 -14
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.7.i18n.yaml +2 -2
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.7.md +3 -3
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.7.zh.md +3 -3
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.8.i18n.yaml +2 -2
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.8.md +10 -10
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.8.zh.md +10 -10
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.1-rc.1.i18n.yaml +2 -2
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.1-rc.1.md +3 -3
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.1-rc.1.zh.md +3 -3
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.1-rc.2.i18n.yaml +2 -2
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.1-rc.2.md +13 -13
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.1-rc.2.zh.md +13 -13
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.2-alpha.1.i18n.yaml +2 -2
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.2-alpha.1.md +63 -63
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.2-alpha.1.zh.md +63 -63
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.2-alpha.2.i18n.yaml +2 -2
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.2-alpha.2.md +54 -54
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.2-alpha.2.zh.md +54 -54
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.2-alpha.4.i18n.yaml +2 -2
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.2-alpha.4.md +7 -7
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.2-alpha.4.zh.md +7 -7
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.3-alpha.1.i18n.yaml +2 -2
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.3-alpha.1.md +27 -27
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.3-alpha.1.zh.md +27 -27
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.3-alpha.2.i18n.yaml +2 -2
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.3-alpha.2.md +4 -4
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.3-alpha.2.zh.md +4 -4
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.5-alpha.1.i18n.yaml +2 -2
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.5-alpha.1.md +27 -27
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.5-alpha.1.zh.md +27 -27
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.5-alpha.2.i18n.yaml +2 -2
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.5-alpha.2.md +7 -7
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.5-alpha.2.zh.md +7 -7
- package/references/official-docs/docs/persistence-schema.json +2084 -1827
- package/references/official-docs/docs/session-format-status.i18n.yaml +6 -6
- package/references/official-docs/docs/session-format-status.md +6 -6
- package/references/official-docs/docs/session-format-status.zh.md +6 -6
- package/references/official-docs/docs/subsystems/README.i18n.yaml +2 -2
- package/references/official-docs/docs/subsystems/README.md +4 -1
- package/references/official-docs/docs/subsystems/README.zh.md +4 -1
- package/references/official-docs/docs/subsystems/agent-team.i18n.yaml +7 -7
- package/references/official-docs/docs/subsystems/agent-team.md +10 -10
- package/references/official-docs/docs/subsystems/agent-team.zh.md +10 -10
- package/references/official-docs/docs/subsystems/boot.i18n.yaml +2 -2
- package/references/official-docs/docs/subsystems/boot.md +4 -4
- package/references/official-docs/docs/subsystems/boot.zh.md +4 -4
- package/references/official-docs/docs/subsystems/claude-code-mods.i18n.yaml +2 -2
- package/references/official-docs/docs/subsystems/claude-code-mods.md +1 -1
- package/references/official-docs/docs/subsystems/claude-code-mods.zh.md +1 -1
- package/references/official-docs/docs/subsystems/jobs.i18n.yaml +2 -2
- package/references/official-docs/docs/subsystems/jobs.md +2 -3
- package/references/official-docs/docs/subsystems/jobs.zh.md +2 -3
- package/references/official-docs/docs/subsystems/llm-streaming.i18n.yaml +4 -4
- package/references/official-docs/docs/subsystems/llm-streaming.md +41 -14
- package/references/official-docs/docs/subsystems/llm-streaming.zh.md +41 -14
- package/references/official-docs/docs/subsystems/persistence.md +2 -0
- package/references/official-docs/docs/subsystems/persistence.zh.md +2 -0
- package/references/official-docs/docs/subsystems/plan.i18n.yaml +2 -2
- package/references/official-docs/docs/subsystems/plan.md +1 -1
- package/references/official-docs/docs/subsystems/plan.zh.md +1 -1
- package/references/official-docs/docs/subsystems/session-query.md +2 -0
- package/references/official-docs/docs/subsystems/session-query.zh.md +2 -0
- package/references/official-docs/docs/subsystems/session-title.i18n.yaml +6 -6
- package/references/official-docs/docs/subsystems/session-title.md +14 -5
- package/references/official-docs/docs/subsystems/session-title.zh.md +14 -5
- package/references/official-docs/docs/subsystems/session.i18n.yaml +3 -0
- package/references/official-docs/docs/subsystems/session.md +48 -5
- package/references/official-docs/docs/subsystems/session.zh.md +48 -5
- package/references/official-docs/docs/subsystems/skills.i18n.yaml +2 -2
- package/references/official-docs/docs/subsystems/skills.md +2 -2
- package/references/official-docs/docs/subsystems/skills.zh.md +2 -2
- package/references/official-docs/docs/subsystems/slots.md +10 -8
- package/references/official-docs/docs/subsystems/slots.zh.md +10 -8
- package/references/official-docs/docs/subsystems/ssh.i18n.yaml +2 -2
- package/references/official-docs/docs/subsystems/ssh.md +22 -11
- package/references/official-docs/docs/subsystems/ssh.zh.md +22 -11
- package/references/official-docs/docs/subsystems/subagent.i18n.yaml +24 -27
- package/references/official-docs/docs/subsystems/subagent.md +165 -229
- package/references/official-docs/docs/subsystems/subagent.zh.md +167 -233
- package/references/official-docs/docs/subsystems/system-prompt.i18n.yaml +2 -2
- package/references/official-docs/docs/subsystems/system-prompt.md +32 -2
- package/references/official-docs/docs/subsystems/system-prompt.zh.md +32 -2
- package/references/official-docs/docs/subsystems/tools.i18n.yaml +2 -2
- package/references/official-docs/docs/subsystems/tools.md +3 -3
- package/references/official-docs/docs/subsystems/tools.zh.md +3 -3
- package/references/official-docs/docs/subsystems/translation.i18n.yaml +19 -0
- package/references/official-docs/docs/subsystems/translation.md +103 -0
- package/references/official-docs/docs/subsystems/translation.zh.md +103 -0
- package/references/official-docs/docs/subsystems/web-server.i18n.yaml +8 -8
- package/references/official-docs/docs/subsystems/web-server.md +43 -8
- package/references/official-docs/docs/subsystems/web-server.zh.md +43 -8
- package/references/official-docs/docs/subsystems/webhook.md +1 -1
- package/references/official-docs/docs/subsystems/webhook.zh.md +1 -1
- package/references/official-docs/docs/subsystems/workflow.i18n.yaml +2 -2
- package/references/official-docs/docs/subsystems/workflow.md +1 -1
- package/references/official-docs/docs/subsystems/workflow.zh.md +1 -1
- package/references/official-docs/docs/subsystems/working-directory.i18n.yaml +13 -0
- package/references/official-docs/docs/subsystems/working-directory.md +64 -0
- package/references/official-docs/docs/subsystems/working-directory.zh.md +64 -0
- package/references/official-docs/docs/subsystems/workspace.md +2 -2
- package/references/official-docs/docs/subsystems/workspace.zh.md +2 -2
- package/references/official-docs/docs/subsystems/worktrees.i18n.yaml +13 -0
- package/references/official-docs/docs/subsystems/worktrees.md +76 -0
- package/references/official-docs/docs/subsystems/worktrees.zh.md +76 -0
- package/references/official-docs/docs/testing.i18n.yaml +2 -2
- package/references/official-docs/docs/testing.md +1 -1
- package/references/official-docs/docs/testing.zh.md +1 -1
- package/references/official-docs/docs/tool-catalog.i18n.yaml +57 -45
- package/references/official-docs/docs/tool-catalog.md +95 -41
- package/references/official-docs/docs/tool-catalog.zh.md +99 -45
- package/references/official-docs/docs/upgrade-guide/v0.2.0-rc.2/bundled-python-tests/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.0-rc.2/bundled-python-tests/guide.md +18 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.0-rc.2/bundled-python-tests/guide.zh.md +18 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/deepseek-model-discovery/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/deepseek-model-discovery/guide.md +17 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/deepseek-model-discovery/guide.zh.md +17 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/desktop-test-auth-popup/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/desktop-test-auth-popup/guide.md +18 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/desktop-test-auth-popup/guide.zh.md +18 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/experimental-package-composition/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/experimental-package-composition/guide.md +28 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/experimental-package-composition/guide.zh.md +28 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/instruction-home-override/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/instruction-home-override/guide.md +20 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/instruction-home-override/guide.zh.md +20 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/mock-messages-events/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/mock-messages-events/guide.md +17 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/mock-messages-events/guide.zh.md +17 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/native-subagent-bundle-tools/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/native-subagent-bundle-tools/guide.md +31 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/native-subagent-bundle-tools/guide.zh.md +31 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/new-session-generations/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/new-session-generations/guide.md +20 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/new-session-generations/guide.zh.md +20 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/plugin-option-placement/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/plugin-option-placement/guide.md +20 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/plugin-option-placement/guide.zh.md +20 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/python-optional-resources/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/python-optional-resources/guide.md +18 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/python-optional-resources/guide.zh.md +18 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/python-ptc-sandbox/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/python-ptc-sandbox/guide.md +21 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/python-ptc-sandbox/guide.zh.md +21 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/session-title-adapters/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/session-title-adapters/guide.md +18 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/session-title-adapters/guide.zh.md +18 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/session-title-provider-strategy/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/session-title-provider-strategy/guide.md +20 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/session-title-provider-strategy/guide.zh.md +20 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/ssh-helper-launch/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/ssh-helper-launch/guide.md +19 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/ssh-helper-launch/guide.zh.md +19 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/subagent-activations/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/subagent-activations/guide.md +59 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/subagent-activations/guide.zh.md +59 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/team-direct-inbox/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/team-direct-inbox/guide.md +21 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/team-direct-inbox/guide.zh.md +21 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/terminal-command-labels/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/terminal-command-labels/guide.md +18 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/terminal-command-labels/guide.zh.md +18 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/tool-presentation-mode/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/tool-presentation-mode/guide.md +21 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/tool-presentation-mode/guide.zh.md +21 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/web-listener-trust-config/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/web-listener-trust-config/guide.md +36 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/web-listener-trust-config/guide.zh.md +36 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/working-directory/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/working-directory/guide.md +25 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/working-directory/guide.zh.md +25 -0
- package/references/official-docs/docs/user/guide/github-review.i18n.yaml +4 -4
- package/references/official-docs/docs/user/guide/github-review.md +7 -10
- package/references/official-docs/docs/user/guide/github-review.zh.md +7 -10
- package/references/official-docs/docs/user/guide/public-deployments.i18n.yaml +8 -8
- package/references/official-docs/docs/user/guide/public-deployments.md +9 -5
- package/references/official-docs/docs/user/guide/public-deployments.zh.md +9 -5
- package/references/official-docs/packages/README.md +4 -6
- package/references/official-docs/website-docs.ts +1 -0
- package/references/official-plugin-dev-skill.md +2 -2
- package/references/sources.md +2 -1
- package/scripts/archive-discussions.ps1 +162 -162
- package/scripts/build-llms-full.mjs +8 -0
- package/scripts/check-docs-drift.ps1 +55 -55
- package/scripts/check-ps1-bom.mjs +68 -0
- package/scripts/download-community-articles.ps1 +188 -188
- package/scripts/download-community-repos.ps1 +232 -232
- package/scripts/download-sources.ps1 +195 -195
- package/scripts/gen-topic-snapshot.ps1 +91 -91
- package/scripts/install-skill.ps1 +63 -63
- package/scripts/sync-official-docs.ps1 +138 -138
- package/scripts/verify-artifacts.mjs +26 -0
- package/scripts/verify-kit.ps1 +197 -187
- package/templates/js/README-es.md +1 -1
- package/templates/js/README-hi.md +1 -1
- package/templates/js/README-pt.md +1 -1
- package/templates/js/README-zh.md +1 -1
- package/templates/js/README.md +1 -1
- package/templates/ts/README-es.md +1 -1
- package/templates/ts/README-hi.md +1 -1
- package/templates/ts/README-pt.md +1 -1
- package/templates/ts/README-zh.md +1 -1
- package/templates/ts/README.md +1 -1
|
@@ -22,20 +22,17 @@ export DSH_GITHUB_WEBHOOK_SECRET="$(openssl rand -hex 32)"
|
|
|
22
22
|
printf '%s\n' "$DSH_GITHUB_WEBHOOK_SECRET"
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
先把两个实验包安装到 Web profile。Profile 不会自动安装 peer;GitHub 适配器需要显式安装 webhook 运行时:
|
|
26
26
|
|
|
27
27
|
```sh
|
|
28
|
+
dsh plugin --profile web add @deepseek-ai/dsh-webhook @deepseek-ai/dsh-webhook-github
|
|
28
29
|
export DSH_GITHUB_REVIEW_WORKSPACE=/path/to/deepseek-harness
|
|
29
|
-
|
|
30
|
+
dsh web --patch "${DSH_HOME:-$HOME/.dsh}/profiles/web/node_modules/@deepseek-ai/dsh-webhook-github/examples/github-review/cordis.yml"
|
|
30
31
|
```
|
|
31
32
|
|
|
32
|
-
|
|
33
|
+
示例随 GitHub 适配器发布,并从 profile 的安装目录加载,因此规则模块能解析该 profile 安装的 peer。不要把规则单独放到 profile 之外的任意目录运行。需要定制时,将示例的两个文件复制到 `$DSH_HOME/profiles/web/github-review/`,修改其配置并把 `--patch` 指向复制后的 `cordis.yml`;未设置 `DSH_HOME` 时使用 `~/.dsh`。
|
|
33
34
|
|
|
34
|
-
|
|
35
|
-
dsh web --patch /absolute/path/to/github-review/cordis.yml
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
对于永久 profile,把 `github-ready-review-rule.mjs` 放在 `$DSH_HOME/profiles/web/cordis.patch.yml` 旁边,把 `cordis.yml` 中的行追加到该 patch,然后运行 `dsh web`。随附 CLI 已经包含两个 webhook 包;只需 overlay 即可激活它们。
|
|
35
|
+
仓库中的示例位于 `packages/experimental/webhook-github/examples/github-review/`。Webhook 包不随 CLI 安装,也不出现在官方插件列表中;安装包与提供 overlay 是两个独立步骤。
|
|
39
36
|
|
|
40
37
|
## 暴露专用端点
|
|
41
38
|
|
|
@@ -65,7 +62,7 @@ Active: yes
|
|
|
65
62
|
|
|
66
63
|
## 规则行为
|
|
67
64
|
|
|
68
|
-
规则只接受来源 `primary-github`、仓库 `deepseek-
|
|
65
|
+
规则只接受来源 `primary-github`、仓库 `deepseek-ai/deepseek-harness`、事件 `pull_request` 与动作 `ready_for_review`。它会把精确 head SHA 和选定 PR 字段传给评审提示词,把 JSON 标为不受信任的元数据,并禁止修改文件、分支、PR 或 GitHub 状态。
|
|
69
66
|
|
|
70
67
|
Session 请求选择 `standard` agent preset 与 `read-only` permission preset。`workspacePath` 通过 `WorkspaceRegistry.create()` 规范化,因此第一次匹配交付会在 Workspace 不存在时创建它,后续交付会复用它。
|
|
71
68
|
|
|
@@ -89,7 +86,7 @@ if (!response.ok || (await response.json()).automaticReview !== true) return nul
|
|
|
89
86
|
|
|
90
87
|
```js
|
|
91
88
|
const workspacePath = {
|
|
92
|
-
'deepseek-
|
|
89
|
+
'deepseek-ai/deepseek-harness': '/path/to/deepseek-harness',
|
|
93
90
|
'deepseek-harness/dsh-sdk': '/path/to/dsh-sdk',
|
|
94
91
|
}[payload.repository.full_name]
|
|
95
92
|
if (workspacePath === undefined) return null
|
|
@@ -3,17 +3,17 @@
|
|
|
3
3
|
# After editing either side, bring the other along and re-record with:
|
|
4
4
|
# pnpm run verify-translation-pairing --write docs/user/guide/public-deployments.md
|
|
5
5
|
/publish-the-web-ui-behind-a-reverse-proxy:
|
|
6
|
-
en:
|
|
7
|
-
zh:
|
|
6
|
+
en: 867565aa675f3fb3
|
|
7
|
+
zh: c60606b5e5bdb778
|
|
8
8
|
/publish-the-web-ui-behind-a-reverse-proxy/what-public-url-advertises:
|
|
9
9
|
en: 576292b93ccf299a
|
|
10
10
|
zh: ded5adc55396869c
|
|
11
11
|
/publish-the-web-ui-behind-a-reverse-proxy/what-the-proxy-must-do:
|
|
12
|
-
en:
|
|
13
|
-
zh:
|
|
12
|
+
en: 2f93051763125365
|
|
13
|
+
zh: 1dd699cb84ecf034
|
|
14
14
|
/publish-the-web-ui-behind-a-reverse-proxy/trust-the-authority-browsers-use:
|
|
15
|
-
en:
|
|
16
|
-
zh:
|
|
15
|
+
en: 08e5a6cc45918876
|
|
16
|
+
zh: d59178e10e915748
|
|
17
17
|
/publish-the-web-ui-behind-a-reverse-proxy/secure-the-external-leg:
|
|
18
|
-
en:
|
|
19
|
-
zh:
|
|
18
|
+
en: 2afac1f10e2d2e88
|
|
19
|
+
zh: f9b4b03a5aad27e1
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
English | [中文](public-deployments.zh.md)
|
|
4
4
|
|
|
5
|
-
`dsh --profile web` serves the GUI
|
|
5
|
+
`dsh --profile web` serves the GUI on a loopback port, so a browser on another machine cannot reach it, and the process knows nothing about the address you do use. A reverse proxy in front of it owns that external leg — the public host name, TLS, and the path prefix it strips before forwarding to the listener — and `--public-url` tells DSH which address browsers use:
|
|
6
6
|
|
|
7
7
|
```sh
|
|
8
8
|
dsh --profile web --public-url https://app.example/ui/ --trusted-host app.example
|
|
@@ -17,17 +17,21 @@ dsh --profile web --public-url https://app.example/ui/ --trusted-host app.exampl
|
|
|
17
17
|
- **Preserve the browser-facing `Host`.** The fence compares the received `Host` against the accepted authorities, so the proxy forwards it unchanged instead of rewriting it to the listener's address.
|
|
18
18
|
- **Strip the mount prefix.** The listener answers origin-root routes, so a request for `/ui/api/...` must arrive as `/api/...`.
|
|
19
19
|
- **Forward upgrades.** Every request and WebSocket upgrade the page opens must reach the listener with its `Upgrade` and `Connection` headers intact; TLS terminates on the proxy's external leg when it serves HTTPS.
|
|
20
|
-
- **Rewrite cookie scope.**
|
|
20
|
+
- **Rewrite cookie scope.** A backend serving plain HTTP issues host-only `Path=/` cookies without `Secure`; the proxy then rewrites `Path` to the mount (`/ui/`) and adds `Secure` on its HTTPS leg. A backend listener serving its own TLS already marks the cookie `Secure`, so the proxy only rewrites `Path`.
|
|
21
21
|
- **Redirect the bare mount.** `/ui/` is the only entry: it alone exchanges the launch token for the session cookie, and it or `/ui/index.html` serves the document to a browser that already holds that cookie, because the served document resolves URLs against its own directory. A request to `/ui` must arrive as `/ui/`, and the stripped backend cannot reconstruct that external path.
|
|
22
22
|
|
|
23
23
|
## Trust the authority browsers use
|
|
24
24
|
|
|
25
|
-
The fence accepts loopback
|
|
25
|
+
The fence accepts loopback, the listener's own bind address, and every authority `--trusted-host` names. A browser that reaches the deployment under any other authority gets 403 for every API call, however correct the proxy is, so name the browser-visible authority with `--trusted-host`; advertising it with `--public-url` is display only and does not admit it. An entry without a port matches any port, which suits a tunnel that binds a different one each time. The fence only admits the request; the launch token in the printed URL and the signed session cookie authenticate it. TLS, wherever it terminates, changes none of this: the certificate identifies the server to the browser, not the browser to the server.
|
|
26
26
|
|
|
27
27
|
Neither the advertised URL nor the fence protects the listening port itself, so restrict the port to the trusted proxy or network.
|
|
28
28
|
|
|
29
29
|
## Secure the external leg
|
|
30
30
|
|
|
31
|
-
Terminate TLS at the proxy. An `http://`
|
|
31
|
+
Terminate TLS at the proxy, on the listener itself, or on both; `--public-url` remains an advertisement. An `http://` browser-facing root exposes the launch token in plaintext. An `https://` proxy root protects the browser-to-proxy leg; encryption between proxy and listener depends on the listener's TLS configuration.
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
To terminate on the listener, pass `--tls-cert` and `--tls-key`, each a path resolved against the process working directory: the certificate file holds the full chain and the key file an unencrypted PEM private key. DSH never obtains, renews, or watches certificates, and the carrier reads the files once, so replace them and reload the listener or restart the process to change them; startup fails on a missing or invalid pair and never falls back to HTTP. The browser applies its own trust store and name checks, so the certificate must cover the hostname or IP you open. The default port stays 3080. Native TLS needs no proxy, but proxy deployments and `--public-url` remain supported independently. A TLS listener marks session cookies `Secure`; keep the public browser-facing leg HTTPS so browsers can return those cookies.
|
|
34
|
+
|
|
35
|
+
The printed URL carries a process credential, so share it only with intended users.
|
|
36
|
+
|
|
37
|
+
The [Web app reference](../../../packages/bundle/web-app/README.md#public-deployments) documents the `--public-url`, `--trusted-host`, and `--tls-cert`/`--tls-key` command-line options. In the Web profile, `publicUrl` configures the `web-runtime` row, `trustedHosts` configures the [Connection row](../../../packages/client/connection/README.md), and `tls` configures the [webserver row](../../../docs/subsystems/web-server.md#config).
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[English](public-deployments.md) | 中文
|
|
4
4
|
|
|
5
|
-
`dsh --profile web` 在 loopback
|
|
5
|
+
`dsh --profile web` 在 loopback 端口上提供 GUI,因此其他机器上的浏览器无法访问它,进程也无从得知你实际使用的地址。它前面的反向代理拥有这条外部链路——公开主机名、TLS,以及转发到监听器之前剥离的路径前缀——`--public-url` 则告诉 DSH 浏览器使用的是哪个地址:
|
|
6
6
|
|
|
7
7
|
```sh
|
|
8
8
|
dsh --profile web --public-url https://app.example/ui/ --trusted-host app.example
|
|
@@ -17,17 +17,21 @@ dsh --profile web --public-url https://app.example/ui/ --trusted-host app.exampl
|
|
|
17
17
|
- **保留浏览器可见的 `Host`。** 栅栏把收到的 `Host` 与被接受的 authority 比对,因此代理应原样转发,而不要改写成监听器的地址。
|
|
18
18
|
- **剥离挂载前缀。** 监听器应答的是 origin-root 路由,因此对 `/ui/api/...` 的请求必须以 `/api/...` 抵达。
|
|
19
19
|
- **转发升级请求。** 页面发出的每个请求与 WebSocket 升级都必须连同其 `Upgrade` 与 `Connection` 头抵达监听器;代理对外提供 HTTPS 时,TLS 在其外部链路上终止。
|
|
20
|
-
- **改写 cookie 作用域。**
|
|
20
|
+
- **改写 cookie 作用域。** 以明文 HTTP 提供服务的后端签发不带 `Secure` 的 host-only `Path=/` cookie;代理再把 `Path` 改写为挂载(`/ui/`),并仅在其 HTTPS 链路上添加 `Secure`。监听器自身提供 TLS 时 cookie 已带 `Secure`,代理只需改写 `Path`。
|
|
21
21
|
- **重定向裸挂载。** `/ui/` 是唯一入口:只有它把启动 token 换成会话 cookie;已持有该 cookie 的浏览器可由它或 `/ui/index.html` 取得文档,因为所提供的文档以自身目录解析 URL。对 `/ui` 的请求必须以 `/ui/` 抵达,而被剥离路径的后端无法重建该外部路径。
|
|
22
22
|
|
|
23
23
|
## 信任浏览器使用的 authority
|
|
24
24
|
|
|
25
|
-
栅栏接受 loopback
|
|
25
|
+
栅栏接受 loopback、监听器自身的绑定地址,以及每个由 `--trusted-host` 点名的 authority。浏览器若以其他任何 authority 访问部署,无论代理多么正确,每个 API 调用都会得到 403,因此请用 `--trusted-host` 点名浏览器可见的 authority;用 `--public-url` 公告它只是展示,并不等于接纳。不带端口的条目匹配任意端口,适合每次绑定不同端口的隧道。栅栏只放行请求;打印 URL 中的启动 token 与签名会话 cookie 才完成认证。无论 TLS 在哪里终止都不改变这一切:证书只是向浏览器标识服务器,而不是向服务器标识浏览器。
|
|
26
26
|
|
|
27
27
|
无论是公告 URL 还是栅栏都不保护监听端口本身,因此请把端口限制在可信代理或网络内。
|
|
28
28
|
|
|
29
29
|
## 保护外部链路
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
可以在代理处、监听器本身或两者上终止 TLS;`--public-url` 仍只是公告。面向浏览器的 `http://` 根会明文暴露启动 token。`https://` 代理根保护浏览器到代理这一段;代理与监听器之间是否加密取决于监听器的 TLS 配置。
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
要在监听器上终止 TLS,请传入 `--tls-cert` 与 `--tls-key`,两者各是相对进程工作目录解析的路径:证书文件包含完整证书链,密钥文件为不带口令的 PEM 私钥。DSH 从不获取、续期或监视证书,且载体只读取一次文件,因此更换文件后需重新加载监听器或重启进程;文件缺失或无效时启动失败,绝不回退到 HTTP。浏览器使用自己的信任库与名称校验,因此证书必须覆盖你所访问的 hostname 或 IP。默认端口仍为 3080。原生 TLS 不需要代理,但代理部署与 `--public-url` 仍分别受支持。TLS 监听器会给会话 cookie 加上 `Secure`;公开部署的浏览器侧链路应保持 HTTPS,才能让浏览器回传这些 cookie。
|
|
34
|
+
|
|
35
|
+
打印的 URL 携带进程凭据,只应与预期用户分享。
|
|
36
|
+
|
|
37
|
+
[Web 应用参考](../../../packages/bundle/web-app/README.zh.md#public-deployments)说明 `--public-url`、`--trusted-host` 与 `--tls-cert`/`--tls-key` 命令行选项。在 Web profile 中,`publicUrl` 配置在 `web-runtime` 行,`trustedHosts` 配置在 [Connection 行](../../../packages/client/connection/README.zh.md),`tls` 配置在 [webserver 行](../../../docs/subsystems/web-server.zh.md#config)。
|
|
@@ -40,7 +40,7 @@ Every package lives in exactly one group; new packages join existing groups, and
|
|
|
40
40
|
| [`subprocess/`](subprocess/README.md) | Subprocess capability family: Service Definition + local process-tree provider |
|
|
41
41
|
| [`ssh/`](ssh/README.md) | POSIX remote connection with paired filesystem, subprocess and sandbox providers |
|
|
42
42
|
| [`shell/`](shell/README.md) | Bash capability family: executor seam, local impl, model-facing tools |
|
|
43
|
-
| [`terminal/`](terminal/README.md) | Persistent PTY
|
|
43
|
+
| [`terminal/`](terminal/README.md) | Persistent PTY service with owner-scoped sessions and a local shell backend |
|
|
44
44
|
| [`ptc-runtime/`](ptc-runtime/README.md) | PTC execution capability family: Service Definition + sandboxed Node provider + PTC mode Consumer |
|
|
45
45
|
| [`computer-use/`](computer-use/README.md) | Exclusive named desktop-provider registration |
|
|
46
46
|
| [`browser-use/`](browser-use/README.md) | Exclusive named browser-provider registration |
|
|
@@ -53,9 +53,8 @@ Every package lives in exactly one group; new packages join existing groups, and
|
|
|
53
53
|
| [`context/`](context/README.md) | Model-visible request context: workspace instructions, time context, references |
|
|
54
54
|
| [`subagent/`](subagent/README.md) | Subagent capability family: provider-registry contract and model-facing delegation tools |
|
|
55
55
|
| [`jobs/`](jobs/README.md) | Generic background-job runtime and model-facing job control tools |
|
|
56
|
-
| [`experimental/`](experimental/README.md) |
|
|
57
|
-
| [`workflow/`](workflow/README.md) | Workflow seam, PTC process engine, and model-facing `workflow
|
|
58
|
-
| [`webhook/`](webhook/README.md) | Verified external events, trusted rules, and fire-and-forget Workspace Sessions |
|
|
56
|
+
| [`experimental/`](experimental/README.md) | Capabilities under evaluation; [status and support policy](experimental/README.md#status) |
|
|
57
|
+
| [`workflow/`](workflow/README.md) | Workflow seam, PTC process engine, and the model-facing `workflow` tool |
|
|
59
58
|
| [`web/`](web/README.md) | Web capability family: seam, search/fetch providers, model-facing web tools |
|
|
60
59
|
| [`document/`](document/README.md) | Shared Host Office-to-PDF conversion |
|
|
61
60
|
| [`attachment/`](attachment/README.md) | Durable attachment identity, validation, local content-addressed storage |
|
|
@@ -67,7 +66,6 @@ Every package lives in exactly one group; new packages join existing groups, and
|
|
|
67
66
|
| [`bundle/`](bundle/README.md) | Installable `dsh --profile` patch layers |
|
|
68
67
|
| [`extensions/`](extensions/README.md) | Agent runtime self-modification: live plugin/service inspection and model-written mount/unmount |
|
|
69
68
|
| [`mcp/`](mcp/README.md) | External Model Context Protocol servers exposed as native tools |
|
|
70
|
-
| [`hooks/`](hooks/README.md) | Hook bridges + the shared Claude Code / Codex wire-protocol library |
|
|
71
69
|
| [`session/`](session/README.md) | Durable session data plane: persistence seam + backends, projection seam, log-backed titles, session reporting |
|
|
72
70
|
| [`session-query/`](session-query/README.md) | Session retrieval family: logical corpus, bounded reads, lineage, semantic filtering, SQLite full-text search |
|
|
73
71
|
| [`settings/`](settings/README.md) | User-settings seam + file-backed provider |
|
|
@@ -88,7 +86,7 @@ Every package lives in exactly one group; new packages join existing groups, and
|
|
|
88
86
|
<a id="release-expectations"></a>
|
|
89
87
|
## Release expectations
|
|
90
88
|
|
|
91
|
-
|
|
89
|
+
Product groups have maintained product roles, while their public APIs remain pre-stable. [Experimental status](experimental/README.md#status) is independent of publication, installation, and optional delivery. Nonexperimental runtime packages must have product use or an explicit [package classification](../scripts/product-package-policy.ts); SDK, build, test, and declaration infrastructure have separate classifications.
|
|
92
90
|
|
|
93
91
|
-----
|
|
94
92
|
|
|
@@ -409,6 +409,7 @@ const reference = [
|
|
|
409
409
|
['docs/config-catalog.md', 'reference/config-catalog.md', '插件配置', 'Plugin configuration'],
|
|
410
410
|
['docs/tool-catalog.md', 'reference/tool-catalog.md', 'Tool Schema', 'Tool schemas'],
|
|
411
411
|
['docs/persistence-catalog.md', 'reference/persistence-catalog.md', '持久化事件', 'Persistence events', 'deep'],
|
|
412
|
+
['docs/experimental-persistence-catalog.md', 'reference/experimental-persistence-catalog.md', '实验性持久化记录', 'Experimental persistence'],
|
|
412
413
|
] as const).map(([source, route, rootLabel, enLabel, outline], order): PairedPage => ({
|
|
413
414
|
source,
|
|
414
415
|
route,
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> **这是什么**:DeepSeek Harness 自带的 preset(`packages/preset/agent-preset/`)里有一整套**官方插件开发技能**,是 0.2 世代最重要的新增资料——它描述的正是"在当前 Harness 里、由 agent 自己写并安装插件"的官方流程。
|
|
4
4
|
> **本文件性质**:**要点摘录 + 原文定位**(不是逐字全文;逐字全文随官方文档副本一起在 `references/official-docs/` 之外的仓库路径,需 checkout 才能读)。凡写"官方明确"的地方都能在上游文件里逐字查到。
|
|
5
|
-
> **基线**:`
|
|
5
|
+
> **基线**:`d743267388641bc76f17c45ce8b4c231aed1d32c`(`dsh-v0.2.1-alpha.2`,2026-10-09)。升级宿主后若与上游冲突,以上游为准。
|
|
6
6
|
> **上游路径**(在 checkout 里,如 `D:\deepseek-harness`):`packages/preset/agent-preset/skills/`
|
|
7
7
|
|
|
8
8
|
## 1. 四个技能与各自职责
|
|
@@ -121,4 +121,4 @@
|
|
|
121
121
|
|
|
122
122
|
- 本文件是**索引与摘录**;机制细节(精确签名、事件 `@mode`、Config schema)永远以 **inspection** 与 `references/official-docs/docs/**` 为准。
|
|
123
123
|
- 官方这份技能覆盖"在会话里让 agent 写并安装插件";本知识库另外覆盖**对外发布**(npm/tarball/git 通道、`prepare` + `allowBuilds`、五语 README、质量门禁)与**版本迁移**([migration-0.2.md](../guide/migration-0.2.md))。
|
|
124
|
-
- 上游路径随宿主版本变化(本文件基线 `
|
|
124
|
+
- 上游路径随宿主版本变化(本文件基线 `d743267`);`preset/agent-presets` → `preset/agent-preset` 的改名发生在 `d1e22a7e24`。
|
package/references/sources.md
CHANGED
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
|
|
34
34
|
## C. 本地 checkout 文档副本(references/official-docs/)
|
|
35
35
|
|
|
36
|
-
- `docs/**`(**
|
|
36
|
+
- `docs/**`(**429 个 md**,含 212 个 `.zh.md` 双语对;2026-10-13 重同步到 `dsh-v0.2.1-alpha.2`)— 教程/架构/子系统/API/cookbook/upgrade-guide/persistence-changes 全量(计数以 `references/official-docs/SNAPSHOT.md` 为准)
|
|
37
37
|
- 仓库根文件(**2026-08-14 晚新增**):`AGENTS.md`、`CLAUDE.md`(上游为 symlink→AGENTS.md,副本存其目标文本)、`BENCHMARK.md`、`CONTRIBUTING.md`/`.zh.md`/`.i18n.yaml`、`README.zh.md`/`.i18n.yaml`、`THIRD_PARTY_NOTICES.md`、`LICENSE`
|
|
38
38
|
- `packages/AGENTS.md` · `packages/README.md` · `vendor/README.md`
|
|
39
39
|
- `website-docs.ts`(站点投影清单)
|
|
@@ -122,6 +122,7 @@
|
|
|
122
122
|
- 重跑:脚本均幂等,可随时刷新;`sync-official-docs.ps1` 同步官方文档副本(本次扩展了根文件范围与 `:(top)` pathspec/修剪)。
|
|
123
123
|
- **08-14 晚环境限制记录**:`gh` CLI token 失效(401)后,GitHub 全部查询改走 git 协议(ls-remote/clone)与 codeload;api.github.com 匿名配额 60/h 仅用于 Discussions 评论精选抓取;本机网络直连 github.com 网页与 raw.githubusercontent.com 失败(curl 000),git https 与 codeload 正常。
|
|
124
124
|
- **编码约定(重要)**:Windows PowerShell 5.1 无 BOM 的 UTF-8 脚本会按 ANSI 解析,中文注释尾字节可能吞换行导致代码行并入注释(本次真实踩坑);`scripts/*.ps1` 必须保持 **UTF-8 with BOM**,编辑后务必复核 BOM。
|
|
125
|
+
- **2026-10-13 复核(约定被违反的实例)**:实测 `scripts/` 下 9 个 `.ps1`,**8 个带 BOM 且 5.1 解析 0 错**;唯一无 BOM 的 `verify-kit.ps1` 有 **1644 个非 ASCII 字节**、在 5.1 下报 **5–6 个解析错误**(`Missing ')' in method call`)——**而它正是发布门禁**(`release.yml` 用 `shell: pwsh` 调它,所以 CI 从没发现;本机没有 pwsh 时才暴露)。已补回 BOM 并实测 `VERIFY-OK` / exit 0(82 项关键路径全在)。**根因不是约定错,而是这一个文件丢了 BOM**——另加 `.gitattributes` 固定行尾,避免同类问题复现。
|
|
125
126
|
- 时间戳:下载会话 2026-08-14 22:45–23:59(+08:00);dsh-plugin topic 快照共三期(2026-08-13T15:15Z/08-13T18:36Z/08-14T08:16Z)+ 08-14 晚扫描(total_count 2034,见 §D.2)。
|
|
126
127
|
- 官网 deepseek.com 页面受 Cloudflare 保护时可能失败——以 manifest 记录为准,正文内容以 GitHub Pages 同源文档为准。
|
|
127
128
|
- **备注**:用户清单中 `ess-plugin-mcp` 经 GitHub 搜索无精确匹配(最接近者为 Skyrim .ess 插件工具的 MCP,与 DSH 无关);按 DSH 生态语义定位到 `bobleer/deepseek-harness-plugin-mcp`(让任意 agent 经 MCP 发现/安装/运行 DSH 插件)并归档,如用户所指另有其仓,请告知后补充。
|
|
@@ -1,162 +1,162 @@
|
|
|
1
|
-
# dsh-plugin-guide 官方 GitHub Discussions 归档脚本(可复跑,幂等)
|
|
2
|
-
# 输出: downloads/github/harness/discussions/
|
|
3
|
-
# list.json 全部讨论(title/body/category/answers/labels 等,正文即文档)
|
|
4
|
-
# comments-<n>.json 精选线程的全部评论(选择规则见下)
|
|
5
|
-
# _selection.tsv 精选线程清单
|
|
6
|
-
# README.md 分类统计 + 精选清单
|
|
7
|
-
# 说明: GitHub REST API;未提供 Token 时走匿名配额(60/h,可能不够),建议
|
|
8
|
-
# $env:GH_TOKEN 或 -Token <token>(经典 PAT,只需 public_repo 读权限)。
|
|
9
|
-
# 选择规则(与 08-14 首版覆盖度一致): Announcements 全部; Q&A/Ideas 评论>=1;
|
|
10
|
-
# General/Show and tell 评论>=3 且标题不含拉群/招聘/广告词。
|
|
11
|
-
# 传输用 Invoke-WebRequest(而非 curl.exe 数组参数): PS 5.1 下 curl 数组参数
|
|
12
|
-
# 的引号拆分会把 -H 头打碎,导致静默拿到错误对象——本脚本已规避该坑。
|
|
13
|
-
# 参数: -OutDir <dir> 覆盖输出目录; -SkipComments 只刷新 list.json 不拉评论。
|
|
14
|
-
param(
|
|
15
|
-
[string]$OutDir = '',
|
|
16
|
-
[string]$Repo = 'deepseek-ai/deepseek-harness',
|
|
17
|
-
[string]$Token = $env:GH_TOKEN,
|
|
18
|
-
[switch]$SkipComments
|
|
19
|
-
)
|
|
20
|
-
$ErrorActionPreference = 'Stop'
|
|
21
|
-
$ProgressPreference = 'SilentlyContinue'
|
|
22
|
-
if (-not $OutDir) { $OutDir = Join-Path (Split-Path $PSScriptRoot -Parent) 'downloads\github\harness\discussions' }
|
|
23
|
-
New-Item -ItemType Directory -Force -Path $OutDir | Out-Null
|
|
24
|
-
|
|
25
|
-
$headers = @{ 'User-Agent' = 'dsh-plugin-guide-research'; 'Accept' = 'application/vnd.github+json' }
|
|
26
|
-
if ($Token) { $headers['Authorization'] = "Bearer $Token" }
|
|
27
|
-
|
|
28
|
-
function Get-Api([string]$url) {
|
|
29
|
-
# 返回对象数组;失败/限流时抛错(带状态码),由调用方决定重试或中止。
|
|
30
|
-
try {
|
|
31
|
-
$resp = Invoke-WebRequest -Uri $url -Headers $headers -TimeoutSec 60 -UseBasicParsing
|
|
32
|
-
} catch {
|
|
33
|
-
$code = if ($_.Exception.Response) { [int]$_.Exception.Response.StatusCode } else { 0 }
|
|
34
|
-
throw "HTTP $code : $url"
|
|
35
|
-
}
|
|
36
|
-
$obj = $null
|
|
37
|
-
try { $obj = $resp.Content | ConvertFrom-Json } catch { throw "JSON parse failed: $url" }
|
|
38
|
-
if ($obj -is [System.Management.Automation.PSCustomObject] -and $obj.PSObject.Properties.Name -contains 'message') {
|
|
39
|
-
throw "API message '$($obj.message)' : $url"
|
|
40
|
-
}
|
|
41
|
-
return @($obj)
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
# ---- 1) 全量 list(按创建序分页;REST 的 direction 参数对 discussions 无效,只能从头翻到尾) ----
|
|
45
|
-
$prevCount = 0
|
|
46
|
-
if (Test-Path (Join-Path $OutDir 'list.json')) {
|
|
47
|
-
try { $prev = @((Get-Content (Join-Path $OutDir 'list.json') -Raw -Encoding UTF8 | ConvertFrom-Json)); $prevCount = $prev.Count } catch { $prevCount = 0 }
|
|
48
|
-
}
|
|
49
|
-
$all = @()
|
|
50
|
-
$page = 1
|
|
51
|
-
# REST /discussions caps at 5000 rows (50 pages x 100). The cap is explicit so a
|
|
52
|
-
# silent truncation cannot be mistaken for a complete archive: the run reports
|
|
53
|
-
# when it stops at the ceiling, and the README records the ceiling alongside the
|
|
54
|
-
# GraphQL total_count (which is larger).
|
|
55
|
-
$pageCap = 50
|
|
56
|
-
while ($page -le $pageCap) {
|
|
57
|
-
$items = Get-Api "https://api.github.com/repos/$Repo/discussions?per_page=100&page=$page&sort=created"
|
|
58
|
-
if ($items.Count -eq 0) { Write-Output "page ${page}: 空页,列表结束"; break }
|
|
59
|
-
$all += $items
|
|
60
|
-
Write-Output ("page {0}: +{1} (累计 {2})" -f $page, $items.Count, $all.Count)
|
|
61
|
-
if ($items.Count -lt 100) { break }
|
|
62
|
-
$page++
|
|
63
|
-
Start-Sleep -Milliseconds 500
|
|
64
|
-
}
|
|
65
|
-
if ($all.Count -ge ($pageCap * 100)) {
|
|
66
|
-
Write-Output "WARN: 列表在第 $pageCap 页触顶(REST 5000 条上限)——归档为前 5000 条,非全量;更全的历史需按 GraphQL UPDATED_AT 分页补抓"
|
|
67
|
-
}
|
|
68
|
-
if ($all.Count -eq 0) { throw 'discussions 列表抓取失败(0 条)' }
|
|
69
|
-
if ($prevCount -gt 0 -and $all.Count -lt [Math]::Floor($prevCount * 0.9)) {
|
|
70
|
-
throw "列表疑似缩水: 上次 $prevCount 条, 本次仅 $all.Count 条 —— 拒绝覆盖归档,请检查网络/配额后重跑"
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
# 按 number 去重(分页边界可能重复)
|
|
74
|
-
$uniq = @{}
|
|
75
|
-
foreach ($d in $all) { $uniq[[int]$d.number] = $d }
|
|
76
|
-
$discs = @($uniq.Values | Sort-Object { [int]$_.number })
|
|
77
|
-
$listPath = Join-Path $OutDir 'list.json'
|
|
78
|
-
$discs | ConvertTo-Json -Depth 6 | Set-Content -Path $listPath -Encoding UTF8
|
|
79
|
-
Write-Output "list.json: $($discs.Count) 条 -> $listPath"
|
|
80
|
-
|
|
81
|
-
# ---- 2) 精选线程 + 评论 ----
|
|
82
|
-
$sel = @()
|
|
83
|
-
foreach ($d in $discs) {
|
|
84
|
-
$cat = $d.category.name
|
|
85
|
-
$c = [int]$d.comments
|
|
86
|
-
$t = [string]$d.title
|
|
87
|
-
$pick = $false
|
|
88
|
-
if ($cat -eq 'Announcements') { $pick = $true }
|
|
89
|
-
elseif ($cat -eq 'Q&A' -and $c -ge 1) { $pick = $true }
|
|
90
|
-
elseif ($cat -eq 'Ideas' -and $c -ge 1) { $pick = $true }
|
|
91
|
-
elseif (($cat -eq 'General' -or $cat -eq 'Show and tell') -and $c -ge 3) {
|
|
92
|
-
# 非社群拉群帖: 标题含拉群/扫码/加群/招聘/广告类词的不收
|
|
93
|
-
if ($t -notmatch '群|扫码|加群|招聘|内推|广告|投简历|纳新') { $pick = $true }
|
|
94
|
-
}
|
|
95
|
-
if ($pick) { $sel += $d }
|
|
96
|
-
}
|
|
97
|
-
$sel = @($sel | Sort-Object { [int]$_.number })
|
|
98
|
-
Write-Output "精选线程: $($sel.Count) 条"
|
|
99
|
-
|
|
100
|
-
if (-not $SkipComments) {
|
|
101
|
-
$n = 0
|
|
102
|
-
foreach ($d in $sel) {
|
|
103
|
-
$num = [int]$d.number
|
|
104
|
-
$comments = @()
|
|
105
|
-
$cp = 1
|
|
106
|
-
while ($cp -le 20) {
|
|
107
|
-
$ci = Get-Api "https://api.github.com/repos/$Repo/discussions/$num/comments?per_page=100&page=$cp"
|
|
108
|
-
if ($ci.Count -eq 0) { break }
|
|
109
|
-
$comments += $ci
|
|
110
|
-
if ($ci.Count -lt 100) { break }
|
|
111
|
-
$cp++
|
|
112
|
-
Start-Sleep -Milliseconds 300
|
|
113
|
-
}
|
|
114
|
-
$comments | ConvertTo-Json -Depth 6 | Set-Content -Path (Join-Path $OutDir "comments-$num.json") -Encoding UTF8
|
|
115
|
-
$n++
|
|
116
|
-
if ($n % 20 -eq 0) { Write-Output "comments: $n / $($sel.Count)" }
|
|
117
|
-
Start-Sleep -Milliseconds 200
|
|
118
|
-
}
|
|
119
|
-
Write-Output "comments: 完成 $n 个线程"
|
|
120
|
-
# 清掉列表里已不存在的旧 comments 文件
|
|
121
|
-
$keep = New-Object System.Collections.Generic.HashSet[string]
|
|
122
|
-
foreach ($d in $sel) { [void]$keep.Add("comments-$([int]$d.number).json") }
|
|
123
|
-
Get-ChildItem $OutDir -Filter 'comments-*.json' | Where-Object { -not $keep.Contains($_.Name) } | Remove-Item -Force
|
|
124
|
-
} else {
|
|
125
|
-
Write-Output 'comments: 跳过(-SkipComments)'
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
# ---- 3) _selection.tsv 与 README.md ----
|
|
129
|
-
$selLines = @('number' + "`t" + 'category' + "`t" + 'comments' + "`t" + 'title')
|
|
130
|
-
foreach ($d in $sel) { $selLines += ("{0}`t{1}`t{2}`t{3}" -f $d.number, $d.category.name, $d.comments, ($d.title -replace "`t",' ')) }
|
|
131
|
-
Set-Content -Path (Join-Path $OutDir '_selection.tsv') -Value $selLines -Encoding UTF8
|
|
132
|
-
|
|
133
|
-
$cats = @{}
|
|
134
|
-
foreach ($d in $discs) { $k = [string]$d.category.name; if (-not $cats.ContainsKey($k)) { $cats[$k] = 0 }; $cats[$k]++ }
|
|
135
|
-
$utc = (Get-Date).ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ssZ')
|
|
136
|
-
$L = @()
|
|
137
|
-
$L += '# 官方 GitHub Discussions 归档(自动生成,见抓取时间)'
|
|
138
|
-
$L += ''
|
|
139
|
-
$L += '> 来源:https://github.com/deepseek-ai/deepseek-harness/discussions (官方仓库 Issues 关闭,Discussions 为反馈主渠道)。'
|
|
140
|
-
$L += '> 抓取:GitHub REST API(list 含每条正文;comments-<n>.json 为精选线程的全部评论)。'
|
|
141
|
-
$L += "> 更新:提供 ``GH_TOKEN`` 后可由 ``scripts/archive-discussions.ps1`` 幂等刷新;抓取时间 $utc (UTC)。"
|
|
142
|
-
$L += ''
|
|
143
|
-
$L += '## 文件'
|
|
144
|
-
$L += ''
|
|
145
|
-
$L += "- list.json — 全部 $($discs.Count) 条讨论(含 title/body/category/answers/labels 等字段,正文即模型可读文档)。"
|
|
146
|
-
$L += "- comments-<n>.json — 精选 $($sel.Count) 条线程的评论(选择规则:Announcements/Q&A/Ideas 评论>=1;General/Show and tell 评论>=3 且非社群拉群帖)。"
|
|
147
|
-
$L += '- _selection.tsv — 精选线程清单(编号/分类/评论数/标题)。'
|
|
148
|
-
$L += ''
|
|
149
|
-
$L += '## 分类统计'
|
|
150
|
-
$L += ''
|
|
151
|
-
foreach ($k in @($cats.Keys | Sort-Object)) { $L += "- $k:$($cats[$k]) 条" }
|
|
152
|
-
$L += ''
|
|
153
|
-
$L += '## 有归档评论的精选线程'
|
|
154
|
-
$L += ''
|
|
155
|
-
$L += '| # | 分类 | 评论 | 标题 |'
|
|
156
|
-
$L += '|---|---|---|---|'
|
|
157
|
-
foreach ($d in $sel) {
|
|
158
|
-
$title = ($d.title -replace '\|','\|' -replace "[\r\n]",' ')
|
|
159
|
-
$L += "| [#$($d.number)](https://github.com/deepseek-ai/deepseek-harness/discussions/$($d.number)) | $($d.category.name) | $($d.comments) | $title |"
|
|
160
|
-
}
|
|
161
|
-
Set-Content -Path (Join-Path $OutDir 'README.md') -Value ($L -join "`r`n") -Encoding UTF8
|
|
162
|
-
Write-Output "DONE: list=$($discs.Count) selected=$($sel.Count) -> $OutDir"
|
|
1
|
+
# dsh-plugin-guide 官方 GitHub Discussions 归档脚本(可复跑,幂等)
|
|
2
|
+
# 输出: downloads/github/harness/discussions/
|
|
3
|
+
# list.json 全部讨论(title/body/category/answers/labels 等,正文即文档)
|
|
4
|
+
# comments-<n>.json 精选线程的全部评论(选择规则见下)
|
|
5
|
+
# _selection.tsv 精选线程清单
|
|
6
|
+
# README.md 分类统计 + 精选清单
|
|
7
|
+
# 说明: GitHub REST API;未提供 Token 时走匿名配额(60/h,可能不够),建议
|
|
8
|
+
# $env:GH_TOKEN 或 -Token <token>(经典 PAT,只需 public_repo 读权限)。
|
|
9
|
+
# 选择规则(与 08-14 首版覆盖度一致): Announcements 全部; Q&A/Ideas 评论>=1;
|
|
10
|
+
# General/Show and tell 评论>=3 且标题不含拉群/招聘/广告词。
|
|
11
|
+
# 传输用 Invoke-WebRequest(而非 curl.exe 数组参数): PS 5.1 下 curl 数组参数
|
|
12
|
+
# 的引号拆分会把 -H 头打碎,导致静默拿到错误对象——本脚本已规避该坑。
|
|
13
|
+
# 参数: -OutDir <dir> 覆盖输出目录; -SkipComments 只刷新 list.json 不拉评论。
|
|
14
|
+
param(
|
|
15
|
+
[string]$OutDir = '',
|
|
16
|
+
[string]$Repo = 'deepseek-ai/deepseek-harness',
|
|
17
|
+
[string]$Token = $env:GH_TOKEN,
|
|
18
|
+
[switch]$SkipComments
|
|
19
|
+
)
|
|
20
|
+
$ErrorActionPreference = 'Stop'
|
|
21
|
+
$ProgressPreference = 'SilentlyContinue'
|
|
22
|
+
if (-not $OutDir) { $OutDir = Join-Path (Split-Path $PSScriptRoot -Parent) 'downloads\github\harness\discussions' }
|
|
23
|
+
New-Item -ItemType Directory -Force -Path $OutDir | Out-Null
|
|
24
|
+
|
|
25
|
+
$headers = @{ 'User-Agent' = 'dsh-plugin-guide-research'; 'Accept' = 'application/vnd.github+json' }
|
|
26
|
+
if ($Token) { $headers['Authorization'] = "Bearer $Token" }
|
|
27
|
+
|
|
28
|
+
function Get-Api([string]$url) {
|
|
29
|
+
# 返回对象数组;失败/限流时抛错(带状态码),由调用方决定重试或中止。
|
|
30
|
+
try {
|
|
31
|
+
$resp = Invoke-WebRequest -Uri $url -Headers $headers -TimeoutSec 60 -UseBasicParsing
|
|
32
|
+
} catch {
|
|
33
|
+
$code = if ($_.Exception.Response) { [int]$_.Exception.Response.StatusCode } else { 0 }
|
|
34
|
+
throw "HTTP $code : $url"
|
|
35
|
+
}
|
|
36
|
+
$obj = $null
|
|
37
|
+
try { $obj = $resp.Content | ConvertFrom-Json } catch { throw "JSON parse failed: $url" }
|
|
38
|
+
if ($obj -is [System.Management.Automation.PSCustomObject] -and $obj.PSObject.Properties.Name -contains 'message') {
|
|
39
|
+
throw "API message '$($obj.message)' : $url"
|
|
40
|
+
}
|
|
41
|
+
return @($obj)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
# ---- 1) 全量 list(按创建序分页;REST 的 direction 参数对 discussions 无效,只能从头翻到尾) ----
|
|
45
|
+
$prevCount = 0
|
|
46
|
+
if (Test-Path (Join-Path $OutDir 'list.json')) {
|
|
47
|
+
try { $prev = @((Get-Content (Join-Path $OutDir 'list.json') -Raw -Encoding UTF8 | ConvertFrom-Json)); $prevCount = $prev.Count } catch { $prevCount = 0 }
|
|
48
|
+
}
|
|
49
|
+
$all = @()
|
|
50
|
+
$page = 1
|
|
51
|
+
# REST /discussions caps at 5000 rows (50 pages x 100). The cap is explicit so a
|
|
52
|
+
# silent truncation cannot be mistaken for a complete archive: the run reports
|
|
53
|
+
# when it stops at the ceiling, and the README records the ceiling alongside the
|
|
54
|
+
# GraphQL total_count (which is larger).
|
|
55
|
+
$pageCap = 50
|
|
56
|
+
while ($page -le $pageCap) {
|
|
57
|
+
$items = Get-Api "https://api.github.com/repos/$Repo/discussions?per_page=100&page=$page&sort=created"
|
|
58
|
+
if ($items.Count -eq 0) { Write-Output "page ${page}: 空页,列表结束"; break }
|
|
59
|
+
$all += $items
|
|
60
|
+
Write-Output ("page {0}: +{1} (累计 {2})" -f $page, $items.Count, $all.Count)
|
|
61
|
+
if ($items.Count -lt 100) { break }
|
|
62
|
+
$page++
|
|
63
|
+
Start-Sleep -Milliseconds 500
|
|
64
|
+
}
|
|
65
|
+
if ($all.Count -ge ($pageCap * 100)) {
|
|
66
|
+
Write-Output "WARN: 列表在第 $pageCap 页触顶(REST 5000 条上限)——归档为前 5000 条,非全量;更全的历史需按 GraphQL UPDATED_AT 分页补抓"
|
|
67
|
+
}
|
|
68
|
+
if ($all.Count -eq 0) { throw 'discussions 列表抓取失败(0 条)' }
|
|
69
|
+
if ($prevCount -gt 0 -and $all.Count -lt [Math]::Floor($prevCount * 0.9)) {
|
|
70
|
+
throw "列表疑似缩水: 上次 $prevCount 条, 本次仅 $all.Count 条 —— 拒绝覆盖归档,请检查网络/配额后重跑"
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
# 按 number 去重(分页边界可能重复)
|
|
74
|
+
$uniq = @{}
|
|
75
|
+
foreach ($d in $all) { $uniq[[int]$d.number] = $d }
|
|
76
|
+
$discs = @($uniq.Values | Sort-Object { [int]$_.number })
|
|
77
|
+
$listPath = Join-Path $OutDir 'list.json'
|
|
78
|
+
$discs | ConvertTo-Json -Depth 6 | Set-Content -Path $listPath -Encoding UTF8
|
|
79
|
+
Write-Output "list.json: $($discs.Count) 条 -> $listPath"
|
|
80
|
+
|
|
81
|
+
# ---- 2) 精选线程 + 评论 ----
|
|
82
|
+
$sel = @()
|
|
83
|
+
foreach ($d in $discs) {
|
|
84
|
+
$cat = $d.category.name
|
|
85
|
+
$c = [int]$d.comments
|
|
86
|
+
$t = [string]$d.title
|
|
87
|
+
$pick = $false
|
|
88
|
+
if ($cat -eq 'Announcements') { $pick = $true }
|
|
89
|
+
elseif ($cat -eq 'Q&A' -and $c -ge 1) { $pick = $true }
|
|
90
|
+
elseif ($cat -eq 'Ideas' -and $c -ge 1) { $pick = $true }
|
|
91
|
+
elseif (($cat -eq 'General' -or $cat -eq 'Show and tell') -and $c -ge 3) {
|
|
92
|
+
# 非社群拉群帖: 标题含拉群/扫码/加群/招聘/广告类词的不收
|
|
93
|
+
if ($t -notmatch '群|扫码|加群|招聘|内推|广告|投简历|纳新') { $pick = $true }
|
|
94
|
+
}
|
|
95
|
+
if ($pick) { $sel += $d }
|
|
96
|
+
}
|
|
97
|
+
$sel = @($sel | Sort-Object { [int]$_.number })
|
|
98
|
+
Write-Output "精选线程: $($sel.Count) 条"
|
|
99
|
+
|
|
100
|
+
if (-not $SkipComments) {
|
|
101
|
+
$n = 0
|
|
102
|
+
foreach ($d in $sel) {
|
|
103
|
+
$num = [int]$d.number
|
|
104
|
+
$comments = @()
|
|
105
|
+
$cp = 1
|
|
106
|
+
while ($cp -le 20) {
|
|
107
|
+
$ci = Get-Api "https://api.github.com/repos/$Repo/discussions/$num/comments?per_page=100&page=$cp"
|
|
108
|
+
if ($ci.Count -eq 0) { break }
|
|
109
|
+
$comments += $ci
|
|
110
|
+
if ($ci.Count -lt 100) { break }
|
|
111
|
+
$cp++
|
|
112
|
+
Start-Sleep -Milliseconds 300
|
|
113
|
+
}
|
|
114
|
+
$comments | ConvertTo-Json -Depth 6 | Set-Content -Path (Join-Path $OutDir "comments-$num.json") -Encoding UTF8
|
|
115
|
+
$n++
|
|
116
|
+
if ($n % 20 -eq 0) { Write-Output "comments: $n / $($sel.Count)" }
|
|
117
|
+
Start-Sleep -Milliseconds 200
|
|
118
|
+
}
|
|
119
|
+
Write-Output "comments: 完成 $n 个线程"
|
|
120
|
+
# 清掉列表里已不存在的旧 comments 文件
|
|
121
|
+
$keep = New-Object System.Collections.Generic.HashSet[string]
|
|
122
|
+
foreach ($d in $sel) { [void]$keep.Add("comments-$([int]$d.number).json") }
|
|
123
|
+
Get-ChildItem $OutDir -Filter 'comments-*.json' | Where-Object { -not $keep.Contains($_.Name) } | Remove-Item -Force
|
|
124
|
+
} else {
|
|
125
|
+
Write-Output 'comments: 跳过(-SkipComments)'
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
# ---- 3) _selection.tsv 与 README.md ----
|
|
129
|
+
$selLines = @('number' + "`t" + 'category' + "`t" + 'comments' + "`t" + 'title')
|
|
130
|
+
foreach ($d in $sel) { $selLines += ("{0}`t{1}`t{2}`t{3}" -f $d.number, $d.category.name, $d.comments, ($d.title -replace "`t",' ')) }
|
|
131
|
+
Set-Content -Path (Join-Path $OutDir '_selection.tsv') -Value $selLines -Encoding UTF8
|
|
132
|
+
|
|
133
|
+
$cats = @{}
|
|
134
|
+
foreach ($d in $discs) { $k = [string]$d.category.name; if (-not $cats.ContainsKey($k)) { $cats[$k] = 0 }; $cats[$k]++ }
|
|
135
|
+
$utc = (Get-Date).ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ssZ')
|
|
136
|
+
$L = @()
|
|
137
|
+
$L += '# 官方 GitHub Discussions 归档(自动生成,见抓取时间)'
|
|
138
|
+
$L += ''
|
|
139
|
+
$L += '> 来源:https://github.com/deepseek-ai/deepseek-harness/discussions (官方仓库 Issues 关闭,Discussions 为反馈主渠道)。'
|
|
140
|
+
$L += '> 抓取:GitHub REST API(list 含每条正文;comments-<n>.json 为精选线程的全部评论)。'
|
|
141
|
+
$L += "> 更新:提供 ``GH_TOKEN`` 后可由 ``scripts/archive-discussions.ps1`` 幂等刷新;抓取时间 $utc (UTC)。"
|
|
142
|
+
$L += ''
|
|
143
|
+
$L += '## 文件'
|
|
144
|
+
$L += ''
|
|
145
|
+
$L += "- list.json — 全部 $($discs.Count) 条讨论(含 title/body/category/answers/labels 等字段,正文即模型可读文档)。"
|
|
146
|
+
$L += "- comments-<n>.json — 精选 $($sel.Count) 条线程的评论(选择规则:Announcements/Q&A/Ideas 评论>=1;General/Show and tell 评论>=3 且非社群拉群帖)。"
|
|
147
|
+
$L += '- _selection.tsv — 精选线程清单(编号/分类/评论数/标题)。'
|
|
148
|
+
$L += ''
|
|
149
|
+
$L += '## 分类统计'
|
|
150
|
+
$L += ''
|
|
151
|
+
foreach ($k in @($cats.Keys | Sort-Object)) { $L += "- $k:$($cats[$k]) 条" }
|
|
152
|
+
$L += ''
|
|
153
|
+
$L += '## 有归档评论的精选线程'
|
|
154
|
+
$L += ''
|
|
155
|
+
$L += '| # | 分类 | 评论 | 标题 |'
|
|
156
|
+
$L += '|---|---|---|---|'
|
|
157
|
+
foreach ($d in $sel) {
|
|
158
|
+
$title = ($d.title -replace '\|','\|' -replace "[\r\n]",' ')
|
|
159
|
+
$L += "| [#$($d.number)](https://github.com/deepseek-ai/deepseek-harness/discussions/$($d.number)) | $($d.category.name) | $($d.comments) | $title |"
|
|
160
|
+
}
|
|
161
|
+
Set-Content -Path (Join-Path $OutDir 'README.md') -Value ($L -join "`r`n") -Encoding UTF8
|
|
162
|
+
Write-Output "DONE: list=$($discs.Count) selected=$($sel.Count) -> $OutDir"
|
|
@@ -18,13 +18,21 @@ const root = path.dirname(path.dirname(fileURLToPath(import.meta.url)))
|
|
|
18
18
|
// Reading order: what a plugin author needs first, then the evidence base.
|
|
19
19
|
const SOURCES = [
|
|
20
20
|
['README.md', 'Overview'],
|
|
21
|
+
// SKILL.md first among the authored docs: it carries the contract red lines,
|
|
22
|
+
// and llms-full previously omitted it entirely.
|
|
23
|
+
['SKILL.md', 'Agent skill: contract red lines and task-based development paths'],
|
|
24
|
+
['guide/version-matrix.md', 'Version adaptivity matrix (latest values, seams, peer ranges, session format)'],
|
|
21
25
|
['guide/plugin-dev-guide.md', 'Plugin development guide (10 chapters)'],
|
|
22
26
|
['guide/quick-reference.md', 'Quick reference'],
|
|
27
|
+
['guide/migration-0.2.md', 'Migration to the 0.2 generation (breaking changes)'],
|
|
28
|
+
['guide/family-toolchain.md', 'Family toolchain router (check catalogs and crosswalk)'],
|
|
23
29
|
['guide/when-to-retire-a-plugin.md', 'When to retire or freeze a plugin'],
|
|
24
30
|
['guide/choosing-a-plugin.md', 'Choosing a plugin: who leads each capability surface'],
|
|
25
31
|
['guide/release-engineering.md', 'Release engineering'],
|
|
26
32
|
['guide/unfixed-issues.md', 'Unfixed upstream issues (source-verified)'],
|
|
27
33
|
['guide/links.md', 'Curated links'],
|
|
34
|
+
['references/official-plugin-dev-skill.md', 'Distilled official in-repo plugin-development skill'],
|
|
35
|
+
['references/dev-resource-landscape.md', 'Competing and adjacent plugin-development resources'],
|
|
28
36
|
['references/harness-repo.md', 'Harness repository reference'],
|
|
29
37
|
['references/upstream-cordis.md', 'Upstream Cordis reference'],
|
|
30
38
|
['references/cordis-paper-and-community.md', 'Cordis paper and community'],
|