pi-gauntlet 5.2.0 → 5.2.2

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/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## v5.2.2 - 2026-09-01
4
+
5
+ - `linear` skill: the once-per-session `linearis issues usage` sweep no longer requires authentication. `usage` prints local help and makes no API call, so gating it on `auth status` skipped the cheap staleness check exactly when the agent was already degraded; it now runs whenever the binary is present. Also drops a dead "or the MCP path is in use" skip clause - the sweep sits inside the present-binary branch, and MCP is the fallback only when the binary is missing. Prose only, no code or config surface. Follow-up to #22; spec `doc/specs/2026-09-01-gh-22-linear-cli-verification.md` amended to match.
6
+
7
+ ## v5.2.1 - 2026-09-01
8
+
9
+ - `linear` skill: seven `linearis` invocations corrected against the installed CLI (2026.7.0) - the nonexistent `issues comment-edit` becomes `issues edit <comment>`, `reply` takes a root discussion thread ID, `edit-reply` takes `<reply>`, `files upload` takes `<file>` (two occurrences), `attachments create`'s issue positional is optional, and gotcha (e) now documents two distinct relation flag sets (`relations add` has no `--blocked-by`). Setup is **preferred, not required**: a missing or unauthenticated `linearis` degrades and reports instead of blocking the run (MCP stays the fallback for a missing binary only). Drift resistance added in place - a once-per-session `linearis issues usage` consult for the issue-domain rows, a visible verified-against stamp under the quick-reference table, and one narrow parser-shape row in the failure table. Fixes #22. Spec: `doc/specs/2026-09-01-gh-22-linear-cli-verification.md`.
10
+
3
11
  ## v5.2.0 - 2026-08-31
4
12
 
5
13
  - **`plan_check` deterministic plan checker (new tool).** `phase-tracker` now registers `plan_check({ planPath })`, running 8 mechanical plan-vs-spec checks (table closure, quote integrity, anchor resolution, path existence, placeholder scan, wave file-disjointness, solo-line presence, header-only entrypoint) from a pi-free library at `extensions/lib/plan-check.ts`. Fail-closed: it never throws, and findings are returned for the main model to fix autonomously.
package/README.md CHANGED
@@ -262,8 +262,9 @@ Use the `jira` CLI (authenticated via `jira login`), not `gh` or `linearis`.
262
262
  - post comment (Reporter note only): `jira issue comment ABC-123 --body "<text>"`
263
263
  ```
264
264
 
265
- **`linear` setup:** mandatory - `linearis` installed and authenticated (or a Linear
266
- MCP server as a fallback when `linearis` is unavailable). Optional - the five
265
+ **`linear` setup:** preferred, not required - `linearis` installed and authenticated
266
+ (or a Linear MCP server as a fallback when `linearis` is missing). Without either, the
267
+ skill reports the gap and continues; it never blocks the run. Optional - the five
267
268
  `## Issue tracker` override keys (`tracker`, `workspace urlKey`, `default team`,
268
269
  `self`, `id cache`); the full schema is documented once, in
269
270
  [skills/linear/SKILL.md](./skills/linear/SKILL.md) - not restated here. Off switch:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-gauntlet",
3
- "version": "5.2.0",
3
+ "version": "5.2.2",
4
4
  "description": "Opinionated, gated workflow skills, subagent personas, and runtime extensions for the pi coding agent.",
5
5
  "author": "Jacek Juraszek",
6
6
  "type": "module",
@@ -21,8 +21,10 @@ this skill alters re-gates.
21
21
 
22
22
  ## 1. Setup
23
23
 
24
- Mandatory: `linearis` on PATH and authenticated (`linearis auth status`). Token
25
- resolution order: `--api-token`, `LINEAR_API_TOKEN`, `~/.linearis/token`.
24
+ Preferred: `linearis` on PATH and authenticated (`linearis auth status`). Token
25
+ resolution order: `--api-token`, `LINEAR_API_TOKEN`, `~/.linearis/token`. This is a
26
+ preference, not a precondition - a missing or unauthenticated CLI degrades Linear
27
+ functionality and is reported, never blocks the run.
26
28
 
27
29
  > **No `linearis` installed?** If `command -v linearis` fails, fall back to a
28
30
  > **Linear MCP server** when the harness has one configured - its tools cover the
@@ -32,7 +34,21 @@ resolution order: `--api-token`, `LINEAR_API_TOKEN`, `~/.linearis/token`.
32
34
  > examples below are then guidance for the equivalent MCP call, not literal
33
35
  > shell. pi-gauntlet ships no MCP setup; MCP is opportunistic.
34
36
 
35
- No `linearis` and no MCP: report inability, never fabricate.
37
+ No `linearis` and no MCP: report inability, never fabricate. MCP is the fallback for a
38
+ **missing binary only** (`command -v linearis` fails); an installed-but-unauthenticated
39
+ `linearis` re-auths rather than rerouting to MCP.
40
+
41
+ **Session sweep.** When `linearis` is present, run `linearis issues usage` once per
42
+ session, before the first issue operation, and treat its output as ground truth for the
43
+ **issue-domain rows** of the section 3 table (Read, Search, List, Create, Update,
44
+ Discuss, Reply, Edit). Non-issue domains such as labels, teams, users, cycles, projects,
45
+ attachments, files are outside this call's coverage and fall to the section 8 backstop,
46
+ same as any row the sweep didn't run or couldn't reach. Authentication is not required -
47
+ `usage` prints local help and makes no API call, so the sweep still runs on an
48
+ installed-but-unauthenticated CLI. If the call errors or returns nothing, note once that
49
+ the issue-domain rows are unverified this session and continue. The sweep lives inside
50
+ the present-binary branch only - strictly after the override check above - so
51
+ `tracker: github | none | <unknown>` still means zero probing.
36
52
 
37
53
  Optional: each `## Issue tracker` override key below, with its degradation.
38
54
 
@@ -87,43 +103,50 @@ treated as absent.
87
103
  | Create | `linearis issues create "<title>" --team <default team> [--parent-ticket <id>] --status <status>` | Title is positional (no `--title`); `--team` required; `--parent-ticket` for sub-issues; state an explicit `--status` rather than relying on the default. |
88
104
  | Update | `linearis issues update <id> --status <status> --assignee <who> --labels <labels> --due-date <date> [relation flags]` | See gotcha (e) for relation flags. |
89
105
  | Discuss | `linearis issues discuss <id> --body "<text>"` | Starts a new top-level comment thread. |
90
- | Reply | `linearis issues reply <id> --body "<text>"` | Root comments only - see gotcha (b). |
91
- | Edit | `linearis issues comment-edit <id> --body "<text>"` / `linearis issues edit-reply <id> --body "<text>"` | Full rewrite, no history - see gotcha (a). |
106
+ | Reply | `linearis issues reply <thread> --body "<text>"` | `<thread>` is a root discussion thread ID, not an issue ID - see gotcha (b). |
107
+ | Edit | `linearis issues edit <comment> --body "<text>"` / `linearis issues edit-reply <reply> --body "<text>"` | Full rewrite, no history - see gotcha (a). |
92
108
  | Labels, teams, users, cycles | `linearis labels list`, `linearis teams list`, `linearis users list`, `linearis cycles list` | Use to resolve names to IDs; see id-cache convention. |
93
- | Attachments | `linearis attachments create <id> --url <url>` | Link-only, no inline render - see gotcha (d). |
94
- | Upload | `linearis files upload <path>` | Returns an `assetUrl` for inline embedding - see gotcha (d). |
109
+ | Attachments | `linearis attachments create [<issue>] --url <url>` | Positional is optional (`--issue <issue>` alias); link-only, no inline render - see gotcha (d). |
110
+ | Upload | `linearis files upload <file>` | Returns an `assetUrl` for inline embedding - see gotcha (d). |
95
111
 
96
112
  Workspace values above (`<default team>`, `<who>`, etc.) are placeholders bound to
97
113
  the override keys in section 2 - never a real urlKey, team prefix, or email.
98
114
 
115
+ Snapshot verified against `linearis 2026.7.0` (2026-09-01). The installed CLI's
116
+ `usage`/`--help` is ground truth; when they disagree, follow the CLI and tell the user
117
+ this table is stale.
118
+
99
119
  ## 4. Gotchas
100
120
 
101
121
  a. **Comment edit is a rewrite, no visible history.** To amend rather than replace,
102
122
  fetch the old body and pass `OLD + "\n\n" + ADDITION`; surface the overwrite diff
103
123
  to the user before pushing.
104
124
 
105
- b. **`reply` targets must be root comments** (`parentId: null`). A non-root target
106
- fails with a misleading validation error. To respond in-thread, resolve the
107
- thread's root via `discussions`/`--with-comment-threads` and `reply` to that
108
- root, or start a new `discuss` thread instead. `edit-reply` is NOT a reply
109
- fallback - it rewrites an existing reply. Use it only for an explicitly
110
- requested edit of the caller's own reply, behind the rewrite-confirmation rule
111
- in (a).
125
+ b. **`reply` targets must be root discussion threads.** `--help`: "`<thread>` must be a
126
+ root discussion thread ID." A non-root target fails with a misleading validation
127
+ error. To respond in-thread, resolve the thread's root via
128
+ `discussions`/`--with-comment-threads` and `reply` to that root, or start a new
129
+ `discuss` thread instead. `edit-reply` is NOT a reply fallback - it rewrites an
130
+ existing reply. Use it only for an explicitly requested edit of the caller's own
131
+ reply, behind the rewrite-confirmation rule in (a).
112
132
 
113
133
  c. **`@ABC-123` never resolves via the CLI/API.** Use the full issue URL
114
134
  `https://linear.app/<workspace urlKey>/issue/<id>`, which unfurls to a native
115
135
  badge and records a relation. A literal `@ID` in a body stays literal text.
116
136
 
117
- d. **Images go inline, links don't render.** `linearis files upload <path>` ->
137
+ d. **Images go inline, links don't render.** `linearis files upload <file>` ->
118
138
  `![alt](<assetUrl>)` in the body embeds the image. `attachments create` only
119
139
  links a URL and renders no image. Asset URLs returned by a `read` are
120
140
  short-lived signed JWTs - re-upload for a fresh one, never re-paste an old one.
121
141
 
122
- e. **Relation flags are single-value.** `--blocks`, `--blocked-by`, `--relates-to`,
123
- `--duplicate-of` on `create`/`update` keep only the last value if repeated in one
124
- call. For multiple relations in one call, use
125
- `linearis issues relations add <id>` with its comma-separated flags; otherwise
126
- issue separate `update` calls.
142
+ e. **Two different relation flag sets.** On `create`/`update`: `--blocks`,
143
+ `--blocked-by`, `--relates-to`, `--duplicate-of`, `--similar-to`, plus
144
+ `--remove-relation` on `update`. These are single-value - repeating one in a single
145
+ call keeps only the last value (observed behavior, not stated by `--help`). On
146
+ `linearis issues relations add <issue>` the set is smaller and comma-separated:
147
+ `--blocks`, `--related`, `--duplicate`, `--similar` - there is **no** `--blocked-by`,
148
+ so express that direction by inverting the relation or using `update`. For multiple
149
+ relations in one call use `relations add`; otherwise issue separate `update` calls.
127
150
 
128
151
  f. **`create`'s title is positional.** There is no `--title` flag.
129
152
 
@@ -173,9 +196,16 @@ Safety rules, in addition to the write gate above:
173
196
  | Missing `--team` error on create | `--team` is required | Supply `--team <default team>`. |
174
197
  | Search returns nothing unexpected | Search is case-sensitive | Retry with matching case. |
175
198
  | Cannot edit a comment | Comment belongs to another user | Reply instead of editing. |
176
- | Reply validation error | Target is not a root comment | See gotcha (b). |
199
+ | Reply validation error | Target is not a root discussion thread | See gotcha (b). |
177
200
  | `@ID` shows as literal text | `@ABC-123` mentions don't resolve | Use the full issue URL (gotcha c). |
178
201
  | Read is slow | Big ticket with many comments/attachments | Drop `--with-*` flags not needed. |
202
+ | Parser-shape failure on a documented invocation: unknown command/option, unexpected argument | Section 3's snapshot may have drifted from the installed CLI | Re-read that subcommand's `--help`; report the row stale **only if** help actually contradicts it, then follow help |
203
+
204
+ The last row's trigger is deliberately narrow. Data, auth, status-name, and root-thread
205
+ validation errors have their own rows above and are **not** drift - routing them to "the
206
+ skill is stale" would misdiagnose ordinary failures. This row is the reactive path for
207
+ when the section 1 session sweep didn't run, couldn't run, or doesn't cover the failing
208
+ subcommand (any row outside the `issues` domain).
179
209
 
180
210
  ## 9. Discovery pointers
181
211