Implement

Implement a GitHub issue end-to-end: fetch the issue, plan, code with approval, commit incrementally, and generate a PR summary.

armadaproject updated 1mo ago
Claude CodeGeneric
View source ↗
Implement a GitHub issue end-to-end: fetch the issue, plan, code with approval, commit incrementally, and generate a PR summary.

The argument is an issue number (e.g. `/implement 42`) or a full GitHub URL (e.g. `/implement https://github.com/armadaproject/armada-spark/issues/42`). If no argument is given, ask the user.

## Phase 1: Fetch issue

1. Parse the argument:
   - If it is a full URL like `https://github.com/{owner}/{repo}/issues/{number}`, extract `{owner}/{repo}` and `{number}`.
   - If it is just a number, use the current repo (run `gh repo view --json nameWithOwner -q .nameWithOwner` to get it).
2. Fetch issue details:

gh issue view --repo <owner/repo> --json title,body,labels,assignees,comments

3. Display a summary to the programmer:
- Issue number and title
- Labels (if any)
- Body (truncated to ~40 lines if longer)
- Number of comments and any noteworthy discussion points
4. Ask the programmer to confirm this is the right issue before proceeding. Use AskUserQuestion with options: "Proceed", "Show full issue body", "Cancel".

## Phase 2: Branch setup

1. List all configured remotes: `git remote -v`
2. If there is more than one remote, ask the programmer which remote to use as upstream using AskUserQuestion (list the remote names as options).
If there is only one remote, use it automatically.
3. Fetch and update master from the chosen remote:

git fetch git checkout master git pull master

4. Create a new branch from master. The branch name must follow this convention:
- Format: `<type>/<short-slug>` where `<type>` is a Conventional Commits type (`feat`, `fix`, `refactor`, `docs`, `chore`, etc.) and `<short-slug>` is a kebab-case summary derived from the issue title (3-5 words max).
- Examples: `feat/dynamic-allocation-support`, `fix/event-watcher-reconnect`, `refactor/pod-spec-converter`
- Pick the type based on the issue labels and description (e.g. a bug report maps to `fix/`, a feature request to `feat/`).

git checkout -b /

5. Confirm to the programmer: "Created branch `<branch-name>` from `<remote>/master`."

## Phase 3: Plan

1. Based on the issue description, explore the codebase to understand the relevant code paths. Use subagents to search for files, classes, and patterns referenced in or implied by the issue.
2. Create an implementation plan with numbered steps. Each step should be a logical, committable unit of work. The plan must include:
- A 1-2 sentence summary of the issue
- Numbered steps, where each step has a title, a description of what to change, and the affected file paths
3. Save the plan to `plans/implement-<issue-number>.md` using this format:

Issue #: </h2> <p> <1-2 sentence summary of what the issue asks for></p> <h2>Steps</h2> <ol> <li><step title> - <what to change and where> - Files: <path/to/file.scala> </li> <li><step title> - <what to change and where> - Files: <path/to/file.scala, path/to/other.scala></li> </ol> <pre><code>4. Show the full plan to the programmer for approval. 5. Ask the programmer using AskUserQuestion with options: "Approve plan", "Modify plan", "Cancel". 6. If the programmer wants modifications, iterate on the plan until approved. ## Phase 4: Execute step by step For each step in the approved plan: 1. Announce the step: "Step <n>/<total>: <step title>" 2. Make the code changes for that step 3. If the step involves logic changes, run tests (`mvn test`) and show the result 4. Show the programmer a brief summary of what changed (key files and the nature of the change) 5. Ask the programmer using AskUserQuestion with options: "Commit this step", "Revise changes", "Skip this step", "Stop here". 6. If the programmer picks "Commit this step", run the /commit skill to commit the changes 7. If the programmer picks "Revise changes", iterate until they are satisfied 8. If the programmer picks "Skip this step", move to the next step without committing 9. If the programmer picks "Stop here", skip all remaining steps and jump to Phase 5 After each commit, briefly confirm the commit was made and move to the next step. ## Phase 5: Summary 1. After all steps are complete (or the programmer stops early): - Run the /summary skill to generate a PR description based on all commits made during this session - Show the summary to the programmer 2. Do NOT create a PR or push. Just present the summary for the programmer to use when they are ready. 3. If no commits were made (e.g. the programmer cancelled early), skip the summary and say so. ## Rules - Never make code changes without programmer approval - Always show what changed after each step before committing - The programmer can modify, skip, reorder, or stop steps at any point - Save the plan file before starting execution so the programmer has a reference - Each commit should be a logical unit (one step = one commit, unless the step is trivial) - If the issue is from a different repo (not the current one), fetch it via the full URL but make changes in the current repo - No emojis in any output - Do not create a PR or push to remote — only local commits and a summary - If a step requires running tests, run them and show results before committing - Use subagents for codebase exploration and code changes; keep the main flow focused on coordination and programmer interaction $ARGUMENTS </code></pre> </div> <textarea data-body-src hidden data-astro-cid-2e7mcdih>```md Implement a GitHub issue end-to-end: fetch the issue, plan, code with approval, commit incrementally, and generate a PR summary. The argument is an issue number (e.g. `/implement 42`) or a full GitHub URL (e.g. `/implement https://github.com/armadaproject/armada-spark/issues/42`). If no argument is given, ask the user. ## Phase 1: Fetch issue 1. Parse the argument: - If it is a full URL like `https://github.com/{owner}/{repo}/issues/{number}`, extract `{owner}/{repo}` and `{number}`. - If it is just a number, use the current repo (run `gh repo view --json nameWithOwner -q .nameWithOwner` to get it). 2. Fetch issue details: ``` gh issue view <number> --repo <owner/repo> --json title,body,labels,assignees,comments ``` 3. Display a summary to the programmer: - Issue number and title - Labels (if any) - Body (truncated to ~40 lines if longer) - Number of comments and any noteworthy discussion points 4. Ask the programmer to confirm this is the right issue before proceeding. Use AskUserQuestion with options: "Proceed", "Show full issue body", "Cancel". ## Phase 2: Branch setup 1. List all configured remotes: `git remote -v` 2. If there is more than one remote, ask the programmer which remote to use as upstream using AskUserQuestion (list the remote names as options). If there is only one remote, use it automatically. 3. Fetch and update master from the chosen remote: ``` git fetch <remote> git checkout master git pull <remote> master ``` 4. Create a new branch from master. The branch name must follow this convention: - Format: `<type>/<short-slug>` where `<type>` is a Conventional Commits type (`feat`, `fix`, `refactor`, `docs`, `chore`, etc.) and `<short-slug>` is a kebab-case summary derived from the issue title (3-5 words max). - Examples: `feat/dynamic-allocation-support`, `fix/event-watcher-reconnect`, `refactor/pod-spec-converter` - Pick the type based on the issue labels and description (e.g. a bug report maps to `fix/`, a feature request to `feat/`). ``` git checkout -b <type>/<short-slug> ``` 5. Confirm to the programmer: "Created branch `<branch-name>` from `<remote>/master`." ## Phase 3: Plan 1. Based on the issue description, explore the codebase to understand the relevant code paths. Use subagents to search for files, classes, and patterns referenced in or implied by the issue. 2. Create an implementation plan with numbered steps. Each step should be a logical, committable unit of work. The plan must include: - A 1-2 sentence summary of the issue - Numbered steps, where each step has a title, a description of what to change, and the affected file paths 3. Save the plan to `plans/implement-<issue-number>.md` using this format: ``` ## Issue #<number>: <title> <1-2 sentence summary of what the issue asks for> ## Steps 1. <step title> - <what to change and where> - Files: <path/to/file.scala> 2. <step title> - <what to change and where> - Files: <path/to/file.scala, path/to/other.scala> ``` 4. Show the full plan to the programmer for approval. 5. Ask the programmer using AskUserQuestion with options: "Approve plan", "Modify plan", "Cancel". 6. If the programmer wants modifications, iterate on the plan until approved. ## Phase 4: Execute step by step For each step in the approved plan: 1. Announce the step: "Step <n>/<total>: <step title>" 2. Make the code changes for that step 3. If the step involves logic changes, run tests (`mvn test`) and show the result 4. Show the programmer a brief summary of what changed (key files and the nature of the change) 5. Ask the programmer using AskUserQuestion with options: "Commit this step", "Revise changes", "Skip this step", "Stop here". 6. If the programmer picks "Commit this step", run the /commit skill to commit the changes 7. If the programmer picks "Revise changes", iterate until they are satisfied 8. If the programmer picks "Skip this step", move to the next step without committing 9. If the programmer picks "Stop here", skip all remaining steps and jump to Phase 5 After each commit, briefly confirm the commit was made and move to the next step. ## Phase 5: Summary 1. After all steps are complete (or the programmer stops early): - Run the /summary skill to generate a PR description based on all commits made during this session - Show the summary to the programmer 2. Do NOT create a PR or push. Just present the summary for the programmer to use when they are ready. 3. If no commits were made (e.g. the programmer cancelled early), skip the summary and say so. ## Rules - Never make code changes without programmer approval - Always show what changed after each step before committing - The programmer can modify, skip, reorder, or stop steps at any point - Save the plan file before starting execution so the programmer has a reference - Each commit should be a logical unit (one step = one commit, unless the step is trivial) - If the issue is from a different repo (not the current one), fetch it via the full URL but make changes in the current repo - No emojis in any output - Do not create a PR or push to remote — only local commits and a summary - If a step requires running tests, run them and show results before committing - Use subagents for codebase exploration and code changes; keep the main flow focused on coordination and programmer interaction $ARGUMENTS ```</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 Implement?</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>[Implement on getagentictools](https://getagentictools.com/loops/armadaproject-implement?ref=badge)</code> <button class="btn" data-copy="[Implement on getagentictools](https://getagentictools.com/loops/armadaproject-implement?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/armadaproject-implement</code> <button class="btn" data-copy="npx agentictools info loops/armadaproject-implement" 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/brianmills2718-create-implementation-session" class="card " data-astro-cid-yk5uq4gt> <div class="card-top" data-astro-cid-yk5uq4gt> <img class="avatar" src="https://github.com/BrianMills2718.png?size=80" alt="" loading="lazy" width="34" height="34" data-astro-cid-yk5uq4gt> <span class="name" data-astro-cid-yk5uq4gt>Implement</span> </div> <p class="desc" data-astro-cid-yk5uq4gt>Implement all tasks in CLAUDE.md with verification. Continue until all tasks complete without stopping.</p> <div class="meta" data-astro-cid-yk5uq4gt> <span data-astro-cid-yk5uq4gt>BrianMills2718</span> </div> </a><a href="/loops/dchuuuuuu-implement" class="card " data-astro-cid-yk5uq4gt> <div class="card-top" data-astro-cid-yk5uq4gt> <img class="avatar" src="https://github.com/Dchuuuuuu.png?size=80" alt="" loading="lazy" width="34" height="34" data-astro-cid-yk5uq4gt> <span class="name" data-astro-cid-yk5uq4gt>Implement</span> </div> <p class="desc" data-astro-cid-yk5uq4gt>Load phase 03 (implement) for the current workspace. Repeat until all todos complete.</p> <div class="meta" data-astro-cid-yk5uq4gt> <span data-astro-cid-yk5uq4gt>Dchuuuuuu</span> </div> </a><a href="/loops/hodisr-implement-tasks" class="card " data-astro-cid-yk5uq4gt> <div class="card-top" data-astro-cid-yk5uq4gt> <img class="avatar" src="https://github.com/hodisr.png?size=80" alt="" loading="lazy" width="34" height="34" data-astro-cid-yk5uq4gt> <span class="name" data-astro-cid-yk5uq4gt>Implement</span> </div> <p class="desc" data-astro-cid-yk5uq4gt>You are a senior engineer executing tasks from a task list using test-driven development.</p> <div class="meta" data-astro-cid-yk5uq4gt> <span data-astro-cid-yk5uq4gt>hodisr</span> </div> </a><a href="/loops/iamsajidjaved-implement" class="card " data-astro-cid-yk5uq4gt> <div class="card-top" data-astro-cid-yk5uq4gt> <img class="avatar" src="https://github.com/iamsajidjaved.png?size=80" alt="" loading="lazy" width="34" height="34" data-astro-cid-yk5uq4gt> <span class="name" data-astro-cid-yk5uq4gt>Implement</span> </div> <p class="desc" data-astro-cid-yk5uq4gt>You are implementing a single spec for the AutoCTR project (Google CTR simulation tool: Node.js + Neon PostgreSQL + PM2 workers +…</p> <div class="meta" data-astro-cid-yk5uq4gt> <span data-astro-cid-yk5uq4gt>iamsajidjaved</span> </div> </a><a href="/loops/mike-mauer-il-2-implement-execute-task-loop-ralph-pattern" class="card " data-astro-cid-yk5uq4gt> <div class="card-top" data-astro-cid-yk5uq4gt> <img class="avatar" src="https://github.com/mike-mauer.png?size=80" alt="" loading="lazy" width="34" height="34" data-astro-cid-yk5uq4gt> <span class="name" data-astro-cid-yk5uq4gt>Il 2 Implement</span> </div> <p class="desc" data-astro-cid-yk5uq4gt>The loop script (.claude/scripts/implement-loop.sh) provides: - Fresh context per task (calls Claude CLI for each) - Automatic re…</p> <div class="meta" data-astro-cid-yk5uq4gt> <span data-astro-cid-yk5uq4gt>mike-mauer</span> </div> </a><a href="/loops/mojisejr-implementation-workflow-command" class="card " data-astro-cid-yk5uq4gt> <div class="card-top" data-astro-cid-yk5uq4gt> <img class="avatar" src="https://github.com/mojisejr.png?size=80" alt="" loading="lazy" width="34" height="34" data-astro-cid-yk5uq4gt> <span class="name" data-astro-cid-yk5uq4gt>Impl</span> </div> <p class="desc" data-astro-cid-yk5uq4gt>2. Analyze Codebase & Dependencies - Explore relevant code to understand existing patterns - Check app directory structure…</p> <div class="meta" data-astro-cid-yk5uq4gt> <span data-astro-cid-yk5uq4gt>mojisejr</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":"armadaproject-implement"}" data-pathname="/loops/armadaproject-implement.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>