Skip to content

The old examples/ tree — the runnable demo leaves (acp-agent, headless-agent, jsonrpc-agent, web-cordis, web-schedule) over the packages/examples demo bundles (acp-demo, jsonrpc-demo) — was deleted upstream (commit 4125514a08). Demos are no longer a separate tree; they live in three places:

  1. CLI config overlays — apps/cli/config/examples/ ships opt-in patches you apply over the shipped Web composition with dsh web --patch / dsh --profile web --patch.
  2. Test profiles — apps/cli/tests/profiles/ is the integration-test tree that boots the real shipped dsh profiles (acp, headless, sdk) end to end.
  3. App bundles — the runnable products are the new bundles packages/bundle/acp-app (dsh --profile acp), bundle/sdk-app (dsh --profile sdk), and the standalone bundle/sdk-minimal, composed over dsh-base by the profile templates in packages/boot/app-boot/src/profile.ts.

packages/examples/ now retains exactly one package: agent-spine-demo.

The CLI config overlays (apps/cli/config/examples/) ​

These are patch overlays over the shipped Web composition (dsh-base + dsh-web-app bundle layers) — "not a tree": dsh web --patch <file> applies one more sibling patch list at the same include level, and a patch replaces the targeted row's whole config. Per apps/cli/tests/profiles/AGENTS.md they are product assets, not test fixtures.

OverlayFilesWhat it demonstrates
cordis/cordis.ymlThe self-referential Cordis-tools demo, moved here: inserts @deepseek-ai/dsh-cordis-host-runner + @deepseek-ai/dsh-tool-cordis; pins the webserver to port 3081 to stay off the default 3080
github-review/cordis.yml + github-ready-review-rule.mjsThe opt-in GitHub webhook overlay: dsh-webhook + dsh-webhook-github (isolated second webserver in its own realm on DSH_GITHUB_WEBHOOK_PORT ?? 3081) + a local rule module registering a kind: 'github' webhook rule that starts a read-only Workspace Session review when a PR becomes ready_for_review
mcp-memory/memorix.cordis.yml, mcp-reference-memory.cordis.yml, engram.cordis.ymlThree default-off third-party memory MCP reference configs via @deepseek-ai/dsh-mcp-client (Memorix 1.3.0, @modelcontextprotocol/server-memory 2026.7.4, Engram 1.20.0); DSH starts the stdio child / connects the HTTP server but does not install or supervise it
schedule/cordis.ymlThe opt-in Schedule overlay: dsh-time-context + dsh-schedule inserted and ui-schedule enabled, so the model can use schedule_create/list/delete with IANA-zone time context

The mcp-memory run commands are now:

sh
dsh web --patch "$PWD/apps/cli/config/examples/mcp-memory/memorix.cordis.yml"
# or mcp-reference-memory.cordis.yml, or engram.cordis.yml

The test profiles (apps/cli/tests/profiles/) ​

apps/cli/tests/profiles/AGENTS.md: this tree owns cross-package behavior of the shipped dsh profiles, and the config examples are product assets, not fixtures.

  • acp/ — cordis.yml (an ACP snapshot-record patch over the shipped acp profile: llm-deepseek with the vision model, sandbox-policy/approval driven by DSH_PERMISSION_MODE, JSONL sessions) plus the keyless ACP e2e suites (tests/): acp, cleanup, control-surface, escalation, goal, hooks, image-offload — the direct successor of the old examples/acp-agent/tests/snapshots/ story.
  • headless/ — cordis.yml (the one-shot composition base: settings-file, credentials-local, the official DeepSeek extensions, the agent spine, goal, retry, …) plus nine recorded-session overlays (*.cordis.snapshot.yml: credentials, goal, retry, semantic-checkpoint, subagent-diagnostic/inheritance/settlement, team, workspace-context-resume) — the successor of examples/headless-agent. Run the product the same way as before:
    sh
    pnpm dsh --profile headless "fix the failing test in this workspace"
  • sdk/ — keyless-smoke.e2e.ts (+ fixtures/) spawns the bin with --profile sdk and verifies the JSON-RPC surface without a model credential.

The app bundles (packages/bundle/acp-app, sdk-app, sdk-minimal) ​

The runnable demo products are now real profile bundles. packages/boot/app-boot/src/profile.ts (PROFILE_TEMPLATES) maps:

ProfileBundle stackNotes
acpdsh-base + dsh-acp-appAutomation-only ACP over JSON-RPC stdio; cordis.patch.yml disables session-title-llm, inserts acp-app-startup + acp (provider: deepseek-official, model: deepseek-v4-flash)
sdkdsh-base + dsh-sdk-appStdio JSON-RPC serving and process lifecycle (sdk-app-startup with profile: sdk + sdk-jsonrpc-server)
sdk-minimaldsh-sdk-minimal aloneComplete standalone tree — sdk-jsonrpc-server, one DeepSeek adapter, persistent shell, str_replace_editor, JSONL sessions — deliberately not layered over dsh-base
headlessdsh-base + dsh-headlessOne-shot coding agent with format-pure stdout (unchanged seam, now exercised from apps/cli/tests/profiles/headless/)

First use materializes the template as $DSH_HOME/profiles/<name> (pnpm-workspace.yaml, cordis.patch.yml, dsh.profile.bundles), after which you can extend it with dsh plugin --profile <name> add <package>. The ACP tests are referenced from apps/cli/tests/profiles/acp/.

sh
dsh --profile acp            # boot the ACP bundle
dsh --profile sdk            # boot the SDK JSON-RPC bundle
dsh --profile sdk-minimal    # standalone minimal SDK tree

packages/examples/: just the spine ​

packages/examples/ retains only agent-spine-demo (@deepseek-ai/dsh-agent-spine-demo) — "the default executor-less, UI-less agent spine as one Cordis bundle plugin: the fixed service set, concrete loop, and model-facing consumers an app package composes by adding an entry point and backends." acp-demo and jsonrpc-demo are gone (their roles moved into the dsh-acp-app and dsh-sdk-app bundles).

agent-spine-demo: the "spine" ​

The spine is the shared, executor-less, UI-less agent bundle — the common services, background-job registry and controls, optional persisted goals, the concrete agent loop, local skill and agent-instructions providers, and model-facing shell/skill consumers. Deployments still choose the LLM adapter, bash executor, and presentation. It mounts dsh-llm, dsh-session, dsh-system-prompt, dsh-tools, dsh-skill + dsh-skill-filesystem, dsh-agent, dsh-goal + dsh-goal-round-driver, dsh-jobs-local, dsh-invariants (with the four core companions), dsh-agent-loop, and dsh-llm-retry — plus dsh-tool-bash, dsh-tool-skill, dsh-tool-jobs, and workspace context via dsh-agent-instructions.

ts
// packages/examples/agent-spine-demo/src/index.ts (excerpt)
export const name = 'agent-spine-demo'
// …imports Timer, LlmRuntime, SessionStore, SessionTitleService, SystemPrompt,
// ToolRuntime, SkillRegistry, AgentRegistry, GoalService, LocalJobRegistry,
// InvariantRegistry + invariant companions, AgentLoop, llmRetry, …

The plugin intentionally exposes named exports only — Loader default unwrapping would discard its Config schema (documented in docs/postmortem/0001-acp-default-export-drops-inject.md).

Root scripts at this revision ​

The old demo:acp / demo:cordis / demo:code-mode scripts are gone. Only two demo:* scripts remain in the root package.json:

jsonc
"demo:ptc":      "node scripts/demo-ptc.mjs",
"demo:inspector":"node --import tsx/esm apps/cli/src/bin.ts web --patch ./packages/experimental/inspector/cordis.source.patch.yml",
"mock:llm":      "node --import tsx packages/test-support/llm-mock-server/src/bin.ts"
  • demo:ptc runs one headless task through the shipped PTC-mode composition (dsh --profile headless with DSH_TOOLS_MODE=ptc); requires a model credential.
  • demo:inspector boots the web profile with the experimental inspector overlay.
  • mock:llm starts the scriptable LLM fault server for local recovery tests (unchanged).

Version table ​

Further reading ​

  • Testing strategy — the profile e2e suites that boot apps/cli/tests/profiles/*.
  • Vendored libraries — the Cordis framework every cordis.yml loads.
  • Agent Client Protocol (ACP) — what dsh --profile acp serves.
  • apps/cli/tests/profiles/AGENTS.md — the profile test-tree conventions.
  • packages/boot/app-boot/src/profile.ts — PROFILE_TEMPLATES, the authoritative profile→bundle map.
  • packages/examples/agent-spine-demo/README.md — the spine bundle's configuration surface.
  • docs/postmortem/0001-acp-default-export-drops-inject.md — why the spine uses named exports.