Repository navigation
Releases
v0.11.2 — fix postinstall failing on a fresh install
Fixes a hard install failure that only appears on a first install of the github: dependency.
The failure
node_modules/dsh-teams-x postinstall$ node scripts/postinstall-check.mjs
Error: Cannot find module '.../node_modules/dsh-teams-x/scripts/postinstall-check.mjs'
[ELIFECYCLE] Command failed with exit code 1
package.json points postinstall at scripts/postinstall-check.mjs, but the files whitelist never included scripts/. pnpm applies files to git-hosted dependencies too, so the installed tree is assets, cordis.patch.yml, lib, LICENSE, package.json, README.md, README_ZH.md — with no scripts/ — and Node cannot load the module at all.
The check is defeated by its own absence: the script's docblock says it is "best effort — never fails the install", yet a missing script fails the install outright.
The fix
Adds only scripts/postinstall-check.mjs to files. The prepublish-only clean-build.mjs runs from the repository at publish time and does not belong in the tarball.
Verification
Packed, extracted to a clean directory, and ran the postinstall from there:
- bundles present → prints
[dsh-teams-x] plugin bundles present, exit 0 lib/removed → prints the missing-build-output pointer, still exit 0, honouring its promise not to fail an install
Reproduced before the fix by running the postinstall from the installed directory, which gave the same MODULE_NOT_FOUND.
Why this was not caught on the development machine
Existing installs here did not surface it because pnpm records the package as already built in node_modules/.modules.yaml and skips build scripts on re-install. The failure only appears on a genuinely first install — which is exactly the path everyone else takes.
v0.11.1 — fix silently dropped status in update_task
Fixes a silent data-loss bug reported by a member subagent during a live run.
The bug
Calling teamsx_update_task with status and progress in the same invocation wrote the progress note but left the status untouched — and reported no error. The tool echoed the unchanged status, so a response like Task t1 attempt 1 → claimed read like success.
The progress branch in src/tools.ts appended the note, persisted, and returned unconditionally. The actual transition lived further down and was only reachable when progress === undefined.
This deadlocks the ordinary member flow. A member that marks work in_progress with a progress note sees nothing happen; the follow-up attempt to jump straight to completed is then rejected by the claimed-cannot-jump rule, which presents as a scheduler malfunction rather than a dropped write.
The fix
The progress branch returns early only when the same call carries neither status nor output, so a note on its own keeps its exact previous behaviour and timeline shape. Otherwise it falls through: the note is already on the task, and the main path persists it together with the transition.
The quality gate and transition validation still apply. Verified that evaluateQualityCompletion passes through when status is undefined (quality.ts:299, :306), so a pure note is never rejected by routing it through the main path.
The progress parameter description previously read "WITHOUT changing status" — which contradicted the merged semantics and invited exactly the two-call pattern that failed silently.
Verification
Regression tests B8a–B8e: a combined call returns the new status, persists the transition, and lands the note in progressLog; a note on its own changes no status and adds no extra task-updated timeline entry.
Negative control: with the previous lib/tools.js restored, B8a and B8b fail with got claimed while B8c passes — the same signature the member reported, reproduced from the shipped artifact.
247/247 functional tests, tsc clean on both compiler faces, verify:flow and the client bundle smoke test green.
v0.11.0 — restore member-transcript navigation
Fixes the dead member-navigation path reported as a known issue in v0.10.3.
Two independent causes, both predating 0.2.0-rc.1
1. The navigation methods no longer exist on ISessions. open, openSubagent, and refreshSubagents were all removed — navigation belongs to the view owner (packages/api/session-controller/src/client/contract/sessions.ts:49-51). The old feature-detect guard was therefore always true, so every member click fell into sessions.open(childSessionId) and threw a TypeError.
Member navigation now goes through the view owner: the plugin injects uiWorkspace and calls uiWorkspace.openSession(address). Cold subagents are absent from the ordinary session list, so the selection carries the durable direct-parent address — reusing one the client runtime already retained when it belongs to this captain.
2. The module could not load at all. The dynamic import('./session-navigation.ts') compiled to a synchronous require("./session-navigation-2QJqPWyL.cjs"), but the host serves relative chunks only as require.async under the name client.<name>.js (CLIENT_CHUNK, packages/client/modules/src/client/system.ts:335). That name fails both the client. prefix and the .js extension, and the rejection was swallowed into a single console.warn. The import is now static, so no sibling chunk is emitted, and the orphaned lib/session-navigation-2QJqPWyL.cjs(.map) is deleted.
Also in this release
ActivityPanel'ssessionsprop was declared but never read (navigation went throughopenMember) — removed rather than retyped.- The client face now imports the host's real
UiWorkspaceandSubagentAddresstypes instead of hand-rolled structural ones. That self-declared typing is exactly what let the removed-API drift passtscunnoticed;dsh-client-ui-workspacegains adevDependencieslink and apeerDependenciesentry so future drift is caught.
Verification
- 5/5 regression tests against the shipped
lib/client/session-navigation.js: constructs the address when none is retained, reuses a retained address from this captain, ignores a retained address owned by a different parent, works when the runtime exposes no address reader, and touches none of the removedISessionsmethods. tscclean on both compiler faces against 0.2.0-rc.1 host types.- 242/242 functional tests,
verify:flow, client bundle smoke. - The built bundle contains no relative
requireand no reference toopenSubagent/refreshSubagents/sessions.open(.
Not verified: a live browser click-through of a member row. The activity panel gates on captainSessionId === sessionId and fetches its state only at mount, so the E2E harness could not drive a member click against a stubbed endpoint. The fix is verified at the unit and bundle level, not by an observed click.
v0.10.4 — fix halted-card warn token for DSH 0.2.0-rc.1
Follow-up to v0.10.3, found by inspecting the bundle actually being served.
The "halted" badge on the in-chat team card referenced --dsw-alias-state-warning-primary, a variable the host does not define. The host ships --dsw-alias-state-warn-primary (packages/client/ui-theme/src/styles/design-platform.css:257). The badge was therefore always falling through to its hardcoded #f5a623 fallback, which reads too bright in dark themes.
ActivityPanel.module.css already used the correct name — this aligns the card to the same token instead of carrying two spellings of one colour. The same stale token was fixed in dsh-remote-x 0.3.1.
Rebuilt lib/ at the original /tmp/opencode/teamsx-build path so the CSS-module hashes are unchanged and the artifact diff is the single line. Smoke test and 242/242 functional tests green.
v0.10.3 — align to DeepSeek Harness 0.2.0-rc.1
Aligns the plugin's declared host contract with DeepSeek Harness 0.2.0-rc.1.
Fixed
peerDependenciesnow declare>=0.2.0-rc.1for all twelve@deepseek-ai/dsh-*peers (were>=0.1.2-alpha.2/>=0.1.5-rc.1). Under semver's prerelease rule a prerelease only satisfies a range whose comparator shares its[major, minor, patch]tuple, so every old range evaluated false against0.2.0-rc.1— the manifest misdeclared its host and would failauto-install-peerson profiles using pnpm's default setting.sidebar.right.pane.tabguide entries carry the requiredid(SidebarRightGuideEntry.id,ui-sidebar-right/src/client/tab-registry.ts:66).- Closed a type-check blind spot:
@deepseek-ai/dsh-client-ui-sidebar-rightwas the only@deepseek-aidependency with nodevDependencieslink, so the client face had been compiling against the published 0.1.5-rc.1 types instead of the host's 0.2.0-rc.1 — which is exactly why the missing guideidwent unnoticed. It now links to the host checkout, andpeerDependenciesMeta.optionalwas added (it was the one peer of sixteen missing it). package.jsondescription and both READMEs now name 0.2.0-rc.1.
Verified against the 0.2.0-rc.1 tree
tsc clean on both compiler faces · 242/242 functional tests · verify:flow · client bundle smoke test. The substantive surface is unchanged there: the teamsx_* tool contracts, all host and client services, all five UI slots, the sidebar-right tab registry, the commandUi popupSelect contribution, and the DOM hooks all still exist with the shapes the plugin expects.
lib/ is rebuilt at the original /tmp/opencode/teamsx-build path so lightningcss reproduces the committed class hashes — the artifact diff is the fix alone, not a hash reshuffle.
Known issues (both predate this release, not introduced here)
- Member navigation is dead. Clicking a member name does nothing, for two independent reasons: (a)
tsdown.config.tscompiles thesession-navigation.tsdynamic import into a synchronousrequire("./session-navigation-*.cjs"), but the host only serves relative chunks asrequire.asyncunder the nameclient.<name>.js; (b) even if it loaded, the chunk callssessions.openSubagent/refreshSubagents/open, all removed — navigation now belongs to view owners. Everything else (tools, badge, panel, cards,/teamsxcommand) works, which is why it goes unnoticed. compat.tsreads child descriptors through the host's deprecatedSession.ownEvents(). Still functional; the non-deprecated path is the asyncsessionQuery+subagentCatalogprojection.
TeamsX v0.2.2
TeamsX v0.2.2
v0.2.2 streamlines the desktop entry points and re-anchors the badge dropdown panel.
🗑 Removed (desktop, by product decision)
Left sidebar panel-icon entry
The TeamsX button on the sidebar's panel-icon row (sidebar.panellist) and the main-column panel it opened are gone. The desktop UI now offers exactly two paths into the team activity — the session-header badge dropdown and the right Sidebar tab — instead of three redundant ones. Mobile is unaffected (the right Sidebar tab is the full-width drawer there).
🔧 Fixed
Badge dropdown panel placement (desktop)
The badge sits mid-header, so anchoring the 400px panel by its right edge pushed the card into the content area's top-left corner — visually detached from the badge and covering the transcript. The panel now anchors to the badge's left edge and opens rightward, clamped to stay inside the viewport on narrow desktops. The redundant elementFromPoint cover-probe loop is removed with it.
🎨 UI polish (carried over)
- SVG icon components replace inline glyphs (refresh/close/pause actions)
- Task status text is color-coded (success green / failure red / running blue / blocked yellow)
- Empty state rendered as a dashed placeholder card
Install
Registry (recommended) — download dsh-teams-x-0.2.2.tgz below, then:
dsh plugin --profile web add /path/to/dsh-teams-x-0.2.2.tgzFrom source:
git clone --branch v0.2.2 https://github.com/Mlte0907/dsh-teams-x.git
cd dsh-teams-x && pnpm install && pnpm build
dsh plugin --profile web add .TeamsX v0.2.0
TeamsX v0.2.0
v0.2 brings three roadmap features plus in-chat conversation cards — all guarded by the functional suite grown from 143 to 173 cases.
✨ New features
Team templates (profiles)
Configure named templates once, then teamsx_create with profile=<name> in the description seeds the roster and task DAG automatically.
teams-x:
profiles:
researcher:
members:
- name: researcher
provider: xianyu
model: MiniMax-M2.7
tasks:
- id: r1
subject: Research goalWeb plan editor
Staged plans are now editable in the activity panel: member rows (role / provider / model) and task rows (subject / assignee / dependencies) with inline inputs, add/remove with restore, and one atomic batch save. Server-side whitelist rejects unknown operations before they can reach the batch runner.
Automatic repair loop
When a review/requirements task finishes failed with needs_revision/reject plus findings, the scheduler derives a repair task (depends on the failed task, round + 1). Loop stops at the round cap (default 3) or via autoDerive: false.
In-chat conversation card
All 11 teamsx/* session events fold into a single keyed chat node per team — roster rows (active members open their transcript), task digest, lifecycle badges. Zero host changes: uses the same plugin view channel as ui-workflow-run, feature-detected with graceful fallback to the header panel.
/teamsx slash command
Type /teamsx in the composer to expand the team panel.
Verification
pnpm verify: typecheck(host+client) + build + smoke(incl. card SSR) + flow + 173/173 cases + icons- Real-session smoke: profile seeding, repair derivation, plan editing round-trip persisted to disk
Full changelog: v0.1.0...v0.2.0
TeamsX v0.1.0
TeamsX v0.1.0 — first public release
Turn one DeepSeek Harness session into a coordinated multi-agent team: a captain spawns durable member subagents, breaks a goal into a dependency-aware task DAG, and coordinates through direct mailbox messages — with a live all-SVG activity panel.
Highlights
- 13
teamsx_*tools — create (staged two-phase plan or automatic), member lifecycle, task claim/update/reassign with attempt-id capabilities, mailboxes, status snapshot, halt/resume, archive-on-delete. - Staged plan review —
approval=requiredkeeps members unspawned until the user explicitly approves the roster + DAG; atomic batch plan revision viateamsx_edit_plan. - Quality gates (v0.1) — requirements/implementation/verification/review/repair/integration task contracts: objective + acceptance criteria,
verifycommands, in-scope path audit (changedPathsclassification;.env,id_rsa*,secrets/excluded even when declared). - Durable mailboxes — JSONL per-agent inboxes; live steer for an online captain, wake for members, lease-based retry (60 s) for offline recipients; malformed-line tolerance with per-line warnings.
- State layer —
team.json+ reverse index (index.json) with self-healing full-scan rebuild; per-team lock queues; atomic same-dir temp-file writes; tolerant reload of hand-edited/legacy records with loud structural-corruption diagnostics. - All-SVG activity panel — theme-token colors, DAG depth lanes, mobile drawer; authenticated web routes (401/403/503 gate) for member pause and staged-plan actions.
- Compat layer — every host API touchpoint isolated in
src/compat.ts(capability detection across harness drift points).
Verification
pnpm verify— typecheck (host + client), build, client smoke, state-flow verification, 143-case functional suite (team management, permissions, data sync, mailbox, events, error handling, compat, performance, security, view isolation), icon-asset sync.- CI runs the runtime face on GitHub Actions against a fresh harness checkout.
Install
dsh plugin --profile web add <path-to-dsh-teams-x>
# or from the npm tarball
npm pack dsh-teams-x@0.1.0See README for the tool reference, the staged-plan walkthrough, and the verification commands.