Mika

Claude Pilot development workflow with quality gates

senara-solutions updated 3mo ago
Claude CodeGeneric
View source ↗
---
name: mika
description: Claude Pilot development workflow with quality gates
argument-hint: "[feature description]"
disable-model-invocation: true
---

<!-- SCOPE: claude-pilot repo ONLY. Do NOT copy this to the meta-repo or other sub-repos. -->

Run these steps in order. Do not do anything else. Do not stop between steps — complete every step through to the end.

**Issue linking:** If `$ARGUMENTS` (after stripping any `branch:` prefix) starts with `#` followed by a number (e.g. `#42`) or is just a number, treat it as a GitHub issue reference. Run `gh issue view <number> --repo senara-solutions/claude-pilot --json number,title,body,labels` to fetch the issue details, then use the issue title and body as the feature description for the planning step. Remember the issue number for the PR step.

## Worktree isolation

Before running the pipeline, set up an isolated worktree:

1. **Parse branch:** Determine the branch name using this priority order (first match wins):
   a. **Explicit `branch:` prefix:** If `$ARGUMENTS` starts with `branch:<name>`, extract `<name>` and strip the prefix.
   b. **Issue body callout:** If an issue was fetched above, search the issue body for a line matching `> - **Branch:**` followed by a backtick-wrapped branch name. Extract that branch name. This is how pre-planned tickets communicate their branch — **always use it when present**.
   c. **Derive from args (deterministic):** Only if (a) and (b) both miss, derive the branch name using this **exact bash recipe** — do not re-derive with the LLM or substitute your own kebab-casing, since redispatches must produce the same slug:
      ```bash
      # Inputs: $ISSUE_NUMBER (optional, set when an issue was fetched), raw title/text
      raw="${ISSUE_TITLE:-$ARGUMENTS}"
      if printf '%s' "$raw" | grep -qE '^(feat|fix|chore|docs|eval|test|refactor|perf)(\([^)]+\))?: '; then
        type=$(printf '%s' "$raw" | sed -nE 's/^([a-z]+)(\([^)]+\))?: .*$/\1/p')
        body=$(printf '%s' "$raw" | sed -E 's/^[a-z]+(\([^)]+\))?: *//')
      else
        type=feat
        body="$raw"
      fi
      slug=$(printf '%s' "$body" | tr '[:upper:]' '[:lower:]' \
        | LC_ALL=C sed -E 's/[^a-z0-9]+/-/g; s/^-+//; s/-+$//' \
        | cut -c1-45 | sed -E 's/-[^-]*$//; s/-+$//')
      if [ -n "${ISSUE_NUMBER:-}" ]; then
        BRANCH="${type}/${ISSUE_NUMBER}/${slug}"
      else
        BRANCH="${type}/${slug}"
      fi
      ```
2. **Skip if no branch or no args:** If there are no arguments (backlog eval mode), skip worktree creation and run the pipeline in the current directory.
3. **Detect existing worktree (MANDATORY):** Run `git rev-parse --git-dir` and `git rev-parse --git-common-dir`. If they differ, you are ALREADY inside a worktree. **STOP worktree setup immediately** — set `CREATED_WORKTREE=false` and proceed directly to the Pipeline section below. Do NOT attempt to create, remove, or modify any worktree. Do NOT clean up or recreate. Just use the current directory as-is.
4. **Sync main:** Run `git fetch origin main:main` to fast-forward local `main` to match remote. This ensures the worktree branches from the latest code. If it fails (e.g., `main` is checked out with uncommitted changes), fall back to `git fetch origin` and use `origin/main` as the base ref in the next step.
5. **Create worktree:** Set `WORKTREE=../.claude/worktrees/<sanitized-branch>/claude-pilot/` (sanitize branch name: replace `/` with `-`). Record `ORIGINAL_DIR=$(pwd)`.
   - If the worktree path already exists, remove it first: `git worktree remove --force <WORKTREE>` (ignore errors).
   - Try: `git worktree add -b <branch> <WORKTREE> main`
   - If that fails (branch already exists): `git worktree add <WORKTREE> <branch>`
   - cd into the worktree. Set `CREATED_WORKTREE=true`.

## Pipeline

1. `/ralph-loop "finish all slash commands" --completion-promise "DONE"`
2. `/ce:plan $ARGUMENTS` (if an issue was detected, pass the issue title + body instead of raw arguments)
3. `/ce:work`
4. `/ce:review`
5. `/compound-engineering:resolve_todo_parallel`
6. `/ce:compound`
7. Run `bash scripts/verify-pipeline.sh` to verify pipeline artifacts exist. If it fails, read the error messages to identify missing artifacts, go back and produce them (run `/ce:plan` if no plan doc, `/ce:work` if no source changes), then re-run verification until it passes.
8. Create a PR if one doesn't already exist:

gh pr create --title "" --body "<body>"</p> <pre><code>If a GitHub issue was referenced, include `Closes #<number>` in the PR body. ## Cleanup 9. Do NOT remove the worktree — it persists for CI fixes, review feedback, and acceptance testing. 10. Output `<promise>DONE</promise>` when complete Start with worktree isolation, then step 1. </code></pre> </div> <textarea data-body-src hidden data-astro-cid-2e7mcdih>```md --- name: mika description: Claude Pilot development workflow with quality gates argument-hint: "[feature description]" disable-model-invocation: true --- <!-- SCOPE: claude-pilot repo ONLY. Do NOT copy this to the meta-repo or other sub-repos. --> Run these steps in order. Do not do anything else. Do not stop between steps — complete every step through to the end. **Issue linking:** If `$ARGUMENTS` (after stripping any `branch:` prefix) starts with `#` followed by a number (e.g. `#42`) or is just a number, treat it as a GitHub issue reference. Run `gh issue view <number> --repo senara-solutions/claude-pilot --json number,title,body,labels` to fetch the issue details, then use the issue title and body as the feature description for the planning step. Remember the issue number for the PR step. ## Worktree isolation Before running the pipeline, set up an isolated worktree: 1. **Parse branch:** Determine the branch name using this priority order (first match wins): a. **Explicit `branch:` prefix:** If `$ARGUMENTS` starts with `branch:<name>`, extract `<name>` and strip the prefix. b. **Issue body callout:** If an issue was fetched above, search the issue body for a line matching `> - **Branch:**` followed by a backtick-wrapped branch name. Extract that branch name. This is how pre-planned tickets communicate their branch — **always use it when present**. c. **Derive from args (deterministic):** Only if (a) and (b) both miss, derive the branch name using this **exact bash recipe** — do not re-derive with the LLM or substitute your own kebab-casing, since redispatches must produce the same slug: ```bash # Inputs: $ISSUE_NUMBER (optional, set when an issue was fetched), raw title/text raw="${ISSUE_TITLE:-$ARGUMENTS}" if printf '%s' "$raw" | grep -qE '^(feat|fix|chore|docs|eval|test|refactor|perf)(\([^)]+\))?: '; then type=$(printf '%s' "$raw" | sed -nE 's/^([a-z]+)(\([^)]+\))?: .*$/\1/p') body=$(printf '%s' "$raw" | sed -E 's/^[a-z]+(\([^)]+\))?: *//') else type=feat body="$raw" fi slug=$(printf '%s' "$body" | tr '[:upper:]' '[:lower:]' \ | LC_ALL=C sed -E 's/[^a-z0-9]+/-/g; s/^-+//; s/-+$//' \ | cut -c1-45 | sed -E 's/-[^-]*$//; s/-+$//') if [ -n "${ISSUE_NUMBER:-}" ]; then BRANCH="${type}/${ISSUE_NUMBER}/${slug}" else BRANCH="${type}/${slug}" fi ``` 2. **Skip if no branch or no args:** If there are no arguments (backlog eval mode), skip worktree creation and run the pipeline in the current directory. 3. **Detect existing worktree (MANDATORY):** Run `git rev-parse --git-dir` and `git rev-parse --git-common-dir`. If they differ, you are ALREADY inside a worktree. **STOP worktree setup immediately** — set `CREATED_WORKTREE=false` and proceed directly to the Pipeline section below. Do NOT attempt to create, remove, or modify any worktree. Do NOT clean up or recreate. Just use the current directory as-is. 4. **Sync main:** Run `git fetch origin main:main` to fast-forward local `main` to match remote. This ensures the worktree branches from the latest code. If it fails (e.g., `main` is checked out with uncommitted changes), fall back to `git fetch origin` and use `origin/main` as the base ref in the next step. 5. **Create worktree:** Set `WORKTREE=../.claude/worktrees/<sanitized-branch>/claude-pilot/` (sanitize branch name: replace `/` with `-`). Record `ORIGINAL_DIR=$(pwd)`. - If the worktree path already exists, remove it first: `git worktree remove --force <WORKTREE>` (ignore errors). - Try: `git worktree add -b <branch> <WORKTREE> main` - If that fails (branch already exists): `git worktree add <WORKTREE> <branch>` - cd into the worktree. Set `CREATED_WORKTREE=true`. ## Pipeline 1. `/ralph-loop "finish all slash commands" --completion-promise "DONE"` 2. `/ce:plan $ARGUMENTS` (if an issue was detected, pass the issue title + body instead of raw arguments) 3. `/ce:work` 4. `/ce:review` 5. `/compound-engineering:resolve_todo_parallel` 6. `/ce:compound` 7. Run `bash scripts/verify-pipeline.sh` to verify pipeline artifacts exist. If it fails, read the error messages to identify missing artifacts, go back and produce them (run `/ce:plan` if no plan doc, `/ce:work` if no source changes), then re-run verification until it passes. 8. Create a PR if one doesn't already exist: ``` gh pr create --title "<title>" --body "<body>" ``` If a GitHub issue was referenced, include `Closes #<number>` in the PR body. ## Cleanup 9. Do NOT remove the worktree — it persists for CI fixes, review feedback, and acceptance testing. 10. Output `<promise>DONE</promise>` when complete Start with worktree isolation, then step 1. ```</textarea> <aside class="pb-card" data-pagefind-ignore data-astro-cid-bllr6etr> <svg class="pb-motif" width="54" height="54" viewBox="0 0 150 150" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" data-astro-cid-bllr6etr> <line x1="75" y1="45" x2="75" y2="18" stroke="var(--color-border-hi)" stroke-width="6" data-astro-cid-bllr6etr></line> <line x1="75" y1="105" x2="75" y2="132" stroke="var(--color-border-hi)" stroke-width="6" data-astro-cid-bllr6etr></line> <line x1="45" y1="75" x2="18" y2="75" stroke="var(--color-border-hi)" stroke-width="6" data-astro-cid-bllr6etr></line> <line x1="105" y1="75" x2="132" y2="75" stroke="var(--color-border-hi)" stroke-width="6" data-astro-cid-bllr6etr></line> <rect x="53" y="53" width="44" height="44" rx="8" fill="var(--color-accent)" data-astro-cid-bllr6etr></rect> <rect x="53" y="2" width="44" height="26" rx="7" fill="none" stroke="var(--color-border-hi)" stroke-width="6" data-astro-cid-bllr6etr></rect> <rect x="53" y="122" width="44" height="26" rx="7" fill="none" stroke="var(--color-border-hi)" stroke-width="6" data-astro-cid-bllr6etr></rect> <rect x="2" y="62" width="26" height="26" rx="7" fill="none" stroke="var(--color-border-hi)" stroke-width="6" data-astro-cid-bllr6etr></rect> <rect x="122" y="62" width="26" height="26" rx="7" fill="none" stroke="var(--color-border-hi)" stroke-width="6" data-astro-cid-bllr6etr></rect> </svg> <div class="pb-text" data-astro-cid-bllr6etr> <p class="pb-title" data-astro-cid-bllr6etr>The Agentic Coding Playbook</p> <p class="pb-sub" data-astro-cid-bllr6etr>Skills, MCPs, loops & guardrails — a free 22-page playbook on engineering the system around the model.</p> </div> <a class="pb-btn" href="/playbook" data-astro-cid-bllr6etr>Get it free →</a> </aside> <section class="badge-cta" data-astro-cid-2e7mcdih> <h2 data-astro-cid-2e7mcdih>Maintain Mika?</h2> <p data-astro-cid-2e7mcdih>Let people know it's listed here — add the badge (live metrics, light/dark aware) or a plain link to your README or docs.</p> <div class="badge-snippet" data-astro-cid-2e7mcdih> <code data-astro-cid-2e7mcdih>[Mika on getagentictools](https://getagentictools.com/loops/senara-solutions-mika?ref=badge)</code> <button class="btn" data-copy="[Mika on getagentictools](https://getagentictools.com/loops/senara-solutions-mika?ref=badge)" data-astro-cid-2e7mcdih>Copy</button> </div> <div class="badge-snippet" data-astro-cid-2e7mcdih> <code data-astro-cid-2e7mcdih>npx agentictools info loops/senara-solutions-mika</code> <button class="btn" data-copy="npx agentictools info loops/senara-solutions-mika" data-astro-cid-2e7mcdih>Copy</button> </div> <p class="badge-note" data-astro-cid-2e7mcdih>The second line is the <a href="/cli" data-astro-cid-2e7mcdih>CLI</a> lookup for this page — handy in READMEs and docs.</p> </section> <section class="related" data-astro-cid-2e7mcdih> <h2 data-astro-cid-2e7mcdih>Related loops</h2> <div class="grid" data-astro-cid-2e7mcdih> <a href="/loops/architectvs7-milestone-automation-skill" class="card " data-astro-cid-yk5uq4gt> <div class="card-top" data-astro-cid-yk5uq4gt> <img class="avatar" src="https://github.com/ArchitectVS7.png?size=80" alt="" loading="lazy" width="34" height="34" data-astro-cid-yk5uq4gt> <span class="name" data-astro-cid-yk5uq4gt>Milestone</span> </div> <p class="desc" data-astro-cid-yk5uq4gt>Execute an automated development cycle for the current milestone task with mandatory quality gates.</p> <div class="meta" data-astro-cid-yk5uq4gt> <span data-astro-cid-yk5uq4gt>ArchitectVS7</span> </div> </a><a href="/loops/rama-meghana-d-milestone-timestamp-audit" class="card " data-astro-cid-yk5uq4gt> <div class="card-top" data-astro-cid-yk5uq4gt> <img class="avatar" src="https://github.com/rama-meghana-d.png?size=80" alt="" loading="lazy" width="34" height="34" data-astro-cid-yk5uq4gt> <span class="name" data-astro-cid-yk5uq4gt>Milestone Timestamp Audit</span> </div> <p class="desc" data-astro-cid-yk5uq4gt>For one or more containers, audits every actual milestone — showing the event timestamp (when the physical event occurred, as rep…</p> <div class="meta" data-astro-cid-yk5uq4gt> <span data-astro-cid-yk5uq4gt>rama-meghana-d</span> </div> </a><a href="/loops/firespoonyz-task-define-next-module" class="card " data-astro-cid-yk5uq4gt> <div class="card-top" data-astro-cid-yk5uq4gt> <img class="avatar" src="https://github.com/FireSpoonYZ.png?size=80" alt="" loading="lazy" width="34" height="34" data-astro-cid-yk5uq4gt> <span class="name" data-astro-cid-yk5uq4gt>Module</span> </div> <p class="desc" data-astro-cid-yk5uq4gt>Define the next undefined module with types, traits, and stub implementations</p> <div class="meta" data-astro-cid-yk5uq4gt> <span data-astro-cid-yk5uq4gt>FireSpoonYZ</span> </div> </a><a href="/loops/sarthchawla-monitor-mr" class="card " data-astro-cid-yk5uq4gt> <div class="card-top" data-astro-cid-yk5uq4gt> <img class="avatar" src="https://github.com/sarthchawla.png?size=80" alt="" loading="lazy" width="34" height="34" data-astro-cid-yk5uq4gt> <span class="name" data-astro-cid-yk5uq4gt>Monitor Mr</span> </div> <p class="desc" data-astro-cid-yk5uq4gt>Monitor MR/PR - fix review comments and CI failures in a loop until green</p> <div class="meta" data-astro-cid-yk5uq4gt> <span data-astro-cid-yk5uq4gt>sarthchawla</span> </div> </a><a href="/loops/chrishadley1983-merge-feature-branch-to-main" class="card " data-astro-cid-yk5uq4gt> <div class="card-top" data-astro-cid-yk5uq4gt> <img class="avatar" src="https://github.com/chrishadley1983.png?size=80" alt="" loading="lazy" width="34" height="34" data-astro-cid-yk5uq4gt> <span class="name" data-astro-cid-yk5uq4gt>Merge Feature</span> </div> <p class="desc" data-astro-cid-yk5uq4gt>You are a Merge Agent responsible for safely merging completed feature work back to main. You are methodical, thorough, and never…</p> <div class="meta" data-astro-cid-yk5uq4gt> <span data-astro-cid-yk5uq4gt>chrishadley1983</span> </div> </a><a href="/loops/gtsbahamas-merge-pr" class="card " data-astro-cid-yk5uq4gt> <div class="card-top" data-astro-cid-yk5uq4gt> <img class="avatar" src="https://github.com/gtsbahamas.png?size=80" alt="" loading="lazy" width="34" height="34" data-astro-cid-yk5uq4gt> <span class="name" data-astro-cid-yk5uq4gt>Merge Pr</span> </div> <p class="desc" data-astro-cid-yk5uq4gt>Merge PR after ensuring it's up-to-date with main</p> <div class="meta" data-astro-cid-yk5uq4gt> <span data-astro-cid-yk5uq4gt>gtsbahamas</span> </div> </a> </div> </section> </article> </main> <footer class="foot" data-pagefind-ignore data-astro-cid-gcn2mc3v> <div class="wrap foot-inner" data-astro-cid-gcn2mc3v> <div class="foot-brand" data-astro-cid-gcn2mc3v> <span class="brand-name" data-astro-cid-gcn2mc3v>getagentictools</span> <p data-astro-cid-gcn2mc3v>The #1 directory for skills, plugins, loops & MCPs in agentic coding. Curated, with real metrics.</p> <p class="disclaimer" data-astro-cid-gcn2mc3v>Independent project. Not affiliated with Anthropic.</p> </div> <div class="foot-col" data-astro-cid-gcn2mc3v> <h4 data-astro-cid-gcn2mc3v>Browse</h4> <a href="/skills" data-astro-cid-gcn2mc3v>Skills</a><a href="/mcp" data-astro-cid-gcn2mc3v>MCP</a><a href="/loops" data-astro-cid-gcn2mc3v>Loops</a><a href="/plugins" data-astro-cid-gcn2mc3v>Plugins</a> <a href="/by" data-astro-cid-gcn2mc3v>Maintainers</a> <a href="/new" data-astro-cid-gcn2mc3v>Recently updated</a> <a href="/stats" data-astro-cid-gcn2mc3v>Ecosystem stats</a> </div> <div class="foot-col" data-astro-cid-gcn2mc3v> <h4 data-astro-cid-gcn2mc3v>More</h4> <a href="/mcp-server" data-astro-cid-gcn2mc3v>MCP Server</a> <a href="/cli" data-astro-cid-gcn2mc3v>CLI</a> <a href="/digest" data-astro-cid-gcn2mc3v>Digest</a> <a href="/playbook" data-astro-cid-gcn2mc3v>Playbook</a> <a href="/about" data-astro-cid-gcn2mc3v>About</a> <a href="/advertise" data-astro-cid-gcn2mc3v>Advertise</a> <a href="/privacy" data-astro-cid-gcn2mc3v>Privacy</a> <a href="/terms" data-astro-cid-gcn2mc3v>Terms</a> </div> </div> <div class="wrap foot-bottom" data-astro-cid-gcn2mc3v> <span data-astro-cid-gcn2mc3v>© 2026 getagentictools</span> </div> </footer> <div class="palette" data-palette hidden data-astro-cid-xao2j2xx> <div class="palette-backdrop" data-palette-close data-astro-cid-xao2j2xx></div> <div class="palette-box" role="dialog" aria-modal="true" aria-label="Search" data-astro-cid-xao2j2xx> <div class="palette-input-row" data-astro-cid-xao2j2xx> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" data-astro-cid-xao2j2xx><circle cx="11" cy="11" r="7" data-astro-cid-xao2j2xx></circle><path d="m21 21-4.3-4.3" data-astro-cid-xao2j2xx></path></svg> <input type="search" placeholder="Search skills, plugins, MCP servers, loops…" data-palette-input autocomplete="off" data-astro-cid-xao2j2xx> <kbd data-astro-cid-xao2j2xx>esc</kbd> </div> <div class="palette-results" data-palette-results data-astro-cid-xao2j2xx> <p class="palette-hint" data-astro-cid-xao2j2xx>Type to search across the whole catalog.</p> </div> </div> </div> <script type="module">const r=document.querySelector("[data-palette]"),o=document.querySelector("[data-palette-input]"),u=document.querySelector("[data-palette-results]");let n=null,s;const d="Type to search across the whole catalog.",a=e=>{u.innerHTML=`<p class="palette-hint">${e}</p>`};async function p(){if(n)return n;try{return n=await import("/pagefind/pagefind.js"),await n.options?.({excerptLength:15}),n}catch{return null}}function f(){r.hidden=!1,document.body.style.overflow="hidden",o.focus(),p()}function c(){r.hidden=!0,document.body.style.overflow="",o.value="",a(d)}document.querySelectorAll("[data-search-open]").forEach(e=>e.addEventListener("click",f));document.querySelectorAll("[data-palette-close]").forEach(e=>e.addEventListener("click",c));document.addEventListener("keydown",e=>{(e.metaKey||e.ctrlKey)&&e.key==="k"&&(e.preventDefault(),r.hidden?f():c()),e.key==="Escape"&&!r.hidden&&c()});async function y(e){const l=await p();if(!l){a("Search is available on the deployed site.");return}if(!e.trim()){a(d);return}const h=await l.search(e),i=await Promise.all(h.results.slice(0,8).map(t=>t.data()));if(!i.length){a("No results.");return}u.innerHTML=i.map(t=>`<a class="p-result" href="${t.url}"><h4>${t.meta?.title??t.url}</h4><p>${t.excerpt}</p></a>`).join("")}o?.addEventListener("input",()=>{clearTimeout(s),s=setTimeout(()=>y(o.value),140)});</script> <vercel-analytics data-props="{}" data-params="{"category":"loops","slug":"senara-solutions-mika"}" data-pathname="/loops/senara-solutions-mika.html"></vercel-analytics> <script type="module">var v=()=>{window.va||(window.va=function(...i){window.vaq||(window.vaq=[]),window.vaq.push(i)})},w="@vercel/analytics",h="2.0.1";function f(){return typeof window<"u"}function p(){try{const e="production"}catch{}return"production"}function y(e="auto"){if(e==="auto"){window.vam=p();return}window.vam=e}function m(){return(f()?window.vam:p())||"production"}function d(){return m()==="development"}function b(e,i){if(!e||!i)return e;let n=e;try{const t=Object.entries(i);for(const[r,o]of t)if(!Array.isArray(o)){const a=u(o);a.test(n)&&(n=n.replace(a,`/[${r}]`))}for(const[r,o]of t)if(Array.isArray(o)){const a=u(o.join("/"));a.test(n)&&(n=n.replace(a,`/[...${r}]`))}return n}catch{return e}}function u(e){return new RegExp(`/${g(e)}(?=[/?#]|$)`)}function g(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function E(e){return e.scriptSrc?s(e.scriptSrc):d()?"https://va.vercel-scripts.com/v1/script.debug.js":e.basePath?s(`${e.basePath}/insights/script.js`):"/_vercel/insights/script.js"}function S(e,i){var n;let t=e;if(i)try{t={...(n=JSON.parse(i))==null?void 0:n.analytics,...e}}catch{}y(t.mode);const r={sdkn:w+(t.framework?`/${t.framework}`:""),sdkv:h};return t.disableAutoTrack&&(r.disableAutoTrack="1"),t.viewEndpoint&&(r.viewEndpoint=s(t.viewEndpoint)),t.eventEndpoint&&(r.eventEndpoint=s(t.eventEndpoint)),t.sessionEndpoint&&(r.sessionEndpoint=s(t.sessionEndpoint)),d()&&t.debug===!1&&(r.debug="false"),t.dsn&&(r.dsn=t.dsn),t.endpoint?r.endpoint=t.endpoint:t.basePath&&(r.endpoint=s(`${t.basePath}/insights`)),{beforeSend:t.beforeSend,src:E(t),dataset:r}}function s(e){return e.startsWith("http://")||e.startsWith("https://")||e.startsWith("/")?e:`/${e}`}function k(e={debug:!0},i){var n;if(!f())return;const{beforeSend:t,src:r,dataset:o}=S(e,i);if(v(),t&&((n=window.va)==null||n.call(window,"beforeSend",t)),document.head.querySelector(`script[src*="${r}"]`))return;const a=document.createElement("script");a.src=r;for(const[c,l]of Object.entries(o))a.dataset[c]=l;a.defer=!0,a.onerror=()=>{const c=d()?"Please check if any ad blockers are enabled and try again.":"Be sure to enable Web Analytics for your project and deploy again. See https://vercel.com/docs/analytics/quickstart for more information.";console.log(`[Vercel Web Analytics] Failed to load script from ${r}. ${c}`)},document.head.appendChild(a)}function $({route:e,path:i}){var n;(n=window.va)==null||n.call(window,"pageview",{route:e,path:i})}function A(){try{return}catch{}}function j(){try{return'{"analytics":{"scriptSrc":"32ea31ac6eaa2815/script.js","viewEndpoint":"32ea31ac6eaa2815/view","eventEndpoint":"32ea31ac6eaa2815/event","sessionEndpoint":"32ea31ac6eaa2815/session"},"speedInsights":{"scriptSrc":"16663ccdea61a328/script.js","endpoint":"16663ccdea61a328/vitals"}}'}catch{}}customElements.define("vercel-analytics",class extends HTMLElement{constructor(){super();try{const i=JSON.parse(this.dataset.props??"{}"),n=JSON.parse(this.dataset.params??"{}");k({...i,disableAutoTrack:!0,framework:"astro",basePath:A(),beforeSend:window.webAnalyticsBeforeSend},j());const t=this.dataset.pathname;$({route:b(t??"",n),path:t})}catch(i){throw new Error(`Failed to parse WebAnalytics properties: ${i}`)}}});</script> </body></html> <script type="module">function d(t,n){const o=t.querySelector(".btn-ico")??t,c=o.textContent;o.textContent=n,setTimeout(()=>o.textContent=c,1200)}document.querySelectorAll("[data-copy]").forEach(t=>t.addEventListener("click",()=>{navigator.clipboard.writeText(t.dataset.copy??""),d(t,"Copied")}));const r=document.querySelector("[data-body-src]")?.value??"";document.querySelectorAll("[data-copy-body]").forEach(t=>t.addEventListener("click",()=>{navigator.clipboard.writeText(r),t.textContent="Copied"}));const a=document.querySelector("[data-llm-trigger]"),e=document.querySelector("[data-llm-menu]");a?.addEventListener("click",t=>{t.stopPropagation(),e.hidden=!e.hidden});document.addEventListener("click",()=>{e&&(e.hidden=!0)});</script>