xtrm-tools 0.7.13 → 0.7.15

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.
@@ -1,16 +1,16 @@
1
1
  ---
2
2
  name: releasing
3
3
  description: >-
4
- Cut a release end-to-end via the changelog-keeper specialist. Use when the
5
- operator wants to publish a new tag (vX.Y.Z) drafts CHANGELOG section
6
- from xt reports, bumps package.json, rebuilds dist, commits, tags, pushes,
7
- optional GH release. Strict scope: only CHANGELOG.md + package.json + dist/.
8
- version: 1.0.0
4
+ Cut a release with the canonical xt release prepare/publish flow. Use when the
5
+ operator wants to publish a new tag (vX.Y.Z). Prepare drafts CHANGELOG from xt
6
+ reports and performs deterministic release-file mutations; publish creates the
7
+ annotated tag, pushes commits/tags, and can create a GitHub release.
8
+ version: 1.2.0
9
9
  ---
10
10
 
11
11
  # releasing
12
12
 
13
- One-step release publication via specialist delegation.
13
+ Canonical release publication via `xt release prepare` and `xt release publish`.
14
14
 
15
15
  ## When to use
16
16
 
@@ -18,73 +18,77 @@ The operator wants to cut a release. They say "release it", "ship vX.Y.Z", "cut
18
18
 
19
19
  ## How
20
20
 
21
- 1. Determine the target version. Default is patch bump from the most recent semver tag. Operator may specify `--minor`, `--major`, or an explicit version.
21
+ 1. Determine target version. Default is patch bump from most recent semver tag. Operator may specify `--minor`, `--major`, or explicit version.
22
22
 
23
- 2. Determine the tag range. Default is `<latest-tag>..HEAD`. For backfills, operator names `--from` / `--to` explicitly.
23
+ 2. Determine tag range. Default is `<latest-tag>..HEAD`. For backfills, operator names `--from` / `--to` explicitly.
24
24
 
25
- 3. Create a release bead. Template:
26
-
27
- ```
28
- PROBLEM: Cut release vX.Y.Z covering <prev-tag>..HEAD.
29
- SUCCESS: CHANGELOG.md updated with new section above prior release; package.json bumped; dist rebuilt; commit `release: vX.Y.Z` pushed with tag.
30
- SCOPE: CHANGELOG.md, package.json, dist/. Synthesis input: xt reports under .xtrm/reports/ dated within <prev-tag-date>..HEAD.
31
- NON_GOALS: No source/docs/config edits. No retroactive changes to prior release sections.
32
- CONSTRAINTS: Keep-a-Changelog v1.0.0 format. One-line bullets. Default bucket Changed. Deprecated only for explicit sunsets.
33
- VALIDATION: git diff --stat HEAD~1 HEAD shows only CHANGELOG.md, package.json, dist/.
34
- OUTPUT: Final report with VERSION, COMMIT, TAG, PUSHED status.
35
- GH_RELEASE: <true|false> # whether to also `gh release create`
36
- ```
37
-
38
- 4. Dispatch the specialist:
25
+ 3. Prepare release files:
39
26
 
40
27
  ```bash
41
- sp run changelog-keeper --bead <bead-id> --background
28
+ xt release prepare --patch
29
+ # or: xt release prepare --minor --from <tag> --to HEAD
42
30
  ```
43
31
 
44
- No worktree (release work is on the active branch). No reviewer chain the verification is the diff check below.
32
+ `prepare` is the canonical path. It builds the xt report bundle, calls the specialists changelog drafting script (`sp script changelog-keeper`), updates release files, rebuilds dist, and enforces the release scope guard.
33
+
34
+ Current blocker: until specialists issue `unitAI-dnmcg` lands, `prepare` can fail with `interactive specialists are not allowed` because the changelog drafting specialist is not yet script-compatible. If that happens, do a manual prepare using the same scope rules and then continue with `xt release publish`.
45
35
 
46
- 5. **Verify the diff after the specialist completes.** This is the critical operator gate.
36
+ 4. Verify release diff before publishing.
47
37
 
48
38
  ```bash
49
39
  git diff --stat HEAD~1 HEAD
40
+ git status --short
50
41
  ```
51
42
 
52
- The output MUST show ONLY:
43
+ Release diff must be limited to release artifacts such as:
53
44
  - `CHANGELOG.md`
54
- - `package.json`
55
- - `dist/index.js`, `dist/lib.js`, `dist/types/**`
45
+ - package manifests / lockfile for version sync
46
+ - generated `cli/dist/**` or `dist/**`
56
47
 
57
- If ANY other file appears (`src/**`, `docs/**` other than CHANGELOG, `config/**`, `tests/**`, `README.md`, etc.), the specialist violated scope. Action:
48
+ 5. Publish:
58
49
 
59
50
  ```bash
60
- git push --delete origin vX.Y.Z # delete remote tag
61
- git tag -d vX.Y.Z # delete local tag
62
- git reset --hard HEAD~1 # discard the release commit
63
- git push --force-with-lease # only if push already happened
51
+ xt release publish
52
+ # optional GitHub release:
53
+ xt release publish --gh-release
64
54
  ```
65
55
 
66
- Then file a bug bead naming the offending paths and revisit the specialist's mandatory rule.
56
+ `publish` creates the annotated tag for the current package version, pushes commits and tags, and optionally creates the GitHub release.
67
57
 
68
- 6. If the diff check passes, the release is shipped. Confirm:
58
+ 6. Confirm:
69
59
 
70
60
  ```bash
71
- git tag --list 'v*' | tail -3 # new tag present
72
- git log --oneline -1 # message starts with "release: vX.Y.Z"
61
+ git tag --list 'v*' | tail -3
62
+ git log --oneline -1
63
+ git status --short --branch
73
64
  ```
74
65
 
75
66
  ## Why this design
76
67
 
77
- - Specialist does the work itself (Read xt reports, Edit files, Bash for build/commit/tag/push). No CLI plumbing, no template substitution, no JSON output schema, no two-phase prepare/publish gate.
78
- - Mandatory rule `changelog-keeper-scope` enforces the edit whitelist at the specialist level.
79
- - Operator gate is the single `git diff --stat HEAD~1 HEAD` check after the specialist finishes. If it shows only whitelisted paths, the release is correct.
80
- - xt reports are the synthesis input, not git log + bd query. Reports are pre-curated, signal-rich, written in user-facing language.
68
+ - `xt` owns deterministic release mutation: changelog insertion, version bump, build, scope guard, commit/tag/push.
69
+ - The specialist owns only changelog drafting from xt reports through a script-compatible, READ_ONLY surface.
70
+ - xt reports are synthesis input, not raw git log + bd query. Reports are pre-curated, signal-rich, written in user-facing language.
71
+ - `xt release publish` is intentionally separate so operators can inspect prepared release files before pushing the tag.
72
+
73
+ ## Manual fallback while unitAI-dnmcg is open
74
+
75
+ If `xt release prepare` fails on the changelog script compatibility guard:
76
+
77
+ 1. Draft the CHANGELOG section manually from `.xtrm/reports/` and recent commits.
78
+ 2. Bump package versions and lockfile.
79
+ 3. Run `npm run build`.
80
+ 4. Commit with `release: vX.Y.Z`.
81
+ 5. Run `xt release publish`.
82
+
83
+ Do not broaden the release diff beyond release artifacts.
81
84
 
82
85
  ## Parallel sessions
83
86
 
84
- Each orchestrator runs this skill in its own session. The specialist commits + tags + pushes atomically. If two sessions try to release the same version, whichever pushes first wins; the other sees a remote tag conflict on push and aborts with a clean error. Operator picks the next version and retries.
87
+ Each orchestrator runs this skill in its own session. Specialist commits + tags + pushes atomically. If two sessions try same version, first push wins; second sees remote tag conflict and aborts cleanly. Operator picks next version and retries.
85
88
 
86
89
  ## Don't
87
90
 
88
- - Don't manually `sp release prepare`/`publish` those CLIs are removed in v3.X.Y (TBD).
89
- - Don't edit CHANGELOG.md outside the specialist run manual edits leak into the next release's diff and break scope verification.
90
- - Don't pre-stage files. The specialist stages exactly what it commits.
91
+ - Don't call `sp release prepare` / `sp release publish` as the canonical path. They are deprecated aliases in specialists.
92
+ - Don't bypass `xt release publish` for tag/push unless the command itself is broken.
93
+ - Don't broaden release diffs with source/docs/config changes. File a separate bead for non-release work.
94
+ - Don't pre-stage unrelated files. The release scope guard should see a clean tree except allowed release artifacts.
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import { buildReportBundle, listXtReports } from '../../../../../cli/src/core/xt-reports.ts';
4
+
5
+ async function main() {
6
+ const since = process.argv[2];
7
+ const to = process.argv[3] ?? 'HEAD';
8
+ const capArg = process.argv[4];
9
+ const capBytes = capArg ? Number(capArg) : 50_000;
10
+
11
+ if (!since) throw new Error('Usage: xt-reports.ts <since> [to] [capBytes]');
12
+
13
+ const reports = listXtReports({ since, to, capBytes });
14
+ const bundle = buildReportBundle(reports, capBytes);
15
+ console.log(bundle.output);
16
+ }
17
+
18
+ if (import.meta.main) await main();
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  name: session-close-report
3
3
  description: |
4
- Generate a structured technical handoff report at session close.
5
- You run `xt report generate` to get the data skeleton, then fill every
6
- <!-- FILL --> section from your own session context. The result is the
7
- definitive handoff contract for the next agent.
4
+ Generate or update the structured technical handoff report at session close.
5
+ Prefer one same-day SSOT report: update the latest report for today when it
6
+ exists, otherwise run `xt report generate`, then fill every `<!-- FILL -->`
7
+ section from orchestrator context.
8
8
  ---
9
9
 
10
10
  # session-close-report
@@ -15,9 +15,43 @@ Invoke this skill at the end of a productive session — after issues are closed
15
15
  code is committed, but before final push. It produces the handoff report that
16
16
  the next agent reads to start cold without losing context.
17
17
 
18
+ ## Report identity rule
19
+
20
+ Prefer a single same-day SSOT handoff report.
21
+
22
+ Before generating anything, check existing reports:
23
+
24
+ ```bash
25
+ xt report list
26
+ ls -t .xtrm/reports/*.md 2>/dev/null | head
27
+ ```
28
+
29
+ Decision:
30
+ - If a report for today already exists, update the latest same-day report.
31
+ - If multiple orchestrators ran today, merge your context into that same report;
32
+ do not create a competing handoff unless the operator explicitly asks for a
33
+ separate report.
34
+ - If no suitable same-day report exists, run `xt report generate` and fill the
35
+ new skeleton.
36
+
37
+ When updating an existing report, preserve prior orchestrator content. Append,
38
+ merge, or revise sections so the file remains one coherent handoff package — do
39
+ not overwrite earlier waves, issue context, problems, or decisions unless they
40
+ are factually superseded.
41
+
18
42
  ## Workflow
19
43
 
20
- ### 1. Generate the skeleton
44
+ ### 1. Select report: update existing or generate new
45
+
46
+ For same-day update:
47
+
48
+ ```bash
49
+ REPORT=$(ls -t .xtrm/reports/$(date +%F)-*.md 2>/dev/null | head -1)
50
+ ```
51
+
52
+ If `$REPORT` is non-empty, read and update it.
53
+
54
+ If no same-day report exists:
21
55
 
22
56
  ```bash
23
57
  xt report generate
@@ -26,28 +60,42 @@ xt report generate
26
60
  This collects data from git log, bd, .specialists/jobs/ and writes a skeleton
27
61
  to `.xtrm/reports/<date>-<hash>.md` with YAML frontmatter and pre-filled tables.
28
62
 
29
- ### 2. Read the skeleton
63
+ ### 2. Read the target report
64
+
65
+ Read the chosen report completely enough to understand existing content.
30
66
 
31
- Read the generated file. It has `<!-- FILL -->` markers in every section that
32
- needs your input.
67
+ Skeleton reports have `<!-- FILL -->` markers in every section that needs your
68
+ input. Existing same-day reports may already be partially filled; update those
69
+ sections with the new session context and remove any now-stale placeholders.
33
70
 
34
- ### 3. Fill every section from your context
71
+ ### 3. Fill or update every section from your context
35
72
 
36
73
  You are the orchestrator. You have the full session context. The CLI only
37
74
  collected raw data — you provide the meaning.
38
75
 
76
+ When updating an existing same-day report:
77
+ - Add new waves, issues, commits, problems, and decisions without duplicating
78
+ existing rows.
79
+ - Update summary/frontmatter counts to cover the whole same-day handoff, not
80
+ just your sub-session.
81
+ - Reconcile stale “open issues” entries if you closed them later in the day.
82
+ - Keep one chronological/coherent narrative instead of separate mini-reports.
83
+
39
84
  **For each section, here is exactly what to write:**
40
85
 
41
86
  #### Summary
42
87
  One dense paragraph. What was accomplished, key decisions made, discoveries,
43
88
  outcomes. Technical prose — no filler, no "in this session we...". Lead with
44
- the most important result.
89
+ the most important result. For same-day updates, summarize the whole day’s SSOT
90
+ state, including earlier orchestrators and your additions.
45
91
 
46
92
  #### Issues Closed
47
93
  The skeleton has a flat table. Restructure it:
48
94
  - Group by category: bugs discovered, backlog items, cleanup/closures, features
49
95
  - If specialists were used, add Specialist and Wave columns
50
96
  - Expand terse close reasons into useful context
97
+ - When updating an existing report, add newly closed issues and revise stale open
98
+ entries that are now closed
51
99
 
52
100
  #### Issues Filed
53
101
  Add every issue you created this session. The **Why** column is mandatory —
@@ -61,18 +109,22 @@ If specialists were dispatched:
61
109
  - Add a Problems sub-table for any failed/stalled dispatches
62
110
  - Update `specialist_dispatches` and `models_used` in frontmatter
63
111
 
64
- If no specialists were used, delete this section.
112
+ If no specialists were used and the report has no prior specialist dispatches,
113
+ delete this section. If prior dispatches exist, keep and extend them.
65
114
 
66
115
  #### Problems Encountered
67
116
  Every problem hit during the session. Root Cause and Resolution columns are
68
117
  mandatory. Include: bugs discovered, wrong approaches tried, blockers hit,
69
- tooling failures. If no problems, delete this section entirely.
118
+ tooling failures. If no problems exist anywhere in the same-day report, delete
119
+ this section entirely.
70
120
 
71
121
  #### Code Changes
72
122
  The skeleton lists files. Add narrative:
73
123
  - Explain key modifications (not every file — focus on the important ones)
74
124
  - Group logically if many changes (e.g., "CLI commands", "Hook changes")
75
125
  - Note architectural decisions embedded in the changes
126
+ - For same-day updates, include changes from all orchestrators that contributed
127
+ to the final pushed stack
76
128
 
77
129
  #### Documentation Updates
78
130
  List doc changes, skill updates, memory saves, CHANGELOG entries.
@@ -84,6 +136,8 @@ This is the most valuable handoff section. For each open issue:
84
136
  blockers discovered, suggested approach, files to look at, gotchas.
85
137
  - Group into "Ready for next session" and "Backlog" subsections
86
138
  - Put the most actionable items first
139
+ - If an issue listed earlier in the day was closed later, remove it from open
140
+ issues and move it to Issues Closed with closure context
87
141
 
88
142
  #### Memories Saved
89
143
  List all `bd remember` calls made this session. If the skeleton missed any,
@@ -96,36 +150,50 @@ Ordered list of 1-4 items with rationale for each. Based on:
96
150
  - Urgency of discovered issues
97
151
  - Blocked items about to unblock
98
152
 
153
+ For same-day updates, make this the next priority from the final state of the
154
+ whole day, not from an earlier partial state.
155
+
99
156
  ### 4. Update frontmatter
100
157
 
101
- Ensure all frontmatter counts are accurate after filling:
102
- - `issues_filed` — actual count
103
- - `specialist_dispatches` — actual count
104
- - `models_used` — list of models that did work this session
158
+ Ensure all frontmatter counts are accurate after filling/updating:
159
+ - `issues_filed` — actual count represented in the report
160
+ - `specialist_dispatches` — actual count represented in the report
161
+ - `models_used` — list of models that did work represented in the report
162
+ - `issues_closed` — actual closed issue count represented in the report
163
+ - `commits` — commit count represented in the report, if known
105
164
 
106
165
  ### 5. Commit the report
107
166
 
167
+ Reports are versioned handoff artifacts and should be tracked.
168
+
108
169
  ```bash
109
170
  git add .xtrm/reports/
110
171
  git commit -m "session report: <date>"
111
172
  ```
112
173
 
174
+ If you updated an existing same-day report after an earlier report commit, commit
175
+ that update with the same message style or fold it into the current final commit
176
+ before push.
177
+
113
178
  ## Quality bar
114
179
 
115
180
  The reference is `~/projects/specialists/.xtrm/reports/2026-03-30-orchestration-session.md`.
116
181
  Every report must match that level of detail. Specifically:
117
182
 
118
183
  - No empty `<!-- FILL -->` markers left in the final output
184
+ - No duplicate same-day reports unless explicitly requested by the operator
119
185
  - Every closed issue has context, not just an ID
120
186
  - Every open issue has actionable handoff suggestions
121
187
  - Problems section captures root causes, not just symptoms
122
188
  - Summary is a dense technical paragraph, not a list of bullet points
189
+ - Same-day updates preserve earlier orchestrator context while making the final
190
+ file read as one SSOT handoff package
123
191
 
124
192
  ## CLI commands
125
193
 
126
194
  | Command | Purpose |
127
195
  |---------|---------|
128
- | `xt report generate` | Collect data, write skeleton |
196
+ | `xt report generate` | Collect data, write skeleton when no suitable report exists |
129
197
  | `xt report show [target]` | Display latest or specified report |
130
198
  | `xt report list` | List all reports with frontmatter summary |
131
199
  | `xt report diff <a> <b>` | Compare two reports |
@@ -5,7 +5,7 @@ description: >
5
5
  agent through writing a valid `.specialist.json`, choosing supported models,
6
6
  validating against the schema, and avoiding common specialist authoring
7
7
  mistakes.
8
- version: 1.1
8
+ version: 1.2
9
9
  synced_at: 236ca5e6
10
10
  ---
11
11
 
@@ -13,6 +13,22 @@ synced_at: 236ca5e6
13
13
 
14
14
  > Source of truth: `src/specialist/schema.ts` | Runtime: `src/specialist/runner.ts`
15
15
 
16
+
17
+ ## Canonical References
18
+
19
+ When a custom specialist needs a standard rule or skill, reference the canonical asset by name instead of copying its file into the repo. Runtime/package fallback resolves canonical mandatory rules and skills when no project-local override exists.
20
+
21
+ Example:
22
+
23
+ ```json
24
+ {
25
+ "mandatory_rules": { "template_sets": ["serena-cheatsheet"] },
26
+ "skills": { "paths": ["releasing"] }
27
+ }
28
+ ```
29
+
30
+ Only create project-local copies when intentionally changing canonical behavior. After setting references, run `sp config show <name> --resolved` to verify the resolved runtime surface.
31
+
16
32
  ---
17
33
 
18
34
  ## ACTION REQUIRED BEFORE ANYTHING ELSE
@@ -40,6 +56,7 @@ Model tiers:
40
56
  Rules:
41
57
  - Always pick the **highest version** in a family (`claude-sonnet-4-6` not `4-5`, `gemini-3.1-pro-preview` not `gemini-2.5-pro`)
42
58
  - `model` and `fallback_model` must be **different providers**
59
+ - If a specialist needs a longer fallback chain, keep first fallback in `fallback_model` and let runtime supply any extra retry tier.
43
60
  - Never write a model string you have not pinged in this session
44
61
 
45
62
  ---
@@ -162,6 +179,10 @@ specialists models # confirm assignments look balanced
162
179
 
163
180
  ---
164
181
 
182
+ ## Canonical references
183
+
184
+ Reference any canonical skill or rule by name; runtime finds it.
185
+
165
186
  ## Quick Start: Scaffold + `sp edit`
166
187
 
167
188
  ```bash
@@ -169,7 +190,7 @@ specialists models # confirm assignments look balanced
169
190
  node config/skills/specialists-creator/scripts/scaffold-specialist.ts config/specialists/my-specialist.specialist.json
170
191
 
171
192
  # 2. Apply a preset for common model/thinking defaults (optional but preferred)
172
- sp edit my-specialist --preset standard
193
+ sp edit my-specialist --preset medium
173
194
 
174
195
  # 3. Set individual fields via dot.path (primary mutation workflow)
175
196
  sp edit my-specialist specialist.metadata.name my-specialist
@@ -177,6 +198,8 @@ sp edit my-specialist specialist.metadata.version 1.0.0
177
198
  sp edit my-specialist specialist.execution.model anthropic/claude-sonnet-4-6
178
199
  sp edit my-specialist specialist.execution.fallback_model google-gemini-cli/gemini-3.1-pro-preview
179
200
  sp edit my-specialist specialist.execution.permission_required READ_ONLY
201
+ sp edit my-specialist specialist.execution.extensions.serena false
202
+ sp edit my-specialist specialist.execution.extensions.gitnexus false
180
203
 
181
204
  # 4. Use --file only for multiline prompt fields
182
205
  sp edit my-specialist specialist.prompt.system --file .tmp/system.prompt.txt
@@ -186,7 +209,7 @@ sp edit my-specialist specialist.prompt.task_template --file .tmp/task-template.
186
209
  sp view my-specialist
187
210
 
188
211
  # 6. Validate schema
189
- bun skills/specialist-author/scripts/validate-specialist.ts config/specialists/my-specialist.specialist.json
212
+ bun config/skills/specialists-creator/scripts/validate-specialist.ts config/specialists/my-specialist.specialist.json
190
213
  ```
191
214
 
192
215
  ---
@@ -199,19 +222,47 @@ bun skills/specialist-author/scripts/validate-specialist.ts config/specialists/m
199
222
  |-------|------|----------|-------|
200
223
  | `name` | string | yes | kebab-case: `[a-z][a-z0-9-]*` |
201
224
  | `version` | string | yes | semver: `1.0.0` |
202
- | `description` | string | yes | One sentence |
225
+ | `description` | string | yes | Routing summary surfaced by `specialists list`; see Description writing below |
203
226
  | `category` | string | yes | Free text (e.g. `workflow`, `analysis`, `codegen`) |
204
227
  | `author` | string | no | Optional |
205
228
  | `created` | string | no | Optional date |
206
229
  | `updated` | string | no | Optional date, quote it: `"2026-03-22"` |
207
230
  | `tags` | string[] | no | Optional list |
208
231
 
232
+
233
+ ### Description writing for `specialists list`
234
+
235
+ `specialist.metadata.description` is the routing surface that orchestrators see in `specialists list`. Write it as an operational role definition, not marketing copy. Keep the first clause distinctive because list output may truncate.
236
+
237
+ A good description answers, in this order:
238
+
239
+ 1. **Choose when** — the task shape that should route here.
240
+ 2. **Do not choose when** — adjacent roles that should win instead.
241
+ 3. **Distinctive capability** — what this specialist does that others do not.
242
+ 4. **Permission/risk note** — READ_ONLY/LOW/MEDIUM/HIGH implication when it affects orchestration.
243
+
244
+ Pattern:
245
+
246
+ ```text
247
+ <role noun>. Use for <specific task shape>. Not for <near misses>; use <better roles>. <permission/workflow distinction>.
248
+ ```
249
+
250
+ Examples:
251
+
252
+ ```text
253
+ Scoped implementation only. Use when requirements, files/symbols, constraints, and validation are clear. Not diagnosis, planning, review, tests, release, or research. HIGH worktree.
254
+
255
+ Debug symptoms/errors/regressions first. Use when cause is unknown or tests fail unexpectedly; traces, fixes targeted code, and verifies. HIGH keep-alive.
256
+ ```
257
+
258
+ Avoid vague descriptions like "general purpose assistant" or "helps with code". Those cause orchestrators to overuse familiar specialists instead of routing to debugger, test-runner, researcher, sync-docs, or other sharper roles.
259
+
209
260
  ### `specialist.execution` (required)
210
261
 
211
262
  | Field | Type | Default | Notes |
212
263
  |-------|------|---------|-------|
213
264
  | `model` | string | — | required — ping before using |
214
- | `fallback_model` | string | — | must be a different provider |
265
+ | `fallback_model` | string | — | first fallback only; runtime may append more tiers |
215
266
  | `mode` | enum | `auto` | `tool` \| `skill` \| `auto` |
216
267
  | `timeout_ms` | number | `120000` | ms |
217
268
  | `stall_timeout_ms` | number | — | kill if no event for N ms |
@@ -220,6 +271,8 @@ bun skills/specialist-author/scripts/validate-specialist.ts config/specialists/m
220
271
  | `output_type` | enum | `custom` | `codegen` \| `analysis` \| `review` \| `synthesis` \| `orchestration` \| `workflow` \| `research` \| `custom` |
221
272
  | `permission_required` | enum | `READ_ONLY` | see tier table below |
222
273
  | `thinking_level` | enum | — | `off` \| `minimal` \| `low` \| `medium` \| `high` \| `xhigh` |
274
+ | `extensions.serena` | boolean | `true` | set `false` to opt out of Serena extension injection for this specialist |
275
+ | `extensions.gitnexus` | boolean | `true` | set `false` to opt out of GitNexus extension injection for this specialist |
223
276
 
224
277
  **When to use `execution.interactive`**
225
278
 
@@ -230,17 +283,81 @@ bun skills/specialist-author/scripts/validate-specialist.ts config/specialists/m
230
283
  - MCP `start_specialist`: `keep_alive` enables, `no_keep_alive` disables.
231
284
  - Effective precedence: explicit disable (`--no-keep-alive` / `no_keep_alive`) → explicit enable (`--keep-alive` / `keep_alive`) → `execution.interactive` → one-shot default.
232
285
 
233
- **Permission tiers** — controls which pi tools are available:
286
+ **Permission tiers** — controls the *native* pi tools the specialist gets. The full resolved tool set also includes catalog-defined GitNexus and Serena tools per tier; see [docs/manifest.md](../../../docs/manifest.md) for the complete picture.
287
+
288
+ | Level | Native tools (cumulative) | Use when |
289
+ |-------|---------------------------|----------|
290
+ | `READ_ONLY` | `read, grep, find, ls` | Read-only analysis, no bash |
291
+ | `LOW` | `+ bash` | Inspect/run commands, no file edits |
292
+ | `MEDIUM` | `+ edit` | Can edit existing files |
293
+ | `HIGH` | `+ write` | Full access — can create new files |
234
294
 
235
- | Level | pi --tools | Use when |
236
- |-------|-----------|----------|
237
- | `READ_ONLY` | `read,grep,find,ls` | Read-only analysis, no bash |
238
- | `LOW` | `+bash` | Inspect/run commands, no file edits |
239
- | `MEDIUM` | `+edit` | Can edit existing files |
240
- | `HIGH` | `+write` | Full access — can create new files |
295
+ After choosing a tier, verify the resolved tool list before dispatching:
296
+
297
+ ```bash
298
+ sp config show <name> --resolved
299
+ ```
241
300
 
242
301
  **Common pitfall:** `READ_WRITE` is **not** a valid value — use `LOW` or higher.
243
302
 
303
+ ### Per-specialist `permissions[<TIER>]` override (rarely needed)
304
+
305
+ Most specialists use the catalog default deny baseline. **Do not declare an override unless this specialist's policy genuinely diverges from its tier.** When you do override, remember the specialist block replaces catalog defaults for that tier.
306
+
307
+ If divergence is real, add a top-level `permissions` block (sibling to `execution`):
308
+
309
+ ```jsonc
310
+ {
311
+ "specialist": {
312
+ "execution": { "permission_required": "READ_ONLY" },
313
+ "permissions": {
314
+ "READ_ONLY": {
315
+ "denied_natives_when_extension": ["grep", "find", "ls"],
316
+ "denied_natives_mode": "hard"
317
+ }
318
+ }
319
+ }
320
+ }
321
+ ```
322
+
323
+ | Field | Type | Default | Effect |
324
+ |-------|------|---------|--------|
325
+ | `denied_natives_when_extension` | `string[]` | `[]` | Native tools to deny only when a replacement extension is healthy. Catalog defaults apply first; specialist override replaces them for that tier. |
326
+ | `denied_natives_mode` | `"soft"` \| `"hard"` | `"soft"` | `soft` keeps the tool with a preference hint; `hard` removes it (with auto-restore if the extension degrades) |
327
+
328
+ The override block can only *deny* natives — it cannot add new tools beyond the catalog tier. To add tools, change the tier or update the catalog file.
329
+
330
+ **Decision rule when authoring:**
331
+ 1. Pick the lowest tier that satisfies the specialist's actual capability needs.
332
+ 2. Run `sp config show <name> --resolved` and inspect the `--tools` line.
333
+ 3. If the tools are right, you're done — no override needed.
334
+ 4. If a native tool is genuinely worse than an extension equivalent for this specialist's task, declare a soft-deny first to observe behavior, then promote to hard-deny once you trust it.
335
+
336
+ See [docs/manifest.md](../../../docs/manifest.md) for full deny-mode semantics, extension health gating, and the canonical explorer example.
337
+
338
+ **Per-specialist extension opt-out**
339
+
340
+ Use `execution.extensions` only when this specialist must suppress default extension injection.
341
+ Both flags default to `true`, so omit this block unless opt-out is required.
342
+
343
+ ```json
344
+ {
345
+ "specialist": {
346
+ "execution": {
347
+ "extensions": {
348
+ "serena": false,
349
+ "gitnexus": false
350
+ }
351
+ }
352
+ }
353
+ }
354
+ ```
355
+
356
+ Typical use cases:
357
+ - `serena: false` for specialists that must avoid Serena tool/LSP injection
358
+ - `gitnexus: false` for specialists that should not receive GitNexus graph tooling
359
+ - set both `false` for constrained runs that need clean extension surface
360
+
244
361
  ### `specialist.prompt` (required)
245
362
 
246
363
  | Field | Type | Required | Notes |
@@ -356,8 +473,6 @@ planner — epic result:
356
473
 
357
474
  `run` accepts either a **file path** (`./scripts/foo.sh`, `~/scripts/foo.sh`) or a **shell command** (`bd ready`, `git status`). Pre-run validation checks that file paths exist and shell commands are on `PATH`. Shebang typos (e.g. `pytho` instead of `python`) are caught and reported as errors before the session starts.
358
475
 
359
- `path` is accepted as a deprecated alias for `run`.
360
-
361
476
  ### `specialist.capabilities` (optional)
362
477
 
363
478
  Informational declarations used by pre-run validation and future tooling (e.g. `specialists doctor`).
@@ -383,27 +498,6 @@ Informational declarations used by pre-run validation and future tooling (e.g. `
383
498
 
384
499
  Writes the final session output to this file path after the session completes. Relative to the working directory.
385
500
 
386
- ### `specialist.communication` (optional)
387
-
388
- ```json
389
- {
390
- "communication": {
391
- "next_specialists": "planner"
392
- }
393
- }
394
- ```
395
-
396
- Or as an array:
397
- ```json
398
- {
399
- "communication": {
400
- "next_specialists": ["planner", "test-runner"]
401
- }
402
- }
403
- ```
404
-
405
- `next_specialists` declares which specialist(s) should receive this specialist's output as `$previous_result`. Chaining is executed by the caller (e.g. `run_parallel` pipeline) — this field is declarative metadata.
406
-
407
501
  ### `specialist.validation` (optional)
408
502
 
409
503
  Drives the staleness detection shown in `specialists status` and `specialists list`.
@@ -480,7 +574,7 @@ Files listed under `skills.paths` are read and appended to the system prompt at
480
574
  {
481
575
  "skills": {
482
576
  "paths": [
483
- "skills/specialist-author/SKILL.md",
577
+ ".xtrm/skills/active/specialists-creator/SKILL.md",
484
578
  ".claude/agents.md"
485
579
  ]
486
580
  }
@@ -576,9 +670,6 @@ Scripts run **locally** (not inside the agent session):
576
670
  "required_tools": ["bash", "read"],
577
671
  "external_commands": ["git"]
578
672
  },
579
- "communication": {
580
- "next_specialists": ["sync-docs"]
581
- },
582
673
  "output_file": ".specialists/review.md",
583
674
  "beads_integration": "auto"
584
675
  }
@@ -681,7 +772,7 @@ pi --model <provider>/<fallback-model-id> --print "ping" # must return "pong"
681
772
  node config/skills/specialists-creator/scripts/scaffold-specialist.ts config/specialists/my-specialist.specialist.json
682
773
 
683
774
  # 3. Mutate with sp edit (dot.path + presets)
684
- sp edit my-specialist --preset standard
775
+ sp edit my-specialist --preset medium
685
776
  sp edit my-specialist specialist.execution.model <provider>/<primary-model-id>
686
777
  sp edit my-specialist specialist.execution.fallback_model <provider>/<fallback-model-id>
687
778
 
@@ -693,7 +784,7 @@ sp edit my-specialist specialist.prompt.task_template --file .tmp/task-template.
693
784
  sp view my-specialist
694
785
 
695
786
  # 6. Validate schema with the bundled helper
696
- bun skills/specialist-author/scripts/validate-specialist.ts config/specialists/my-specialist.specialist.json
787
+ bun config/skills/specialists-creator/scripts/validate-specialist.ts config/specialists/my-specialist.specialist.json
697
788
 
698
789
  # 7. List to confirm discovery
699
790
  specialists list
@@ -702,4 +793,4 @@ specialists list
702
793
  specialists run my-specialist --prompt "ping" --no-beads
703
794
  ```
704
795
 
705
- If you need the underlying implementation, read `skills/specialist-author/scripts/validate-specialist.ts`. It is a thin Bun/TypeScript wrapper over `parseSpecialist()` from `src/specialist/schema.ts`, which keeps the helper cross-platform for Windows, macOS, and Linux.
796
+ If you need the underlying implementation, read `config/skills/specialists-creator/scripts/validate-specialist.ts`. It is a thin Bun/TypeScript wrapper over `parseSpecialist()` from `src/specialist/schema.ts`, which keeps the helper cross-platform for Windows, macOS, and Linux.