Execute a quick task with GSD guarantees (atomic commits, state tracking) but skip optional agents
Install
mkdir -p .claude/skills/gsd-quick-nnexai && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/13624" && unzip -o skill.zip -d .claude/skills/gsd-quick-nnexai && rm skill.zipInstalls to .claude/skills/gsd-quick-nnexai
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Execute a quick task with GSD guarantees (atomic commits, state tracking) but skip optional agentsAbout this skill
<codex_skill_adapter>
A. Skill Invocation
- This skill is invoked by mentioning
$gsd-quick. - Treat all user text after
$gsd-quickas{{GSD_ARGS}}. - If no arguments are present, treat
{{GSD_ARGS}}as empty.
B. AskUserQuestion → request_user_input Mapping
GSD workflows use AskUserQuestion (Claude Code syntax). Translate to Codex request_user_input:
Parameter mapping:
header→headerquestion→question- Options formatted as
"Label" — description→{label: "Label", description: "description"} - Generate
idfrom header: lowercase, replace spaces with underscores
Batched calls:
AskUserQuestion([q1, q2])→ singlerequest_user_inputwith multiple entries inquestions[]
Multi-select workaround:
- Codex has no
multiSelect. Use sequential single-selects, or present a numbered freeform list asking the user to enter comma-separated numbers.
Execute mode fallback:
- When
request_user_inputis rejected or unavailable, activate TEXT_MODE: append--textto{{GSD_ARGS}}so the workflow's built-in text-mode branching takes over. Present everyAskUserQuestioncall as a plain-text numbered list, then stop and wait for the user's reply. Do NOT pick a default and continue (#3018 / #3808). - You may only proceed without a user answer when one of these is true:
(a) the invocation included an explicit non-interactive flag (
--autoor--all), (b) the user has explicitly approved a specific default for this question, or (c) the workflow's documented contract says defaults are safe (e.g. autonomous lifecycle paths). - Do NOT write workflow artifacts (CONTEXT.md, DISCUSSION-LOG.md, PLAN.md, checkpoint files) until the user has answered the plain-text questions or one of (a)-(c) above applies. Surfacing the questions and waiting is the correct response — silently defaulting and writing artifacts is the #3018 failure mode.
C. Task() → spawn_agent Mapping
GSD workflows use Task(...) (Claude Code syntax). Translate to Codex collaboration tools:
Direct mapping:
Task(subagent_type="X", prompt="Y")→spawn_agent(agent_type="X", message="Y")Task(model="...")→ omit.spawn_agenthas no inlinemodelparameter; GSD embeds the resolved per-agent model directly into each agent's.tomlat install time somodel_overridesfrom.planning/config.jsonand~/.gsd/defaults.jsonare honored automatically by Codex's agent router.- Resolved
reasoning_effort="low|medium|high|xhigh"(xhighis a GSD/Codex tier, not a generic runtime enum) → passreasoning_efforttospawn_agentwhen the runtime/tool supports it. Omit missing, empty, inherited, or unsupported values; do not invent one-off effort literals in workflow prose. fork_context: falseby default — GSD agents load their own context via<files_to_read>blocksTask(isolation="worktree")/Agent(isolation="worktree")→ no direct Codex mapping. Codexspawn_agentdoes not create or bind a git worktree automatically. Workflows that require this isolation must fail closed or use an explicit manual worktree protocol before spawning (#3360).
Spawn restriction:
- Codex restricts
spawn_agentto cases where the user has explicitly requested sub-agents. When automatic spawning is not permitted, do the work inline in the current agent rather than attempting to force a spawn.
Parallel fan-out:
- Spawn multiple agents → collect agent IDs →
wait(ids)for all to complete
Result parsing:
- Look for structured markers in agent output:
CHECKPOINT,PLAN COMPLETE,SUMMARY, etc. close_agent(id)after collecting results from each agent </codex_skill_adapter>
Quick mode is the same system with a shorter path:
- Spawns gsd-planner (quick mode) + gsd-executor(s)
- Quick tasks live in
.planning/quick/separate from planned phases - Updates STATE.md "Quick Tasks Completed" table (NOT ROADMAP.md)
Default: Skips research, discussion, plan-checker, verifier. Use when you know exactly what to do.
--discuss flag: Lightweight discussion phase before planning. Surfaces assumptions, clarifies gray areas, captures decisions in CONTEXT.md. Use when the task has ambiguity worth resolving upfront.
--full flag: Enables the complete quality pipeline — discussion + research + plan-checking + verification. One flag for everything.
--validate flag: Enables plan-checking (max 2 iterations) and post-execution verification only. Use when you want quality guarantees without discussion or research.
--research flag: Spawns a focused research agent before planning. Investigates implementation approaches, library options, and pitfalls for the task. Use when you're unsure of the best approach.
Granular flags are composable: --discuss --research --validate gives the same result as --full.
Subcommands:
list— List all quick tasks with statusstatus <slug>— Show status of a specific quick taskresume <slug>— Resume a specific quick task by slug </objective>
<execution_context> @/home/nnex/dev/prj/copilot-metrics/.codex/get-shit-done/workflows/quick.md </execution_context>
<context> {{GSD_ARGS}}Context files are resolved inside the workflow (init quick) and delegated via <files_to_read> blocks.
</context>
Parse {{GSD_ARGS}} for subcommands FIRST:
- If {{GSD_ARGS}} starts with "list": SUBCMD=list
- If {{GSD_ARGS}} starts with "status ": SUBCMD=status, SLUG=remainder (strip whitespace, sanitize)
- If {{GSD_ARGS}} starts with "resume ": SUBCMD=resume, SLUG=remainder (strip whitespace, sanitize)
- Otherwise: SUBCMD=run, pass full {{GSD_ARGS}} to the quick workflow as-is
Slug sanitization (for status and resume): Strip any characters not matching [a-z0-9-]. Reject slugs longer than 60 chars or containing .. or /. If invalid, output "Invalid session slug." and stop.
LIST subcommand
When SUBCMD=list:
ls -d .planning/quick/*/ 2>/dev/null
For each directory found:
- Check if PLAN.md exists
- Check if SUMMARY.md exists; if so, read
statusfrom its frontmatter via:gsd-sdk query frontmatter.get .planning/quick/{dir}/SUMMARY.md status - Determine directory creation date:
stat -f "%SB" -t "%Y-%m-%d"(macOS) orstat -c "%w"(Linux); fall back to the date prefix in the directory name (format:YYYYMMDD-prefix) - Derive display status:
- SUMMARY.md exists, frontmatter status=complete →
complete ✓ - SUMMARY.md exists, frontmatter status=incomplete OR status missing →
incomplete - SUMMARY.md missing, dir created <7 days ago →
in-progress - SUMMARY.md missing, dir created ≥7 days ago →
abandoned? (>7 days, no summary)
- SUMMARY.md exists, frontmatter status=complete →
SECURITY: Directory names are read from the filesystem. Before displaying any slug, sanitize: strip non-printable characters, ANSI escape sequences, and path separators using: name.replace(/[^\x20-\x7E]/g, '').replace(/[/\\]/g, ''). Never pass raw directory names to shell commands via string interpolation.
Display format:
Quick Tasks
────────────────────────────────────────────────────────────
slug date status
backup-s3-policy 2026-04-10 in-progress
auth-token-refresh-fix 2026-04-09 complete ✓
update-node-deps 2026-04-08 abandoned? (>7 days, no summary)
────────────────────────────────────────────────────────────
3 tasks (1 complete, 2 incomplete/in-progress)
If no directories found: print No quick tasks found. and stop.
STOP after displaying the list. Do NOT proceed to further steps.
STATUS subcommand
When SUBCMD=status and SLUG is set (already sanitized):
Find directory matching *-{SLUG} pattern:
dir=$(ls -d .planning/quick/*-{SLUG}/ 2>/dev/null | head -1)
If no directory found, print No quick task found with slug: {SLUG} and stop.
Read PLAN.md and SUMMARY.md (if exists) for the given slug. Display:
Quick Task: {slug}
─────────────────────────────────────
Plan file: .planning/quick/{dir}/PLAN.md
Status: {status from SUMMARY.md frontmatter, or "no summary yet"}
Description: {first non-empty line from PLAN.md after frontmatter}
Last action: {last meaningful line of SUMMARY.md, or "none"}
─────────────────────────────────────
Resume with: $gsd-quick resume {slug}
No agent spawn. STOP after printing.
RESUME subcommand
When SUBCMD=resume and SLUG is set (already sanitized):
-
Find the directory matching
*-{SLUG}pattern:dir=$(ls -d .planning/quick/*-{SLUG}/ 2>/dev/null | head -1) -
If no directory found, print
No quick task found with slug: {SLUG}and stop. -
Read PLAN.md to extract description and SUMMARY.md (if exists) to extract status.
-
Print before spawning:
[quick] Resuming: .planning/quick/{dir}/ [quick] Plan: {description from PLAN.md} [quick] Status: {status from SUMMARY.md, or "in-progress"} -
Load context via:
gsd-sdk query init.quick -
Proceed to execute the quick workflow with resume context, passing the slug and plan directory so the executor picks up where it left off.
RUN subcommand (default)
When SUBCMD=run:
Execute end-to-end. Preserve all workflow gates (validation, task description, planning, execution, state updates, commits).
</process> <notes> - Quick tasks live in `.planning/quick/` — separate from phases, not tracked in ROADMAP.md - Each quick task gets a `YYYYMMDD-{slug}/` directory with PLAN.md and eventually SUMMARY.md - STATE.md "Quick Tasks Completed" table is updated on completion - Use `list` to audit accumulated tasks; use `resume` to continue in-progress work </notes><security_notes>
- Slugs from {{GSD_ARGS}} are sanitized before use in file paths: only [a-z0-9-] allowed, max 60 chars, reject ".." and "/"
- File names from readdir/ls are sanitized before display: strip non-printable chars and ANSI sequences
- Arti
Content truncated.