@@ -60,6 +60,8 @@ func run(args []string, stdout io.Writer, stderr io.Writer) int {
6060 return runRespond (args [1 :], stdout , stderr )
6161 case "review" :
6262 return runReview (args [1 :], stdout , stderr )
63+ case "doctor" :
64+ return runDoctor (args [1 :], stdout , stderr )
6365 case "stamp" :
6466 return runStamp (args [1 :], stdout , stderr )
6567 case "install" :
@@ -88,6 +90,7 @@ COMMANDS:
8890 explain Show details for a specific check
8991 respond Process agent response for a check
9092 review Run multi-agent review with synthesis
93+ doctor Diagnose harness and helper availability
9194 stamp Update doc review stamps
9295 install Install dun config and agent documentation
9396 loop Run autonomous loop with an agent harness
@@ -103,7 +106,7 @@ REVIEW MODE:
103106 Options:
104107 --config Config file path (default .dun/config.yaml; also loads user config)
105108 --principles Path to principles document (default docs/helix/01-frame/principles.md)
106- --harnesses Comma-separated list of review harnesses (default: codex,claude,gemini)
109+ --harnesses Comma-separated list of review harnesses (default: cached or codex,claude,gemini)
107110 --synth-harness Harness to synthesize final review (default: first harness)
108111 --model Model override for selected harness(es)
109112 --models Per-harness model overrides (e.g., codex:o3,claude:sonnet)
@@ -142,7 +145,7 @@ LOOP MODE:
142145
143146 Quorum Options (multi-agent consensus):
144147 --quorum Strategy: any, majority, unanimous, or number (e.g., 2)
145- --harnesses Comma-separated list of harnesses (e.g., codex,claude,gemini,opencode )
148+ --harnesses Comma-separated list of harnesses (default: cached or codex,claude,gemini)
146149 --cost-optimized Run harnesses sequentially to minimize cost
147150 --escalate Pause for human review on conflict
148151 --prefer Preferred harness on conflict (e.g., codex)
@@ -181,6 +184,11 @@ STAMP:
181184 Options:
182185 --all Stamp all docs with dun frontmatter
183186
187+ DOCTOR:
188+ dun doctor
189+
190+ Runs comprehensive environment checks and updates the harness cache.
191+
184192EXIT CODES:
185193 0 Success / all checks pass
186194 1 Check failed
@@ -570,7 +578,8 @@ func runLoop(args []string, stdout io.Writer, stderr io.Writer) int {
570578 // Parse quorum configuration if specified
571579 var quorumCfg dun.QuorumConfig
572580 if * quorumFlag != "" || * harnessesFlag != "" {
573- quorumCfg , err = dun .ParseQuorumFlags (* quorumFlag , * harnessesFlag , * costMode , * escalate , * prefer )
581+ resolvedHarnesses := resolveHarnessesForQuorum (* harnessesFlag )
582+ quorumCfg , err = dun .ParseQuorumFlags (* quorumFlag , strings .Join (resolvedHarnesses , "," ), * costMode , * escalate , * prefer )
574583 if err != nil {
575584 fmt .Fprintf (stderr , "dun loop failed: quorum config error: %v\n " , err )
576585 return dun .ExitUsageError
0 commit comments