dx-step-all

star 6

Autonomous execution loop — runs each plan step (implement + test + review + commit internally), with step-fix for failures. Stops after 2 consecutive fix failures on the same step. Use to execute the full plan hands-free.

easingthemes By easingthemes schedule Updated 6/16/2026

name: dx-step-all description: Autonomous execution loop — runs each plan step (implement + test + review + commit internally), with step-fix for failures. Stops after 2 consecutive fix failures on the same step. Use to execute the full plan hands-free. when_to_use: "Use to execute all plan steps autonomously. Trigger on 'execute plan', 'run all steps', 'step-all', 'implement everything', 'do all the steps', or when the plan is ready and full automation is desired." argument-hint: "[Work Item ID or slug (optional — uses most recent if omitted)]" context: fork allowed-tools: ["read", "edit", "search", "write", "agent"]

You are a coordinator. You run the step pipeline for each step in implement.md, delegating to skills via the Skill tool.

Progress visibility

You run in a forked context. Before emitting any chat output, determine whether you were invoked by the orchestrator (dx-agent-all) or standalone — see plugins/dx-core/shared/orchestration-check.md:

ORCHESTRATED=0
FLAG=".ai/run-context/orchestrating.flag"
if [ -f "$FLAG" ]; then
  AGE=$(( $(date +%s) - $(date -r "$FLAG" +%s) ))
  [ "$AGE" -lt 7200 ] && ORCHESTRATED=1
fi
  • If $ORCHESTRATED == 1 (orchestrator path): write all canonical artifacts to $SPEC_DIR/<file>.md (already documented below) and emit ONLY the ## Return block to chat.
  • If $ORCHESTRATED == 0 (standalone path): write the same canonical artifacts AND emit the human-friendly summary marked <!-- standalone-only --> below, followed by the ## Return block at the very end.

Per-phase / per-step progress lines during the run are allowed in both paths.

The orchestrator (dx-agent-all) cannot see your TaskList directly. To preserve user-visible progress, you MUST update $SPEC_DIR/dev-all-progress.md after each step transition:

  • Mark step in_progress at the start of execution
  • Mark step done | failed | healing immediately on transition
  • Update within the same logical action — never batch updates

The orchestrator reads this file after this skill returns and prints a one-line status summary to the user. Skill invocations are blocking — the orchestrator does not poll mid-execution. If you skip an update, the user sees stale progress when they ask for a recap.

Format — one row per step in a table (see .ai/templates/spec/dev-all-progress.md.template if it exists, else use the existing format from prior runs):

Step Status Note
1: </td> <td>done</td> <td>committed 4bf6fe5</td> </tr> <tr> <td>2: <title></td> <td>in_progress</td> <td>—</td> </tr> <tr> <td>3: <title></td> <td>—</td> <td>—</td> </tr> </tbody></table> <h2>Progress Tracking</h2> <p>After loading <code>implement.md</code>, use <code>TaskList</code> to check for existing tasks from a previous run. If stale tasks exist, cancel them first with <code>TaskUpdate</code> (status: <code>cancelled</code>). Then create a task for each plan step using <code>TaskCreate</code> (e.g., "Step 1: Create dialog XML"). Mark each <code>in_progress</code> when executing, <code>completed</code> when committed. On fix attempts, update the task subject (e.g., "Step 1: Create dialog XML (fix 1)"). On heal cycles, add a task: "Healing: <corrective action>".</p> <h2>Flow</h2> <pre><code class="language-dot">digraph step_all { "Locate spec dir + check run-state" [shape=box]; "Ensure feature branch" [shape=box]; "Load fix memory" [shape=box]; "Get next pending step" [shape=box]; "All steps done?" [shape=diamond]; "Execute step" [shape=box]; "Step passed?" [shape=diamond]; "Fix attempt" [shape=box]; "Fix succeeded?" [shape=diamond]; "Consecutive failures < 2?" [shape=diamond]; "Invoke step-fix (heal)" [shape=box]; "Heal result?" [shape=diamond]; "Execute corrective steps" [shape=box]; "Corrective step failed after 2 fixes?" [shape=diamond]; "Healing cycle < 2?" [shape=diamond]; "Log progress + track fix patterns" [shape=box]; "Completion summary + log run + promote fixes" [shape=doublecircle]; "STOP: Human intervention needed" [shape=doublecircle]; "Locate spec dir + check run-state" -> "Ensure feature branch"; "Ensure feature branch" -> "Load fix memory"; "Load fix memory" -> "Get next pending step"; "Get next pending step" -> "All steps done?"; "All steps done?" -> "Completion summary + log run + promote fixes" [label="yes"]; "All steps done?" -> "Execute step" [label="no"]; "Execute step" -> "Step passed?"; "Step passed?" -> "Log progress + track fix patterns" [label="yes"]; "Step passed?" -> "Fix attempt" [label="no (blocked)"]; "Fix attempt" -> "Fix succeeded?"; "Fix succeeded?" -> "Log progress + track fix patterns" [label="yes"]; "Fix succeeded?" -> "Consecutive failures < 2?" [label="no"]; "Consecutive failures < 2?" -> "Fix attempt" [label="yes, retry"]; "Consecutive failures < 2?" -> "Invoke step-fix (heal)" [label="no, 2 strikes"]; "Invoke step-fix (heal)" -> "Heal result?"; "Heal result?" -> "Execute corrective steps" [label="healed"]; "Heal result?" -> "STOP: Human intervention needed" [label="unrecoverable"]; "Execute corrective steps" -> "Corrective step failed after 2 fixes?"; "Corrective step failed after 2 fixes?" -> "Log progress + track fix patterns" [label="no, passed"]; "Corrective step failed after 2 fixes?" -> "Healing cycle < 2?" [label="yes, failed"]; "Healing cycle < 2?" -> "Invoke step-fix (heal)" [label="yes, try again"]; "Healing cycle < 2?" -> "STOP: Human intervention needed" [label="no, 2 cycles exhausted"]; "Log progress + track fix patterns" -> "Get next pending step"; } </code></pre> <h2>Node Details</h2> <h3>Locate spec dir + check run-state</h3> <pre><code class="language-bash">SPEC_DIR=$(bash .ai/lib/dx-common.sh find-spec-dir $ARGUMENTS) </code></pre> <p>Maintain run state in <code>$SPEC_DIR/run-state.json</code>:</p> <pre><code class="language-json">{ "skill": "dx-step-all", "ticket": "<id>", "started": "<ISO-8601>", "phase": 0, "step": 0, "completed_phases": [], "last_action": "", "files_modified": [] } </code></pre> <p><strong>On invocation:</strong></p> <ol> <li>Check for existing <code>$SPEC_DIR/run-state.json</code></li> <li>If exists and <code>started</code> < 2 hours ago → ask user: "Previous run found at phase {phase}, step {step}. Resume or start fresh?"</li> <li>If exists and <code>started</code> ≥ 2 hours ago → warn: "Stale run state found (started {time}). Starting fresh." Delete run-state.json.</li> <li>If not exists → create new run-state.json</li> </ol> <p><strong>During execution:</strong> Update run-state.json after each phase/step completion. <strong>On completion:</strong> Delete run-state.json (clean exit).</p> <p>Get the plan metadata (step count and status) — do NOT read full implement.md here:</p> <pre><code class="language-bash">bash .ai/lib/plan-metadata.sh $SPEC_DIR </code></pre> <p>This outputs a compact summary (~10 tokens/step vs ~200 for full file). Workers (step, step-fix) will read the full implement.md when they need it.</p> <p>Print: <code>Starting execution: <N> steps total, <M> pending.</code></p> <h3>Ensure feature branch</h3> <p>Before executing any steps, run the shared branch guard:</p> <pre><code class="language-bash">bash .ai/lib/ensure-feature-branch.sh $SPEC_DIR </code></pre> <p>This no-ops if already on <code>feature/*</code> or <code>bugfix/*</code>. Creates a feature branch if on any other branch. The branch name is saved to <code>$SPEC_DIR/.branch</code>.</p> <p>Print: <code>Branch: <BRANCH> (<BRANCH_ACTION>)</code></p> <p><strong>This is a hard gate</strong> — never execute steps on a protected branch.</p> <h3>Load fix memory</h3> <p>Before entering the execution loop, check if the project has accumulated fix knowledge from previous runs.</p> <p>If <code>.ai/learning/fixes.md</code> exists:</p> <ul> <li>Read it</li> <li>Include a note when dispatching skills: append to the prompt: <code>Known fix patterns for this project: <summary of fixes.md content></code></li> <li>Print: <code>Learning: Loaded <N> known fix patterns from previous runs.</code></li> </ul> <p>If it does not exist, skip silently.</p> <h3>Get next pending step</h3> <p>Re-read plan metadata to get the latest status (skills update implement.md). Especially important after step-fix creates new steps. Never read full implement.md in the orchestrator — workers handle that.</p> <pre><code class="language-bash">bash .ai/lib/plan-metadata.sh $SPEC_DIR </code></pre> <p>Identify the next step with status <code>pending</code>.</p> <h3>All steps done?</h3> <p>Check if any <code>pending</code> or <code>in-progress</code> steps remain.</p> <ul> <li><strong>yes</strong> → proceed to "Completion summary + log run + promote fixes"</li> <li><strong>no</strong> → proceed to "Execute step" with the next pending step</li> </ul> <h3>Execute step</h3> <p>Invoke <code>Skill(/dx-step)</code> for the current step. dx-step now handles implement + test + review + commit as internal phases — no separate dispatches needed.</p> <h3>Step passed?</h3> <p>Check the result from dx-step:</p> <ul> <li><strong>success</strong> → proceed to "Log progress + track fix patterns"</li> <li><strong>failure</strong> → classify the error (see <strong>Error Classification</strong> below), then proceed to "Fix attempt"</li> </ul> <p><strong>Error Classification:</strong> Before triggering healing, classify the failure using <code>shared/error-handling.md</code>:</p> <ul> <li><strong>TRANSIENT</strong> → Retry the step (counts toward consecutive failure limit)</li> <li><strong>VALIDATION</strong> → Let dx-step-fix attempt repair (counts as healing cycle)</li> <li><strong>PERMANENT</strong> → Skip healing entirely. Mark step blocked. Report to user immediately. Proceed to "STOP: Human intervention needed".</li> </ul> <h3>Fix attempt</h3> <p>Invoke <code>Skill(/dx-step-fix)</code> for the current step.</p> <p>Track fix attempts per step.</p> <h3>Fix succeeded?</h3> <p>Check the fix result:</p> <ul> <li><strong>yes</strong> → proceed to "Log progress + track fix patterns"</li> <li><strong>no</strong> → proceed to "Consecutive failures < 2?"</li> </ul> <h3>Consecutive failures < 2?</h3> <p>Check consecutive fix failure count for this step:</p> <ul> <li><strong>yes, retry</strong> → proceed to "Fix attempt" for another attempt</li> <li><strong>no, 2 strikes</strong> → proceed to "Invoke step-fix (heal)"</li> </ul> <h3>Invoke step-fix (heal)</h3> <p>Track healing cycles per step. Max 2 healing cycles per original step.</p> <p>Invoke <code>Skill(/dx-step-fix)</code> with healing context:</p> <pre><code>/dx-step-fix <SPEC_DIR> --heal --failure-type step-blocked --blocked-step <N> </code></pre> <p>dx-step-fix now handles both fix and heal modes internally.</p> <h3>Heal result?</h3> <p>Check the step-fix return:</p> <ul> <li><strong>healed</strong> → re-read implement.md to find the new corrective step(s). Print a clear plan-mutation notice:<pre><code>⚠ Plan modified by heal: <N> corrective step(s) added after Step <blocked-step>. New steps: <list of step numbers and titles> Total steps now: <updated total> </code></pre> Update TaskList to reflect the new steps. Proceed to "Execute corrective steps".</li> <li><strong>unrecoverable</strong> → print: <code>Step <N> unrecoverable after 2 fixes + healing. Human intervention needed.</code> Proceed to "STOP: Human intervention needed".</li> </ul> <h3>Execute corrective steps</h3> <p>Run the normal Execute step → Fix attempt cycle on each new corrective step created by step-fix.</p> <h3>Corrective step failed after 2 fixes?</h3> <p>After running the corrective step through the full cycle (including up to 2 fix attempts):</p> <ul> <li><strong>no, passed</strong> → proceed to "Log progress + track fix patterns"</li> <li><strong>yes, failed</strong> → proceed to "Healing cycle < 2?"</li> </ul> <h3>Healing cycle < 2?</h3> <p>Check the healing cycle count for the original step:</p> <ul> <li><strong>yes, try again</strong> → proceed to "Invoke step-fix (heal)" for another healing cycle</li> <li><strong>no, 2 cycles exhausted</strong> → print: <code>Step <N> blocked after 2 healing cycles. Human intervention needed.</code> Proceed to "STOP: Human intervention needed".</li> </ul> <h3>Log progress + track fix patterns</h3> <p>After each step cycle, print:</p> <pre><code>Step <N>/<total> done — <step title> </code></pre> <p><strong>Track and persist learning signals</strong> for each step that completes (or fails):</p> <ul> <li><code>step_number</code>: which step</li> <li><code>step_title</code>: the step's title from implement.md</li> <li><code>fix_attempts</code>: number of fix attempts (0 if none needed)</li> <li><code>fix_succeeded</code>: how many fix attempts succeeded</li> <li><code>fix_failed</code>: how many fix attempts failed</li> <li><code>heal_cycles</code>: number of healing cycles invoked (0 if none)</li> <li><code>heal_succeeded</code>: how many heal cycles succeeded</li> <li><code>heal_failed</code>: how many heal cycles failed</li> <li><code>fix_types</code>: list of error types encountered (e.g., "compilation", "test-failure", "review-rejection")</li> </ul> <p><strong>Persist immediately after each step</strong> (not deferred to end-of-run):</p> <pre><code class="language-bash">mkdir -p .ai/learning/raw </code></pre> <p>If fix attempts occurred for this step, append one JSONL line per attempt to <code>.ai/learning/raw/fixes.jsonl</code>:</p> <pre><code class="language-json">{"timestamp":"<ISO-8601>","ticket":"<id>","step":<N>,"error_type":"<type>","fix_description":"<what was done>","result":"<success|failed>"} </code></pre> <p><strong>Incremental pattern promotion:</strong> After appending, check if any pattern in <code>fixes.jsonl</code> now has 3+ successes and 0 failures. If so, promote it immediately (see "Completion summary + log run + promote fixes" for format). This ensures learning survives even if the run is interrupted.</p> <h3>Completion summary + log run + promote fixes</h3> <p>After all steps are done:</p> <!-- standalone-only — emit only when $ORCHESTRATED == 0 --> <p>When running standalone (<code>$ORCHESTRATED == 0</code>), emit:</p> <pre><code class="language-markdown">## Execution Complete **<count> steps** executed — <count> succeeded, <count> failed, <count> self-healed. | Step | Status | Note | |------|--------|------| | 1: <title> | done | committed <sha> | | 2: <title> | done | committed <sha> | <... one row per step ...> <If any steps failed:> ### Blocked Steps - Step <N>: <title> — <error summary> <If cross-repo note from implement.md:> ### Other repos required <repo list from implement.md> ### Next step: - `/dx-step-build` — build and verify </code></pre> <p>When orchestrated (<code>$ORCHESTRATED == 1</code>), skip the above block entirely. The orchestrator (<code>dx-agent-all</code>) reads <code>$SPEC_DIR/dev-all-progress.md</code> directly to summarize step counts and present next-steps. The Cross-Repo Note (when <code>implement.md</code> has "Other repos required") still belongs in the orchestrator's Final Summary — pass it through via the <code>## Return</code> block's <code>summary</code> (truncated) and <code>next_action</code> fields.</p> <p><strong>Log run record:</strong></p> <pre><code class="language-bash">mkdir -p .ai/learning/raw </code></pre> <p>Append one JSONL line to <code>.ai/learning/raw/runs.jsonl</code>:</p> <pre><code class="language-json">{"timestamp":"<ISO-8601>","ticket":"<id>","flow":"step-all","total_steps":<N>,"steps_completed":<N>,"fix_attempts":{"succeeded":<N>,"failed":<N>},"heal_cycles":{"succeeded":<N>,"failed":<N>},"step_titles":["<title1>","<title2>"]} </code></pre> <p>Use Bash to append — <code>echo '<json>' >> .ai/learning/raw/runs.jsonl</code></p> <p><strong>Final promotion sweep:</strong></p> <p>Run one final pattern promotion check (same logic as incremental promotion in "Log progress + track fix patterns") to catch any patterns that crossed the 3-success threshold during the last step. This is a safety net — most promotions happen incrementally.</p> <p>Read <code>.ai/learning/raw/fixes.jsonl</code>. Group entries by <code>error_type</code> + <code>fix_description</code>. For each combination with <strong>3+ successes AND 0 failures</strong>:</p> <ul> <li>Generate slug from error type (e.g., <code>compilation-missing-import</code>)</li> <li>Skip if <code>.claude/rules/learned-fix-<slug>.md</code> already exists (promoted earlier)</li> <li>Otherwise create:<pre><code class="language-markdown"># Learned Fix: <error_type> When encountering: <error_type> Apply this fix: <fix_description> Evidence: <N> successful applications across <ticket list>. </code></pre> </li> <li>Print: <code>Learning: Promoted fix pattern to .claude/rules/learned-fix-<slug>.md — <fix_description></code></li> </ul> <p><strong>Summary message:</strong></p> <p>If fix patterns were logged:</p> <ul> <li>Print: <code>Learning: <N> fix patterns logged, <M> promoted to rules.</code></li> </ul> <p>If no fix patterns at all:</p> <ul> <li>Print: <code>Learning: Clean run — no fixes needed.</code></li> </ul> <h3>STOP: Human intervention needed</h3> <p>The execution loop has been halted. Either:</p> <ul> <li>A step was marked <strong>unrecoverable</strong> after 2 fix attempts + healing</li> <li><strong>2 healing cycles</strong> were exhausted on the same original step</li> </ul> <p>Print the blocked step number, the error type, and a summary of what was tried. The user must manually intervene (edit <code>implement.md</code>, fix the environment, or re-plan).</p> <h2>Validation Gates</h2> <table> <thead> <tr> <th>After Phase</th> <th>Gate</th> <th>Fail Action</th> </tr> </thead> <tbody><tr> <td>Step execution (2a)</td> <td>Step status is <code>done</code> in <code>implement.md</code></td> <td>Enter fix loop (2b-2d)</td> </tr> <tr> <td>Fix attempt (2d)</td> <td>Fix count < 2 for this step</td> <td>If >=2: enter heal cycle (2d-heal)</td> </tr> <tr> <td>Heal cycle (2d-heal)</td> <td>Corrective steps added to <code>implement.md</code></td> <td>If unrecoverable: STOP with blocked step report</td> </tr> <tr> <td>All steps complete</td> <td>No <code>pending</code> or <code>in-progress</code> steps remain</td> <td>Proceed to build phase</td> </tr> </tbody></table> <h2>Examples</h2> <h3>Execute full plan</h3> <pre><code>/dx-step-all 2416553 </code></pre> <p>Reads <code>implement.md</code> from <code>.ai/specs/2416553-add-layout-switcher/</code>, finds 6 pending steps, and runs each through dx-step (which handles implement + test + review + commit internally). Prints progress after each step.</p> <h3>Resume after partial completion</h3> <pre><code>/dx-step-all 2416553 </code></pre> <p>If steps 1-3 are already <code>done</code>, picks up at step 4 and continues. Only pending steps are executed.</p> <h3>Self-healing on failure</h3> <p>When step 3 fails twice, triggers <code>dx-step-fix</code> in heal mode which analyzes the error, creates a corrective step 3a, executes it, then retries step 3. If healing also fails after 2 cycles, stops and reports.</p> <h2>Troubleshooting</h2> <h3>"No pending steps" but plan isn't done</h3> <p><strong>Cause:</strong> Steps are marked <code>blocked</code> or <code>in-progress</code> from a previous interrupted run. <strong>Fix:</strong> Open <code>implement.md</code> and reset the stuck step's status to <code>pending</code>, then re-run.</p> <h3>Build fails repeatedly on the same step</h3> <p><strong>Cause:</strong> The plan step has incorrect instructions or missing context. <strong>Fix:</strong> Let self-healing run (2 fix attempts + 2 heal cycles). If still failing, run <code>/dx-step-fix</code> manually to diagnose, or edit <code>implement.md</code> to fix the step instructions.</p> <h3>"Cannot execute on protected branch"</h3> <p><strong>Cause:</strong> You're on <code>development</code>, <code>main</code>, or <code>master</code> instead of a feature branch. <strong>Fix:</strong> The branch guard should auto-create a feature branch. If it fails, manually create one: <code>git checkout -b feature/<id>-<slug></code>.</p> <h2>Decision Examples</h2> <h3>Heal: Flaky Test</h3> <p><strong>Failure:</strong> Test passes locally but fails in step execution (timing-dependent assertion) <strong>Consecutive failures:</strong> 2 <strong>Decision:</strong> HEAL — test is flaky. Fix: add wait/retry in test assertion.</p> <h3>Escalate: Architecture Mismatch</h3> <p><strong>Failure:</strong> Step creates a new utility, but existing utility covers the need <strong>Consecutive failures:</strong> 2 <strong>Decision:</strong> ESCALATE — plan problem, not code problem. Report: "Step 4 violates reuse rule. Existing <code>forms.js:validateField()</code> covers this need."</p> <h2>Success Criteria</h2> <ul> <li><input disabled="" type="checkbox"> All steps in implement.md have status: done, blocked, or skipped</li> <li><input disabled="" type="checkbox"> No steps remain in pending or in-progress</li> <li><input disabled="" type="checkbox"> Build command exits 0 after final step</li> <li><input disabled="" type="checkbox"> run-state.json deleted (clean completion)</li> </ul> <h2>Rules</h2> <ul> <li><strong>Coordinator only</strong> — never implement code yourself. Always delegate via Skill tool.</li> <li><strong>Sequential execution</strong> — steps must run in order. Never parallelize steps.</li> <li><strong>2-strike then heal</strong> — after 2 consecutive fix failures, invoke step-fix in heal mode before giving up.</li> <li><strong>2 healing cycles max</strong> — after 2 healing cycles on the same original step, stop for real.</li> <li><strong>Progress reporting</strong> — print status after each step so the user can follow along.</li> <li><strong>Re-read metadata between steps</strong> — run <code>plan-metadata.sh</code> between steps to get the latest status (skills update implement.md). Especially important after step-fix creates new steps. Never read full implement.md in the orchestrator — workers handle that.</li> <li><strong>Don't skip blocked steps</strong> — if a step is blocked and healing failed, stop. Steps have dependencies.</li> </ul> <h2>Platform Compatibility</h2> <p>This skill uses <code>Skill()</code> tool calls which work on both Claude Code and Copilot CLI.</p> <p><strong>Copilot CLI / VS Code Chat fallback:</strong> If subagent skill invocation fails, run the skills manually in sequence for each plan step:</p> <ol> <li><code>/dx-step <step-number></code> — execute a single step (implement + test + review + commit)</li> <li>On failure: <code>/dx-step-fix <spec-dir></code> — attempt repair (up to 2 tries)</li> <li>On persistent failure: <code>/dx-step-fix <spec-dir> --heal</code> — diagnose and create corrective steps</li> <li>Repeat from step 1 for each pending step in <code>implement.md</code></li> </ol> <h2>Return</h2> <p>This skill runs in a forked context. It MUST end with a <code>## Return</code> block per <code>plugins/dx-core/shared/skill-return-contract.md</code>.</p> <p>Examples:</p> <pre><code class="language-markdown">## Return verdict: pass summary: Executed 4 steps; 3 commits; 1 self-heal cycle on Step 3 (lint no-shadow). artifacts: - .ai/specs/2490722-microsite/dev-all-progress.md - .ai/specs/2490722-microsite/run-state.json next_action: continue to Phase 4 (build) </code></pre> <pre><code class="language-markdown">## Return verdict: fail summary: Step 2 blocked after 2 fix attempts — JS test pollution; manual intervention needed. artifacts: - .ai/specs/2490722-microsite/dev-all-progress.md - .ai/specs/2490722-microsite/run-state.json next_action: human fix Step 2; re-run /dx-step-all </code></pre> </article> </div> <!-- Right: Metadata & Command Sidebar --> <div class="w-full lg:w-80 shrink-0 flex flex-col gap-6" data-astro-cid-7zzsworf> <!-- Install Card --> <div class="p-6 rounded-xl bg-surface-container border border-border/80 flex flex-col gap-4 shadow-sm" data-astro-cid-7zzsworf> <span class="text-xs font-bold uppercase tracking-widest text-on-surface-variant/60 font-mono" data-astro-cid-7zzsworf>Install via CLI</span> <div class="flex flex-col gap-2" data-astro-cid-7zzsworf> <div id="detail-install-cmd" class="font-mono text-[11px] p-3 rounded-lg bg-black/40 border border-border select-all break-all text-primary font-bold leading-relaxed" data-astro-cid-7zzsworf> npx skills add https://github.com/easingthemes/dx-aem-flow --skill dx-step-all </div> <button id="detail-copy-btn" class="w-full py-2.5 rounded-lg bg-primary hover:bg-primary-hover text-on-primary font-sans font-bold text-sm shadow transition-all active:scale-95 flex items-center justify-center gap-1.5" data-astro-cid-7zzsworf> <span class="material-symbols-outlined text-[16px]" data-astro-cid-7zzsworf>content_copy</span> <span data-astro-cid-7zzsworf>Copy Command</span> </button> </div> </div> <!-- Details & Stats Card --> <div class="p-6 rounded-xl bg-surface-container border border-border/80 flex flex-col gap-4 shadow-sm text-on-surface" data-astro-cid-7zzsworf> <span class="text-xs font-bold uppercase tracking-widest text-on-surface-variant/60 font-sans" data-astro-cid-7zzsworf>Repository Details</span> <div class="flex flex-col gap-3.5" data-astro-cid-7zzsworf> <div class="flex justify-between items-center text-sm" data-astro-cid-7zzsworf> <span class="text-on-surface-variant/70 flex items-center gap-1.5" data-astro-cid-7zzsworf> <span class="material-symbols-outlined text-[16px] text-on-surface-variant/60" data-astro-cid-7zzsworf>star</span> Stars </span> <span class="font-mono font-bold text-on-surface" data-astro-cid-7zzsworf>6</span> </div> <div class="flex justify-between items-center text-sm" data-astro-cid-7zzsworf> <span class="text-on-surface-variant/70 flex items-center gap-1.5" data-astro-cid-7zzsworf> <span class="material-symbols-outlined text-[16px] text-on-surface-variant/60" data-astro-cid-7zzsworf>call_split</span> Forks </span> <span class="font-mono font-bold text-on-surface" data-astro-cid-7zzsworf>3</span> </div> <div class="flex justify-between items-center text-sm" data-astro-cid-7zzsworf> <span class="text-on-surface-variant/70 flex items-center gap-1.5" data-astro-cid-7zzsworf> <span class="material-symbols-outlined text-[16px] text-on-surface-variant/60" data-astro-cid-7zzsworf>navigation</span> Branch </span> <span class="font-mono bg-surface border border-border px-2 py-0.5 rounded text-[11px] text-on-surface-variant" data-astro-cid-7zzsworf>main</span> </div> <div class="flex justify-between items-start text-sm" data-astro-cid-7zzsworf> <span class="text-on-surface-variant/70 flex items-center gap-1.5 mt-0.5" data-astro-cid-7zzsworf> <span class="material-symbols-outlined text-[16px] text-on-surface-variant/60" data-astro-cid-7zzsworf>article</span> Path </span> <span class="font-mono bg-surface border border-border px-2 py-0.5 rounded text-[11px] text-on-surface-variant truncate max-w-[150px]" title="SKILL.md" data-astro-cid-7zzsworf>SKILL.md</span> </div> </div> </div> <!-- Occupations Tag Card --> <!-- Related Creators Card --> <div class="p-6 rounded-xl bg-surface-container border border-border/80 flex flex-col gap-3 shadow-sm" data-astro-cid-7zzsworf> <span class="text-xs font-bold uppercase tracking-widest text-on-surface-variant/60 font-sans" data-astro-cid-7zzsworf>More from Creator</span> <div class="flex items-center gap-2" data-astro-cid-7zzsworf> <img class="w-8 h-8 rounded-full border border-border" src="https://avatars.githubusercontent.com/u/2750284?u=be8708b484103ab9cd74f3feff3d56ad04232ad6&v=4" alt="easingthemes" onerror="this.src='https://avatars.githubusercontent.com/u/9919?v=4'" data-astro-cid-7zzsworf> <div class="flex flex-col min-w-0" data-astro-cid-7zzsworf> <span class="font-bold text-sm truncate text-on-surface" data-astro-cid-7zzsworf>easingthemes</span> <a href="/?creator=easingthemes" class="text-xs text-primary hover:underline font-semibold transition-all" data-astro-cid-7zzsworf>Explore all skills →</a> </div> </div> </div> </div> </div> </div> </div> <script> const copyBtn = document.getElementById("detail-copy-btn"); const installCmd = document.getElementById("detail-install-cmd"); if (copyBtn && installCmd) { copyBtn.addEventListener("click", () => { const cmd = installCmd.textContent.trim(); navigator.clipboard.writeText(cmd).then(() => { const originalText = copyBtn.innerHTML; copyBtn.innerHTML = ` <span class="material-symbols-outlined text-[16px]">check</span> <span>Copied!</span> `; copyBtn.style.background = "#10b981"; copyBtn.style.borderColor = "#10b981"; setTimeout(() => { copyBtn.innerHTML = originalText; copyBtn.style.background = ""; copyBtn.style.borderColor = ""; }, 1500); }); }); } </script> </div> <!-- Footer --> <footer class="border-t border-border bg-surface-container-low text-on-surface-variant py-8 px-gutter mt-16 rounded-xl"> <div class="max-w-container-max mx-auto flex flex-col md:flex-row justify-between items-center gap-6"> <div class="flex items-center gap-2"> <div class="w-6 h-6 rounded bg-primary bg-opacity-20 flex items-center justify-center"> <span class="material-symbols-outlined text-primary text-sm">code_blocks</span> </div> <span class="font-bold text-on-surface text-sm">SkillMD</span> </div> <div class="flex flex-wrap justify-center gap-6 text-sm"> <a href="/about" class="hover:text-primary transition-colors">About Us</a> <a href="/contact" class="hover:text-primary transition-colors">Contact Us</a> <a href="/privacy" class="hover:text-primary transition-colors">Privacy Policy</a> <a href="/terms" class="hover:text-primary transition-colors">Terms of Service</a> <a href="/support" class="hover:text-primary transition-colors">Support</a> </div> <div class="text-xs text-on-surface-variant/80"> © 2026 SkillMD. All rights reserved. </div> </div> </footer> </main> <!-- Script for Theme Toggle, Mobile Menu, and Sidebar Filter Redirection --> <script> // Theme setup const savedTheme = localStorage.getItem("theme") || "dark"; function applyTheme(theme) { document.documentElement.classList.remove("dark", "green", "dracula", "nord"); if (theme === "dark") { document.documentElement.classList.add("dark"); } else if (theme === "green") { document.documentElement.classList.add("dark", "green"); } else if (theme === "dracula") { document.documentElement.classList.add("dark", "dracula"); } else if (theme === "nord") { document.documentElement.classList.add("dark", "nord"); } document.documentElement.setAttribute("data-theme", theme); const themeMoon = document.getElementById("theme-moon"); const themeSun = document.getElementById("theme-sun"); const themeLeaf = document.getElementById("theme-leaf"); const themeDracula = document.getElementById("theme-dracula"); const themeNord = document.getElementById("theme-nord"); if (themeMoon && themeSun && themeLeaf && themeDracula && themeNord) { themeMoon.style.display = theme === "dark" ? "inline" : "none"; themeSun.style.display = theme === "light" ? "inline" : "none"; themeLeaf.style.display = theme === "green" ? "inline" : "none"; themeDracula.style.display = theme === "dracula" ? "inline" : "none"; themeNord.style.display = theme === "nord" ? "inline" : "none"; } } applyTheme(savedTheme); const themeToggleBtn = document.getElementById("theme-toggle-btn"); if (themeToggleBtn) { themeToggleBtn.addEventListener("click", () => { const currentTheme = document.documentElement.getAttribute("data-theme") || "dark"; let newTheme = "dark"; if (currentTheme === "dark") { newTheme = "light"; } else if (currentTheme === "light") { newTheme = "green"; } else if (currentTheme === "green") { newTheme = "dracula"; } else if (currentTheme === "dracula") { newTheme = "nord"; } else { newTheme = "dark"; } applyTheme(newTheme); localStorage.setItem("theme", newTheme); }); } // Mobile menu toggle and sidebar logic const mobileMenuToggle = document.getElementById("mobile-menu-toggle"); const sidebarMenu = document.getElementById("sidebar-menu"); const sidebarOverlay = document.getElementById("sidebar-overlay"); function isMobile() { return window.innerWidth < 768; // 768px is the 'md' breakpoint in Tailwind } function openSidebar() { if (sidebarMenu) { sidebarMenu.classList.remove("-translate-x-full"); } if (sidebarOverlay) { sidebarOverlay.classList.remove("hidden"); } } function closeSidebar() { if (sidebarMenu && isMobile()) { sidebarMenu.classList.add("-translate-x-full"); } if (sidebarOverlay) { sidebarOverlay.classList.add("hidden"); } } if (mobileMenuToggle && sidebarMenu) { mobileMenuToggle.addEventListener("click", (e) => { e.stopPropagation(); if (isMobile()) { const isClosed = sidebarMenu.classList.contains("-translate-x-full"); if (isClosed) { openSidebar(); } else { closeSidebar(); } } }); document.addEventListener("click", (e) => { if (isMobile()) { if (!sidebarMenu.contains(e.target) && !mobileMenuToggle.contains(e.target)) { closeSidebar(); } } }); if (sidebarOverlay) { sidebarOverlay.addEventListener("click", () => { if (isMobile()) { closeSidebar(); } }); } // Collapse sidebar when clicking a filter button, creator button, or nav item inside it sidebarMenu.addEventListener("click", (e) => { if (isMobile()) { const clickTarget = e.target.closest("button, a"); if (clickTarget) { closeSidebar(); } } }); // Sync sidebar state on window resize window.addEventListener("resize", () => { if (!isMobile()) { // Desktop: sidebar should be visible, no overlay if (sidebarMenu) { sidebarMenu.classList.remove("-translate-x-full"); } if (sidebarOverlay) { sidebarOverlay.classList.add("hidden"); } } else { // Mobile: start collapsed if (sidebarMenu) { sidebarMenu.classList.add("-translate-x-full"); } if (sidebarOverlay) { sidebarOverlay.classList.add("hidden"); } } }); } // If not on homepage, redirect on sidebar filter click const isHomepage = window.location.pathname === "/"; document.querySelectorAll("#occupation-filters .filter-btn").forEach(btn => { btn.addEventListener("click", (e) => { const occ = e.currentTarget.getAttribute("data-occupation"); if (!isHomepage) { window.location.href = occ ? `/?occupation=${encodeURIComponent(occ)}` : "/"; } }); }); document.querySelectorAll("#creator-filters .creator-btn").forEach(btn => { btn.addEventListener("click", (e) => { const creator = e.currentTarget.getAttribute("data-creator"); if (!isHomepage) { window.location.href = `/?creator=${encodeURIComponent(creator)}`; } }); }); </script> </body> </html>