sequant 2.3.0 → 2.5.0

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.
Files changed (101) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +2 -2
  3. package/README.md +125 -160
  4. package/dist/bin/cli.js +59 -4
  5. package/dist/dashboard/server.js +1 -0
  6. package/dist/marketplace/external_plugins/sequant/.claude-plugin/plugin.json +2 -2
  7. package/dist/marketplace/external_plugins/sequant/README.md +6 -3
  8. package/dist/marketplace/external_plugins/sequant/hooks/post-tool.sh +92 -0
  9. package/dist/marketplace/external_plugins/sequant/hooks/pre-tool.sh +18 -9
  10. package/dist/marketplace/external_plugins/sequant/hooks/relay-check.sh +107 -0
  11. package/dist/marketplace/external_plugins/sequant/skills/_shared/references/behavior-rule-detection.md +205 -0
  12. package/dist/marketplace/external_plugins/sequant/skills/_shared/references/subagent-types.md +21 -8
  13. package/dist/marketplace/external_plugins/sequant/skills/assess/SKILL.md +302 -86
  14. package/dist/marketplace/external_plugins/sequant/skills/assess/references/predicted-collision-detection.md +109 -0
  15. package/dist/marketplace/external_plugins/sequant/skills/docs/SKILL.md +141 -22
  16. package/dist/marketplace/external_plugins/sequant/skills/exec/SKILL.md +83 -78
  17. package/dist/marketplace/external_plugins/sequant/skills/fullsolve/SKILL.md +377 -137
  18. package/dist/marketplace/external_plugins/sequant/skills/loop/SKILL.md +28 -0
  19. package/dist/marketplace/external_plugins/sequant/skills/merger/SKILL.md +621 -0
  20. package/dist/marketplace/external_plugins/sequant/skills/qa/SKILL.md +741 -232
  21. package/dist/marketplace/external_plugins/sequant/skills/qa/scripts/quality-checks.sh +47 -1
  22. package/dist/marketplace/external_plugins/sequant/skills/setup/SKILL.md +12 -6
  23. package/dist/marketplace/external_plugins/sequant/skills/spec/SKILL.md +217 -964
  24. package/dist/marketplace/external_plugins/sequant/skills/spec/references/parallel-groups.md +7 -0
  25. package/dist/marketplace/external_plugins/sequant/skills/spec/references/quality-checklist.md +75 -0
  26. package/dist/marketplace/external_plugins/sequant/skills/spec/references/recommended-workflow.md +4 -2
  27. package/dist/marketplace/external_plugins/sequant/skills/test/SKILL.md +0 -27
  28. package/dist/marketplace/external_plugins/sequant/skills/testgen/SKILL.md +24 -44
  29. package/dist/src/commands/abort.d.ts +36 -0
  30. package/dist/src/commands/abort.js +138 -0
  31. package/dist/src/commands/prompt.d.ts +7 -0
  32. package/dist/src/commands/prompt.js +101 -7
  33. package/dist/src/commands/ready-tui-adapter.d.ts +59 -0
  34. package/dist/src/commands/ready-tui-adapter.js +130 -0
  35. package/dist/src/commands/ready.d.ts +49 -0
  36. package/dist/src/commands/ready.js +243 -0
  37. package/dist/src/commands/run-progress.d.ts +11 -1
  38. package/dist/src/commands/run-progress.js +20 -3
  39. package/dist/src/commands/run.js +12 -2
  40. package/dist/src/commands/status.js +4 -0
  41. package/dist/src/commands/watch.d.ts +2 -0
  42. package/dist/src/commands/watch.js +67 -3
  43. package/dist/src/lib/assess-collision-detect.js +1 -1
  44. package/dist/src/lib/cli-ui/run-renderer-types.d.ts +39 -0
  45. package/dist/src/lib/cli-ui/run-renderer.d.ts +34 -2
  46. package/dist/src/lib/cli-ui/run-renderer.js +250 -33
  47. package/dist/src/lib/cli-ui/scrollback-harness.d.ts +112 -0
  48. package/dist/src/lib/cli-ui/scrollback-harness.js +294 -0
  49. package/dist/src/lib/merge-check/types.js +1 -1
  50. package/dist/src/lib/relay/archive.js +6 -0
  51. package/dist/src/lib/relay/types.d.ts +2 -0
  52. package/dist/src/lib/relay/types.js +9 -0
  53. package/dist/src/lib/settings.d.ts +34 -0
  54. package/dist/src/lib/settings.js +23 -1
  55. package/dist/src/lib/workflow/batch-executor.js +34 -18
  56. package/dist/src/lib/workflow/drivers/agent-driver.d.ts +48 -1
  57. package/dist/src/lib/workflow/drivers/aider.d.ts +7 -1
  58. package/dist/src/lib/workflow/drivers/aider.js +9 -0
  59. package/dist/src/lib/workflow/drivers/claude-code.d.ts +17 -1
  60. package/dist/src/lib/workflow/drivers/claude-code.js +51 -2
  61. package/dist/src/lib/workflow/drivers/index.d.ts +1 -1
  62. package/dist/src/lib/workflow/event-emitter.d.ts +157 -0
  63. package/dist/src/lib/workflow/event-emitter.js +102 -0
  64. package/dist/src/lib/workflow/notice.d.ts +32 -0
  65. package/dist/src/lib/workflow/notice.js +38 -0
  66. package/dist/src/lib/workflow/phase-executor.d.ts +9 -21
  67. package/dist/src/lib/workflow/phase-executor.js +105 -117
  68. package/dist/src/lib/workflow/phase-mapper.d.ts +26 -13
  69. package/dist/src/lib/workflow/phase-mapper.js +55 -33
  70. package/dist/src/lib/workflow/phase-registry.d.ts +127 -0
  71. package/dist/src/lib/workflow/phase-registry.js +233 -0
  72. package/dist/src/lib/workflow/platforms/github.d.ts +6 -0
  73. package/dist/src/lib/workflow/platforms/github.js +17 -0
  74. package/dist/src/lib/workflow/ready-gate.d.ts +155 -0
  75. package/dist/src/lib/workflow/ready-gate.js +374 -0
  76. package/dist/src/lib/workflow/reconcile.js +6 -0
  77. package/dist/src/lib/workflow/run-log-schema.d.ts +5 -55
  78. package/dist/src/lib/workflow/run-orchestrator.d.ts +32 -2
  79. package/dist/src/lib/workflow/run-orchestrator.js +125 -11
  80. package/dist/src/lib/workflow/state-manager.d.ts +19 -1
  81. package/dist/src/lib/workflow/state-manager.js +27 -1
  82. package/dist/src/lib/workflow/state-schema.d.ts +23 -35
  83. package/dist/src/lib/workflow/state-schema.js +29 -3
  84. package/dist/src/lib/workflow/types.d.ts +74 -15
  85. package/dist/src/lib/workflow/types.js +18 -13
  86. package/dist/src/ui/tui/App.js +8 -2
  87. package/dist/src/ui/tui/IssueBox.js +3 -4
  88. package/dist/src/ui/tui/index.d.ts +13 -4
  89. package/dist/src/ui/tui/index.js +19 -5
  90. package/dist/src/ui/tui/row-cap.d.ts +51 -0
  91. package/dist/src/ui/tui/row-cap.js +76 -0
  92. package/dist/src/ui/tui/teardown.d.ts +20 -0
  93. package/dist/src/ui/tui/teardown.js +29 -0
  94. package/dist/src/ui/tui/theme.d.ts +3 -0
  95. package/dist/src/ui/tui/theme.js +3 -0
  96. package/package.json +23 -11
  97. package/templates/hooks/post-tool.sh +81 -0
  98. package/templates/skills/assess/SKILL.md +28 -28
  99. package/templates/skills/assess/references/predicted-collision-detection.md +1 -1
  100. package/templates/skills/qa/SKILL.md +5 -2
  101. package/templates/skills/setup/SKILL.md +6 -6
@@ -7,8 +7,8 @@
7
7
  "plugins": [
8
8
  {
9
9
  "name": "sequant",
10
- "description": "Structured workflow system for Claude Code - GitHub issue resolution with spec, exec, test, and QA phases. Includes 17 skills, MCP server with workflow tools, and pre/post-tool hooks.",
11
- "version": "2.3.0",
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",
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
- "description": "Structured workflow system for Claude Code - GitHub issue resolution with spec, exec, test, and QA phases",
4
- "version": "2.3.0",
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",
5
5
  "author": {
6
6
  "name": "sequant-io",
7
7
  "email": "hello@sequant.io"
package/README.md CHANGED
@@ -1,84 +1,96 @@
1
1
  # Sequant
2
2
 
3
- **Workflow automation for AI coding agents.**
3
+ **Spec-driven AI coding agents — every acceptance criterion verified, stops at the human merge gate.**
4
4
 
5
- Solve GitHub issues with structured phases and quality gates — from issue to merge-ready PR.
5
+ For teams that can't ship un-reviewed AI code. Solve GitHub issues with structured phases and quality gates — from issue to merge-ready PR.
6
6
 
7
7
  **[sequant.io](https://sequant.io)** — docs, guides, and getting started.
8
8
 
9
9
  [![npm version](https://img.shields.io/npm/v/sequant.svg)](https://www.npmjs.com/package/sequant)
10
+ [![npm downloads](https://img.shields.io/npm/dm/sequant.svg)](https://www.npmjs.com/package/sequant)
11
+ [![GitHub stars](https://img.shields.io/github/stars/sequant-io/sequant.svg)](https://github.com/sequant-io/sequant/stargazers)
12
+ [![CI](https://github.com/sequant-io/sequant/actions/workflows/ci.yml/badge.svg)](https://github.com/sequant-io/sequant/actions/workflows/ci.yml)
10
13
  [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT)
11
14
 
12
- ### What's new in 2.0
15
+ AI coding agents write code well, but leave you to run the workflow around it — planning, isolation, review, and merge safety. Sequant wraps an agent in a structured **spec → exec → qa** pipeline with isolated git worktrees and quality gates, taking a GitHub issue from triage to a merge-ready PR without babysitting each step.
13
16
 
14
- - **MCP server** `sequant serve` exposes workflow orchestration as MCP tools (`sequant_run`, `sequant_status`, `sequant_logs`). Any MCP client can drive Sequant headlessly.
15
- - **`/assess` unification** — `/solve` is merged into `/assess` with a 6-action vocabulary (PROCEED, CLOSE, MERGE, REWRITE, CLARIFY, PARK). `/solve` still works as an alias.
16
- - **Parallel execution** — multi-issue runs are concurrent by default with `--concurrency`.
17
- - **Multi-agent** — `--agent aider` as an alternative backend, with a driver interface for future agents.
18
- - **GitHub Actions** — label-triggered and comment-triggered CI workflows out of the box.
17
+ See the [CHANGELOG](CHANGELOG.md) for release notes, or the [migration guide](CHANGELOG.md#migration-from-v1x) if upgrading from v1.x.
19
18
 
20
- Upgrading from v1.x? See the [migration guide](CHANGELOG.md#migration-from-v1x).
19
+ ### What's new in 2.5
20
+
21
+ - **`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.
23
+ - **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.
21
24
 
22
25
  ## Quick Start
23
26
 
24
- ### Option A: Plugin (interactive users)
27
+ ### Prerequisites
25
28
 
26
- In Claude Code:
29
+ **An AI coding agent — one of:**
30
+ - [Claude Code](https://claude.ai/code) — default agent
31
+ - [Aider](https://aider.chat/) — alternative, via `--agent aider`
32
+
33
+ **Always required (both):**
34
+ - [GitHub CLI](https://cli.github.com/) — run `gh auth login`
35
+ - Git — for worktree-based isolation
36
+
37
+ **For the npm/CLI install path:** Node.js 22.12+
38
+
39
+ **Optional MCP (Model Context Protocol) servers — enhanced features:**
40
+ - `chrome-devtools` — enables `/test` for browser-based UI testing
41
+ - `sequential-thinking` — enhanced reasoning for complex decisions
42
+ - `context7` — library documentation lookup
43
+
44
+ > **Note:** Sequant is optimized for Node.js/TypeScript projects. The worktree workflow works with any git repository.
45
+
46
+ ### Install
47
+
48
+ Pick the path that matches **where you run Sequant**:
49
+
50
+ **Inside Claude Code (plugin)** — skills, hooks, and MCP tools, no npm required:
27
51
  ```
28
52
  /plugin install sequant@sequant-io/sequant
29
53
  /sequant:setup
30
54
  ```
31
55
 
32
- You get skills, hooks, and MCP tools no npm required.
56
+ **Headless / CI (npm package)** drive runs from the terminal or a CI job:
57
+ ```bash
58
+ npm install sequant # or: pnpm add / yarn add / bun add sequant
59
+ npx sequant init # install skills into your project
60
+ npx sequant doctor # verify setup
61
+ ```
33
62
 
34
- ### Option B: Package install (power users / CI)
63
+ ### Your first run
35
64
 
36
- ```bash
37
- npm install sequant # npm
38
- pnpm add sequant # pnpm
39
- yarn add sequant # yarn
40
- bun add sequant # bun
65
+ Inside Claude Code, solve an issue end-to-end:
66
+ ```
67
+ /fullsolve 123
41
68
  ```
42
69
 
43
- Then initialize:
70
+ Or headless from the terminal (`-Q` runs the quality loop):
44
71
  ```bash
45
- npx sequant init # Install skills to your project
46
- npx sequant doctor # Verify setup
72
+ npx sequant run 123 -Q
47
73
  ```
48
74
 
49
- ### Start Using
75
+ Either way, Sequant creates an isolated worktree, posts a plan comment to the issue, and opens a merge-ready PR.
50
76
 
51
- Then in Claude Code:
77
+ ### What a run looks like
52
78
 
53
- ```
54
- /fullsolve 123 # Solve issue #123 end-to-end
55
- ```
79
+ A real `/fullsolve 683` (the run that built `sequant ready` itself):
56
80
 
57
- Or step-by-step:
81
+ ```text
82
+ SEQUANT WORKFLOW · #683
83
+ spec ✔ 9 ACs extracted · plan posted to the issue
84
+ exec ✔ 29 tests + docs + lint fix · committed to the feature branch
85
+ qa ✔ full build + suite · 8/9 ACs MET · 1 manual AC marked PENDING (not faked)
86
+ pr ✔ opened #686 · 7/7 checks green · MERGEABLE
58
87
 
88
+ → stops at the human merge gate · never auto-merges · run `merge` to land it
59
89
  ```
60
- /spec 123 # Plan implementation
61
- /exec 123 # Build in isolated worktree
62
- /qa 123 # Review before merge
63
- ```
64
-
65
- ### Prerequisites
66
-
67
- **Required (one of):**
68
- - [Claude Code](https://claude.ai/code) — default agent
69
- - [Aider](https://aider.chat/) — alternative via `--agent aider`
70
- - [GitHub CLI](https://cli.github.com/) — run `gh auth login`
71
- - Git (for worktree-based isolation)
72
90
 
73
- **For npm installation:**
74
- - Node.js 20+
91
+ QA findings post back to the issue as comments, with each acceptance criterion re-checked independently.
75
92
 
76
- **Optional MCP servers (enhanced features):**
77
- - `chrome-devtools` — enables `/test` for browser-based UI testing
78
- - `sequential-thinking` — enhanced reasoning for complex decisions
79
- - `context7` — library documentation lookup
80
-
81
- > **Note:** Sequant is optimized for Node.js/TypeScript projects. The worktree workflow works with any git repository.
93
+ > 📹 A recorded demo GIF of the live run grid is coming — tracked in [#695](https://github.com/sequant-io/sequant/issues/695).
82
94
 
83
95
  ---
84
96
 
@@ -132,159 +144,111 @@ When checks fail, `/loop` automatically fixes and re-runs (up to 3x).
132
144
 
133
145
  ---
134
146
 
135
- ## Two Ways to Use
147
+ ## Using Sequant
136
148
 
137
- ### Interactive (Slash Commands)
149
+ ### Solve one issue (the 80% path)
138
150
 
139
- Type commands in Claude Code or any MCP-connected client:
151
+ The most common invocation no flags. Auto-creates a worktree, posts a plan comment to the issue, and opens a PR.
140
152
 
153
+ In Claude Code:
141
154
  ```
142
- /fullsolve 123 # Complete pipeline
143
- /spec 123 → /exec → /qa # Step by step
155
+ /fullsolve 123
144
156
  ```
145
157
 
146
- ### Headless (CLI)
147
-
148
- Run without Claude Code UI:
149
-
158
+ Headless (`-Q` runs the quality loop):
150
159
  ```bash
151
- npx sequant run 123 # Single issue
152
- npx sequant run 1 2 3 # Batch (parallel)
153
- npx sequant run 123 --quality-loop
154
- npx sequant run 123 --base feature/dashboard # Custom base branch
155
- npx sequant merge --check # Verify batch before merging
160
+ npx sequant run 123 -Q
156
161
  ```
157
162
 
158
- ---
159
-
160
- ## Commands
163
+ > `sequant run --help` is the authoritative flag list. There is **no** `--skip-spec` — to skip the plan phase, use `--phases exec,qa`.
161
164
 
162
- ### Core Workflow
165
+ ### Batch: triage, then run
163
166
 
164
- | Command | Purpose |
165
- |---------|---------|
166
- | `/spec` | Plan implementation, draft acceptance criteria |
167
- | `/exec` | Implement in isolated git worktree |
168
- | `/test` | Browser-based UI testing (optional) |
169
- | `/qa` | Code review and quality gate |
167
+ For several issues at once, the ritual is `/assess` → paste the commands it emits:
170
168
 
171
- ### Automation
169
+ ```
170
+ /assess 101 102 103
171
+ ```
172
172
 
173
- | Command | Purpose |
174
- |---------|---------|
175
- | `/fullsolve` | Complete pipeline in one command |
176
- | `/assess` | Triage issue, recommend workflow (6-action vocabulary) |
177
- | `/loop` | Fix iteration when checks fail |
173
+ `/assess` returns a dashboard (PROCEED / PARK / CLOSE per issue), dependency ordering, and ready-to-paste commands like `npx sequant run 101 -Q`. The quality loop (`-Q`) is part of every command it generates.
178
174
 
179
- ### Integration
175
+ ### From Claude Code, via the MCP server
180
176
 
181
- | Command | Purpose |
182
- |---------|---------|
183
- | `/merger` | Multi-issue merge coordination |
184
- | `/testgen` | Generate test stubs from spec |
185
- | `/verify` | CLI/script execution verification |
186
- | `/setup` | Initialize Sequant in a project |
177
+ With the plugin installed, drive runs through the MCP server from inside Claude Code:
187
178
 
188
- ### Utilities
179
+ ```
180
+ use sequant plugin to fullsolve 123
181
+ ```
189
182
 
190
- | Command | Purpose |
191
- |---------|---------|
192
- | `/docs` | Generate feature documentation |
193
- | `/clean` | Repository cleanup |
194
- | `/improve` | Codebase analysis and improvement discovery |
195
- | `/security-review` | Deep security analysis |
196
- | `/reflect` | Workflow improvement analysis |
183
+ You get back a structured phase-timing table and verdict. The same tools — `sequant_run`, `sequant_status`, `sequant_logs` — are available to any MCP client; `npx sequant serve` exposes them headlessly.
197
184
 
198
- ---
185
+ ### QA on the issue
199
186
 
200
- ## CLI Commands
187
+ Re-verify a resolved issue or PR. Findings land as **issue comments**, with each acceptance criterion independently re-checked:
201
188
 
202
- ```bash
203
- npx sequant init # Initialize in project
204
- npx sequant update # Update skill templates
205
- npx sequant doctor # Check installation
206
- npx sequant status # Show version and config
207
- npx sequant run <issues...> # Execute workflow
208
- npx sequant merge <issues...> # Batch integration QA before merging
209
- npx sequant state <cmd> # Manage workflow state (init/rebuild/clean)
210
- npx sequant locks <cmd> # Inspect/clear per-issue concurrency locks
211
- npx sequant stats # View local workflow analytics
212
- npx sequant dashboard # Launch real-time workflow dashboard
189
+ ```
190
+ 123 any gaps? # re-QA issue #123
191
+ /qa pr488 # re-QA a PR
213
192
  ```
214
193
 
215
- Cohort filtering: `npx sequant stats --label docs --since 2026-01-01`. See [Analytics — Filtering by Label or Date](docs/reference/analytics.md#filtering-by-label-or-date) for details.
194
+ ### Merge
216
195
 
217
- See [Run Command Options](docs/reference/run-command.md), [Merge Command](docs/reference/merge-command.md), [State Command](docs/reference/state-command.md), and [Analytics](docs/reference/analytics.md) for details.
196
+ ```
197
+ merge # squash-merge + sync main + worktree cleanup + post-merge build/test
198
+ ```
218
199
 
219
200
  ---
220
201
 
221
- ## Concurrency
202
+ ## Command Reference
222
203
 
223
- Sequant prevents two sessions from working on the same GitHub issue at the
224
- same time. When `sequant run` starts, each issue claims a per-issue lock at
225
- `.sequant/locks/<issue>.lock` containing the holder's PID, hostname, start
226
- time, and command. A second session attempting the same issue is skipped
227
- with a clear error and the rest of the batch continues.
204
+ Most work goes through a handful of top-level commands. The rest are either pipeline internals (run for you) or occasional tools.
228
205
 
229
- **Stale recovery.** Locks are auto-cleared in three situations:
206
+ ### Everyday
230
207
 
231
- 1. Same host, PID no longer alive → cleared immediately (covers SIGKILL and
232
- crashes).
233
- 2. Cross-host, lock older than 2 hourscleared by age.
234
- 3. Manual: `sequant locks clear <issue>` (with safety check by default).
208
+ | Command | What it does |
209
+ |---------|--------------|
210
+ | `/fullsolve <issue>` | Complete spec exec qa pipeline; opens a PR. The 80% path. |
211
+ | `/assess <issues…>` | Triage one or more issues; emits a dashboard + ready-to-paste `run` commands (6-action vocabulary). |
212
+ | `npx sequant run <issues…>` | Headless equivalent of `/fullsolve`; batches run in parallel. Add `-Q` for the quality loop. |
213
+ | `/qa <issue>` | Code review + quality gate; posts findings as issue comments. |
214
+ | `npx sequant merge <issues…>` | Batch integration QA before merging. |
235
215
 
236
- **Taking over an active session.** `sequant run --force <issue>` writes a
237
- new lock claiming the issue. Add `--signal-other` to also SIGTERM the prior
238
- PID (same host, alive only). Plain `--force` does not signal — use it when
239
- you already know the other session is dead.
216
+ ### Pipeline internals
240
217
 
241
- **Inspecting locks.**
218
+ `/spec`, `/exec`, `/loop`, `/testgen`, `/test` are the phases that `/fullsolve` and `sequant run` orchestrate for you. You can invoke them directly, but rarely need to.
242
219
 
243
- ```bash
244
- npx sequant locks list # Show every active lock
245
- npx sequant locks clear 123 # Clear lock for #123 (refuses fresh)
246
- npx sequant locks clear 123 --force # Clear unconditionally
247
- ```
220
+ ### Occasional / advanced
248
221
 
249
- **Skill wiring** (`/fullsolve`, `/assess`). The `/fullsolve` skill claims the
250
- lock at Phase 0.3, releases it at Phase 5.5, AND releases on every halt
251
- branch (spec failure, exec exhausted, etc.) so an aborted run frees the
252
- lock immediately. `/assess` probes it read-only and surfaces a dashboard
253
- warning when any issue is in use. Both use these subcommands directly from
254
- bash:
222
+ | Command | What it does |
223
+ |---------|--------------|
224
+ | `sequant ready <issue>` | Post-resolve full-weight A+ QA gate; drives to merge-readiness, then stops at the human merge gate (never merges). |
225
+ | `/merger` | Multi-issue merge coordination. |
226
+ | `/improve` | Codebase analysis and improvement discovery. |
227
+ | `/security-review` | Deep security analysis. |
228
+ | `/verify` | CLI/script execution verification. |
229
+ | `/docs` · `/clean` · `/reflect` | Feature docs, repo cleanup, workflow reflection. |
230
+
231
+ ### CLI utilities
255
232
 
256
233
  ```bash
257
- npx sequant locks acquire 123 --command="/fullsolve 123" --skip-pid-check
258
- npx sequant locks release 123 # idempotent; safe on every error path
259
- npx sequant locks check 123 --json # exit 1 when held, prints holder JSON
260
- npx sequant locks check-batch 100 101 102 # /assess: emits lines for held issues only
234
+ npx sequant init # initialize in project
235
+ npx sequant update # update skill templates
236
+ npx sequant doctor # check installation
237
+ npx sequant status # show version and config
238
+ npx sequant state <cmd> # manage workflow state (init/rebuild/clean)
239
+ npx sequant locks <cmd> # inspect/clear per-issue concurrency locks
240
+ npx sequant stats # local workflow analytics (cohort filter: --label / --since)
241
+ npx sequant dashboard # real-time workflow dashboard
242
+ npx sequant serve # expose workflow tools over MCP
261
243
  ```
262
244
 
263
- `--skip-pid-check` is required for skill shells: the Node process that runs
264
- `locks acquire` exits immediately, so its PID is dead before the lock is
265
- released. With the flag set, stale detection falls back to age-only on the
266
- holder's own host. The default skill-lock TTL is **6h** (separate from the
267
- 2h cross-host TTL) — long enough to cover virtually every `/fullsolve` run
268
- including multi-iteration QA loops. Override per-process via
269
- `SEQUANT_SKILL_LOCK_TTL_MS=<milliseconds>`.
270
-
271
- A skill that crashes mid-run leaves at most a 6h orphan; clear it manually
272
- with `sequant locks clear <issue>` to recover sooner. The skill's explicit
273
- release calls on every halt branch (see `.claude/skills/fullsolve/SKILL.md`
274
- Phase 0.3 release contract) mean this corner case should be rare in practice.
245
+ See [Run Command Options](docs/reference/run-command.md), [Merge Command](docs/reference/merge-command.md), [State Command](docs/reference/state-command.md), and [Analytics](docs/reference/analytics.md) for details.
275
246
 
276
- **Read-only commands** (`status`, `merge`, `/assess`) warn when an issue is
277
- locked but do not block.
247
+ ---
278
248
 
279
- **MCP / orchestrator mode.** When the `SEQUANT_ORCHESTRATOR` env var is set
280
- (in-process or remote MCP-driven runs), all lock operations are no-ops —
281
- the orchestrator caller is responsible for any coordination.
249
+ ## Concurrency
282
250
 
283
- **Caveats.** The lock relies on `open(O_CREAT | O_EXCL)` and is reliable on
284
- local filesystems. NFS and other network filesystems may not honor those
285
- semantics; users on networked repos may see false positives. The
286
- `SEQUANT_LOCKS_DIR` env var overrides the lock directory (used in tests
287
- and unusual layouts).
251
+ Multi-issue runs are parallel by default, and a per-issue lock (`.sequant/locks/<issue>.lock`) stops two sessions from clobbering the same issue — see [Concurrency & Per-Issue Locks](docs/reference/concurrency.md) for stale recovery, takeover (`--force`), and `sequant locks` subcommands.
288
252
 
289
253
  ---
290
254
 
@@ -325,6 +289,7 @@ See [Customization Guide](docs/guides/customization.md) for all options.
325
289
  - [What Is Sequant](docs/concepts/what-is-sequant.md) — Elevator pitch, pipeline diagram, architecture
326
290
  - [Workflow Concepts](docs/concepts/workflow-phases.md)
327
291
  - [Run Command](docs/reference/run-command.md)
292
+ - [Concurrency & Per-Issue Locks](docs/reference/concurrency.md)
328
293
  - [Git Workflows](docs/guides/git-workflows.md)
329
294
  - [Customization](docs/guides/customization.md)
330
295
  - [Troubleshooting](docs/troubleshooting.md)
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 } from "commander";
7
+ import { Command, InvalidArgumentError } from "commander";
8
8
  import chalk from "chalk";
9
9
  import { fileURLToPath } from "url";
10
10
  import { dirname, resolve } from "path";
@@ -46,11 +46,34 @@ import { dashboardCommand } from "../src/commands/dashboard.js";
46
46
  import { stateInitCommand, stateRebuildCommand, stateCleanCommand, } from "../src/commands/state.js";
47
47
  import { syncCommand, areSkillsOutdated } from "../src/commands/sync.js";
48
48
  import { mergeCommand } from "../src/commands/merge.js";
49
+ import { readyCommand, } from "../src/commands/ready.js";
49
50
  import { conventionsCommand } from "../src/commands/conventions.js";
50
51
  import { locksListCommand, locksClearCommand, locksAcquireCommand, locksReleaseCommand, locksCheckCommand, locksCheckBatchCommand, } from "../src/commands/locks.js";
51
52
  import { promptCommand } from "../src/commands/prompt.js";
52
53
  import { watchCommand } from "../src/commands/watch.js";
54
+ import { abortCommand } from "../src/commands/abort.js";
53
55
  import { getManifest } from "../src/lib/manifest.js";
56
+ import { phaseRegistry } from "../src/lib/workflow/phase-registry.js";
57
+ /**
58
+ * Validate `--phases` argument against the phase registry.
59
+ *
60
+ * Splits a comma-separated phase list, checks each name against
61
+ * `phaseRegistry`, and exits with a clear error message if any phase
62
+ * is unknown. Returns the original string unchanged so downstream
63
+ * `RunOptions.phases` parsing in `config-resolver.ts` is undisturbed.
64
+ */
65
+ function validatePhasesFlag(value) {
66
+ const names = value
67
+ .split(",")
68
+ .map((p) => p.trim())
69
+ .filter((p) => p.length > 0);
70
+ const unknown = names.filter((n) => !phaseRegistry.has(n));
71
+ if (unknown.length > 0) {
72
+ const available = phaseRegistry.names().join(", ");
73
+ throw new InvalidArgumentError(`Unknown phase '${unknown[0]}'. Available: ${available}`);
74
+ }
75
+ return value;
76
+ }
54
77
  const program = new Command();
55
78
  // Handle --no-color before parsing
56
79
  if (process.argv.includes("--no-color")) {
@@ -141,7 +164,7 @@ program
141
164
  .command("run")
142
165
  .description("Execute workflow for GitHub issues using Claude Agent SDK")
143
166
  .argument("[issues...]", "Issue numbers to process")
144
- .option("--phases <list>", "Phases to run (default: spec,exec,qa)")
167
+ .option("--phases <list>", "Phases to run (default: spec,exec,qa)", validatePhasesFlag)
145
168
  .option("--sequential", "Stop on first issue failure (default: continue)")
146
169
  .option("-d, --dry-run", "Preview without execution")
147
170
  .option("-v, --verbose", "Verbose output with streaming")
@@ -149,14 +172,14 @@ program
149
172
  .option("--log-json", "Enable structured JSON logging (default: true)")
150
173
  .option("--no-log", "Disable JSON logging for this run")
151
174
  .option("--log-path <path>", "Custom log directory path")
152
- .option("-q, --quality-loop", "Enable quality loop with auto-retry")
175
+ .option("-Q, --quality-loop", "Enable quality loop with auto-retry")
153
176
  .option("--max-iterations <n>", "Max iterations for quality loop (default: 3)", parseInt)
154
177
  .option("--batch <issues>", 'Group of issues to run together (e.g., --batch "1 2" --batch "3")', (value, prev) => prev.concat([value]), [])
155
178
  .option("--smart-tests", "Enable smart test detection (default)")
156
179
  .option("--no-smart-tests", "Disable smart test detection")
157
180
  .option("--testgen", "Run testgen phase after spec")
158
181
  .option("--security-review", "Run security-review phase after spec")
159
- .option("--quiet", "Suppress version warnings and non-essential output")
182
+ .option("-q, --quiet", "Suppress version warnings and non-essential output")
160
183
  .option("--chain", "Chain issues: each branches from previous (implies --sequential)")
161
184
  .option("--stacked", "Stack PRs: middle PRs target predecessor branch instead of main; first/last target main (implies --chain)")
162
185
  .option("--qa-gate", "Wait for QA pass before starting next issue in chain (requires --chain)")
@@ -180,12 +203,14 @@ program
180
203
  .description("Send a message into a running headless sequant session (#383)")
181
204
  .argument("[args...]", '[<issue>] "<message>"')
182
205
  .option("--type <type>", "Message type: query (default), directive, abort", "query")
206
+ .option("--wait <seconds>", "Block until a reply arrives or the timeout elapses (#645, Gap 4)", parseInt)
183
207
  .option("--json", "Output as JSON")
184
208
  .action((args, options) => {
185
209
  return promptCommand({
186
210
  args,
187
211
  options: {
188
212
  type: options.type,
213
+ waitSeconds: typeof options.wait === "number" ? options.wait : undefined,
189
214
  json: Boolean(options.json),
190
215
  },
191
216
  });
@@ -201,6 +226,24 @@ program
201
226
  options: { json: Boolean(options.json) },
202
227
  });
203
228
  });
229
+ program
230
+ .command("abort")
231
+ .description("Out-of-band abort: signal a running sequant session directly (#645)")
232
+ .argument("[issue]", "Issue number (auto-resolved when a single run is active)")
233
+ .option("--force", "Skip the SIGINT grace period; SIGTERM immediately")
234
+ .option("--grace <seconds>", "Seconds to wait after SIGINT before escalating (default: 10)", parseInt)
235
+ .option("--json", "Output as JSON")
236
+ .action((issueArg, options) => {
237
+ const args = issueArg === undefined ? [] : [issueArg];
238
+ return abortCommand({
239
+ args,
240
+ options: {
241
+ force: Boolean(options.force),
242
+ graceSeconds: typeof options.grace === "number" ? options.grace : undefined,
243
+ json: Boolean(options.json),
244
+ },
245
+ });
246
+ });
204
247
  program
205
248
  .command("merge")
206
249
  .description("Batch-level integration QA — verify feature branches before merging")
@@ -213,6 +256,18 @@ program
213
256
  .option("--json", "Output as JSON")
214
257
  .option("-v, --verbose", "Enable verbose output")
215
258
  .action(mergeCommand);
259
+ program
260
+ .command("ready")
261
+ .description("Post-resolve A+ QA gate — drive an issue to merge-readiness, then stop at the human merge gate (never merges)")
262
+ .argument("<issue>", "Issue number to drive to readiness")
263
+ .option("--policy <policy>", "Gate policy: 'ac' (default, stop at ACs met) or 'a-plus' (loop to READY_FOR_MERGE)")
264
+ .option("--max-iterations <n>", "Max QA passes before halting for human review (default: settings.run.maxIterations)", parseInt)
265
+ .option("--budget <tokens>", "Token budget; halt cleanly with a 'needs human' message on exhaustion", parseInt)
266
+ .option("--timeout <seconds>", "Timeout per phase in seconds", parseInt)
267
+ .option("--no-mcp", "Disable MCP server injection in headless mode")
268
+ .option("--json", "Output as JSON")
269
+ .option("-v, --verbose", "Enable verbose output")
270
+ .action((issue, options) => readyCommand(issue, options));
216
271
  program
217
272
  .command("conventions")
218
273
  .description("View and manage codebase conventions")
@@ -346,6 +346,7 @@ function renderIssuesList(issues) {
346
346
  const byStatus = {
347
347
  in_progress: [],
348
348
  waiting_for_qa_gate: [],
349
+ waiting_for_human_merge: [],
349
350
  ready_for_merge: [],
350
351
  blocked: [],
351
352
  not_started: [],
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "sequant",
3
- "description": "Structured workflow system for Claude Code - GitHub issue resolution with spec, exec, test, and QA phases",
4
- "version": "2.0.1",
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",
5
5
  "author": {
6
6
  "name": "sequant-io",
7
7
  "email": "hello@sequant.io"
@@ -1,12 +1,12 @@
1
1
  # Sequant
2
2
 
3
- Structured workflow system for Claude Code — GitHub issue resolution with spec, exec, test, and QA phases.
3
+ 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
4
 
5
5
  ## Prerequisites
6
6
 
7
7
  - **Git** with a GitHub remote
8
8
  - **GitHub CLI** (`gh`) authenticated (`gh auth status`)
9
- - **Node.js 20+** (for MCP server via `npx`)
9
+ - **Node.js 22.12+** (for MCP server via `npx`)
10
10
 
11
11
  ## Installation
12
12
 
@@ -47,7 +47,7 @@ sequant init
47
47
  | `/improve` | Codebase analysis and improvement |
48
48
  | `/clean` | Repository cleanup |
49
49
  | `/security-review` | Deep security analysis |
50
- | `/release` | Automated release workflow |
50
+ | `/solve` | Generate the recommended workflow for one or more issues |
51
51
  | `/merger` | Multi-issue integration and merge |
52
52
  | `/setup` | Project initialization for plugin users |
53
53
 
@@ -74,10 +74,13 @@ sequant init
74
74
  ## Quick Start
75
75
 
76
76
  ```
77
+ sequant ready # Boxed pre-flight: which issues are ready to run?
77
78
  /assess 123 # Analyze issue, get recommended workflow
78
79
  /fullsolve 123 # End-to-end: spec → exec → qa → PR
79
80
  ```
80
81
 
82
+ See the [`sequant ready` command reference](https://github.com/sequant-io/sequant/blob/main/docs/reference/ready-command.md) for the full pre-flight readiness check.
83
+
81
84
  ## Documentation
82
85
 
83
86
  - [Getting Started](https://github.com/sequant-io/sequant/tree/main/docs/getting-started)