diff --git a/.claude/settings.local.json b/.claude/settings.local.json deleted file mode 100644 index c5a9c62..0000000 --- a/.claude/settings.local.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "permissions": { - "additionalDirectories": [ - "c:\\Dave\\Projects\\DaveGoosem.github.io\\.claude" - ] - } -} diff --git a/.gitignore b/.gitignore index 10ef2ec..962f929 100644 --- a/.gitignore +++ b/.gitignore @@ -45,3 +45,4 @@ yarn-error.log* # Contentlayer .contentlayer +.claude/settings.local.json diff --git a/CLAUDE.md b/CLAUDE.md index 28c1cda..a256ddf 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -6,7 +6,7 @@ - **Content**: Contentlayer2 — MDX files in `data/blog/` and `data/authors/` - **Styles**: Tailwind CSS 3 (class-based dark mode, Space Grotesk font) - **Deployment**: Vercel -- **Package manager**: `yarn` — never use `npm install` or `npm run` +- **Package manager**: `npm` - **Comments**: Giscus (GitHub Discussions), configured via env vars - **Search**: kbar (local `public/search.json`, regenerated on build) - **Analytics**: Google Analytics via Pliny @@ -14,9 +14,9 @@ ## Key Commands ```bash -yarn dev # start dev server -yarn build # production build + postbuild (RSS, search index) -yarn lint # ESLint with auto-fix +npm run dev # start dev server +npm run build # production build + postbuild (RSS, search index) +npm run lint # ESLint with auto-fix ``` ## Path Aliases (tsconfig.json) @@ -58,7 +58,7 @@ The following are already implemented — do not duplicate or replace them: - Do not add API routes — this is a static/SSG blog with no backend - Do not add a database or server-side state -- Contentlayer2 auto-generates TypeScript types on `yarn build` / `yarn dev` — do not edit `.contentlayer/` manually +- Contentlayer2 auto-generates TypeScript types on `npm run build` / `npm run dev` — do not edit `.contentlayer/` manually - ESLint uses flat config (`eslint.config.mjs`) — not `.eslintrc` - External links require `target="_blank"` and `rel="noopener noreferrer"` (enforced by ESLint) @@ -70,4 +70,4 @@ The following are already implemented — do not duplicate or replace them: **Remote images** — `next/image` only proxies domains listed in `next.config.js` → `images.remotePatterns`. Currently only `picsum.photos` is allowed. Add new domains there before using external image URLs in posts or components. -**Bundle analysis** — run `ANALYZE=true yarn build` to open the webpack bundle visualiser. Useful before committing large new dependencies. +**Bundle analysis** — run `ANALYZE=true npm run build` to open the webpack bundle visualiser. Useful before committing large new dependencies. diff --git a/app/tag-data.json b/app/tag-data.json index 06fa45e..ea5164f 100644 --- a/app/tag-data.json +++ b/app/tag-data.json @@ -1,41 +1,43 @@ { - "atomic-design": 1, + "sitecoreai": 9, + "nextjs": 6, + "ai": 2, + "strategy": 2, + "claude": 1, + "development-workflow": 1, "sitecore": 39, - "headless-cms": 1, + "search": 1, + "sitecore-search": 1, + "composable": 1, + "dxp": 1, + "architecture": 5, + "xmcloud": 8, "multi-site": 2, + "react": 1, + "vercel": 4, + "atomic-design": 1, + "headless-cms": 1, "design-systems": 1, + "storybook": 2, + "saas": 6, + "unit-testing": 2, + "github-workflows": 1, + "pages": 1, + "security": 1, + "headless": 11, + "jss": 9, "azure": 5, + "cicd": 4, "cloud": 7, - "xmcloud": 8, - "sitecoreai": 8, - "pages": 1, - "saas": 6, + "sitecore-send": 2, + "cdp": 1, "sxa": 4, - "jss": 9, - "headless": 11, + "seo": 1, "devops": 2, "searchstax": 2, "solr": 6, - "cicd": 4, - "vercel": 4, "helix": 3, - "react": 1, - "nextjs": 5, - "architecture": 5, - "sitecore-send": 2, - "cdp": 1, - "search": 1, - "sitecore-search": 1, - "aws": 1, "accessibility": 1, - "security": 1, - "storybook": 2, - "unit-testing": 2, "aspnet": 1, - "seo": 1, - "github-workflows": 1, - "composable": 1, - "dxp": 1, - "ai": 1, - "strategy": 1 + "aws": 1 } diff --git a/data/blog/how-sitecore-teams-can-adopt-claude-and-copilot-without-burning-through-token-credits.mdx b/data/blog/how-sitecore-teams-can-adopt-claude-and-copilot-without-burning-through-token-credits.mdx new file mode 100644 index 0000000..e3fd5f0 --- /dev/null +++ b/data/blog/how-sitecore-teams-can-adopt-claude-and-copilot-without-burning-through-token-credits.mdx @@ -0,0 +1,201 @@ +--- +title: 'How Sitecore Teams Can Adopt Claude and Copilot Without Burning Through Your Token Credits Mid-Sprint' +date: '2026-05-29' +tags: ['SitecoreAI', 'Next.js', 'AI', 'Strategy', 'Claude', 'Development Workflow'] +draft: false +summary: > + A practical guide for Sitecore teams adopting Claude and Copilot — how to govern token + credit usage across your team so nobody burns through their allowance mid-sprint and leaves + the rest of the cycle without AI assistance. +layout: DaveLayout +images: + [ + '/static/images/posts/2026/how-sitecore-teams-can-adopt-claude-and-copilot-without-burning-through-token-credits/banner-image.png', + ] +authors: ['default'] +--- + +AI tools promised to supercharge development teams. And they do — right up until someone hits their token credit limit mid-sprint. One developer's unfocused debugging session burns through their allowance, and suddenly the rest of the sprint has to be completed without AI assistance. No autocomplete. No architecture review. Back to manual everything, mid-cycle. + +This is the adoption failure mode nobody warns you about. It's not about AI being bad, and it's not about unexpected bills — most teams sensibly set per-user credit limits upfront. It's about uncoordinated usage exhausting those limits at the worst possible time. + +This post is the playbook for avoiding that. Specifically for SitecoreAI + Next.js teams adopting Claude Code and GitHub Copilot: how to structure your project so Claude works efficiently, how to divide AI responsibility across your team, and how to govern usage so your token credits last the full sprint. + +## 1. Understanding the Token Economy + +Before you can govern AI credit usage, you need a basic mental model of what costs money. + +**Tokens are not requests.** Both Claude and Copilot charge based on the amount of text processed — input (what you send to the model, including context) plus output (what the model generates). A short, focused prompt on a single file costs very little. A session where Claude reads your entire repository to answer a question about one component can cost 10–50x more. + +**Context window size is the biggest lever.** Every time Claude responds, it processes everything in its current context window — your conversation history, any files you've attached or it has auto-read, and any system instructions. The larger that window, the more tokens consumed per response. This means: + +- Auto-attaching large generated files (GraphQL types, Contentlayer output, `node_modules`) massively inflates cost +- Long sessions accumulate history — a 2-hour debugging session in one window costs far more than four 30-minute focused sessions +- Opening Claude at the repository root pulls in much more context than opening it inside a specific feature folder + +**The two failure modes to avoid:** + +1. **Over-reliance** — one or two developers burn through their credit allowance on exploratory, open-ended sessions with no clear outcome. The classic culprit: "help me understand this whole codebase" prompts that consume enormous context for marginal return. Once the limit is hit, they're without AI tools for the rest of the cycle. +2. **Under-use** — the rest of the team avoids AI tools for fear of exhausting their credits too fast, negating the productivity benefit entirely. This happens when there's no clarity on what AI is _for_ and no shared pattern for using it efficiently. + +The goal is to treat AI credits like any other sprint resource — plan them, allocate them by workstream, and track them. + +## 2. Planning Phase: Define Your Team's AI Boundaries + +The most effective token-saving measure happens before a single prompt is written: agreeing, as a team, what each AI tool is responsible for. + +### Divide the tools by job + +A practical split for SitecoreAI teams: + +| Tool | Best used for | +| ------------------ | ---------------------------------------------------------------------------------------------------------------------------------- | +| **Claude Code** | Architecture decisions, scaffolding new components/features, complex refactors, PR reviews, writing CLAUDE.md files | +| **GitHub Copilot** | Inline autocomplete, boilerplate generation, unit test scaffolding | +| **Manual** | Security-sensitive logic, legacy data migrations, anything where reading the output carefully matters more than generating it fast | + +Running both Claude and Copilot simultaneously on the same problem is the fastest way to burn budget on duplicate work. Pick the right tool for the job and use the other one for something else. + +### Assign an AI owner per workstream + +For any project, nominate one developer per workstream (components, serialization, search, etc.) to own the CLAUDE.md setup and context quality for that area. This person: + +- Writes and maintains the CLAUDE.md files for their workstream +- Defines which files Claude should and shouldn't read +- Shares any reusable slash commands or prompts with the broader team +- Is the first port of call when someone has a "why is Claude giving bad answers?" question + +This isn't gatekeeping — everyone still uses AI. It's just ensuring there's someone accountable for keeping context tight and relevant. + +### Set budgets before the sprint starts + +Rough budget guidance to adapt to your team's situation: + +- **Planning phase** (architecture, scaffolding, CLAUDE.md setup): typically higher token spend — you're establishing patterns the whole team will reuse +- **Build phase** (feature development): lower per-session, but more frequent — keep sessions short and scoped +- **Review phase** (PR reviews, diff analysis): very efficient — reviewing a diff is far cheaper than re-reading whole files + +Whatever your actual credit limit, set an internal team alert at 70% consumption. That's your signal to review usage before you hit the wall, not after. + +### Make AI a retro agenda item + +Once per sprint, spend 10 minutes reviewing: What did we use AI for? Where did it save time? Where did it burn credits on something we could have done manually faster? This loop closes over time into a team that uses AI precisely rather than reflexively. + +## 3. Structuring Your SitecoreAI Next.js Solution for Claude + +This is where concrete technical choices make the biggest difference. A well-structured project means Claude reads less, understands more, and costs less per useful response. + +### 3a — CLAUDE.md Placement Strategy + +Claude Code reads `CLAUDE.md` files hierarchically — the root file first, then any `CLAUDE.md` in subdirectories as you navigate into them. Use this to your advantage. + +**Root `CLAUDE.md`** — stack overview, package manager, key scripts, path aliases, deployment target, and a clear list of what Claude must never touch (generated files, platform SDK files, etc.). Keep it concise: this file is loaded on every session. + +**Feature-area `CLAUDE.md` files** — place these inside `src/components/`, `src/lib/`, and `.sitecore/` to give Claude narrower, more relevant context when working in those areas. A Claude session opened inside `src/components/Navigation/` should only need to understand component conventions — not your serialization strategy. + +**`.sitecore/CLAUDE.md`** — describe the Sitecore CLI config, what content serialization paths are used, and critically: which files are generated by the platform vs hand-edited. This stops Claude from suggesting edits to files it should never touch. + +### 3b — What to Exclude + +The single biggest context-reduction win is telling Claude what not to read. Add these exclusions explicitly to your root `CLAUDE.md` under a "Do not read" or "Ignore" section: + +``` +# Claude should not read these — generated or third-party files +node_modules/ +.next/ +.sitecore/platform/ # generated Sitecore platform files +src/graphql/generated/ # auto-generated GraphQL types from schema introspection +*.generated.ts +``` + +These directories are either generated output (reading them wastes tokens and produces stale advice) or third-party platform code (Claude can't meaningfully help here and it inflates context enormously). + +### 3c — Annotated File Tree + +Here's a typical SitecoreAI JSS Next.js solution with CLAUDE.md files placed at the right levels: + +``` +/ +├── CLAUDE.md ← stack, npm scripts, path aliases, constraints, exclusions +├── src/ +│ ├── components/ +│ │ ├── CLAUDE.md ← component naming conventions, Storybook patterns, atomic structure +│ │ ├── Navigation/ +│ │ ├── Hero/ +│ │ └── ... +│ ├── lib/ +│ │ ├── CLAUDE.md ← GraphQL helper patterns, SDK wrapper conventions, what's generated +│ │ ├── graphql/ +│ │ │ └── generated/ ← EXCLUDE: auto-generated types +│ │ └── ... +│ ├── pages/ (or app/) +│ │ └── ... +│ └── styles/ +├── .sitecore/ +│ ├── CLAUDE.md ← CLI commands, serialization paths, platform/ is generated +│ ├── platform/ ← EXCLUDE: generated Sitecore platform files +│ └── items/ ← serialized content items (hand-managed) +├── scripts/ +└── package.json +``` + +The key insight: each `CLAUDE.md` makes Claude smarter about that specific area _without_ requiring it to read the whole project every time. + +### 3d — Scope Your Claude Sessions + +How you open Claude Code matters as much as what you put in CLAUDE.md — but the right entry point depends on your solution's shape. + +The advice to open Claude inside a specific component folder works well for isolated, self-contained work. In practice, most SitecoreAI Next.js solutions share a significant amount of atomic components, design tokens, utility functions, and lib logic across features. Opening too deep in the tree means Claude lacks the shared context it actually needs, and you end up pasting the same foundational files into every session manually. + +A better rule: **open at the lowest directory that naturally contains everything relevant to the task.** For a feature that touches only one component and its styles, that might be `src/components/Navigation/`. For a feature that draws on shared atoms, layout primitives, and a GraphQL helper, opening at `src/` is more appropriate — Claude will load the relevant CLAUDE.md for that level and have sight of the shared structure. + +From there, be deliberate about what you pull in: + +- **Use `@file` references for cross-cutting dependencies.** If your task touches a shared design token file, a base component, or a utility in `src/lib/`, name those files explicitly rather than relying on Claude to discover them. Auto-discovery can miss important files or pull in irrelevant ones. +- **One task per session.** Long sessions accumulate conversation history, which is re-processed on every response. A 3-hour sprawling session is dramatically more expensive than three focused 45-minute ones. +- **Close and reopen** when you switch context. It feels slightly inefficient but it's the right habit — you shed irrelevant history and start with a clean, cheap context. + +## 4. Build Phase: Day-to-Day Credit-Smart Habits + +Good project setup reduces baseline cost. Good daily habits reduce the variance — the surprise sessions that consume 10x the expected budget. + +**One ticket, one session.** Define what done looks like before you open Claude. A session with a clear scope ("implement the `NavigationItem` component to match the Storybook story") costs a fraction of an open-ended one ("help me figure out the navigation architecture"). + +**Review diffs, not files.** When asking Claude to review code, paste the diff — not the whole file. A 50-line diff review costs perhaps 5% of a whole-file review and gives equivalent (often better) feedback because Claude focuses on what changed. + +**Build a shared prompts library.** Create a `.claude/commands/` folder in your repository and commit reusable slash commands: `/new-component`, `/review-pr`, `/serialization-check`. Every developer benefits from prompts that have already been refined, and nobody re-invents an expensive prompt from scratch. + +**Copilot for boilerplate, Claude for architecture.** Don't run both on the same problem. Use Copilot's inline autocomplete while you're in the flow of writing — it's fast and cheap. Reach for Claude when you need to think through a pattern, review a design decision, or understand why something is failing. + +**Pair AI sessions for complex problems.** When a problem is genuinely hard, pair up: one developer drives the Claude session while the other reviews responses and watches the token count. This catches rabbit holes early — the reviewer can see when the session is drifting and redirect it before costs compound. + +## 5. Governance: Tracking Your Token Usage + +None of the above works without visibility into what's actually being consumed. Here's where to look: + +**Claude usage** — the [Anthropic Console](https://console.anthropic.com) shows per-API-key token consumption with breakdowns by model. If your team shares a project API key, you can see aggregate usage. For per-developer visibility, each developer needs their own key with a credit limit set at the account level — this is the baseline assumption. The question is not whether to set limits, but how to stay well within them. + +**GitHub Copilot Insights** — available in your GitHub organisation settings under "Copilot" → "Usage". Shows accepted suggestions, active users, and activity by repository. Useful for spotting whether Copilot is actually being used or just sitting idle. + +**Set usage alerts well before the limit.** In the Anthropic Console, configure quota alerts at 70% and 90% of each developer's monthly allowance. The 70% alert is your "adjust your approach" trigger — tighten session scope, defer non-essential AI work, prioritise the highest-value tasks for the remainder of the cycle. The 90% alert means AI-assisted work stops for anything that isn't critical. Neither alert should be a surprise; if they are, the sessions leading up to them weren't well governed. + +**Monthly AI health check (10 minutes):** + +- What percentage of the sprint's token usage was on planning vs. build vs. review work? +- Which sessions consumed the most? Were they worth it? +- Are there recurring expensive prompts that could be replaced with a smarter CLAUDE.md or a shared slash command? +- Did anyone exhaust their allowance and revert to manual work? What was the productivity cost of that mid-sprint switch? + +**Rotate the AI owner role.** If the same person sets up all the CLAUDE.md files and shared prompts, that knowledge never spreads. Rotate the role each sprint — the incoming owner reviews what exists, improves one thing, and documents one new pattern. Over six sprints, the whole team is fluent. + +## Conclusion + +The goal isn't to use AI as little as possible — it's to use it as effectively as possible. A team that plans its AI usage like it plans its infrastructure will get genuine leverage from these tools. A team that doesn't will either burn the budget on unfocused sessions or under-use AI out of fear, and end up with the worst of both worlds. + +The SitecoreAI stack is complex enough that well-governed AI assistance is a genuine force multiplier: the composable architecture, the serialization model, the JSS rendering pipeline, the Vercel deployment surface — there's a lot to hold in your head. Claude is genuinely useful here, and Copilot saves real time on the boilerplate. But neither tool can govern itself. + +Get the structure right, set the team norms early, and build the feedback loop. The sprint where you spend an hour on AI setup is the one that saves you ten hours of context-window chaos later. + +--- + +_If this sparked thoughts about the broader mindset shift teams need to make when moving into AI-first development, [What Teams Must Unlearn From the Composable Era](/blog/what-teams-must-unlearn-from-the-composable-era) covers the strategic side of the same conversation._ diff --git a/package-lock.json b/package-lock.json index 9083663..000c76e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,11 +18,11 @@ "github-slugger": "^2.0.0", "gray-matter": "^4.0.2", "image-size": "1.0.0", - "next": "15.5.15", + "next": "15.5.18", "next-contentlayer2": "0.5.8", "next-themes": "^0.3.0", "pliny": "0.4.1", - "postcss": "^8.4.24", + "postcss": "^8.5.10", "react": "18.2.0", "react-dom": "18.2.0", "reading-time": "1.5.0", @@ -275,11 +275,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.29.0", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", + "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -333,12 +335,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.29.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -457,7 +461,9 @@ } }, "node_modules/@babel/helper-globals": { - "version": "7.28.0", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, "license": "MIT", "engines": { @@ -477,25 +483,29 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -516,7 +526,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", "dev": true, "license": "MIT", "engines": { @@ -568,7 +580,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, "license": "MIT", "engines": { @@ -576,7 +590,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, "license": "MIT", "engines": { @@ -617,11 +633,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.29.0", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.29.0" + "@babel/types": "^7.29.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -1158,14 +1176,16 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.29.0", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.7.tgz", + "integrity": "sha512-TM2ZcQLoG2/y4HODiStCo10DibYhWhGWAwVv+EQKmG/7GFl0N+AAmUiXOMKM+aiJ9XBJ9AHVZBvTzMnJ2sM3cQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.29.0" + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1782,29 +1802,33 @@ } }, "node_modules/@babel/template": { - "version": "7.28.6", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.29.0", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", "debug": "^4.3.1" }, "engines": { @@ -1812,12 +1836,14 @@ } }, "node_modules/@babel/types": { - "version": "7.29.0", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -3657,15 +3683,15 @@ } }, "node_modules/@next/env": { - "version": "15.5.15", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.15.tgz", - "integrity": "sha512-vcmyu5/MyFzN7CdqRHO3uHO44p/QPCZkuTUXroeUmhNP8bL5PHFEhik22JUazt+CDDoD6EpBYRCaS2pISL+/hg==", + "version": "15.5.18", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.18.tgz", + "integrity": "sha512-hAV85Ckd9QR6RvH04MEKwsfLTksvFpO47j9xwtoIuvuPnlwecpSi+uZTtm8HirVbtlI2Fnz//xpcSTjFdyJk+g==", "license": "MIT" }, "node_modules/@next/swc-darwin-arm64": { - "version": "15.5.15", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.15.tgz", - "integrity": "sha512-6PvFO2Tzt10GFK2Ro9tAVEtacMqRmTarYMFKAnV2vYMdwWc73xzmDQyAV7SwEdMhzmiRoo7+m88DuiXlJlGeaw==", + "version": "15.5.18", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.18.tgz", + "integrity": "sha512-w0WvQf1n+txiwns/9pwIQteCJpZTbxzO2SE0FLcwuD4v0WEh1JPOjdyxWL21XwJsdpx8cFRjyzxzCS/siP7HcQ==", "cpu": [ "arm64" ], @@ -3679,9 +3705,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "15.5.15", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.15.tgz", - "integrity": "sha512-G+YNV+z6FDZTp/+IdGyIMFqalBTaQSnvAA+X/hrt+eaTRFSznRMz9K7rTmzvM6tDmKegNtyzgufZW0HwVzEqaQ==", + "version": "15.5.18", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.18.tgz", + "integrity": "sha512-znn71QmDuxm+BOaglihMZfvyySMnNljkVIY5Z2TCssBmm+WqL6c19VhtH5ktFkHa8EZ2bnTUpcNcmNSQsg67og==", "cpu": [ "x64" ], @@ -3695,9 +3721,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.5.15", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.15.tgz", - "integrity": "sha512-eVkrMcVIBqGfXB+QUC7jjZ94Z6uX/dNStbQFabewAnk13Uy18Igd1YZ/GtPRzdhtm7QwC0e6o7zOQecul4iC1w==", + "version": "15.5.18", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.18.tgz", + "integrity": "sha512-yPPe5MNL+igZUa+OsqQJisqSfh6oarIuA1Q0BDxljGJhRQyZeP+WRHh7rs/jZUGMh5aY0YdIjXZG0VohkKkUdw==", "cpu": [ "arm64" ], @@ -3711,9 +3737,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.5.15", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.15.tgz", - "integrity": "sha512-RwSHKMQ7InLy5GfkY2/n5PcFycKA08qI1VST78n09nN36nUPqCvGSMiLXlfUmzmpQpF6XeBYP2KRWHi0UW3uNg==", + "version": "15.5.18", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.18.tgz", + "integrity": "sha512-glaCczEWIrHsokFZ3pP08U4BpKxwIdnT+txdOM32OBgpL9Yw4aqx8NejmgtZQZOdstQ5f0L3CasIZudzCuD+nw==", "cpu": [ "arm64" ], @@ -3727,9 +3753,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.5.15", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.15.tgz", - "integrity": "sha512-nplqvY86LakS+eeiuWsNWvfmK8pFcOEW7ZtVRt4QH70lL+0x6LG/m1OpJ/tvrbwjmR8HH9/fH2jzW1GlL03TIg==", + "version": "15.5.18", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.18.tgz", + "integrity": "sha512-oUfg2EgJmU3R0OCOWiokGFUTvZiPfXtriXiuF3YNxRoROCdgvTedHIzYoeKH34gsZxS/V7mHbfq2hpAHwhH1/A==", "cpu": [ "x64" ], @@ -3743,9 +3769,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "15.5.15", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.15.tgz", - "integrity": "sha512-eAgl9NKQ84/sww0v81DQINl/vL2IBxD7sMybd0cWRw6wqgouVI53brVRBrggqBRP/NWeIAE1dm5cbKYoiMlqDQ==", + "version": "15.5.18", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.18.tgz", + "integrity": "sha512-JLxSP3KTd9iu/bvUMQxH7RJo9xKSHf55/6RPE4a6FTSZygGn7uvZbCej0AHXydwkggQGSD9UddSjwv6Xz5ESfA==", "cpu": [ "x64" ], @@ -3759,9 +3785,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.5.15", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.15.tgz", - "integrity": "sha512-GJVZC86lzSquh0MtvZT+L7G8+jMnJcldloOjA8Kf3wXvBrvb6OGe2MzPuALxFshSm/IpwUtD2mIoof39ymf52A==", + "version": "15.5.18", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.18.tgz", + "integrity": "sha512-ir1v7enP52K2HNz3tQQvwF+x7VNxBk1ciiZ18WBPvxf4C59IqdfmHPJYK3vH7rSxpuCVw/8C712wTXNAtEp+NA==", "cpu": [ "arm64" ], @@ -3775,9 +3801,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.5.15", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.15.tgz", - "integrity": "sha512-nFucjVdwlFqxh/JG3hWSJ4p8+YJV7Ii8aPDuBQULB6DzUF4UNZETXLfEUk+oI2zEznWWULPt7MeuTE6xtK1HSA==", + "version": "15.5.18", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.18.tgz", + "integrity": "sha512-LIu5me6QTANCd25E7I5uIEfvgQ06RK7tvHAbYo3zCb3VpxQEPvMcSpd87NwUABDT6MbGPdEGR5VRiK4PPTJhQg==", "cpu": [ "x64" ], @@ -4175,6 +4201,8 @@ }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/base64": { @@ -4182,19 +4210,24 @@ "license": "BSD-3-Clause" }, "node_modules/@protobufjs/codegen": { - "version": "2.0.4", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", + "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", + "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/fetch": { - "version": "1.1.0", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", + "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", "license": "BSD-3-Clause", "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" + "@protobufjs/aspromise": "^1.1.1" } }, "node_modules/@protobufjs/float": { @@ -4202,7 +4235,9 @@ "license": "BSD-3-Clause" }, "node_modules/@protobufjs/inquire": { - "version": "1.1.0", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.2.tgz", + "integrity": "sha512-pa0vFRuws4wkvaXKK1uXZMAwAX4/t8ANaJo45iw/oQHNQ9q5xUzwgFmVJGXiga2BeN+zpX7Vf9vmsiIa2J+MUw==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/path": { @@ -4214,7 +4249,9 @@ "license": "BSD-3-Clause" }, "node_modules/@protobufjs/utf8": { - "version": "1.1.0", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz", + "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==", "license": "BSD-3-Clause" }, "node_modules/@radix-ui/react-compose-refs": { @@ -10679,12 +10716,12 @@ } }, "node_modules/next": { - "version": "15.5.15", - "resolved": "https://registry.npmjs.org/next/-/next-15.5.15.tgz", - "integrity": "sha512-VSqCrJwtLVGwAVE0Sb/yikrQfkwkZW9p+lL/J4+xe+G3ZA+QnWPqgcfH1tDUEuk9y+pthzzVFp4L/U8JerMfMQ==", + "version": "15.5.18", + "resolved": "https://registry.npmjs.org/next/-/next-15.5.18.tgz", + "integrity": "sha512-eKL8zUJkX9Y5lE+RX/2YJoItVdGlIscyVyboeD9wSpp0PaGqjoA4tTpT2qPqz9ax+5IzGESyLSeZ/RCwbSZ2uQ==", "license": "MIT", "dependencies": { - "@next/env": "15.5.15", + "@next/env": "15.5.18", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", @@ -10697,14 +10734,14 @@ "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "15.5.15", - "@next/swc-darwin-x64": "15.5.15", - "@next/swc-linux-arm64-gnu": "15.5.15", - "@next/swc-linux-arm64-musl": "15.5.15", - "@next/swc-linux-x64-gnu": "15.5.15", - "@next/swc-linux-x64-musl": "15.5.15", - "@next/swc-win32-arm64-msvc": "15.5.15", - "@next/swc-win32-x64-msvc": "15.5.15", + "@next/swc-darwin-arm64": "15.5.18", + "@next/swc-darwin-x64": "15.5.18", + "@next/swc-linux-arm64-gnu": "15.5.18", + "@next/swc-linux-arm64-musl": "15.5.18", + "@next/swc-linux-x64-gnu": "15.5.18", + "@next/swc-linux-x64-musl": "15.5.18", + "@next/swc-win32-arm64-msvc": "15.5.18", + "@next/swc-win32-x64-msvc": "15.5.18", "sharp": "^0.34.3" }, "peerDependencies": { @@ -11343,7 +11380,9 @@ } }, "node_modules/postcss": { - "version": "8.5.6", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz", + "integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==", "funding": [ { "type": "opencollective", @@ -11647,22 +11686,24 @@ } }, "node_modules/protobufjs": { - "version": "7.5.4", + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.1.tgz", + "integrity": "sha512-4K0myLaWL5EteuSAro91EGFgcfVgxb64Jx+7oDAY6GOkXD4M69yuSEljNcInGVCA5sOPxmZ/EqDLj2x0Q0+Ygg==", "hasInstallScript": true, "license": "BSD-3-Clause", "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", + "@protobufjs/codegen": "^2.0.5", + "@protobufjs/eventemitter": "^1.1.1", + "@protobufjs/fetch": "^1.1.1", "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", + "@protobufjs/inquire": "^1.1.2", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", + "@protobufjs/utf8": "^1.1.1", "@types/node": ">=13.7.0", - "long": "^5.0.0" + "long": "^5.3.2" }, "engines": { "node": ">=12.0.0" @@ -11677,9 +11718,9 @@ } }, "node_modules/qs": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", - "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", + "version": "6.15.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", + "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" diff --git a/package.json b/package.json index 233791a..a4e6757 100644 --- a/package.json +++ b/package.json @@ -22,11 +22,11 @@ "github-slugger": "^2.0.0", "gray-matter": "^4.0.2", "image-size": "1.0.0", - "next": "15.5.15", + "next": "15.5.18", "next-contentlayer2": "0.5.8", "next-themes": "^0.3.0", "pliny": "0.4.1", - "postcss": "^8.4.24", + "postcss": "^8.5.10", "react": "18.2.0", "react-dom": "18.2.0", "reading-time": "1.5.0", diff --git a/public/static/images/posts/2026/how-sitecore-teams-can-adopt-claude-and-copilot-without-burning-through-token-credits/banner-image.png b/public/static/images/posts/2026/how-sitecore-teams-can-adopt-claude-and-copilot-without-burning-through-token-credits/banner-image.png new file mode 100644 index 0000000..fbceb8c Binary files /dev/null and b/public/static/images/posts/2026/how-sitecore-teams-can-adopt-claude-and-copilot-without-burning-through-token-credits/banner-image.png differ