The fork was pinned at upstream v0.18.0. That is the entire reason the window
ran TWO sidebars and TWO near-identical panel toggles: DSH 2.0.10 ships its own
right sidebar (@deepseek-ai/dsh-client-ui-sidebar-right), and upstream only
adopted it in v0.19.0-alpha.1 — which arrived after our fork point. v0.19.1 is
also the one upstream line whose support range actually matches our host
(engines.dsh >=0.1.5-rc.1, 14 DSH peers ^0.1.5-rc.1, host = 0.1.5-rc.2), so it
is the only tag the host's startup precheck accepts.
What upstream v0.18.0 → v0.19.1 brings
- src/client/native/{index,surface,tab-adapter}.tsx: every tab the plugin can
draw becomes an OFFICIAL native tab type + body, and an external plugin's
descriptor registered later gets its native type too. This is what retires
the fork's own right panel — and with it the duplicate toggle cluster
(`toggleCluster` is gone from v0.19.1).
- native tab-chip icons via the `sidebar.right.pane.tab.title` seat, coloured
built-in tab icons, file/folder glyphs from DSH's own `FileTypeIcon`.
- guide descriptions (DSH renders them while the guide lists <= 4 entries),
tab bodies that fill the panel, and the 0.1.5-rc.2 adaptation work we were
carrying by hand (peer/devDep pinning, primitives' transitive devDeps).
How the sync was done
Rebuilt the tree from the v0.19.1 tag rather than resolving 53 conflicted
files: our v0.18.0 delta was measured first and is only (a) one mechanical
rename `dsh-better-sidebar` -> `dsh-apes-sidebar` and (b) ten real edits. So:
tag tree + rename (scoped: code/config/scripts/tests/README, while the 46
historical docs/plans records and switch.sh's upstream package name stay
untouched) + re-applied deltas + our apes module.
Fork deltas re-applied on the new base
- src/client/apes/ (icons / locales / tabs): the three apes:* information-layer
tabs (agents / apps / profile), registered through the same BetterSidebarService
as the builtins — which is exactly why they now ride upstream's native adapter
into the official sidebar for free.
- identity: package.json (name/version 1.2.0/description/forkedFrom), dsh.plugin.json
(id/version), SIDEBAR_SERVICE_VERSION 1.2.0, README fork notice,
docs/external-plugin-guide.md.
- scripts/switch.sh + the pnpm switch* scripts (apes <-> upstream two-line switch).
- tests/apes-tabs.spec.ts (unescaped: it starts from the v0.19.1 base).
Dropped
- the Phase A native-registration spike (`apes/native-tabs.tsx` + its spec): it
re-derived by hand exactly what upstream's native layer already does — the
hand-written bridge is dead weight now, and v0.19.1's own e2e/jsdom lanes
cover the same seat contract far better.
- the unused apesProfileGuideDesc key and the two package.json.bak.* backups.
Verified on the new base: typecheck clean; build clean; 1351 passed / 9 skipped
(128 files), up from 1255 on the old base.
117 lines
4.1 KiB
YAML
117 lines
4.1 KiB
YAML
name: Release
|
|
|
|
# Publishes `dsh-apes-sidebar` to npm via npm Trusted Publishing (OIDC) —
|
|
# no NPM_TOKEN secret required, provenance is attached to the tarball.
|
|
#
|
|
# Trigger: a GitHub Release is published (tag vX.Y.Z). The tag MUST match
|
|
# package.json `version`; the workflow verifies this before publishing.
|
|
#
|
|
# Dist-tag policy: a PRERELEASE version (e.g. v0.18.0-alpha.0 — the DSH
|
|
# 0.1.2-alpha adapter track) publishes under the npm `alpha` dist-tag so the
|
|
# `latest` install target keeps pointing at the last stable cut (which
|
|
# supports the stable DSH line); stable versions publish as `latest`.
|
|
#
|
|
# One-time npm-side setup (manual, on npmjs.com):
|
|
# 1. package `dsh-apes-sidebar` -> Settings -> Publishing access
|
|
# -> Trusted Publishers -> "Add Trusted Publisher".
|
|
# 2. Provider: GitHub Actions
|
|
# Organization or user: omdsh-dev
|
|
# Repository: DSH-better-sidebar
|
|
# Workflow filename: release.yml
|
|
# Environment: (blank)
|
|
# 3. Save. Do NOT add an NPM_TOKEN secret — Trusted Publishing replaces it.
|
|
# Canonical reference: https://docs.npmjs.com/trusted-publishers
|
|
|
|
on:
|
|
release:
|
|
types: [published]
|
|
workflow_dispatch:
|
|
inputs:
|
|
dry_run:
|
|
description: Pack and verify everything, but do not publish
|
|
type: boolean
|
|
default: false
|
|
|
|
permissions:
|
|
contents: read
|
|
id-token: write # mint the OIDC token npm Trusted Publishing exchanges
|
|
|
|
concurrency:
|
|
group: npm-release
|
|
cancel-in-progress: false
|
|
|
|
jobs:
|
|
publish:
|
|
name: build · verify · publish
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 30
|
|
steps:
|
|
- uses: actions/checkout@v7
|
|
with:
|
|
# Tests run git log against this repository and need full history.
|
|
fetch-depth: 0
|
|
|
|
# pnpm version is pinned via packageManager in package.json; the action
|
|
# reads it from there (specifying both makes action-setup fail on
|
|
# purpose with ERR_PNPM_BAD_PM_VERSION).
|
|
- uses: pnpm/action-setup@v6
|
|
|
|
- uses: actions/setup-node@v7
|
|
with:
|
|
node-version: 22
|
|
registry-url: https://registry.npmjs.org
|
|
cache: pnpm
|
|
|
|
# The plugin's git revert/cherry-pick spawn git without an identity
|
|
# (see tests/smoke.spec.ts); the runner has none by default.
|
|
- name: Configure git identity for tests
|
|
run: |
|
|
git config --global user.name "dsh-apes-sidebar-ci"
|
|
git config --global user.email "ci@dsh.invalid"
|
|
|
|
- name: Install dependencies
|
|
run: pnpm install --frozen-lockfile
|
|
|
|
- name: Verify release tag matches package.json version
|
|
if: github.event_name == 'release'
|
|
env:
|
|
RELEASE_TAG: ${{ github.event.release.tag_name }}
|
|
run: |
|
|
expected="v$(node -p "require('./package.json').version")"
|
|
echo "package.json version: ${expected#v}"
|
|
echo "release tag: ${RELEASE_TAG}"
|
|
if [ "${RELEASE_TAG}" != "${expected}" ]; then
|
|
echo "::error::Release tag ${RELEASE_TAG} does not match package.json version ${expected#v} (expected ${expected})."
|
|
exit 1
|
|
fi
|
|
|
|
- name: Typecheck
|
|
run: pnpm typecheck
|
|
|
|
- name: Lint
|
|
run: pnpm lint
|
|
|
|
- name: Test
|
|
run: pnpm test
|
|
|
|
- name: Build
|
|
run: pnpm build
|
|
|
|
# The consumer-facing declaration surface guard — mirrors the ci.yml
|
|
# verification order (typecheck → lint → test → build →
|
|
# check:consumer-types) so a release is gated on the same checks a PR
|
|
# runs.
|
|
- name: Check consumer type surface
|
|
run: pnpm check:consumer-types
|
|
|
|
- name: Dry-run publish (validation only)
|
|
if: github.event_name == 'workflow_dispatch' && github.event.inputs.dry_run == 'true'
|
|
run: pnpm publish --dry-run --no-git-checks
|
|
|
|
- name: Publish to npm
|
|
if: github.event_name == 'release' || github.event.inputs.dry_run != 'true'
|
|
run: |
|
|
TAG=$(node -p "require('./package.json').version.includes('-') ? 'alpha' : 'latest'")
|
|
echo "publishing to npm dist-tag: ${TAG}"
|
|
pnpm publish --provenance --access public --no-git-checks --tag "$TAG"
|