v1.91.157.0 perf(gen-skill-docs): drop the "When to invoke" body section from Claude SKILL.md files (port of #3129) (#3305)

* perf(gen-skill-docs): stop emitting the "When to invoke" body section

The Claude catalog trim moved each skill's routing prose ("Use when...",
"Proactively invoke...", voice triggers) out of the frontmatter description
into a "## When to invoke this skill" section at the top of the body. Claude
Code reads only name + description to choose a skill and loads the body after
the skill is invoked, so that text cannot route anything and costs tokens on
every invocation. Keep the one-line trimmed description; drop the section.

The routing prose stays in each template's description, which
--catalog-mode=full and the other hosts still render. Tests that pinned the
section now assert its absence, or check the template instead.

(cherry picked from commit 707ccd6f38)

* feat(gen-skill-docs): keep voice triggers in the root routing block

The Claude catalog trim drops each skill's "Voice triggers (speech-to-text
aliases)" line from its description, and the body section that used to hold
it is gone. {{VOICE_TRIGGER_ROUTING}} renders them in the root router's
routing block instead: one "Voice trigger ... → invoke /<skill>" line per
skill, read from the templates' voice-triggers lists, so disabled-skill
filtering applies to them like any other routing line. Other hosts keep the
line in each description and render nothing here.

extractVoiceTriggers moves to the new resolver so the generator and the
resolver share one parser.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 645e75b1e8)

* chore: regenerate SKILL.md files without the "When to invoke" section

Output of `bun run gen:skill-docs --host all` after the previous commits.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit ff4c813337)

* test: refresh context-budget ceilings for the smaller skill bodies

`bun test/helpers/capture-context-budget.ts`. Against a recapture of the base
commit, 55 skills that lost the section get a lower ceiling and the root
gstack router rises by 532 tokens for the voice-trigger routing lines (5,369
tokens lower in total). devex-review and eval-plan differ from the committed
fixture only because it already lagged main. alwaysOnTotal is unchanged: the
catalog descriptions did not change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit d886fcecc1)

* test: refresh the claude ship golden without the "When to invoke" section

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit f1789dca5c)

* test: lower the claude design-review size pin

The size guard (#3199) asks for it: claude/design-review shrank by 437 chars
without its "When to invoke" section.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 3a446fcc62)

* test: skip alias symlinks in the voice-routing check, keep unrelated budget ceilings, add #3129 CHANGELOG entry

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

* test: rebuild the historical cookie approval with the dropped section, record the skill-fixture change as non-behavioral

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

* v1.91.157.0 perf(gen-skill-docs): drop the "When to invoke" body section from Claude SKILL.md files (port of #3129)

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

---------

Co-authored-by: thanhnguyentung95 <17350411+thanhnguyentung95@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
This commit is contained in:
authored and GitHub committed 2026-10-19 22:55:42 +00:00
1 parent 69a6d7fc3b
commit 6237994016
77 files changed
+214 -757

No files matched your search

+19
View File
@@ -1,5 +1,24 @@
# Changelog
## [1.91.157.0] - 2026-10-19
**Claude SKILL.md files no longer carry a "When to invoke" body section, which saves about 20 KB across 56 skills.** Claude Code reads a skill's body only after the skill is invoked, so routing prose there never routed anything. Routing still comes from the catalog description and the CLAUDE.md routing block, and voice triggers move into the root router's routing block. From #3129 by @thanhnguyentung95.
### Changed
- **Catalog trim (`scripts/gen-skill-docs.ts`):** the Claude render keeps the one-line catalog description and no longer inserts the routing and voice-trigger prose into the body. `--catalog-mode=full` and the other hosts are unchanged: they keep the full description.
- **Voice triggers in the root router:** a new `{{VOICE_TRIGGER_ROUTING}}` resolver (`scripts/resolvers/voice-triggers.ts`) adds one `- Voice trigger "…" → invoke /<skill>` line per skill to the root `SKILL.md` routing block, Claude only. That's 21 lines, and the root router's eager ceiling rises from 4289 to 4821 tokens.
- **Context budget:** 54 per-skill eager ceilings go down (net −5,139 tokens). The `claude/design-review` size pin drops by 437 chars, and the claude ship golden is refreshed.
- **Gate integrity:** the tests that pinned the removed section now assert its absence, or check the template description instead:
- `test/catalog-trim.test.ts` (the three `buildWhenToInvokeSection` tests go with the function);
- `test/catalog-mode-full.test.ts` and `test/cso-preserved.test.ts`;
- `test/gen-skill-docs.test.ts` (the benchmark routing and CSO voice tests read the template);
- `test/skill-validation.test.ts` (trigger and proactive phrases are checked in `SKILL.md.tmpl`);
- `test/helpers/parity-harness.ts` (no `## When to invoke` heading required);
- `test/helpers/skill-fixture.ts` and `test/skill-e2e-retro.test.ts` (the section is dropped from the review, review-army and retro E2E section lists). `scripts/harness-version.json` records the `skill-fixture.ts` change as non-behavioral: `HARNESS_VERSION` stays 6, and the regenerated SKILL.md bytes already start those cases' new series.
- `test/helpers/manual-judge-review-fixture.ts` puts the removed section back when it rebuilds the historical cookie-workflow approval, so the approved prompt hash and line range still match. The approval itself is unchanged.
One new free test checks that the root router routes every voice trigger, and it skips the `connect-chrome` alias symlink. No threshold, trial count, case kind or judge changed. No context-budget ceiling rose except the root router's.
## [1.91.156.0] - 2026-10-19
**The weekly marathon's office-hours case can run its review formatter again, and its validator now checks cap fixes the way the formatter does.** Both defects came from #3164 and were in the test, not the skill. The marathon fixture copied `bin/gstack-office-hours-review` with a hand-kept list of two library files; #3164 added a third import (`lib/spec-review-cap.ts`), so every formatter command in the fixture failed at module load, the agent correctly declared the review UNREVIEWED, and the case went red in marathon run 39032308051 (#3246). With the module restored, a focused rerun showed the second defect: when the review stops at the round cap and the agent applies the remaining blocking fixes with `--fixes`, the formatter records them as verified, but the test never gave the validator that list, so it expected "fixes unconfirmed" and rejected a correct report.
+21 -8
View File
@@ -16,14 +16,6 @@ triggers:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Sends any gstack request to the right skill
(planning, review, QA, shipping, debugging, docs, security, design). Routes QA by
intent and browser interaction to /browse. Use when you invoke gstack without a specific
skill, or ask "which gstack skill fits this?".
## Preamble (run first)
```bash
@@ -230,6 +222,27 @@ Generic “second opinion”, “outside review”, or “cross-model review”
- User asks what gstack has learned, "show learnings" → invoke `/learn`
- User asks to tune question sensitivity, "stop asking me that" → invoke `/plan-tune`
- User asks for code quality dashboard, "health check" → invoke `/health`
- Voice trigger "auto plan", "automatic review" → invoke `/autoplan`
- Voice trigger "speed test", "check performance" → invoke `/benchmark`
- Voice trigger "compare models", "model shootout", "which model is best" → invoke `/benchmark-models`
- Voice trigger "open the browser", "look at this page" → invoke `/browse`
- Voice trigger "code x", "code ex", "get another opinion" → invoke `/codex`
- Voice trigger "see-so", "see so", "security review", "security check", "vulnerability scan", "run security" → invoke `/cso`
- Voice trigger "build the design", "code the mockup", "make it real" → invoke `/design-html`
- Voice trigger "dx audit", "test the developer experience", "try the onboarding", "developer experience test" → invoke `/devex-review`
- Voice trigger "upgrade the tools", "update the tools", "gee stack upgrade", "g stack upgrade" → invoke `/gstack-upgrade`
- Voice trigger "clean the iOS debug bridge", "remove DebugBridge", "strip the gstack iOS instrumentation" → invoke `/ios-clean`
- Voice trigger "review the iOS design", "audit the iPhone app's visuals", "design QA the iPhone app" → invoke `/ios-design-review`
- Voice trigger "fix the iOS bug", "patch the iPhone app", "auto-fix the iOS issue" → invoke `/ios-fix`
- Voice trigger "iOS quality check", "test the iPhone app", "test the iPad app", "run iOS QA" → invoke `/ios-qa`
- Voice trigger "resync the iOS debug bridge", "regenerate iOS accessors", "update the gstack iOS instrumentation" → invoke `/ios-sync`
- Voice trigger "make this a pdf", "make it a pdf", "export to pdf", "turn this into a pdf", "turn this markdown into a pdf", "generate a pdf", "make a pdf from", "pdf this markdown" → invoke `/make-pdf`
- Voice trigger "show me the browser" → invoke `/open-gstack-browser`
- Voice trigger "pair agent", "connect agent", "share my browser", "remote browser access" → invoke `/pair-agent`
- Voice trigger "dx review", "developer experience review", "devex review", "devex audit", "API design review", "onboarding review" → invoke `/plan-devex-review`
- Voice trigger "tech review", "technical review", "plan engineering review" → invoke `/plan-eng-review`
- Voice trigger "quality check", "test the app", "run QA" → invoke `/qa`
- Voice trigger "bug report", "just check for bugs" → invoke `/qa-only`
**Route only to skills in your available-skills list.** A rule above whose skill is
not listed there is turned off on this install; skip it, never try to invoke it.
+1 -1
View File
@@ -97,7 +97,7 @@ quality gates that produce better results than answering inline.
- User asks to plan, preregister, price or pilot a paid eval → invoke `/eval-plan`
- User asks what gstack has learned, "show learnings" → invoke `/learn`
- User asks to tune question sensitivity, "stop asking me that" → invoke `/plan-tune`
- User asks for code quality dashboard, "health check" → invoke `/health`
- User asks for code quality dashboard, "health check" → invoke `/health`{{VOICE_TRIGGER_ROUTING}}
**Route only to skills in your available-skills list.** A rule above whose skill is
not listed there is turned off on this install; skip it, never try to invoke it.
+1 -1
View File
@@ -1 +1 @@
1.91.156.0
1.91.157.0
+1 -1
View File
@@ -1,4 +1,4 @@
# gstack digest v1.91.156.0 — regenerate/re-copy after upgrading gstack
# gstack digest v1.91.157.0 — regenerate/re-copy after upgrading gstack
Behavioral rules from gstack (https://github.com/garrytan/gstack), compressed
for agent hosts without a full skill install. The full skills add workflows,
-13
View File
@@ -32,19 +32,6 @@ hooks:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Surfaces
taste decisions (close approaches, borderline scope, outside-review disagreements) at a final
approval gate. One command, fully reviewed plan out.
Use when asked to "auto review", "autoplan", "run all reviews", "review this plan
automatically", or "make the decisions for me".
Proactively suggest when the user has a plan file and wants to run the full review
gauntlet without answering 15-30 intermediate questions.
Voice triggers (speech-to-text aliases): "auto plan", "automatic review".
## Preamble (run first)
```bash
-12
View File
@@ -16,18 +16,6 @@ allowed-tools:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Runs the same prompt through Claude,
GPT (via Codex CLI), and Gemini side-by-side — compares latency, tokens, cost,
and optionally quality via LLM judge. Answers "which model is actually best
for this skill?" with data instead of vibes. Separate from /benchmark, which
measures web page performance. Use when: "benchmark models", "compare models",
"which model is best for X", "cross-model comparison", "model shootout".
Voice triggers (speech-to-text aliases): "compare models", "model shootout", "which model is best".
## Preamble (run first)
```bash
-12
View File
@@ -17,18 +17,6 @@ allowed-tools:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Establishes
baselines for page load times, Core Web Vitals, and resource sizes.
Compares before/after on every PR. Tracks performance trends over time.
Use when: "web performance benchmark", "page speed", "lighthouse", "web vitals",
"bundle size", "load time". Not for AI model, agent eval or business
benchmarks; use /benchmark-models for cross-model skill comparisons.
Voice triggers (speech-to-text aliases): "speed test", "check performance".
## Preamble (run first)
```bash
-8
View File
@@ -16,14 +16,6 @@ allowed-tools:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Use when asked to open a site, test a page, take a
screenshot, or dogfood a flow.
Voice triggers (speech-to-text aliases): "open the browser", "look at this page".
## Preamble (run first)
```bash
-9
View File
@@ -17,15 +17,6 @@ triggers:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Watches the live app for console errors,
performance regressions, and page failures. Takes
periodic screenshots, compares against pre-deploy baselines, and alerts
on anomalies. Use when: "monitor deploy", "canary", "post-deploy check",
"watch production", "verify deploy".
## Preamble (run first)
```bash
-9
View File
@@ -25,15 +25,6 @@ hooks:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Warns before rm -rf, DROP TABLE,
force-push, git reset --hard, kubectl delete, and similar destructive operations.
User can override each warning. Use when touching prod, debugging live systems,
or working in a shared environment. Use when asked to "be careful", "safety mode",
"prod mode", or "careful mode".
# /careful — Destructive Command Guardrails
Safety mode is now **active**. Every Bash and PowerShell command will be checked
-11
View File
@@ -18,17 +18,6 @@ allowed-tools:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Code review: independent diff review via
codex review with pass/fail gate. Challenge: adversarial mode that tries to break
your code. Consult: ask codex anything with session continuity for follow-ups.
The "200 IQ autistic developer" second opinion. Use when asked to "codex review",
"codex challenge", "ask codex", "second opinion", or "consult codex".
Voice triggers (speech-to-text aliases): "code x", "code ex", "get another opinion".
## Preamble (run first)
```bash
-9
View File
@@ -19,15 +19,6 @@ triggers:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Loads the most recent
saved state (preferring the current branch, falling back across branches) so
you can pick up where you left off — even across Conductor workspace handoffs.
Use when asked to "resume", "restore context", "where was I", or
"pick up where I left off". Pair with /context-save.
## Preamble (run first)
```bash
-8
View File
@@ -19,14 +19,6 @@ triggers:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Captures git state, decisions made, and remaining work
so any future session can pick up without losing a beat.
Use when asked to "save progress", "save state", "context save", or
"save my work". Pair with /context-restore to resume later.
## Preamble (run first)
```bash
-7
View File
@@ -13,13 +13,6 @@ triggers:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Use when: "security audit", "threat model", "OWASP", "CSO review", "recheck a vulnerability".
Voice triggers (speech-to-text aliases): "see-so", "see so", "security review", "security check", "vulnerability scan", "run security".
# /cso — evidence before assurance
Find exploitable defects. State attacker, boundary, impact, and challenge. Static assessment remains available without runtime or scanner profiles. Qualified comprehensive profiles add reproduction and repair candidates without changing the branch. Trusted `gstack-cso` owns execution, persistence, and proof labels.
-9
View File
@@ -43,15 +43,6 @@ gbrain:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Creates DESIGN.md as your project's design source
of truth. For existing sites, use /plan-design-review to infer the system instead.
Use when asked to "design system", "brand guidelines", or "create DESIGN.md".
Proactively suggest when starting a new project's UI with no existing
design system or DESIGN.md.
## Preamble (run first)
```bash
-13
View File
@@ -20,19 +20,6 @@ allowed-tools:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Works with approved mockups from /design-shotgun, CEO plans from /plan-ceo-review,
design review context from /plan-design-review, or from scratch with a user
description. Text actually reflows, heights are computed, layouts are dynamic.
30KB overhead, zero deps. Smart API routing: picks the right Pretext patterns
for each design type. Use when: "finalize this design", "turn this into HTML",
"build me a page", "implement this design", or after any planning skill.
Proactively suggest when user has approved a design or has a plan ready.
Voice triggers (speech-to-text aliases): "build the design", "code the mockup", "make it real".
## Preamble (run first)
```bash
-10
View File
@@ -20,16 +20,6 @@ triggers:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Iteratively fixes issues
in source code, committing each fix atomically and re-verifying with before/after
screenshots. For plan-mode design review (before implementation), use /plan-design-review.
Use when asked to "audit the design", "visual QA", "check if it looks good", or "design polish".
Proactively suggest when the user mentions visual inconsistencies or
wants to polish the look of a live site.
## Preamble (run first)
```bash
-9
View File
@@ -37,15 +37,6 @@ gbrain:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Standalone design exploration you can
run anytime. Use when: "explore designs", "show me options", "design variants",
"visual brainstorm", or "I don't like how this looks".
Proactively suggest when the user describes a UI feature but hasn't seen
what it could look like.
## Preamble (run first)
```bash
-7
View File
@@ -14,13 +14,6 @@ triggers:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Use for
/deslop-shared-libs, $deslop-shared-libs, or requests to find code worth sharing.
Recommendations only.
# Find code worth sharing
Find up to five new opportunities to share code, then recommend the best three.
-13
View File
@@ -19,19 +19,6 @@ allowed-tools:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Actually TESTS the developer experience
in the Aside browser: navigates docs, tries the getting started flow, times
TTHW, screenshots error messages, evaluates CLI help text. Produces a DX
scorecard with evidence. Compares against /plan-devex-review scores if they
exist (the boomerang: plan said 3 minutes, reality says 8). Use when asked to
"test the DX", "DX audit", "developer experience test", or "try the
onboarding". Proactively suggest after shipping a developer-facing feature.
Voice triggers (speech-to-text aliases): "dx audit", "test the developer experience", "try the onboarding", "developer experience test".
## Preamble (run first)
```bash
-8
View File
@@ -19,14 +19,6 @@ triggers:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
The SVG/PNG use clean mermaid style; the
.excalidraw carries the hand-drawn aesthetic. Fully offline.
Use when asked to "make a diagram", "draw the architecture", "create a
flowchart", "diagram this", or "visualize this flow".
## Preamble (run first)
```bash
-9
View File
@@ -23,15 +23,6 @@ triggers:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Uses the Diataxis framework (tutorial / how-to / reference / explanation) to produce
complete, structured documentation. Can be invoked standalone or called by
/document-release when it finds coverage gaps. Use when asked to "write docs",
"generate documentation", "document this feature", "create a tutorial", or
"explain this module".
## Preamble (run first)
```bash
-11
View File
@@ -19,17 +19,6 @@ triggers:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Reads relevant project docs, cross-references the
diff, builds a Diataxis coverage map (reference/how-to/tutorial/explanation),
updates README/ARCHITECTURE/CONTRIBUTING/CLAUDE.md to match what shipped,
detects architecture diagram drift, polishes CHANGELOG voice with a sell-test
rubric, cleans up TODOS, and optionally bumps VERSION. Surfaces documentation
debt in the PR body. Use when asked to "update the docs", "sync documentation",
or "post-ship docs". Proactively suggest a documentation audit before merge.
## Preamble (run first)
```bash
-9
View File
@@ -31,15 +31,6 @@ hooks:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Blocks Edit,
Write and NotebookEdit outside the allowed path. Use when debugging to prevent accidentally
"fixing" unrelated code, or when you want to scope changes to one module.
Use when asked to "freeze", "restrict edits", "only edit this folder",
or "lock down edits".
# /freeze — Restrict Edits to a Directory
Lock file edits to a specific directory. Any Edit, Write or NotebookEdit
-9
View File
@@ -15,15 +15,6 @@ allowed-tools:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Detects global vs vendored install,
runs the upgrade, and shows what's new. Use when asked to "upgrade gstack",
"update gstack", or "get latest version".
Voice triggers (speech-to-text aliases): "upgrade the tools", "update the tools", "gee stack upgrade", "g stack upgrade".
# /gstack-upgrade
Upgrade gstack to the latest version and show what's new.
-8
View File
@@ -41,14 +41,6 @@ hooks:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Combines /careful (warns before rm -rf, DROP TABLE, force-push, etc.) with
/freeze (blocks edits outside a specified directory). Use for maximum safety
when touching prod or debugging live systems. Use when asked to "guard mode",
"full safety", "lock it down", or "maximum safety".
# /guard — Full Safety Mode
Activates both destructive command warnings and directory-scoped edit restrictions.
-9
View File
@@ -19,15 +19,6 @@ allowed-tools:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Wraps existing project tools (type checker, linter,
test runner, dead code detector, shell linter), computes a weighted composite
0-10 score, and tracks trends over time. Use when: "health check",
"code quality", "how healthy is the codebase", "run all checks",
"quality score".
## Preamble (run first)
```bash
-11
View File
@@ -61,17 +61,6 @@ gbrain:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Four phases: investigate,
analyze, hypothesize, implement. Iron Law: no fixes without root cause.
Use when asked to "debug this", "fix this bug", "why is this broken",
"investigate this error", or "root cause analysis".
Proactively invoke this skill (do NOT debug directly) when the user reports
errors, 500 errors, stack traces, unexpected behavior, "it was working
yesterday", or is troubleshooting why something stopped working.
## Preamble (run first)
```bash
-12
View File
@@ -18,18 +18,6 @@ triggers:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Cleans up StateServer, DebugOverlay, accessor codegen output, and
app-side hooks installed by /ios-qa. This is a convenience wrapper —
the structural Release-build guard (Package.swift conditional + CI
swift build -c release check) is the safety-critical path.
Use when asked to "clean the iOS debug bridge", "remove DebugBridge",
or "strip the gstack iOS instrumentation".
Voice triggers (speech-to-text aliases): "clean the iOS debug bridge", "remove DebugBridge", "strip the gstack iOS instrumentation".
## Preamble (run first)
```bash
-15
View File
@@ -17,21 +17,6 @@ triggers:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Connects to a real
iPhone via the same StateServer as /ios-qa, screenshots every screen,
evaluates against Apple HIG, DESIGN.md, and design best practices. Scores
each dimension 0-10 with "what would make it a 10" framing — mirrors
/plan-design-review for browser. For plan-stage design review (before
implementation), use /plan-design-review. For live web visual audits, use
/design-review.
Use when asked to "review the iOS design", "audit the iPhone app's
visuals", or "design QA the iOS app".
Voice triggers (speech-to-text aliases): "review the iOS design", "audit the iPhone app's visuals", "design QA the iPhone app".
## Preamble (run first)
```bash
-14
View File
@@ -19,20 +19,6 @@ triggers:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Takes a bug found by /ios-qa, reads the source,
writes the fix, rebuilds, redeploys, and verifies the fix on the real
device. Closes the loop: find bug → fix bug → confirm fix — zero human
intervention. Captures the pre-bug state snapshot as a regression test
fixture, so the bug can never recur silently.
Use when /ios-qa reports a bug and you want it fixed automatically, or
when asked to "fix this iOS bug", "patch the iPhone app", or "auto-fix
the iOS issue".
Voice triggers (speech-to-text aliases): "fix the iOS bug", "patch the iPhone app", "auto-fix the iOS issue".
## Preamble (run first)
```bash
-15
View File
@@ -22,21 +22,6 @@ triggers:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Connects to a real iPhone or iPad via
USB CoreDevice IPv6 tunnel, reads Swift source to understand every screen, then
runs a vision-driven agent loop: screenshot → analyze → decide → act →
verify → repeat. All interaction happens via HTTP to an embedded
StateServer in the app under test. Optionally exposes the device over
Tailscale so remote agents (OpenClaw, Codex, any HTTP-capable agent) can
run iOS QA from anywhere without touching the hardware.
Use when asked to "ios qa", "test my iPhone app", "test my iPad app",
"find bugs on the device", or "qa the iOS app".
Voice triggers (speech-to-text aliases): "iOS quality check", "test the iPhone app", "test the iPad app", "run iOS QA".
## Preamble (run first)
```bash
-11
View File
@@ -19,17 +19,6 @@ triggers:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Updates StateServer.swift, DebugOverlay.swift, Package.swift,
and the typed @Observable state accessors. Use after you upgrade gstack
or add new ViewModels/properties that need accessor coverage.
Use when asked to "resync the iOS debug bridge", "regenerate iOS
accessors", or "update the gstack iOS instrumentation".
Voice triggers (speech-to-text aliases): "resync the iOS debug bridge", "regenerate iOS accessors", "update the gstack iOS instrumentation".
## Preamble (run first)
```bash
-8
View File
@@ -17,14 +17,6 @@ triggers:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Merges the PR, waits for CI and deploy,
verifies production health via canary checks. Takes over after /ship
creates the PR. Use when: "merge", "land", "deploy", "merge and verify",
"land it", "ship it to production".
## Preamble (run first)
```bash
-9
View File
@@ -16,15 +16,6 @@ allowed-tools:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Shows which VERSION slots
are currently claimed by open PRs, which sibling Conductor workspaces have
WIP work likely to ship soon, and what slot /ship would pick next. No
mutations — just a snapshot. Use when asked to "landing report", "what's in
the queue", "show me open PRs", or "which version do I claim next".
# /landing-report — Version Queue Dashboard
## Preamble (run first)
-9
View File
@@ -19,15 +19,6 @@ allowed-tools:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Review, search, prune, and export what gstack
has learned across sessions. Use when asked to "what have we learned",
"show learnings", "prune stale learnings", or "export learnings".
Proactively suggest when the user asks about past patterns or wonders
"didn't we fix this before?"
## Preamble (run first)
```bash
-11
View File
@@ -16,17 +16,6 @@ allowed-tools:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Proper 1in margins,
intelligent page breaks, page numbers, cover pages, running headers, curly
quotes and em dashes, clickable TOC, diagonal DRAFT watermark. Not a draft
artifact — a finished artifact. Use when asked to "make a PDF", "export to
PDF", "turn this markdown into a PDF", or "generate a document".
Voice triggers (speech-to-text aliases): "make this a pdf", "make it a pdf", "export to pdf", "turn this into a pdf", "turn this markdown into a pdf", "generate a pdf", "make a pdf from", "pdf this markdown".
## Preamble (run first)
```bash
-15
View File
@@ -47,21 +47,6 @@ gbrain:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Startup mode: six forcing questions that expose
demand reality, status quo, desperate specificity, narrowest wedge, observation,
and future-fit. Builder mode: design thinking brainstorming for side projects,
hackathons, learning, and open source. Saves a design doc.
Use when asked to "brainstorm this", "I have an idea", "help me think through
this", "office hours", or "is this worth building".
Proactively invoke this skill (do NOT answer directly) when the user describes
a new product idea, asks whether something is worth building, wants to think
through design decisions for something that doesn't exist yet, or is exploring
a concept before any code is written.
Use before /plan-ceo-review or /plan-eng-review.
## Preamble (run first)
```bash
-10
View File
@@ -16,16 +16,6 @@ allowed-tools:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Opens a visible browser window where you can watch every action in real time.
The sidebar shows a live activity feed and chat. Anti-bot stealth built in.
Use when asked to "open gstack browser", "launch browser", "connect chrome",
"open chrome", "real browser", "launch chrome", "side panel", or "control my browser".
Voice triggers (speech-to-text aliases): "show me the browser".
## Preamble (run first)
```bash
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "gstack",
"version": "1.91.156",
"version": "1.91.157",
"description": "Garry's Stack — Claude Code skills + fast headless browser. One repo, one install, entire AI engineering workflow.",
"license": "MIT",
"type": "module",
-13
View File
@@ -16,19 +16,6 @@ allowed-tools:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
One command generates a setup key and
prints instructions the other agent can follow to connect. Works with OpenClaw,
Hermes, Codex, Cursor, or any agent that can make HTTP requests. The remote agent
gets its own tab with full page access by default (the pairing ceremony is the
trust boundary; --restrict narrows it).
Use when asked to "pair agent", "connect agent", "share browser", "remote browser",
"let another agent use my browser", or "give browser access".
Voice triggers (speech-to-text aliases): "pair agent", "connect agent", "share my browser", "remote browser access".
## Preamble (run first)
```bash
-12
View File
@@ -49,18 +49,6 @@ gbrain:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Rethink the problem, find the 10-star product,
challenge premises, expand scope when it creates a better product. Four modes:
SCOPE EXPANSION (dream big), SELECTIVE EXPANSION (hold scope + cherry-pick
expansions), HOLD SCOPE (maximum rigor), SCOPE REDUCTION (strip to essentials).
Use when asked to "think bigger", "expand scope", "strategy review", "rethink this",
or "is this ambitious enough".
Proactively suggest when the user is questioning scope or ambition of a plan,
or when the plan feels like it could be thinking bigger.
## Preamble (run first)
```bash
-10
View File
@@ -18,16 +18,6 @@ triggers:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Rates each design dimension 0-10, explains what would make it a 10,
then fixes the plan to get there. Works in plan mode. For live site
visual audits, use /design-review. Use when asked to "review the design plan"
or "design critique".
Proactively suggest when the user has a plan with UI/UX components that
should be reviewed before implementation.
# /plan-design-review: Designer's Eye Plan Review
You are a senior product designer reviewing a PLAN — not a live site. Your job is
-14
View File
@@ -19,20 +19,6 @@ triggers:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Explores developer personas,
benchmarks against competitors, designs magical moments, and traces friction
points before scoring. Three modes: DX EXPANSION (competitive advantage),
DX POLISH (bulletproof every touchpoint), DX TRIAGE (critical gaps only).
Use when asked to "DX review", "developer experience audit", "devex review",
or "API design review".
Proactively suggest when the user has a plan for developer-facing products
(APIs, CLIs, SDKs, libraries, platforms, docs).
Voice triggers (speech-to-text aliases): "dx review", "developer experience review", "devex review", "devex audit", "API design review", "onboarding review".
## Preamble (run first)
```bash
-12
View File
@@ -19,18 +19,6 @@ triggers:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Lock in the execution plan — architecture,
data flow, diagrams, edge cases, test coverage, performance. Walks through
issues interactively with opinionated recommendations. Use when asked to
"review the architecture", "engineering review", or "lock in the plan".
Proactively suggest when the user has a plan or design doc and is about to
start coding — to catch architecture issues before implementation.
Voice triggers (speech-to-text aliases): "tech review", "technical review", "plan engineering review".
# Plan Review Mode
Review the selected target. Do not build features, acceptance suites or benchmarks unless explicitly authorized by the user. Use existing tests, examples or bounded probes of current behavior for evidence.
-15
View File
@@ -23,21 +23,6 @@ allowed-tools:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Review which AskUserQuestion prompts fire across gstack skills, set per-question preferences
(never-ask / always-ask / ask-only-for-one-way), inspect the dual-track
profile (what you declared vs what your behavior suggests), and enable/disable
question tuning. Conversational interface — no CLI syntax required.
Use when asked to "tune questions", "stop asking me that", "too many questions",
"show my profile", "what questions have I been asked", "show my vibe",
"developer profile", or "turn off question tuning".
Proactively suggest when the user says the same gstack question has come up before,
or when they explicitly override a recommendation for the Nth time.
## Preamble (run first)
```bash
-11
View File
@@ -17,17 +17,6 @@ triggers:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Produces a
structured report with contract evidence or browser scores and repro steps — but never
fixes anything. Use when asked to "just report bugs", "qa report only", or
"test but don't fix". For the full test-fix-verify loop, use /qa instead.
Proactively suggest when the user wants a bug report without any code changes.
Voice triggers (speech-to-text aliases): "bug report", "just check for bugs".
## Preamble (run first)
```bash
-12
View File
@@ -20,18 +20,6 @@ triggers:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Commit verified fixes atomically. Use when asked to "qa", "QA", "test this site", "find bugs",
"test and fix", or "fix what's broken".
Proactively suggest when the user says a feature is ready for testing
or asks "does this work?". Three tiers: Quick (critical/high only),
Standard (+ medium), Exhaustive (+ cosmetic). Produces contract outcomes or browser health scores,
fix evidence, and a ship-readiness summary. For report-only mode, use /qa-only.
Voice triggers (speech-to-text aliases): "quality check", "test the app", "run QA".
## Preamble (run first)
```bash
-9
View File
@@ -37,15 +37,6 @@ gbrain:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Analyzes commit history, work patterns,
and code quality metrics with persistent history and trend tracking.
Team-aware: breaks down per-person contributions with praise and growth areas.
Use when asked to "weekly retro", "what did we ship", or "engineering retrospective".
Proactively suggest at the end of a work week or sprint.
## Preamble (run first)
```bash
-8
View File
@@ -22,14 +22,6 @@ triggers:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Analyzes diff against the base branch for SQL safety, LLM trust
boundary violations, conditional side effects, and other structural issues. Use when
asked to "review this PR", "code review", "pre-landing review", or "check my diff".
Proactively suggest when the user is about to merge or land code changes.
## Preamble (run first)
```bash
-6
View File
@@ -17,12 +17,6 @@ triggers:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Read-only; returns one JSON document. Use when asked to
"scrape", "get data from", "pull", "extract from", or "what's on" a page.
## Preamble (run first)
```bash
+6 -53
View File
@@ -25,6 +25,7 @@ import { HOST_PATHS } from './resolvers/types';
import { RESOLVERS } from './resolvers/index';
import { rewriteCarvedSectionRefs, SKILL_BYTE_CEILING, usesLazySections } from './resolvers/sections';
import { insertRuntimePreludes } from './resolvers/runtime-root';
import { extractVoiceTriggers } from './resolvers/voice-triggers';
import { ALL_HOST_NAMES, resolveHostArg, getHostConfig } from '../hosts/index';
import type { HostConfig } from './host-config';
@@ -209,30 +210,6 @@ function rewriteSectionBase(content: string, linkRoot: string | null): string {
// ─── Voice Trigger Processing ────────────────────────────────
/**
* Extract voice-triggers YAML list from frontmatter.
* Returns an array of trigger strings, or [] if no voice-triggers field.
*/
function extractVoiceTriggers(content: string): string[] {
const fmStart = content.indexOf('---\n');
if (fmStart !== 0) return [];
const fmEnd = content.indexOf('\n---', fmStart + 4);
if (fmEnd === -1) return [];
const frontmatter = content.slice(fmStart + 4, fmEnd);
const triggers: string[] = [];
let inVoice = false;
for (const line of frontmatter.split('\n')) {
if (/^voice-triggers:/.test(line)) { inVoice = true; continue; }
if (inVoice) {
const m = line.match(/^\s+-\s+"(.+)"$/);
if (m) triggers.push(m[1]);
else if (!/^\s/.test(line)) break;
}
}
return triggers;
}
/**
* Preprocess voice triggers: fold voice-triggers YAML field into description,
* then strip the field from frontmatter. Must run BEFORE transformFrontmatter
@@ -271,8 +248,10 @@ export { extractVoiceTriggers, processVoiceTriggers };
// "(gstack)" tag. This pile is the always-loaded catalog surface — every
// session pays for the full text. The catalog trim splits the description
// into a one-line catalog entry (lead sentence + "(gstack)") that stays in
// the frontmatter, and a "## When to invoke" body section that holds the
// routing/voice triggers prose for in-skill discovery.
// the frontmatter and drops the routing/voice prose. The body is not a home
// for it: Claude Code loads a skill body only after the skill is invoked, so
// routing text there can no longer route anything. Voice triggers live on in
// the root router's routing block ({{VOICE_TRIGGER_ROUTING}}).
//
// Opt-out: `--catalog-mode=full` keeps v1.44 behavior (no trim, full
// description in frontmatter). Use when debugging routing regressions or
@@ -358,20 +337,6 @@ export function buildTrimmedDescription(parts: CatalogParts): string {
return `${lead}${suffix}`;
}
/** Build the body section that holds the routing/voice prose. */
export function buildWhenToInvokeSection(parts: CatalogParts): string {
const lines: string[] = ['## When to invoke this skill', ''];
if (parts.routingProse) {
lines.push(parts.routingProse);
lines.push('');
}
if (parts.voiceLine) {
lines.push(parts.voiceLine);
lines.push('');
}
return lines.join('\n');
}
/**
* Render a string as a YAML inline scalar value (the text after `key: `),
* quoting only when a plain scalar would be invalid or ambiguous.
@@ -398,9 +363,6 @@ export function toYamlInlineScalar(s: string): string {
/**
* Apply catalog trim to a SKILL.md body:
* - shorten frontmatter `description:` to lead + (gstack)
* - insert "## When to invoke" body section AFTER the generated header
* (so it lands near the top of body content, where routing guidance
* belongs)
*
* Returns the rewritten content plus the extracted parts.
*/
@@ -445,16 +407,7 @@ export function applyCatalogTrim(content: string, skillName: string): { content:
// pattern and silently corrupt the frontmatter.
const newDescLine = `description: ${toYamlInlineScalar(newDesc)}\n`;
const newFrontmatter = frontmatter.replace(descMatch[0], () => newDescLine);
let newContent = '---\n' + newFrontmatter + content.slice(fmEnd);
// Insert body section after frontmatter (after the closing ---\n and any
// existing GENERATED header). We insert before the first non-comment line.
const bodyStart = newContent.indexOf('\n---\n') + 5;
const whenToInvoke = '\n' + buildWhenToInvokeSection(parts).trim() + '\n';
// Skip past the generated header if present (it lives after frontmatter close)
const headerMatch = newContent.slice(bodyStart).match(/^(<!--[^>]*-->\s*\n)+/);
const insertAt = bodyStart + (headerMatch ? headerMatch[0].length : 0);
newContent = newContent.slice(0, insertAt) + whenToInvoke + '\n' + newContent.slice(insertAt);
const newContent = '---\n' + newFrontmatter + content.slice(fmEnd);
return { content: newContent, parts };
}
+1 -1
View File
@@ -48,7 +48,7 @@
"test/helpers/session-drain-policy.ts": {"blob":"6211239dd0485e6495a700b824a7e0e61d1bcd97","since":6},
"test/helpers/session-ledger.ts": {"blob":"425323284a368f5e77937e03884db4dea4e6134e","since":6,"nonBehavioral":"Claude-host verdicts are unchanged: the Codex host (EVALS_HOST=codex, codex-host-runner) runs only when selected and records its own per-model series; the Codex runner refactor (execCodex extraction, onSpawn hook) keeps its events and verdicts and adds token cost accounting; host fields on the plan/report are absent for claude"},
"test/helpers/session-runner.ts": {"blob":"cc65a66adafa9c053e3da3c6f17b5ac86c0eade7","since":6,"nonBehavioral":"Claude-host verdicts are unchanged: the Codex host (EVALS_HOST=codex, codex-host-runner) runs only when selected and records its own per-model series; the Codex runner refactor (execCodex extraction, onSpawn hook) keeps its events and verdicts and adds token cost accounting; host fields on the plan/report are absent for claude"},
"test/helpers/skill-fixture.ts": {"blob":"b188064594eb4201a54a80ba1bc6f28e31d7f49e","since":6},
"test/helpers/skill-fixture.ts": {"blob":"ffece830f35b0f1562005105e9296dc4d8ca50c2","since":6,"nonBehavioral":"skill-fixture.ts drops 'When to invoke this skill' from the review, review-army and retro section lists because #3129 stops generating that heading; extraction would throw otherwise. The fixture bytes follow the regenerated SKILL.md, whose owned prompt bytes already start those cases' new series."},
"test/helpers/test-selection.ts": {"blob":"51655f89f66be7a5ec487e2abfe4744300ebd5f6","since":6},
"test/helpers/touchfiles.ts": {"blob":"15f369056d41b9dc42dcd86f81f60c878074704c","since":6}
}
+2
View File
@@ -54,12 +54,14 @@ import { generateSidewaysSweep, generateFlakeFixNumber } from './sideways';
import { generateCoordinatorContract } from './coordinator-contract';
import { generateAutoplanDriverCodes, generateAutoplanDriverCommands, generateAutoplanDriverFiles, generateAutoplanDriverGate, generateAutoplanDriverPhases, generateAutoplanDriverResultFormat } from './autoplan-driver';
import { generateQAScope, generateQAExploratory, generateQAFunctional, generateQAResource, generateQAReview, generateQAReviewPreflight, generateQAMethodReads } from './qa';
import { generateVoiceTriggerRouting } from './voice-triggers';
export const RESOLVERS: Record<string, ResolverFn> = {
AUTOPLAN_PUBLICATION_HOOK: generateAutoplanPublicationHook,
CEO_MODE_HANDOFF_HOOK: generateCeoModeHandoffHook,
OUTSIDE_SELF_GUARD: (ctx, args) => outsideVoiceGuard({ ...ctx, host: args?.[0] === 'claude-code' ? 'codex' : 'claude' }),
OUTSIDE_VOICE_ROUTING: generateOutsideVoiceRouting,
VOICE_TRIGGER_ROUTING: generateVoiceTriggerRouting,
OUTSIDE_LABEL: (ctx) => outsideVoiceFor(ctx).label,
NATIVE_LABEL: (ctx) => outsideVoiceFor(ctx).nativeLabel,
OUTSIDE_PROVIDER: (ctx) => outsideVoiceFor(ctx).id,
+61
View File
@@ -0,0 +1,61 @@
/**
* Voice triggers: speech-to-text aliases a template lists under
* `voice-triggers:` in its frontmatter.
*
* Every host folds them into the skill's description, but Claude's catalog trim
* keeps only the lead sentence. {{VOICE_TRIGGER_ROUTING}} gives them a cheap home
* in the root router's routing block instead: one routing line per skill.
*/
import * as fs from 'fs';
import * as path from 'path';
import type { TemplateContext } from './types';
import { discoverTemplates, includesSkill } from '../discover-skills';
import { getHostConfig } from '../../hosts/index';
const ROOT = path.resolve(import.meta.dir, '..', '..');
/**
* Extract voice-triggers YAML list from frontmatter.
* Returns an array of trigger strings, or [] if no voice-triggers field.
*/
export function extractVoiceTriggers(content: string): string[] {
const fmStart = content.indexOf('---\n');
if (fmStart !== 0) return [];
const fmEnd = content.indexOf('\n---', fmStart + 4);
if (fmEnd === -1) return [];
const frontmatter = content.slice(fmStart + 4, fmEnd);
const triggers: string[] = [];
let inVoice = false;
for (const line of frontmatter.split('\n')) {
if (/^voice-triggers:/.test(line)) { inVoice = true; continue; }
if (inVoice) {
const m = line.match(/^\s+-\s+"(.+)"$/);
if (m) triggers.push(m[1]);
else if (!/^\s/.test(line)) break;
}
}
return triggers;
}
/**
* Claude only: other hosts keep the voice triggers in each skill's description.
* The template places this at the end of the last routing line, so each line
* starts with its own newline and an empty result leaves the list unchanged.
*/
export function generateVoiceTriggerRouting(ctx: TemplateContext): string {
if (ctx.host !== 'claude') return '';
const hostConfig = getHostConfig(ctx.host);
let out = '';
// Sorted so the render doesn't depend on filesystem iteration order.
const skillDirs = discoverTemplates(ROOT).map(t => path.dirname(t.tmpl)).sort();
for (const skillDir of skillDirs) {
if (skillDir === '.' || !includesSkill(hostConfig, skillDir)) continue;
const content = fs.readFileSync(path.join(ROOT, skillDir, 'SKILL.md.tmpl'), 'utf-8').replace(/\r\n/g, '\n');
const triggers = extractVoiceTriggers(content);
if (triggers.length === 0) continue;
out += `\n- Voice trigger ${triggers.map(t => `"${t}"`).join(', ')} → invoke \`/${skillDir}\``;
}
return out;
}
-7
View File
@@ -15,13 +15,6 @@ allowed-tools:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Opens an interactive picker UI where you select which cookie domains to import.
Use before QA testing authenticated pages. Use when asked to "import cookies",
"login to the site", or "authenticate the browser".
## Preamble (run first)
```bash
-10
View File
@@ -19,16 +19,6 @@ allowed-tools:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Detects your deploy
platform (Fly.io, Render, Vercel, Netlify, Heroku, GitHub Actions, custom),
production URL, health check endpoints, and deploy status commands. Writes
the configuration to CLAUDE.md so all future deploys are automatic.
Use when: "setup deploy", "configure deployment", "set up land-and-deploy",
"how do I deploy with gstack", "add deploy config".
## Preamble (run first)
```bash
-7
View File
@@ -21,13 +21,6 @@ allowed-tools:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
One command from zero to "gbrain is running, and this agent
can call it." Use when: "setup gbrain", "connect gbrain", "start
gbrain", "install gbrain", "configure gbrain for this machine".
## Preamble (run first)
```bash
-8
View File
@@ -22,14 +22,6 @@ triggers:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Use when asked to "ship", "deploy",
"push to main", "create a PR", "merge and push", or "get it deployed".
Proactively invoke this skill (do NOT push/PR directly) when the user says code
is ready, asks about deploying, wants to push code up, or asks to create a PR.
## Preamble (run first)
```bash
-10
View File
@@ -17,16 +17,6 @@ triggers:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Future /scrape calls with the same intent run
the codified script in ~200ms instead of re-driving the page. Walks
back through the conversation, synthesizes script.ts + script.test.ts
+ fixture, runs the test in a temp dir, and asks before committing.
Use when asked to "skillify", "codify", "save this scrape", or
"make this permanent".
## Preamble (run first)
```bash
-8
View File
@@ -20,14 +20,6 @@ triggers:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Files the issue,
optionally spawns a Claude Code agent in a fresh worktree, and lets /ship close
the source issue on merge. Use when asked to "spec this out", "file an issue",
"write up a ticket", "make this a GitHub issue", or "turn this into a backlog item".
## Preamble (run first)
```bash
-9
View File
@@ -20,15 +20,6 @@ allowed-tools:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Wraps the gstack-gbrain-sync orchestrator with
state probing, native code-surface registration, capability checks,
and a verdict block. Re-runnable, idempotent. Use when: "sync gbrain",
"refresh gbrain", "re-index this repo", "gbrain search isn't finding
things".
## Preamble (run first)
```bash
-5
View File
@@ -19,11 +19,6 @@ allowed-tools:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Report-only unless you approve a batch. Use for /test-audit.
## Preamble (run first)
```bash
+1 -3
View File
@@ -40,7 +40,7 @@ describe('catalog mode CLI behavior', () => {
test('omitting the flag defaults to trim', () => {
expect(frontmatter(defaultContent)).toMatch(/^description: "?Ship workflow:[^\n]*\(gstack\)"?$/m);
expect(frontmatter(defaultContent)).not.toMatch(/Use when asked to/i);
expect(defaultContent).toContain('## When to invoke this skill');
expect(defaultContent).not.toContain('## When to invoke this skill');
});
for (const form of ['equals', 'separate'] as const) {
@@ -53,14 +53,12 @@ describe('catalog mode CLI behavior', () => {
expect(fm).toMatch(/^description: \|\s*$/m);
expect(fm).toMatch(/Use when asked to/i);
expect(fm).not.toBe(frontmatter(defaultContent));
expect(result.content.slice(fm.length)).not.toContain('## When to invoke this skill');
});
test(`${form} flag form accepts explicit trim and matches the default catalog`, () => {
const result = render(args('trim'));
expect(result.status, result.stderr).toBe(0);
expect(frontmatter(result.content)).toBe(frontmatter(defaultContent));
expect(result.content).toContain('## When to invoke this skill');
});
test(`${form} flag form rejects invalid modes before writing output`, () => {
+6 -43
View File
@@ -1,8 +1,7 @@
/**
* Unit tests for catalog-trim helpers (gen-skill-docs.ts T4 functions).
*
* splitCatalogDescription, buildTrimmedDescription, buildWhenToInvokeSection,
* applyCatalogTrim — these handle every skill's frontmatter rewrite at gen
* splitCatalogDescription, buildTrimmedDescription, applyCatalogTrim — these handle every skill's frontmatter rewrite at gen
* time. Two bugs already shipped here:
*
* v1.45.0.0 design-consultation: when the first sentence exceeded 200 chars,
@@ -21,7 +20,6 @@ import { describe, test, expect } from 'bun:test';
import {
splitCatalogDescription,
buildTrimmedDescription,
buildWhenToInvokeSection,
applyCatalogTrim,
toYamlInlineScalar,
} from '../scripts/gen-skill-docs';
@@ -229,41 +227,6 @@ describe('buildTrimmedDescription', () => {
});
});
describe('buildWhenToInvokeSection', () => {
test('produces markdown H2 with routing prose and voice line', () => {
const out = buildWhenToInvokeSection({
lead: 'Lead.',
routingProse: 'Use when asked to ship.',
voiceLine: 'Voice triggers (speech-to-text aliases): "ship it".',
hasGstackTag: true,
});
expect(out).toContain('## When to invoke this skill');
expect(out).toContain('Use when asked to ship.');
expect(out).toContain('Voice triggers');
});
test('omits routing block when routingProse is empty', () => {
const out = buildWhenToInvokeSection({
lead: 'Lead.',
routingProse: '',
voiceLine: null,
hasGstackTag: true,
});
expect(out).toContain('## When to invoke this skill');
expect(out).not.toContain('Use when');
});
test('emits even when only voice line is present', () => {
const out = buildWhenToInvokeSection({
lead: 'Lead.',
routingProse: '',
voiceLine: 'Voice triggers: x.',
hasGstackTag: true,
});
expect(out).toContain('Voice triggers: x.');
});
});
describe('applyCatalogTrim', () => {
const minimalSkill = `---
name: example
@@ -280,7 +243,7 @@ preamble-tier: 2
Original body content here.
`;
test('rewrites multi-line description into one-line + body section', () => {
test('rewrites multi-line description into one line and adds no body section', () => {
const result = applyCatalogTrim(minimalSkill, 'example');
expect(result).not.toBeNull();
const { content, parts } = result!;
@@ -288,10 +251,10 @@ Original body content here.
// description with an interior colon ("Example skill:") is YAML-quoted, so
// the value is wrapped in double quotes — tolerate the optional quotes.
expect(content).toMatch(/^description: "?Example skill:[^\n]*\(gstack\)"?\n/m);
// Body has the When to invoke section
expect(content).toContain('## When to invoke this skill');
expect(content).toContain('Use when asked to do an example task.');
expect(content).toContain('Proactively suggest when');
// The body gains no routing section: Claude Code reads a skill body only
// after invocation, so routing prose there routes nothing.
expect(content).not.toContain('## When to invoke this skill');
expect(content).not.toContain('Use when asked to do an example task.');
// Original body still present
expect(content).toContain('# Example body');
expect(content).toContain('Original body content here.');
-1
View File
@@ -103,6 +103,5 @@ describe('CSO v3 always-loaded policy', () => {
const description = frontmatter.match(/^description:\s+(.+)$/m)![1].trim();
expect(description.length).toBeLessThanOrEqual(200);
expect(description).toContain('(gstack)');
expect(controller()).toContain('## When to invoke this skill');
});
});
+55 -55
View File
@@ -2,68 +2,68 @@
"_comment": "Context-budget ratchet ceilings (~tokens). Regenerate: bun test/helpers/capture-context-budget.ts. Headroom: alwaysOnTotal x1.05, eagerPerInvocation x1.1. Graded by test/context-budget-ratchet.test.ts via lib/context-bill.ts checkBudget.",
"alwaysOnTotal": 7458,
"eagerPerInvocation": {
"autoplan": 17136,
"benchmark": 7938,
"benchmark-models": 4231,
"browse": 8961,
"autoplan": 17005,
"benchmark": 7813,
"benchmark-models": 4086,
"browse": 8943,
"browser-skills/hackernews-frontpage": 371,
"canary": 13520,
"canary": 13441,
"capy/skill/gstack": 2923,
"careful": 1328,
"codex": 15717,
"context-restore": 10995,
"context-save": 10588,
"cso": 4715,
"design-consultation": 16277,
"design-html": 14555,
"design-review": 35921,
"design-shotgun": 14980,
"deslop-shared-libs": 3448,
"careful": 1239,
"codex": 15594,
"context-restore": 10909,
"context-save": 10517,
"cso": 4660,
"design-consultation": 16188,
"design-html": 14380,
"design-review": 35808,
"design-shotgun": 14901,
"deslop-shared-libs": 3411,
"devex-review": 20161,
"diagram": 4336,
"document-generate": 11809,
"document-release": 10235,
"diagram": 4268,
"document-generate": 11713,
"document-release": 10092,
"eval-plan": 9811,
"freeze": 1194,
"gstack": 4289,
"gstack-upgrade": 6407,
"guard": 1082,
"health": 11521,
"investigate": 13465,
"ios-clean": 8280,
"ios-design-review": 8477,
"ios-fix": 8170,
"ios-qa": 11742,
"ios-sync": 8295,
"land-and-deploy": 19061,
"landing-report": 8993,
"learn": 8708,
"make-pdf": 5348,
"office-hours": 24993,
"open-gstack-browser": 4981,
"freeze": 1115,
"gstack": 4821,
"gstack-upgrade": 6212,
"guard": 1000,
"health": 11440,
"investigate": 13344,
"ios-clean": 8139,
"ios-design-review": 8305,
"ios-fix": 8009,
"ios-qa": 11551,
"ios-sync": 8167,
"land-and-deploy": 18991,
"landing-report": 8901,
"learn": 8626,
"make-pdf": 5204,
"office-hours": 24792,
"open-gstack-browser": 4872,
"openclaw/skills/gstack-openclaw-ceo-review": 2764,
"openclaw/skills/gstack-openclaw-investigate": 1429,
"openclaw/skills/gstack-openclaw-office-hours": 4433,
"openclaw/skills/gstack-openclaw-retro": 2542,
"pair-agent": 11156,
"plan-ceo-review": 21151,
"plan-design-review": 22384,
"plan-devex-review": 17595,
"plan-eng-review": 13663,
"plan-tune": 14773,
"qa": 13497,
"qa-only": 11543,
"retro": 19033,
"review": 21135,
"scrape": 7354,
"setup-browser-cookies": 3628,
"setup-deploy": 11549,
"setup-gbrain": 15760,
"ship": 21164,
"skillify": 11648,
"spec": 14922,
"sync-gbrain": 15477,
"test-audit": 10348,
"unfreeze": 457
"pair-agent": 10995,
"plan-ceo-review": 21007,
"plan-design-review": 22284,
"plan-devex-review": 17556,
"plan-eng-review": 13521,
"plan-tune": 14589,
"qa": 13348,
"qa-only": 11429,
"retro": 18938,
"review": 21047,
"scrape": 7312,
"setup-browser-cookies": 3565,
"setup-deploy": 11440,
"setup-gbrain": 15702,
"ship": 21081,
"skillify": 11551,
"spec": 14840,
"sync-gbrain": 15399,
"test-audit": 10324,
"unfreeze": 409
}
}
-8
View File
@@ -22,14 +22,6 @@ triggers:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Use when asked to "ship", "deploy",
"push to main", "create a PR", "merge and push", or "get it deployed".
Proactively invoke this skill (do NOT push/PR directly) when the user says code
is ready, asks about deploying, wants to push code up, or asks to create a PR.
## Preamble (run first)
```bash
+1 -1
View File
@@ -10,7 +10,7 @@
"agy/gstack-plan-devex-review": 135727,
"agy/gstack-plan-eng-review": 152669,
"agy/gstack-review": 124266,
"claude/design-review": 136826,
"claude/design-review": 136389,
"codex/gstack-autoplan": 130298,
"codex/gstack-design-consultation": 109239,
"codex/gstack-design-review": 144820,
+25 -9
View File
@@ -437,14 +437,13 @@ describe('gen-skill-docs', () => {
});
test('benchmark routing is scoped to web page performance', () => {
const generated = fs.readFileSync(path.join(ROOT, 'benchmark', 'SKILL.md'), 'utf-8');
// The template description is the routing source; the Claude catalog trim
// drops its tail from benchmark/SKILL.md.
const template = fs.readFileSync(path.join(ROOT, 'benchmark', 'SKILL.md.tmpl'), 'utf-8');
for (const content of [generated, template]) {
const useWhen = content.match(/Use when:[\s\S]*?(?=\n\n|\(gstack\))/)?.[0] ?? '';
expect(useWhen).toContain('"web performance benchmark"');
expect(useWhen).not.toMatch(/"benchmark"|"performance"/);
expect(content).toContain('/benchmark-models');
}
const useWhen = template.match(/Use when:[\s\S]*?(?=\n\n|\(gstack\))/)?.[0] ?? '';
expect(useWhen).toContain('"web performance benchmark"');
expect(useWhen).not.toMatch(/"benchmark"|"performance"/);
expect(template).toContain('/benchmark-models');
const router = fs.readFileSync(path.join(ROOT, 'SKILL.md.tmpl'), 'utf-8');
expect(router).toContain('web performance regression → invoke `/benchmark`');
expect(router).toContain('model or skill benchmarks → invoke `/benchmark-models`');
@@ -4444,12 +4443,29 @@ describe('voice-triggers processing', () => {
expect(processVoiceTriggers(content)).toBe(content);
});
test('generated CSO SKILL.md contains voice triggers in description', () => {
const content = fs.readFileSync(path.join(ROOT, 'cso', 'SKILL.md'), 'utf-8');
test('CSO voice triggers fold into the full description', () => {
// The Claude catalog trim drops this line from cso/SKILL.md; full-mode and
// other-host renders still carry it.
const content = processVoiceTriggers(fs.readFileSync(path.join(ROOT, 'cso', 'SKILL.md.tmpl'), 'utf-8'));
expect(content).toContain('"see-so"');
expect(content).toContain('Voice triggers (speech-to-text aliases):');
});
test('Claude root router routes every skill voice trigger the catalog trim drops', () => {
const routing = between(fs.readFileSync(path.join(ROOT, 'SKILL.md'), 'utf-8'), '**Routing rules', '**Route only to skills');
const skills = fs.readdirSync(ROOT).filter(d => !fs.lstatSync(path.join(ROOT, d)).isSymbolicLink() && fs.existsSync(path.join(ROOT, d, 'SKILL.md.tmpl')));
let routed = 0;
for (const skill of skills) {
const triggers = extractVoiceTriggers(fs.readFileSync(path.join(ROOT, skill, 'SKILL.md.tmpl'), 'utf-8').replace(/\r\n/g, '\n'));
if (triggers.length === 0) continue;
const line = routing.split('\n').find(l => l.endsWith(`→ invoke \`/${skill}\``) && l.startsWith('- Voice trigger '));
expect(line, skill).toBeDefined();
for (const t of triggers) expect(line, skill).toContain(`"${t}"`);
routed++;
}
expect(routed).toBeGreaterThan(0);
});
test('generated CSO SKILL.md does NOT contain raw voice-triggers field', () => {
const content = fs.readFileSync(path.join(ROOT, 'cso', 'SKILL.md'), 'utf-8');
const fmEnd = content.indexOf('\n---', 4);
@@ -35,6 +35,8 @@ const LATER_WAVE_EDITS: Array<[string, string]> = [
"The skill-start output above already ran artifacts sync. Act on its lines:\nGBrain hint text (if present) tells you when to prefer `gbrain` over Grep;\n`ARTIFACTS_SYNC:` reports sync health (`off`, `mode=... | queue=N`,\n`remote-mode`, or a restore hint naming `gstack-brain-restore`).\n\nThe one-time privacy stop-gate (artifacts-sync consent) arrives as a\n`GSTACK_INSTRUCTION` block from skill-start when consent is actually pending\n\u2014 fire it via AskUserQuestion exactly as the block instructs."],
// Oct 8 wave: the tier-1 voice directive gained the reply-language rule (two lines longer).
["Reply in the language of the user's latest message unless asked otherwise. Code, commands, paths, identifiers and quoted output stay verbatim.\n\n", ''],
// #3129 dropped the Claude body's "When to invoke" section above the preamble (seven lines shorter).
['<!-- Regenerate: bun run gen:skill-docs -->\n\n## Preamble (run first)\n', '<!-- Regenerate: bun run gen:skill-docs -->\n\n\n## When to invoke this skill\n\nOpens an interactive picker UI where you select which cookie domains to import.\nUse before QA testing authenticated pages. Use when asked to "import cookies",\n"login to the site", or "authenticate the browser".\n\n## Preamble (run first)\n'],
];
// The honest-install wave (lazy Chromium) made the fallback probe call
+1 -1
View File
@@ -229,7 +229,7 @@ const CARVED_INVARIANTS: ParityInvariant[] = Object.values(CARVE_GUARDS).map((g)
mustContain: g.mustContain,
// CSO's helper trust boundary requires its private startup; demanding the
// shared Preamble here would silently reintroduce conflicting policy.
mustHaveHeadings: g.skill === 'cso' ? ['## When to invoke'] : ['## Preamble', '## When to invoke'],
mustHaveHeadings: g.skill === 'cso' ? [] : ['## Preamble'],
maxSizeRatio: g.maxSizeRatio ?? 1.05,
}));
+1 -5
View File
@@ -39,7 +39,6 @@ import * as path from 'path';
/** /review E2E (sql-injection, enum-completeness, design-lite): the core
* review workflow without the shared preamble, Review Army, or Fix-First. */
export const REVIEW_E2E_SECTIONS = [
'When to invoke this skill',
'Step 0: Detect platform and base branch',
'Step 1: Check branch',
'Step 2: Read the checklist',
@@ -54,7 +53,6 @@ export const REVIEW_E2E_SECTIONS = [
* (delivery-audit test) + Step 4.5 specialist dispatch (quality score,
* JSON findings schema, MULTI-SPECIALIST consensus, Red Team). */
export const REVIEW_ARMY_E2E_SECTIONS = [
'When to invoke this skill',
'Step 0: Detect platform and base branch',
'Step 1: Check branch',
'Step 1.5: Scope Drift Detection',
@@ -72,7 +70,6 @@ export const REVIEW_ARMY_E2E_SECTIONS = [
* + the narrative report template. Global mode and Compare mode are not
* exercised by the E2E tests and are dropped. */
export const RETRO_E2E_SECTIONS = [
'When to invoke this skill',
'Step 0: Detect platform and base branch',
'User-invocable',
'Arguments',
@@ -86,8 +83,7 @@ export const RETRO_E2E_SECTIONS = [
/** codex-review-findings E2E against the Codex host variant
* (.agents/skills/gstack-review/SKILL.md). Same core workflow as
* REVIEW_E2E_SECTIONS, minus "When to invoke this skill" (the Codex host
* adapter does not emit that section). */
* REVIEW_E2E_SECTIONS. */
export const CODEX_REVIEW_E2E_SECTIONS = [
'Step 0: Detect platform and base branch',
'Step 1: Check branch',
-1
View File
@@ -23,7 +23,6 @@ const evalCollector = createEvalCollector('e2e-retro');
// still an extraction, not a full-file copy (sections ARE the minimal
// on-demand units; same pattern as skill-e2e-review-army.test.ts).
const RETRO_SKELETON_SECTIONS = [
'When to invoke this skill',
'Step 0: Detect platform and base branch',
'User-invocable',
'Arguments',
+8 -9
View File
@@ -1779,14 +1779,13 @@ describe('Skill trigger phrases', () => {
];
for (const skill of SKILLS_REQUIRING_TRIGGERS) {
test(`${skill}/SKILL.md has "Use when" trigger phrases`, () => {
const skillPath = path.join(ROOT, skill, 'SKILL.md');
test(`${skill}/SKILL.md.tmpl has "Use when" trigger phrases`, () => {
const skillPath = path.join(ROOT, skill, 'SKILL.md.tmpl');
if (!fs.existsSync(skillPath)) return;
const content = fs.readFileSync(skillPath, 'utf-8');
// v1.45.0.0 catalog trim moved trigger prose out of frontmatter into a
// body "## When to invoke" section. Search the full file content, not
// just frontmatter. The trigger phrase must still appear somewhere in
// the skill so agents can match user requests to the skill.
// The catalog trim drops trigger prose from the Claude SKILL.md, so check
// the template description: --catalog-mode=full and the other hosts
// still route on it.
expect(content).toMatch(/Use when/i);
});
}
@@ -1799,11 +1798,11 @@ describe('Skill trigger phrases', () => {
];
for (const skill of SKILLS_REQUIRING_PROACTIVE) {
test(`${skill}/SKILL.md has proactive routing phrase`, () => {
const skillPath = path.join(ROOT, skill, 'SKILL.md');
test(`${skill}/SKILL.md.tmpl has proactive routing phrase`, () => {
const skillPath = path.join(ROOT, skill, 'SKILL.md.tmpl');
if (!fs.existsSync(skillPath)) return;
const content = fs.readFileSync(skillPath, 'utf-8');
// Same catalog-trim consideration — search the full file content.
// Same catalog-trim consideration — check the template description.
expect(content).toMatch(/Proactively (suggest|invoke)/i);
});
}
-7
View File
@@ -13,13 +13,6 @@ allowed-tools:
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
## When to invoke this skill
Use when you want to widen edit scope without ending the session.
Use when asked to "unfreeze", "unlock edits", "remove freeze", or
"allow all edits".
# /unfreeze — Clear Freeze Boundary
Remove the edit restriction set by `/freeze`, allowing edits to all directories.