dsh-plugin-aitelier
Runs AItelier pipelines from DSH over MCP: 39 tools (22 read, 17 write) to generate, run, inspect, edit, export and import multi-step SkillFlow pipelines. The steps execute in AItelier rather than in the DSH session and are polled by run_id, pause at engine-enforced checkpoints answered with answer_
Install
dsh plugin --profile web add dsh-plugin-aitelier
Sandbox test results
| Stage | Result |
|---|---|
| 1 install | ✓ |
| 2 list | ✓ |
| 3 mount | ✓ |
| 4 boot | — |
Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).
README
dsh-plugin-aitelier
Use AItelier as a subagent from DeepSeek Harness: design a pipeline, edit its graph / roles / prompts / tools, run it, and carry it to another machine.
The plugin is a Profile Bundle that mounts one @deepseek-ai/dsh-mcp-client row against AItelier's MCP endpoint. The model then sees the surface as native tools under mcp__aitelier__*.
Compatibility: the patch assumes dsh-mcp-client's config shape as of dsh 0.1.0-rc.2 (serverName/transport/url/headers/toolCallTimeoutMs); every dsh release through 0.1.2-alpha.1 keeps it. This is deliberately not a peerDependencies entry: the plugin has no code and imports nothing — dsh resolves the mcp-client name from its own installation — and a declared peer would invite pnpm's auto-install-peers to pull a second, registry-sourced copy of dsh-mcp-client into the profile, which dsh's profile-first module resolution would then shadow the installation's instance with.
### No mcp__aitelier__* tools? Read this first.
A connection failure here is silent.dsh-mcp-clienthasfailOnStartupError: false, so an unreachable endpoint does not stopdshbooting — the tools simply never appear, and nothing says why. An agent in that state can only report "no such tools" and guess; it cannot diagnose it from the inside. Check, in order:
1. Is AItelier running?curl -s localhost:4444/healthshould answer{"status":"ok",…}. If not, start it — see [Prerequisite](#prerequisite-aitelier-itself).
2. Is the URL right for wheredshruns? The default ishttp://127.0.0.1:4444/mcp(host). Usehttp://aitelier:4444/mcponly ifdshis itself a container on the same docker network.
3. Does the endpoint answer?curl -s -X POST $AITELIER_MCP_URL -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"c","version":"0"}}}'— a421means the Host header is not in AItelier's allow-list (setAITELIER_MCP_ALLOWED_HOSTSon the AItelier side).
4. Is the row actually mounted? dsh --profile <name> --dump-config | grep -A3 mcp-aitelier.
Prerequisite: AItelier itself
This plugin is a client. It does not install or start AItelier — you need one running and reachable first. AItelier ships as a container:
git clone https://github.com/linxuhao/AItelier && cd AItelier mkdir -p ~/.aitelier-secrets && chmod 700 ~/.aitelier-secrets printf '%s' "sk-your-deepseek-key" > ~/.aitelier-secrets/DEEPSEEK_API_KEY chmod 600 ~/.aitelier-secrets/DEEPSEEK_API_KEY docker compose up -d # serves the API + MCP endpoint on 127.0.0.1:4444
The LLM key stays on the AItelier side and never travels through this plugin — see [Which API key goes where](#which-api-key-goes-where).
Install
corepack enable pnpm # `dsh plugin` drives pnpm; on a node-only box it refuses dsh plugin --profile headless add dsh-plugin-aitelier
That one command installs the package and appends it to the profile's dsh.profile.bundles. Then restart the profile. Configure it in the Harness home's env layer (~/.dsh/.env):
AITELIER_MCP_URL=http://127.0.0.1:4444/mcp # the default; set it only to override AITELIER_ADMIN_TOKEN=… # required for writes and private State reads
Ordinary workflow reads work with no credentials. Writes and private State reads need the token — see [Authorization](#authorization).
Verify the install by asking the agent to call mcp__aitelier__list_pipelines; it should come back with the registered pipelines.
Persistent project State DAG
For project goals and acceptance, first call state_graph_help and read its
driver_guide field. It is the tool-only fallback for the MCP prompt
state_graph_driver and resource aitelier://state/driver-guide; use the live
schemas instead of assuming this client bundles the latest server contract.
If State tools are absent, report the backend capability gap; ordinary pipeline
operations can still be used where appropriate.
Use one persistent State project per product. Register workflow or external
attempts before dispatch, retain exact IDs and frozen context, and wait with
state_graph_read(action="wait_for_state_change", arguments=...). Persist
next_after with its filter scope. Timeout does not stop a worker; completion
produces a candidate, not acceptance. Record actual evidence for each criterion
before explicit verification. Checkpoint decisions follow existing authorization.
Keep a compact private director notebook for decisions, unresolved questions,
worker/worktree ownership and cursor handoff. Reference State IDs; do not copy
its status tables or event history. No notebook API is assumed. On resume, read
current State before acting; notes cannot grant permission or certify results.
The surface
Tool · Kind · What it is for
list_pipelines · read · Start here. Names + input_hint for every registered pipeline.
get_pipeline · read · One pipeline's graph YAML and step list.
edit_pipeline · write · Replace the graph. Validated before anything is written.
list_roles / get_role · read · The agent roles a pipeline's steps use.
edit_role · write · Model, tools, temperature, thinking.
list_templates / get_template · read · Each role's prompt.
edit_template · write · Replace a role's prompt — the main way to change behaviour.
list_tools / get_tool · read · Host tools; which are generated (editable) vs built-in.
edit_tool · write · Write a generated tool. The source must import and define its own name.
export_pipeline · read · The whole closure — graph, roles with prompts, custom tools — as one JSON bundle.
import_pipeline · write · Install a bundle, optionally under a new name
…(truncated)
Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::10,最后更新 2026-09-08