sequant 2.7.0 → 2.9.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.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +18 -2
- package/dist/bin/cli.d.ts +1 -1
- package/dist/bin/cli.js +12 -2
- package/dist/bin/preflight.d.ts +21 -0
- package/dist/bin/preflight.js +45 -0
- package/dist/marketplace/external_plugins/sequant/.claude-plugin/plugin.json +1 -1
- package/dist/marketplace/external_plugins/sequant/README.md +2 -0
- package/dist/marketplace/external_plugins/sequant/hooks/post-tool.sh +18 -3
- package/dist/marketplace/external_plugins/sequant/hooks/pre-tool.sh +330 -57
- package/dist/marketplace/external_plugins/sequant/skills/_shared/references/force-push.md +34 -0
- package/dist/marketplace/external_plugins/sequant/skills/assess/SKILL.md +117 -19
- package/dist/marketplace/external_plugins/sequant/skills/assess/references/predicted-collision-detection.md +9 -6
- package/dist/marketplace/external_plugins/sequant/skills/exec/SKILL.md +29 -0
- package/dist/marketplace/external_plugins/sequant/skills/fullsolve/SKILL.md +1 -1
- package/dist/marketplace/external_plugins/sequant/skills/loop/SKILL.md +100 -2
- package/dist/marketplace/external_plugins/sequant/skills/qa/SKILL.md +24 -0
- package/dist/marketplace/external_plugins/sequant/skills/qa/references/anti-pattern-detection.md +285 -0
- package/dist/marketplace/external_plugins/sequant/skills/qa/references/call-site-review.md +202 -0
- package/dist/marketplace/external_plugins/sequant/skills/qa/references/quality-gates.md +287 -0
- package/dist/marketplace/external_plugins/sequant/skills/qa/references/test-quality-checklist.md +272 -0
- package/dist/marketplace/external_plugins/sequant/skills/qa/references/testing-requirements.md +40 -0
- package/dist/marketplace/external_plugins/sequant/skills/qa/scripts/quality-checks.sh +95 -11
- package/dist/marketplace/external_plugins/sequant/skills/references/shared/framework-gotchas.md +186 -0
- package/dist/marketplace/external_plugins/sequant/skills/reflect/SKILL.md +27 -13
- package/dist/marketplace/external_plugins/sequant/skills/reflect/references/documentation-tiers.md +80 -68
- package/dist/marketplace/external_plugins/sequant/skills/reflect/references/phase-reflection.md +31 -15
- package/dist/marketplace/external_plugins/sequant/skills/release/SKILL.md +669 -0
- package/dist/marketplace/external_plugins/sequant/skills/spec/references/verification-criteria.md +1 -1
- package/dist/marketplace/external_plugins/sequant/skills/test/references/browser-testing-patterns.md +423 -0
- package/dist/marketplace/external_plugins/sequant/skills/upstream/SKILL.md +419 -0
- package/dist/src/commands/logs.js +6 -1
- package/dist/src/commands/run-display.d.ts +20 -0
- package/dist/src/commands/run-display.js +80 -1
- package/dist/src/commands/stats.js +47 -0
- package/dist/src/lib/assess-collision-detect.d.ts +19 -2
- package/dist/src/lib/assess-collision-detect.js +68 -4
- package/dist/src/lib/cli-ui/run-renderer.js +17 -9
- package/dist/src/lib/errors.d.ts +91 -0
- package/dist/src/lib/errors.js +118 -0
- package/dist/src/lib/manifest.js +1 -17
- package/dist/src/lib/version-check.d.ts +19 -0
- package/dist/src/lib/version-check.js +45 -5
- package/dist/src/lib/workflow/batch-executor.d.ts +13 -0
- package/dist/src/lib/workflow/batch-executor.js +142 -24
- package/dist/src/lib/workflow/chain-preflight.d.ts +89 -0
- package/dist/src/lib/workflow/chain-preflight.js +199 -0
- package/dist/src/lib/workflow/chain-resume.d.ts +116 -0
- package/dist/src/lib/workflow/chain-resume.js +166 -0
- package/dist/src/lib/workflow/dependency-markers.d.ts +29 -0
- package/dist/src/lib/workflow/dependency-markers.js +79 -0
- package/dist/src/lib/workflow/drivers/agent-driver.d.ts +17 -0
- package/dist/src/lib/workflow/drivers/claude-code.d.ts +29 -0
- package/dist/src/lib/workflow/drivers/claude-code.js +136 -8
- package/dist/src/lib/workflow/error-classifier.d.ts +9 -2
- package/dist/src/lib/workflow/error-classifier.js +14 -1
- package/dist/src/lib/workflow/log-writer.d.ts +1 -1
- package/dist/src/lib/workflow/log-writer.js +6 -8
- package/dist/src/lib/workflow/metrics-schema.d.ts +39 -0
- package/dist/src/lib/workflow/metrics-schema.js +16 -0
- package/dist/src/lib/workflow/metrics-writer.d.ts +2 -1
- package/dist/src/lib/workflow/phase-executor.d.ts +50 -0
- package/dist/src/lib/workflow/phase-executor.js +151 -17
- package/dist/src/lib/workflow/run-log-schema.d.ts +26 -0
- package/dist/src/lib/workflow/run-log-schema.js +52 -1
- package/dist/src/lib/workflow/run-orchestrator.d.ts +14 -0
- package/dist/src/lib/workflow/run-orchestrator.js +291 -30
- package/dist/src/lib/workflow/state-manager.d.ts +1 -0
- package/dist/src/lib/workflow/state-manager.js +6 -0
- package/dist/src/lib/workflow/state-schema.d.ts +3 -0
- package/dist/src/lib/workflow/state-schema.js +7 -0
- package/dist/src/lib/workflow/status-derivation.d.ts +30 -0
- package/dist/src/lib/workflow/status-derivation.js +27 -0
- package/dist/src/lib/workflow/types.d.ts +40 -0
- package/dist/src/lib/workflow/worktree-manager.d.ts +43 -1
- package/dist/src/lib/workflow/worktree-manager.js +103 -33
- package/dist/src/mcp/tools/run.d.ts +2 -0
- package/dist/src/mcp/tools/run.js +2 -0
- package/dist/src/ui/tui/theme.d.ts +18 -4
- package/dist/src/ui/tui/theme.js +18 -4
- package/package.json +5 -6
- package/templates/hooks/post-tool.sh +18 -3
- package/templates/hooks/pre-tool.sh +330 -57
- package/templates/scripts/cleanup-worktree.sh +103 -14
- package/templates/skills/_shared/references/force-push.md +34 -0
- package/templates/skills/assess/SKILL.md +117 -19
- package/templates/skills/assess/references/predicted-collision-detection.md +9 -6
- package/templates/skills/exec/SKILL.md +29 -0
- package/templates/skills/fullsolve/SKILL.md +1 -1
- package/templates/skills/loop/SKILL.md +100 -2
- package/templates/skills/qa/SKILL.md +24 -0
- package/templates/skills/qa/references/anti-pattern-detection.md +285 -0
- package/templates/skills/qa/references/call-site-review.md +202 -0
- package/templates/skills/qa/references/quality-gates.md +287 -0
- package/templates/skills/qa/references/test-quality-checklist.md +272 -0
- package/templates/skills/qa/references/testing-requirements.md +40 -0
- package/templates/skills/qa/scripts/quality-checks.sh +95 -11
- package/templates/skills/references/shared/framework-gotchas.md +186 -0
- package/templates/skills/reflect/SKILL.md +27 -13
- package/templates/skills/reflect/references/documentation-tiers.md +80 -68
- package/templates/skills/reflect/references/phase-reflection.md +31 -15
- package/templates/skills/release/SKILL.md +669 -0
- package/templates/skills/spec/references/verification-criteria.md +1 -1
- package/templates/skills/test/references/browser-testing-patterns.md +423 -0
- package/templates/skills/upstream/SKILL.md +419 -0
|
@@ -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.
|
|
11
|
+
"version": "2.9.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
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.
|
|
4
|
+
"version": "2.9.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "sequant-io",
|
|
7
7
|
"email": "hello@sequant.io"
|
package/README.md
CHANGED
|
@@ -16,6 +16,18 @@ 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.9
|
|
20
|
+
|
|
21
|
+
- **`--chain` survives a failed link** — re-running a partially-completed chain resumes from its last good link, skipping the completed prefix and rebasing onto that committed tip instead of redoing hours of finished work (#760). A warn-by-default content pre-flight also runs before the first worktree is provisioned, flagging missing ACs, mis-ordered dependencies, predicted file overlaps, and closed issues; `--strict-preflight` makes any warning a hard stop (#762).
|
|
22
|
+
- **Rate limits stop burning hours** — a rate limit hit inside a phase now skips doomed cold-start retries, and the run summary labels the chain halt with its cause and how to resume, instead of cascading into a ~2h retry ladder (#761).
|
|
23
|
+
- **Stale plugin-cache warning** — `pre-tool.sh` now prints a once-per-day, network-free reminder (`claude plugin update sequant@sequant`) when a plugin-channel install has drifted behind the marketplace (#784, #788).
|
|
24
|
+
|
|
25
|
+
### What's new in 2.8
|
|
26
|
+
|
|
27
|
+
- **Clearer failures when an agent stops early** — phases that hit a turn cap now preserve their partial work and halt cleanly for resume instead of discarding it (#739, #733), and rate-limit/out-of-credits failures are named for what they are (with reset time and credit-purchase hints) rather than buried under generic retry noise (#732).
|
|
28
|
+
- **Runtime Node-version guard** — `sequant` checks the running Node against its `engines.node` floor (`>=22.12.0`) at startup and exits with a friendly upgrade message instead of crashing later on a Node-22-only API (#734).
|
|
29
|
+
- **`/assess` avoids npx version skew** — it now emits `sequant run …` when a global install is on `PATH` (and the unchanged `npx sequant run …` otherwise), so copy-pasted commands don't silently run a stale binary (#740).
|
|
30
|
+
|
|
19
31
|
### What's new in 2.7
|
|
20
32
|
|
|
21
33
|
- **Trustworthy `--dry-run` previews for `sync` and `update`** — `sequant sync --dry-run` (`-d`) previews the exact set the apply would write (`new` + `modified` + `local-override`) and mutates nothing. Both `sync --dry-run` and `update --dry-run` now exit non-zero when work is pending, so a CI/automation job can gate on the exit code instead of parsing stdout. (`update` is the interactive command; `sync` is the documented non-interactive/CI surface.)
|
|
@@ -36,7 +48,7 @@ See the [CHANGELOG](CHANGELOG.md) for release notes, or the [migration guide](CH
|
|
|
36
48
|
### Prerequisites
|
|
37
49
|
|
|
38
50
|
**An AI coding agent — one of:**
|
|
39
|
-
- [Claude Code](https://claude.ai/code) — default agent
|
|
51
|
+
- [Claude Code](https://claude.ai/code) — default agent. **Recommended: Claude Code ≥ 2.1.208.** The pre-tool hooks lean on Claude Code's native dangerous-`rm` analyzer (which fires even under `bypassPermissions`) instead of re-implementing catastrophic-delete detection; that analyzer's command-substitution coverage landed in 2.1.208. This is a recommendation, not an enforced floor — plugins cannot declare a minimum Claude Code version, so nothing gates install, and the pre-2.1.208 command-substitution gap (e.g. `echo "$(rm -rf ~)"`) is accepted rather than guarded.
|
|
40
52
|
- [Aider](https://aider.chat/) — alternative, via `--agent aider`
|
|
41
53
|
|
|
42
54
|
**Always required (both):**
|
|
@@ -62,6 +74,8 @@ Pick the path that matches **where you run Sequant**:
|
|
|
62
74
|
/sequant:setup
|
|
63
75
|
```
|
|
64
76
|
|
|
77
|
+
> **Plugins do not auto-update.** Claude Code pins a plugin to the version you installed and never updates it on its own — even as new releases ship. To pick up a new version, run `claude plugin update sequant@sequant`, then restart Claude Code. Sequant's pre-tool hook warns once a day when your installed version falls behind the marketplace.
|
|
78
|
+
|
|
65
79
|
**Headless / CI (npm package)** — drive runs from the terminal or a CI job:
|
|
66
80
|
```bash
|
|
67
81
|
npm install sequant # or: pnpm add / yarn add / bun add sequant
|
|
@@ -99,7 +113,9 @@ SEQUANT WORKFLOW · #683
|
|
|
99
113
|
|
|
100
114
|
QA findings post back to the issue as comments, with each acceptance criterion re-checked independently.
|
|
101
115
|
|
|
102
|
-
>
|
|
116
|
+
<p align="center">
|
|
117
|
+
<img src="https://raw.githubusercontent.com/sequant-io/sequant/main/docs/assets/run-grid.gif" alt="Sequant run grid: the live boxed TUI driving issue #64 through spec, exec, and qa to a green success rollup" width="760">
|
|
118
|
+
</p>
|
|
103
119
|
|
|
104
120
|
---
|
|
105
121
|
|
package/dist/bin/cli.d.ts
CHANGED
package/dist/bin/cli.js
CHANGED
|
@@ -4,6 +4,12 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Sequential AI phases with quality gates for any codebase.
|
|
6
6
|
*/
|
|
7
|
+
// MUST stay first (#734): the Node-version preflight guard. ESM evaluates a
|
|
8
|
+
// module's imports depth-first in source order before the importer's body, so
|
|
9
|
+
// this side-effecting import runs the guard before commander / chalk / the
|
|
10
|
+
// agent SDK / command modules are evaluated — closing the import-time crash
|
|
11
|
+
// window on an old Node below the engines floor. See bin/preflight.ts.
|
|
12
|
+
import "./preflight.js";
|
|
7
13
|
import { Command, InvalidArgumentError, Option } from "commander";
|
|
8
14
|
import chalk from "chalk";
|
|
9
15
|
import { fileURLToPath } from "url";
|
|
@@ -15,7 +21,9 @@ import { configureUI, banner } from "../src/lib/cli-ui.js";
|
|
|
15
21
|
import { isCI, isStdoutTTY } from "../src/lib/tty.js";
|
|
16
22
|
import { detectPackageManagerSync, getPackageManagerCommands, } from "../src/lib/stacks.js";
|
|
17
23
|
// Read version from package.json dynamically
|
|
18
|
-
// Works from both source (bin/) and compiled (dist/bin/) locations
|
|
24
|
+
// Works from both source (bin/) and compiled (dist/bin/) locations.
|
|
25
|
+
// Note: the engines.node floor is read separately in bin/preflight.ts, which
|
|
26
|
+
// must run before this module's imports — see the side-effecting import above.
|
|
19
27
|
function getVersion() {
|
|
20
28
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
21
29
|
let dir = __dirname;
|
|
@@ -88,6 +96,7 @@ configureUI({
|
|
|
88
96
|
isCI: isCI(),
|
|
89
97
|
minimal: process.env.SEQUANT_MINIMAL === "1",
|
|
90
98
|
});
|
|
99
|
+
// (Node-version preflight guard runs at import time — see bin/preflight.ts.)
|
|
91
100
|
// Warn if running from a problematic install location.
|
|
92
101
|
// The home-stray case ($HOME/node_modules/sequant) gets a distinct warning
|
|
93
102
|
// because it pollutes resolution for every subdirectory of $HOME, which the
|
|
@@ -187,9 +196,10 @@ program
|
|
|
187
196
|
.option("--testgen", "Run testgen phase after spec")
|
|
188
197
|
.option("--security-review", "Run security-review phase after spec")
|
|
189
198
|
.option("-s, --quiet", "Suppress version warnings and non-essential output (heartbeat-only)")
|
|
190
|
-
.option("--chain", "Chain issues: each
|
|
199
|
+
.option("--chain", "Chain issues: each successor is rebased onto the previous issue's committed work before it runs (implies --sequential)")
|
|
191
200
|
.option("--stacked", "Stack PRs: middle PRs target predecessor branch instead of main; first/last target main (implies --chain)")
|
|
192
201
|
.option("--qa-gate", "Wait for QA pass before starting next issue in chain (requires --chain)")
|
|
202
|
+
.option("--strict-preflight", "Make --chain content pre-flight warnings (missing AC, dependency/overlap order, closed issues) fatal before any worktree is provisioned")
|
|
193
203
|
.option("--base <branch>", "Base branch for worktree creation (default: main or settings.run.defaultBase)")
|
|
194
204
|
.option("--no-mcp", "Disable MCP server injection in headless mode")
|
|
195
205
|
.option("--no-retry", "Disable automatic retry with MCP fallback (useful for debugging)")
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Runtime Node-version preflight (#734).
|
|
4
|
+
*
|
|
5
|
+
* This module is imported FIRST in `bin/cli.ts`, ahead of every third-party
|
|
6
|
+
* import (commander, chalk, the agent SDK) and every command module. ESM
|
|
7
|
+
* evaluates a module's dependencies depth-first in source order before the
|
|
8
|
+
* importer's body runs, so this module's top-level guard executes before any
|
|
9
|
+
* of those heavier modules are evaluated. That closes the import-time crash
|
|
10
|
+
* window: if a dependency tripped a Node-22-only API at module-load time on an
|
|
11
|
+
* old Node, the user would otherwise get an opaque stack trace from the import
|
|
12
|
+
* itself — before the in-body guard at `cli.ts` ever ran.
|
|
13
|
+
*
|
|
14
|
+
* The only modules evaluated before this guard are Node built-ins plus the
|
|
15
|
+
* first-party `version-check.ts` chain (→ `stacks.ts` → `fs.ts`), which import
|
|
16
|
+
* built-ins only and are therefore safe on the old Node this guard rejects.
|
|
17
|
+
*
|
|
18
|
+
* The pure comparison logic lives in `src/lib/version-check.ts` (AC-6); this
|
|
19
|
+
* file is just the early entry point that reads the floor and invokes it.
|
|
20
|
+
*/
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Runtime Node-version preflight (#734).
|
|
4
|
+
*
|
|
5
|
+
* This module is imported FIRST in `bin/cli.ts`, ahead of every third-party
|
|
6
|
+
* import (commander, chalk, the agent SDK) and every command module. ESM
|
|
7
|
+
* evaluates a module's dependencies depth-first in source order before the
|
|
8
|
+
* importer's body runs, so this module's top-level guard executes before any
|
|
9
|
+
* of those heavier modules are evaluated. That closes the import-time crash
|
|
10
|
+
* window: if a dependency tripped a Node-22-only API at module-load time on an
|
|
11
|
+
* old Node, the user would otherwise get an opaque stack trace from the import
|
|
12
|
+
* itself — before the in-body guard at `cli.ts` ever ran.
|
|
13
|
+
*
|
|
14
|
+
* The only modules evaluated before this guard are Node built-ins plus the
|
|
15
|
+
* first-party `version-check.ts` chain (→ `stacks.ts` → `fs.ts`), which import
|
|
16
|
+
* built-ins only and are therefore safe on the old Node this guard rejects.
|
|
17
|
+
*
|
|
18
|
+
* The pure comparison logic lives in `src/lib/version-check.ts` (AC-6); this
|
|
19
|
+
* file is just the early entry point that reads the floor and invokes it.
|
|
20
|
+
*/
|
|
21
|
+
import { readFileSync } from "fs";
|
|
22
|
+
import { fileURLToPath } from "url";
|
|
23
|
+
import { dirname, resolve } from "path";
|
|
24
|
+
import { assertNodeVersion } from "../src/lib/version-check.js";
|
|
25
|
+
// Derive the engines floor from package.json (single source of truth, AC-3),
|
|
26
|
+
// using the same walk-up read as getVersion() in cli.ts. Built-in globals only,
|
|
27
|
+
// so this runs — rather than crashes — on the old Node it is meant to reject.
|
|
28
|
+
function readEngineFloor() {
|
|
29
|
+
let dir = dirname(fileURLToPath(import.meta.url));
|
|
30
|
+
while (dir !== dirname(dir)) {
|
|
31
|
+
const candidate = resolve(dir, "package.json");
|
|
32
|
+
try {
|
|
33
|
+
const pkg = JSON.parse(readFileSync(candidate, "utf-8"));
|
|
34
|
+
if (pkg.name === "sequant") {
|
|
35
|
+
return pkg.engines?.node ?? null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// Not found at this level, keep walking up.
|
|
40
|
+
}
|
|
41
|
+
dir = dirname(dir);
|
|
42
|
+
}
|
|
43
|
+
return null; // Fallback — assertNodeVersion treats a null floor as "skip".
|
|
44
|
+
}
|
|
45
|
+
assertNodeVersion(readEngineFloor());
|
|
@@ -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.
|
|
4
|
+
"version": "2.9.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "sequant-io",
|
|
7
7
|
"email": "hello@sequant.io"
|
|
@@ -20,6 +20,8 @@ Or browse in `/plugin > Discover`.
|
|
|
20
20
|
|
|
21
21
|
After installing, run `/sequant:setup` to configure your project.
|
|
22
22
|
|
|
23
|
+
> **Plugins do not auto-update.** Claude Code pins a plugin to the version you installed. To pick up a new release, run `claude plugin update sequant@sequant`, then restart Claude Code.
|
|
24
|
+
|
|
23
25
|
### npm (power users / CI)
|
|
24
26
|
|
|
25
27
|
```bash
|
|
@@ -51,13 +51,28 @@ fi
|
|
|
51
51
|
|
|
52
52
|
_TMPDIR="${TMPDIR:-/tmp}"
|
|
53
53
|
|
|
54
|
-
#
|
|
55
|
-
|
|
54
|
+
# Log sink (#763 AC-5c: blocked-command history must survive to be a useful
|
|
55
|
+
# regression corpus, so $TMPDIR — which macOS purges — is a last resort only).
|
|
56
|
+
#
|
|
57
|
+
# This block MUST stay identical to the one in pre-tool.sh. The two hooks
|
|
58
|
+
# write the *same* claude-timing.log (START there, END here) and the same
|
|
59
|
+
# claude-quality.log, so any divergence silently splits every START/END pair
|
|
60
|
+
# across two files.
|
|
61
|
+
#
|
|
62
|
+
# Every candidate is absolute and lives outside the repo. A repo-local or
|
|
63
|
+
# relative path is wrong three times over: it resolves against the hook's cwd
|
|
64
|
+
# (which Claude Code does not pin), it yields one sink per directory instead
|
|
65
|
+
# of the single corpus AC-5 asks for, and — worst — creating it inside a repo
|
|
66
|
+
# makes `git status --porcelain` non-empty, which silently defeats pre-tool.sh's
|
|
67
|
+
# no-changes guard that reads exactly that output.
|
|
68
|
+
if [[ -n "${CLAUDE_PLUGIN_DATA:-}" ]]; then
|
|
56
69
|
_LOG_DIR="${CLAUDE_PLUGIN_DATA}/logs"
|
|
57
|
-
|
|
70
|
+
elif [[ -n "${HOME:-}" ]]; then
|
|
71
|
+
_LOG_DIR="${HOME}/.sequant/logs"
|
|
58
72
|
else
|
|
59
73
|
_LOG_DIR="${_TMPDIR}"
|
|
60
74
|
fi
|
|
75
|
+
mkdir -p "$_LOG_DIR" 2>/dev/null || _LOG_DIR="${_TMPDIR}"
|
|
61
76
|
|
|
62
77
|
TIMING_LOG="${_LOG_DIR}/claude-timing.log"
|
|
63
78
|
QUALITY_LOG="${_LOG_DIR}/claude-quality.log"
|