Skip to main content
B

mstar-harness (dsh)

btspoony/mstar-harness/packages/dsh

Skill-driven harness/loop engineering workflow agent plugin.

Install

dsh plugin --profile web add github:btspoony/mstar-harness

This plugin lives in the packages/dsh subdirectory of the repository.

README

Morning Star Harness

Morning Star

Harness Workflow Engine · Agent Plugin

English / 中文

GitHub · Issues

CI License Version Last commit dshfind Greptile: The War on Bugs

npm: cli npm: dsh npm: omp npm: opencode

Morning Star / 晨星 is an Agent Plugin for harness engineering workflows: a TypeScript Harness Workflow Engine (@mstar-harness/engine) enforces deterministic workflow gates, while mstar-* judgment skills drive multi-agent code delivery.

  • Deterministic gates, enforced by a TS engine — path/status/lease/dispatch/sdd/iteration/lint gates run in @mstar-harness/engine, not as prompt suggestions
  • Judgment stays in mstar-* skills — skills remain the single source of truth (SSOT) for roles, gates, and workflow judgment
  • One engine across hosts — the same engine + skills power dsh (DeepSeek Harness), omp, OpenCode, Cursor, Kimi Code, ZCode, and Codex
  • Agent Plugin packaging — one-command install; portable across any Agent Plugins v1.0.0 client
  • Pluggable JSON persistence — coordination docs (status.json, workflow snapshots, review envelopes) persist through an ArtifactStore; the default FsStore keeps the existing .mstar/ paths, and integrations mount their own store via MSTAR_STORE_MODULE / --store / in-process setArtifactStore
  • Issue/catalog store vs execution JSON — {HARNESS_DIR}/store.db (SQLite) is the issue and catalog authority after activation; ArtifactStore remains execution/review JSON (status.json, snapshots). The retired project registers are migration history with no write path. They are not the same store.
  • Recommended host (best → usable): dsh = omp ≥ ZCode = OpenCode = Cursor > Kimi > Codex

What ships

ComponentWhat it is
Harness Workflow Engine@mstar-harness/engine — TS enforcement of deterministic workflow gates
mstar CLI@mstar-harness/cli — installer bootstrap + mstar workflow verbs
mstar-* skillsRole, gate, and workflow judgment (single source of truth)
Host adaptersdsh, omp, OpenCode, Cursor, Kimi Code, ZCode, Codex

Release notes: CHANGELOG.md / CHANGELOG_CN.md.

Install

HostCommand
dsh (DeepSeek Harness)npx @mstar-harness/cli init --target dsh
(one CLI command that runs two independent dsh plugin --profile web add installs:
@mstar-harness/dsh + dsh-llm-fallbacks; --no-fallbacks skips the latter)
or dsh plugin --profile web add @mstar-harness/dsh
+ dsh plugin --profile web add dsh-llm-fallbacks
ompnpx @mstar-harness/cli init --target omp
(links ~/.mstar/harness/packages/omp)
or omp plugin install @mstar-harness/omp
OpenCodenpx @mstar-harness/cli init --target opencode
Cursornpx @mstar-harness/cli init --target cursor
KimiKimi TUI: /plugins install https://github.com/btspoony/mstar-harness
→ /plugins reload
ZCodenpx @mstar-harness/cli init --target zcode
then install morning-star-harness in ZCode → Settings → Plugin Management
Codexnpx @mstar-harness/cli init --target codex
then codex plugin add morning-star-harness@mstar-repo (repo-bundled marketplace)
Generic (Agent Plugins v1)point any Agent Plugins v1.0.0 conformant client at this repo root
(plugin.json + skills/ are the portable package)

CLI commands in this section run the published bin through its Bun shebang: npx / bunx / npm i -g all need Bun >=1.4.0 on PATH. Node-only machine: npm install @mstar-harness/cli, then node node_modules/@mstar-harness/cli/dist/mstar-harness.js <verb> (see Runtime floors).

npm i -g @mstar-harness/cli

Puts the mstar-harness binary (short alias mstar) on PATH, so the engine-check commands the skills cite (mstar status validate, mstar dispatch validate, mstar iteration gate, …) actually run.

init now auto-installs the matching-version CLI globally after a successful run — pass --no-global-cli to opt out.

Without a global install the harness still works and those checks stay advisory. Set enforcement: hard in an iteration compass to make dispatch preflights fail-fast.

Caution: mstar is a short alias and a shared bin namespace — an unrelated third-party npm package named mstar claims the same command name. The alias exists only where @mstar-harness/cli is installed: bare npx mstar … without the package resolves via the registry to that other tool, and globally co-installing both packages silently overwrites the mstar shim (last install wins). The canonical invocation name stays mstar-harness — use the long name on any conflict.

Verify

npx @mstar-harness/cli doctor --target <opencode|cursor|codex|zcode|omp|dsh|kimi> checks the selected target; Codex also accepts --scope <global|project>. MCP package health is reported as aligned, mismatch, or unavailable. Doctor reads package metadata/executable and checks runtime floor; it does not open the issue store. See MCP host install paths.

Codex agent-link repair and named-role verification: Codex installation.

The repo ships a portable Agent Plugins v1.0.0 manifest (plugin.json) at its root; skills/ is the Agent Skills component — verify it with npx @mstar-harness/cli plugin validate.

Manual install / path layout: INSTALL.md. CLI flags: the mstar-use-cli skill.

Runtime floors (entrypoint, not “install both”)

The published CLI keeps a Bun shebang (#!/usr/bin/env bun). Normal launch of mstar-harness / the dist file uses Bun >=1.4.0. An explicit node <CLI bundle> uses Node >=24.18.0. npx / bunx fetch the package but still execute that same Bun-shebang bin, so they need Bun >=1.4.0 on PATH as well — a package runner is not a runtime; on a Node-only machine install the package and run the bundle under Node (node node_modules/@mstar-harness/cli/dist/mstar-harness.js <verb>). Bun-hosted plugins need Bun; native Node entries need Node. Do not treat those floors as a demand to install both runtimes on every machine. This README does not prove packaged compatibility or store activation.

Use

Three entry shapes: without iteration (single plan / hotfix), with iteration (multi-plan Phase 1–5), or audit, review & verification (discover work, assess changes, or run requested E2E checks).

Full command reference: docs/commands.md.

General (without iteration)

Enter PM, then run the per-plan cycle: Prepare → Execute → QC → QA gate → Done.

HostEnter PM
dsh (DeepSeek Harness)pm skill (via the mstar skill provider; no auto-load)
omp/skill:pm each session (no auto-load)
OpenCodeagent.project-manager (OpenCode-only shell, packages/opencode/agents/project-manager.md)
Cursor/pm
Kimisession auto-loads pm; or /skill:pm
ZCode/morning-star-harness:pm each session (no auto-load)
Codex/pm

Iteration

CommandWhen
/iteration-start [direction] [pause]Start a new iteration: Phase 1 (interactive grill-me), then auto-continue Phase 2→6.
direction — optional hint (still interactive).
pause — stop after Phase 1; resume with /iteration-drive.
/iteration-driveResume Phase 2→6 on an already-locked iteration.
/iteration-loop [direction] [scale]Full Phase 1→6 autonomous (no grill-me).
direction — optional free text.
scale — S / M / L / XL (default M).

Scoped plan session

The same command takes a scope, to drive one prepared plan from an independent terminal instead of the whole iteration:

CommandWhen
/iteration-drive --assignment <absolute-assignment-md-path>Fresh scoped entry, addressed by the coordinator's prepared Assignment.
/iteration-drive --workflow <workflow-id> --plan <plan-id>Fresh scoped entry, addressing the prepared row directly.
/iteration-drive --resume <absolute-session-json-path>Explicit resume of the already bound session — the only resume form.

The scoped session binds exactly one plan, drives its tasks through the normal per-plan gates, and stops at a durable handoff: the row keeps InReview, and the coordinator alone records Done — after a verified merge on the iteration route, or straight from the accepted handoff on the standalone development route. A second fresh entry for the same plan is rejected as a duplicate holder — only explicit --resume of the original session continues. Any other nonempty argument shape fails closed; no arguments keep the whole-iteration route above.

The second terminal is transport, not a dependency: any terminal works, and a multiplexer such as Herdr or tmux is optional — nothing reads pane state, TTL or terminal labels for ownership.

The coordinator's half — prepare, then accept, and from there the iteration route (integration-start → pinned merge → integration-accept → complete) or the standalone development route (complete straight from the accepted handoff), with reconcile as the crash path — runs the mstar plan verbs; flags, JSON envelopes and exit codes: mstar-use-cli → references/plan-and-workflow.md.

Recipe: docs/commands.md.

Audit, review & verification

The audit and review commands are read-only and advisory; findings can become plans for Prepare → Execute. SSOT → mstar-audit (variants: codebase-audit, tests, pr).

CommandWhen
/codebase-audit [keywords]Read-only survey of what's worth doing — prioritized, ready-to-execute plans; narrow it with category focus (bug, security, perf, tech-debt, …) when you want a targeted pass.
/amazing-pr-review [pr|branch|scope] [quick|default|deep]Deep pre-merge review of a PR / branch / diff at three strengths — quick (single-pass, 1 seat) / default (no-flag landing tier, reduced seats) / deep (full three-stage pipeline) — one verdict (ship it / needs fixes / blocked) and every finding, posted to GitHub by the command's main agent at Stage 3 synthesis when a PR number is given. deep runs the full three-stage pipeline (collect → domain review → main-agent synthesis; one verdict / one GitHub Review); default / quick are lighter single/dual-seat passes. Multi-PR input → first PR only; remaining PRs queued as audit todos (next session); suggest one session per PR.
/amazing-test-audit [scope|subsystem] [quick|deep] [campaign]Read-only audit of the existing test surface — junk-pattern sweep, value/retention grading, and prioritized plans to delete, repair, consolidate or relocate tests; campaign marks every declaration of one subsystem in an R/F/C/D ledger first.
/amazing-e2e-check [environment/device] [scenarios]Execute explicitly requested browser/device/installed-deployment scenarios through mstar-e2e in a separate workflow; never a routine iteration QA gate.

Local dashboard

mstar dashboard serves a read-only web UI of the issue store and the execution/roadmap projections on 127.0.0.1 — loopback only, with no bind-address option. It covers the issue list and detail with recorded history, the workflow / iteration / roadmap views, and one cumulative captured-vs-retired issue-flow chart. The dashboard never mutates anything; make changes with the CLI (mstar issue …, mstar catalog …) and stop the server with Ctrl-C.

mstar dashboard            # prints the resolved URL after the server is listening
mstar dashboard --help     # --port / --open / --project

Command contract

Non-installer commands are generated from one canonical definition in @mstar-harness/commands. mstar init remains the installer and is not a generated command. Success, refusal, and usage each print a version-1 JSON envelope; ordinary exits are 0, 1, and 2. A missing SDD task still exits 3, and child processes still propagate 124, 127, and 128+n. Examples below are synthetic. This README does not claim an installed-host, browser, or live-service run.

mstar schema CaptureInput
mstar host detect --signals question

Offline report draft

mstar report creates an offline draft for the GitHub issue form; it does not read credentials or files, submit the issue, or make a network request. Supply only the report fields you choose: title, command, arguments, expected, actual, reproduction, stableCode, exitStatus, host, platform, and versionOverrides. Narrative fields you omit are marked absent; unavailable observed versions are unknown. Version overrides remain labeled caller-supplied. Each text field is limited to 8192 UTF-8 bytes and all supplied text together to 32768 bytes; arguments accepts at most 128 items.

The report reuses a finite redaction set: private-key blocks, AWS access keys, GitHub tokens and PATs, live Stripe keys, Slack tokens, JWTs, sk- API keys, credential-like key/value assignments (password, passwd, api-key, access-token, auth-token, secret, or token), and four CI/IaC shapes (plaintext GitHub Actions secret environment values, echoed Actions secrets, credential-named Docker ENV/ARG, and hardcoded Terraform passwords). Redaction counts are distinct matched line/type findings per field, not every occurrence. This finite set cannot guarantee every secret is removed; inspect the draft yourself.

mstar report --title "Synthetic example" --command "mstar status" \
  --expected "workflow is listed" --actual "workflow is missing" \
  --stable-code "workflow.not-found" --exit-status 1

The generated prompt asks you to review it before submission. For CLI and MCP details, see report command usage.

MCP runtime

mstar mcp runs the stdio MCP server from the same @mstar-harness/cli package as the command-line interface. It registers the canonical non-installer commands as MCP tools (names use the mstar_ prefix and replace command dots and hyphens with underscores). There is no standalone @mstar-harness/mcp package, per-host bundle, or native bridge.

Six host configurations launch the CLI with npx @mstar-harness/cli mcp; DSH’s Cordis YAML launch row remains follow-up work. This requires a published CLI version that contains the mcp command; until that release is published, npx may resolve an older CLI that does not recognize it. Node.js >=24.18.0 is required by the CLI and engine.

{
  "mcpServers": {
    "morning-star": {
      "command": "npx",
      "args": ["@mstar-harness/cli", "mcp"]
    }
  }
}

sessionId selects the main conversation session, not a spawned child-agent session. An optional host selects a supported host context; it is not a role or authority grant. Existing shared-handler workflow ownership, path, state-transition, and CAS checks still decide whether a request is allowed. A refusal keeps its stable command envelope and code (and is returned as an MCP tool error); callers should explain or resolve that refusal, not retry through a different identity or path. This documents the package contract, not an installed-host run.

Examples are synthetic; this README does not claim an installed-host, browser, or live-service run. MCP-captured SDD evidence records are stable:false; collector parity with the CLI remains a documented cross-plan residual.

MCP host install paths

The six JSON-backed host configs and OpenCode's plugin config hook launch the CLI with npx @mstar-harness/cli mcp; DSH's Cordis YAML launch row is a follow-up. npx may download the CLI package at launch, so the CLI version containing mcp must be published first:

HostMCP configRuntime
ompPlugin mcp.jsonNode.js >=24.18.0
OpenCodepackages/opencode/mcp.json template; the plugin injects mcp into OpenCode config at loadNode.js >=24.18.0
dshCordis profile YAML MCP launch row — follow-up (no JSON config in this package)Not configured
Cursor.cursor-plugin/mcp.jsonNode.js >=24.18.0
Codex.codex-plugin/mcp.jsonNode.js >=24.18.0
Kimi.kimi-plugin/mcp.jsonNode.js >=24.18.0
ZCode.zcode-plugin/mcp.jsonNode.js >=24.18.0

For exact install commands and configuration details, see INSTALL.md. The target-specific artifacts are also described in mstar-host references.

doctor --target <host> reports MCP config status as aligned, mismatch, or unavailable; an aligned config is not an installed-host success claim. Doctor checks the configured CLI launch and Node.js floor; it does not start the server or open the issue store. MCP context keeps the shared contract: optional host selects validated host context, sessionId is the main conversation session, and child-agent attribution is neither required nor performed. Development unit/component/integration evidence is distinct from installed-host/live verification, which requires a separately authorized activity and is not claimed here. OpenCode's plugin adds the MCP server through its dynamic config hook; its packaged mcp.json is a reference template, not a static user opencode.json requirement. DSH uses a Cordis YAML plugin row; its npx launch row is a separately tracked host-wiring follow-up and doctor --target dsh currently reports unavailable.

Harness Workflow

flowchart TD
    A["PM: entry and intent clarification"] --> B{"PM: spec and context ready"}
    B -->|No| C["PM: clarify and refine requirements"]
    C --> B
    B -->|Yes| D["PM: initialize/load HARNESS_DIR and PLAN_DIR"]
    D --> E{"Iteration scope needed"}
    E -->|Deep / first iteration| F["iteration-start: grill-me → compass → review → lock"]
    E -->|Fast autonomous loop| F2["iteration-loop: Phase 1→5 continuous"]
    F --> G["PM: lock compass and create integration branch"]
    F2 --> G
    G --> H["Phase 2→5: execute → close → PR → merge-ready"]
    E -->|No| I["PM: select active plan from workflow snapshot"]
    H --> I
    I --> J{"Any plan not Done"}
    J -->|Yes| K["PM: dispatch one plan on a feature branch"]
    K --> L["Dev roles: implement and report"]
    L --> M["PM: update plan and workflow snapshot"]
    M --> N["QC trio: review gate"]
    N --> O{"QC decision"}
    O -->|Request Changes| K
    O -->|Approve| P{"QA gate"}
    P -->|mandatory| P1["qa-engineer: acceptance verification"]
    P -->|pm-acceptance| P2["PM: acceptance checklist"]
    P1 --> Q{"Residual findings remain"}
    P2 --> Q
    Q -->|Yes| R["PM: capture confirmed findings as issues in {HARNESS_DIR}/store.db"]
    R --> S["PM: mark plan Done and merge to integration branch"]
    Q -->|No| S
    S --> T["PM: sync compass plan status"]
    T --> J
    J -->|No| U["iteration-close: close entry checklist"]
    U --> V["PM: compound round and knowledge index"]
    V --> W["PM: update roadmap and compass completed frontmatter"]
    W --> X["PM: close exit checklist and commit"]
    X --> Y["Phase 4: create PR"]
    Y --> Z["Phase 5: merge-ready loop until CI green and reviews resolved"]

Without iteration: same per-plan gates, no iteration-start / iteration-close wrapper.

Roles and skills

Agent IDResponsibility
project-managerRouting, assignment, phase progression
product-managerRequirements, product planning, research
architectArchitecture and technical contracts
fullstack-dev / fullstack-dev-2Backend-led implement / second parallel track
frontend-devUI, interaction, frontend performance
qa-engineerAcceptance when QA gate: mandatory
code-reviewerSDD per-task review; codebase audit (audit category)
qc-specialist / -2 / -3QC trio
ops-engineerDeploy, monitoring, infrastructure
writing-specialistDocs, fiction, copy, scripts
prompt-engineerPrompt / skill / rule work

Load mstar-harness-core first, then topic skills on demand (mstar-roles).

SkillPurpose
mstar-harness-coreEntry, state machine, Task category, skill index
mstar-phase-gatesPrepare/Execute, clarify, hotfix
mstar-iterationPhase 1–5 iteration lifecycle
mstar-dispatch-gatesDispatch, Delegation, anti-recursion
mstar-sddSubagent-driven development
mstar-branch-worktreeBranches, worktrees, QC/QA checkout
mstar-conventions{HARNESS_DIR} discovery / init
mstar-artifactsPlans, status.json, issue capture pointers, Findings cleanup
mstar-project-governanceRoadmap authoring + issue capture contract, register migration history, _default fallback
mstar-design-mdDESIGN.md gate for UI plans
mstar-review-qcPM QC tri orchestration
mstar-coding-behaviorRCA, test-first, review feedback, evidence
mstar-compound / mstar-compound-refreshKnowledge crystallize / maintain
mstar-strategySTRATEGY.md alignment
mstar-skill-authoringGeneral skill authoring (SkillsBench gate)
mstar-auditRead-only codebase audit → prioritized improvement plans
mstar-e2eExplicit standalone E2E, browser, device, and installed-deployment verification
mstar-rolesRole prompts + load lists
mstar-hostHost adapters (dsh / omp / OpenCode / Cursor / Kimi / ZCode / Codex)
pm/pm / /skill:pm / host PM entry

Consumer plans default to .mstar/. Process artifacts (plans/, iterations/, status.json, workflows/, projects/, sdd/, …) are gitignored; tracked results: {HARNESS_DIR}/AGENTS.md, knowledge/, specs/. Specs resolve .mstar/specs/ → docs/specs/ → repo-root specs/. Repos with a non-default layout can declare every harness directory symbol in a gitignored .mstarc ([config] keys harness_dir / plan_dir / sdd_dir / iteration_dir / knowledge_dir / specs_dir / workflow_dir / project_dir — honored above probing). Details → mstar-conventions.

Maintainers: AGENTS.md.

License

MIT. See LICENSE.

Related plugins