# Gs:skillify

> Package a custom developer workflow into a reusable agent skill. (gstack)

- **Type:** Skill
- **Install:** `agentstack add skill-thanh-abaii-gstack-windows-port-gstack-skillify`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [thanh-abaii](https://agentstack.voostack.com/s/thanh-abaii)
- **Installs:** 0
- **Category:** [Agent Skills](https://agentstack.voostack.com/c/agent-skills)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [thanh-abaii](https://github.com/thanh-abaii)
- **Source:** https://github.com/thanh-abaii/gstack-windows-port/tree/main/skills/gstack-skillify

## Install

```sh
agentstack add skill-thanh-abaii-gstack-windows-port-gstack-skillify
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

## Preamble (run first)

```bash
python "bin/gstack-boot.py" --skill skillify | iex
```

## When to invoke this skill

Use when the user explicitly asks to package, skillify, or automate a series of manual steps or command history into a reusable, structured gstack skill.

## Plan Mode Safe Operations

In plan mode, allowed because they inform the plan: `$B`, `$D`, `codex exec`/`codex review`, writes to `$HOME/.gstack/`, writes to the plan file, and `open` (or `Start-Process`) for generated artifacts.

## Skill Invocation During Plan Mode

If the user invokes a skill in plan mode, the skill takes precedence over generic plan mode behavior. **Treat the skill file as executable instructions, not reference.** Follow it step by step starting from Step 0; the first AskUserQuestion is the workflow entering plan mode, not a violation of it. AskUserQuestion (any variant — `mcp__*__AskUserQuestion` or native; see "AskUserQuestion Format → Tool resolution") satisfies plan mode's end-of-turn requirement. If no variant is callable, the skill is BLOCKED — stop and report `BLOCKED — AskUserQuestion unavailable` per the AskUserQuestion Format rule. At a STOP point, stop immediately. Do not continue the workflow or call ExitPlanMode there. Commands marked "PLAN MODE EXCEPTION — ALWAYS RUN" execute. Call ExitPlanMode only after the skill workflow completes, or if the user tells you to cancel the skill or leave plan mode.

If `PROACTIVE` is `"false"`, do not auto-invoke or proactively suggest skills. If a skill seems useful, ask: "I think /skillname might help here — want me to run it?"

If `SKILL_PREFIX` is `"true"`, suggest/invoke `/gstack-*` names. Disk paths stay `$HOME/.claude/skills/gstack/[skill-name]/SKILL.md`.

If output shows `UPGRADE_AVAILABLE  `: read `$HOME/.claude/skills/gstack/gstack-upgrade/SKILL.md` and follow the "Inline upgrade flow" (auto-upgrade if configured, otherwise AskUserQuestion with 4 options, write snooze state if declined).

If output shows `JUST_UPGRADED  `: print "Running gstack v{to} (just updated!)". If `SPAWNED_SESSION` is true, skip feature discovery.

Feature discovery, max one prompt per session:

- Missing `$HOME/.claude/skills/gstack/.feature-prompted-continuous-checkpoint`: AskUserQuestion for Continuous checkpoint auto-commits. If accepted, run `python "bin/gstack-config.py" set checkpoint_mode continuous`. Always create marker.
- Missing `$HOME/.claude/skills/gstack/.feature-prompted-model-overlay`: inform "Model overlays are active. MODEL_OVERLAY shows the patch." Always create marker.

After upgrade prompts, continue workflow.

If `WRITING_STYLE_PENDING` is `yes`: ask once about writing style:

> v1 prompts are simpler: first-use jargon glosses, outcome-framed questions, shorter prose. Keep default or restore terse?

Options:

- A) Keep the new default (recommended — good writing helps everyone)
- B) Restore V0 prose — set `explain_level: terse`

If A: leave `explain_level` unset (defaults to `default`).
If B: run `python "bin/gstack-config.py" set explain_level terse`.

Always run (regardless of choice):

```powershell
Remove-Item -Force "$HOME/.gstack/.writing-style-prompt-pending" -ErrorAction SilentlyContinue
New-Item -Path "$HOME/.gstack/.writing-style-prompted" -ItemType File -Force
```

Skip if `WRITING_STYLE_PENDING` is `no`.

If `LAKE_INTRO` is `no`: say "gstack follows the **Boil the Lake** principle — do the complete thing when AI makes marginal cost near-zero. Read more: https://garryslist.org/posts/boil-the-ocean" Offer to open:

```powershell
Start-Process "https://garryslist.org/posts/boil-the-ocean"
New-Item -Path "$HOME/.gstack/.completeness-intro-seen" -ItemType File -Force
```

Only run `Start-Process` if yes. Always run `New-Item`.

If `TEL_PROMPTED` is `no` AND `LAKE_INTRO` is `yes`: ask telemetry once via AskUserQuestion:

> Help gstack get better. Share usage data only: skill, duration, crashes, stable device ID. No code, file paths, or repo names.

Options:

- A) Help gstack get better! (recommended)
- B) No thanks

If A: run `python "bin/gstack-config.py" set telemetry community`

If B: ask follow-up:

> Anonymous mode sends only aggregate usage, no unique ID.

Options:

- A) Sure, anonymous is fine
- B) No thanks, fully off

If B→A: run `python "bin/gstack-config.py" set telemetry anonymous`
If B→B: run `python "bin/gstack-config.py" set telemetry off`

Always run:

```powershell
New-Item -Path "$HOME/.gstack/.telemetry-prompted" -ItemType File -Force
```

Skip if `TEL_PROMPTED` is `yes`.

If `PROACTIVE_PROMPTED` is `no` AND `TEL_PROMPTED` is `yes`: ask once:

> Let gstack proactively suggest skills, like /qa for "does this work?" or /investigate for bugs?

Options:

- A) Keep it on (recommended)
- B) Turn it off — I'll type /commands myself

If A: run `python "bin/gstack-config.py" set proactive true`
If B: run `python "bin/gstack-config.py" set proactive false`

Always run:

```powershell
New-Item -Path "$HOME/.gstack/.proactive-prompted" -ItemType File -Force
```

Skip if `PROACTIVE_PROMPTED` is `yes`.

If `HAS_ROUTING` is `no` AND `ROUTING_DECLINED` is `false` AND `PROACTIVE_PROMPTED` is `yes`:
Check if a CLAUDE.md file exists in the project root. If it does not exist, create it.

Use AskUserQuestion:

> gstack works best when your project's CLAUDE.md includes skill routing rules.

Options:

- A) Add routing rules to CLAUDE.md (recommended)
- B) No thanks, I'll invoke skills manually

If A: Append this section to the end of CLAUDE.md:

```markdown

## Skill routing

When the user's request matches an available skill, invoke it via the Skill tool. When in doubt, invoke the skill.

Key routing rules:
- Product ideas/brainstorming → invoke /office-hours
- Strategy/scope → invoke /plan-ceo-review
- Architecture → invoke /plan-eng-review
- Design system/plan review → invoke /design-consultation or /plan-design-review
- Full review pipeline → invoke /autoplan
- Bugs/errors → invoke /investigate
- QA/testing site behavior → invoke /qa or /qa-only
- Code review/diff check → invoke /review
- Visual polish → invoke /design-review
- Ship/deploy/PR → invoke /ship or /land-and-deploy
- Save progress → invoke /context-save
- Resume context → invoke /context-restore
- Author a backlog-ready spec/issue → invoke /spec
```

Then commit the change: `git add CLAUDE.md && git commit -m "chore: add gstack skill routing rules to CLAUDE.md"`

If B: run `python "bin/gstack-config.py" set routing_declined true` and say they can re-enable with `python "bin/gstack-config.py" set routing_declined false`.

This only happens once per project. Skip if `HAS_ROUTING` is `yes` or `ROUTING_DECLINED` is `true`.

If `VENDORED_GSTACK` is `yes`, warn once via AskUserQuestion unless `$HOME/.gstack/.vendoring-warned-$SLUG` exists:

> This project has gstack vendored in `.claude/skills/gstack/`. Vendoring is deprecated.
> Migrate to team mode?

Options:

- A) Yes, migrate to team mode now
- B) No, I'll handle it myself

If A:

1. Run `git rm -r .claude/skills/gstack/`
2. Run `Add-Content .gitignore '.claude/skills/gstack/'`
3. Run `python "bin/gstack-team-init.py" required` (or `optional`)
4. Run `git add .claude/ .gitignore CLAUDE.md && git commit -m "chore: migrate gstack from vendored to team mode"`
5. Tell the user: "Done. Each developer now runs: `cd $HOME/.claude/skills/gstack ; ./setup --team`"

If B: say "OK, you're on your own to keep the vendored copy up to date."

Always run (regardless of choice):

```powershell
# Get project slug and create warned marker
$slug = python "bin/gstack-slug.py"
New-Item -Path "$HOME/.gstack/.vendoring-warned-$slug" -ItemType File -Force
```

If marker exists, skip.

If `SPAWNED_SESSION` is `"true"`, you are running inside a session spawned by an
AI orchestrator (e.g., OpenClaw). In spawned sessions:

- Do NOT use AskUserQuestion for interactive prompts. Auto-choose the recommended option.
- Do NOT run upgrade checks, telemetry prompts, routing injection, or lake intro.
- Focus on completing the task and reporting results via prose output.
- End with a completion report: what shipped, decisions made, anything uncertain.

## AskUserQuestion Format

### Tool resolution (read first)

"AskUserQuestion" can resolve to two tools at runtime: the **host MCP variant** (e.g. `mcp__conductor__AskUserQuestion` — appears in your tool list when the host registers it) or the **native** Claude Code tool.

**Rule:** if any `mcp__*__AskUserQuestion` variant is in your tool list, prefer it. Hosts may disable native AUQ via `--disallowedTools AskUserQuestion` (Conductor does, by default) and route through their MCP variant; calling native there silently fails. Same questions/options shape; same decision-brief format applies.

**If no AskUserQuestion variant appears in your tool list, this skill is BLOCKED.** Stop, report `BLOCKED — AskUserQuestion unavailable`, and wait for the user. Do not write decisions to the plan file as a substitute, do not emit them as prose and stop, and do not silently auto-decide (only `/plan-tune` AUTO_DECIDE opt-ins authorize auto-picking).

### Format

Every AskUserQuestion is a decision brief and must be sent as tool_use, not prose.

```
D — 
Project/branch/task: 
ELI10: 
Stakes if we pick wrong: 
Recommendation:  because 
Completeness: A=X/10, B=Y/10   (or: Note: options differ in kind, not coverage — no completeness score)
Pros / cons:
A)  (recommended)
  ✅ 
  ❌ 
B) 
  ✅ 
  ❌ 
Net: 
```

D-numbering: first question in a skill invocation is `D1`; increment yourself. This is a model-level instruction, not a runtime counter.

ELI10 is always present, in plain English, not function names. Recommendation is ALWAYS present. Keep the `(recommended)` label; AUTO_DECIDE depends on it.

Completeness: use `Completeness: N/10` only when options differ in coverage. 10 = complete, 7 = happy path, 3 = shortcut. If options differ in kind, write: `Note: options differ in kind, not coverage — no completeness score.`

Pros / cons: use ✅ and ❌. Minimum 2 pros and 1 con per option when the choice is real; Minimum 40 characters per bullet. Hard-stop escape for one-way/destructive confirmations: `✅ No cons — this is a hard-stop choice`.

Neutral posture: `Recommendation:  — this is a taste call, no strong preference either way`; `(recommended)` STAYS on the default option for AUTO_DECIDE.

Effort both-scales: when an option involves effort, label both human-team and CC+gstack time, e.g. `(human: ~2 days / CC: ~15 min)`. Makes AI compression visible at decision time.

Net line closes the tradeoff. Per-skill instructions may add stricter rules.

### Handling 5+ options — split, never drop

AskUserQuestion caps every call at **4 options**. With 5+ real options, NEVER
drop, merge, or silently defer one to fit. Pick a compliant shape:

- **Batch into ≤4-groups** — for coherent alternatives (e.g. version bumps,

  layout variants). One call, 5th surfaced only if first 4 don't fit.

- **Split per-option** — for independent scope items (e.g. "ship E1..E6?").

  Fire N sequential calls, one per option. Default to this when unsure.

Per-option call shape: `D.k` header (e.g. D3.1..D3.5), ELI10 per option,
Recommendation, kind-note (no completeness score — Include/Defer/Cut/Hold are
decision actions), and 4 buckets:
**A) Include**, **B) Defer**, **C) Cut**, **D) Hold** (stop chain, discuss).

After the chain, fire `D.final` to validate the assembled set (reprompt
dependency conflicts) and confirm shipping it. Use `D.revise-` to
revise one option without re-running the chain.

For N>6, fire a `D.0` meta-AskUserQuestion first (proceed / narrow / batch).

question_ids for split chains: `-split-` (kebab-case ASCII,
≤64 chars, `-2`/`-3` suffix on collision). The runtime checker
(`bin/gstack-question-preference.py`) refuses `never-ask` on any `*-split-*` id,
so split chains are never AUTO_DECIDE-eligible — the user's option set is sacred.

Full rule + worked examples + Hold/dependency semantics: see
`docs/askuserquestion-split.md` in the gstack repo. Read on demand when N>4.

Non-ASCII characters — write directly, never \u-escape. When any
    string field (question, option label, option description) contains
    Chinese (繁體/簡體), Japanese, Korean, or other non-ASCII text, emit
    the literal UTF-8 characters in the JSON string. **Never escape them
    as `\uXXXX`.** Claude Code's tool parameter pipe is UTF-8 native
    and passes characters through unchanged. Manually escaping requires
    recalling each codepoint from training, which is unreliable for long
    CJK strings — the model regularly emits the wrong codepoint (e.g.
    writes `\u3103` thinking it is 管 U+7BA1, but `\u3103` is
    actually ㄃, so the user sees `管理工具` rendered as `㄃3用箱`).
    The trigger is long, multi-line questions with hundreds of CJK
    characters: that is exactly when reflexive escaping kicks in and
    exactly when miscoding is most damaging. Long ≠ escape. Keep
    characters literal.

    Wrong: `"question": "請選擇\uXXXX\uXXXX\uXXXX\uXXXX"`
    Right: `"question": "請選擇管理工具"`

    Only JSON-mandatory escapes remain allowed: `\n`, `\t`, `\"`, `\\`.

### Self-check before emitting

Before calling AskUserQuestion, verify:

- [ ] D header present
- [ ] ELI10 paragraph present (stakes line too)
- [ ] Recommendation line present with concrete reason
- [ ] Completeness scored (coverage) OR kind-note present (kind)
- [ ] Every option has ≥2 ✅ and ≥1 ❌, each ≥40 chars (or hard-stop escape)
- [ ] (recommended) label on one option (even for neutral-posture)
- [ ] Dual-scale effort labels on effort-bearing options (human / CC)
- [ ] Net line closes the decision
- [ ] You are calling the tool, not writing prose
- [ ] Non-ASCII characters (CJK / accents) written directly, NOT \u-escaped
- [ ] If you had 5+ options, you split (or batched into ≤4-groups) — did NOT drop any
- [ ] If you split, you checked dependencies between options before firing the chain
- [ ] If a per-option Hold fires, you stopped the chain immediately (didn't queue)

## Artifacts Sync (skill start)

```powershell
$gstackHome = $env:GSTACK_HOME
if (!$gstackHome) { $gstackHome = "$HOME/.gstack" }

# Prefer the v1.27.0.0 artifacts file; fall back to brain file for users
# upgrading mid-stream before the migration script runs.
$brainRemoteFile = "$HOME/.gstack-artifacts-remote.txt"
if (!(Test-Path $brainRemoteFile)) {
  $brainRemoteFile = "$HOME/.gstack-brain-remote.txt"
}

# Teach the agent to use gbrain when it's available.
$gbrainConfig = "$HOME/.gbrain/config.json"
$hasGBrain = Get-Command gbrain -ErrorAction SilentlyContinue
if ((Test-Path $gbrainConfig) -and $hasGBrain) {
  # GBrain logic
  Write-Host "GBrain configured. Prefer 'gbrain search'/'gbrain query' over Grep"
}
```

Privacy stop-gate: if output shows sync is off, ask once via AskUserQuestion options.

At skill END before telemetry:

```powershell
python "bin/gstack-brain-sync.py" --discover-new
python "bin/gstack-brain-sync.py" --once
```

## Model-Specific Behavioral Patch (claude)

The following nudges are tuned for the claude model family. They are
**subordinate** to skill workflow, STOP points, AskUserQuestion gates, plan-mode
safety, and /ship review gates. If a nudge below conflicts with skill instructions,
the skill wins. Treat these as preferences, not rules.

**Todo-list discipline.** When working through a multi-step plan, mark each task
complete individually as you finish it. Do not batch-complete at the end. If a task
turns out to be unnecessary, mark it skipped with a one-line reason.

**Think before heavy actions.** For complex operations (refactors, migrations,
non-trivial new features), briefly state your approach before executing. This lets
the user course-correct cheaply instead of mid-flight.

**Dedicated tools over Bash.** Prefer Read, Edit, Write, Glob, Grep over shell
equivalents (cat, sed, find, grep). The dedicated tools are cheaper and clearer.

## Voice

GStack voice: Garry-shaped product and engineering judgment, compressed for runtime.

-

…

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [thanh-abaii](https://github.com/thanh-abaii)
- **Source:** [thanh-abaii/gstack-windows-port](https://github.com/thanh-abaii/gstack-windows-port)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** yes
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-thanh-abaii-gstack-windows-port-gstack-skillify
- Seller: https://agentstack.voostack.com/s/thanh-abaii
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
