sequant 2.5.0 → 2.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,7 +8,7 @@
8
8
  {
9
9
  "name": "sequant",
10
10
  "description": "AI coding agent orchestrator for Claude Code — resolve GitHub issues end-to-end with isolated git worktrees, quality gates, and an MCP server. Includes 17 skills, workflow MCP tools, and pre/post-tool hooks.",
11
- "version": "2.5.0",
11
+ "version": "2.6.1",
12
12
  "author": {
13
13
  "name": "sequant-io",
14
14
  "email": "hello@sequant.io"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "sequant",
3
3
  "description": "AI coding agent orchestrator for Claude Code — resolve GitHub issues end-to-end with isolated git worktrees and quality gates, through spec → exec → qa phases.",
4
- "version": "2.5.0",
4
+ "version": "2.6.1",
5
5
  "author": {
6
6
  "name": "sequant-io",
7
7
  "email": "hello@sequant.io"
package/README.md CHANGED
@@ -16,10 +16,15 @@ AI coding agents write code well, but leave you to run the workflow around it
16
16
 
17
17
  See the [CHANGELOG](CHANGELOG.md) for release notes, or the [migration guide](CHANGELOG.md#migration-from-v1x) if upgrading from v1.x.
18
18
 
19
+ ### What's new in 2.6
20
+
21
+ - **Boxed Ink TUI is the default for `sequant run`** — on a TTY, `run` now renders the boxed dashboard by default (matching `sequant ready`). Opt out with `--no-tui` (line renderer) or `-s`/`--quiet` (heartbeat-only); non-TTY output auto-degrades.
22
+ - **Flag change:** `--quiet` moved from `-q` to **`-s`** (silent). `-q` is now an alias for `-Q, --quality-loop`, so `sequant run … -q` enables the quality loop as intended. (`--experimental-tui` is kept as a hidden no-op alias.)
23
+
19
24
  ### What's new in 2.5
20
25
 
21
26
  - **`sequant ready <issue>`** — a post-resolve A+ QA gate that drives a resolved issue through a full-weight `qa → loop → qa` pass and **stops at the human merge gate — it never merges**.
22
- - **Live phase-matrix TUI** — `sequant ready` and `sequant run` render the active phase and quality-loop iteration in place (boxed Ink dashboard on a TTY), so a long run is never indistinguishable from a hang.
27
+ - **Live phase-matrix TUI** — `sequant ready` and `sequant run` render the active phase and quality-loop iteration in place (boxed Ink dashboard on a TTY by default), so a long run is never indistinguishable from a hang. Opt out with `--no-tui` (line renderer) or `-s`/`--quiet` (heartbeat-only); non-TTY output auto-degrades.
23
28
  - **Per-issue concurrency locks** — a second session on the same issue is skipped with a clear message instead of clobbering the first; `sequant locks` inspects and clears them.
24
29
 
25
30
  ## Quick Start
package/dist/bin/cli.js CHANGED
@@ -4,7 +4,7 @@
4
4
  *
5
5
  * Sequential AI phases with quality gates for any codebase.
6
6
  */
7
- import { Command, InvalidArgumentError } from "commander";
7
+ import { Command, InvalidArgumentError, Option } from "commander";
8
8
  import chalk from "chalk";
9
9
  import { fileURLToPath } from "url";
10
10
  import { dirname, resolve } from "path";
@@ -173,13 +173,18 @@ program
173
173
  .option("--no-log", "Disable JSON logging for this run")
174
174
  .option("--log-path <path>", "Custom log directory path")
175
175
  .option("-Q, --quality-loop", "Enable quality loop with auto-retry")
176
+ // #705: `-q` is a hidden alias for the quality loop (Commander 14 allows only
177
+ // one short flag per Option, so it can't live on --quality-loop directly).
178
+ // `runCommand` ORs `qualityLoopAlias` into `qualityLoop`. `-q` no longer maps
179
+ // to --quiet, which moved to `-s` to end the `-q`/`-Q` collision.
180
+ .addOption(new Option("-q, --quality-loop-alias", "Alias for -Q/--quality-loop").hideHelp())
176
181
  .option("--max-iterations <n>", "Max iterations for quality loop (default: 3)", parseInt)
177
182
  .option("--batch <issues>", 'Group of issues to run together (e.g., --batch "1 2" --batch "3")', (value, prev) => prev.concat([value]), [])
178
183
  .option("--smart-tests", "Enable smart test detection (default)")
179
184
  .option("--no-smart-tests", "Disable smart test detection")
180
185
  .option("--testgen", "Run testgen phase after spec")
181
186
  .option("--security-review", "Run security-review phase after spec")
182
- .option("-q, --quiet", "Suppress version warnings and non-essential output")
187
+ .option("-s, --quiet", "Suppress version warnings and non-essential output (heartbeat-only)")
183
188
  .option("--chain", "Chain issues: each branches from previous (implies --sequential)")
184
189
  .option("--stacked", "Stack PRs: middle PRs target predecessor branch instead of main; first/last target main (implies --chain)")
185
190
  .option("--qa-gate", "Wait for QA pass before starting next issue in chain (requires --chain)")
@@ -195,7 +200,12 @@ program
195
200
  .option("--isolate-parallel", "Isolate parallel agent groups in separate worktrees (prevents file conflicts)")
196
201
  .option("--reflect", "Analyze run results and suggest improvements")
197
202
  .option("--agent <name>", 'Agent driver for phase execution (default: "claude-code")')
198
- .option("--experimental-tui", "Render live multi-issue dashboard (requires TTY; falls back to linear output when piped)")
203
+ // #705: the boxed Ink TUI is now the default on a TTY. `--no-tui` opts out to
204
+ // the line-based phase-matrix renderer; non-TTY / piped output auto-degrades.
205
+ .option("--no-tui", "Disable the boxed Ink dashboard; use the line-based phase-matrix renderer")
206
+ // #705: `--experimental-tui` is now a hidden no-op alias (the TUI is the
207
+ // default) so existing scripts and muscle-memory keep parsing.
208
+ .addOption(new Option("--experimental-tui").hideHelp())
199
209
  .option("--no-relay", "Disable interactive relay (#383); `sequant prompt` cannot reach this run")
200
210
  .action(runCommand);
201
211
  program
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "sequant",
3
3
  "description": "AI coding agent orchestrator for Claude Code — resolve GitHub issues end-to-end with isolated git worktrees and quality gates, through spec → exec → qa phases.",
4
- "version": "2.5.0",
4
+ "version": "2.6.1",
5
5
  "author": {
6
6
  "name": "sequant-io",
7
7
  "email": "hello@sequant.io"
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Run flag normalization (#705) — keeps run.ts thin (#503 AC-2: <200 LOC).
3
+ *
4
+ * Two pure resolvers for the `run` command's flag surface:
5
+ * - `normalizeQualityLoop`: ORs the hidden `-q` alias into `--quality-loop`.
6
+ * - `resolveTuiEnabled`: decides whether the boxed Ink TUI mounts.
7
+ *
8
+ * Extracted as pure functions so the flag behavior is unit-testable without
9
+ * driving the full `runCommand` side effects.
10
+ */
11
+ import type { RunOptions } from "../lib/workflow/types.js";
12
+ /**
13
+ * #705: `-q` is a hidden alias for the quality loop (it no longer maps to
14
+ * `--quiet`, which moved to `-s`). Returns the effective quality-loop flag so
15
+ * `-q` and `-Q` produce identical behavior. Must run before any consumer reads
16
+ * `options.qualityLoop`.
17
+ */
18
+ export declare function normalizeQualityLoop(options: RunOptions): boolean;
19
+ /**
20
+ * #705: the boxed Ink TUI is the default on a TTY.
21
+ *
22
+ * - `--no-tui` (Commander surfaces `options.tui === false`) opts out to the
23
+ * line-based phase-matrix renderer.
24
+ * - Non-TTY / piped output auto-degrades (`isTTY === false`), so no Ink writes
25
+ * corrupt pipes.
26
+ * - `--quiet`/`-s` suppresses the renderer entirely (heartbeat-only),
27
+ * regardless of the TUI default (AC-2).
28
+ * - `--experimental-tui` is a hidden no-op alias — the default already covers
29
+ * it, so it is intentionally not consulted here.
30
+ */
31
+ export declare function resolveTuiEnabled(options: RunOptions, isTTY: boolean): boolean;
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Run flag normalization (#705) — keeps run.ts thin (#503 AC-2: <200 LOC).
3
+ *
4
+ * Two pure resolvers for the `run` command's flag surface:
5
+ * - `normalizeQualityLoop`: ORs the hidden `-q` alias into `--quality-loop`.
6
+ * - `resolveTuiEnabled`: decides whether the boxed Ink TUI mounts.
7
+ *
8
+ * Extracted as pure functions so the flag behavior is unit-testable without
9
+ * driving the full `runCommand` side effects.
10
+ */
11
+ /**
12
+ * #705: `-q` is a hidden alias for the quality loop (it no longer maps to
13
+ * `--quiet`, which moved to `-s`). Returns the effective quality-loop flag so
14
+ * `-q` and `-Q` produce identical behavior. Must run before any consumer reads
15
+ * `options.qualityLoop`.
16
+ */
17
+ export function normalizeQualityLoop(options) {
18
+ return Boolean(options.qualityLoop || options.qualityLoopAlias);
19
+ }
20
+ /**
21
+ * #705: the boxed Ink TUI is the default on a TTY.
22
+ *
23
+ * - `--no-tui` (Commander surfaces `options.tui === false`) opts out to the
24
+ * line-based phase-matrix renderer.
25
+ * - Non-TTY / piped output auto-degrades (`isTTY === false`), so no Ink writes
26
+ * corrupt pipes.
27
+ * - `--quiet`/`-s` suppresses the renderer entirely (heartbeat-only),
28
+ * regardless of the TUI default (AC-2).
29
+ * - `--experimental-tui` is a hidden no-op alias — the default already covers
30
+ * it, so it is intentionally not consulted here.
31
+ */
32
+ export function resolveTuiEnabled(options, isTTY) {
33
+ return options.tui !== false && isTTY && !options.quiet;
34
+ }
@@ -8,10 +8,14 @@ import { parseBatches } from "../lib/workflow/batch-executor.js";
8
8
  import { RunOrchestrator } from "../lib/workflow/run-orchestrator.js";
9
9
  import { displayConfig, displaySummary } from "./run-display.js";
10
10
  import { buildProgressWiring } from "./run-progress.js";
11
+ import { normalizeQualityLoop, resolveTuiEnabled } from "./run-flags.js";
11
12
  // Re-export public API for backwards compatibility
12
13
  export * from "./run-compat.js";
13
14
  /** Parse CLI args → validate → delegate to RunOrchestrator.run() → display summary. */
14
15
  export async function runCommand(issues, options) {
16
+ // #705: fold the hidden `-q` alias into qualityLoop before any consumer reads
17
+ // it (`-q` no longer maps to --quiet, which moved to `-s`). See run-flags.ts.
18
+ options.qualityLoop = normalizeQualityLoop(options);
15
19
  console.log(ui.headerBox("SEQUANT WORKFLOW"));
16
20
  if (!options.quiet) {
17
21
  try {
@@ -69,7 +73,9 @@ export async function runCommand(issues, options) {
69
73
  };
70
74
  const resolved = RunOrchestrator.resolveConfig(init, issues, batches);
71
75
  displayConfig(resolved);
72
- const tuiEnabled = Boolean(options.experimentalTui) && Boolean(process.stdout.isTTY);
76
+ // #705: boxed Ink TUI is the default on a TTY; resolveTuiEnabled owns the
77
+ // --no-tui / non-TTY / --quiet precedence (see run-flags.ts).
78
+ const tuiEnabled = resolveTuiEnabled(options, Boolean(process.stdout.isTTY));
73
79
  // RunRenderer (#618) + LivenessHeartbeat (#574) wiring lives in
74
80
  // run-progress.ts to keep this adapter under the 200-LOC cap (#503 AC-2).
75
81
  const { renderer, heartbeat, onProgress, onPhasePlan } = buildProgressWiring({
@@ -214,6 +214,13 @@ export interface RunOptions {
214
214
  noLog?: boolean;
215
215
  logPath?: string;
216
216
  qualityLoop?: boolean;
217
+ /**
218
+ * #705: hidden `-q` alias for the quality loop. Commander 14 allows only one
219
+ * short flag per Option, so `-q` lives on its own `--quality-loop-alias`
220
+ * Option and `runCommand` ORs it into `qualityLoop` before any consumer reads
221
+ * it. `-q` no longer maps to `--quiet` (which moved to `-s`).
222
+ */
223
+ qualityLoopAlias?: boolean;
217
224
  maxIterations?: number;
218
225
  batch?: string[];
219
226
  smartTests?: boolean;
@@ -303,9 +310,17 @@ export interface RunOptions {
303
310
  */
304
311
  isolateParallel?: boolean;
305
312
  /**
306
- * Render a live multi-issue dashboard during the run.
307
- * Requires a TTY; auto-falls back to linear output when stdout is piped.
308
- * Experimental surface and behavior may change.
313
+ * #705: the boxed Ink dashboard is the default on a TTY. Set via `--no-tui`,
314
+ * which Commander surfaces as `options.tui === false` to opt out to the
315
+ * line-based phase-matrix renderer. Non-TTY / piped output auto-degrades, and
316
+ * `--quiet`/`-s` suppresses the renderer entirely regardless of this flag.
317
+ * Resolution: `tuiEnabled = options.tui !== false && isTTY && !quiet`.
318
+ */
319
+ tui?: boolean;
320
+ /**
321
+ * #705: now a hidden no-op alias — the boxed Ink TUI is the default, so
322
+ * `--experimental-tui` only parses for backward compatibility and no longer
323
+ * gates rendering. Kept so existing scripts/muscle-memory don't break.
309
324
  */
310
325
  experimentalTui?: boolean;
311
326
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sequant",
3
- "version": "2.5.0",
3
+ "version": "2.6.1",
4
4
  "description": "AI coding agent orchestrator — resolve GitHub issues end-to-end with isolated git worktrees, quality gates, and an MCP server. Works with Claude Code or Aider.",
5
5
  "type": "module",
6
6
  "bin": {